1 REM *** change line 100/105 10 DIM R$(8),C$(8),D$(8),RT$(8),IS$(8),SP(8) 15 RESTORE 20 FORT=1TO8:READ R$(T):NEXT:DATA"B","C","D","E","H","L","(HL)","A" 30 FORT=1TO8:READ C$(T):NEXT:DATA "NZ","Z","NC","C","PO","PE","P","M" 40 FORT=1TO8:READ D$(T):NEXT:DATA"BC","","DE","","HL","","SP","" 50 FORT=1TO8:READ RT$(T):NEXT:DATA"RLC","RRC","RAL","RAR","DAA","CPL","SCF","CCF" 60 FORT=1TO8:READ IS$(T):NEXT:DATA "ADD","ADC","SUB","SBC","AND","XOR","OR","CP" 70 FORT=1TO8:READ SP$(T):NEXT:DATA "JP nn","","OUT (n),A","IN A,(n)","EX (SP),HL","EX DE,HL","DI","EI" 90 CLS 100 GOTO 20000 105 'GOTO 10000 110 REM 10000 for Monitor / 20000 for List 1000 REM Decode opcode [N] to string W$ 1002 REM output H1$ and H2$=hex as HEX of N 1005 W$="" 1007 PRINT@40, 1010 O1=INT(N/64)MOD8 1020 O2=INT(N/8)MOD8 1030 O3=NMOD8 1040 H1=INT(N/16)MOD16:H1$=CHR$(48+H1-7*(H1>9)) 1050 H2=NMOD16:H2$=CHR$(48+H2-7*(H2>9)) 1100 REM After converting N in Hex and Oct, starts decoding opcode 1210 ON (O1+1)GOSUB 2000,3000,4000,5000 1300 V1=INSTR(1,W$,"n") 1305 IFV1=0 OR V1=LEN(W$)THENNB=1:GOTO1340 1310 V2=INSTR(V1+1,W$,"n") 1320 IF V1<>0THEN NB=2 1330 IF V2=V1+1THEN NB=3 1340 REM NB=number of bytes required by opcode 1990 RETURN 2000 REM 2010 ON O3+1 GOTO 2020,2100,2200,2300,2400,2500,2600,2700 2020 REM Special Opcodes 2030 IFO2=0THENW$="NOP" 2040 IFO2=4THENW$="RIM" 2060 IFO2=6THENW$="SIM" 2099 RETURN 2100 REM Load instructions 2110 IFO2MOD2=1THEN2150 2130 W$="LD "+D$(O2+1)+",nn" 2140 RETURN 2150 W$="ADD HL,"+D$(O2) 2160 RETURN 2200 IF(O2/4)MOD2=0THEN2260 2210 ON O2-3 GOTO 2220,2230,2240,2250 2220 W$="LD (nn),HL": RETURN 2230 W$="LD HL,(nn)": RETURN 2240 W$="LD (nn),A": RETURN 2250 W$="LD A,(nn)": RETURN 2260 IF O2MOD2=0THEN W$="LD ("+D$(O2+1)+"),A": RETURN 2270 IF O2MOD2=1THEN W$="LD A,("+D$(O2)+")":RETURN 2300 IFO2MOD2=0THENW$="INC "+D$(O2+1) 2310 IFO2MOD2=1THENW$="DEC "+D$(O2) 2320 RETURN 2400 W$="INC "+R$(O2+1):RETURN 2500 W$="DEC "+R$(O2+1):RETURN 2600 W$="LD "+R$(O2+1)+",n" 2620 RETURN 2700 W$=RT$(O2+1) 2710 RETURN 3000 IFN=118 THEN W$="HALT":RETURN 3020 W$="LD "+R$(O2+1)+","+R$(O3+1) 3030 RETURN 4000 W$=IS$(O2+1)+" "+R$(O3+1) 4020 RETURN 5000 ON O3+1 GOTO 5020,5100,5200,5300,5400,5500,5600,5700 5020 W$="RET "+C$(O2+1)+",nn" 5030 RETURN 5100 D$(7)="AF" 5110 IF O2MOD2=0THENW$="POP "+D$(O2+1) 5120 D$(7)="SP" 5130 IF O2=1 THEN W$="RET" 5199 RETURN 5200 W$="JP "+C$(O2+1)+",nn" 5230 RETURN 5300 W$=SP$(O2+1) 5310 RETURN 5400 W$="CALL "+C$(O2+1)+",nn" 5410 RETURN 5500 IF O2=1THENW$="CALL nn" 5510 IF O2MOD2=0THENW$="PUSH "+D$(O2+1) 5520 D$(7)="SP" 5599 RETURN 5600 W$=IS$(O2+1)+" n" 5610 RETURN 5700 W$="RST"+STR$(O2*8)+"D" 5710 RETURN 10000 REM Memory Analyzer 10005 INPUT"Start Address ";X0 10010 INPUT"End Address ";X1 10016 CLS 10020 FOR X=X0 TO X1 10030 N=PEEK(X) 10040 GOSUB 1000 10043 PRINT@0,"loc="X" (x)="N 10045 PRINT@80,W$" " 10050 IF NB>=2 THEN PRINT@95,USING"###";PEEK(X+1); 10060 IF NB=3 THEN PRINTUSING"###";PEEK(X+2); 10062 PRINT" " 10070 X=X+NB-1 10075 G$=INPUT$(1) 10080 NEXT X 10090 END 20000 REM Generates a complete list of mnemonics as ASM85.DO 20005 OPEN "Asm85" FOR OUTPUT AS 1 20010 PRINTCHR$(27);"W1" 20020 FOR N=0 TO 255 20030 GOSUB 1000 20040 PRINT"Dec";N;" HEX ";H1$;H2$;".......";W$;" " 20045 PRINT#1,"Dec";N;" HEX ";H1$;H2$;".......";W$ 20050 NEXT N 20060 CLOSE 1 20070 END