1 REM WDR PAPIERCOMPUTER EMULATOR 2 REM (C) DAVE HASSLER IN 2025 3 REM HTTPS://VANPORTMEDIA.COM/PAL1 5 ES$=CHR$(27)+CHR$(91) 6 CL$=ES$+"2J":HM$=ES$+"H" 7 RV$=ES$+"7m":NO$=ES$+"m" 10 GOSUB 9000 13 DIMTA(32) 15 SS=0:PC=0:RF=0 20 C1$=" " 25 C2$="" 30 PRINTCL$;"E)DIT R)UN E(X)IT" 35 GET X$:IF X$="" THEN35 37 X$=LEFT$(X$,1) 40 IF X$="E" THEN 100:REM EDITOR 42 REMIF X$="I" THEN 2000:REM INFO ON COMPUTER 44 REM IF X$="L" THEN 400:REM LOAD A TAPE 46 IF X$="R" THEN 1000:REM RUN A TAPE 48 REM IF X$="S" THEN 500:REM SAVE A TAPE (DISK OR CASSETTE) 50 IF X$="X" THEN PRINTCL$:END 52 GOTO 35 100 PC=0:PRINTCL$;"FORMAT: LINE-NUM. SPC OPCODE SPC OPERAND" 105 PRINT"ENTER CODE, L)IST, N)EW, D)ONE." 110 INPUT X$ 115 TM$=LEFT$(X$,1):IF TM$="L"THEN 200 120 IF TM$="D" THEN 30 122 IF TM$="N" THEN FORI=0TO31:TA(I)=0:NEXT:PRINT"TAPE ERASED.":GOTO1 125 TM=ASC(TM$):IF TM<48 OR TM>57 THEN PRINT"ENTRY ERROR.":GOTO105 127 I=1 130 IF MID$(X$,I,1)=" " THEN 134 133 I=I+1:GOTO130 134 PC=VAL(LEFT$(X$,I-1)) 135 TM$=MID$(X$,I+1,3):PV=0 140 IF TM$="INC"THEN PV=32:GOTO155 142 IF TM$="DEC"THEN PV=64:GOTO155 144 IF TM$="JMP"THEN PV=96:GOTO155 146 IF TM$="ISZ"THEN PV=128:GOTO155 148 IF TM$="HLT"THEN TM=0:GOTO165 150 PRINT"ENTRY ERROR.":GOTO105 155 IF PV=96 THEN PV=PV+VAL(RIGHT$(X$,2)):GOTO170 160 IF PV<>0 THEN TM=ASC(RIGHT$(X$,1))-64 163 IF TM<1ORTM>5 THENPRINT"ENTRY ERROR.":GOTO105 165 PV=PV+TM:REM 1-5 = REGISTERS A-E 170 TA(PC)=PV:REM TAPE POS. #TA(PC) = PACKED OPCODE + OPERAND 180 GOTO 110 199 REM LIST THE TAPE 200 PRINTCL$:PC=0:I=1 210 TM=TA(PC):NC=INT(TM/32):NO=(TM AND 31) 220 PRINTPC;" ";OP$(NC);" "; 230 IF NC=3 THEN PRINTNO:GOTO260 240 IF NC=0 THEN PRINT:GOTO260 250 PRINTCHR$(NO+64) 260 IF NC=0 AND TA(PC+1)=0 THEN 300:REM END OF 'TAPE' 270 PC=PC+1:I=I+1:IF I<20 THEN 210 280 PRINT"PRESS SPC FOR MORE, OTHER KEY TO QUIT." 285 GET X$:IF X$=""THEN285 290 IF X$=" "THENI=1:GOTO210 300 PRINT"LISTING DONE. PRESS ANY KEY.":PRINT 310 GET X$:IF X$=""THEN310 320 GOTO105 399 REM LOAD A 'TAPE'. READ IN DATA TO TA(X) FROM STORAGE.... 400 FORI=0TO32:TA(I)=0:NEXT 405 PRINTCL$;"ENTER FILENAME (16 CHAR MAX)" 410 INPUT X$:IF LEN(X$)>16 THEN 400 420 PRINT"D)ISK OR T)APE?" 430 GETKEY TM$ 440 X=8 442 IF TM$="T" THEN X=1 444 PC=0:OPEN8,X,8,X$ 450 INPUT#8,TM:IF TM=255 THEN CLOSE 8:GOTO30 460 TA(PC)=TM:PC=PC+1:GOTO450 499 REM SAVE A 'TAPE'. BASICALLY, STORE TA(X) AS AN SEQ DATA FILE 500 PRINTCL$;"ENTER FILENAME (16 CHAR MAX)" 510 INPUT X$:IF LEN(X$)>16 THEN 500 520 PRINT"D)ISK OR T)APE?" 530 GETKEY TM$ 540 X=8 542 IF TM$="T" THEN X=1 544 PC=0 550 IF TA(PC)=0 AND TA(PC+1)=0 THEN 570 560 PC=PC+1:GOTO550 570 OPEN8,X,8,X$+",S,W" 572 IF ST<>0 THEN CLOSE 8:GOTO9876 575 FORI=0TOPC:PRINT#8,TA(I):NEXT 580 PRINT#8,255 590 CLOSE8:GOTO30 599 REM REGISTER DISPLAYS AND TAPE LIST 600 IF RF THEN PRINTCL$:RF=0 605 PRINTCL$;HM$ 610 TM=A:TQ=0:PRINT"A: ";:GOSUB900 620 TM=B:TQ=2:PRINT"B: ";:GOSUB900 630 TM=C:TQ=4:PRINT"C: ";:GOSUB900 640 TM=D:TQ=6:PRINT"D: ";:GOSUB900 650 TM=E:TQ=8:PRINT"E: ";:GOSUB900 655 IF SS=0 THEN RETURN 660 I=0:J=0 670 TM=TA(I):NC=INT(TM/32):NO=(TM AND 31) 680 TM$=STR$(I)+" "+OP$(NC) 690 IF NC=3 THEN TM$=TM$+STR$(NO):GOTO720 700 IF NC=0 THEN 720 710 TM$=TM$+" "+CHR$(NO+64) 720 IF I=PC THEN TM$=TM$+"<":REM PC MARKER 725 IF I<>PC THEN TM$=TM$+" " 730 PRINTTAB(J*12);TM$;:J=J+1 735 IF J=3 THEN J=0:PRINT 740 IF NC=0 AND TA(I+1)=0 THEN RETURN 745 I=I+1:GOTO670 900 PRINTC1$;C2$;:TN=INT(TM/5):TR=TM-(TN*5) 907 IF TN THEN FORI=1TOTN:PRINT"V ";:NEXT 910 IF TR=4 THEN PRINT"IIII" 915 IF TR=3 THEN PRINT"III" 920 IF TR=2 THEN PRINT"II" 925 IF TR=1 THEN PRINT"I" 930 IF TR=0 THEN PRINT 935 PRINT:RETURN 999 REM RUN MODULE 1000 PRINTCL$;"PLEASE SET INITIAL REGISTER VALUES A-E.":PRINT 1002 INPUT"A";A:IF A<0 OR A>31 THEN PRINT"OUT OF RANGE.":GOTO1002 1004 INPUT"B";B:IF B<0 OR B>31 THEN PRINT"OUT OF RANGE.":GOTO1004 1006 INPUT"C";C:IF C<0 OR C>31 THEN PRINT"OUT OF RANGE.":GOTO1006 1008 INPUT"D";D:IF D<0 OR D>31 THEN PRINT"OUT OF RANGE.":GOTO1008 1010 INPUT"E";E:IF E<0 OR E>31 THEN PRINT"OUT OF RANGE.":GOTO1010 1020 PC=0:PP=0:TP=0:SS=0:RF=1 1025 PRINT:PRINT"(C)ONTINUOUS OR (S)INGLE-STEP?" 1030 GET X$:IFX$=""THEN1030 1032 X$=LEFT$(X$,1):IF X$<>"C" AND X$<>"S"THEN1030 1035 IF X$="S" THEN SS=1 1040 GOSUB600:REM REGISTER DISPLAY, TAPE LIST 1049 REM READ AN OPCODE AND OPERAND, DO 1050 N2=TA(PC):NC=INT(N2/32):N3=(N2 AND 31) 1060 ON NC GOTO 1100,1200,1300,1400 1066 REM NOT 1-4, FALL THROUGH TO... HALT (HLT) 000 1070 IF NC<>0 THEN PRINT"TAPE ERROR." 1080 PRINT:PRINT"* HALTED * R)UN AGAIN M)AIN MENU " 1085 GET X$:IFX$=""THEN1085 1087 X$=LEFT$(X$,1):IF X$="R" THEN 1000 1090 IF X$="M" THEN 30 1095 GOTO1085 1099 REM INCREMENT REGISTER (INC) 001 1100 ON N3 GOSUB 1140,1150,1160,1170,1180 1130 PC=PC+1:GOTO 1650 1140 A=A+1:IF A>31 THEN A=0 1145 RETURN 1150 B=B+1:IF B>31 THEN B=0 1155 RETURN 1160 C=C+1:IF C>31 THEN C=0 1165 RETURN 1170 D=D+1:IF D>31 THEN D=0 1175 RETURN 1180 E=E+1:IF E>31 THEN E=0 1185 RETURN 1199 REM DECREMENT REGISTER (DEC) 010 1200 ON N3 GOSUB 1240,1250,1260,1270,1280 1230 PC=PC+1:GOTO 1650 1240 A=A-1:IF A<0 THEN A=31 1245 RETURN 1250 B=B-1:IF B<0 THEN B=31 1255 RETURN 1260 C=C-1:IF C<0 THEN C=31 1265 RETURN 1270 D=D-1:IF D<0 THEN D=31 1275 RETURN 1280 E=E-1:IF E<0 THEN E=31 1285 RETURN 1299 REM JUMP TO TAPE LINE NUMBER (JMP) 011 (MAX. 31) 1300 IF N3<0 OR N3>31 THEN PRINT"OUT OF RANGE":GOTO1080 1310 PC=N3:GOTO 1650 1399 REM CHECK IF REGISTER IS ZERO (ISZ) 100. +2 PC IF TRUE 1400 ON N3 GOSUB 1430,1440,1450,1460,1470 1420 PC=PC+1:GOTO 1650 1430 IF A=0 THEN PC=PC+1 1435 RETURN 1440 IF B=0 THEN PC=PC+1 1445 RETURN 1450 IF C=0 THEN PC=PC+1 1455 RETURN 1460 IF D=0 THEN PC=PC+1 1465 RETURN 1470 IF E=0 THEN PC=PC+1 1475 RETURN 1649 REM DONE WITH AN OPERATION. CHECK FOR SINGLE STEP 1650 IF SS=0 THEN1040 1700 PRINT:PRINT"RUN: PRESS '!'. STEP: ANY OTHER KEY." 1710 GET X$:IF X$=""THEN1710 1715 IF X$="!" THEN SS=0 1720 GOTO1040 8999 REM SPLASH SCREEN 9000 PRINTCL$:PRINT:PRINT RV$ 9010 PRINT" KK KK NN NN OOOOO WW WW " 9020 PRINT" KK KK NNN NN OO OO WW WW " 9030 PRINT" KKK NNNNNNN OO OO WW W WW " 9040 PRINT" KK KK NN NNN OO OO WWW WWW " 9050 PRINT" KK KK NN NN OOOOO WW WW " 9055 PRINT" " 9056 PRINT" " 9060 PRINT" HH HH OOOOO WW WW " 9070 PRINT" HH HH OO OO WW WW " 9080 PRINT" HHHHHHH OO OO WW W WW " 9090 PRINT" HH HH OO OO WWW WWW " 9100 PRINT" HH HH OOOOO WW WW " 9110 PRINT:PRINTNO$:PRINT" DER WDR PAPIERCOMPUTER-EMULATOR" 9807 FOR I=0TO4:READ OP$(I):NEXT 9808 DATA HLT,INC,DEC,JMP,ISZ 9820 PRINT:PRINT:PRINT"PRESS ANY KEY TO START." 9830 GET A$:IF A$=""THEN9830 9870 RETURN