100DIM workspace 40: Buffer=&C000: Org=&2E00: SymbolTableSize=1000: RomNumber=13 200PROCInitTables 300 PRINT "AUTO" 400PROCInitSymbols 500 600Illegal$ = "?" 700OSCLI("LOAD :1.Ec2E00 "+STR$~Buffer) 710INPUT LINE "Address: &"Address$ : Address=EVAL("&"+Address$) 800PROCDisassemble(Address,&FF) 1000 GOTO 710 1200END 1300 1400DEFPROCDisassemble(Start,Length) 1405IO=FALSE : Org=Start 1410IF (Start AND &FFFF0000)=&FFFF0000 THEN Start=Start AND &FFFF:IO=TRUE 1500PC = Start 1600REPEAT 1700 labsymb=FNlookup(PC) 1800 IF labsymb<>0 IF (!labsymb AND &FFFF)=PC THEN PRINT " .";FNlabel(PC) 1900 PC = PC+FN_dis(PC) 2000 IF Opcode=&60 OR Opcode=&4C THEN PRINT 2100 IF PC=&2F01 THEN PC=PC+FNillegal(FNget(PC)) 2200UNTIL PC >= Start+Length 2300ENDPROC 2400 2500DEFFN_dis(PC) 2600 Opcode = FNget(PC) 2700 Mode$ = FNmode(Opcode) 2800 Name$ = FNname(Opcode) 2900 IF Mode$ = Illegal$ THEN =FNillegal (Opcode) 3000 ON INSTR(" ARI&#XYxyz()",Mode$) GOTO 3400,3800,4200,4600, 5000,5500,5900,6400,6900,7400,7900,8500,8900 ELSE 3100 PRINT "Keith Error: Mode = "+Mode$ 3200 3300 3400REM " " - Implicit 3500=FNOpcode (1,"") 3600 3700 3800REM "A" - Accumulator 3900=FNOpcode (1," A") 4000 4100 4200REM "R" - Relative 4300=FNOpcode (2," "+FNlabel(PC+2+FNsex(FNget(PC+1)))) 4400 4500 4600REM "I" - Indirect 4700=FNOpcode (3," ("+FNlabel(FNpair)+")") 4800 4900 5000REM "&" - Absolute 5100Extra$ = "" 5200=FNOpcode (3," "+FNlabel(FNpair)+Extra$) 5300 5400 5500REM "#" - Immediate 5600=FNOpcode (2," #"+STR$(FNget(PC+1))) 5700 5800 5900REM "X" - Absolute, X 6000Extra$ = ",X" 6100GOTO 5200 6200 6300 6400REM "Y" - Absolute, Y 6500Extra$ = ",Y" 6600GOTO 5200 6700 6800 6900REM "x" - Xero page, X 7000Extra$ = ",X" 7100GOTO 8100 7200 7300 7400REM "y" - Zero page, Y 7500Extra$ = ",Y" 7600GOTO 8100 7700 7800 7900REM "z" - Zero page 8000Extra$ = "" 8100=FNOpcode (2," "+FNlabel(FNsingle)+Extra$) 8200 8300 8400 8500REM "(" - Pre indexed by X 8600=FNOpcode (2," ("+FNlabel(FNsingle)+",X)") 8700 8800 8900REM ")" - Post indexed by Y 9000=FNOpcode (2," ("+FNlabel(FNsingle)+"),Y") 9100 9200DEFFNillegal(Opcode) 9300 PROCaddress(3) 9400 IF ASC(" ")<=FNget(PC+1) AND FNget(PC+1)<=ASC("~") THEN =FNascii 9500 PRINT " EQUB "; 9600 IF ASC(" ")<=Opcode AND Opcode<=ASC("~") THEN PRINT "ASC(""";CHR$(Opcode);""")" ELSE PRINT "&";STR$~(Opcode) 9700PRINT 9800=1 9900 10000DEFFNascii 10100 PRINT " EQUS """; 10200 Count = 0 10300REM 10400 IF ASC(" ")<=FNget(PC+Count) AND FNget(PC+Count)<=ASC("~") THEN VDU FNget(PC+Count):Count=Count+1: GOTO 10300 10500 PRINT""": EQUB &"+FNHex(FNget(PC+Count),2) 10600PRINT 10700=Count+1 10800 10900 11000DEFFNsex(Byte) 11100IF Byte >= 128 THEN =(Byte OR &FFFFFF00) ELSE =Byte 11200 11300 11400DEFFNpair 11500 = FNget(PC+2)*256 + FNget(PC+1) 11600 11700 11800DEFFNsingle 11900 = FNget(PC+1) 12000 12100 12200 12300 12400DEFFNget(Address) 12410 IF IO THEN =FNgetHost(Address) : ELSE =Buffer?(Address-Org) 12420 12430 12440 DEFFNgetHost(Address) 12450 IF &8000 <= Address AND Address < &C000 THEN =FNgetRom(Address) 12455 Address=Address OR &FFFF0000 12460 !workspace=Address 12470 A%=5 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 12480 =workspace?4 12490 12500 12510 DEFFNgetRom(Address) 12520 LOCAL OldRom, TheByte : OldRom=FNgetHost(&00F4) 12525 Address=Address OR &FFFF0000 12530 workspace!0=&FFFF00F4 12540 workspace?4=RomNumber 12550 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 12560 workspace!0=&FFFFFE30 12570 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 12580 !workspace=Address 12585 workspace?4=OldRom 12590 A%=5 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 12600 TheByte=workspace?4 12610 workspace!0=&FFFF00F4 12620 workspace?4=OldRom 12630 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 12640 workspace!0=&FFFFFE30 12650 workspace?4=OldRom 12660 A%=6 : X%=workspace MOD 256: Y%=workspace DIV 256: CALL &FFF1 12670 =TheByte 12680 12690 12700DEFFNlabel(Addr) 12800 LOCAL name$,symb 12900 symb=FNlookup(Addr) 13000 IF symb=0 THEN ="&"+STR$~Addr 13100 FOR i=3 TO SymbolEntrySize-1 13200 IF symb?i=ASC" " THEN workspace?(i-3)=13 ELSE workspace?(i-3)=symb?i 13300 NEXT 13400 workspace?SymbolEntrySize=13 13500 name$=$workspace 13600 IF (!symb AND &FFFF)=Addr THEN =name$ 13700 =name$+"+"+STR$(Addr-(!symb AND &FFFF)) 13800 13900 14000DEFFNOpcode (Size, Operand$) 14100 PROCaddress(Size) 14200 PRINT " "; Name$; Operand$ 14300 =Size 14400 14500 14600DEFFNx(Addr,Low,Size) 14700 =(Low <= Addr AND Addr < Low+Size) 14800 14900 15000 15100DEFFNr(Offset) 15200IF Offset>0 THEN = "+"+STR$(Offset) 15300="" 15400 15500 15600 15700DEFPROCaddress(Size) 15800 PRINT "\ ";FNHex(PC AND &FFFF,4); 15900 FOR p = 1 TO 3 16000 IF p <= Size THEN PRINT " "FNHex(FNget((PC AND &FFFF)+p-1),2); ELSE PRINT " "; 16100 NEXT 16200 PRINT":"; 16300ENDPROC 16400 16500 16600DEFFNHex(I,J) 16700 = RIGHT$("000"+STR$~(I),J) 16800 16900 17000 17100 DEF PROCInitTables 17200 LOCAL a,b 17300 DIM Opcodes%(255) 17400 FOR a = 0 TO 15 17500 READ entry$ 17600 FOR b = 0 TO 15 17700 Opcodes%(a*16 + b)=FNencode(MID$(entry$,b*4+1,4)) 17800 NEXT 17900 NEXT 18000 18100 ENDPROC 18200 18300 DEF FNencode(string$) : REM Packs a 4 character string into 4 bytes !!! 18400 $workspace=string$ 18500 =!workspace 18600 18700 DEF FNname(op) 18800 LOCAL name$ 18900 workspace?4=13 19000 !workspace=Opcodes%(op) 19100 name$=$workspace 19200 =MID$(name$,1,3) 19300 19400 DEF FNmode(op) 19500 LOCAL name$ 19600 !workspace=Opcodes%(op) 19700 workspace?4=13 19800 name$=$workspace 19900 =MID$(name$,4,1) 20000 20100 REM Data table of all opcodes 20200 REM Each entry is 3 chars of opcode + one char of addressing mode 20300 REM The modes are :- 20400 REM None ( Space ) 20500 REM A Acc 20600 REM R Relative 20700 REM I Indirect 20800 REM & Absolute 20900 REM # Immediate 21000 REM z Zpage 21100 REM x Zpage,X 21200 REM y Zpage,Y 21300 REM X Abs,X 21400 REM Y Abs,Y 21500 REM ( Ind,X 21600 REM ) Ind,Y 21700 REM ? Illegal 21800 21900 REM "&x0 &x1 &x2 &x3 &x4 &x5 &x6 &x7 &x8 &x9 &xA &xB &xC &xD &xE &xF 22000 DATA"Brk Ora(????????????OrazAslz????Php Ora#AslA????????Ora&Asl&????" 22100 DATA"BplROra)????????????OraxAslx????Clc OraY????????????OraXAslX????" 22200 DATA"Jsr&And(????????BitzAndzRolz????Plp And#RolA????Bit&And&Rol&????" 22300 DATA"BmiRAnd)????????????AndxRolx????Sec AndY????????????AndXRolX????" 22400 DATA"Rti Eor(????????????EorzLsrz????Pha Eor#LsrA????Jmp&Eor&Lsr&????" 22500 DATA"BvcREor)????????????EorxLsrx????Cli EorY????????????EorXLsrX????" 22600 DATA"Rts Adc(????????????AdczRorz????Pla Adc#RorA????JmpIAdc&Ror&????" 22700 DATA"BvsRAdc)????????????AdcxRorx????Sei AdcY????????????AdcX????????" 22800 DATA"????Sta(????????StyzStazStxz????Dey ????Txa ????Sty&Sta&Stx&????" 22900 DATA"BccRSta)????????StyxStaxStxy????Tya StaYTxs ????????StaX????????" 23000 DATA"Ldy#Lda(Ldx#????LdyzLdazLdxz????Tay Lda#Tax ????Ldy&Lda&Ldx&????" 23100 DATA"BcsRLda)????????LdyxLdaxLdxy????Clv LdaYTsx ????LdyXLdaXLdxY????" 23200 DATA"Cpy#Cmp(????????CpyzCmpzDecz????Iny Cmp#Dex ????Cpy&Cmp&Dec&????" 23300 DATA"BneRCmp)????????????CmpxDecx????Cld CmpY????????????CmpXDecX????" 23400 DATA"Cpx#Sbc(????????CpxzSbczIncz????Inx Sbc#Nop ????Cpx&Sbc&Inc&????" 23500 DATA"BeqRSbc)????????????SbcxIncx????Sed SbcY????????????SbcXIncX????" 23600 23700 23800 DEFPROCInitSymbols 23900 LOCAL name$,Addr,Size 24000 DIM SymbolTable SymbolTableSize 24100 SymbolEntrySize=2+1+7 24200 RESTORE 28300 24300 NextFreeSymb=SymbolTable 24400 REPEAT 24500 READ name$,Addr,Size 24600 IF name$<>"" PROCdefine(name$,Addr,Size) 24700 UNTIL name$="" 24800 ENDPROC 24900 25000 25100 DEFPROCdefine(name$,Addr,Size) 25200 LOCAL symb,i 25300 IF NextFreeSymb-SymbolTable>= SymbolTableSize THEN PRINT "Too Many Symbols": ENDPROC 25400 symb=NextFreeSymb : NextFreeSymb=NextFreeSymb+SymbolEntrySize 25500 $workspace=name$+" " 25600 symb?0=Addr MOD 256 25700 symb?1=Addr DIV 256 25800 symb?2=Size 25900 FOR i=3 TO SymbolEntrySize-1 26000 symb?i=workspace?(i-3) 26100 NEXT 26200 PRINT LEFT$(name$+" ",SymbolEntrySize-3);" = &";FNHex(Addr,4) 26300 ENDPROC 26400 26500 26600 DEFPROCprintsymbol(symb) 26700 PRINT """"; : FOR i=3 TO SymbolEntrySize-1 : VDU symb?i : NEXT 26800 PRINT " : ";FNHex(!symb AND &FFFF,4);" ";symb?2 26900 ENDPROC 27000 27100 27200 DEFFNlookup(Addr) 27300 LOCAL symb 27400 symb=SymbolTable 27500 IF FNx(Addr,!symb AND &FFFF,symb?2) THEN =symb 27600 symb=symb+SymbolEntrySize 27700 IF symb