Ein besonderer Disassembler
Dieser Disassembler für den C64 arbeitet ausschließlich mit Dezimalzahlen
Bei vielen Hobby-Programmierern besteht der einzige Kontakt zur Maschinensprache im gelegentlichen Eingeben von Basic-Ladern. Da tut man sich insbesondere mit den Hexadezimalzahlen schon mal etwas schwer.
Hier ist nun ein Disassembler, der sowohl Adressen als auch Befehls- und Datenbytes in dezimaler Form ausgibt.
Das Programm ist sehr einfach anzuwenden und erklärt sich im übrigen von selbst, so daß eine weitergehende Beschreibung hier überflüssig ist.
Bei der Adressenabfrage gibt es drei mögliche Eingaben:
- Die direkte Anfangsadresse (dezimal)
- »W« für weiter
- »E« für Ende
Bei der folgenden Frage nach der Ausgabe auf Drucker kann man wählen zwischen:
- »J« für Ja = Druckausgabe
- »N» für Nein (Return reicht)
Das Programm läuft auf dem C64, kann aber leicht auch für den VC 20 umgeschrieben werden (in Zeile 10 werden nur die Bildschirmfarben eingestellt).
Die verwendeten Steuerzeichen stellen nur Farben dar und können folglich frei gewählt werden.
(Stefan Heine / ev)1 rem dezimal-disassembler 2 rem 3 rem stefan heine 4 rem wiesenredder 1 5 rem 2330 eckernfoerde 6 rem 7 rem 10 poke53280,0:poke53281,0 20 print"{clr}{gry3} disassembler 1.5" 30 print" by st.heine" 40 print:print:print 50 print"{yel}* adressen bitte dezimal " 60 print" eingeben!!!":print 70 print"{grn}* adressen: w=weiter e=ende":print 80 print"* drucker : 'return'=nein" 90 print:print:print 100 rem copyright * st.heine * 110 dimm$(255),l%(255),f%(255),f1$(12),f2$(12) 120 fori=0to255:readm$(i):next:fori=0to255:readl%(i):next:fori=0to255:readf%(i) 130 next:fori=0to12:readf1$(i),f2$(i):next:pc=0 140 ific=1thengosub360:ic=0 150 input"{lblu}# anfangsadresse";a$ 160 input"{gry3}# ausgabe auf drucker";gc$ 170 hc$=left$(gc$,1) 180 ifhc$="j"thenic=1 190 j=len(a$):ifj>5then140 200 ifa$="w"then230 210 ifa$="e"then900 220 pc=val(a$) 230 fori=1to24:dz=pc:print"{grn}";:p1=peek(pc) 240 onl%(p1)gosub260,270,330 250 next:goto140 260 printtab(1)"{red}";pc;:printtab(9)"{grn}";p1;:print"{blu}";tab(24);m$(p1):pc=pc+1:return 270 printtab(1)"{red}";pc;:printtab(9)"{grn}";p1;:p2=peek(pc+1):printtab(13)p2; 280 print"{blu}";tab(24)m$(p1);" {lblu}"; 290 iff%(p1)=9thenp2=peek(pc+1):ifp2<128thenp2=pc+p2+2:goto310 300 iff%(p1)=9thenp2=pc-(255-p2)+1 310 printf1$(f%(p1));p2;:dz=p2:goto320 320 printf2$(f%(p1)):pc=pc+2:return 330 printtab(1)"{red}";pc;:printtab(9)"{grn}";p1;:p2=peek(pc+1):printtab(14)p2; 340 p3=peek(pc+2):printtab(19)p3;:print"{blu}";tab(24);m$(p1)"{lblu}";:p4=(p3*256)+p2 350 printp4;f1$(f%(p1));:dz=p3*256+p2:printf2$(f%(p1)):pc=pc+3:return 360 open4,4:print#4,chr$(15) 370 vb=1024:vc=55296 380 fori=vbtovb+999step40:p$="" 390 forj=0to39:x=peek(i+j) 400 ifx<32thenx=x+64:goto440 410 ifx<64then440 420 ifx<96thenx=x+32:goto440 430 ifx<128thenx=x+64:goto440 440 p$=p$+chr$(x) 450 next:print#4,p$:next:close4:return 460 rem*** datas befehlsliste *** 470 databrk,ora,???,???,???,ora,asl,???,php,ora,asl,???,???,ora,asl,??? 480 databpl,ora,???,???,???,ora,asl,???,clc,ora,???,???,???,ora,asl,??? 490 datajsr,and,???,???,bit,and,rol,???,plp,and,rol,???,bit,and,rol,??? 500 databmi,and,???,???,???,and,rol,???,sec,and,???,???,???,and,rol,??? 510 datarti,eor,???,???,???,eor,lsr,???,pha,eor,lsr,???,jmp,eor,lsr,??? 520 databvc,eor,???,???,???,eor,lsr,???,cli,eor,???,???,???,eor,lsr,??? 530 datarts,adc,???,???,???,adc,ror,???,pla,adc,ror,???,jmp,adc,ror,??? 540 databvs,adc,???,???,???,adc,ror,???,sei,adc,???,???,???,adc,ror,??? 550 data???,sta,???,???,sty,sta,stx,???,dey,???,txa,???,sty,sta,stx,??? 560 databcc,sta,???,???,sty,sta,stx,???,tya,sta,txs,???,???,sta,???,??? 570 dataldy,lda,ldx,???,ldy,lda,ldx,???,tay,lda,tax,???,ldy,lda,ldx,??? 580 databcs,lda,???,???,ldy,lda,ldx,???,clv,lda,tsx,???,ldy,lda,ldx,??? 590 datacpy,cmp,???,???,cpy,cmp,dec,???,iny,cmp,dex,???,cpy,cmp,dec,??? 600 databne,cmp,???,???,???,cmp,dec,???,cld,cmp,???,???,???,cmp,dec,??? 610 datacpx,sbc,???,???,cpx,sbc,inc,???,inx,sbc,nop,???,cpx,sbc,inc,??? 620 databeq,sbc,???,???,???,sbc,inc,???,sed,sbc,???,???,???,sbc,inc,??? 630 rem*** datas 1,2 oder 3 bit *** 640 data1,2,1,1,1,2,2,1,1,2,1,1,1,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 650 data3,2,1,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 660 data1,2,1,1,1,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 670 data1,2,1,1,1,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 680 data1,2,1,1,2,2,2,1,1,1,1,1,3,3,3,1,2,2,1,1,2,2,2,1,1,3,1,1,1,3,1,1 690 data2,2,2,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,2,2,2,1,1,3,1,1,3,3,3,1 700 data2,2,1,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 710 data2,2,1,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 720 rem*** datas befehlart (zeichen)*** 730 data0,10,0,0,0,4,4,0,0,2,1,0,0,3,3,0 740 data9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 750 data3,10,0,0,4,4,4,0,0,2,1,0,3,3,3,0 760 data9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 770 data0,10,0,0,0,4,4,0,0,2,1,0,3,3,3,0 780 data9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 790 data0,10,0,0,0,4,4,0,0,2,1,0,12,3,3,0 800 data9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 810 data0,10,0,0,4,4,4,0,0,0,0,0,3,3,3,0 820 data9,11,0,0,5,5,6,0,0,8,0,0,0,7,0,0 830 data2,10,2,0,4,4,4,0,0,2,0,0,3,3,3,0 840 data9,11,0,0,5,5,6,0,0,8,0,0,7,7,8,0 850 data2,10,0,0,4,4,4,0,0,2,0,0,3,3,3,0 860 data9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 870 data2,10,0,0,4,4,4,0,0,2,0,0,3,3,3,0 880 data9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 890 data,,,,#,,,,,,,",x",,",y",,",x",,",y",,,(,",x)",(,"),y",(,), 900 end
1 REM DEZIMAL-DISASSEMBLER 2 REM 3 REM STEFAN HEINE 4 REM WIESENREDDER 1 5 REM 2330 ECKERNFOERDE 6 REM 7 REM 10 POKE 53280,0:POKE 53281,0 20 PRINT"{CLR,GREY3,9SPACE}DISASSEMBLER{2SPACE}1.5" 30 PRINT"{12SPACE}BY ST.HEINE" 40 PRINT:PRINT:PRINT 50 PRINT"{YELLOW}* ADRESSEN BITTE DEZIMAL " 60 PRINT"{2SPACE}EINGEBEN!!!":PRINT 70 PRINT"{GREEN}* ADRESSEN: W=WEITER E=ENDE":PRINT 80 PRINT"* DRUCKER : 'RETURN'=NEIN" 90 PRINT:PRINT:PRINT 100 REM COPYRIGHT * ST.HEINE * 110 DIM M$(255),L%(255),F%(255),F1$(12),F2$(12) 120 FOR I=0 TO255:READ M$(I):NEXT :FOR I=0 TO255:READ L%(I):NEXT :FOR I=0 TO255:READ F%(I) 130 NEXT :FOR I=0 TO12:READ F1$(I),F2$(I):NEXT :PC=0 140 IF IC=1 THENGOSUB 360:IC=0 150 INPUT"{LIG.BLUE}# ANFANGSADRESSE";A$ 160 INPUT"{GREY3}# AUSGABE AUF DRUCKER";GC$ 170 HC$=LEFT$ (GC$,1) 180 IF HC$="J" THENIC=1 190 J=LEN (A$):IF J>5 THEN140 200 IF A$="W" THEN230 210 IF A$="E" THEN900 220 PC=VAL (A$) 230 FOR I=1 TO24:DZ=PC:PRINT"{GREEN}";:P1=PEEK (PC) 240 ON L%(P1)GOSUB 260,270,330 250 NEXT :GOTO 140 260 PRINTTAB( 1)"{RED}";PC;:PRINTTAB( 9)"{GREEN}";P1;:PRINT"{BLUE}";TAB( 24);M$(P1):PC=PC+1:RETURN 270 PRINTTAB( 1)"{RED}";PC;:PRINTTAB( 9)"{GREEN}";P1;:P2=PEEK (PC+1):PRINTTAB( 13)P2; 280 PRINT"{BLUE}";TAB( 24)M$(P1);"{SPACE,LIG.BLUE}"; 290 IF F%(P1)=9 THENP2=PEEK (PC+1):IF P2<128 THENP2=PC+P2+2:GOTO 310 300 IF F%(P1)=9 THENP2=PC-(255-P2)+1 310 PRINTF1$(F%(P1));P2;:DZ=P2:GOTO 320 320 PRINTF2$(F%(P1)):PC=PC+2:RETURN 330 PRINTTAB( 1)"{RED}";PC;:PRINTTAB( 9)"{GREEN}";P1;:P2=PEEK (PC+1):PRINTTAB( 14)P2; 340 P3=PEEK (PC+2):PRINTTAB( 19)P3;:PRINT"{BLUE}";TAB( 24);M$(P1)"{LIG.BLUE}";:P4=(P3*256)+P2 350 PRINTP4;F1$(F%(P1));:DZ=P3*256+P2:PRINTF2$(F%(P1)):PC=PC+3:RETURN 360 OPEN 4,4:PRINT#4,CHR$ (15) 370 VB=1024:VC=55296 380 FOR I=VB TOVB+999STEP 40:P$="" 390 FOR J=0 TO39:X=PEEK (I+J) 400 IF X<32 THENX=X+64:GOTO 440 410 IF X<64 THEN440 420 IF X<96 THENX=X+32:GOTO 440 430 IF X<128 THENX=X+64:GOTO 440 440 P$=P$+CHR$ (X) 450 NEXT :PRINT#4,P$:NEXT :CLOSE 4:RETURN 460 REM *** DATAS BEFEHLSLISTE *** 470 DATA BRK,ORA,???,???,???,ORA,ASL,???,PHP,ORA,ASL,???,???,ORA,ASL,??? 480 DATA BPL,ORA,???,???,???,ORA,ASL,???,CLC,ORA,???,???,???,ORA,ASL,??? 490 DATA JSR,AND,???,???,BIT,AND,ROL,???,PLP,AND,ROL,???,BIT,AND,ROL,??? 500 DATA BMI,AND,???,???,???,AND,ROL,???,SEC,AND,???,???,???,AND,ROL,??? 510 DATA RTI,EOR,???,???,???,EOR,LSR,???,PHA,EOR,LSR,???,JMP,EOR,LSR,??? 520 DATA BVC,EOR,???,???,???,EOR,LSR,???,CLI,EOR,???,???,???,EOR,LSR,??? 530 DATA RTS,ADC,???,???,???,ADC,ROR,???,PLA,ADC,ROR,???,JMP,ADC,ROR,??? 540 DATA BVS,ADC,???,???,???,ADC,ROR,???,SEI,ADC,???,???,???,ADC,ROR,??? 550 DATA ???,STA,???,???,STY,STA,STX,???,DEY,???,TXA,???,STY,STA,STX,??? 560 DATA BCC,STA,???,???,STY,STA,STX,???,TYA,STA,TXS,???,???,STA,???,??? 570 DATA LDY,LDA,LDX,???,LDY,LDA,LDX,???,TAY,LDA,TAX,???,LDY,LDA,LDX,??? 580 DATA BCS,LDA,???,???,LDY,LDA,LDX,???,CLV,LDA,TSX,???,LDY,LDA,LDX,??? 590 DATA CPY,CMP,???,???,CPY,CMP,DEC,???,INY,CMP,DEX,???,CPY,CMP,DEC,??? 600 DATA BNE,CMP,???,???,???,CMP,DEC,???,CLD,CMP,???,???,???,CMP,DEC,??? 610 DATA CPX,SBC,???,???,CPX,SBC,INC,???,INX,SBC,NOP,???,CPX,SBC,INC,??? 620 DATA BEQ,SBC,???,???,???,SBC,INC,???,SED,SBC,???,???,???,SBC,INC,??? 630 REM *** DATAS 1,2 ODER 3 BIT *** 640 DATA 1,2,1,1,1,2,2,1,1,2,1,1,1,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 650 DATA 3,2,1,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 660 DATA 1,2,1,1,1,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 670 DATA 1,2,1,1,1,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 680 DATA 1,2,1,1,2,2,2,1,1,1,1,1,3,3,3,1,2,2,1,1,2,2,2,1,1,3,1,1,1,3,1,1 690 DATA 2,2,2,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,2,2,2,1,1,3,1,1,3,3,3,1 700 DATA 2,2,1,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 710 DATA 2,2,1,1,2,2,2,1,1,2,1,1,3,3,3,1,2,2,1,1,1,2,2,1,1,3,1,1,1,3,3,1 720 REM *** DATAS BEFEHLART (ZEICHEN)*** 730 DATA 0,10,0,0,0,4,4,0,0,2,1,0,0,3,3,0 740 DATA 9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 750 DATA 3,10,0,0,4,4,4,0,0,2,1,0,3,3,3,0 760 DATA 9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 770 DATA 0,10,0,0,0,4,4,0,0,2,1,0,3,3,3,0 780 DATA 9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 790 DATA 0,10,0,0,0,4,4,0,0,2,1,0,12,3,3,0 800 DATA 9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 810 DATA 0,10,0,0,4,4,4,0,0,0,0,0,3,3,3,0 820 DATA 9,11,0,0,5,5,6,0,0,8,0,0,0,7,0,0 830 DATA 2,10,2,0,4,4,4,0,0,2,0,0,3,3,3,0 840 DATA 9,11,0,0,5,5,6,0,0,8,0,0,7,7,8,0 850 DATA 2,10,0,0,4,4,4,0,0,2,0,0,3,3,3,0 860 DATA 9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 870 DATA 2,10,0,0,4,4,4,0,0,2,0,0,3,3,3,0 880 DATA 9,11,0,0,0,5,5,0,0,8,0,0,0,7,7,0 890 DATA ,,,,#,,,,,,,",X",,",Y",,",X",,",Y",,,(,",X)",(,"),Y",(,), 900 END