100DIM workspace 40 : Buffer=&C000 : SymbolTableSize=1000 200PROCInitTables 290 PRINT "AUTO" 300PROCInitSymbols 400 500Illegal$ = "?" 600OSCLI("LOAD :1.Ec2E00 "+STR$~Buffer) 700PROCDisassemble(&2E00,&1B0) 710FOR PC=&2FBC TO &2FFF 711 PRINT" EQUB &"+FNHex(FNget(PC),2) 712NEXT 900END 1000 1101DEFPROCDisassemble(Start,Length) 1200PC = Start 1300REPEAT 1400 labsymb=FNlookup(PC) 1500 IF labsymb<>0 IF (!labsymb AND &FFFF)=PC THEN PRINT " .";FNlabel(PC) 1600 PC = PC+FN_dis(PC) 1700 IF Opcode=&60 OR Opcode=&4C THEN PRINT 1800 IF PC=&2F01 THEN PC=PC+FNillegal(FNget(PC)) 1900UNTIL PC >= Start+Length 2100ENDPROC 2200 2300DEFFN_dis(PC) 2400 Opcode = FNget(PC) 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 5900REM "R" - Relative 6000=FNOpcode (2," "+FNlabel(PC+2+FNsex(FNget(PC+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$(FNget(PC+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(" ")<=FNget(PC+1) AND FNget(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(" ")<=FNget(PC+Count) AND FNget(PC+Count)<=ASC("~") THEN VDU FNget(PC+Count):Count=Count+1: GOTO 12000 12200 PRINT""": EQUB &"+FNHex(FNget(PC+Count),2) 12300PRINT 12400=Count+1 12500 12600 12700DEFFNsex(Byte) 12800IF Byte >= 128 THEN =(Byte OR &FFFFFF00) ELSE =Byte 12900 13000 13100DEFFNpair 13200 = FNget(PC+2)*256 + FNget(PC+1) 13300 13400 13500DEFFNsingle 13600 = FNget(PC+1) 13700 13800 13810 13820 13830DEFFNget(Address) 13840 =Buffer?(Address-&2E00) 13850 13900DEFFNlabel(Addr) 13950 LOCAL name$,symb 14000 symb=FNlookup(Addr) 14010 IF symb=0 THEN ="&"+STR$~Addr 14020 FOR i=3 TO SymbolEntrySize-1 14030 IF symb?i=ASC" " THEN workspace?(i-3)=13 ELSE workspace?(i-3)=symb?i 14040 NEXT 14050 workspace?SymbolEntrySize=13 14060 name$=$workspace 14070 IF (!symb AND &FFFF)=Addr THEN =name$ 14080 =name$+"+"+STR$(Addr-(!symb AND &FFFF)) 14090 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(FNget(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????" 28000 28010 28020 DEFPROCInitSymbols 28030 LOCAL name$,Addr,Size 28035 DIM SymbolTable SymbolTableSize 28036 SymbolEntrySize=2+1+7 28037 RESTORE 29110 28040 NextFreeSymb=SymbolTable 28050 REPEAT 28060 READ name$,Addr,Size 28070 IF name$<>"" PROCdefine(name$,Addr,Size) 28080 UNTIL name$="" 28090 ENDPROC 28100 28110 28120 DEFPROCdefine(name$,Addr,Size) 28140 LOCAL symb,i 28165 IF NextFreeSymb-SymbolTable>= SymbolTableSize THEN PRINT "Too Many Symbols": ENDPROC 28170 symb=NextFreeSymb : NextFreeSymb=NextFreeSymb+SymbolEntrySize 28175 $workspace=name$+" " 28180 symb?0=Addr MOD 256 28190 symb?1=Addr DIV 256 28200 symb?2=Size 28210 FOR i=3 TO SymbolEntrySize-1 28220 symb?i=workspace?(i-3) 28230 NEXT 28231 PRINT LEFT$(name$+" ",SymbolEntrySize-3);" = &";FNHex(Addr,4) 28240 ENDPROC 28250 28252 28254 DEFPROCprintsymbol(symb) 28256 PRINT """"; : FOR i=3 TO SymbolEntrySize-1 : VDU symb?i : NEXT 28258 PRINT " : ";FNHex(!symb AND &FFFF,4);" ";symb?2 28260 ENDPROC 28262 28264 29000 DEFFNlookup(Addr) 29010 LOCAL symb 29020 symb=SymbolTable 29030 IF FNx(Addr,!symb AND &FFFF,symb?2) THEN =symb 29040 symb=symb+SymbolEntrySize 29050 IF symb