1 '**** 6809 DIS-ASSEMBLER **** 2 CLEAR300 3 DIMM$(2,15),S$(3,15),R$(3),RE$(11) 4 CLS:PRINT" ***** 6809 DIS-ASSEMBLER *****":PRINT 5 PRINT"(TURN PRINTER ON IF ANSWER IS Y) 6 INPUT"CAN OUTPUT TO PRINTER OR DISK? DO YOU WANT OUPUT TO PRINTER?";PR$:IFPR$="N"THEN9 7 PRINT#-2," " 8 POKE155,80:LL=0 9 LINEINPUT"FILENAME:";SN$:OPEN"O",#1,SN$+"/ASM":FORI=0TO2:FORJ=0TO15 10 READM$(I,J):NEXTJ,I 11 DATA NEG,-,-,COM,LSR,-,ROR,ASR,ASL,ROL,DEC,-,INC,TST,JMP,CLR 12 DATA SUBA,CMPA,SBCA,SUBD,ANDA,BITA,LDA,STA,EORA,ADCA,ORA,ADDA,CMPX,JSR,LDX,STX 13 DATA SUBB,CMPB,SBCB,ADDD,ANDB,BITB,LDB,STB,EORB,ADCB,ORB,ADDB,LDD,STD,LDU,STU 14 FORI=0TO3:FORJ=0TO15 15 READS$(I,J):NEXTJ,I 16 DATA NEG,-,-,COM,LSR,-,ROR,ASR,LSL,ROL,DEC,-,INC,TST,JMP,CLR 17 DATA -,-,NOP,SYNC,-,-,LBRA,LBSR,-,DAA,ORCC,-,ANDCC,SEX,EXG,TFR 18 DATA BRA,BRN,BHI,BLS,BHS,BLO,BNE,BEQ,BVC,BVS,BPL,BMI,BGE,BLT,BGT,BLE 19 DATA LEAX,LEAY,LEAS,LEAU,PSHS,PULS,PSHU,PULU,-,RTS,ABX,RTI,CWAI,MUL,-,SWI 20 R$(0)="X":R$(1)="Y":R$(2)="U":R$(3)="S" 21 FORI=0TO11:READRE$(I):NEXT 22 DATA D,X,Y,U,S,PC,-,-,A,B,CC,DP 23 INPUT"HEX DUMP OR DIS-ASSEMBLY H/D";H$ 24 IF H$="H"THEN174 25 IF H$="D"THEN26 ELSE23 26 INPUT"START,END ADDRESSES IN HEX ";AD$,LA$ 27 AD=VAL("&H"+AD$):LA=VAL("&H"+LA$) 28 IF LL=0THEN BG$=HEX$(AD) 29 ' ********** MAIN LOOP ********** 30 NS=0:M=PEEK(AD):AM$="":PA=0 31 MS=INT(M/16):LS=M-16*MS 32 IFM=16THEN70:' [GO TO SECOND PAGE] 33 IFM=17THEN83:' [G_ TO THIRD PAGE] 34 IFMS>3THEN90:' [GO TO M$ TABLE] 35 ' ********** S$ TABLE ********** 36 NS=1 37 IFMS=1AND(LS<4ORLS=9ORLS=13)THENNS=0 38 IFMS=1AND(LS=6ORLS=7)THENNS=2 39 IFMS=3ANDLS>8ANDLS<>12THENNS=0 40 IN$=S$(MS,LS) 41 ON MS GOTO44,52,55 42 A=AD+1:GOSUB168:' [MS NIBBLE=0 : DIRECT PAGE] 43 AM$="<"+HX$:GOTO110 44 IFNS=0THEN110:' [MS NIBBLE=1] 45 IFNS=1ANDLS<13THENA=AD+1:GOSUB168:AM$="#"+HX$:GOTO110 46 IFNS=1THEN50 47 A=AD+1:GOSUB164 48 AM$=HEX$(AD+3+OS) 49 AM$="$"+STRING$(4-LEN(AM$),"0")+AM$:GOTO110 50 RS=INT(PEEK(AD+1)/16):RD=PEEK(AD+1)-16*RS 51 AM$=RE$(RS)+","+RE$(RD):GOTO110 52 A=AD+1:GOSUB160:' [MS NIBBLE=2] 53 AM$=HEX$(AD+2+OS) 54 AM$="$"+STRING$(4-LEN(AM$),"0")+AM$:GOTO110 55 IFNS=0THEN110:' [MS NIBBLE=3] 56 IFLS=12THENA=AD+1:GOSUB168:AM$="#"+HX$:GOTO110 57 IFLS<4THEN132 58 PB=PEEK(AD+1):IF LS<6THEN SP$="U,"ELSE SP$="S," 59 IF(PB AND1)THENAM$=AM$+"CC," 60 IF(PB AND2)THENAM$=AM$+"A," 61 IF(PB AND4)THENAM$=AM$+"B," 62 IF(PB AND8)THENAM$=AM$+"DP," 63 IF(PB AND16)THENAM$=AM$+"X," 64 IF(PB AND32)THENAM$=AM$+"Y," 65 IF(PB AND64)THENAM$=AM$+SP$ 66 IF(PB AND128)THENAM$=AM$+"PC," 67 AM$=LEFT$(AM$,LEN(AM$)-1) 68 GOTO110 69 ' ********** SECOND PAGE ********** 70 PA=1:AD=AD+1:M=PEEK(AD) 71 MS=INT(M/16):LS=M-16*MS 72 IF MS>2THEN74 73 NS=2:IN$="L"+S$(MS,LS):GOTO47 74 IFMS=3ANDLS=15THENIN$="SWI2":GOTO110 75 IFMS>7ANDLS=3THENIN$="CMPD":GOTO98 76 IFMS>7ANDLS=12THENIN$="CMPY":GOTO98 77 IFMS>7ANDMS<12ANDLS=14THENIN$="LDY":GOTO98 78 IFMS>7ANDMS<12ANDLS=15THENIN$="STY":GOTO98 79 IFMS>11ANDLS=14THENIN$="LDS":GOTO98 80 IFMS>11ANDLS=15THENIN$="STS":GOTO98 81 PRINT"ERROR 1":END 82 ' ********** THIRD PAGE ********** 83 PA=1:AD=AD+1:M=PEEK(AD) 84 MS=INT(M/16):LS=M-16*MS 85 IFLS=3THENIN$="CMPU":GOTO98 86 IFLS=12THENIN$="CMPS":GOTO98 87 IFLS=15THENIN$="SWI3":GOTO110 88 PRINT"ERROR 2":END 89 ' ********** M$ TABLE ********** 90 IFMS<8THENMT=0:GOTO93 91 IFMS<12THENMT=1:GOTO93 92 MT=2 93 IN$=M$(MT,LS) 94 IFMS=8ANDLS=13THENIN$="BSR":NS=1:GOTO52 95 IFMS>5THEN98 96 IFMS=4THENAM$="A":GOTO110 97 AM$="B":GOTO110 98 AA=MS AND 3 99 IFAA=2THEN132:' [INDEXED] 100 IFAA=1THENNS=1:GOTO42:' [DIRECT PAGE] 101 IFAA=0THEN104:' [IMMEDIATE] 102 NS=2:A=AD+1:GOSUB172:' [EXTENDED] 103 AM$=">"+HX$:GOTO110 104 IFLS=3ORLS=12ORLS=14THENNS=2:GOTO107 105 NS=1:A=AD+1:GOSUB168 106 AM$="#"+HX$:GOTO110 107 A=AD+1:GOSUB172 108 AM$="#"+HX$:GOTO110 109 ' ********** OUTPUT TO SCREEN ********** 110 PRINTHEX$(AD-PA); 111 IFPA=1THENPRINTTAB(5)HEX$(PEEK(AD-1)); 112 FORI=0TONS:A=AD+I:GOSUB168 113 PRINTTAB(8+3*I)RIGHT$(HX$,2);:NEXT 114 PRINTTAB(20)IN$; 115 PRINTTAB(26)AM$ 116 IFPR$="Y"THEN118ELSE1000 117 ' ********** OUTPUT TO PRINTER ********** 118 HX$=HEX$(AD-PA):HX$=STRING$(4-LEN(HX$),"0")+HX$ 119 PRINT#-2,CHR$(0);HX$; 120 IF PA=1THENPRINT#-2,TAB(8)HEX$(PEEK(AD-1)); 121 FOR I=0TO NS:A=AD+I:GOSUB168 122 PRINT#-2,TAB(INT(10.1+4*I))RIGHT$(HX$,2);:NEXT 123 PRINT#-2,TAB(32)IN$; 124 PRINT#-2,TAB(40)AM$ 125 IF LL>56 THEN126ELSE LL=LL+1:GOTO129 126 PRINT#-2," ":PRINT#-2,TAB(55)BG$;"-";HEX$(AD) 127 FORI=1TO6:PRINT#-2," ":NEXT 128 LL=0:BG$=HEX$(AD+NS+1) 129 AD=AD+NS+1 130 IFAD>LA THEN23ELSE30:' [GO TO BEGINNING OF LOOP] 131 ' ********** INDEXING DECODE ********** 132 NS=1 133 IB=PEEK(AD+1) 134 IR=INT((IB AND 96)/32):R$=R$(IR) 135 IF(IB AND 128)THEN140 136 OS=IB AND 31:' [5 BIT OFFSET] 137 IF(OS AND 16)THENOS=OS-32 138 HX$=STR$(OS) 139 AM$=HX$+","+R$:GOTO110 140 ON(IB AND15)GOTO142,143,144,145,146,147,148,149,150,148,151,152,154,148,156 141 AM$=","+R$+"+":GOTO157 142 AM$=","+R$+"++":GOTO157 143 AM$=",-"+R$:GOTO157 144 AM$=",--"+R$:GOTO157 145 AM$=","+R$:GOTO157 146 AM$="B,"+R$:GOTO157 147 AM$="A,"+R$:GOTO157 148 AM$="ILLEGAL":GOTO157 149 NS=2:A=AD+2:GOSUB160:AM$=STR$(OS)+","+R$:GOTO157 150 NS=3:A=AD+2:GOSUB164:AM$=STR$(OS)+","+R$:GOTO157 151 AM$="D,"+R$:GOTO157 152 NS=2:A=AD+2:GOSUB160 153 AM$=STR$(OS)+",PC($"+HEX$(AD+3+OS)+")":GOTO157 154 NS=3:A=AD+2:GOSUB164 155 AM$=STR$(OS)+",PC($"+HEX$(AD+4+OS)+")":GOTO157 156 NS=3:A=AD+2:GOSUB172:AM$=HX$:GOTO157 157 IF(IB AND16)THENAM$="["+AM$+"]" 158 GOTO110 159 ' ********** COMPUTE 8 BIT OFFSET SUBROUTINE ********** 160 OS=PEEK(A) 161 IF(OS AND128)THENOS=OS-256 162 RETURN 163 ' ********** COMPUTE 16 BIT OFFSET SUBROUTINE ********** 164 OS=PEEK(A)*256+PEEK(A+1) 165 IF(PEEK(A)AND128)THENOS=OS-65536 166 RETURN 167 ' ***** GENERATE 8 BIT HEX CODE OF LOCATION A SUBROUTINE ***** 168 HX$=HEX$(PEEK(A)) 169 IF LEN(HX$)=1THENHX$="0"+HX$ 170 HX$="$"+HX$:RETURN 171 ' ***** GENERATE 16 BIT HEX CODE OF LOCATION A SUBROUTINE ***** 172 HX$=HEX$(PEEK(A)*256+PEEK(A+1)) 173 HX$="$"+STRING$(4-LEN(HX$),"0")+HX$:RETURN 174 ' ***** HEX DUMP ***** 175 INPUT"START,END ADDRESSES IN HEX ";AD$,LA$ 176 AD=VAL("&H"+AD$):LA=VAL("&H"+LA$) 177 INPUT"DUMP WIDTH IN DEC.(1 TO 16)";DW 178 IF LL=0THEN BG$=HEX$(AD) 179 FOR A=AD TO LA STEP DW 180 L$="":C$="":D=A 181 L$=HEX$(A):L$=STRING$(4-LEN(L$),"0")+L$+" " 182 FOR B=0TO DW-1 183 D=PEEK(A+B) 184 IFD>31 AND D<128 THENC$=C$+CHR$(D)ELSE C$=C$+"." 185 H$=HEX$(D):IF LEN(H$)=1 THEN H$="0"+H$ 186 L$=L$+" "+H$ 187 NEXTB 188 L$=L$+" "+C$ 189 PRINTL$:IFPR$="N"THEN195 190 PRINT#-2,CHR$(0);L$ 191 IF LL>56THEN 192 ELSE LL=LL+1:GOTO195 192 PRINT#-2," ":PRINT#-2,TAB(55)BG$;"-";HEX$(A) 193 FORI=1TO6:PRINT#-2," ":NEXT 194 LL=0:BG$=HEX$(A+DW) 195 NEXTA 196 GOTO23 1000 LN=LN+10:PRINT#1,RIGHT$(STR$(LN),LEN(STR$(LN))-1)+" M"+HEX$(AD)+CHR$(9)+IN$+CHR$(9); 1010 IFLEFT$(AM$,1)="$"THENJK$=RIGHT$(AM$,LEN(AM$)-1):IFVAL("&H"+JK$)VAL("&H"+LA$)THENPRINT#1,"M"+JK$:GOTO2000 1020 PRINT#1,AM$ 2000 GOTO 129