1 REM TRS-80 Model 100 Disassembler 2 REM 5 REM Note: This program MUST be saved as DISASM.BA in order to function. 9 REM 10 DEFINT A-Z 20 GOTO 2000 99 REM 998 REM OPCODE TABLE 999 REM 1000 DATA "NOP" 1001 DATA "LD BC,@" 1002 DATA "LD (BC),A" 1003 DATA "INC BC" 1004 DATA "INC B" 1005 DATA "DEC B" 1006 DATA "LD B,#" 1007 DATA "RLCA" 1008 DATA "---" 1009 DATA "ADD HL,BC" 1010 DATA "LD A,(BC)" 1011 DATA "DEC BC" 1012 DATA "INC C" 1013 DATA "DEC C" 1014 DATA "LD C,#" 1015 DATA "RRCA" 1016 DATA "---" 1017 DATA "LD DE,@" 1018 DATA "LD (DE),A" 1019 DATA "INC DE" 1020 DATA "INC D" 1021 DATA "DEC D" 1022 DATA "LD D,#" 1023 DATA "RLA" 1024 DATA "---" 1025 DATA "ADD HL,DE" 1026 DATA "LD A,(DE)" 1027 DATA "DEC DE" 1028 DATA "INC E" 1029 DATA "DEC E" 1030 DATA "LD E,#" 1031 DATA "RRA" 1032 DATA "RIM" 1033 DATA "LD HL,@" 1034 DATA "LD (@),HL" 1035 DATA "INC HL" 1036 DATA "INC H" 1037 DATA "DEC H" 1038 DATA "LD H,#" 1039 DATA "DAA" 1040 DATA "---" 1041 DATA "ADD HL,HL" 1042 DATA "LD HL,(@)" 1043 DATA "DEC HL" 1044 DATA "INC L" 1045 DATA "DEC L" 1046 DATA "LD L,#" 1047 DATA "CPL" 1048 DATA "SIM" 1049 DATA "LD SP,@" 1050 DATA "LD (@),A" 1051 DATA "INC SP" 1052 DATA "INC (HL)" 1053 DATA "DEC (HL)" 1054 DATA "LD (HL),#" 1055 DATA "SCF" 1056 DATA "---" 1057 DATA "ADD HL,SP" 1058 DATA "LD A,(@)" 1059 DATA "DEC SP" 1060 DATA "INC A" 1061 DATA "DEC A" 1062 DATA "LD A,#" 1063 DATA "CCF" 1064 DATA "LD B,B" 1065 DATA "LD B,C" 1066 DATA "LD B,D" 1067 DATA "LD B,E" 1068 DATA "LD B,H" 1069 DATA "LD B,L" 1070 DATA "LD B,(HL)" 1071 DATA "LD B,A" 1072 DATA "LD C,B" 1073 DATA "LD C,C" 1074 DATA "LD C,D" 1075 DATA "LD C,E" 1076 DATA "LD C,H" 1077 DATA "LD C,L" 1078 DATA "LD C,(HL)" 1079 DATA "LD C,A" 1080 DATA "LD D,B" 1081 DATA "LD D,C" 1082 DATA "LD D,D" 1083 DATA "LD D,E" 1084 DATA "LD D,H" 1085 DATA "LD D,L" 1086 DATA "LD D,(HL)" 1087 DATA "LD D,A" 1088 DATA "LD E,B" 1089 DATA "LD E,C" 1090 DATA "LD E,D" 1091 DATA "LD E,E" 1092 DATA "LD E,H" 1093 DATA "LD E,L" 1094 DATA "LD E,(HL)" 1095 DATA "LD E,A" 1096 DATA "LD H,B" 1097 DATA "LD H,C" 1098 DATA "LD H,D" 1099 DATA "LD H,E" 1100 DATA "LD H,H" 1101 DATA "LD H,L" 1102 DATA "LD H,(HL)" 1103 DATA "LD H,A" 1104 DATA "LD L,B" 1105 DATA "LD L,C" 1106 DATA "LD L,D" 1107 DATA "LD L,E" 1108 DATA "LD L,H" 1109 DATA "LD L,L" 1110 DATA "LD L,(HL)" 1111 DATA "LD L,A" 1112 DATA "LD (HL),B" 1113 DATA "LD (HL),C" 1114 DATA "LD (HL),D" 1115 DATA "LD (HL),E" 1116 DATA "LD (HL),H" 1117 DATA "LD (HL),L" 1118 DATA "HALT" 1119 DATA "LD (HL),A" 1120 DATA "LD A,B" 1121 DATA "LD A,C" 1122 DATA "LD A,D" 1123 DATA "LD A,E" 1124 DATA "LD A,H" 1125 DATA "LD A,L" 1126 DATA "LD A,(HL)" 1127 DATA "LD A,A" 1128 DATA "ADD A,B" 1129 DATA "ADD A,C" 1130 DATA "ADD A,D" 1131 DATA "ADD A,E" 1132 DATA "ADD A,H" 1133 DATA "ADD A,L" 1134 DATA "ADD A,(HL)" 1135 DATA "ADD A,A" 1136 DATA "ADC A,B" 1137 DATA "ADC A,C" 1138 DATA "ADC A,D" 1139 DATA "ADC A,E" 1140 DATA "ADC A,H" 1141 DATA "ADC A,L" 1142 DATA "ADC A,(HL)" 1143 DATA "ADC A,A" 1144 DATA "SUB B" 1145 DATA "SUB C" 1146 DATA "SUB D" 1147 DATA "SUB E" 1148 DATA "SUB H" 1149 DATA "SUB L" 1150 DATA "SUB (HL)" 1151 DATA "SUB A" 1152 DATA "SBC A,B" 1153 DATA "SBC A,C" 1154 DATA "SBC A,D" 1155 DATA "SBC A,E" 1156 DATA "SBC A,H" 1157 DATA "SBC A,L" 1158 DATA "SBC A,(HL)" 1159 DATA "SBC A,A" 1160 DATA "AND B" 1161 DATA "AND C" 1162 DATA "AND D" 1163 DATA "AND E" 1164 DATA "AND H" 1165 DATA "AND L" 1166 DATA "AND (HL)" 1167 DATA "AND A" 1168 DATA "XOR B" 1169 DATA "XOR C" 1170 DATA "XOR D" 1171 DATA "XOR E" 1172 DATA "XOR H" 1173 DATA "XOR L" 1174 DATA "XOR (HL)" 1175 DATA "XOR A" 1176 DATA "OR B" 1177 DATA "OR C" 1178 DATA "OR D" 1179 DATA "OR E" 1180 DATA "OR H" 1181 DATA "OR L" 1182 DATA "OR (HL)" 1183 DATA "OR A" 1184 DATA "CP B" 1185 DATA "CP C" 1186 DATA "CP D" 1187 DATA "CP E" 1188 DATA "CP H" 1189 DATA "CP L" 1190 DATA "CP (HL)" 1191 DATA "CP A" 1192 DATA "RET NZ" 1193 DATA "POP BC" 1194 DATA "JP NZ,@" 1195 DATA "JP @" 1196 DATA "CALL NZ,@" 1197 DATA "PUSH BC" 1198 DATA "ADD A,#" 1199 DATA "RST 00" 1200 DATA "RET Z" 1201 DATA "RET" 1202 DATA "JP Z,@" 1203 DATA "---" 1204 DATA "CALL Z,@" 1205 DATA "CALL @" 1206 DATA "ADC A,#" 1207 DATA "RST 08" 1208 DATA "RET NC" 1209 DATA "POP DE" 1210 DATA "JP NC,@" 1211 DATA "OUT (#),A" 1212 DATA "CALL NC,@" 1213 DATA "PUSH DE" 1214 DATA "SUB #" 1215 DATA "RST 10" 1216 DATA "RET C" 1217 DATA "---" 1218 DATA "JP C,@" 1219 DATA "IN A,(#)" 1220 DATA "CALL C,@" 1221 DATA "---" 1222 DATA "SBC A,#" 1223 DATA "RST 18" 1224 DATA "RET PO" 1225 DATA "POP HL" 1226 DATA "JP PO,@" 1227 DATA "EX (SP),HL" 1228 DATA "CALL PO,@" 1229 DATA "PUSH HL" 1230 DATA "AND #" 1231 DATA "RST 20" 1232 DATA "RET PE" 1233 DATA "JP (HL)" 1234 DATA "JP PE,@" 1235 DATA "EX DE,HL" 1236 DATA "CALL PE,@" 1237 DATA "---" 1238 DATA "XOR #" 1239 DATA "RST 28" 1240 DATA "RET P" 1241 DATA "POP AF" 1242 DATA "JP P,@" 1243 DATA "DI" 1244 DATA "CALL P,@" 1245 DATA "PUSH AF" 1246 DATA "OR #" 1247 DATA "RST 30" 1248 DATA "RET M" 1249 DATA "LD SP,HL" 1250 DATA "JP M,@" 1251 DATA "EI" 1252 DATA "CALL M,@" 1253 DATA "---" 1254 DATA "CP #" 1255 DATA "RST 38" 1999 REM 2000 REM INITIALIZE 2001 REM 2010 CLS:PRINT "Initializing ..." 2099 REM 2100 REM FIND THIS PROGRAM 2101 REM 2110 AD!=63845 : REM ADDRESS OF FILE DIRECTORY 2120 IF PEEK(AD!)<>128 THEN AD!=AD!+11 : GOTO 2120 2130 PA!=PEEK(AD!+1)+256*PEEK(AD!+2) 2140 OP$="" 2150 FOR I=3 TO 10:OP$=OP$+CHR$(PEEK(AD!+I)):NEXT I 2160 IF OP$<>"DISASMBA" THEN AD!=AD!+11 : GOTO 2120 2199 REM 2200 REM FIND LINE 3320 2201 REM 2210 PN!=PEEK(PA!)+256*PEEK(PA!+1) 2220 PL!=PEEK(PA!+2)+256*PEEK(PA!+3) 2230 IF PL!<>3320 THEN PA!=PN!:GOTO 2210 2999 REM 3000 REM MAIN PROGRAM 3001 REM 3200 CLS : PRINT "Disassembler 100" : PRINT " by Jesse Bob Overholt" : PRINT " & Dennis F. Brothers": PRINT 3210 INPUT "Start address";X$ : IF LEFT$(X$,1)="H" THEN X$=MID$(X$,2) : GOSUB 20000 : AD!=X! ELSE AD!=VAL(X$) 3220 INPUT " End address";X$ : IF LEFT$(X$,1)="H" THEN X$=MID$(X$,2) : GOSUB 20000 : EA!=X! ELSE EA!=VAL(X$) 3230 LINE INPUT "Output to: ";FL$ : IF FL$="" THEN FL$="LCD:" 3240 IF FL$="LCD" OR FL$="LPT" THEN FL$=FL$+":" 3250 OPEN FL$ FOR OUTPUT AS 1 3260 LC=0 3300 X!=AD! : GOSUB 21000 : AD$=X$ 3310 OP$=STR$(1000+PEEK(AD!)) : FOR I=1 TO LEN(OP$) : POKE PA!+5+I,ASC(MID$(OP$,I,1)) : NEXT I 3320 RESTORE 1076 : REM DON'T CHANGE THIS LINE 3330 READ OP$ : A$="":H$="" : GOSUB 10000 : AD!=AD!+1 3400 L=INSTR(OP$,"@") : IF L=0 THEN 3500 3410 X!=PEEK(AD!)+PEEK(AD!+1)*256 : GOSUB 21000 : OP$=LEFT$(OP$,L-1) +X$+MID$(OP$,L+1) 3420 GOSUB 10000 : AD!=AD!+1 : GOSUB 10000 : AD!=AD!+1 3430 GOTO 3600 3500 L=INSTR(OP$,"#") : IF L=0 THEN 3600 3510 X!=PEEK(AD!) : GOSUB 21000 : GOSUB 10000 : AD!=AD!+1 3520 OP$=LEFT$(OP$,L-1)+RIGHT$(X$,2) +MID$(OP$,L+1) : GOTO 3600 3600 H$=H$+SPACE$(11-LEN(H$)) 3610 OP$=OP$+SPACE$(18-LEN(OP$)) 3620 IF FL$="LPT:" AND LC>=54 THEN PRINT #1,CHR$(12);:LC=0 3630 IF FL$="LPT:" THEN PRINT #1,SPACE$(10); 3640 PRINT #1,AD$;" ";H$;OP$;"/";A$;"/" 3650 LC=LC+1 3660 IF INKEY$="" AND AD!<=EA! THEN GOTO 3300 3670 IF FL$="LPT:" AND LC<>0 THEN PRINT #1,CHR$(12); 3680 CLOSE #1: LINE INPUT "ENTER to restart:";L$:GOTO 3200 10000 I=PEEK(AD!) : IF I<32 OR I>126 THEN A$=A$+"." ELSE A$=A$+CHR$(I) 10010 X!=I:GOSUB 21000:H$=H$+" "+RIGHT$(X$,2) 10020 RETURN 20000 X!=0 : X=LEN(X$) : IF X<1 OR X>4 THEN 20050 20010 FOR I=1 TO X : K=ASC(MID$(X$,I,1))-48 : IF K>9 THEN K=K-7 20020 K=K+32*(K>41) : IF K>15 THEN 20050 20030 X!=X!*16+K 20040 NEXT I 20050 RETURN 21000 X$="0000" : IF X!<0 OR X!>65535 THEN 21040 21010 FOR I=4 TO 1 STEP -1 : K=X!-INT(X!/16)*16 : IF K>9 THEN K=K+7 21020 MID$(X$,I,1)=CHR$(K+48) : X!=INT(X!/16) 21030 NEXT I 21040 RETURN