100DIM workspace 10 200PROCInitTables 300 400 500Illegal$ = "?" 600*LOAD :1.Etweak 601*SPOOL :1.ETEXT 700PROCDisassemble(&2E00,&1B0) 710FOR PC=&2FBC TO &2FFF 711 PRINT" EQUB &"+FNHex(PC?0,2) 712NEXT 800*SPOOL 900END 1000 1101DEFPROCDisassemble(Start,Length) 1200PC = Start 1300REPEAT 1400 Lab$=FNlabel(PC) 1500 IF ASC(Lab$)<>ASC("&") IF INSTR(Lab$,"+")<=0 THEN PRINT " .";Lab$ 1600 PC = PC+FN_dis(PC) 1700 IF Opcode=&60 OR Opcode=&4C THEN PRINT 1800 IF PC=&2F01 THEN PC=PC+FNillegal(PC?0) 1900UNTIL PC >= Start+Length 2100ENDPROC 2200 2300DEFFN_dis(P) 2400 Opcode = ?P 2500 Mode$ = FNmode(Opcode) 2600 Name$ = FNname(Opcode) 2700 IF Mode$ = Illegal$ THEN =FNillegal (Opcode) 2800 ON INSTR(" ARI&#XYxyz()",Mode$) GOTO 3200,3600,5900,6300, 6700,7200,7600,8100,8600,9100,9600,10200,10600 ELSE 2900 PRINT "Keith Error: Mode = "+Mode$ 3000 3100 3200REM " " - Implicit 3300=FNOpcode (1,"") 3400 3500 3600REM "A" - Accumulator 3700=FNOpcode (1," A") 3800 3900 4000 IF Addr<&300 THEN 5800 4100 IF Addr>&3FF THEN 5800 4200 IF FNx(Addr,&31B,8) THEN="Vdu_queue"+FNr(Addr-&31B) 4202 IF FNx(Addr,&31B,2) THEN="TRINLN"+FNr(Addr-&31B) 4300 IF FNx(Addr,&31F,1) THEN="Plot_mode" 4400 IF FNx(Addr,&320,2) THEN="NewPoint"+FNr(Addr-&320) 4500 IF FNx(Addr,&323,1) THEN="Queue_end" 4600 IF FNx(Addr,&326,2) THEN="Gr_CursorY_int"+FNr(Addr-&326) 4700 IF FNx(Addr,&324,2) THEN="Gr_CursorX_int"+FNr(Addr-&324) 4800 IF FNx(Addr,&226,2) THEN="ExtensionVec"+FNr(Addr-&226) 4900 IF FNx(Addr,&355,1) THEN="Mode" 5000 IF FNx(Addr,&356,1) THEN="MemMode" 5100 IF FNx(Addr,&357,1) THEN="ForeTxtCol" 5200 IF FNx(Addr,&358,1) THEN="BackTxtCol" 5300 IF FNx(Addr,&359,1) THEN="ForeGfxCol" 5400 IF FNx(Addr,&35A,1) THEN="BackGfxCol" 5500 IF FNx(Addr,&35B,1) THEN="ForePlotCol" 5600 IF FNx(Addr,&35C,1) THEN="BackPlotCol" 5700 IF FNx(Addr,&35D,2) THEN="JMI_vec"+FNr(Addr-&35D) 5800GOTO 14100 5900REM "R" - Relative 6000=FNOpcode (2," "+FNlabel(P+2+FNsex(P?1))) 6100 6200 6300REM "I" - Indirect 6400=FNOpcode (3," ("+FNlabel(FNpair)+")") 6500 6600 6700REM "&" - Absolute 6800Extra$ = "" 6900=FNOpcode (3," "+FNlabel(FNpair)+Extra$) 7000 7100 7200REM "#" - Immediate 7300=FNOpcode (2," #"+STR$(P?1)) 7400 7500 7600REM "X" - Absolute, X 7700Extra$ = ",X" 7800GOTO 6900 7900 8000 8100REM "Y" - Absolute, Y 8200Extra$ = ",Y" 8300GOTO 6900 8400 8500 8600REM "x" - Xero page, X 8700Extra$ = ",X" 8800GOTO 9800 8900 9000 9100REM "y" - Zero page, Y 9200Extra$ = ",Y" 9300GOTO 9800 9400 9500 9600REM "z" - Zero page 9700Extra$ = "" 9800=FNOpcode (2," "+FNlabel(FNsingle)+Extra$) 9900 10000 10100 10200REM "(" - Pre indexed by X 10300=FNOpcode (2," ("+FNlabel(FNsingle)+",X)") 10400 10500 10600REM ")" - Post indexed by Y 10700=FNOpcode (2," ("+FNlabel(FNsingle)+"),Y") 10800 10900DEFFNillegal(Opcode) 11000 PROCaddress(3) 11100 IF ASC(" ")<=(PC?1) AND (PC?1)<=ASC("~") THEN =FNascii 11200 PRINT " EQUB "; 11300 IF ASC(" ")<=Opcode AND Opcode<=ASC("~") THEN PRINT "ASC(""";CHR$(Opcode);""")" ELSE PRINT "&";STR$~(Opcode) 11400PRINT 11500=1 11600 11700DEFFNascii 11800 PRINT " EQUS """; 11900 Count = 0 12000REM 12100 IF ASC(" ")<=(PC?Count) AND (PC?Count)<=ASC("~") THEN VDU PC?Count:Count=Count+1: GOTO 12000 12200 PRINT""": EQUB &"+FNHex(PC?Count,2) 12300PRINT 12400=Count+1 12500 12600 12700DEFFNsex(Byte) 12800IF Byte >= 128 THEN =(Byte OR &FFFFFF00) ELSE =Byte 12900 13000 13100DEFFNpair 13200 = (P?2)*256 + (P?1) 13300 13400 13500DEFFNsingle 13600 = (P?1) 13700 13800 13900DEFFNlabel(Addr) 14000GOTO4200 14100 IF FNx(Addr,&33D,1) THEN="S_direction" 14200 IF Addr=&26A THEN = "Pending" 14300 IF FNx(Addr,&332,1) THEN="H_direction" 14400 IF FNx(Addr,&32E,4) THEN="H_start"+FNr(Addr-&32E) 14500 IF FNx(Addr,&339,4) THEN="S_start"+FNr(Addr-&339) 14600 IF FNx(Addr,&328+13,2) THEN="SDELTA"+FNr(Addr-(&328+13)) 14700 IF FNx(Addr,&328,&22) THEN="Vdu_workspace"+FNr(Addr-&328) 14800 IF Addr=&D411 THEN ="TRISA" 14900 IF Addr=&D459 THEN ="TRISB" 15000 IF Addr=&D628 THEN ="RestoreCursor" 15100 IF Addr=&D632 THEN ="SORTA" 15200 IF Addr=&D636 THEN ="SORTY" 15300 IF Addr=&E0A4 THEN ="WRCH" 15400 IF Addr=&D0DE THEN ="EMAEZ" 15500 IF Addr=&D774 THEN ="ULN" 15600 IF Addr=&D0B3 THEN ="SETZB" 15700 IF Addr=&D6A2 THEN ="HPLOT" 15800 IF Addr=&D47C THEN ="COPYF" 15900 IF Addr=&CDE2 THEN ="SWAPB" 16000 IF Addr=&CDE4 THEN ="SWAPC" 16100 IF Addr=&224 THEN ="NewPoint-&FC" 16200 IF Addr<&2E00 OR Addr>&2FFF THEN 17900 16300 IF Addr=&2E38 THEN = "OrdinaryVDU" 16400 IF Addr=&2E21 THEN = "Loop1" 16500 IF Addr=&2E64 THEN = "Get_GCOL" 16600 IF Addr=&2E40 THEN = "Get_PLOT" 16700 IF FNx(Addr,&2E00,4) THEN ="Buffer"+FNr(Addr-&2E00) 16800 IF Addr=&2E04 THEN = "VDU_entry" 16900 IF FNx(Addr,&2F00,2) THEN ="Temp"+FNr(Addr-&2F00) 17000 IF Addr=&2E3B THEN = "ConstAA" 17100 IF Addr=&2E5C THEN = "SetVector" 17200 IF Addr=&2E75 THEN = "SetJMItab" 17300 IF Addr=&2EA4 THEN = "GCOL_64" 17400 IF Addr=&2E1C THEN = "TrapMode" 17500 IF Addr=&2E2C THEN = "test_VDU_command" 17600 IF Addr=&2E88 THEN = "GCOL_32" 17700 IF Addr=&2F6F THEN = "TrapPLOT" 17702 IF Addr=&2F12 THEN ="trsrts" 17704 IF Addr=&2F13 THEN ="trsf" 17706 IF Addr=&2F43 THEN ="trsfb" 17708 IF Addr=&2F5A THEN ="trsfa" 17710 IF Addr=&2F5D THEN ="hplot" 17720 IF Addr=&2EA8 THEN ="Loop2" 17730 IF Addr=&2EE7 THEN ="Loop3" 17740 IF Addr=&2E97 THEN ="Skip3" 17750 IF Addr=&2ED2 THEN ="Shift2" 17760 IF Addr=&2EF5 THEN ="Loop4" 17770 IF Addr=&2F06 THEN ="Skip1" 17780 IF Addr=&2F0F THEN ="Skip2" 17782 IF Addr=&2EB3 THEN ="Proc1" 17784 IF Addr=&2EC9 THEN ="Proc2" 17786 IF Addr=&2EE1 THEN ="Proc3" 17788 IF Addr=&2EED THEN ="Proc4" 17790 IF Addr=&2F02 THEN ="Proc5" 17800 IF FNx(Addr,&2FB0,&50) THEN ="Data"+FNr(Addr-&2FB0) 17900 ="&"+STR$~(Addr) 18000 18100DEFFNOpcode (Size, Operand$) 18200 PROCaddress(Size) 18300 PRINT " "; Name$; Operand$ 18400 =Size 18500 18600 18700DEFFNx(Addr,Low,Size) 18800 =(Low <= Addr AND Addr < Low+Size) 18900 19000 19100 19200DEFFNr(Offset) 19300IF Offset>0 THEN = "+"+STR$(Offset) 19400="" 19500 19600 19700 19800DEFPROCaddress(Size) 19900 PRINT "\ ";FNHex(PC,4); 20000 FOR p = 1 TO 3 20100 IF p <= Size THEN PRINT " "FNHex(PC?(p-1),2); ELSE PRINT " "; 20200 NEXT 20300 PRINT":"; 20400ENDPROC 20500 20600 20700DEFFNHex(I,J) 20800 = RIGHT$("000"+STR$~(I),J) 20900 21000 21100 21200 DEF PROCInitTables 21300 LOCAL a,b 21400 DIM Opcodes%(255) 21500 FOR a = 0 TO 15 21600 READ entry$ 21700 FOR b = 0 TO 15 21800 Opcodes%(a*16 + b)=FNencode(MID$(entry$,b*4+1,4)) 21900 NEXT 22000 NEXT 22100 22200 ENDPROC 22300 22400 DEF FNencode(string$) : REM Packs a 4 character string into 4 bytes !!! 22500 $workspace=string$ 22600 =!workspace 22700 22800 DEF FNname(op) 22900 LOCAL name$ 23000 workspace?4=13 23100 !workspace=Opcodes%(op) 23200 name$=$workspace 23300 =MID$(name$,1,3) 23400 23500 DEF FNmode(op) 23600 LOCAL name$ 23700 !workspace=Opcodes%(op) 23800 workspace?4=13 23900 name$=$workspace 24000 =MID$(name$,4,1) 24100 24200 REM Data table of all opcodes 24300 REM Each entry is 3 chars of opcode + one char of addressing mode 24400 REM The modes are :- 24500 REM None ( Space ) 24600 REM A Acc 24700 REM R Relative 24800 REM I Indirect 24900 REM & Absolute 25000 REM # Immediate 25100 REM z Zpage 25200 REM x Zpage,X 25300 REM y Zpage,Y 25400 REM X Abs,X 25500 REM Y Abs,Y 25600 REM ( Ind,X 25700 REM ) Ind,Y 25800 REM ? Illegal 25900 26000 REM "&x0 &x1 &x2 &x3 &x4 &x5 &x6 &x7 &x8 &x9 &xA &xB &xC &xD &xE &xF 26100 DATA"Brk Ora(????????????OrazAslz????Php Ora#AslA????????Ora&Asl&????" 26200 DATA"BplROra)????????????OraxAslx????Clc OraY????????????OraXAslX????" 26300 DATA"Jsr&And(????????BitzAndzRolz????Plp And#RolA????Bit&And&Rol&????" 26400 DATA"BmiRAnd)????????????AndxRolx????Sec AndY????????????AndXRolX????" 26500 DATA"Rti Eor(????????????EorzLsrz????Pha Eor#LsrA????Jmp&Eor&Lsr&????" 26600 DATA"BvcREor)????????????EorxLsrx????Cli EorY????????????EorXLsrX????" 26700 DATA"Rts Adc(????????????AdczRorz????Pla Adc#RorA????JmpIAdc&Ror&????" 26800 DATA"BvsRAdc)????????????AdcxRorx????Sei AdcY????????????AdcX????????" 26900 DATA"????Sta(????????StyzStazStxz????Dey ????Txa ????Sty&Sta&Stx&????" 27000 DATA"BccRSta)????????StyxStaxStxy????Tya StaYTxs ????????StaX????????" 27100 DATA"Ldy#Lda(Ldx#????LdyzLdazLdxz????Tay Lda#Tax ????Ldy&Lda&Ldx&????" 27200 DATA"BcsRLda)????????LdyxLdaxLdxy????Clv LdaYTsx ????LdyXLdaXLdxY????" 27300 DATA"Cpy#Cmp(????????CpyzCmpzDecz????Iny Cmp#Dex ????Cpy&Cmp&Dec&????" 27400 DATA"BneRCmp)????????????CmpxDecx????Cld CmpY????????????CmpXDecX????" 27500 DATA"Cpx#Sbc(????????CpxzSbczIncz????Inx Sbc#Nop ????Cpx&Sbc&Inc&????" 27600 DATA"BeqRSbc)????????????SbcxIncx????Sed SbcY????????????SbcXIncX????"