0001 * BUFFALO 0002 * "Bit User's Fast Friendly Aid to Logical Operation" 0003 * 0004 * Rev 2.0 - 4/23/85 - added disassembler. 0005 * - variables now PTRn and TMPn. 0006 * Rev 2.1 - 4/29/85 - added byte erase to chgbyt routine. 0007 * Rev 2.2 - 5/16/85 - added hooks for evb board - acia 0008 * drivers, init and host routines. 0009 * 7/8/85 - fixed dump wraparound problem. 0010 * 7/10/85 - added evm board commands. 0011 * - added fill instruction. 0012 * 7/18/85 - added jump to EEPROM. 0013 * Rev 2.3 - 8/22/85 - call targco to disconnect sci from host 0014 * in reset routine for evb board. 0015 * 10/3/85 - modified load for download through terminal. 0016 * Rev 2.4 - 7/1/86 - Changed DFLOP address to fix conflicts with 0017 * EEPROM. (was at A000) 0018 * Rev 2.5 - 9/8/86 - Modified to provide additional protection from 0019 * program run-away on power down. Also fixed bugs 0020 * in MM and MOVE. Changed to 1 stop bit from 2. 0021 * 0022 **************************************************** 0023 * Although the information contained herein, * 0024 * as well as any information provided relative * 0025 * thereto, has been carefully reviewed and is * 0026 * believed accurate, Motorola assumes no * 0027 * liability arising out of its application or * 0028 * use, neither does it convey any license under * 0029 * its patent rights nor the rights of others. * 0030 **************************************************** 0031 0032 *************** 0033 * EQUATES * 0034 *************** 0035 0000 RAMBS EQU $0000 start of ram 0036 1000 REGBS EQU $1000 start of registers 0037 e000 ROMBS EQU $E000 start of rom 0038 100a PORTE EQU REGBS+$0A port e 0039 100e TCNT EQU REGBS+$0E timer count 0040 101e TOC5 EQU REGBS+$1E oc5 reg 0041 1020 TCTL1 EQU REGBS+$20 timer control 1 0042 1022 TMSK1 EQU REGBS+$22 timer mask 1 0043 1023 TFLG1 EQU REGBS+$23 timer flag 1 0044 1024 TMSK2 EQU REGBS+$24 timer mask 2 0045 102b BAUD EQU REGBS+$2B sci baud reg 0046 102c SCCR1 EQU REGBS+$2C sci control1 reg 0047 102d SCCR2 EQU REGBS+$2D sci control2 reg 0048 102e SCSR EQU REGBS+$2E sci status reg 0049 102f SCDAT EQU REGBS+$2F sci data reg 0050 1039 OPTION EQU REGBS+$39 option reg 0051 103a COPRST EQU REGBS+$3A cop reset reg 0052 103b PPROG EQU REGBS+$3B ee prog reg 0053 103c HPRIO EQU REGBS+$3C hprio reg 0054 103f CONFIG EQU REGBS+$3F config register 0055 4000 DFLOP EQU $4000 evb d flip flop 0056 d000 DUART EQU $D000 duart address 0057 d000 PORTA EQU DUART 0058 d008 PORTB EQU DUART+8 0059 9800 ACIA EQU $9800 acia address 0060 003e PROMPT EQU '>' 0061 0023 BUFFLNG EQU 35 0062 0001 CTLA EQU $01 exit host or assembler 0063 0002 CTLB EQU $02 send break to host 0064 0017 CTLW EQU $17 wait 0065 0018 CTLX EQU $18 abort 0066 007f DEL EQU $7F abort 0067 0004 EOT EQU $04 end of text/table 0068 003f SWI EQU $3F 0069 0070 *************** 0071 * RAM * 0072 *************** 0073 0036 ORG $36 0074 *** Buffalo ram space *** 0075 0036 RMB 20 user stack area 0076 004a USTACK RMB 30 monitor stack area 0077 0068 STACK RMB 1 0078 0069 INBUFF RMB BUFFLNG input buffer 0079 008c ENDBUFF EQU * 0080 008c COMBUFF RMB 8 command buffer 0081 0094 SHFTREG RMB 2 input shift register 0082 0096 BRKTABL RMB 8 breakpoint table 0083 009e REGS RMB 9 user's pc,y,x,a,b,c 0084 00a7 SP RMB 2 user's sp 0085 00a9 AUTOLF RMB 1 auto lf flag for i/o 0086 00aa IODEV RMB 1 0=sci, 1=acia, 2=duartA, 3=duartB 0087 00ab EXTDEV RMB 1 0=none, 1=acia, 2=duart, 0088 00ac HOSTDEV RMB 1 0=sci, 1=acia, 3=duartB 0089 00ad COUNT RMB 1 # characters read 0090 00ae PTRMEM RMB 2 current memory location 0091 0092 *** Buffalo variables - used by: *** 0093 00b0 PTR0 RMB 2 main,readbuff,incbuff,AS 0094 00b2 PTR1 RMB 2 main,BR,DU,MO,AS 0095 00b4 PTR2 RMB 2 DU,GO,MO,AS 0096 00b6 PTR3 RMB 2 HO,MO,AS 0097 00b8 PTR4 RMB 2 GO,AS 0098 00ba PTR5 RMB 2 AS 0099 00bc PTR6 RMB 2 GO,AS 0100 00be PTR7 RMB 2 GO,AS 0101 00c0 TMP1 RMB 1 main,hexbin,buffarg,termarg 0102 00c1 TMP2 RMB 1 GO,HO,AS 0103 00c2 TMP3 RMB 1 AS 0104 00c3 TMP4 RMB 1 GO,HO,ME,AS 0105 0106 *** Vector jump table *** 0107 00c4 JSCI RMB 3 0108 00c7 JSPI RMB 3 0109 00ca JPAIE RMB 3 0110 00cd JPAO RMB 3 0111 00d0 JTOF RMB 3 0112 00d3 JTOC5 RMB 3 0113 00d6 JTOC4 RMB 3 0114 00d9 JTOC3 RMB 3 0115 00dc JTOC2 RMB 3 0116 00df JTOC1 RMB 3 0117 00e2 JTIC3 RMB 3 0118 00e5 JTIC2 RMB 3 0119 00e8 JTIC1 RMB 3 0120 00eb JRTI RMB 3 0121 00ee JIRQ RMB 3 0122 00f1 JXIRQ RMB 3 0123 00f4 JSWI RMB 3 0124 00f7 JILLOP RMB 3 0125 00fa JCOP RMB 3 0126 00fd JCLM RMB 3 0127 0128 ***************** 0129 * 0130 * ROM starts here * 0131 * 0132 ***************** 0133 0134 e000 ORG ROMBS 0135 0136 ***************** 0137 ** BUFFALO - This is where Buffalo starts 0138 ** out of reset. All initialization is done 0139 ** here including determination of where the 0140 ** user terminal is (SCI,ACIA, or DUART). 0141 ***************** 0142 0143 e000 ce 10 0a [ 3 ] BUFFALO LDX #PORTE 0144 e003 1f 00 01 03 [ 7 ] BRCLR 0,X $01 BUFISIT if bit 0 of port e is 1 0145 e007 7e b6 00 [ 3 ] JMP $B600 then jump to the start of EEPROM 0146 e00a 86 93 [ 2 ] BUFISIT LDAA #$93 0147 e00c b7 10 39 [ 4 ] STAA OPTION adpu, dly, irqe, cop 0148 e00f 86 00 [ 2 ] LDAA #$00 0149 e011 b7 10 24 [ 4 ] STAA TMSK2 timer pre = %1 for trace 0150 e014 8e 00 68 [ 3 ] LDS #STACK monitor stack pointer 0151 e017 bd e3 40 [ 6 ] JSR VECINIT 0152 e01a ce 00 4a [ 3 ] LDX #USTACK 0153 e01d df a7 [ 4 ] STX SP default user stack 0154 e01f 86 d0 [ 2 ] LDAA #$D0 0155 e021 97 a6 [ 3 ] STAA REGS+8 default user ccr 0156 e023 cc 3f 0d [ 3 ] LDD #$3F0D initial command is ? 0157 e026 dd 69 [ 4 ] STD INBUFF 0158 e028 bd e1 9a [ 6 ] JSR BPCLR clear breakpoints 0159 e02b 7f 00 a9 [ 6 ] CLR AUTOLF 0160 e02e 7c 00 a9 [ 6 ] INC AUTOLF auto cr/lf = on 0161 0162 * Determine type of external comm device - none, or acia * 0163 0164 e031 7f 00 ab [ 6 ] CLR EXTDEV default is none 0165 e034 b6 10 3c [ 4 ] LDAA HPRIO 0166 e037 84 20 [ 2 ] ANDA #$20 0167 e039 27 35 [ 3 ] BEQ BUFF2 jump if single chip mode 0168 e03b 86 03 [ 2 ] LDAA #$03 see if external acia exists 0169 e03d b7 98 00 [ 4 ] STAA ACIA master reset 0170 e040 b6 98 00 [ 4 ] LDAA ACIA 0171 e043 84 7f [ 2 ] ANDA #$7F mask irq bit from status register 0172 e045 26 12 [ 3 ] BNE BUFF1 jump if status reg not 0 0173 e047 86 12 [ 2 ] LDAA #$12 0174 e049 b7 98 00 [ 4 ] STAA ACIA turn on acia 0175 e04c b6 98 00 [ 4 ] LDAA ACIA 0176 e04f 84 02 [ 2 ] ANDA #$02 0177 e051 27 06 [ 3 ] BEQ BUFF1 jump if tdre not set 0178 e053 86 01 [ 2 ] LDAA #$01 0179 e055 97 ab [ 3 ] STAA EXTDEV external device is acia 0180 e057 20 17 [ 3 ] BRA BUFF2 0181 0182 e059 BUFF1 EQU * see if duart exists 0183 e059 b6 d0 0c [ 4 ] LDAA DUART+$0C read IRQ vector register 0184 e05c 81 0f [ 2 ] CMPA #$0F should be out of reset 0185 e05e 26 10 [ 3 ] BNE BUFF2 0186 e060 86 aa [ 2 ] LDAA #$AA 0187 e062 b7 d0 0c [ 4 ] STAA DUART+$0C write irq vector register 0188 e065 b6 d0 0c [ 4 ] LDAA DUART+$0C read irq vector register 0189 e068 81 aa [ 2 ] CMPA #$AA 0190 e06a 26 04 [ 3 ] BNE BUFF2 0191 e06c 86 02 [ 2 ] LDAA #$02 0192 e06e 97 ab [ 3 ] STAA EXTDEV external device is duart A 0193 0194 * Find terminal port - SCI or external. * 0195 0196 e070 7f 00 aa [ 6 ] BUFF2 CLR IODEV 0197 e073 bd e3 38 [ 6 ] JSR TARGCO disconnect sci for evb board 0198 e076 bd e0 9b [ 6 ] JSR SIGNON initialize sci 0199 e079 96 ab [ 3 ] LDAA EXTDEV 0200 e07b 27 05 [ 3 ] BEQ BUFF3 jump if no external device 0201 e07d 97 aa [ 3 ] STAA IODEV 0202 e07f bd e0 9b [ 6 ] JSR SIGNON initialize external device 0203 e082 7f 00 aa [ 6 ] BUFF3 CLR IODEV 0204 e085 bd e3 87 [ 6 ] JSR INPUT get input from sci port 0205 e088 81 0d [ 2 ] CMPA #$0D 0206 e08a 27 19 [ 3 ] BEQ BUFF4 jump if cr - sci is terminal port 0207 e08c 96 ab [ 3 ] LDAA EXTDEV 0208 e08e 27 f2 [ 3 ] BEQ BUFF3 jump if no external device 0209 e090 97 aa [ 3 ] STAA IODEV 0210 e092 bd e3 87 [ 6 ] JSR INPUT get input from external device 0211 e095 81 0d [ 2 ] CMPA #$0D 0212 e097 27 0c [ 3 ] BEQ BUFF4 jump if cr - terminal found ext 0213 e099 20 e7 [ 3 ] BRA BUFF3 0214 0215 e09b bd e3 61 [ 6 ] SIGNON JSR INIT initialize device 0216 e09e ce e5 f8 [ 3 ] LDX #MSG1 buffalo message 0217 e0a1 bd e4 fa [ 6 ] JSR OUTSTRG 0218 e0a4 39 [ 5 ] RTS 0219 0220 * Determine where host port should be. * 0221 0222 e0a5 7f 00 ac [ 6 ] BUFF4 CLR HOSTDEV default - host = sci port 0223 e0a8 96 aa [ 3 ] LDAA IODEV 0224 e0aa 81 01 [ 2 ] CMPA #$01 0225 e0ac 27 04 [ 3 ] BEQ BUFF5 default host if term = acia 0226 e0ae 86 03 [ 2 ] LDAA #$03 0227 e0b0 97 ac [ 3 ] STAA HOSTDEV else host is duart port b 0228 e0b2 BUFF5 EQU * 0229 0230 ***************** 0231 ** MAIN - This module reads the user's input into 0232 ** a buffer called INBUFF. The first field (assumed 0233 ** to be the command field) is then parsed into a 0234 ** second buffer called COMBUFF. The command table 0235 ** is then searched for the contents of COMBUFF and 0236 ** if found, the address of the corresponding task 0237 ** routine is fetched from the command table. The 0238 ** task is then called as a subroutine so that 0239 ** control returns back to here upon completion of 0240 ** the task. Buffalo expects the following format 0241 ** for commands: 0242 ** [...] 0243 ** [] implies contents optional. 0244 ** means whitespace character (space,comma,tab). 0245 ** = command string of 1-8 characters. 0246 ** = Argument particular to the command. 0247 ** = Carriage return signifying end of input string. 0248 ***************** 0249 * Prompt user 0250 *do 0251 * a=input(); 0252 * if(a==(cntlx or del)) continue; 0253 * elseif(a==backspace) 0254 * b--; 0255 * if(b<0) b=0; 0256 * else 0257 * if(a==cr && buffer empty) 0258 * repeat last command; 0259 * else put a into buffer; 0260 * check if buffer full; 0261 *while(a != (cr or /) 0262 0263 e0b2 8e 00 68 [ 3 ] MAIN LDS #STACK initialize sp every time 0264 e0b5 7f 00 a9 [ 6 ] CLR AUTOLF 0265 e0b8 7c 00 a9 [ 6 ] INC AUTOLF auto cr/lf = on 0266 e0bb bd e4 ed [ 6 ] JSR OUTCRLF 0267 e0be 86 3e [ 2 ] LDAA #PROMPT prompt user 0268 e0c0 bd e3 b3 [ 6 ] JSR OUTPUT 0269 e0c3 5f [ 2 ] CLRB 0270 e0c4 bd e5 1a [ 6 ] MAIN1 JSR INCHAR read terminal 0271 e0c7 ce 00 69 [ 3 ] LDX #INBUFF 0272 e0ca 3a [ 3 ] ABX pointer into buffer 0273 e0cb 81 18 [ 2 ] CMPA #CTLX 0274 e0cd 27 e3 [ 3 ] BEQ MAIN jump if cntl X 0275 e0cf 81 7f [ 2 ] CMPA #DEL 0276 e0d1 27 df [ 3 ] BEQ MAIN jump if del 0277 e0d3 81 08 [ 2 ] CMPA #$08 0278 e0d5 26 05 [ 3 ] BNE MAIN2 jump if not bckspc 0279 e0d7 5a [ 2 ] DECB 0280 e0d8 2d d8 [ 3 ] BLT MAIN jump if buffer empty 0281 e0da 20 e8 [ 3 ] BRA MAIN1 0282 e0dc 81 0d [ 2 ] MAIN2 CMPA #$D 0283 e0de 26 07 [ 3 ] BNE MAIN3 jump if not cr 0284 e0e0 5d [ 2 ] TSTB 0285 e0e1 27 17 [ 3 ] BEQ COMM0 jump if buffer empty 0286 e0e3 a7 00 [ 4 ] STAA ,X put a in buffer 0287 e0e5 20 13 [ 3 ] BRA COMM0 0288 e0e7 a7 00 [ 4 ] MAIN3 STAA ,X put a in buffer 0289 e0e9 5c [ 2 ] INCB 0290 e0ea c1 23 [ 2 ] CMPB #BUFFLNG 0291 e0ec 2f 08 [ 3 ] BLE MAIN4 jump if not long 0292 e0ee ce e6 42 [ 3 ] LDX #MSG3 "long" 0293 e0f1 bd e4 fa [ 6 ] JSR OUTSTRG 0294 e0f4 20 bc [ 3 ] BRA MAIN 0295 e0f6 81 2f [ 2 ] MAIN4 CMPA #'/' 0296 e0f8 26 ca [ 3 ] BNE MAIN1 jump if not "/" 0297 * ******************* 0298 0299 ***************** 0300 * Parse out and evaluate the command field. 0301 ***************** 0302 *Initialize 0303 0304 e0fa COMM0 EQU * 0305 e0fa 7f 00 c0 [ 6 ] CLR TMP1 Enable "/" command 0306 e0fd 7f 00 94 [ 6 ] CLR SHFTREG 0307 e100 7f 00 95 [ 6 ] CLR SHFTREG+1 0308 e103 5f [ 2 ] CLRB 0309 e104 ce 00 69 [ 3 ] LDX #INBUFF ptrbuff[] = inbuff[] 0310 e107 df b0 [ 4 ] STX PTR0 0311 e109 bd e2 f1 [ 6 ] JSR WSKIP find first char 0312 0313 *while((a=readbuff) != (cr or wspace)) 0314 * upcase(a); 0315 * buffptr[b] = a 0316 * b++ 0317 * if (b > 8) error(too long); 0318 * if(a == "/") 0319 * if(enabled) mslash(); 0320 * else error(command?); 0321 * else hexbin(a); 0322 0323 e10c COMM1 EQU * 0324 e10c bd e2 dc [ 6 ] JSR READBUFF read from buffer 0325 e10f ce 00 8c [ 3 ] LDX #COMBUFF 0326 e112 3a [ 3 ] ABX 0327 e113 bd e1 8f [ 6 ] JSR UPCASE convert to upper case 0328 e116 a7 00 [ 4 ] STAA ,X put in command buffer 0329 e118 81 0d [ 2 ] CMPA #$0D 0330 e11a 27 35 [ 3 ] BEQ SRCH jump if cr 0331 e11c bd e2 ff [ 6 ] JSR WCHEK 0332 e11f 27 30 [ 3 ] BEQ SRCH jump if wspac 0333 e121 bd e2 e3 [ 6 ] JSR INCBUFF move buffer pointer 0334 e124 5c [ 2 ] INCB 0335 e125 c1 08 [ 2 ] CMPB #$8 0336 e127 2f 09 [ 3 ] BLE COMM2 0337 e129 ce e6 42 [ 3 ] LDX #MSG3 "long" 0338 e12c bd e4 fa [ 6 ] JSR OUTSTRG 0339 e12f 7e e0 b2 [ 3 ] JMP MAIN 0340 0341 e132 COMM2 EQU * 0342 e132 81 2f [ 2 ] CMPA #'/' 0343 e134 26 16 [ 3 ] BNE COMM4 jump if not "/" 0344 e136 7d 00 c0 [ 6 ] TST TMP1 0345 e139 26 08 [ 3 ] BNE COMM3 jump if not enabled 0346 e13b d7 ad [ 3 ] STAB COUNT 0347 e13d ce f0 77 [ 3 ] LDX #MSLASH 0348 e140 7e e1 8a [ 3 ] JMP EXEC execute "/" 0349 e143 ce e6 5a [ 3 ] COMM3 LDX #MSG8 "command?" 0350 e146 bd e4 fa [ 6 ] JSR OUTSTRG 0351 e149 7e e0 b2 [ 3 ] JMP MAIN 0352 e14c COMM4 EQU * 0353 e14c bd e1 e9 [ 6 ] JSR HEXBIN 0354 e14f 20 bb [ 3 ] BRA COMM1 0355 0356 ***************** 0357 * Search tables for command. At this point, 0358 * COMBUFF holds the command field to be executed, 0359 * and B = # of characters in the command field. 0360 * The command table holds the whole command name 0361 * but only the first n characters of the command 0362 * must match what is in COMBUFF where n is the 0363 * number of characters entered by the user. 0364 ***************** 0365 *count = b; 0366 *ptr1 = comtabl; 0367 *while(ptr1[0] != end of table) 0368 * ptr1 = next entry 0369 * for(b=1; b=count; b++) 0370 * if(ptr1[b] == combuff[b]) continue; 0371 * else error(not found); 0372 * execute task; 0373 * return(); 0374 *return(command not found); 0375 0376 e151 d7 ad [ 3 ] SRCH STAB COUNT size of command entered 0377 e153 ce e5 24 [ 3 ] LDX #COMTABL pointer to table 0378 e156 df b2 [ 4 ] STX PTR1 pointer to next entry 0379 e158 de b2 [ 4 ] SRCH1 LDX PTR1 0380 e15a 18 ce 00 8c [ 4 ] LDY #COMBUFF pointer to command buffer 0381 e15e e6 00 [ 4 ] LDAB 0,X 0382 e160 c1 ff [ 2 ] CMPB #$FF 0383 e162 26 09 [ 3 ] BNE SRCH2 0384 e164 ce e6 3c [ 3 ] LDX #MSG2 "command not found" 0385 e167 bd e4 fa [ 6 ] JSR OUTSTRG 0386 e16a 7e e0 b2 [ 3 ] JMP MAIN 0387 e16d 3c [ 4 ] SRCH2 PSHX compute next table entry 0388 e16e cb 03 [ 2 ] ADDB #$3 0389 e170 3a [ 3 ] ABX 0390 e171 df b2 [ 4 ] STX PTR1 0391 e173 38 [ 5 ] PULX 0392 e174 5f [ 2 ] CLRB 0393 e175 5c [ 2 ] SRCHLP INCB match characters loop 0394 e176 a6 01 [ 4 ] LDAA 1,X read table 0395 e178 18 a1 00 [ 5 ] CMPA 0,Y compare to combuff 0396 e17b 26 db [ 3 ] BNE SRCH1 try next entry 0397 e17d 08 [ 3 ] INX move pointers 0398 e17e 18 08 [ 4 ] INY 0399 e180 d1 ad [ 3 ] CMPB COUNT 0400 e182 2d f1 [ 3 ] BLT SRCHLP loop countu1 times 0401 e184 de b2 [ 4 ] LDX PTR1 0402 e186 09 [ 3 ] DEX 0403 e187 09 [ 3 ] DEX 0404 e188 ee 00 [ 5 ] LDX 0,X jump address from table 0405 e18a ad 00 [ 6 ] EXEC JSR 0,X call task as subroutine 0406 e18c 7e e0 b2 [ 3 ] JMP MAIN 0407 * 0408 ***************** 0409 * UTILITY SUBROUTINES - These routines 0410 * are called by any of the task routines. 0411 ***************** 0412 ***************** 0413 * UPCASE(a) - If the contents of A is alpha, 0414 * returns a converted to uppercase. 0415 ***************** 0416 e18f 81 61 [ 2 ] UPCASE CMPA #'a' 0417 e191 2d 06 [ 3 ] BLT UPCASE1 jump if < a 0418 e193 81 7a [ 2 ] CMPA #'z' 0419 e195 2e 02 [ 3 ] BGT UPCASE1 jump if > z 0420 e197 80 20 [ 2 ] SUBA #$20 convert 0421 e199 39 [ 5 ] UPCASE1 RTS 0422 0423 ***************** 0424 * BPCLR() - Clear all entries in the 0425 * table of breakpoints. 0426 ***************** 0427 e19a ce 00 96 [ 3 ] BPCLR LDX #BRKTABL 0428 e19d c6 08 [ 2 ] LDAB #8 0429 e19f 6f 00 [ 6 ] BPCLR1 CLR 0,X 0430 e1a1 08 [ 3 ] INX 0431 e1a2 5a [ 2 ] DECB 0432 e1a3 2e fa [ 3 ] BGT BPCLR1 loop 8 times 0433 e1a5 39 [ 5 ] RTS 0434 0435 ***************** 0436 * RPRNT1(x) - Prints name and contents of a single 0437 * user register. On entry X points to name of register 0438 * in reglist. On exit, a=register name. 0439 ***************** 0440 e1a6 50 59 58 41 42 43 REGLIST FCC 'PYXABCS' names 53 0441 e1ad 00 02 04 06 07 08 FCB 0,2,4,6,7,8,9 offset 09 0442 e1b4 01 01 01 00 00 00 FCB 1,1,1,0,0,0,1 size 01 0443 e1bb a6 00 [ 4 ] RPRNT1 LDAA 0,X 0444 e1bd 36 [ 3 ] PSHA 0445 e1be 3c [ 4 ] PSHX 0446 e1bf bd e3 b3 [ 6 ] JSR OUTPUT name 0447 e1c2 86 2d [ 2 ] LDAA #'-' 0448 e1c4 bd e3 b3 [ 6 ] JSR OUTPUT dash 0449 e1c7 e6 07 [ 4 ] LDAB 7,X contents offset 0450 e1c9 a6 0e [ 4 ] LDAA 14,X bytesize 0451 e1cb ce 00 9e [ 3 ] LDX #REGS address 0452 e1ce 3a [ 3 ] ABX 0453 e1cf 4d [ 2 ] TSTA 0454 e1d0 27 03 [ 3 ] BEQ RPRN2 jump if 1 byte 0455 e1d2 bd e4 d5 [ 6 ] JSR OUT1BYT 2 bytes 0456 e1d5 bd e4 e4 [ 6 ] RPRN2 JSR OUT1BSP 0457 e1d8 38 [ 5 ] PULX 0458 e1d9 32 [ 4 ] PULA 0459 e1da 39 [ 5 ] RTS 0460 0461 ***************** 0462 * RPRINT() - Print the name and contents 0463 * of all the user registers. 0464 ***************** 0465 e1db 3c [ 4 ] RPRINT PSHX 0466 e1dc ce e1 a6 [ 3 ] LDX #REGLIST 0467 e1df bd e1 bb [ 6 ] RPRI1 JSR RPRNT1 print name 0468 e1e2 08 [ 3 ] INX 0469 e1e3 81 53 [ 2 ] CMPA #'S' s is last register 0470 e1e5 26 f8 [ 3 ] BNE RPRI1 jump if not done 0471 e1e7 38 [ 5 ] PULX 0472 e1e8 39 [ 5 ] RTS 0473 0474 ***************** 0475 * HEXBIN(a) - Convert the ASCII character in a 0476 * to binary and shift into shftreg. Returns value 0477 * in tmp1 incremented if a is not hex. 0478 ***************** 0479 e1e9 36 [ 3 ] HEXBIN PSHA 0480 e1ea 37 [ 3 ] PSHB 0481 e1eb 3c [ 4 ] PSHX 0482 e1ec bd e1 8f [ 6 ] JSR UPCASE convert to upper case 0483 e1ef 81 30 [ 2 ] CMPA #'0' 0484 e1f1 2d 22 [ 3 ] BLT HEXNOT jump if a < $30 0485 e1f3 81 39 [ 2 ] CMPA #'9' 0486 e1f5 2f 0a [ 3 ] BLE HEXNMB jump if 0-9 0487 e1f7 81 41 [ 2 ] CMPA #'A' 0488 e1f9 2d 1a [ 3 ] BLT HEXNOT jump if $39> a <$41 0489 e1fb 81 46 [ 2 ] CMPA #'F' 0490 e1fd 2e 16 [ 3 ] BGT HEXNOT jump if a > $46 0491 e1ff 8b 09 [ 2 ] ADDA #$9 convert $A-$F 0492 e201 84 0f [ 2 ] HEXNMB ANDA #$0F convert to binary 0493 e203 ce 00 94 [ 3 ] LDX #SHFTREG 0494 e206 c6 04 [ 2 ] LDAB #4 0495 e208 68 01 [ 6 ] HEXSHFT ASL 1,X 2 byte shift through 0496 e20a 69 00 [ 6 ] ROL 0,X carry bit 0497 e20c 5a [ 2 ] DECB 0498 e20d 2e f9 [ 3 ] BGT HEXSHFT shift 4 times 0499 e20f aa 01 [ 4 ] ORAA 1,X 0500 e211 a7 01 [ 4 ] STAA 1,X 0501 e213 20 03 [ 3 ] BRA HEXRTS 0502 e215 7c 00 c0 [ 6 ] HEXNOT INC TMP1 indicate not hex 0503 e218 38 [ 5 ] HEXRTS PULX 0504 e219 33 [ 4 ] PULB 0505 e21a 32 [ 4 ] PULA 0506 e21b 39 [ 5 ] RTS 0507 0508 ***************** 0509 * BUFFARG() - Build a hex argument from the 0510 * contents of the input buffer. Characters are 0511 * converted to binary and shifted into shftreg 0512 * until a non-hex character is found. On exit 0513 * shftreg holds the last four digits read, count 0514 * holds the number of digits read, ptrbuff points 0515 * to the first non-hex character read, and A holds 0516 * that first non-hex character. 0517 ***************** 0518 *Initialize 0519 *while((a=readbuff()) not hex) 0520 * hexbin(a); 0521 *return(); 0522 0523 e21c 7f 00 c0 [ 6 ] BUFFARG CLR TMP1 not hex indicator 0524 e21f 7f 00 ad [ 6 ] CLR COUNT # or digits 0525 e222 7f 00 94 [ 6 ] CLR SHFTREG 0526 e225 7f 00 95 [ 6 ] CLR SHFTREG+1 0527 e228 bd e2 f1 [ 6 ] JSR WSKIP 0528 e22b bd e2 dc [ 6 ] BUFFLP JSR READBUFF read char 0529 e22e bd e1 e9 [ 6 ] JSR HEXBIN 0530 e231 7d 00 c0 [ 6 ] TST TMP1 0531 e234 26 08 [ 3 ] BNE BUFFRTS jump if not hex 0532 e236 7c 00 ad [ 6 ] INC COUNT 0533 e239 bd e2 e3 [ 6 ] JSR INCBUFF move buffer pointer 0534 e23c 20 ed [ 3 ] BRA BUFFLP 0535 e23e 39 [ 5 ] BUFFRTS RTS 0536 0537 ***************** 0538 * TERMARG() - Build a hex argument from the 0539 * terminal. Characters are converted to binary 0540 * and shifted into shftreg until a non-hex character 0541 * is found. On exit shftreg holds the last four 0542 * digits read, count holds the number of digits 0543 * read, and A holds the first non-hex character. 0544 ***************** 0545 *initialize 0546 *while((a=inchar()) == hex) 0547 * if(a = cntlx or del) 0548 * abort; 0549 * else 0550 * hexbin(a); countu1++; 0551 *return(); 0552 0553 e23f 7f 00 ad [ 6 ] TERMARG CLR COUNT 0554 e242 7f 00 94 [ 6 ] CLR SHFTREG 0555 e245 7f 00 95 [ 6 ] CLR SHFTREG+1 0556 e248 bd e5 1a [ 6 ] TERM0 JSR INCHAR 0557 e24b 81 18 [ 2 ] CMPA #CTLX 0558 e24d 27 04 [ 3 ] BEQ TERM1 jump if controlx 0559 e24f 81 7f [ 2 ] CMPA #DEL 0560 e251 26 03 [ 3 ] BNE TERM2 jump if not delete 0561 e253 7e e0 b2 [ 3 ] TERM1 JMP MAIN abort 0562 e256 7f 00 c0 [ 6 ] TERM2 CLR TMP1 hex indicator 0563 e259 bd e1 e9 [ 6 ] JSR HEXBIN 0564 e25c 7d 00 c0 [ 6 ] TST TMP1 0565 e25f 26 05 [ 3 ] BNE TERM3 jump if not hex 0566 e261 7c 00 ad [ 6 ] INC COUNT 0567 e264 20 e2 [ 3 ] BRA TERM0 0568 e266 39 [ 5 ] TERM3 RTS 0569 0570 ***************** 0571 * CHGBYT() - If shftreg is not empty, put 0572 * contents of shftreg at address in X. If X 0573 * is an address in EEPROM then program it. 0574 ***************** 0575 *if(count != 0) 0576 * (x) = a; 0577 * if(((x) != a) && (x == eeprom location)) 0578 * if((x) != $FF) byte erase (x); 0579 * if(a != $FF) program(x) = a); 0580 * if((x) != a) error(ROM) 0581 *return; 0582 0583 e267 7d 00 ad [ 6 ] CHGBYT TST COUNT 0584 e26a 27 66 [ 3 ] BEQ CHGBYT4 jump if shftreg empty 0585 e26c 96 95 [ 3 ] LDAA SHFTREG+1 0586 e26e a7 00 [ 4 ] STAA 0,X attempt to write 0587 e270 a6 00 [ 4 ] LDAA 0,X 0588 e272 91 95 [ 3 ] CMPA SHFTREG+1 0589 e274 27 4b [ 3 ] BEQ CHGBYT3 jump if it worked 0590 e276 8c 10 3f [ 4 ] CPX #CONFIG 0591 e279 27 0a [ 3 ] BEQ CHGBYT1 jump if config reg 0592 e27b 8c b6 00 [ 4 ] CPX #$B600 0593 e27e 25 41 [ 3 ] BLO CHGBYT3 jump if not EE 0594 e280 8c b7 ff [ 4 ] CPX #$B7FF 0595 e283 22 3c [ 3 ] BHI CHGBYT3 jump if not EE 0596 e285 CHGBYT1 EQU * 0597 e285 a6 00 [ 4 ] LDAA 0,X 0598 e287 81 ff [ 2 ] CMPA #$FF 0599 e289 27 18 [ 3 ] BEQ CHGBYT2 jump if already erased 0600 e28b 86 16 [ 2 ] LDAA #$16 do byte erase 0601 e28d b7 10 3b [ 4 ] STAA PPROG 0602 e290 86 ff [ 2 ] LDAA #$FF 0603 e292 a7 00 [ 4 ] STAA 0,X 0604 e294 86 17 [ 2 ] LDAA #$17 0605 e296 26 01 [ 3 ] BNE ACL1 0606 e298 4f [ 2 ] CLRA fail safe 0607 e299 b7 10 3b [ 4 ] ACL1 STAA PPROG 0608 e29c 8d 35 [ 6 ] BSR CHGWAIT 0609 e29e 86 00 [ 2 ] LDAA #$00 0610 e2a0 b7 10 3b [ 4 ] STAA PPROG end of byte erase 0611 e2a3 CHGBYT2 EQU * 0612 e2a3 96 95 [ 3 ] LDAA SHFTREG+1 0613 e2a5 81 ff [ 2 ] CMPA #$FF 0614 e2a7 27 18 [ 3 ] BEQ CHGBYT3 jump if no need to program 0615 e2a9 86 02 [ 2 ] LDAA #$02 do byte program 0616 e2ab b7 10 3b [ 4 ] STAA PPROG 0617 e2ae 96 95 [ 3 ] LDAA SHFTREG+1 0618 e2b0 a7 00 [ 4 ] STAA 0,X 0619 e2b2 86 03 [ 2 ] LDAA #$03 0620 e2b4 26 01 [ 3 ] BNE ACL2 0621 e2b6 4f [ 2 ] CLRA fail safe 0622 e2b7 b7 10 3b [ 4 ] ACL2 STAA PPROG 0623 e2ba 8d 17 [ 6 ] BSR CHGWAIT 0624 e2bc 86 00 [ 2 ] LDAA #$00 0625 e2be b7 10 3b [ 4 ] STAA PPROG end of byte program 0626 e2c1 CHGBYT3 EQU * 0627 e2c1 a6 00 [ 4 ] LDAA ,X 0628 e2c3 91 95 [ 3 ] CMPA SHFTREG+1 0629 e2c5 27 0b [ 3 ] BEQ CHGBYT4 0630 e2c7 3c [ 4 ] PSHX 0631 e2c8 ce e6 55 [ 3 ] LDX #MSG6 "rom" 0632 e2cb bd e4 fa [ 6 ] JSR OUTSTRG 0633 e2ce bd e4 ed [ 6 ] JSR OUTCRLF 0634 e2d1 38 [ 5 ] PULX 0635 e2d2 CHGBYT4 EQU * 0636 e2d2 39 [ 5 ] RTS 0637 0638 e2d3 CHGWAIT EQU * delay 10 ms at E = 2MHz 0639 e2d3 3c [ 4 ] PSHX 0640 e2d4 ce 0d 06 [ 3 ] LDX #$0D06 0641 e2d7 09 [ 3 ] CHGWAIT1 DEX 0642 e2d8 26 fd [ 3 ] BNE CHGWAIT1 0643 e2da 38 [ 5 ] PULX 0644 e2db 39 [ 5 ] RTS 0645 0646 ***************** 0647 * READBUFF() - Read the character in INBUFF 0648 * pointed at by ptrbuff into A. Returns ptrbuff 0649 * unchanged. 0650 ***************** 0651 e2dc 3c [ 4 ] READBUFF PSHX 0652 e2dd de b0 [ 4 ] LDX PTR0 0653 e2df a6 00 [ 4 ] LDAA 0,X 0654 e2e1 38 [ 5 ] PULX 0655 e2e2 39 [ 5 ] RTS 0656 0657 ***************** 0658 * INCBUFF(), DECBUFF() - Increment or decrement 0659 * ptrbuff. 0660 ***************** 0661 e2e3 3c [ 4 ] INCBUFF PSHX 0662 e2e4 de b0 [ 4 ] LDX PTR0 0663 e2e6 08 [ 3 ] INX 0664 e2e7 20 04 [ 3 ] BRA INCDEC 0665 e2e9 3c [ 4 ] DECBUFF PSHX 0666 e2ea de b0 [ 4 ] LDX PTR0 0667 e2ec 09 [ 3 ] DEX 0668 e2ed df b0 [ 4 ] INCDEC STX PTR0 0669 e2ef 38 [ 5 ] PULX 0670 e2f0 39 [ 5 ] RTS 0671 0672 ***************** 0673 * WSKIP() - Read from the INBUFF until a 0674 * non whitespace (space, comma, tab) character 0675 * is found. Returns ptrbuff pointing to the 0676 * first non-whitespace character and a holds 0677 * that character. 0678 ***************** 0679 e2f1 bd e2 dc [ 6 ] WSKIP JSR READBUFF read character 0680 e2f4 bd e2 ff [ 6 ] JSR WCHEK 0681 e2f7 26 05 [ 3 ] BNE WSKIP1 jump if not wspc 0682 e2f9 bd e2 e3 [ 6 ] JSR INCBUFF move pointer 0683 e2fc 20 f3 [ 3 ] BRA WSKIP loop 0684 e2fe 39 [ 5 ] WSKIP1 RTS 0685 0686 ***************** 0687 * WCHEK(a) - Returns z=1 if a holds a 0688 * whitespace character, else z=0. 0689 ***************** 0690 e2ff 81 2c [ 2 ] WCHEK CMPA #$2C comma 0691 e301 27 06 [ 3 ] BEQ WCHEK1 0692 e303 81 20 [ 2 ] CMPA #$20 space 0693 e305 27 02 [ 3 ] BEQ WCHEK1 0694 e307 81 09 [ 2 ] CMPA #$09 tab 0695 e309 39 [ 5 ] WCHEK1 RTS 0696 0697 ***************** 0698 * DCHEK(a) - Returns Z=1 if a = whitespace 0699 * or carriage return. Else returns z=0. 0700 ***************** 0701 e30a bd e2 ff [ 6 ] DCHEK JSR WCHEK 0702 e30d 27 02 [ 3 ] BEQ DCHEK1 jump if whitespace 0703 e30f 81 0d [ 2 ] CMPA #$0D 0704 e311 39 [ 5 ] DCHEK1 RTS 0705 0706 ***************** 0707 * CHKABRT() - Checks for a control x or delete 0708 * from the terminal. If found, the stack is 0709 * reset and the control is transferred to main. 0710 * Note that this is an abnormal termination. 0711 * If the input from the terminal is a control W 0712 * then this routine keeps waiting until any other 0713 * character is read. 0714 ***************** 0715 *a=input(); 0716 *if(a=cntl w) wait until any other key; 0717 *if(a = cntl x or del) abort; 0718 0719 e312 bd e3 87 [ 6 ] CHKABRT JSR INPUT 0720 e315 27 18 [ 3 ] BEQ CHK4 jump if no input 0721 e317 81 17 [ 2 ] CMPA #CTLW 0722 e319 26 05 [ 3 ] BNE CHK2 jump in not cntlw 0723 e31b bd e3 87 [ 6 ] CHKABRT1 JSR INPUT 0724 e31e 27 fb [ 3 ] BEQ CHKABRT1 jump if no input 0725 e320 81 7f [ 2 ] CHK2 CMPA #DEL 0726 e322 27 08 [ 3 ] BEQ CHK3 jump if delete 0727 e324 81 18 [ 2 ] CMPA #CTLX 0728 e326 27 04 [ 3 ] BEQ CHK3 jump if control x 0729 e328 81 01 [ 2 ] CMPA #CTLA 0730 e32a 26 03 [ 3 ] BNE CHK4 jump not control a 0731 e32c 7e e0 b2 [ 3 ] CHK3 JMP MAIN abort 0732 e32f 39 [ 5 ] CHK4 RTS return 0733 0734 *********************** 0735 * HOSTCO - connect sci to host for evb board. 0736 * TARGCO - connect sci to target for evb board. 0737 *********************** 0738 e330 36 [ 3 ] HOSTCO PSHA 0739 e331 86 01 [ 2 ] LDAA #$01 0740 e333 b7 40 00 [ 4 ] STAA DFLOP send 1 to d-flop 0741 e336 32 [ 4 ] PULA 0742 e337 39 [ 5 ] RTS 0743 0744 e338 36 [ 3 ] TARGCO PSHA 0745 e339 86 00 [ 2 ] LDAA #$00 0746 e33b b7 40 00 [ 4 ] STAA DFLOP send 0 to d-flop 0747 e33e 32 [ 4 ] PULA 0748 e33f 39 [ 5 ] RTS 0749 0750 * 0751 ********** 0752 * 0753 * VECINIT - This routine checks for 0754 * vectors in the RAM table. All 0755 * uninitialized vectors are programmed 0756 * to JMP STOPIT 0757 * 0758 ********** 0759 * 0760 e340 ce 00 c4 [ 3 ] VECINIT LDX #JSCI Point to First RAM Vector 0761 e343 18 ce e3 5a [ 4 ] LDY #STOPIT Pointer to STOPIT routine 0762 e347 cc 7e 03 [ 3 ] LDD #$7E03 A=JMP opcode; B=offset 0763 e34a a1 00 [ 4 ] VECLOOP CMPA 0,X 0764 e34c 27 05 [ 3 ] BEQ VECNEXT If vector already in 0765 e34e a7 00 [ 4 ] STAA 0,X install JMP 0766 e350 1a ef 01 [ 6 ] STY 1,X to STOPIT routine 0767 e353 3a [ 3 ] VECNEXT ABX Add 3 to point at next vector 0768 e354 8c 01 00 [ 4 ] CPX #JCLM+3 Done? 0769 e357 26 f1 [ 3 ] BNE VECLOOP If not, continue loop 0770 e359 39 [ 5 ] RTS 0771 * 0772 e35a 86 50 [ 2 ] STOPIT LDAA #$50 Stop-enable; IRQ, XIRQ-Off 0773 e35c 06 [ 2 ] TAP 0774 e35d cf [ 2 ] STOP You are lost! Shut down 0775 e35e 7e e3 5a [ 3 ] JMP STOPIT In case continue by XIRQ 0776 0777 ********** 0778 * 0779 * I/O MODULE 0780 * Communications with the outside world. 0781 * 3 I/O routines (INIT, INPUT, and OUTPUT) call 0782 * drivers specified by IODEV (0=SCI, 1=ACIA, 0783 * 2=DUARTA, 3=DUARTB). 0784 * 0785 ********** 0786 * INIT() - Initialize device specified by iodev. 0787 ********* 0788 * 0789 e361 INIT EQU * 0790 e361 36 [ 3 ] PSHA save registers 0791 e362 3c [ 4 ] PSHX 0792 e363 96 aa [ 3 ] LDAA IODEV 0793 e365 81 00 [ 2 ] CMPA #$00 0794 e367 26 05 [ 3 ] BNE INIT1 jump not sci 0795 e369 bd e4 2f [ 6 ] JSR ONSCI initialize sci 0796 e36c 20 16 [ 3 ] BRA INIT4 0797 e36e 81 01 [ 2 ] INIT1 CMPA #$01 0798 e370 26 05 [ 3 ] BNE INIT2 jump not acia 0799 e372 bd e4 6e [ 6 ] JSR ONACIA initialize acia 0800 e375 20 0d [ 3 ] BRA INIT4 0801 e377 ce d0 00 [ 3 ] INIT2 LDX #PORTA 0802 e37a 81 02 [ 2 ] CMPA #$02 0803 e37c 27 03 [ 3 ] BEQ INIT3 jump duart a 0804 e37e ce d0 08 [ 3 ] LDX #PORTB 0805 e381 bd e3 d9 [ 6 ] INIT3 JSR ONUART initialize duart 0806 e384 38 [ 5 ] INIT4 PULX restore registers 0807 e385 32 [ 4 ] PULA 0808 e386 39 [ 5 ] RTS 0809 0810 ********** 0811 * INPUT() - Read device. Returns a=char or 0. 0812 * This routine also disarms the cop. 0813 ********** 0814 e387 INPUT EQU * 0815 e387 3c [ 4 ] PSHX 0816 e388 86 55 [ 2 ] LDAA #$55 reset cop 0817 e38a b7 10 3a [ 4 ] STAA COPRST 0818 e38d 86 aa [ 2 ] LDAA #$AA 0819 e38f b7 10 3a [ 4 ] STAA COPRST 0820 e392 96 aa [ 3 ] LDAA IODEV 0821 e394 26 05 [ 3 ] BNE INPUT1 jump not sci 0822 e396 bd e4 3f [ 6 ] JSR INSCI read sci 0823 e399 20 16 [ 3 ] BRA INPUT4 0824 e39b 81 01 [ 2 ] INPUT1 CMPA #$01 0825 e39d 26 05 [ 3 ] BNE INPUT2 jump not acia 0826 e39f bd e4 7a [ 6 ] JSR INACIA read acia 0827 e3a2 20 0d [ 3 ] BRA INPUT4 0828 e3a4 ce d0 00 [ 3 ] INPUT2 LDX #PORTA 0829 e3a7 81 02 [ 2 ] CMPA #$02 0830 e3a9 27 03 [ 3 ] BEQ INPUT3 jump if duart a 0831 e3ab ce d0 08 [ 3 ] LDX #PORTB 0832 e3ae bd e4 04 [ 6 ] INPUT3 JSR INUART read uart 0833 e3b1 38 [ 5 ] INPUT4 PULX 0834 e3b2 39 [ 5 ] RTS 0835 0836 ********** 0837 * OUTPUT() - Output character in A. 0838 ********** 0839 0840 e3b3 OUTPUT EQU * 0841 e3b3 36 [ 3 ] PSHA save registers 0842 e3b4 37 [ 3 ] PSHB 0843 e3b5 3c [ 4 ] PSHX 0844 e3b6 d6 aa [ 3 ] LDAB IODEV 0845 e3b8 26 05 [ 3 ] BNE OUTPUT1 jump not sci 0846 e3ba bd e4 4c [ 6 ] JSR OUTSCI write sci 0847 e3bd 20 16 [ 3 ] BRA OUTPUT4 0848 e3bf c1 01 [ 2 ] OUTPUT1 CMPB #$01 0849 e3c1 26 12 [ 3 ] BNE OUTPUT4 jump not acia 0850 e3c3 bd e4 93 [ 6 ] JSR OUTACIA write acia 0851 e3c6 20 0d [ 3 ] BRA OUTPUT4 0852 e3c8 ce d0 00 [ 3 ] OUTPUT2 LDX #PORTA 0853 e3cb c1 02 [ 2 ] CMPB #$02 0854 e3cd 27 03 [ 3 ] BEQ OUTPUT3 jump if duart a 0855 e3cf ce d0 08 [ 3 ] LDX #PORTB 0856 e3d2 bd e4 0f [ 6 ] OUTPUT3 JSR OUTUART write uart 0857 e3d5 38 [ 5 ] OUTPUT4 PULX 0858 e3d6 33 [ 4 ] PULB 0859 e3d7 32 [ 4 ] PULA 0860 e3d8 39 [ 5 ] RTS 0861 0862 ********** 0863 * ONUART(port) - Initialize a duart port. 0864 * Sets duart to internal clock, divide by 16, 0865 * 8 data + 1 stop bits. 0866 ********** 0867 0868 e3d9 86 22 [ 2 ] ONUART LDAA #$22 0869 e3db a7 02 [ 4 ] STAA 2,X reset receiver 0870 e3dd 86 38 [ 2 ] LDAA #$38 0871 e3df a7 02 [ 4 ] STAA 2,X reset transmitter 0872 e3e1 86 40 [ 2 ] LDAA #$40 0873 e3e3 a7 02 [ 4 ] STAA 2,X reset error status 0874 e3e5 86 10 [ 2 ] LDAA #$10 0875 e3e7 a7 02 [ 4 ] STAA 2,X reset pointer 0876 e3e9 86 00 [ 2 ] LDAA #$00 0877 e3eb b7 d0 04 [ 4 ] STAA DUART+4 clock source 0878 e3ee 86 00 [ 2 ] LDAA #$00 0879 e3f0 b7 d0 05 [ 4 ] STAA DUART+5 interrupt mask 0880 e3f3 86 13 [ 2 ] LDAA #$13 0881 e3f5 a7 00 [ 4 ] STAA 0,X 8 data, no parity 0882 e3f7 86 07 [ 2 ] LDAA #$07 0883 e3f9 a7 00 [ 4 ] STAA 0,X 1 stop bits 0884 e3fb 86 bb [ 2 ] LDAA #$BB baud rate (9600) 0885 e3fd a7 01 [ 4 ] STAA 1,X tx and rcv baud rate 0886 e3ff 86 05 [ 2 ] LDAA #$05 0887 e401 a7 02 [ 4 ] STAA 2,X enable tx and rcv 0888 e403 39 [ 5 ] RTS 0889 0890 ********** 0891 * INUART(port) - Check duart for any input. 0892 ********** 0893 0894 e404 a6 01 [ 4 ] INUART LDAA 1,X read status 0895 e406 84 01 [ 2 ] ANDA #$01 check rdrf 0896 e408 27 04 [ 3 ] BEQ INUART1 jump if no data 0897 e40a a6 03 [ 4 ] LDAA 3,X read data 0898 e40c 84 7f [ 2 ] ANDA #$7F to mask parity 0899 e40e 39 [ 5 ] INUART1 RTS 0900 0901 ********** 0902 * OUTUART(port) - Output the character in a. 0903 * if autolf=1, transmits cr or lf as crlf. 0904 ********** 0905 e40f 7d 00 a9 [ 6 ] OUTUART TST AUTOLF 0906 e412 27 10 [ 3 ] BEQ OUTUART2 jump if no autolf 0907 e414 8d 0e [ 6 ] BSR OUTUART2 0908 e416 81 0d [ 2 ] CMPA #$0D 0909 e418 26 04 [ 3 ] BNE OUTUART1 0910 e41a 86 0a [ 2 ] LDAA #$0A if cr, output lf 0911 e41c 20 06 [ 3 ] BRA OUTUART2 0912 e41e 81 0a [ 2 ] OUTUART1 CMPA #$0A 0913 e420 26 0c [ 3 ] BNE OUTUART3 0914 e422 86 0d [ 2 ] LDAA #$0D if lf, output cr 0915 e424 e6 01 [ 4 ] OUTUART2 LDAB 1,X check status 0916 e426 c4 04 [ 2 ] ANDB #$4 0917 e428 27 fa [ 3 ] BEQ OUTUART2 loop until tdre=1 0918 e42a 84 7f [ 2 ] ANDA #$7F mask parity 0919 e42c a7 03 [ 4 ] STAA 3,X send character 0920 e42e 39 [ 5 ] OUTUART3 RTS 0921 0922 ********** 0923 * ONSCI() - Initialize the SCI for 9600 0924 * baud at 8 MHz Extal. 0925 ********** 0926 e42f 86 30 [ 2 ] ONSCI LDAA #$30 0927 e431 b7 10 2b [ 4 ] STAA BAUD baud register 0928 e434 86 00 [ 2 ] LDAA #$00 0929 e436 b7 10 2c [ 4 ] STAA SCCR1 0930 e439 86 0c [ 2 ] LDAA #$0C 0931 e43b b7 10 2d [ 4 ] STAA SCCR2 enable 0932 e43e 39 [ 5 ] RTS 0933 0934 ********** 0935 * INSCI() - Read from SCI. Return a=char or 0. 0936 ********** 0937 e43f b6 10 2e [ 4 ] INSCI LDAA SCSR read status reg 0938 e442 84 20 [ 2 ] ANDA #$20 0939 e444 27 05 [ 3 ] BEQ INSCI1 jump if rdrf=0 0940 e446 b6 10 2f [ 4 ] LDAA SCDAT read data register 0941 e449 84 7f [ 2 ] ANDA #$7F mask parity 0942 e44b 39 [ 5 ] INSCI1 RTS 0943 0944 ********** 0945 * OUTSCI() - Output A to sci. IF autolf = 1, 0946 * cr and lf sent as crlf. 0947 ********** 0948 e44c 7d 00 a9 [ 6 ] OUTSCI TST AUTOLF 0949 e44f 27 10 [ 3 ] BEQ OUTSCI2 jump if autolf=0 0950 e451 8d 0e [ 6 ] BSR OUTSCI2 0951 e453 81 0d [ 2 ] CMPA #$0D 0952 e455 26 04 [ 3 ] BNE OUTSCI1 0953 e457 86 0a [ 2 ] LDAA #$0A if cr, send lf 0954 e459 20 06 [ 3 ] BRA OUTSCI2 0955 e45b 81 0a [ 2 ] OUTSCI1 CMPA #$0A 0956 e45d 26 0e [ 3 ] BNE OUTSCI3 0957 e45f 86 0d [ 2 ] LDAA #$0D if lf, send cr 0958 e461 f6 10 2e [ 4 ] OUTSCI2 LDAB SCSR read status 0959 e464 c5 80 [ 2 ] BITB #$80 0960 e466 27 f9 [ 3 ] BEQ OUTSCI2 loop until tdre=1 0961 e468 84 7f [ 2 ] ANDA #$7F mask parity 0962 e46a b7 10 2f [ 4 ] STAA SCDAT send character 0963 e46d 39 [ 5 ] OUTSCI3 RTS 0964 0965 ********** 0966 * ONACIA - Initialize the ACIA for 0967 * 8 data bits, 1 stop bit, divide by 64 clock. 0968 ********** 0969 e46e ce 98 00 [ 3 ] ONACIA LDX #ACIA 0970 e471 86 03 [ 2 ] LDAA #$03 0971 e473 a7 00 [ 4 ] STAA 0,X master reset 0972 e475 86 16 [ 2 ] LDAA #$16 0973 e477 a7 00 [ 4 ] STAA 0,X setup 0974 e479 39 [ 5 ] RTS 0975 0976 ********** 0977 * INACIA - Read from the ACIA, Return a=char or 0. 0978 ********** 0979 e47a ce 98 00 [ 3 ] INACIA LDX #ACIA 0980 e47d a6 00 [ 4 ] LDAA 0,X status 0981 e47f 36 [ 3 ] PSHA 0982 e480 84 70 [ 2 ] ANDA #$70 check pe, ov, fe 0983 e482 32 [ 4 ] PULA 0984 e483 27 04 [ 3 ] BEQ INACIA1 jump - no error 0985 e485 8d e7 [ 6 ] BSR ONACIA reinitialize and try again 0986 e487 20 f1 [ 3 ] BRA INACIA 0987 e489 44 [ 2 ] INACIA1 LSRA check rdrf 0988 e48a 25 02 [ 3 ] BCS INACIA2 jump if data 0989 e48c 4f [ 2 ] CLRA return(no data) 0990 e48d 39 [ 5 ] RTS 0991 e48e a6 01 [ 4 ] INACIA2 LDAA 1,X read data 0992 e490 84 7f [ 2 ] ANDA #$7F mask parity 0993 e492 39 [ 5 ] RTS 0994 0995 ********** 0996 * OUTACIA - Output A to acia. IF autolf = 1, 0997 * cr or lf sent as crlf. 0998 ********** 0999 e493 8d 18 [ 6 ] OUTACIA BSR OUTACIA3 output char 1000 e495 7d 00 a9 [ 6 ] TST AUTOLF 1001 e498 27 12 [ 3 ] BEQ OUTACIA2 jump no autolf 1002 e49a 81 0d [ 2 ] CMPA #$0D 1003 e49c 26 06 [ 3 ] BNE OUTACIA1 1004 e49e 86 0a [ 2 ] LDAA #$0A 1005 e4a0 8d 0b [ 6 ] BSR OUTACIA3 if cr, output lf 1006 e4a2 20 08 [ 3 ] BRA OUTACIA2 1007 e4a4 81 0a [ 2 ] OUTACIA1 CMPA #$0A 1008 e4a6 26 04 [ 3 ] BNE OUTACIA2 1009 e4a8 86 0d [ 2 ] LDAA #$0D 1010 e4aa 8d 01 [ 6 ] BSR OUTACIA3 if lf, output cr 1011 e4ac 39 [ 5 ] OUTACIA2 RTS 1012 1013 e4ad ce 98 00 [ 3 ] OUTACIA3 LDX #ACIA 1014 e4b0 e6 00 [ 4 ] LDAB 0,X 1015 e4b2 c5 02 [ 2 ] BITB #$2 1016 e4b4 27 f7 [ 3 ] BEQ OUTACIA3 loop until tdre 1017 e4b6 84 7f [ 2 ] ANDA #$7F mask parity 1018 e4b8 a7 01 [ 4 ] STAA 1,X output 1019 e4ba 39 [ 5 ] RTS 1020 * 1021 * Space for modifying OUTACIA routine 1022 * 1023 e4bb ff ff ff ff ff ff FDB $FFFF,$FFFF,$FFFF,$FFFF ff ff 1024 ******************************* 1025 *** I/O UTILITY SUBROUTINES *** 1026 ***These subroutines perform the neccesary 1027 * data I/O operations. 1028 * OUTLHLF-Convert left 4 bits of A from binary 1029 * to ASCII and output. 1030 * OUTRHLF-Convert right 4 bits of A from binary 1031 * to ASCII and output. 1032 * OUT1BYT-Convert byte addresed by X from binary 1033 * to ASCII and output. 1034 * OUT1BSP-Convert byte addressed by X from binary 1035 * to ASCII and output followed by a space. 1036 * OUT2BSP-Convert 2 bytes addressed by X from binary 1037 * to ASCII and output followed by a space. 1038 * OUTSPAC-Output a space. 1039 * 1040 * OUTCRLF-Output a line feed and carriage return. 1041 * 1042 * OUTSTRG-Output the string of ASCII bytes addressed 1043 * by X until $04. 1044 * OUTA-Output the ASCII character in A. 1045 * 1046 * INCHAR-Input to A and echo one character. Loops 1047 * until character read. 1048 * ******************* 1049 1050 ********** 1051 * OUTRHLF(), OUTLHLF(), OUTA() 1052 *Convert A from binary to ASCII and output. 1053 *Contents of A are destroyed.. 1054 ********** 1055 e4c3 44 [ 2 ] OUTLHLF LSRA shift data to right 1056 e4c4 44 [ 2 ] LSRA 1057 e4c5 44 [ 2 ] LSRA 1058 e4c6 44 [ 2 ] LSRA 1059 e4c7 84 0f [ 2 ] OUTRHLF ANDA #$0F mask top half 1060 e4c9 8b 30 [ 2 ] ADDA #$30 convert to ascii 1061 e4cb 81 39 [ 2 ] CMPA #$39 1062 e4cd 2f 02 [ 3 ] BLE OUTA jump if 0-9 1063 e4cf 8b 07 [ 2 ] ADDA #$07 convert to hex A-F 1064 e4d1 bd e3 b3 [ 6 ] OUTA JSR OUTPUT output character 1065 e4d4 39 [ 5 ] RTS 1066 1067 ********** 1068 * OUT1BYT(x) - Convert the byte at X to two 1069 * ASCII characters and output. Return X pointing 1070 * to next byte. 1071 ********** 1072 e4d5 36 [ 3 ] OUT1BYT PSHA 1073 e4d6 a6 00 [ 4 ] LDAA 0,X get data in a 1074 e4d8 36 [ 3 ] PSHA save copy 1075 e4d9 8d e8 [ 6 ] BSR OUTLHLF output left half 1076 e4db 32 [ 4 ] PULA retrieve copy 1077 e4dc 8d e9 [ 6 ] BSR OUTRHLF output right half 1078 e4de 32 [ 4 ] PULA 1079 e4df 08 [ 3 ] INX 1080 e4e0 39 [ 5 ] RTS 1081 1082 ********** 1083 * OUT1BSP(x), OUT2BSP(x) - Output 1 or 2 bytes 1084 * at x followed by a space. Returns x pointing to 1085 * next byte. 1086 ********** 1087 e4e1 bd e4 d5 [ 6 ] OUT2BSP JSR OUT1BYT do first byte 1088 e4e4 bd e4 d5 [ 6 ] OUT1BSP JSR OUT1BYT do next byte 1089 e4e7 86 20 [ 2 ] OUTSPAC LDAA #$20 output a space 1090 e4e9 bd e3 b3 [ 6 ] JSR OUTPUT 1091 e4ec 39 [ 5 ] RTS 1092 1093 ********** 1094 * OUTCRLF() - Output a Carriage return and 1095 * a line feed. Returns a = cr. 1096 ********** 1097 e4ed 86 0d [ 2 ] OUTCRLF LDAA #$0D cr 1098 e4ef bd e3 b3 [ 6 ] JSR OUTPUT output a 1099 e4f2 86 00 [ 2 ] LDAA #$00 1100 e4f4 bd e3 b3 [ 6 ] JSR OUTPUT output padding 1101 e4f7 86 0d [ 2 ] LDAA #$0D 1102 e4f9 39 [ 5 ] RTS 1103 1104 ********** 1105 * OUTSTRG(x) - Output string of ASCII bytes 1106 * starting at x until end of text ($04). Can 1107 * be paused by control w (any char restarts). 1108 ********** 1109 e4fa bd e4 ed [ 6 ] OUTSTRG JSR OUTCRLF 1110 e4fd 36 [ 3 ] OUTSTRG0 PSHA 1111 e4fe a6 00 [ 4 ] OUTSTRG1 LDAA 0,X read char into a 1112 e500 81 04 [ 2 ] CMPA #EOT 1113 e502 27 14 [ 3 ] BEQ OUTSTRG3 jump if eot 1114 e504 bd e3 b3 [ 6 ] JSR OUTPUT output character 1115 e507 08 [ 3 ] INX 1116 e508 bd e3 87 [ 6 ] JSR INPUT 1117 e50b 27 f1 [ 3 ] BEQ OUTSTRG1 jump if no input 1118 e50d 81 17 [ 2 ] CMPA #CTLW 1119 e50f 26 ed [ 3 ] BNE OUTSTRG1 jump if not cntlw 1120 e511 bd e3 87 [ 6 ] OUTSTRG2 JSR INPUT 1121 e514 27 fb [ 3 ] BEQ OUTSTRG2 jump if any input 1122 e516 20 e6 [ 3 ] BRA OUTSTRG1 1123 e518 32 [ 4 ] OUTSTRG3 PULA 1124 e519 39 [ 5 ] RTS 1125 1126 ********** 1127 * INCHAR() - Reads input until character sent. 1128 * Echoes char and returns with a = char. 1129 e51a bd e3 87 [ 6 ] INCHAR JSR INPUT 1130 e51d 4d [ 2 ] TSTA 1131 e51e 27 fa [ 3 ] BEQ INCHAR jump if no input 1132 e520 bd e3 b3 [ 6 ] JSR OUTPUT echo 1133 e523 39 [ 5 ] RTS 1134 1135 ********************* 1136 *** COMMAND TABLE *** 1137 e524 COMTABL EQU * 1138 e524 05 FCB 5 1139 e525 41 53 53 45 4d FCC 'ASSEM' 1140 e52a f3 07 FDB #ASSEM 1141 e52c 05 FCB 5 1142 e52d 42 52 45 41 4b FCC 'BREAK' 1143 e532 e6 a7 FDB #BREAK 1144 e534 04 FCB 4 1145 e535 42 55 4c 4b FCC 'BULK' 1146 e539 e7 66 FDB #BULK 1147 e53b 07 FCB 7 1148 e53c 42 55 4c 4b 41 4c FCC 'BULKALL' 4c 1149 e543 e7 6b FDB #BULKALL 1150 e545 04 FCB 4 1151 e546 43 41 4c 4c FCC 'CALL' 1152 e54a e8 a7 FDB #CALL 1153 e54c 04 FCB 4 1154 e54d 44 55 4d 50 FCC 'DUMP' 1155 e551 e7 9b FDB #DUMP 1156 e553 04 FCB 4 1157 e554 46 49 4c 4c FCC 'FILL' 1158 e558 e8 36 FDB #FILL 1159 e55a 02 FCB 2 1160 e55b 47 4f FCC 'GO' 1161 e55d e8 f4 FDB #GO 1162 e55f 04 FCB 4 1163 e560 48 45 4c 50 FCC 'HELP' 1164 e564 ea 61 FDB #HELP 1165 e566 04 FCB 4 1166 e567 48 4f 53 54 FCC 'HOST' 1167 e56b ee cf FDB #HOST 1168 e56d 04 FCB 4 1169 e56e 4c 4f 41 44 FCC 'LOAD' 1170 e572 ef 6d FDB #LOAD 1171 e574 06 FCB 6 LENGTH OF COMMAND 1172 e575 4d 45 4d 4f 52 59 FCC 'MEMORY' ASCII COMMAND 1173 e57b f0 5f FDB #MEMORY COMMAND ADDRESS 1174 e57d 04 FCB 4 1175 e57e 4d 4f 56 45 FCC 'MOVE' 1176 e582 f1 16 FDB #MOVE 1177 e584 07 FCB 7 1178 e585 50 52 4f 43 45 45 FCC 'PROCEED' 44 1179 e58c e9 43 FDB #PROCEED 1180 e58e 08 FCB 8 1181 e58f 52 45 47 49 53 54 FCC 'REGISTER' 45 52 1182 e597 f1 d1 FDB #REGISTER 1183 e599 05 FCB 5 1184 e59a 54 52 41 43 45 FCC 'TRACE' 1185 e59f e9 4c FDB #TRACE 1186 e5a1 06 FCB 6 1187 e5a2 56 45 52 49 46 59 FCC 'VERIFY' 1188 e5a8 ef 65 FDB #VERIFY 1189 e5aa 01 FCB 1 1190 e5ab 3f FCC '?' initial command 1191 e5ac ea 61 FDB #HELP 1192 e5ae 05 FCB 5 1193 e5af 58 42 4f 4f 54 FCC 'XBOOT' 1194 e5b4 fd ce FDB #BOOT 1195 * 1196 *** Command names for evm compatability *** 1197 * 1198 e5b6 03 FCB 3 1199 e5b7 41 53 4d FCC 'ASM' 1200 e5ba f3 07 FDB #ASSEM 1201 e5bc 02 FCB 2 1202 e5bd 42 46 FCC 'BF' 1203 e5bf e8 36 FDB #FILL 1204 e5c1 04 FCB 4 1205 e5c2 43 4f 50 59 FCC 'COPY' 1206 e5c6 f1 16 FDB #MOVE 1207 e5c8 05 FCB 5 1208 e5c9 45 52 41 53 45 FCC 'ERASE' 1209 e5ce e7 66 FDB #BULK 1210 e5d0 02 FCB 2 1211 e5d1 4d 44 FCC 'MD' 1212 e5d3 e7 9b FDB #DUMP 1213 e5d5 02 FCB 2 1214 e5d6 4d 4d FCC 'MM' 1215 e5d8 f0 5f FDB #MEMORY 1216 e5da 02 FCB 2 1217 e5db 52 44 FCC 'RD' 1218 e5dd f1 d1 FDB #REGISTER 1219 e5df 02 FCB 2 1220 e5e0 52 4d FCC 'RM' 1221 e5e2 f1 d1 FDB #REGISTER 1222 e5e4 04 FCB 4 1223 e5e5 52 45 41 44 FCC 'READ' 1224 e5e9 f1 16 FDB #MOVE 1225 e5eb 02 FCB 2 1226 e5ec 54 4d FCC 'TM' 1227 e5ee ee cf FDB #HOST 1228 e5f0 04 FCB 4 1229 e5f1 54 45 53 54 FCC 'TEST' 1230 e5f5 fe 23 FDB #EVBTEST 1231 e5f7 ff FCB -1 1232 1233 ******************* 1234 *** TEXT TABLES *** 1235 1236 e5f8 42 55 46 46 41 4c MSG1 FCC 'BUFFALO 2.5 (ext) - Bit User Fast Friendly Aid to Logical Operation' 4f 20 32 2e 35 20 28 65 78 74 29 20 2d 20 42 69 74 20 55 73 65 72 20 46 61 73 74 20 46 72 69 65 6e 64 6c 79 20 41 69 64 20 74 6f 20 4c 6f 67 69 63 61 6c 20 4f 70 65 72 61 74 1237 e63b 04 FCB EOT 1238 e63c 57 68 61 74 3f MSG2 FCC 'What?' 1239 e641 04 FCB EOT 1240 e642 54 6f 6f 20 4c 6f MSG3 FCC 'Too Long' 6e 67 1241 e64a 04 FCB EOT 1242 e64b 46 75 6c 6c MSG4 FCC 'Full' 1243 e64f 04 FCB EOT 1244 e650 4f 70 2d 20 MSG5 FCC 'Op- ' 1245 e654 04 FCB EOT 1246 e655 72 6f 6d 2d MSG6 FCC 'rom-' 1247 e659 04 FCB EOT 1248 e65a 43 6f 6d 6d 61 6e MSG8 FCC 'Command?' 64 3f 1249 e662 04 FCB EOT 1250 e663 42 61 64 20 61 72 MSG9 FCC 'Bad argument' 67 75 6d 65 6e 74 1251 e66f 04 FCB EOT 1252 e670 4e 6f 20 68 6f 73 MSG10 FCC 'No host port available' 74 20 70 6f 72 74 20 61 76 61 69 6c 61 62 6c 65 1253 e686 04 FCB EOT 1254 e687 64 6f 6e 65 MSG11 FCC 'done' 1255 e68b 04 FCB EOT 1256 e68c 63 68 65 63 6b 73 MSG12 FCC 'checksum error' 75 6d 20 65 72 72 6f 72 1257 e69a 04 FCB EOT 1258 e69b 65 72 72 6f 72 20 MSG13 FCC 'error addr ' 61 64 64 72 20 1259 e6a6 04 FCB EOT 1260 1261 ********** 1262 * break [-][] . . . 1263 * Modifies the breakpoint table. More than 1264 * one argument can be entered on the command 1265 * line but the table will hold only 4 entries. 1266 * 4 types of arguments are implied above: 1267 * break Prints table contents. 1268 * break Inserts . 1269 * break - Deletes . 1270 * break - Clears all entries. 1271 ********** 1272 * while 1 1273 * a = wskip(); 1274 * switch(a) 1275 * case(cr): 1276 * bprint(); return; 1277 1278 e6a7 bd e2 f1 [ 6 ] BREAK JSR WSKIP 1279 e6aa 81 0d [ 2 ] CMPA #$0D 1280 e6ac 26 04 [ 3 ] BNE BRKDEL jump if not cr 1281 e6ae bd e7 42 [ 6 ] JSR BPRINT print table 1282 e6b1 39 [ 5 ] RTS 1283 1284 * case("-"): 1285 * incbuff(); readbuff(); 1286 * if(dchek(a)) /* look for wspac or cr */ 1287 * bpclr(); 1288 * breaksw; 1289 * a = buffarg(); 1290 * if( !dchek(a) ) return(bad argument); 1291 * b = bpsrch(); 1292 * if(b >= 0) 1293 * brktabl[b] = 0; 1294 * breaksw; 1295 1296 e6b2 81 2d [ 2 ] BRKDEL CMPA #'-' 1297 e6b4 26 31 [ 3 ] BNE BRKDEF jump if not - 1298 e6b6 bd e2 e3 [ 6 ] JSR INCBUFF 1299 e6b9 bd e2 dc [ 6 ] JSR READBUFF 1300 e6bc bd e3 0a [ 6 ] JSR DCHEK 1301 e6bf 26 06 [ 3 ] BNE BRKDEL1 jump if not delimeter 1302 e6c1 bd e1 9a [ 6 ] JSR BPCLR clear table 1303 e6c4 7e e6 a7 [ 3 ] JMP BREAK do next argument 1304 e6c7 bd e2 1c [ 6 ] BRKDEL1 JSR BUFFARG get address to delete 1305 e6ca bd e3 0a [ 6 ] JSR DCHEK 1306 e6cd 27 07 [ 3 ] BEQ BRKDEL2 jump if delimeter 1307 e6cf ce e6 63 [ 3 ] LDX #MSG9 "bad argument" 1308 e6d2 bd e4 fa [ 6 ] JSR OUTSTRG 1309 e6d5 39 [ 5 ] RTS 1310 e6d6 bd e7 51 [ 6 ] BRKDEL2 JSR BPSRCH look for addr in table 1311 e6d9 5d [ 2 ] TSTB 1312 e6da 2b 08 [ 3 ] BMI BRKDEL3 jump if not found 1313 e6dc ce 00 96 [ 3 ] LDX #BRKTABL 1314 e6df 3a [ 3 ] ABX 1315 e6e0 6f 00 [ 6 ] CLR 0,X clear entry 1316 e6e2 6f 01 [ 6 ] CLR 1,X 1317 e6e4 7e e6 a7 [ 3 ] BRKDEL3 JMP BREAK do next argument 1318 1319 * default: 1320 * a = buffarg(); 1321 * if( !dchek(a) ) return(bad argument); 1322 * b = bpsrch(); 1323 * if(b < 0) /* not already in table */ 1324 * x = shftreg; 1325 * shftreg = 0; 1326 * a = x[0]; x[0] = $3F 1327 * b = x[0]; x[0] = a; 1328 * if(b != $3F) return(rom); 1329 * b = bpsrch(); /* look for hole */ 1330 * if(b >= 0) return(table full); 1331 * brktabl[b] = x; 1332 * breaksw; 1333 1334 e6e7 bd e2 1c [ 6 ] BRKDEF JSR BUFFARG get argument 1335 e6ea bd e3 0a [ 6 ] JSR DCHEK 1336 e6ed 27 07 [ 3 ] BEQ BRKDEF1 jump if delimiter 1337 e6ef ce e6 63 [ 3 ] LDX #MSG9 "bad argument" 1338 e6f2 bd e4 fa [ 6 ] JSR OUTSTRG 1339 e6f5 39 [ 5 ] RTS 1340 e6f6 bd e7 51 [ 6 ] BRKDEF1 JSR BPSRCH look for entry in table 1341 e6f9 5d [ 2 ] TSTB 1342 e6fa 2c ab [ 3 ] BGE BREAK jump if already in table 1343 e6fc de 94 [ 4 ] LDX SHFTREG x = new entry 1344 e6fe a6 00 [ 4 ] LDAA 0,X 1345 e700 c6 3f [ 2 ] LDAB #SWI 1346 e702 e7 00 [ 4 ] STAB 0,X 1347 e704 e6 00 [ 4 ] LDAB 0,X 1348 e706 a7 00 [ 4 ] STAA 0,X 1349 e708 c1 3f [ 2 ] CMPB #SWI 1350 e70a 27 12 [ 3 ] BEQ BRKDEF2 jump if writes ok 1351 e70c df b2 [ 4 ] STX PTR1 save address 1352 e70e ce e6 55 [ 3 ] LDX #MSG6 "ROM-" 1353 e711 bd e4 fa [ 6 ] JSR OUTSTRG 1354 e714 ce 00 b2 [ 3 ] LDX #PTR1 1355 e717 bd e4 e1 [ 6 ] JSR OUT2BSP print address 1356 e71a bd e7 42 [ 6 ] JSR BPRINT 1357 e71d 39 [ 5 ] RTS 1358 e71e 7f 00 94 [ 6 ] BRKDEF2 CLR SHFTREG 1359 e721 7f 00 95 [ 6 ] CLR SHFTREG+1 1360 e724 3c [ 4 ] PSHX 1361 e725 bd e7 51 [ 6 ] JSR BPSRCH look for 0 entry 1362 e728 38 [ 5 ] PULX 1363 e729 5d [ 2 ] TSTB 1364 e72a 2a 0a [ 3 ] BPL BRKDEF3 jump if table not full 1365 e72c ce e6 4b [ 3 ] LDX #MSG4 "full" 1366 e72f bd e4 fa [ 6 ] JSR OUTSTRG 1367 e732 bd e7 42 [ 6 ] JSR BPRINT 1368 e735 39 [ 5 ] RTS 1369 e736 18 ce 00 96 [ 4 ] BRKDEF3 LDY #BRKTABL 1370 e73a 18 3a [ 4 ] ABY 1371 e73c cd ef 00 [ 6 ] STX 0,Y put new entry in 1372 e73f 7e e6 a7 [ 3 ] JMP BREAK do next argument 1373 1374 ********** 1375 * bprint() - print the contents of the table. 1376 ********** 1377 e742 bd e4 ed [ 6 ] BPRINT JSR OUTCRLF 1378 e745 ce 00 96 [ 3 ] LDX #BRKTABL 1379 e748 c6 04 [ 2 ] LDAB #4 1380 e74a bd e4 e1 [ 6 ] BPRINT1 JSR OUT2BSP 1381 e74d 5a [ 2 ] DECB 1382 e74e 2e fa [ 3 ] BGT BPRINT1 loop 4 times 1383 e750 39 [ 5 ] RTS 1384 1385 ********** 1386 * bpsrch() - search table for address in 1387 * shftreg. Returns b = index to entry or 1388 * b = -1 if not found. 1389 ********** 1390 *for(b=0; b=6; b=+2) 1391 * x[] = brktabl + b; 1392 * if(x[0] = shftreg) 1393 * return(b); 1394 *return(-1); 1395 1396 e751 5f [ 2 ] BPSRCH CLRB 1397 e752 ce 00 96 [ 3 ] BPSRCH1 LDX #BRKTABL 1398 e755 3a [ 3 ] ABX 1399 e756 ee 00 [ 5 ] LDX 0,X get table entry 1400 e758 9c 94 [ 5 ] CPX SHFTREG 1401 e75a 26 01 [ 3 ] BNE BPSRCH2 jump if no match 1402 e75c 39 [ 5 ] RTS 1403 e75d 5c [ 2 ] BPSRCH2 INCB 1404 e75e 5c [ 2 ] INCB 1405 e75f c1 06 [ 2 ] CMPB #$6 1406 e761 2f ef [ 3 ] BLE BPSRCH1 loop 4 times 1407 e763 c6 ff [ 2 ] LDAB #$FF 1408 e765 39 [ 5 ] RTS 1409 1410 1411 ********** 1412 * bulk - Bulk erase the eeprom except the 1413 * config register. 1414 ********** 1415 e766 7f 00 c1 [ 6 ] BULK CLR TMP2 1416 e769 20 06 [ 3 ] BRA BULK1 1417 1418 ********** 1419 * bulkall - Bulk erase the eeprom and the 1420 * config register. 1421 ********** 1422 e76b 7f 00 c1 [ 6 ] BULKALL CLR TMP2 1423 e76e 7c 00 c1 [ 6 ] INC TMP2 1424 1425 *Set up PPROG register for erase 1426 e771 36 [ 3 ] BULK1 PSHA 1427 e772 86 06 [ 2 ] LDAA #$06 1428 e774 b7 10 3b [ 4 ] STAA PPROG set eelat, erase bits 1429 1430 *If (EE only) write to $b600 1431 *Else write to config register 1432 e777 86 ff [ 2 ] LDAA #$FF 1433 e779 7d 00 c1 [ 6 ] TST TMP2 1434 e77c 26 05 [ 3 ] BNE BULK2 jump if config 1435 e77e b7 b6 00 [ 4 ] STAA $B600 write to $b600 1436 e781 20 03 [ 3 ] BRA BULK3 1437 e783 b7 10 3f [ 4 ] BULK2 STAA CONFIG 1438 e786 BULK3 EQU * 1439 1440 *Start erasing 1441 e786 86 07 [ 2 ] LDAA #$07 1442 e788 26 01 [ 3 ] BNE ACL3 1443 e78a 4f [ 2 ] CLRA fail safe 1444 e78b b7 10 3b [ 4 ] ACL3 STAA PPROG 1445 1446 *Delay for 10 ms at E = 2 MHz 1447 e78e 3c [ 4 ] PSHX 1448 e78f ce 0d 06 [ 3 ] LDX #$0D06 6~ * 3334 = 20,004 * 0.5 MHz 1449 e792 09 [ 3 ] BULKDLY DEX 2~ 1450 e793 26 fd [ 3 ] BNE BULKDLY 3~ 1451 e795 38 [ 5 ] PULX 1452 1453 *Stop programming 1454 e796 7f 10 3b [ 6 ] CLR PPROG 1455 e799 32 [ 4 ] PULA 1456 e79a 39 [ 5 ] RTS 1457 1458 ********** 1459 * dump [ []] - Dump memory 1460 * in 16 byte lines from to . 1461 * Default starting address is "current 1462 * location" and default number of lines is 8. 1463 ********** 1464 *ptr1 = ptrmem; /* default start address */ 1465 *ptr2 = ptr1 + $80; /* default end address */ 1466 *a = wskip(); 1467 *if(a != cr) 1468 * a = buffarg(); 1469 * if(countu1 = 0) return(bad argument); 1470 * if( !dchek(a) ) return(bad argument); 1471 * ptr1 = shftreg; 1472 * ptr2 = ptr1 + $80; /* default end address */ 1473 * a = wskip(); 1474 * if(a != cr) 1475 * a = buffarg(); 1476 * if(countu1 = 0) return(bad argument); 1477 * a = wskip(); 1478 * if(a != cr) return(bad argument); 1479 * ptr2 = shftreg; 1480 1481 e79b de ae [ 4 ] DUMP LDX PTRMEM current location 1482 e79d df b2 [ 4 ] STX PTR1 default start 1483 e79f c6 80 [ 2 ] LDAB #$80 1484 e7a1 3a [ 3 ] ABX 1485 e7a2 df b4 [ 4 ] STX PTR2 default end 1486 e7a4 bd e2 f1 [ 6 ] JSR WSKIP 1487 e7a7 81 0d [ 2 ] CMPA #$D 1488 e7a9 27 39 [ 3 ] BEQ DUMP1 jump - no arguments 1489 e7ab bd e2 1c [ 6 ] JSR BUFFARG read argument 1490 e7ae 7d 00 ad [ 6 ] TST COUNT 1491 e7b1 27 2a [ 3 ] BEQ DUMPERR jump if no argument 1492 e7b3 bd e3 0a [ 6 ] JSR DCHEK 1493 e7b6 26 25 [ 3 ] BNE DUMPERR jump if delimiter 1494 e7b8 de 94 [ 4 ] LDX SHFTREG 1495 e7ba df b2 [ 4 ] STX PTR1 1496 e7bc c6 80 [ 2 ] LDAB #$80 1497 e7be 3a [ 3 ] ABX 1498 e7bf df b4 [ 4 ] STX PTR2 default end address 1499 e7c1 bd e2 f1 [ 6 ] JSR WSKIP 1500 e7c4 81 0d [ 2 ] CMPA #$D 1501 e7c6 27 1c [ 3 ] BEQ DUMP1 jump - 1 argument 1502 e7c8 bd e2 1c [ 6 ] JSR BUFFARG read argument 1503 e7cb 7d 00 ad [ 6 ] TST COUNT 1504 e7ce 27 0d [ 3 ] BEQ DUMPERR jump if no argument 1505 e7d0 bd e2 f1 [ 6 ] JSR WSKIP 1506 e7d3 81 0d [ 2 ] CMPA #$0D 1507 e7d5 26 06 [ 3 ] BNE DUMPERR jump if not cr 1508 e7d7 de 94 [ 4 ] LDX SHFTREG 1509 e7d9 df b4 [ 4 ] STX PTR2 1510 e7db 20 07 [ 3 ] BRA DUMP1 jump - 2 arguments 1511 e7dd ce e6 63 [ 3 ] DUMPERR LDX #MSG9 "bad argument" 1512 e7e0 bd e4 fa [ 6 ] JSR OUTSTRG 1513 e7e3 39 [ 5 ] RTS 1514 1515 *ptrmem = ptr1; 1516 *ptr1 = ptr1 & $fff0; 1517 1518 e7e4 dc b2 [ 4 ] DUMP1 LDD PTR1 1519 e7e6 dd ae [ 4 ] STD PTRMEM new current location 1520 e7e8 c4 f0 [ 2 ] ANDB #$F0 1521 e7ea dd b2 [ 4 ] STD PTR1 start dump at 16 byte boundary 1522 1523 *** dump loop starts here *** 1524 *do: 1525 * output address of first byte; 1526 1527 e7ec bd e4 ed [ 6 ] DUMPLP JSR OUTCRLF 1528 e7ef ce 00 b2 [ 3 ] LDX #PTR1 1529 e7f2 bd e4 e1 [ 6 ] JSR OUT2BSP first address 1530 1531 * x = ptr1; 1532 * for(b=0; b=16; b++) 1533 * output contents; 1534 1535 e7f5 de b2 [ 4 ] LDX PTR1 base address 1536 e7f7 5f [ 2 ] CLRB loop counter 1537 e7f8 bd e4 e4 [ 6 ] DUMPDAT JSR OUT1BSP hex value loop 1538 e7fb 5c [ 2 ] INCB 1539 e7fc c1 10 [ 2 ] CMPB #$10 1540 e7fe 2d f8 [ 3 ] BLT DUMPDAT loop 16 times 1541 1542 * x = ptr1; 1543 * for(b=0; b=16; b++) 1544 * a = x[b]; 1545 * if($7A < a < $20) a = $20; 1546 * output ascii contents; 1547 1548 e800 5f [ 2 ] CLRB loop counter 1549 e801 de b2 [ 4 ] DUMPASC LDX PTR1 base address 1550 e803 3a [ 3 ] ABX 1551 e804 a6 00 [ 4 ] LDAA ,X ascii value loop 1552 e806 81 20 [ 2 ] CMPA #$20 1553 e808 25 04 [ 3 ] BLO DUMP3 jump if non printable 1554 e80a 81 7a [ 2 ] CMPA #$7A 1555 e80c 23 02 [ 3 ] BLS DUMP4 jump if printable 1556 e80e 86 20 [ 2 ] DUMP3 LDAA #$20 space for non printables 1557 e810 bd e3 b3 [ 6 ] DUMP4 JSR OUTPUT output ascii value 1558 e813 5c [ 2 ] INCB 1559 e814 c1 10 [ 2 ] CMPB #$10 1560 e816 2d e9 [ 3 ] BLT DUMPASC loop 16 times 1561 1562 * chkabrt(); 1563 * ptr1 = ptr1 + $10; 1564 *while(ptr1 <= ptr2); 1565 *return; 1566 1567 e818 bd e3 12 [ 6 ] JSR CHKABRT check abort or wait 1568 e81b dc b2 [ 4 ] LDD PTR1 1569 e81d c3 00 10 [ 4 ] ADDD #$10 point to next 16 byte bound 1570 e820 dd b2 [ 4 ] STD PTR1 update ptr1 1571 e822 1a 93 b4 [ 6 ] CPD PTR2 1572 e825 22 0e [ 3 ] BHI DUMP5 quit if ptr1 > ptr2 1573 e827 1a 83 00 00 [ 5 ] CPD #$00 check wraparound at $ffff 1574 e82b 26 bf [ 3 ] BNE DUMPLP jump - no wraparound 1575 e82d dc b4 [ 4 ] LDD PTR2 1576 e82f 1a 83 ff f0 [ 5 ] CPD #$FFF0 1577 e833 25 b7 [ 3 ] BLO DUMPLP upper bound not at top 1578 e835 39 [ 5 ] DUMP5 RTS quit 1579 1580 ********** 1581 * fill [] - Block fill 1582 *memory from addr1 to addr2 with data. Data 1583 *defaults to $FF. 1584 ********** 1585 *get addr1 and addr2 1586 1587 e836 FILL EQU * 1588 e836 bd e2 f1 [ 6 ] JSR WSKIP 1589 e839 bd e2 1c [ 6 ] JSR BUFFARG 1590 e83c 7d 00 ad [ 6 ] TST COUNT 1591 e83f 27 52 [ 3 ] BEQ FILLERR jump if no argument 1592 e841 bd e2 ff [ 6 ] JSR WCHEK 1593 e844 26 4d [ 3 ] BNE FILLERR jump if bad argument 1594 e846 de 94 [ 4 ] LDX SHFTREG 1595 e848 df b2 [ 4 ] STX PTR1 address1 1596 e84a bd e2 f1 [ 6 ] JSR WSKIP 1597 e84d bd e2 1c [ 6 ] JSR BUFFARG 1598 e850 7d 00 ad [ 6 ] TST COUNT 1599 e853 27 3e [ 3 ] BEQ FILLERR jump if no argument 1600 e855 bd e3 0a [ 6 ] JSR DCHEK 1601 e858 26 39 [ 3 ] BNE FILLERR jump if bad argument 1602 e85a de 94 [ 4 ] LDX SHFTREG 1603 e85c df b4 [ 4 ] STX PTR2 address2 1604 1605 *Get data if it exists 1606 e85e 86 ff [ 2 ] LDAA #$FF 1607 e860 97 c1 [ 3 ] STAA TMP2 default data 1608 e862 bd e2 f1 [ 6 ] JSR WSKIP 1609 e865 81 0d [ 2 ] CMPA #$0D 1610 e867 27 13 [ 3 ] BEQ FILL1 jump if default data 1611 e869 bd e2 1c [ 6 ] JSR BUFFARG 1612 e86c 7d 00 ad [ 6 ] TST COUNT 1613 e86f 27 22 [ 3 ] BEQ FILLERR jump if no argument 1614 e871 bd e2 f1 [ 6 ] JSR WSKIP 1615 e874 81 0d [ 2 ] CMPA #$0D 1616 e876 26 1b [ 3 ] BNE FILLERR jump if bad argument 1617 e878 96 95 [ 3 ] LDAA SHFTREG+1 1618 e87a 97 c1 [ 3 ] STAA TMP2 1619 1620 *while(ptr1 <= ptr2) 1621 * *ptr1 = data 1622 * if(*ptr1 != data) abort 1623 1624 e87c FILL1 EQU * 1625 e87c bd e3 12 [ 6 ] JSR CHKABRT check for abort 1626 e87f de b2 [ 4 ] LDX PTR1 starting address 1627 e881 96 c1 [ 3 ] LDAA TMP2 data 1628 e883 a7 00 [ 4 ] STAA 0,X 1629 e885 a1 00 [ 4 ] CMPA 0,X 1630 e887 26 11 [ 3 ] BNE FILLBAD jump if no write 1631 e889 9c b4 [ 5 ] CPX PTR2 1632 e88b 27 05 [ 3 ] BEQ FILL2 quit yet? 1633 e88d 08 [ 3 ] INX 1634 e88e df b2 [ 4 ] STX PTR1 1635 e890 20 ea [ 3 ] BRA FILL1 loop 1636 e892 39 [ 5 ] FILL2 RTS 1637 1638 e893 ce e6 63 [ 3 ] FILLERR LDX #MSG9 "bad argument" 1639 e896 bd e4 fa [ 6 ] JSR OUTSTRG 1640 e899 39 [ 5 ] RTS 1641 1642 e89a ce e6 55 [ 3 ] FILLBAD LDX #MSG6 "rom -" 1643 e89d bd e4 fa [ 6 ] JSR OUTSTRG 1644 e8a0 ce 00 b2 [ 3 ] LDX #PTR1 1645 e8a3 bd e4 e1 [ 6 ] JSR OUT2BSP 1646 e8a6 39 [ 5 ] RTS 1647 1648 ********** 1649 * call [] - Execute a jsr to addr or 1650 *user's pc value. Return to monitor by rts 1651 *or breakpoint. 1652 ********** 1653 *a = wskip(); 1654 *if(a != cr) 1655 * a = buffarg(); 1656 * a = wskip(); 1657 * if(a != cr) return(bad argument) 1658 * pc = shftreg; 1659 1660 e8a7 bd e2 f1 [ 6 ] CALL JSR WSKIP 1661 e8aa 81 0d [ 2 ] CMPA #$D 1662 e8ac 27 15 [ 3 ] BEQ CALL3 jump if no arg 1663 e8ae bd e2 1c [ 6 ] JSR BUFFARG 1664 e8b1 bd e2 f1 [ 6 ] JSR WSKIP 1665 e8b4 81 0d [ 2 ] CMPA #$D 1666 e8b6 27 07 [ 3 ] BEQ CALL2 jump if cr 1667 e8b8 ce e6 63 [ 3 ] LDX #MSG9 "bad argument" 1668 e8bb bd e4 fa [ 6 ] JSR OUTSTRG 1669 e8be 39 [ 5 ] RTS 1670 e8bf de 94 [ 4 ] CALL2 LDX SHFTREG 1671 e8c1 df 9e [ 4 ] STX REGS pc = 1672 1673 *user_stack[0] = return_to_monitor; 1674 *setbps(); 1675 *restack(); /* restack and go*/ 1676 1677 e8c3 de a7 [ 4 ] CALL3 LDX SP 1678 e8c5 09 [ 3 ] DEX user stack pointer 1679 e8c6 cc e8 d7 [ 3 ] LDD #RETURN return address 1680 e8c9 ed 00 [ 5 ] STD 0,X 1681 e8cb 09 [ 3 ] DEX 1682 e8cc df a7 [ 4 ] STX SP new user stack pointer 1683 e8ce bd e9 e1 [ 6 ] JSR SETBPS 1684 e8d1 7f 00 c1 [ 6 ] CLR TMP2 flag for breakpoints 1685 e8d4 7e ea 2c [ 3 ] JMP RESTACK executes an rti 1686 1687 ********** 1688 * return() - Return here from rts after 1689 *call command. 1690 ********** 1691 e8d7 36 [ 3 ] RETURN PSHA save a register 1692 e8d8 07 [ 2 ] TPA 1693 e8d9 97 a6 [ 3 ] STAA REGS+8 cc register 1694 e8db 32 [ 4 ] PULA 1695 e8dc dd a4 [ 4 ] STD REGS+6 a and b registers 1696 e8de df a2 [ 4 ] STX REGS+4 x register 1697 e8e0 18 df a0 [ 5 ] STY REGS+2 y register 1698 e8e3 9f a7 [ 4 ] STS SP user stack pointer 1699 e8e5 8e 00 68 [ 3 ] LDS #STACK monitor stack pointer 1700 e8e8 bd ea 0d [ 6 ] JSR REMBPS remove breakpoints 1701 e8eb bd e4 ed [ 6 ] JSR OUTCRLF 1702 e8ee bd e1 db [ 6 ] JSR RPRINT print user registers 1703 e8f1 7e e0 b2 [ 3 ] JMP MAIN 1704 1705 ********** 1706 * go [] - Execute starting at or 1707 *user's pc value. Executes an rti to user code. 1708 *Returns to monitor via an swi through swiin. 1709 ********** 1710 *a = wskip(); 1711 *if(a != cr) 1712 * a = buffarg(); 1713 * a = wskip(); 1714 * if(a != cr) return(bad argument) 1715 * pc = shftreg; 1716 *setbps(); 1717 *restack(); /* restack and go*/ 1718 1719 e8f4 bd e2 f1 [ 6 ] GO JSR WSKIP 1720 e8f7 81 0d [ 2 ] CMPA #$0D 1721 e8f9 27 15 [ 3 ] BEQ GO2 jump if no arg 1722 e8fb bd e2 1c [ 6 ] JSR BUFFARG 1723 e8fe bd e2 f1 [ 6 ] JSR WSKIP 1724 e901 81 0d [ 2 ] CMPA #$0D 1725 e903 27 07 [ 3 ] BEQ GO1 jump if cr 1726 e905 ce e6 63 [ 3 ] LDX #MSG9 "bad argument" 1727 e908 bd e4 fa [ 6 ] JSR OUTSTRG 1728 e90b 39 [ 5 ] RTS 1729 e90c de 94 [ 4 ] GO1 LDX SHFTREG 1730 e90e df 9e [ 4 ] STX REGS pc = 1731 e910 7f 00 c1 [ 6 ] GO2 CLR TMP2 flag for breakpoints 1732 e913 7c 00 c1 [ 6 ] INC TMP2 (1=go, 0=call) 1733 e916 bd e9 e1 [ 6 ] JSR SETBPS 1734 e919 7e ea 2c [ 3 ] JMP RESTACK execute an rti 1735 1736 ********** 1737 * swiin() - return from SWI. Set up 1738 *stack pointers, save user registers, and 1739 *return to main. 1740 ********** 1741 e91c 30 [ 3 ] SWIIN TSX swi entry point 1742 e91d 8e 00 68 [ 3 ] LDS #STACK 1743 e920 bd ea 45 [ 6 ] JSR SAVSTACK save user regs 1744 e923 de 9e [ 4 ] LDX REGS 1745 e925 09 [ 3 ] DEX 1746 e926 df 9e [ 4 ] STX REGS save user pc 1747 e928 de b8 [ 4 ] LDX PTR4 restore user swi vector 1748 e92a df f5 [ 4 ] STX JSWI+1 1749 1750 *if(flagt1 = 0) remove return addr from stack; 1751 1752 e92c 7d 00 c1 [ 6 ] TST TMP2 0=call, 1=go 1753 e92f 26 06 [ 3 ] BNE GO3 jump if go command 1754 e931 de a7 [ 4 ] LDX SP remove return address 1755 e933 08 [ 3 ] INX 1756 e934 08 [ 3 ] INX 1757 e935 df a7 [ 4 ] STX SP 1758 e937 bd e4 ed [ 6 ] GO3 JSR OUTCRLF print register values 1759 e93a bd e1 db [ 6 ] JSR RPRINT 1760 e93d bd ea 0d [ 6 ] JSR REMBPS 1761 e940 7e e0 b2 [ 3 ] JMP MAIN return to monitor 1762 * (sp destroyed above) 1763 1764 ********** 1765 * proceed - Same as go except it ignores 1766 *a breakpoint at the first opcode. Calls 1767 *trace once and the go. 1768 ********** 1769 e943 7f 00 c1 [ 6 ] PROCEED CLR TMP2 flag for breakpoints 1770 e946 7c 00 c1 [ 6 ] INC TMP2 0=trace, 1=proceed 1771 e949 7e e9 7f [ 3 ] JMP TRACE3 1772 1773 ********** 1774 * trace - Trace n instructions starting 1775 *at user's pc value. n is a hex number less than 1776 *$FF (defaults to 1). 1777 ********** 1778 *countt1 = 1 1779 *a = wskip(); 1780 *if(a != cr) 1781 * a = buffarg(); a = wskip(); 1782 * if(a != cr) return(bad argument); 1783 * countt1 = n 1784 1785 e94c 7f 00 c3 [ 6 ] TRACE CLR TMP4 1786 e94f 7c 00 c3 [ 6 ] INC TMP4 default countt1 = 1 1787 e952 7f 00 c1 [ 6 ] CLR TMP2 0 = trace 1788 e955 bd e2 f1 [ 6 ] JSR WSKIP 1789 e958 81 0d [ 2 ] CMPA #$0D 1790 e95a 27 15 [ 3 ] BEQ TRACE2 jump if cr 1791 e95c bd e2 1c [ 6 ] JSR BUFFARG 1792 e95f bd e2 f1 [ 6 ] JSR WSKIP 1793 e962 81 0d [ 2 ] CMPA #$0D 1794 e964 27 07 [ 3 ] BEQ TRACE1 jump if cr 1795 e966 ce e6 63 [ 3 ] LDX #MSG9 "bad argument" 1796 e969 bd e4 fa [ 6 ] JSR OUTSTRG 1797 e96c 39 [ 5 ] RTS 1798 e96d 96 95 [ 3 ] TRACE1 LDAA SHFTREG+1 n 1799 e96f 97 c3 [ 3 ] STAA TMP4 1800 1801 *Print opcode 1802 e971 bd e4 ed [ 6 ] TRACE2 JSR OUTCRLF 1803 e974 ce e6 50 [ 3 ] LDX #MSG5 "op-" 1804 e977 bd e4 fa [ 6 ] JSR OUTSTRG 1805 e97a de 9e [ 4 ] LDX REGS 1806 e97c bd e4 e4 [ 6 ] JSR OUT1BSP opcode 1807 1808 *Save user OC5 regs, setup monitor OC5 regs 1809 e97f b6 10 20 [ 4 ] TRACE3 LDAA TCTL1 1810 e982 97 b4 [ 3 ] STAA PTR2 save user mode/level 1811 e984 84 fc [ 2 ] ANDA #$FC 1812 e986 b7 10 20 [ 4 ] STAA TCTL1 disable oc5 output 1813 e989 b6 10 22 [ 4 ] LDAA TMSK1 1814 e98c 97 b5 [ 3 ] STAA PTR2+1 save user int masks 1815 e98e 7f 10 24 [ 6 ] CLR TMSK2 disable tof and pac ints 1816 1817 *Put monitor TOC5 vector into jump table 1818 e991 de d4 [ 4 ] LDX JTOC5+1 1819 e993 df b8 [ 4 ] STX PTR4 save user's vector 1820 e995 86 7e [ 2 ] LDAA #$7E jmp opcode 1821 e997 97 d3 [ 3 ] STAA JTOC5 1822 e999 ce e9 b9 [ 3 ] LDX #TRACEIN 1823 e99c df d4 [ 4 ] STX JTOC5+1 monitor toc5 vector 1824 1825 *Unmask i bit in user ccr 1826 e99e 96 a6 [ 3 ] LDAA REGS+8 user ccr 1827 e9a0 84 ef [ 2 ] ANDA #$EF clear i bit 1828 e9a2 97 a6 [ 3 ] STAA REGS+8 1829 1830 *Arm OC5 interrupt 1831 e9a4 c6 57 [ 2 ] LDAB #87 cycles to end of rti 1832 e9a6 fe 10 0e [ 5 ] LDX TCNT timer count value 1833 e9a9 3a [ 3 ] ABX 3~ ) 1834 e9aa ff 10 1e [ 5 ] STX TOC5 oc5 match register 5~ ) 1835 e9ad 86 08 [ 2 ] LDAA #$08 2~ ) 1836 e9af b7 10 23 [ 4 ] STAA TFLG1 clear oc5 int flag 4~ ) 86~ 1837 e9b2 b7 10 22 [ 4 ] STAA TMSK1 enable oc5 interrupt 4~ ) 1838 e9b5 0e [ 2 ] CLI 2~ ) 1839 e9b6 7e ea 2c [ 3 ] JMP RESTACK execute an rti 66~ ) 1840 1841 ********** 1842 * tracein - return from toc5 interrupt. 1843 ********** 1844 *Disable toc5 interrupt 1845 *replace user's toc5 vector 1846 e9b9 0f [ 2 ] TRACEIN SEI 1847 e9ba 7f 10 22 [ 6 ] CLR TMSK1 disable timer ints 1848 e9bd 30 [ 3 ] TSX 1849 e9be 8e 00 68 [ 3 ] LDS #STACK 1850 e9c1 bd ea 45 [ 6 ] JSR SAVSTACK save user regs 1851 e9c4 de b8 [ 4 ] LDX PTR4 1852 e9c6 df d4 [ 4 ] STX JTOC5+1 1853 e9c8 bd e3 12 [ 6 ] JSR CHKABRT check for abort 1854 1855 *if(flagt1 = 1) jump to GO command ( proceed ) 1856 e9cb 7d 00 c1 [ 6 ] TST TMP2 1857 e9ce 27 03 [ 3 ] BEQ TRACE9 jump if trace command 1858 e9d0 7e e9 10 [ 3 ] JMP GO2 1859 1860 *rprint(); 1861 *while(countt1 >= 0) continue trace; 1862 1863 e9d3 bd e4 ed [ 6 ] TRACE9 JSR OUTCRLF print registers for 1864 e9d6 bd e1 db [ 6 ] JSR RPRINT trace only. 1865 e9d9 7a 00 c3 [ 6 ] DEC TMP4 1866 e9dc 22 93 [ 3 ] BHI TRACE2 jump if countt1 >= 0 1867 e9de 7e e0 b2 [ 3 ] JMP MAIN return to monitor 1868 * (sp destroyed above) 1869 1870 ********** 1871 * setbps - Replace user code with swi's at 1872 *breakpoint addresses. 1873 ********** 1874 *for(b=0; b=6; b =+ 2) 1875 * x = brktabl[b]; 1876 * if(x != 0) 1877 * optabl[b] = x[0]; 1878 * x[0] = $3F; 1879 1880 e9e1 5f [ 2 ] SETBPS CLRB 1881 e9e2 ce 00 96 [ 3 ] SETBPS1 LDX #BRKTABL 1882 e9e5 18 ce 00 bc [ 4 ] LDY #PTR6 1883 e9e9 3a [ 3 ] ABX 1884 e9ea 18 3a [ 4 ] ABY 1885 e9ec ee 00 [ 5 ] LDX 0,X breakpoint table entry 1886 e9ee 27 09 [ 3 ] BEQ SETBPS2 jump if 0 1887 e9f0 a6 00 [ 4 ] LDAA 0,X save user opcode 1888 e9f2 18 a7 00 [ 5 ] STAA 0,Y 1889 e9f5 86 3f [ 2 ] LDAA #SWI insert swi into code 1890 e9f7 a7 00 [ 4 ] STAA 0,X 1891 e9f9 cb 02 [ 2 ] SETBPS2 ADDB #$2 1892 e9fb c1 06 [ 2 ] CMPB #$6 1893 e9fd 2f e3 [ 3 ] BLE SETBPS1 loop 4 times 1894 1895 *Put monitor SWI vector into jump table 1896 e9ff de f5 [ 4 ] LDX JSWI+1 1897 ea01 df b8 [ 4 ] STX PTR4 save user swi vector 1898 ea03 86 7e [ 2 ] LDAA #$7E jmp opcode 1899 ea05 97 f4 [ 3 ] STAA JSWI 1900 ea07 ce e9 1c [ 3 ] LDX #SWIIN 1901 ea0a df f5 [ 4 ] STX JSWI+1 monitor swi vector 1902 ea0c 39 [ 5 ] RTS 1903 1904 ********** 1905 * rembps - Remove breakpoints from user code. 1906 ********** 1907 *for(b=0; b=6; b =+ 2) 1908 * x = brktabl[b]; 1909 * if(x != 0) 1910 * x[0] = optabl[b]; 1911 1912 ea0d 5f [ 2 ] REMBPS CLRB 1913 ea0e ce 00 96 [ 3 ] REMBPS1 LDX #BRKTABL 1914 ea11 18 ce 00 bc [ 4 ] LDY #PTR6 1915 ea15 3a [ 3 ] ABX 1916 ea16 18 3a [ 4 ] ABY 1917 ea18 ee 00 [ 5 ] LDX 0,X breakpoint table entry 1918 ea1a 27 05 [ 3 ] BEQ REMBPS2 jump if 0 1919 ea1c 18 a6 00 [ 5 ] LDAA 0,Y restore user's opcode 1920 ea1f a7 00 [ 4 ] STAA 0,X 1921 ea21 cb 02 [ 2 ] REMBPS2 ADDB #$2 1922 ea23 c1 06 [ 2 ] CMPB #$6 1923 ea25 2f e7 [ 3 ] BLE REMBPS1 loop 4 times 1924 1925 *Replace user's SWI vector 1926 ea27 de b8 [ 4 ] LDX PTR4 1927 ea29 df f5 [ 4 ] STX JSWI+1 1928 ea2b 39 [ 5 ] RTS 1929 1930 ********** 1931 * restack() - Restore user stack and 1932 *execute an RTI. Extended addressing forced 1933 *to ensure count value for trace. 1934 ********** 1935 ea2c be 00 a7 [ 5 ] RESTACK LDS >SP stack pointer 1936 ea2f fe 00 9e [ 5 ] LDX >REGS 1937 ea32 3c [ 4 ] PSHX pc 1938 ea33 fe 00 a0 [ 5 ] LDX >REGS+2 1939 ea36 3c [ 4 ] PSHX y 1940 ea37 fe 00 a2 [ 5 ] LDX >REGS+4 1941 ea3a 3c [ 4 ] PSHX x 1942 ea3b fc 00 a4 [ 5 ] LDD >REGS+6 1943 ea3e 36 [ 3 ] PSHA a 1944 ea3f 37 [ 3 ] PSHB b 1945 ea40 b6 00 a6 [ 4 ] LDAA >REGS+8 1946 ea43 36 [ 3 ] PSHA ccr 1947 ea44 3b [12 ] RESTACK1 RTI 1948 1949 ********** 1950 * savstack() - Save user's registers. 1951 ********** 1952 ea45 a6 00 [ 4 ] SAVSTACK LDAA 0,X 1953 ea47 97 a6 [ 3 ] STAA REGS+8 ccr 1954 ea49 ec 01 [ 5 ] LDD 1,X 1955 ea4b 97 a5 [ 3 ] STAA REGS+7 b 1956 ea4d d7 a4 [ 3 ] STAB REGS+6 a 1957 ea4f ec 03 [ 5 ] LDD 3,X 1958 ea51 dd a2 [ 4 ] STD REGS+4 x 1959 ea53 ec 05 [ 5 ] LDD 5,X 1960 ea55 dd a0 [ 4 ] STD REGS+2 y 1961 ea57 ec 07 [ 5 ] LDD 7,X 1962 ea59 dd 9e [ 4 ] STD REGS pc 1963 ea5b c6 08 [ 2 ] LDAB #8 1964 ea5d 3a [ 3 ] ABX 1965 ea5e df a7 [ 4 ] STX SP stack pointer 1966 ea60 39 [ 5 ] RTS 1967 1968 ********** 1969 * help - List buffalo commands to terminal. 1970 ********** 1971 ea61 HELP EQU * 1972 ea61 ce ea 68 [ 3 ] LDX #HELPMSG1 1973 ea64 bd e4 fa [ 6 ] JSR OUTSTRG print help screen 1974 ea67 39 [ 5 ] RTS 1975 1976 ea68 HELPMSG1 EQU * 1977 ea68 41 53 4d 20 5b 3c FCC 'ASM [] Line assembler/disassembler.' 61 64 64 72 3e 5d 20 20 4c 69 6e 65 20 61 73 73 65 6d 62 6c 65 72 2f 64 69 73 61 73 73 65 6d 62 6c 65 72 2e 1978 ea92 0d FCB #$0D 1979 ea93 20 20 20 20 2f 20 FCC ' / Do same address. ^ Do previous address.' 20 20 20 20 20 20 20 44 6f 20 73 61 6d 65 20 61 64 64 72 65 73 73 2e 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 20 20 20 20 20 20 44 6f 20 70 72 65 76 69 6f 75 73 20 61 64 64 1980 ead8 0d FCB #$0D 1981 ead9 20 20 20 20 43 54 FCC ' CTRL-J Do next address. RETURN Do next opcode.' 52 4c 2d 4a 20 20 20 44 6f 20 6e 65 78 74 20 61 64 64 72 65 73 73 2e 20 20 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 20 20 20 44 6f 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e 1982 eb19 0d FCB #$0D 1983 eb1a 20 20 20 20 43 54 FCC ' CTRL-A Quit.' 52 4c 2d 41 20 20 20 51 75 69 74 2e 1984 eb2c 0d FCB #$0D 1985 eb2d 42 46 20 3c 61 64 FCC 'BF [] Block fill.' 64 72 31 3e 20 3c 61 64 64 72 32 3e 20 5b 3c 64 61 74 61 3e 5d 20 20 42 6c 6f 63 6b 20 66 69 6c 6c 2e 1986 eb55 0d FCB #$0D 1987 eb56 42 52 20 5b 2d 5d FCC 'BR [-][] Set up breakpoint table.' 5b 3c 61 64 64 72 3e 5d 20 20 53 65 74 20 75 70 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 61 62 6c 65 2e 1988 eb7e 0d FCB #$0D 1989 eb7f 42 55 4c 4b 20 20 FCC 'BULK Erase the EEPROM. BULKALL Erase EEPROM and CONFIG.' 45 72 61 73 65 20 74 68 65 20 45 45 50 52 4f 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42 55 4c 4b 41 4c 4c 20 20 45 72 61 73 65 20 45 45 50 52 4f 4d 20 1990 ebca 0d FCB #$0D 1991 ebcb 43 41 4c 4c 20 5b FCC 'CALL [] Call user subroutine. G [] Execute user code.' 3c 61 64 64 72 3e 5d 20 20 43 61 6c 6c 20 75 73 65 72 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 20 20 20 20 47 20 5b 3c 61 64 64 72 3e 5d 20 20 45 78 65 63 75 74 65 20 75 73 1992 ec13 0d FCB #$0D 1993 ec14 4c 4f 41 44 2c 20 FCC 'LOAD, VERIFY [T] Load or verify S-records.' 56 45 52 49 46 59 20 5b 54 5d 20 3c 68 6f 73 74 20 64 6f 77 6e 6c 6f 61 64 20 63 6f 6d 6d 61 6e 64 3e 20 20 4c 6f 61 64 20 6f 72 20 76 65 72 69 66 79 20 53 2d 72 65 63 6f 72 1994 ec57 0d FCB #$0D 1995 ec58 4d 44 20 5b 3c 61 FCC 'MD [ []] Memory dump.' 64 64 72 31 3e 20 5b 3c 61 64 64 72 32 3e 5d 5d 20 20 4d 65 6d 6f 72 79 20 64 75 6d 70 2e 1996 ec7c 0d FCB #$0D 1997 ec7d 4d 4d 20 5b 3c 61 FCC 'MM [] Memory modify.' 64 64 72 3e 5d 20 20 4d 65 6d 6f 72 79 20 6d 6f 64 69 66 79 2e 1998 ec98 0d FCB #$0D 1999 ec99 20 20 20 20 2f 20 FCC ' / Open same address. CTRL-H or ^ Open previous address.' 20 20 20 20 20 20 20 4f 70 65 6e 20 73 61 6d 65 20 61 64 64 72 65 73 73 2e 20 20 20 20 20 20 20 20 20 43 54 52 4c 2d 48 20 6f 72 20 5e 20 20 20 4f 70 65 6e 20 70 72 65 76 69 2000 ece5 0d FCB #$0D 2001 ece6 20 20 20 20 43 54 FCC ' CTRL-J Open next address. SPACE Open next address.' 52 4c 2d 4a 20 20 20 4f 70 65 6e 20 6e 65 78 74 20 61 64 64 72 65 73 73 2e 20 20 20 20 20 20 20 20 20 53 50 41 43 45 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20 6e 65 78 74 20 2002 ed2e 0d FCB #$0D 2003 ed2f 20 20 20 20 52 45 FCC ' RETURN Quit. O Compute offset to .' 54 55 52 4e 20 20 20 51 75 69 74 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 61 64 64 72 3e 4f 20 20 20 20 20 20 20 43 6f 6d 70 75 74 65 20 6f 66 2004 ed7e 0d FCB #$0D 2005 ed7f 4d 4f 56 45 20 3c FCC 'MOVE [] Block move.' 73 31 3e 20 3c 73 32 3e 20 5b 3c 64 3e 5d 20 20 42 6c 6f 63 6b 20 6d 6f 76 65 2e 2006 eda0 0d FCB #$0D 2007 eda1 50 20 20 50 72 6f FCC 'P Proceed/continue execution.' 63 65 65 64 2f 63 6f 6e 74 69 6e 75 65 20 65 78 65 63 75 74 69 6f 6e 2e 2008 edbf 0d FCB #$0D 2009 edc0 52 4d 20 5b 50 2c FCC 'RM [P, Y, X, A, B, C, or S] Register modify.' 20 59 2c 20 58 2c 20 41 2c 20 42 2c 20 43 2c 20 6f 72 20 53 5d 20 20 52 65 67 69 73 74 65 72 20 6d 6f 64 69 66 79 2e 2010 eded 0d FCB #$0D 2011 edee 54 20 5b 3c 6e 3e FCC 'T [] Trace n instructions.' 5d 20 20 54 72 61 63 65 20 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 2012 ee0c 0d FCB #$0D 2013 ee0d 54 4d 20 20 54 72 FCC 'TM Transparent mode (CTRL-A = exit, CTRL-B = send break).' 61 6e 73 70 61 72 65 6e 74 20 6d 6f 64 65 20 28 43 54 52 4c 2d 41 20 3d 20 65 78 69 74 2c 20 43 54 52 4c 2d 42 20 3d 20 73 65 6e 64 20 62 72 65 61 6b 29 2e 2014 ee47 0d FCB #$0D 2015 ee48 43 54 52 4c 2d 48 FCC 'CTRL-H Backspace. CTRL-W Wait for any key.' 20 20 42 61 63 6b 73 70 61 63 65 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 54 52 4c 2d 57 20 20 57 61 69 74 20 66 6f 72 20 61 6e 79 20 6b 65 79 2016 ee89 0d FCB #$0D 2017 ee8a 43 54 52 4c 2d 58 FCC 'CTRL-X or DELETE Abort/cancel command.' 20 6f 72 20 44 45 4c 45 54 45 20 20 41 62 6f 72 74 2f 63 61 6e 63 65 6c 20 63 6f 6d 6d 61 6e 64 2e 2018 eeb1 0d FCB #$0D 2019 eeb2 52 45 54 55 52 4e FCC 'RETURN Repeat last command.' 20 20 52 65 70 65 61 74 20 6c 61 73 74 20 63 6f 6d 6d 61 6e 64 2e 2020 eece 04 FCB 4 2021 2022 ********** 2023 * HOST() - Establishes transparent link between 2024 * terminal and host. Port used for host is 2025 * determined in the reset initialization routine 2026 * and stored in HOSTDEV. 2027 * To exit type control A. 2028 * To send break to host type control B. 2029 *if(no external device) return; 2030 *initialize host port; 2031 *While( !(control A)) 2032 * input(terminal); output(host); 2033 * input(host); output(terminal); 2034 2035 eecf 96 ab [ 3 ] HOST LDAA EXTDEV 2036 eed1 26 07 [ 3 ] BNE HOST0 jump if host port avail. 2037 eed3 ce e6 70 [ 3 ] LDX #MSG10 "no host port avail" 2038 eed6 bd e4 fa [ 6 ] JSR OUTSTRG 2039 eed9 39 [ 5 ] RTS 2040 eeda 7f 00 a9 [ 6 ] HOST0 CLR AUTOLF turn off autolf 2041 eedd bd e3 30 [ 6 ] JSR HOSTCO connect sci (evb board) 2042 eee0 bd ef 3f [ 6 ] JSR HOSTINIT initialize host port 2043 eee3 bd e3 87 [ 6 ] HOST1 JSR INPUT read terminal 2044 eee6 4d [ 2 ] TSTA 2045 eee7 27 10 [ 3 ] BEQ HOST3 jump if no char 2046 eee9 81 01 [ 2 ] CMPA #CTLA 2047 eeeb 27 17 [ 3 ] BEQ HOSTEND jump if control a 2048 eeed 81 02 [ 2 ] CMPA #CTLB 2049 eeef 26 05 [ 3 ] BNE HOST2 jump if not control b 2050 eef1 bd ef 0b [ 6 ] JSR TXBREAK send break to host 2051 eef4 20 03 [ 3 ] BRA HOST3 2052 eef6 bd ef 57 [ 6 ] HOST2 JSR HOSTOUT echo to host 2053 eef9 bd ef 4b [ 6 ] HOST3 JSR HOSTIN read host 2054 eefc 4d [ 2 ] TSTA 2055 eefd 27 e4 [ 3 ] BEQ HOST1 jump if no char 2056 eeff bd e3 b3 [ 6 ] JSR OUTPUT echo to terminal 2057 ef02 20 df [ 3 ] BRA HOST1 2058 ef04 7c 00 a9 [ 6 ] HOSTEND INC AUTOLF turn on autolf 2059 ef07 bd e3 38 [ 6 ] JSR TARGCO disconnect sci (evb board) 2060 ef0a 39 [ 5 ] RTS return 2061 2062 ********** 2063 * txbreak() - transmit break to host port. 2064 * The duration of the transmitted break is 2065 * approximately 200,000 E-clock cycles, or 2066 * 100ms at 2.0 MHz. 2067 *********** 2068 ef0b TXBREAK EQU * 2069 ef0b 96 ac [ 3 ] LDAA HOSTDEV 2070 ef0d 81 03 [ 2 ] CMPA #$03 2071 ef0f 27 0d [ 3 ] BEQ TXBDU jump if duartb is host 2072 2073 ef11 ce 10 2d [ 3 ] TXBSCI LDX #SCCR2 sci is host 2074 ef14 1c 00 01 [ 7 ] BSET 0,X $01 set send break bit 2075 ef17 8d 1d [ 6 ] BSR TXBWAIT 2076 ef19 1d 00 01 [ 7 ] BCLR 0,X $01 clear send break bit 2077 ef1c 20 0d [ 3 ] BRA TXB1 2078 2079 ef1e ce d0 08 [ 3 ] TXBDU LDX #PORTB duart host port 2080 ef21 86 60 [ 2 ] LDAA #$60 start break cmd 2081 ef23 a7 02 [ 4 ] STAA 2,X port b command register 2082 ef25 8d 0f [ 6 ] BSR TXBWAIT 2083 ef27 86 70 [ 2 ] LDAA #$70 stop break cmd 2084 ef29 a7 02 [ 4 ] STAA 2,X port b command register 2085 2086 ef2b 86 0d [ 2 ] TXB1 LDAA #$0D 2087 ef2d bd ef 57 [ 6 ] JSR HOSTOUT send carriage return 2088 ef30 86 0a [ 2 ] LDAA #$0A 2089 ef32 bd ef 57 [ 6 ] JSR HOSTOUT send linefeed 2090 ef35 39 [ 5 ] RTS 2091 2092 ef36 18 ce 6f 9b [ 4 ] TXBWAIT LDY #$6F9B loop count = 28571 2093 ef3a 18 09 [ 4 ] TXBWAIT1 DEY 7 cycle loop 2094 ef3c 26 fc [ 3 ] BNE TXBWAIT1 2095 ef3e 39 [ 5 ] RTS 2096 2097 2098 ********** 2099 * hostinit(), hostin(), hostout() - host i/o 2100 *routines. Restores original terminal device. 2101 ********** 2102 ef3f d6 aa [ 3 ] HOSTINIT LDAB IODEV save terminal 2103 ef41 37 [ 3 ] PSHB 2104 ef42 d6 ac [ 3 ] LDAB HOSTDEV 2105 ef44 d7 aa [ 3 ] STAB IODEV point to host 2106 ef46 bd e3 61 [ 6 ] JSR INIT initialize host 2107 ef49 20 16 [ 3 ] BRA TERMRES restore terminal 2108 ef4b d6 aa [ 3 ] HOSTIN LDAB IODEV save terminal 2109 ef4d 37 [ 3 ] PSHB 2110 ef4e d6 ac [ 3 ] LDAB HOSTDEV 2111 ef50 d7 aa [ 3 ] STAB IODEV point to host 2112 ef52 bd e3 87 [ 6 ] JSR INPUT read host 2113 ef55 20 0a [ 3 ] BRA TERMRES restore terminal 2114 ef57 d6 aa [ 3 ] HOSTOUT LDAB IODEV save terminal 2115 ef59 37 [ 3 ] PSHB 2116 ef5a d6 ac [ 3 ] LDAB HOSTDEV 2117 ef5c d7 aa [ 3 ] STAB IODEV point to host 2118 ef5e bd e3 b3 [ 6 ] JSR OUTPUT write to host 2119 ef61 33 [ 4 ] TERMRES PULB restore terminal device 2120 ef62 d7 aa [ 3 ] STAB IODEV 2121 ef64 39 [ 5 ] RTS 2122 2123 2124 ********** 2125 * load(ptrbuff[]) - Load s1/s9 records from 2126 *host to memory. Ptrbuff[] points to string in 2127 *input buffer which is a command to output s1/s9 2128 *records from the host ("cat filename" for unix). 2129 * Returns error and address if it can't write 2130 *to a particular location. 2131 ********** 2132 * verify(ptrbuff[]) - Verify memory from load 2133 *command. Ptrbuff[] is same as for load. 2134 ********** 2135 ef65 7f 00 c1 [ 6 ] VERIFY CLR TMP2 2136 ef68 7c 00 c1 [ 6 ] INC TMP2 flagt1 = 1 = verify 2137 ef6b 20 03 [ 3 ] BRA LOAD1 2138 ef6d 7f 00 c1 [ 6 ] LOAD CLR TMP2 flagt1 = 0 = load 2139 2140 2141 *a=wskip(); 2142 *if(a = cr) goto transparent mode; 2143 *if(t option) hostdev = iodev; 2144 2145 ef70 bd e2 f1 [ 6 ] LOAD1 JSR WSKIP 2146 ef73 81 0d [ 2 ] CMPA #$0D 2147 ef75 26 03 [ 3 ] BNE LOAD1A 2148 ef77 7e ee cf [ 3 ] JMP HOST go to host if no args 2149 ef7a bd e1 8f [ 6 ] LOAD1A JSR UPCASE 2150 ef7d 81 54 [ 2 ] CMPA #'T look for t option 2151 ef7f 26 16 [ 3 ] BNE LOAD1B jump not t option 2152 ef81 bd e2 e3 [ 6 ] JSR INCBUFF 2153 ef84 bd e2 dc [ 6 ] JSR READBUFF get next character 2154 ef87 bd e2 e9 [ 6 ] JSR DECBUFF 2155 ef8a 81 0d [ 2 ] CMPA #$0D 2156 ef8c 26 09 [ 3 ] BNE LOAD1B jump if not t option 2157 ef8e 7f 00 a9 [ 6 ] CLR AUTOLF 2158 ef91 96 aa [ 3 ] LDAA IODEV 2159 ef93 97 ac [ 3 ] STAA HOSTDEV set host port = terminal 2160 ef95 20 1b [ 3 ] BRA LOAD6 go wait for s1 records 2161 2162 *else while(not cr) 2163 * read character from input buffer; 2164 * send character to host; 2165 2166 ef97 7f 00 a9 [ 6 ] LOAD1B CLR AUTOLF 2167 ef9a bd e3 30 [ 6 ] JSR HOSTCO connect sci (evb board) 2168 ef9d bd ef 3f [ 6 ] JSR HOSTINIT initialize host port 2169 efa0 bd e2 dc [ 6 ] LOAD2 JSR READBUFF get next char 2170 efa3 bd e2 e3 [ 6 ] JSR INCBUFF 2171 efa6 36 [ 3 ] PSHA save char 2172 efa7 bd ef 57 [ 6 ] JSR HOSTOUT output to host 2173 efaa bd e3 b3 [ 6 ] JSR OUTPUT echo to terminal 2174 efad 32 [ 4 ] PULA 2175 efae 81 0d [ 2 ] CMPA #$0D 2176 efb0 26 ee [ 3 ] BNE LOAD2 jump if not cr 2177 2178 *repeat: 2179 * if(hostdev != iodev) check abort; 2180 * a = hostin(); 2181 * if(a = 'S') 2182 * a = hostin; 2183 * if(a = '9') 2184 * read rest of record; 2185 * return(done); 2186 * if(a = '1') 2187 * checksum = 0; 2188 * byte(); b = shftreg+1; /* byte count */ 2189 * byte(); byte(); x = shftreg; /* base addr*/ 2190 * do 2191 * byte(); 2192 * if(flagt1 = 0) 2193 * x[0] = shftreg+1 2194 * if(x[0] != shftreg+1) 2195 * return("rom-(x)"); 2196 * x++; b--; 2197 * until(b = 0) 2198 2199 efb2 LOAD6 EQU * 2200 efb2 96 ac [ 3 ] LDAA HOSTDEV 2201 efb4 91 aa [ 3 ] CMPA IODEV 2202 efb6 27 03 [ 3 ] BEQ LOAD65 jump if hostdev=iodev 2203 efb8 bd e3 12 [ 6 ] JSR CHKABRT check for abort 2204 efbb bd ef 4b [ 6 ] LOAD65 JSR HOSTIN read host 2205 efbe 4d [ 2 ] TSTA 2206 efbf 27 f1 [ 3 ] BEQ LOAD6 jump if no input 2207 efc1 81 53 [ 2 ] CMPA #'S 2208 efc3 26 ed [ 3 ] BNE LOAD6 jump if not S 2209 efc5 bd ef 4b [ 6 ] LOAD7 JSR HOSTIN read host 2210 efc8 4d [ 2 ] TSTA 2211 efc9 27 fa [ 3 ] BEQ LOAD7 jump if no input 2212 efcb 81 39 [ 2 ] CMPA #'9 2213 efcd 26 18 [ 3 ] BNE LOAD8 jump if not S9 2214 efcf bd f0 42 [ 6 ] JSR BYTE 2215 efd2 d6 95 [ 3 ] LDAB SHFTREG+1 b = byte count 2216 efd4 bd f0 42 [ 6 ] LOAD75 JSR BYTE 2217 efd7 5a [ 2 ] DECB 2218 efd8 26 fa [ 3 ] BNE LOAD75 loop until end of record 2219 efda 7c 00 a9 [ 6 ] INC AUTOLF turn on autolf 2220 efdd bd e3 38 [ 6 ] JSR TARGCO disconnect sci (evb) 2221 efe0 ce e6 87 [ 3 ] LDX #MSG11 "done" 2222 efe3 bd e4 fa [ 6 ] JSR OUTSTRG 2223 efe6 39 [ 5 ] RTS 2224 efe7 81 31 [ 2 ] LOAD8 CMPA #'1 2225 efe9 26 c7 [ 3 ] BNE LOAD6 jump if not S1 2226 efeb 7f 00 c3 [ 6 ] CLR TMP4 clear checksum 2227 efee bd f0 42 [ 6 ] JSR BYTE 2228 eff1 d6 95 [ 3 ] LDAB SHFTREG+1 2229 eff3 c0 02 [ 2 ] SUBB #$2 b = byte count 2230 eff5 bd f0 42 [ 6 ] JSR BYTE 2231 eff8 bd f0 42 [ 6 ] JSR BYTE 2232 effb de 94 [ 4 ] LDX SHFTREG x = base address 2233 effd 09 [ 3 ] DEX 2234 effe bd f0 42 [ 6 ] LOAD10 JSR BYTE get next byte 2235 f001 08 [ 3 ] INX 2236 f002 5a [ 2 ] DECB check byte count 2237 f003 27 25 [ 3 ] BEQ LOAD12 if 0, go do checksum 2238 f005 96 95 [ 3 ] LDAA SHFTREG+1 2239 f007 7d 00 c1 [ 6 ] TST TMP2 2240 f00a 26 02 [ 3 ] BNE LOAD11 jump if verify 2241 f00c a7 00 [ 4 ] STAA 0,X load only 2242 f00e a1 00 [ 4 ] LOAD11 CMPA 0,X verify ram location 2243 f010 27 ec [ 3 ] BEQ LOAD10 jump if ram ok 2244 f012 df b6 [ 4 ] STX PTR3 save error address 2245 f014 7c 00 a9 [ 6 ] INC AUTOLF turn on autolf 2246 f017 bd e3 38 [ 6 ] JSR TARGCO disconnect sci(evb) 2247 f01a bd e4 ed [ 6 ] JSR OUTCRLF 2248 f01d ce e6 9b [ 3 ] LDX #MSG13 "error addr" 2249 f020 bd e4 fa [ 6 ] JSR OUTSTRG 2250 f023 ce 00 b6 [ 3 ] LDX #PTR3 2251 f026 bd e4 e1 [ 6 ] JSR OUT2BSP address 2252 f029 39 [ 5 ] RTS 2253 f02a 96 c3 [ 3 ] LOAD12 LDAA TMP4 2254 f02c 4c [ 2 ] INCA do checksum 2255 f02d 26 03 [ 3 ] BNE LOAD13 jump if s1 record okay 2256 f02f 7e ef b2 [ 3 ] JMP LOAD6 2257 f032 7c 00 a9 [ 6 ] LOAD13 INC AUTOLF 2258 f035 bd e3 38 [ 6 ] JSR TARGCO disconnect sci(evb) 2259 f038 bd e4 ed [ 6 ] JSR OUTCRLF 2260 f03b ce e6 8c [ 3 ] LDX #MSG12 "checksum error" 2261 f03e bd e4 fa [ 6 ] JSR OUTSTRG 2262 f041 39 [ 5 ] RTS 2263 2264 ********** 2265 * byte() - Read 2 ascii bytes from host and 2266 *convert to one hex byte. Returns byte 2267 *shifted into shftreg and added to tmp4. 2268 ********** 2269 f042 37 [ 3 ] BYTE PSHB 2270 f043 3c [ 4 ] PSHX 2271 f044 bd ef 4b [ 6 ] BYTE0 JSR HOSTIN read host (1st byte) 2272 f047 4d [ 2 ] TSTA 2273 f048 27 fa [ 3 ] BEQ BYTE0 loop until input 2274 f04a bd e1 e9 [ 6 ] JSR HEXBIN 2275 f04d bd ef 4b [ 6 ] BYTE1 JSR HOSTIN read host (2nd byte) 2276 f050 4d [ 2 ] TSTA 2277 f051 27 fa [ 3 ] BEQ BYTE1 loop until input 2278 f053 bd e1 e9 [ 6 ] JSR HEXBIN 2279 f056 96 95 [ 3 ] LDAA SHFTREG+1 2280 f058 9b c3 [ 3 ] ADDA TMP4 2281 f05a 97 c3 [ 3 ] STAA TMP4 add to checksum 2282 f05c 38 [ 5 ] PULX 2283 f05d 33 [ 4 ] PULB 2284 f05e 39 [ 5 ] RTS 2285 2286 2287 ******************************************* 2288 * MEMORY [] 2289 * []/ 2290 * Opens memory and allows user to modify the 2291 *contents at or the last opened location. 2292 * Subcommands: 2293 * [] - Close current location and exit. 2294 * [] - Close current and open next. 2295 * []<^> - Close current and open previous. 2296 * [] - Close current and open next. 2297 * []/ - Reopen current location. 2298 * The contents of the current location is only 2299 * changed if valid data is entered before each 2300 * subcommand. 2301 * []O - Compute relative offset from current 2302 * location to . The current location must 2303 * be the address of the offset byte. 2304 ********** 2305 *a = wskip(); 2306 *if(a != cr) 2307 * a = buffarg(); 2308 * if(a != cr) return(bad argument); 2309 * if(countu1 != 0) ptrmem[] = shftreg; 2310 2311 f05f bd e2 f1 [ 6 ] MEMORY JSR WSKIP 2312 f062 81 0d [ 2 ] CMPA #$D 2313 f064 27 1a [ 3 ] BEQ MEM1 jump if cr 2314 f066 bd e2 1c [ 6 ] JSR BUFFARG 2315 f069 bd e2 f1 [ 6 ] JSR WSKIP 2316 f06c 81 0d [ 2 ] CMPA #$D 2317 f06e 27 07 [ 3 ] BEQ MSLASH jump if cr 2318 f070 ce e6 63 [ 3 ] LDX #MSG9 "bad argument" 2319 f073 bd e4 fa [ 6 ] JSR OUTSTRG 2320 f076 39 [ 5 ] RTS 2321 f077 7d 00 ad [ 6 ] MSLASH TST COUNT 2322 f07a 27 04 [ 3 ] BEQ MEM1 jump if no argument 2323 f07c de 94 [ 4 ] LDX SHFTREG 2324 f07e df ae [ 4 ] STX PTRMEM update "current location" 2325 2326 ********** 2327 * Subcommands 2328 ********** 2329 *outcrlf(); 2330 *out2bsp(ptrmem[]); 2331 *out1bsp(ptrmem[0]); 2332 2333 f080 bd e4 ed [ 6 ] MEM1 JSR OUTCRLF 2334 f083 ce 00 ae [ 3 ] MEM2 LDX #PTRMEM 2335 f086 bd e4 e1 [ 6 ] JSR OUT2BSP output address 2336 f089 de ae [ 4 ] MEM3 LDX PTRMEM 2337 f08b bd e4 e4 [ 6 ] JSR OUT1BSP output contents 2338 f08e 7f 00 94 [ 6 ] CLR SHFTREG 2339 f091 7f 00 95 [ 6 ] CLR SHFTREG+1 2340 *while 1 2341 *a = termarg(); 2342 * switch(a) 2343 * case(space): 2344 * chgbyt(); 2345 * ptrmem[]++; 2346 * case(linefeed): 2347 * chgbyt(); 2348 * ptrmem[]++; 2349 * case(up arrow): 2350 * case(backspace): 2351 * chgbyt(); 2352 * ptrmem[]--; 2353 * case("/"): 2354 * chgbyt(); 2355 * outcrlf(); 2356 * case(O): 2357 * d = ptrmem[0] - (shftreg); 2358 * if($80 < d < $ff81) 2359 * print(out of range); 2360 * countt1 = d-1; 2361 * out1bsp(countt1); 2362 * case(carriage return): 2363 * chgbyt(); 2364 * return; 2365 * default: return(command?) 2366 2367 f094 bd e2 3f [ 6 ] MEM4 JSR TERMARG 2368 f097 bd e1 8f [ 6 ] JSR UPCASE 2369 f09a de ae [ 4 ] LDX PTRMEM 2370 f09c 81 20 [ 2 ] CMPA #$20 2371 f09e 27 21 [ 3 ] BEQ MEMSP jump if space 2372 f0a0 81 0a [ 2 ] CMPA #$0A 2373 f0a2 27 26 [ 3 ] BEQ MEMLF jump if linefeed 2374 f0a4 81 5e [ 2 ] CMPA #$5E 2375 f0a6 27 2b [ 3 ] BEQ MEMUA jump if up arrow 2376 f0a8 81 08 [ 2 ] CMPA #$08 2377 f0aa 27 27 [ 3 ] BEQ MEMBS jump if backspace 2378 f0ac 81 2f [ 2 ] CMPA #'/' 2379 f0ae 27 2c [ 3 ] BEQ MEMSL jump if / 2380 f0b0 81 4f [ 2 ] CMPA #'O' 2381 f0b2 27 2e [ 3 ] BEQ MEMOFF jump if O 2382 f0b4 81 0d [ 2 ] CMPA #$0D 2383 f0b6 27 5a [ 3 ] BEQ MEMCR jump if carriage ret 2384 f0b8 ce e6 5a [ 3 ] LDX #MSG8 "command?" 2385 f0bb bd e4 fa [ 6 ] JSR OUTSTRG 2386 f0be 7e f0 80 [ 3 ] JMP MEM1 2387 f0c1 bd e2 67 [ 6 ] MEMSP JSR CHGBYT 2388 f0c4 08 [ 3 ] INX 2389 f0c5 df ae [ 4 ] STX PTRMEM 2390 f0c7 7e f0 89 [ 3 ] JMP MEM3 output contents 2391 f0ca bd e2 67 [ 6 ] MEMLF JSR CHGBYT 2392 f0cd 08 [ 3 ] INX 2393 f0ce df ae [ 4 ] STX PTRMEM 2394 f0d0 7e f0 83 [ 3 ] JMP MEM2 output addr, contents 2395 f0d3 MEMUA EQU * 2396 f0d3 bd e2 67 [ 6 ] MEMBS JSR CHGBYT 2397 f0d6 09 [ 3 ] DEX 2398 f0d7 df ae [ 4 ] STX PTRMEM 2399 f0d9 7e f0 80 [ 3 ] JMP MEM1 output cr, addr, contents 2400 f0dc bd e2 67 [ 6 ] MEMSL JSR CHGBYT 2401 f0df 7e f0 80 [ 3 ] JMP MEM1 output cr, addr, contents 2402 f0e2 dc 94 [ 4 ] MEMOFF LDD SHFTREG destination addr 2403 f0e4 93 ae [ 5 ] SUBD PTRMEM 2404 f0e6 81 00 [ 2 ] CMPA #$0 2405 f0e8 26 06 [ 3 ] BNE MEMOFF1 jump if not 0 2406 f0ea c1 80 [ 2 ] CMPB #$80 2407 f0ec 23 13 [ 3 ] BLS MEMOFF3 jump if in range 2408 f0ee 20 08 [ 3 ] BRA MEMOFF2 out of range 2409 f0f0 81 ff [ 2 ] MEMOFF1 CMPA #$FF 2410 f0f2 26 04 [ 3 ] BNE MEMOFF2 out of range 2411 f0f4 c1 81 [ 2 ] CMPB #$81 2412 f0f6 24 09 [ 3 ] BHS MEMOFF3 in range 2413 f0f8 ce e6 42 [ 3 ] MEMOFF2 LDX #MSG3 "Too long" 2414 f0fb bd e4 fa [ 6 ] JSR OUTSTRG 2415 f0fe 7e f0 80 [ 3 ] JMP MEM1 output cr, addr, contents 2416 f101 83 00 01 [ 4 ] MEMOFF3 SUBD #$1 b now has offset 2417 f104 d7 c3 [ 3 ] STAB TMP4 2418 f106 bd e4 e7 [ 6 ] JSR OUTSPAC 2419 f109 ce 00 c3 [ 3 ] LDX #TMP4 2420 f10c bd e4 e4 [ 6 ] JSR OUT1BSP output offset 2421 f10f 7e f0 80 [ 3 ] JMP MEM1 output cr, addr, contents 2422 f112 bd e2 67 [ 6 ] MEMCR JSR CHGBYT 2423 f115 39 [ 5 ] RTS exit task 2424 2425 2426 ********** 2427 * move [] - move 2428 *block at to to . 2429 * Moves block 1 byte up if no . 2430 ********** 2431 *a = buffarg(); 2432 *if(countu1 = 0) return(bad argument); 2433 *if( !wchek(a) ) return(bad argument); 2434 *ptr1 = shftreg; /* src1 */ 2435 2436 f116 MOVE EQU * 2437 f116 bd e2 1c [ 6 ] JSR BUFFARG 2438 f119 7d 00 ad [ 6 ] TST COUNT 2439 f11c 27 2d [ 3 ] BEQ MOVERR jump if no arg 2440 f11e bd e2 ff [ 6 ] JSR WCHEK 2441 f121 26 28 [ 3 ] BNE MOVERR jump if no delim 2442 f123 de 94 [ 4 ] LDX SHFTREG src1 2443 f125 df b2 [ 4 ] STX PTR1 2444 2445 *a = buffarg(); 2446 *if(countu1 = 0) return(bad argument); 2447 *if( !dchek(a) ) return(bad argument); 2448 *ptr2 = shftreg; /* src2 */ 2449 2450 f127 bd e2 1c [ 6 ] JSR BUFFARG 2451 f12a 7d 00 ad [ 6 ] TST COUNT 2452 f12d 27 1c [ 3 ] BEQ MOVERR jump if no arg 2453 f12f bd e3 0a [ 6 ] JSR DCHEK 2454 f132 26 17 [ 3 ] BNE MOVERR jump if no delim 2455 f134 de 94 [ 4 ] LDX SHFTREG src2 2456 f136 df b4 [ 4 ] STX PTR2 2457 2458 *a = buffarg(); 2459 *a = wskip(); 2460 *if(a != cr) return(bad argument); 2461 *if(countu1 != 0) tmp2 = shftreg; /* dest */ 2462 *else tmp2 = ptr1 + 1; 2463 2464 f138 bd e2 1c [ 6 ] JSR BUFFARG 2465 f13b bd e2 f1 [ 6 ] JSR WSKIP 2466 f13e 81 0d [ 2 ] CMPA #$0D 2467 f140 26 09 [ 3 ] BNE MOVERR jump if not cr 2468 f142 7d 00 ad [ 6 ] TST COUNT 2469 f145 27 0b [ 3 ] BEQ MOVE1 jump if no arg 2470 f147 de 94 [ 4 ] LDX SHFTREG dest 2471 f149 20 0a [ 3 ] BRA MOVE2 2472 f14b ce e6 63 [ 3 ] MOVERR LDX #MSG9 "bad argument" 2473 f14e bd e4 fa [ 6 ] JSR OUTSTRG 2474 f151 39 [ 5 ] RTS 2475 f152 de b2 [ 4 ] MOVE1 LDX PTR1 2476 f154 08 [ 3 ] INX default dest 2477 f155 df b6 [ 4 ] MOVE2 STX PTR3 2478 2479 *if(src1 < dest <= src2) 2480 * dest = dest+(src2-src1); 2481 * for(x = src2; x = src1; x--) 2482 * dest[0]-- = x[0]--; 2483 2484 f157 de b6 [ 4 ] LDX PTR3 dest 2485 f159 9c b2 [ 5 ] CPX PTR1 src1 2486 f15b 23 30 [ 3 ] BLS MOVE3 jump if dest =< src1 2487 f15d 9c b4 [ 5 ] CPX PTR2 src2 2488 f15f 22 2c [ 3 ] BHI MOVE3 jump if dest > src2 2489 f161 dc b4 [ 4 ] LDD PTR2 2490 f163 93 b2 [ 5 ] SUBD PTR1 2491 f165 d3 b6 [ 5 ] ADDD PTR3 2492 f167 dd b6 [ 4 ] STD PTR3 dest = dest+(src2-src1) 2493 f169 de b4 [ 4 ] LDX PTR2 2494 f16b bd e3 12 [ 6 ] MOVELP1 JSR CHKABRT check for abort 2495 f16e a6 00 [ 4 ] LDAA ,X char at src2 2496 f170 3c [ 4 ] PSHX 2497 f171 de b6 [ 4 ] LDX PTR3 2498 f173 8c b6 00 [ 4 ] CPX #$B600 jump if not eeprom 2499 f176 25 08 [ 3 ] BLO MOVEA 2500 f178 8c b7 ff [ 4 ] CPX #$B7FF jump if not eeprom 2501 f17b 22 03 [ 3 ] BHI MOVEA 2502 f17d bd f1 b2 [ 6 ] JSR MOVPROG program eeprom 2503 f180 a7 00 [ 4 ] MOVEA STAA ,X dest 2504 f182 09 [ 3 ] DEX 2505 f183 df b6 [ 4 ] STX PTR3 2506 f185 38 [ 5 ] PULX 2507 f186 9c b2 [ 5 ] CPX PTR1 2508 f188 27 27 [ 3 ] BEQ MOVRTS 2509 f18a 09 [ 3 ] DEX 2510 f18b 20 de [ 3 ] BRA MOVELP1 Loop SRC2 - SRC1 times 2511 * 2512 * else 2513 * for(x=src1; x=src2; x++) 2514 * dest[0]++ = x[0]++; 2515 2516 2517 f18d de b2 [ 4 ] MOVE3 LDX PTR1 srce1 2518 f18f bd e3 12 [ 6 ] MOVELP2 JSR CHKABRT check for abort 2519 f192 a6 00 [ 4 ] LDAA ,X 2520 f194 3c [ 4 ] PSHX 2521 f195 de b6 [ 4 ] LDX PTR3 dest 2522 f197 8c b6 00 [ 4 ] CPX #$B600 jump if not eeprom 2523 f19a 25 08 [ 3 ] BLO MOVEB 2524 f19c 8c b7 ff [ 4 ] CPX #$B7FF jump if not eeprom 2525 f19f 22 03 [ 3 ] BHI MOVEB 2526 f1a1 bd f1 b2 [ 6 ] JSR MOVPROG program eeprom 2527 f1a4 a7 00 [ 4 ] MOVEB STAA ,X 2528 f1a6 08 [ 3 ] INX 2529 f1a7 df b6 [ 4 ] STX PTR3 2530 f1a9 38 [ 5 ] PULX 2531 f1aa 9c b4 [ 5 ] CPX PTR2 2532 f1ac 27 03 [ 3 ] BEQ MOVRTS 2533 f1ae 08 [ 3 ] INX 2534 f1af 20 de [ 3 ] BRA MOVELP2 Loop SRC2-SRC1 times 2535 f1b1 39 [ 5 ] MOVRTS RTS 2536 2537 ************* 2538 * MOVPROG - Program eeprom location in X with 2539 * data in A. 2540 ************* 2541 f1b2 37 [ 3 ] MOVPROG PSHB 2542 f1b3 3c [ 4 ] PSHX 2543 f1b4 c6 02 [ 2 ] LDAB #$02 2544 f1b6 f7 10 3b [ 4 ] STAB PPROG set eelat 2545 f1b9 a7 00 [ 4 ] STAA ,X 2546 f1bb c6 03 [ 2 ] LDAB #$03 2547 f1bd 26 01 [ 3 ] BNE ACL4 2548 f1bf 5f [ 2 ] CLRB fail safe 2549 f1c0 f7 10 3b [ 4 ] ACL4 STAB PPROG set pgm 2550 f1c3 ce 0d 06 [ 3 ] LDX #$0D06 2551 f1c6 09 [ 3 ] MOVEDLY DEX 2552 f1c7 26 fd [ 3 ] BNE MOVEDLY delay 10 ms at E = 2 MHz 2553 f1c9 c6 00 [ 2 ] LDAB #$00 2554 f1cb f7 10 3b [ 4 ] STAB PPROG 2555 f1ce 38 [ 5 ] PULX 2556 f1cf 33 [ 4 ] PULB 2557 f1d0 39 [ 5 ] RTS 2558 2559 2560 ********** 2561 * register [] - prints the user regs 2562 *and opens them for modification. is 2563 *the first register opened (default = P). 2564 * Subcommands: 2565 * [] Opens the next register. 2566 * [] Return. 2567 * The register value is only changed if 2568 * is entered before the subcommand. 2569 ********** 2570 *x[] = reglist 2571 *a = wskip(); a = upcase(a); 2572 *if(a != cr) 2573 * while( a != x[0] ) 2574 * if( x[0] = "s") return(bad argument); 2575 * x[]++; 2576 * incbuff(); a = wskip(); 2577 * if(a != cr) return(bad argument); 2578 2579 f1d1 ce e1 a6 [ 3 ] REGISTER LDX #REGLIST 2580 f1d4 bd e2 f1 [ 6 ] JSR WSKIP a = first char of arg 2581 f1d7 bd e1 8f [ 6 ] JSR UPCASE convert to upper case 2582 f1da 81 0d [ 2 ] CMPA #$D 2583 f1dc 27 1e [ 3 ] BEQ REG4 jump if no argument 2584 f1de a1 00 [ 4 ] REG1 CMPA 0,X 2585 f1e0 27 0e [ 3 ] BEQ REG3 2586 f1e2 e6 00 [ 4 ] LDAB 0,X 2587 f1e4 08 [ 3 ] INX 2588 f1e5 c1 53 [ 2 ] CMPB #'S' 2589 f1e7 26 f5 [ 3 ] BNE REG1 jump if not "s" 2590 f1e9 ce e6 63 [ 3 ] REG2 LDX #MSG9 "bad argument" 2591 f1ec bd e4 fa [ 6 ] JSR OUTSTRG 2592 f1ef 39 [ 5 ] RTS 2593 f1f0 3c [ 4 ] REG3 PSHX 2594 f1f1 bd e2 e3 [ 6 ] JSR INCBUFF 2595 f1f4 bd e2 f1 [ 6 ] JSR WSKIP next char after arg 2596 f1f7 81 0d [ 2 ] CMPA #$D 2597 f1f9 38 [ 5 ] PULX 2598 f1fa 26 ed [ 3 ] BNE REG2 jump if not cr 2599 2600 *rprint(); 2601 * while(x[0] != "s") 2602 * rprnt1(x); 2603 * a = termarg(); /* read from terminal */ 2604 * if( ! dchek(a) ) return(bad argument); 2605 * if(countu1 != 0) 2606 * if(x[14] = 1) 2607 * regs[x[7]++ = shftreg; 2608 * regs[x[7]] = shftreg+1; 2609 * if(a = cr) break; 2610 *return; 2611 2612 f1fc bd e1 db [ 6 ] REG4 JSR RPRINT print all registers 2613 f1ff bd e4 ed [ 6 ] REG5 JSR OUTCRLF 2614 f202 bd e1 bb [ 6 ] JSR RPRNT1 print reg name 2615 f205 7f 00 94 [ 6 ] CLR SHFTREG 2616 f208 7f 00 95 [ 6 ] CLR SHFTREG+1 2617 f20b bd e2 3f [ 6 ] JSR TERMARG read subcommand 2618 f20e bd e3 0a [ 6 ] JSR DCHEK 2619 f211 27 07 [ 3 ] BEQ REG6 jump if delimeter 2620 f213 ce e6 63 [ 3 ] LDX #MSG9 "bad argument" 2621 f216 bd e4 fa [ 6 ] JSR OUTSTRG 2622 f219 39 [ 5 ] RTS 2623 f21a 36 [ 3 ] REG6 PSHA 2624 f21b 3c [ 4 ] PSHX 2625 f21c 7d 00 ad [ 6 ] TST COUNT 2626 f21f 27 14 [ 3 ] BEQ REG8 jump if no input 2627 f221 e6 07 [ 4 ] LDAB 7,X get reg offset 2628 f223 a6 0e [ 4 ] LDAA 14,X byte size 2629 f225 ce 00 9e [ 3 ] LDX #REGS user registers 2630 f228 3a [ 3 ] ABX 2631 f229 4d [ 2 ] TSTA 2632 f22a 27 05 [ 3 ] BEQ REG7 jump if 1 byte reg 2633 f22c 96 94 [ 3 ] LDAA SHFTREG 2634 f22e a7 00 [ 4 ] STAA 0,X put in top byte 2635 f230 08 [ 3 ] INX 2636 f231 96 95 [ 3 ] REG7 LDAA SHFTREG+1 2637 f233 a7 00 [ 4 ] STAA 0,X put in bottom byte 2638 f235 38 [ 5 ] REG8 PULX 2639 f236 32 [ 4 ] PULA 2640 f237 e6 00 [ 4 ] LDAB 0,X CHECK FOR REGISTER S 2641 f239 c1 53 [ 2 ] CMPB #'S' 2642 f23b 27 05 [ 3 ] BEQ REG9 jump if "s" 2643 f23d 08 [ 3 ] INX point to next register 2644 f23e 81 0d [ 2 ] CMPA #$D 2645 f240 26 bd [ 3 ] BNE REG5 jump if not cr 2646 f242 39 [ 5 ] REG9 RTS 2647 2648 0000 PAGE1 EQU $00 values for page opcodes 2649 0018 PAGE2 EQU $18 2650 001a PAGE3 EQU $1A 2651 00cd PAGE4 EQU $CD 2652 0000 IMMED EQU $0 addressing modes 2653 0001 INDX EQU $1 2654 0002 INDY EQU $2 2655 0003 LIMMED EQU $3 (long immediate) 2656 0004 OTHER EQU $4 2657 2658 *** Rename variables for assem/disassem *** 2659 00c1 AMODE EQU TMP2 addressing mode 2660 00c2 YFLAG EQU TMP3 2661 00c3 PNORM EQU TMP4 page for normal opcode 2662 00ae OLDPC EQU PTRMEM 2663 00b2 PC EQU PTR1 program counter 2664 00b4 PX EQU PTR2 page for x indexed 2665 00b5 PY EQU PTR2+1 page for y indexed 2666 00b6 BASEOP EQU PTR3 base opcode 2667 00b7 CLASS EQU PTR3+1 class 2668 00b8 DISPC EQU PTR4 pc for disassembler 2669 00ba BRADDR EQU PTR5 relative branch offset 2670 00bc MNEPTR EQU PTR6 pointer to table for dis 2671 00be ASSCOMM EQU PTR7 subcommand for assembler 2672 2673 *** Error messages for assembler *** 2674 f243 f2 55 MSGDIR FDB #MSGA1 message table index 2675 f245 f2 6c FDB #MSGA2 2676 f247 f2 84 FDB #MSGA3 2677 f249 f2 93 FDB #MSGA4 2678 f24b f2 a0 FDB #MSGA5 2679 f24d f2 b3 FDB #MSGA6 2680 f24f f2 cb FDB #MSGA7 2681 f251 f2 e6 FDB #MSGA8 2682 f253 f2 f3 FDB #MSGA9 2683 f255 49 6d 6d 65 64 69 MSGA1 FCC 'Immediate mode illegal' 61 74 65 20 6d 6f 64 65 20 69 6c 6c 65 67 61 6c 2684 f26b 04 FCB EOT 2685 f26c 45 72 72 6f 72 20 MSGA2 FCC 'Error in mnemonic table' 69 6e 20 6d 6e 65 6d 6f 6e 69 63 20 74 61 62 6c 65 2686 f283 04 FCB EOT 2687 f284 49 6c 6c 65 67 61 MSGA3 FCC 'Illegal bit op' 6c 20 62 69 74 20 6f 70 2688 f292 04 FCB EOT 2689 f293 42 61 64 20 61 72 MSGA4 FCC 'Bad argument' 67 75 6d 65 6e 74 2690 f29f 04 FCB EOT 2691 f2a0 4d 6e 65 6d 6f 6e MSGA5 FCC 'Mnemonic not found' 69 63 20 6e 6f 74 20 66 6f 75 6e 64 2692 f2b2 04 FCB EOT 2693 f2b3 55 6e 6b 6e 6f 77 MSGA6 FCC 'Unknown addressing mode' 6e 20 61 64 64 72 65 73 73 69 6e 67 20 6d 6f 64 65 2694 f2ca 04 FCB EOT 2695 f2cb 49 6e 64 65 78 65 MSGA7 FCC 'Indexed addressing assumed' 64 20 61 64 64 72 65 73 73 69 6e 67 20 61 73 73 75 6d 65 64 2696 f2e5 04 FCB EOT 2697 f2e6 53 79 6e 74 61 78 MSGA8 FCC 'Syntax error' 20 65 72 72 6f 72 2698 f2f2 04 FCB EOT 2699 f2f3 42 72 61 6e 63 68 MSGA9 FCC 'Branch out of range' 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2700 f306 04 FCB EOT 2701 2702 **************** 2703 * assem(addr) -68HC11 line assembler/disassembler. 2704 * This routine will disassemble the opcode at 2705 * and then allow the user to enter a line for 2706 *assembly. Rules for assembly are as follows: 2707 * -A '#' sign indicates immediate addressing. 2708 * -A ',' (comma) indicates indexed addressing 2709 * and the next character must be X or Y. 2710 * -All arguments are assumed to be hex and the 2711 * '$' sign shouldn't be used. 2712 * -Arguments should be separated by 1 or more 2713 * spaces or tabs. 2714 * -Any input after the required number of 2715 * arguments is ignored. 2716 * -Upper or lower case makes no difference. 2717 * 2718 * To signify end of input line, the following 2719 *commands are available and have the indicated action: 2720 * -Carriage return finds the next opcode for 2721 * assembly. If there was no assembly input, 2722 * the next opcode disassembled is retrieved 2723 * from the disassembler. 2724 * -Linefeed works the same as carriage return 2725 * except if there was no assembly input, the 2726 * is incremented and the next is 2727 * disassembled. 2728 * '^' -Up arrow decrements and the previous 2729 * address is then disassembled. 2730 * '/' -Slash redisassembles the current address. 2731 * 2732 * To exit the assembler use CONTROL A. Of course 2733 *control X and DEL will also allow you to abort. 2734 ********** 2735 *oldpc = rambase; 2736 *a = wskip(); 2737 *if (a != cr) 2738 * buffarg() 2739 * a = wskip(); 2740 * if ( a != cr ) return(error); 2741 * oldpc = a; 2742 2743 f307 ASSEM EQU * 2744 f307 ce 00 00 [ 3 ] LDX #RAMBS 2745 f30a df ae [ 4 ] STX OLDPC 2746 f30c bd e2 f1 [ 6 ] JSR WSKIP 2747 f30f 81 0d [ 2 ] CMPA #$0D 2748 f311 27 15 [ 3 ] BEQ ASSLOOP jump if no argument 2749 f313 bd e2 1c [ 6 ] JSR BUFFARG 2750 f316 bd e2 f1 [ 6 ] JSR WSKIP 2751 f319 81 0d [ 2 ] CMPA #$0D 2752 f31b 27 07 [ 3 ] BEQ ASSEM1 jump if argument ok 2753 f31d ce f2 93 [ 3 ] LDX #MSGA4 "bad argument" 2754 f320 bd e4 fa [ 6 ] JSR OUTSTRG 2755 f323 39 [ 5 ] RTS 2756 f324 de 94 [ 4 ] ASSEM1 LDX SHFTREG 2757 f326 df ae [ 4 ] STX OLDPC 2758 2759 *repeat 2760 * pc = oldpc; 2761 * out2bsp(pc); 2762 * disassem(); 2763 * a=readln(); 2764 * asscomm = a; /* save command */ 2765 * if(a == ('^' or '/')) outcrlf; 2766 * if(a == 0) return(error); 2767 2768 f328 de ae [ 4 ] ASSLOOP LDX OLDPC 2769 f32a df b2 [ 4 ] STX PC 2770 f32c bd e4 ed [ 6 ] JSR OUTCRLF 2771 f32f ce 00 b2 [ 3 ] LDX #PC 2772 f332 bd e4 e1 [ 6 ] JSR OUT2BSP output the address 2773 f335 bd fb 40 [ 6 ] JSR DISASSM disassemble opcode 2774 f338 bd e4 ed [ 6 ] JSR OUTCRLF 2775 f33b bd e4 e7 [ 6 ] JSR OUTSPAC 2776 f33e bd e4 e7 [ 6 ] JSR OUTSPAC 2777 f341 bd e4 e7 [ 6 ] JSR OUTSPAC 2778 f344 bd e4 e7 [ 6 ] JSR OUTSPAC 2779 f347 86 3e [ 2 ] LDAA #PROMPT prompt user 2780 f349 bd e4 d1 [ 6 ] JSR OUTA output prompt character 2781 f34c bd f3 e0 [ 6 ] JSR READLN read input for assembly 2782 f34f 97 be [ 3 ] STAA ASSCOMM 2783 f351 81 5e [ 2 ] CMPA #'^' 2784 f353 27 09 [ 3 ] BEQ ASSLP0 jump if up arrow 2785 f355 81 2f [ 2 ] CMPA #'/' 2786 f357 27 05 [ 3 ] BEQ ASSLP0 jump if slash 2787 f359 81 00 [ 2 ] CMPA #$00 2788 f35b 26 04 [ 3 ] BNE ASSLP1 jump if none of above 2789 f35d 39 [ 5 ] RTS return if bad input 2790 f35e bd e4 ed [ 6 ] ASSLP0 JSR OUTCRLF 2791 f361 ASSLP1 EQU * 2792 f361 bd e4 e7 [ 6 ] JSR OUTSPAC 2793 f364 bd e4 e7 [ 6 ] JSR OUTSPAC 2794 f367 bd e4 e7 [ 6 ] JSR OUTSPAC 2795 f36a bd e4 e7 [ 6 ] JSR OUTSPAC 2796 f36d bd e4 e7 [ 6 ] JSR OUTSPAC 2797 2798 * b = parse(input); /* get mnemonic */ 2799 * if(b > 5) print("not found"); asscomm='/'; 2800 * elseif(b >= 1) 2801 * msrch(); 2802 * if(class==$FF) 2803 * print("not found"); asscomm='/'; 2804 * else 2805 * a = doop(opcode,class); 2806 * if(a == 0) dispc=0; 2807 * else process error; asscomm='/'; 2808 2809 f370 bd f4 25 [ 6 ] JSR PARSE 2810 f373 c1 05 [ 2 ] CMPB #$5 2811 f375 2f 08 [ 3 ] BLE ASSLP2 jump if mnemonic <= 5 chars 2812 f377 ce f2 a0 [ 3 ] LDX #MSGA5 "mnemonic not found" 2813 f37a bd e4 fa [ 6 ] JSR OUTSTRG 2814 f37d 20 2f [ 3 ] BRA ASSLP5 2815 f37f ASSLP2 EQU * 2816 f37f c1 00 [ 2 ] CMPB #$0 2817 f381 27 2e [ 3 ] BEQ ASSLP10 jump if no input 2818 f383 bd f4 60 [ 6 ] JSR MSRCH 2819 f386 96 b7 [ 3 ] LDAA CLASS 2820 f388 81 ff [ 2 ] CMPA #$FF 2821 f38a 26 08 [ 3 ] BNE ASSLP3 2822 f38c ce f2 a0 [ 3 ] LDX #MSGA5 "mnemonic not found" 2823 f38f bd e4 fa [ 6 ] JSR OUTSTRG 2824 f392 20 1a [ 3 ] BRA ASSLP5 2825 f394 bd f4 98 [ 6 ] ASSLP3 JSR DOOP 2826 f397 81 00 [ 2 ] CMPA #$00 2827 f399 26 07 [ 3 ] BNE ASSLP4 jump if doop error 2828 f39b ce 00 00 [ 3 ] LDX #$00 2829 f39e df b8 [ 4 ] STX DISPC indicate good assembly 2830 f3a0 20 0f [ 3 ] BRA ASSLP10 2831 f3a2 4a [ 2 ] ASSLP4 DECA a = error message index 2832 f3a3 16 [ 2 ] TAB 2833 f3a4 ce f2 43 [ 3 ] LDX #MSGDIR 2834 f3a7 3a [ 3 ] ABX 2835 f3a8 3a [ 3 ] ABX 2836 f3a9 ee 00 [ 5 ] LDX 0,X 2837 f3ab bd e4 fa [ 6 ] JSR OUTSTRG output error message 2838 f3ae 7f 00 be [ 6 ] ASSLP5 CLR ASSCOMM error command 2839 2840 * /* compute next address - asscomm holds subcommand 2841 * and dispc indicates if valid assembly occured. */ 2842 * if(asscomm=='^') oldpc -= 1; 2843 * if(asscomm==(lf or cr) 2844 * if(dispc==0) oldpc=pc; 2845 * else 2846 * if(asscomm==lf) dispc=oldpc+1; 2847 * oldpc=dispc; 2848 *until(eot) 2849 2850 2851 f3b1 ASSLP10 EQU * 2852 f3b1 96 be [ 3 ] LDAA ASSCOMM 2853 f3b3 81 5e [ 2 ] CMPA #'^' 2854 f3b5 26 07 [ 3 ] BNE ASSLP11 jump if not up arrow 2855 f3b7 de ae [ 4 ] LDX OLDPC 2856 f3b9 09 [ 3 ] DEX 2857 f3ba df ae [ 4 ] STX OLDPC back up 2858 f3bc 20 1f [ 3 ] BRA ASSLP15 2859 f3be 81 0a [ 2 ] ASSLP11 CMPA #$0A 2860 f3c0 27 04 [ 3 ] BEQ ASSLP12 jump if linefeed 2861 f3c2 81 0d [ 2 ] CMPA #$0D 2862 f3c4 26 17 [ 3 ] BNE ASSLP15 jump if not cr 2863 f3c6 de b8 [ 4 ] ASSLP12 LDX DISPC 2864 f3c8 26 06 [ 3 ] BNE ASSLP13 jump if dispc != 0 2865 f3ca de b2 [ 4 ] LDX PC 2866 f3cc df ae [ 4 ] STX OLDPC 2867 f3ce 20 0d [ 3 ] BRA ASSLP15 2868 f3d0 81 0a [ 2 ] ASSLP13 CMPA #$0A 2869 f3d2 26 05 [ 3 ] BNE ASSLP14 jump if not linefeed 2870 f3d4 de ae [ 4 ] LDX OLDPC 2871 f3d6 08 [ 3 ] INX 2872 f3d7 df b8 [ 4 ] STX DISPC 2873 f3d9 de b8 [ 4 ] ASSLP14 LDX DISPC 2874 f3db df ae [ 4 ] STX OLDPC 2875 f3dd 7e f3 28 [ 3 ] ASSLP15 JMP ASSLOOP 2876 2877 **************** 2878 * readln() --- Read input from terminal into buffer 2879 * until a command character is read (cr,lf,/,^). 2880 * If more chars are typed than the buffer will hold, 2881 * the extra characters are overwritten on the end. 2882 * On exit: b=number of chars read, a=0 if quit, 2883 * else a=next command. 2884 **************** 2885 *for(b==0;b<=bufflng;b++) inbuff[b] = cr; 2886 2887 f3e0 5f [ 2 ] READLN CLRB 2888 f3e1 86 0d [ 2 ] LDAA #$0D carriage ret 2889 f3e3 ce 00 69 [ 3 ] RLN0 LDX #INBUFF 2890 f3e6 3a [ 3 ] ABX 2891 f3e7 a7 00 [ 4 ] STAA 0,X initialize input buffer 2892 f3e9 5c [ 2 ] INCB 2893 f3ea c1 23 [ 2 ] CMPB #BUFFLNG 2894 f3ec 2d f5 [ 3 ] BLT RLN0 2895 *b=0; 2896 *repeat 2897 * if(a == (ctla, cntlc, cntld, cntlx, del)) 2898 * return(a=0); 2899 * if(a == backspace) 2900 * if(b > 0) b--; 2901 * else b=0; 2902 * else inbuff[b] = upcase(a); 2903 * if(b < bufflng) b++; 2904 *until (a == (cr,lf,^,/)) 2905 *return(a); 2906 2907 f3ee 5f [ 2 ] CLRB 2908 f3ef bd e5 1a [ 6 ] RLN1 JSR INCHAR 2909 f3f2 81 7f [ 2 ] CMPA #DEL Delete 2910 f3f4 27 2d [ 3 ] BEQ RLNQUIT 2911 f3f6 81 18 [ 2 ] CMPA #CTLX Control X 2912 f3f8 27 29 [ 3 ] BEQ RLNQUIT 2913 f3fa 81 01 [ 2 ] CMPA #CTLA Control A 2914 f3fc 27 25 [ 3 ] BEQ RLNQUIT 2915 f3fe 81 03 [ 2 ] CMPA #$03 Control C 2916 f400 27 21 [ 3 ] BEQ RLNQUIT 2917 f402 81 04 [ 2 ] CMPA #$04 Control D 2918 f404 27 1d [ 3 ] BEQ RLNQUIT 2919 f406 81 08 [ 2 ] CMPA #$08 backspace 2920 f408 26 05 [ 3 ] BNE RLN2 2921 f40a 5a [ 2 ] DECB 2922 f40b 2e e2 [ 3 ] BGT RLN1 2923 f40d 20 d1 [ 3 ] BRA READLN start over 2924 f40f ce 00 69 [ 3 ] RLN2 LDX #INBUFF 2925 f412 3a [ 3 ] ABX 2926 f413 bd e1 8f [ 6 ] JSR UPCASE 2927 f416 a7 00 [ 4 ] STAA 0,X put char in buffer 2928 f418 c1 23 [ 2 ] CMPB #BUFFLNG max buffer length 2929 f41a 2c 01 [ 3 ] BGE RLN3 jump if buffer full 2930 f41c 5c [ 2 ] INCB move buffer pointer 2931 f41d bd f4 51 [ 6 ] RLN3 JSR ASSCHEK check for subcommand 2932 f420 26 cd [ 3 ] BNE RLN1 2933 f422 39 [ 5 ] RTS 2934 f423 4f [ 2 ] RLNQUIT CLRA quit 2935 f424 39 [ 5 ] RTS return 2936 2937 2938 ********** 2939 * parse() -parse out the mnemonic from INBUFF 2940 * to COMBUFF. on exit: b=number of chars parsed. 2941 ********** 2942 *combuff[3] = ; initialize 4th character to space. 2943 *ptrbuff[] = inbuff[]; 2944 *a=wskip(); 2945 *for (b = 0; b = 5; b++) 2946 * a=readbuff(); incbuff(); 2947 * if (a = (cr,lf,^,/,wspace)) return(b); 2948 * combuff[b] = upcase(a); 2949 *return(b); 2950 2951 f425 86 20 [ 2 ] PARSE LDAA #$20 2952 f427 97 8f [ 3 ] STAA COMBUFF+3 2953 f429 ce 00 69 [ 3 ] LDX #INBUFF initialize buffer ptr 2954 f42c df b0 [ 4 ] STX PTR0 2955 f42e bd e2 f1 [ 6 ] JSR WSKIP find first character 2956 f431 5f [ 2 ] CLRB 2957 f432 bd e2 dc [ 6 ] PARSLP JSR READBUFF read character 2958 f435 bd e2 e3 [ 6 ] JSR INCBUFF 2959 f438 bd e2 ff [ 6 ] JSR WCHEK 2960 f43b 27 13 [ 3 ] BEQ PARSRT jump if whitespace 2961 f43d bd f4 51 [ 6 ] JSR ASSCHEK 2962 f440 27 0e [ 3 ] BEQ PARSRT jump if end of line 2963 f442 bd e1 8f [ 6 ] JSR UPCASE convert to upper case 2964 f445 ce 00 8c [ 3 ] LDX #COMBUFF 2965 f448 3a [ 3 ] ABX 2966 f449 a7 00 [ 4 ] STAA 0,X store in combuff 2967 f44b 5c [ 2 ] INCB 2968 f44c c1 05 [ 2 ] CMPB #$5 2969 f44e 2f e2 [ 3 ] BLE PARSLP loop 6 times 2970 f450 39 [ 5 ] PARSRT RTS 2971 2972 2973 **************** 2974 * asschek() -perform compares for 2975 * cr, lf, ^, / 2976 **************** 2977 f451 81 0a [ 2 ] ASSCHEK CMPA #$0A linefeed 2978 f453 27 0a [ 3 ] BEQ ASSCHK1 2979 f455 81 0d [ 2 ] CMPA #$0D carriage ret 2980 f457 27 06 [ 3 ] BEQ ASSCHK1 2981 f459 81 5e [ 2 ] CMPA #'^' up arrow 2982 f45b 27 02 [ 3 ] BEQ ASSCHK1 2983 f45d 81 2f [ 2 ] CMPA #'/' slash 2984 f45f 39 [ 5 ] ASSCHK1 RTS 2985 2986 2987 ********* 2988 * msrch() --- Search MNETABL for mnemonic in COMBUFF. 2989 *stores base opcode at baseop and class at class. 2990 * Class = FF if not found. 2991 ********** 2992 *while ( != EOF ) 2993 * if (COMBUFF[0-3] = MNETABL[0-3]) 2994 * return(MNETABL[4],MNETABL[5]); 2995 * else *MNETABL =+ 6 2996 2997 f460 ce f7 c1 [ 3 ] MSRCH LDX #MNETABL pointer to mnemonic table 2998 f463 18 ce 00 8c [ 4 ] LDY #COMBUFF pointer to string 2999 f467 20 03 [ 3 ] BRA MSRCH1 3000 f469 MSNEXT EQU * 3001 f469 c6 06 [ 2 ] LDAB #6 3002 f46b 3a [ 3 ] ABX point to next table entry 3003 f46c a6 00 [ 4 ] MSRCH1 LDAA 0,X read table 3004 f46e 81 04 [ 2 ] CMPA #EOT 3005 f470 26 05 [ 3 ] BNE MSRCH2 jump if not end of table 3006 f472 86 ff [ 2 ] LDAA #$FF 3007 f474 97 b7 [ 3 ] STAA CLASS FF = not in table 3008 f476 39 [ 5 ] RTS 3009 f477 18 a1 00 [ 5 ] MSRCH2 CMPA 0,Y op[0] = tabl[0] ? 3010 f47a 26 ed [ 3 ] BNE MSNEXT 3011 f47c a6 01 [ 4 ] LDAA 1,X 3012 f47e 18 a1 01 [ 5 ] CMPA 1,Y op[1] = tabl[1] ? 3013 f481 26 e6 [ 3 ] BNE MSNEXT 3014 f483 a6 02 [ 4 ] LDAA 2,X 3015 f485 18 a1 02 [ 5 ] CMPA 2,Y op[2] = tabl[2] ? 3016 f488 26 df [ 3 ] BNE MSNEXT 3017 f48a a6 03 [ 4 ] LDAA 3,X 3018 f48c 18 a1 03 [ 5 ] CMPA 3,Y op[2] = tabl[2] ? 3019 f48f 26 d8 [ 3 ] BNE MSNEXT 3020 f491 ec 04 [ 5 ] LDD 4,X opcode, class 3021 f493 97 b6 [ 3 ] STAA BASEOP 3022 f495 d7 b7 [ 3 ] STAB CLASS 3023 f497 39 [ 5 ] RTS 3024 3025 ********** 3026 ** doop(baseop,class) --- process mnemonic. 3027 ** on exit: a=error code corresponding to error 3028 ** messages. 3029 ********** 3030 *amode = OTHER; /* addressing mode */ 3031 *yflag = 0; /* ynoimm, nlimm, and cpd flag */ 3032 *x[] = ptrbuff[] 3033 3034 f498 DOOP EQU * 3035 f498 86 04 [ 2 ] LDAA #OTHER 3036 f49a 97 c1 [ 3 ] STAA AMODE mode 3037 f49c 7f 00 c2 [ 6 ] CLR YFLAG 3038 f49f de b0 [ 4 ] LDX PTR0 3039 3040 *while (*x != end of buffer) 3041 * if (x[0]++ == ',') 3042 * if (x[0] == 'y') amode = INDY; 3043 * else amod = INDX; 3044 * break; 3045 *a = wskip() 3046 *if( a == '#' ) amode = IMMED; 3047 3048 f4a1 8c 00 8c [ 4 ] DOPLP1 CPX #ENDBUFF (end of buffer) 3049 f4a4 27 1b [ 3 ] BEQ DOOP1 jump if end of buffer 3050 f4a6 ec 00 [ 5 ] LDD 0,X read 2 chars from buffer 3051 f4a8 08 [ 3 ] INX move pointer 3052 f4a9 81 2c [ 2 ] CMPA #',' 3053 f4ab 26 f4 [ 3 ] BNE DOPLP1 3054 f4ad c1 59 [ 2 ] CMPB #'Y' look for ",y" 3055 f4af 26 06 [ 3 ] BNE DOPLP2 3056 f4b1 86 02 [ 2 ] LDAA #INDY 3057 f4b3 97 c1 [ 3 ] STAA AMODE 3058 f4b5 20 0a [ 3 ] BRA DOOP1 3059 f4b7 c1 58 [ 2 ] DOPLP2 CMPB #'X' look for ",x" 3060 f4b9 26 06 [ 3 ] BNE DOOP1 jump if not x 3061 f4bb 86 01 [ 2 ] LDAA #INDX 3062 f4bd 97 c1 [ 3 ] STAA AMODE 3063 f4bf 20 00 [ 3 ] BRA DOOP1 3064 f4c1 bd e2 f1 [ 6 ] DOOP1 JSR WSKIP 3065 f4c4 81 23 [ 2 ] CMPA #'#' look for immediate mode 3066 f4c6 26 07 [ 3 ] BNE DOOP2 3067 f4c8 bd e2 e3 [ 6 ] JSR INCBUFF point at argument 3068 f4cb 86 00 [ 2 ] LDAA #IMMED 3069 f4cd 97 c1 [ 3 ] STAA AMODE 3070 f4cf DOOP2 EQU * 3071 3072 *switch(class) 3073 f4cf d6 b7 [ 3 ] LDAB CLASS 3074 f4d1 c1 02 [ 2 ] CMPB #P2INH 3075 f4d3 26 03 [ 3 ] BNE DOSW1 3076 f4d5 7e f5 36 [ 3 ] JMP DOP2I 3077 f4d8 c1 01 [ 2 ] DOSW1 CMPB #INH 3078 f4da 26 03 [ 3 ] BNE DOSW2 3079 f4dc 7e f5 3b [ 3 ] JMP DOINH 3080 f4df c1 05 [ 2 ] DOSW2 CMPB #REL 3081 f4e1 26 03 [ 3 ] BNE DOSW3 3082 f4e3 7e f5 42 [ 3 ] JMP DOREL 3083 f4e6 c1 08 [ 2 ] DOSW3 CMPB #LIMM 3084 f4e8 26 03 [ 3 ] BNE DOSW4 3085 f4ea 7e f5 71 [ 3 ] JMP DOLIM 3086 f4ed c1 07 [ 2 ] DOSW4 CMPB #NIMM 3087 f4ef 26 03 [ 3 ] BNE DOSW5 3088 f4f1 7e f5 7b [ 3 ] JMP DONOI 3089 f4f4 c1 03 [ 2 ] DOSW5 CMPB #GEN 3090 f4f6 26 03 [ 3 ] BNE DOSW6 3091 f4f8 7e f5 84 [ 3 ] JMP DOGENE 3092 f4fb c1 04 [ 2 ] DOSW6 CMPB #GRP2 3093 f4fd 26 03 [ 3 ] BNE DOSW7 3094 f4ff 7e f5 92 [ 3 ] JMP DOGRP 3095 f502 c1 15 [ 2 ] DOSW7 CMPB #CPD 3096 f504 26 03 [ 3 ] BNE DOSW8 3097 f506 7e f5 c4 [ 3 ] JMP DOCPD 3098 f509 c1 10 [ 2 ] DOSW8 CMPB #XNIMM 3099 f50b 26 03 [ 3 ] BNE DOSW9 3100 f50d 7e f5 e5 [ 3 ] JMP DOXNOI 3101 f510 c1 09 [ 2 ] DOSW9 CMPB #XLIMM 3102 f512 26 03 [ 3 ] BNE DOSW10 3103 f514 7e f5 ee [ 3 ] JMP DOXLI 3104 f517 c1 12 [ 2 ] DOSW10 CMPB #YNIMM 3105 f519 26 03 [ 3 ] BNE DOSW11 3106 f51b 7e f6 06 [ 3 ] JMP DOYNOI 3107 f51e c1 11 [ 2 ] DOSW11 CMPB #YLIMM 3108 f520 26 03 [ 3 ] BNE DOSW12 3109 f522 7e f6 0f [ 3 ] JMP DOYLI 3110 f525 c1 13 [ 2 ] DOSW12 CMPB #BTB 3111 f527 26 03 [ 3 ] BNE DOSW13 3112 f529 7e f6 2e [ 3 ] JMP DOBTB 3113 f52c c1 14 [ 2 ] DOSW13 CMPB #SETCLR 3114 f52e 26 03 [ 3 ] BNE DODEF 3115 f530 7e f6 2e [ 3 ] JMP DOSET 3116 3117 * default: return("error in mnemonic table"); 3118 3119 f533 86 02 [ 2 ] DODEF LDAA #$2 3120 f535 39 [ 5 ] RTS 3121 3122 * case P2INH: emit(PAGE2) 3123 3124 f536 86 18 [ 2 ] DOP2I LDAA #PAGE2 3125 f538 bd f7 b7 [ 6 ] JSR EMIT 3126 3127 * case INH: emit(baseop); 3128 * return(0); 3129 3130 f53b 96 b6 [ 3 ] DOINH LDAA BASEOP 3131 f53d bd f7 b7 [ 6 ] JSR EMIT 3132 f540 4f [ 2 ] CLRA 3133 f541 39 [ 5 ] RTS 3134 3135 * case REL: a = assarg(); 3136 * if(a=4) return(a); 3137 * d = address - pc + 2; 3138 * if ($7f >= d >= $ff82) 3139 * return (out of range); 3140 * emit(opcode); 3141 * emit(offset); 3142 * return(0); 3143 3144 f542 bd f7 99 [ 6 ] DOREL JSR ASSARG 3145 f545 81 04 [ 2 ] CMPA #$04 3146 f547 26 01 [ 3 ] BNE DOREL1 jump if arg ok 3147 f549 39 [ 5 ] RTS 3148 f54a dc 94 [ 4 ] DOREL1 LDD SHFTREG get branch address 3149 f54c de b2 [ 4 ] LDX PC get program counter 3150 f54e 08 [ 3 ] INX 3151 f54f 08 [ 3 ] INX point to end of opcode 3152 f550 df ba [ 4 ] STX BRADDR 3153 f552 93 ba [ 5 ] SUBD BRADDR calculate offset 3154 f554 dd ba [ 4 ] STD BRADDR save result 3155 f556 1a 83 00 7f [ 5 ] CMPD #$7F in range ? 3156 f55a 23 09 [ 3 ] BLS DOREL2 jump if in range 3157 f55c 1a 83 ff 80 [ 5 ] CMPD #$FF80 3158 f560 24 03 [ 3 ] BHS DOREL2 jump if in range 3159 f562 86 09 [ 2 ] LDAA #$09 'Out of range' 3160 f564 39 [ 5 ] RTS 3161 f565 96 b6 [ 3 ] DOREL2 LDAA BASEOP 3162 f567 bd f7 b7 [ 6 ] JSR EMIT emit opcode 3163 f56a 96 bb [ 3 ] LDAA BRADDR+1 3164 f56c bd f7 b7 [ 6 ] JSR EMIT emit offset 3165 f56f 4f [ 2 ] CLRA normal return 3166 f570 39 [ 5 ] RTS 3167 3168 * case LIMM: if (amode == IMMED) amode = LIMMED; 3169 3170 f571 96 c1 [ 3 ] DOLIM LDAA AMODE 3171 f573 81 00 [ 2 ] CMPA #IMMED 3172 f575 26 04 [ 3 ] BNE DONOI 3173 f577 86 03 [ 2 ] LDAA #LIMMED 3174 f579 97 c1 [ 3 ] STAA AMODE 3175 3176 * case NIMM: if (amode == IMMED) 3177 * return("Immediate mode illegal"); 3178 3179 f57b 96 c1 [ 3 ] DONOI LDAA AMODE 3180 f57d 81 00 [ 2 ] CMPA #IMMED 3181 f57f 26 03 [ 3 ] BNE DOGENE jump if not immediate 3182 f581 86 01 [ 2 ] LDAA #$1 "immediate mode illegal" 3183 f583 39 [ 5 ] RTS 3184 3185 * case GEN: dogen(baseop,amode,PAGE1,PAGE1,PAGE2); 3186 * return; 3187 3188 f584 86 00 [ 2 ] DOGENE LDAA #PAGE1 3189 f586 97 c3 [ 3 ] STAA PNORM 3190 f588 97 b4 [ 3 ] STAA PX 3191 f58a 86 18 [ 2 ] LDAA #PAGE2 3192 f58c 97 b5 [ 3 ] STAA PY 3193 f58e bd f6 ca [ 6 ] JSR DOGEN 3194 f591 39 [ 5 ] RTS 3195 3196 * case GRP2: if (amode == INDY) 3197 * emit(PAGE2); 3198 * amode = INDX; 3199 * if( amode == INDX ) 3200 * doindx(baseop); 3201 * else a = assarg(); 3202 * if(a=4) return(a); 3203 * emit(opcode+0x10); 3204 * emit(extended address); 3205 * return; 3206 3207 f592 96 c1 [ 3 ] DOGRP LDAA AMODE 3208 f594 81 02 [ 2 ] CMPA #INDY 3209 f596 26 09 [ 3 ] BNE DOGRP1 3210 f598 86 18 [ 2 ] LDAA #PAGE2 3211 f59a bd f7 b7 [ 6 ] JSR EMIT 3212 f59d 86 01 [ 2 ] LDAA #INDX 3213 f59f 97 c1 [ 3 ] STAA AMODE 3214 f5a1 DOGRP1 EQU * 3215 f5a1 96 c1 [ 3 ] LDAA AMODE 3216 f5a3 81 01 [ 2 ] CMPA #INDX 3217 f5a5 26 04 [ 3 ] BNE DOGRP2 3218 f5a7 bd f7 6a [ 6 ] JSR DOINDEX 3219 f5aa 39 [ 5 ] RTS 3220 f5ab DOGRP2 EQU * 3221 f5ab 96 b6 [ 3 ] LDAA BASEOP 3222 f5ad 8b 10 [ 2 ] ADDA #$10 3223 f5af bd f7 b7 [ 6 ] JSR EMIT 3224 f5b2 bd f7 99 [ 6 ] JSR ASSARG 3225 f5b5 81 04 [ 2 ] CMPA #$04 3226 f5b7 27 0a [ 3 ] BEQ DOGRPRT jump if bad arg 3227 f5b9 dc 94 [ 4 ] LDD SHFTREG extended address 3228 f5bb bd f7 b7 [ 6 ] JSR EMIT 3229 f5be 17 [ 2 ] TBA 3230 f5bf bd f7 b7 [ 6 ] JSR EMIT 3231 f5c2 4f [ 2 ] CLRA 3232 f5c3 39 [ 5 ] DOGRPRT RTS 3233 3234 * case CPD: if (amode == IMMED) 3235 * amode = LIMMED; /* cpd */ 3236 * if( amode == INDY ) yflag = 1; 3237 * dogen(baseop,amode,PAGE3,PAGE3,PAGE4); 3238 * return; 3239 3240 f5c4 96 c1 [ 3 ] DOCPD LDAA AMODE 3241 f5c6 81 00 [ 2 ] CMPA #IMMED 3242 f5c8 26 04 [ 3 ] BNE DOCPD1 3243 f5ca 86 03 [ 2 ] LDAA #LIMMED 3244 f5cc 97 c1 [ 3 ] STAA AMODE 3245 f5ce 96 c1 [ 3 ] DOCPD1 LDAA AMODE 3246 f5d0 81 02 [ 2 ] CMPA #INDY 3247 f5d2 26 03 [ 3 ] BNE DOCPD2 3248 f5d4 7c 00 c2 [ 6 ] INC YFLAG 3249 f5d7 86 1a [ 2 ] DOCPD2 LDAA #PAGE3 3250 f5d9 97 c3 [ 3 ] STAA PNORM 3251 f5db 97 b4 [ 3 ] STAA PX 3252 f5dd 86 cd [ 2 ] LDAA #PAGE4 3253 f5df 97 b5 [ 3 ] STAA PY 3254 f5e1 bd f6 ca [ 6 ] JSR DOGEN 3255 f5e4 39 [ 5 ] RTS 3256 3257 * case XNIMM: if (amode == IMMED) /* stx */ 3258 * return("Immediate mode illegal"); 3259 3260 f5e5 96 c1 [ 3 ] DOXNOI LDAA AMODE 3261 f5e7 81 00 [ 2 ] CMPA #IMMED 3262 f5e9 26 03 [ 3 ] BNE DOXLI 3263 f5eb 86 01 [ 2 ] LDAA #$1 "immediate mode illegal" 3264 f5ed 39 [ 5 ] RTS 3265 3266 * case XLIMM: if (amode == IMMED) /* cpx, ldx */ 3267 * amode = LIMMED; 3268 * dogen(baseop,amode,PAGE1,PAGE1,PAGE4); 3269 * return; 3270 3271 f5ee 96 c1 [ 3 ] DOXLI LDAA AMODE 3272 f5f0 81 00 [ 2 ] CMPA #IMMED 3273 f5f2 26 04 [ 3 ] BNE DOXLI1 3274 f5f4 86 03 [ 2 ] LDAA #LIMMED 3275 f5f6 97 c1 [ 3 ] STAA AMODE 3276 f5f8 86 00 [ 2 ] DOXLI1 LDAA #PAGE1 3277 f5fa 97 c3 [ 3 ] STAA PNORM 3278 f5fc 97 b4 [ 3 ] STAA PX 3279 f5fe 86 cd [ 2 ] LDAA #PAGE4 3280 f600 97 b5 [ 3 ] STAA PY 3281 f602 bd f6 ca [ 6 ] JSR DOGEN 3282 f605 39 [ 5 ] RTS 3283 3284 * case YNIMM: if (amode == IMMED) /* sty */ 3285 * return("Immediate mode illegal"); 3286 3287 f606 96 c1 [ 3 ] DOYNOI LDAA AMODE 3288 f608 81 00 [ 2 ] CMPA #IMMED 3289 f60a 26 03 [ 3 ] BNE DOYLI 3290 f60c 86 01 [ 2 ] LDAA #$1 "immediate mode illegal" 3291 f60e 39 [ 5 ] RTS 3292 3293 * case YLIMM: if (amode == INDY) yflag = 1;/* cpy, ldy */ 3294 * if(amode == IMMED) amode = LIMMED; 3295 * dogen(opcode,amode,PAGE2,PAGE3,PAGE2); 3296 * return; 3297 3298 f60f 96 c1 [ 3 ] DOYLI LDAA AMODE 3299 f611 81 02 [ 2 ] CMPA #INDY 3300 f613 26 03 [ 3 ] BNE DOYLI1 3301 f615 7c 00 c2 [ 6 ] INC YFLAG 3302 f618 81 00 [ 2 ] DOYLI1 CMPA #IMMED 3303 f61a 26 04 [ 3 ] BNE DOYLI2 3304 f61c 86 03 [ 2 ] LDAA #LIMMED 3305 f61e 97 c1 [ 3 ] STAA AMODE 3306 f620 86 18 [ 2 ] DOYLI2 LDAA #PAGE2 3307 f622 97 c3 [ 3 ] STAA PNORM 3308 f624 97 b5 [ 3 ] STAA PY 3309 f626 86 1a [ 2 ] LDAA #PAGE3 3310 f628 97 b4 [ 3 ] STAA PX 3311 f62a bd f6 ca [ 6 ] JSR DOGEN 3312 f62d 39 [ 5 ] RTS 3313 3314 * case BTB: /* bset, bclr */ 3315 * case SETCLR: a = bitop(baseop,amode,class); 3316 * if(a=0) return(a = 3); 3317 * if( amode == INDY ) 3318 * emit(PAGE2); 3319 * amode = INDX; 3320 3321 f62e DOBTB EQU * 3322 f62e bd f6 a4 [ 6 ] DOSET JSR BITOP 3323 f631 81 00 [ 2 ] CMPA #$00 3324 f633 26 03 [ 3 ] BNE DOSET1 3325 f635 86 03 [ 2 ] LDAA #$3 "illegal bit op" 3326 f637 39 [ 5 ] RTS 3327 f638 96 c1 [ 3 ] DOSET1 LDAA AMODE 3328 f63a 81 02 [ 2 ] CMPA #INDY 3329 f63c 26 09 [ 3 ] BNE DOSET2 3330 f63e 86 18 [ 2 ] LDAA #PAGE2 3331 f640 bd f7 b7 [ 6 ] JSR EMIT 3332 f643 86 01 [ 2 ] LDAA #INDX 3333 f645 97 c1 [ 3 ] STAA AMODE 3334 f647 DOSET2 EQU * 3335 3336 * emit(baseop); 3337 * a = assarg(); 3338 * if(a = 4) return(a); 3339 * emit(index offset); 3340 * if( amode == INDX ) 3341 * Buffptr += 2; /* skip ,x or ,y */ 3342 3343 f647 96 b6 [ 3 ] LDAA BASEOP 3344 f649 bd f7 b7 [ 6 ] JSR EMIT 3345 f64c bd f7 99 [ 6 ] JSR ASSARG 3346 f64f 81 04 [ 2 ] CMPA #$04 3347 f651 26 01 [ 3 ] BNE DOSET22 jump if arg ok 3348 f653 39 [ 5 ] RTS 3349 f654 96 95 [ 3 ] DOSET22 LDAA SHFTREG+1 index offset 3350 f656 bd f7 b7 [ 6 ] JSR EMIT 3351 f659 96 c1 [ 3 ] LDAA AMODE 3352 f65b 81 01 [ 2 ] CMPA #INDX 3353 f65d 26 06 [ 3 ] BNE DOSET3 3354 f65f bd e2 e3 [ 6 ] JSR INCBUFF 3355 f662 bd e2 e3 [ 6 ] JSR INCBUFF 3356 f665 DOSET3 EQU * 3357 3358 * a = assarg(); 3359 * if(a = 4) return(a); 3360 * emit(mask); /* mask */ 3361 * if( class == SETCLR ) 3362 * return; 3363 3364 f665 bd f7 99 [ 6 ] JSR ASSARG 3365 f668 81 04 [ 2 ] CMPA #$04 3366 f66a 26 01 [ 3 ] BNE DOSET33 jump if arg ok 3367 f66c 39 [ 5 ] RTS 3368 f66d 96 95 [ 3 ] DOSET33 LDAA SHFTREG+1 mask 3369 f66f bd f7 b7 [ 6 ] JSR EMIT 3370 f672 96 b7 [ 3 ] LDAA CLASS 3371 f674 81 14 [ 2 ] CMPA #SETCLR 3372 f676 26 02 [ 3 ] BNE DOSET4 3373 f678 4f [ 2 ] CLRA 3374 f679 39 [ 5 ] RTS 3375 f67a DOSET4 EQU * 3376 3377 * a = assarg(); 3378 * if(a = 4) return(a); 3379 * d = (pc+1) - shftreg; 3380 * if ($7f >= d >= $ff82) 3381 * return (out of range); 3382 * emit(branch offset); 3383 * return(0); 3384 3385 f67a bd f7 99 [ 6 ] JSR ASSARG 3386 f67d 81 04 [ 2 ] CMPA #$04 3387 f67f 26 01 [ 3 ] BNE DOSET5 jump if arg ok 3388 f681 39 [ 5 ] RTS 3389 f682 de b2 [ 4 ] DOSET5 LDX PC program counter 3390 f684 08 [ 3 ] INX point to next inst 3391 f685 df ba [ 4 ] STX BRADDR save pc value 3392 f687 dc 94 [ 4 ] LDD SHFTREG get branch address 3393 f689 93 ba [ 5 ] SUBD BRADDR calculate offset 3394 f68b 1a 83 00 7f [ 5 ] CMPD #$7F 3395 f68f 23 0d [ 3 ] BLS DOSET6 jump if in range 3396 f691 1a 83 ff 80 [ 5 ] CMPD #$FF80 3397 f695 24 07 [ 3 ] BHS DOSET6 jump if in range 3398 f697 4f [ 2 ] CLRA 3399 f698 bd f7 b7 [ 6 ] JSR EMIT 3400 f69b 86 09 [ 2 ] LDAA #$09 'out of range' 3401 f69d 39 [ 5 ] RTS 3402 f69e 17 [ 2 ] DOSET6 TBA offset 3403 f69f bd f7 b7 [ 6 ] JSR EMIT 3404 f6a2 4f [ 2 ] CLRA 3405 f6a3 39 [ 5 ] RTS 3406 3407 3408 ********** 3409 ** bitop(baseop,amode,class) --- adjust opcode on bit 3410 ** manipulation instructions. Returns opcode in a 3411 ** or a = 0 if error 3412 ********** 3413 *if( amode == INDX || amode == INDY ) return(op); 3414 *if( class == SETCLR ) return(op-8); 3415 *else if(class==BTB) return(op-12); 3416 *else fatal("bitop"); 3417 3418 f6a4 BITOP EQU * 3419 f6a4 96 c1 [ 3 ] LDAA AMODE 3420 f6a6 d6 b7 [ 3 ] LDAB CLASS 3421 f6a8 81 01 [ 2 ] CMPA #INDX 3422 f6aa 26 01 [ 3 ] BNE BITOP1 3423 f6ac 39 [ 5 ] RTS 3424 f6ad 81 02 [ 2 ] BITOP1 CMPA #INDY 3425 f6af 26 01 [ 3 ] BNE BITOP2 jump not indexed 3426 f6b1 39 [ 5 ] RTS 3427 f6b2 c1 14 [ 2 ] BITOP2 CMPB #SETCLR 3428 f6b4 26 07 [ 3 ] BNE BITOP3 jump not bset,bclr 3429 f6b6 96 b6 [ 3 ] LDAA BASEOP get opcode 3430 f6b8 80 08 [ 2 ] SUBA #8 3431 f6ba 97 b6 [ 3 ] STAA BASEOP 3432 f6bc 39 [ 5 ] RTS 3433 f6bd c1 13 [ 2 ] BITOP3 CMPB #BTB 3434 f6bf 26 07 [ 3 ] BNE BITOP4 jump not bit branch 3435 f6c1 96 b6 [ 3 ] LDAA BASEOP get opcode 3436 f6c3 80 0c [ 2 ] SUBA #12 3437 f6c5 97 b6 [ 3 ] STAA BASEOP 3438 f6c7 39 [ 5 ] RTS 3439 f6c8 4f [ 2 ] BITOP4 CLRA 0 = fatal bitop 3440 f6c9 39 [ 5 ] RTS 3441 3442 ********** 3443 ** dogen(baseop,mode,pnorm,px,py) - process 3444 ** general addressing modes. Returns a = error #. 3445 ********** 3446 *pnorm = page for normal addressing modes: IMM,DIR,EXT 3447 *px = page for INDX addressing 3448 *py = page for INDY addressing 3449 *switch(amode) 3450 f6ca 96 c1 [ 3 ] DOGEN LDAA AMODE 3451 f6cc 81 03 [ 2 ] CMPA #LIMMED 3452 f6ce 27 13 [ 3 ] BEQ DOGLIM 3453 f6d0 81 00 [ 2 ] CMPA #IMMED 3454 f6d2 27 2c [ 3 ] BEQ DOGIMM 3455 f6d4 81 02 [ 2 ] CMPA #INDY 3456 f6d6 27 41 [ 3 ] BEQ DOGINDY 3457 f6d8 81 01 [ 2 ] CMPA #INDX 3458 f6da 27 4c [ 3 ] BEQ DOGINDX 3459 f6dc 81 04 [ 2 ] CMPA #OTHER 3460 f6de 27 57 [ 3 ] BEQ DOGOTH 3461 3462 *default: error("Unknown Addressing Mode"); 3463 3464 f6e0 86 06 [ 2 ] DOGDEF LDAA #$06 unknown addre... 3465 f6e2 39 [ 5 ] RTS 3466 3467 *case LIMMED: epage(pnorm); 3468 * emit(baseop); 3469 * a = assarg(); 3470 * if(a = 4) return(a); 3471 * emit(2 bytes); 3472 * return(0); 3473 3474 f6e3 96 c3 [ 3 ] DOGLIM LDAA PNORM 3475 f6e5 bd f7 af [ 6 ] JSR EPAGE 3476 f6e8 96 b6 [ 3 ] DOGLIM1 LDAA BASEOP 3477 f6ea bd f7 b7 [ 6 ] JSR EMIT 3478 f6ed bd f7 99 [ 6 ] JSR ASSARG get next argument 3479 f6f0 81 04 [ 2 ] CMPA #$04 3480 f6f2 26 01 [ 3 ] BNE DOGLIM2 jump if arg ok 3481 f6f4 39 [ 5 ] RTS 3482 f6f5 dc 94 [ 4 ] DOGLIM2 LDD SHFTREG 3483 f6f7 bd f7 b7 [ 6 ] JSR EMIT 3484 f6fa 17 [ 2 ] TBA 3485 f6fb bd f7 b7 [ 6 ] JSR EMIT 3486 f6fe 4f [ 2 ] CLRA 3487 f6ff 39 [ 5 ] RTS 3488 3489 *case IMMED: epage(pnorm); 3490 * emit(baseop); 3491 * a = assarg(); 3492 * if(a = 4) return(a); 3493 * emit(lobyte); 3494 * return(0); 3495 3496 f700 96 c3 [ 3 ] DOGIMM LDAA PNORM 3497 f702 bd f7 af [ 6 ] JSR EPAGE 3498 f705 96 b6 [ 3 ] LDAA BASEOP 3499 f707 bd f7 b7 [ 6 ] JSR EMIT 3500 f70a bd f7 99 [ 6 ] JSR ASSARG 3501 f70d 81 04 [ 2 ] CMPA #$04 3502 f70f 26 01 [ 3 ] BNE DOGIMM1 jump if arg ok 3503 f711 39 [ 5 ] RTS 3504 f712 96 95 [ 3 ] DOGIMM1 LDAA SHFTREG+1 3505 f714 bd f7 b7 [ 6 ] JSR EMIT 3506 f717 4f [ 2 ] CLRA 3507 f718 39 [ 5 ] RTS 3508 3509 *case INDY: epage(py); 3510 * a=doindex(op+0x20); 3511 * return(a); 3512 3513 f719 96 b5 [ 3 ] DOGINDY LDAA PY 3514 f71b bd f7 af [ 6 ] JSR EPAGE 3515 f71e 96 b6 [ 3 ] LDAA BASEOP 3516 f720 8b 20 [ 2 ] ADDA #$20 3517 f722 97 b6 [ 3 ] STAA BASEOP 3518 f724 bd f7 6a [ 6 ] JSR DOINDEX 3519 f727 39 [ 5 ] RTS 3520 3521 *case INDX: epage(px); 3522 * a=doindex(op+0x20); 3523 * return(a); 3524 3525 f728 96 b4 [ 3 ] DOGINDX LDAA PX 3526 f72a bd f7 af [ 6 ] JSR EPAGE 3527 f72d 96 b6 [ 3 ] LDAA BASEOP 3528 f72f 8b 20 [ 2 ] ADDA #$20 3529 f731 97 b6 [ 3 ] STAA BASEOP 3530 f733 bd f7 6a [ 6 ] JSR DOINDEX 3531 f736 39 [ 5 ] RTS 3532 3533 *case OTHER: a = assarg(); 3534 * if(a = 4) return(a); 3535 * epage(pnorm); 3536 * if(countu1 <= 2 digits) /* direct */ 3537 * emit(op+0x10); 3538 * emit(lobyte(Result)); 3539 * return(0); 3540 * else emit(op+0x30); /* extended */ 3541 * eword(Result); 3542 * return(0) 3543 3544 f737 bd f7 99 [ 6 ] DOGOTH JSR ASSARG 3545 f73a 81 04 [ 2 ] CMPA #$04 3546 f73c 26 01 [ 3 ] BNE DOGOTH0 jump if arg ok 3547 f73e 39 [ 5 ] RTS 3548 f73f 96 c3 [ 3 ] DOGOTH0 LDAA PNORM 3549 f741 bd f7 af [ 6 ] JSR EPAGE 3550 f744 96 ad [ 3 ] LDAA COUNT 3551 f746 81 02 [ 2 ] CMPA #$2 3552 f748 2e 0e [ 3 ] BGT DOGOTH1 3553 f74a 96 b6 [ 3 ] LDAA BASEOP 3554 f74c 8b 10 [ 2 ] ADDA #$10 direct mode opcode 3555 f74e bd f7 b7 [ 6 ] JSR EMIT 3556 f751 96 95 [ 3 ] LDAA SHFTREG+1 3557 f753 bd f7 b7 [ 6 ] JSR EMIT 3558 f756 4f [ 2 ] CLRA 3559 f757 39 [ 5 ] RTS 3560 f758 96 b6 [ 3 ] DOGOTH1 LDAA BASEOP 3561 f75a 8b 30 [ 2 ] ADDA #$30 extended mode opcode 3562 f75c bd f7 b7 [ 6 ] JSR EMIT 3563 f75f dc 94 [ 4 ] LDD SHFTREG 3564 f761 bd f7 b7 [ 6 ] JSR EMIT 3565 f764 17 [ 2 ] TBA 3566 f765 bd f7 b7 [ 6 ] JSR EMIT 3567 f768 4f [ 2 ] CLRA 3568 f769 39 [ 5 ] RTS 3569 3570 ********** 3571 ** doindex(op) --- handle all wierd stuff for 3572 ** indexed addressing. Returns a = error number. 3573 ********** 3574 *emit(baseop); 3575 *a=assarg(); 3576 *if(a = 4) return(a); 3577 *if( a != ',' ) return("Syntax"); 3578 *buffptr++ 3579 *a=readbuff() 3580 *if( a != 'x' && != 'y') warn("Ind Addr Assumed"); 3581 *emit(lobyte); 3582 *return(0); 3583 3584 f76a 96 b6 [ 3 ] DOINDEX LDAA BASEOP 3585 f76c bd f7 b7 [ 6 ] JSR EMIT 3586 f76f bd f7 99 [ 6 ] JSR ASSARG 3587 f772 81 04 [ 2 ] CMPA #$04 3588 f774 26 01 [ 3 ] BNE DOINDX0 jump if arg ok 3589 f776 39 [ 5 ] RTS 3590 f777 81 2c [ 2 ] DOINDX0 CMPA #',' 3591 f779 27 03 [ 3 ] BEQ DOINDX1 3592 f77b 86 08 [ 2 ] LDAA #$08 "syntax error" 3593 f77d 39 [ 5 ] RTS 3594 f77e bd e2 e3 [ 6 ] DOINDX1 JSR INCBUFF 3595 f781 bd e2 dc [ 6 ] JSR READBUFF 3596 f784 81 59 [ 2 ] CMPA #'Y' 3597 f786 27 0a [ 3 ] BEQ DOINDX2 3598 f788 81 58 [ 2 ] CMPA #'X' 3599 f78a 27 06 [ 3 ] BEQ DOINDX2 3600 f78c fe f2 cb [ 5 ] LDX MSGA7 "index addr assumed" 3601 f78f bd e4 fa [ 6 ] JSR OUTSTRG 3602 f792 96 95 [ 3 ] DOINDX2 LDAA SHFTREG+1 3603 f794 bd f7 b7 [ 6 ] JSR EMIT 3604 f797 4f [ 2 ] CLRA 3605 f798 39 [ 5 ] RTS 3606 3607 ********** 3608 ** assarg(); - get argument. Returns a = 4 if bad 3609 ** argument, else a = first non hex char. 3610 ********** 3611 *a = buffarg() 3612 *if(asschk(aa) && countu1 != 0) return(a); 3613 *return(bad argument); 3614 3615 f799 bd e2 1c [ 6 ] ASSARG JSR BUFFARG 3616 f79c bd f4 51 [ 6 ] JSR ASSCHEK check for command 3617 f79f 27 05 [ 3 ] BEQ ASSARG1 jump if ok 3618 f7a1 bd e2 ff [ 6 ] JSR WCHEK check for whitespace 3619 f7a4 26 06 [ 3 ] BNE ASSARG2 jump if not ok 3620 f7a6 7d 00 ad [ 6 ] ASSARG1 TST COUNT 3621 f7a9 27 01 [ 3 ] BEQ ASSARG2 jump if no argument 3622 f7ab 39 [ 5 ] RTS 3623 f7ac 86 04 [ 2 ] ASSARG2 LDAA #$04 bad argument 3624 f7ae 39 [ 5 ] RTS 3625 3626 ********** 3627 ** epage(a) --- emit page prebyte 3628 ********** 3629 *if( a != PAGE1 ) emit(a); 3630 3631 f7af 81 00 [ 2 ] EPAGE CMPA #PAGE1 3632 f7b1 27 03 [ 3 ] BEQ EPAGRT jump if page 1 3633 f7b3 bd f7 b7 [ 6 ] JSR EMIT 3634 f7b6 39 [ 5 ] EPAGRT RTS 3635 3636 ********** 3637 * emit(a) --- emit contents of a 3638 ********** 3639 f7b7 de b2 [ 4 ] EMIT LDX PC 3640 f7b9 a7 00 [ 4 ] STAA 0,X 3641 f7bb bd e4 e4 [ 6 ] JSR OUT1BSP 3642 f7be df b2 [ 4 ] STX PC 3643 f7c0 39 [ 5 ] RTS 3644 3645 *Mnemonic table for hc11 line assembler 3646 0000 NULL EQU $0 nothing 3647 0001 INH EQU $1 inherent 3648 0002 P2INH EQU $2 page 2 inherent 3649 0003 GEN EQU $3 general addressing 3650 0004 GRP2 EQU $4 group 2 3651 0005 REL EQU $5 relative 3652 0006 IMM EQU $6 immediate 3653 0007 NIMM EQU $7 general except for immediate 3654 0008 LIMM EQU $8 2 byte immediate 3655 0009 XLIMM EQU $9 longimm for x 3656 0010 XNIMM EQU $10 no immediate for x 3657 0011 YLIMM EQU $11 longimm for y 3658 0012 YNIMM EQU $12 no immediate for y 3659 0013 BTB EQU $13 bit test and branch 3660 0014 SETCLR EQU $14 bit set or clear 3661 0015 CPD EQU $15 compare d 3662 0016 BTBD EQU $16 bit test and branch direct 3663 0017 SETCLRD EQU $17 bit set or clear direct 3664 3665 ********** 3666 * mnetabl - includes all '11 mnemonics, base opcodes, 3667 * and type of instruction. The assembler search routine 3668 *depends on 4 characters for each mnemonic so that 3 char 3669 *mnemonics are extended with a space and 5 char mnemonics 3670 *are truncated. 3671 ********** 3672 3673 f7c1 MNETABL EQU * 3674 f7c1 41 42 41 20 FCC 'ABA ' Mnemonic 3675 f7c5 1b FCB $1B Base opcode 3676 f7c6 01 FCB INH Class 3677 f7c7 41 42 58 20 FCC 'ABX ' 3678 f7cb 3a FCB $3A 3679 f7cc 01 FCB INH 3680 f7cd 41 42 59 20 FCC 'ABY ' 3681 f7d1 3a FCB $3A 3682 f7d2 02 FCB P2INH 3683 f7d3 41 44 43 41 FCC 'ADCA' 3684 f7d7 89 FCB $89 3685 f7d8 03 FCB GEN 3686 f7d9 41 44 43 42 FCC 'ADCB' 3687 f7dd c9 FCB $C9 3688 f7de 03 FCB GEN 3689 f7df 41 44 44 41 FCC 'ADDA' 3690 f7e3 8b FCB $8B 3691 f7e4 03 FCB GEN 3692 f7e5 41 44 44 42 FCC 'ADDB' 3693 f7e9 cb FCB $CB 3694 f7ea 03 FCB GEN 3695 f7eb 41 44 44 44 FCC 'ADDD' 3696 f7ef c3 FCB $C3 3697 f7f0 08 FCB LIMM 3698 f7f1 41 4e 44 41 FCC 'ANDA' 3699 f7f5 84 FCB $84 3700 f7f6 03 FCB GEN 3701 f7f7 41 4e 44 42 FCC 'ANDB' 3702 f7fb c4 FCB $C4 3703 f7fc 03 FCB GEN 3704 f7fd 41 53 4c 20 FCC 'ASL ' 3705 f801 68 FCB $68 3706 f802 04 FCB GRP2 3707 f803 41 53 4c 41 FCC 'ASLA' 3708 f807 48 FCB $48 3709 f808 01 FCB INH 3710 f809 41 53 4c 42 FCC 'ASLB' 3711 f80d 58 FCB $58 3712 f80e 01 FCB INH 3713 f80f 41 53 4c 44 FCC 'ASLD' 3714 f813 05 FCB $05 3715 f814 01 FCB INH 3716 f815 41 53 52 20 FCC 'ASR ' 3717 f819 67 FCB $67 3718 f81a 04 FCB GRP2 3719 f81b 41 53 52 41 FCC 'ASRA' 3720 f81f 47 FCB $47 3721 f820 01 FCB INH 3722 f821 41 53 52 42 FCC 'ASRB' 3723 f825 57 FCB $57 3724 f826 01 FCB INH 3725 f827 42 43 43 20 FCC 'BCC ' 3726 f82b 24 FCB $24 3727 f82c 05 FCB REL 3728 f82d 42 43 4c 52 FCC 'BCLR' 3729 f831 1d FCB $1D 3730 f832 14 FCB SETCLR 3731 f833 42 43 53 20 FCC 'BCS ' 3732 f837 25 FCB $25 3733 f838 05 FCB REL 3734 f839 42 45 51 20 FCC 'BEQ ' 3735 f83d 27 FCB $27 3736 f83e 05 FCB REL 3737 f83f 42 47 45 20 FCC 'BGE ' 3738 f843 2c FCB $2C 3739 f844 05 FCB REL 3740 f845 42 47 54 20 FCC 'BGT ' 3741 f849 2e FCB $2E 3742 f84a 05 FCB REL 3743 f84b 42 48 49 20 FCC 'BHI ' 3744 f84f 22 FCB $22 3745 f850 05 FCB REL 3746 f851 42 48 53 20 FCC 'BHS ' 3747 f855 24 FCB $24 3748 f856 05 FCB REL 3749 f857 42 49 54 41 FCC 'BITA' 3750 f85b 85 FCB $85 3751 f85c 03 FCB GEN 3752 f85d 42 49 54 42 FCC 'BITB' 3753 f861 c5 FCB $C5 3754 f862 03 FCB GEN 3755 f863 42 4c 45 20 FCC 'BLE ' 3756 f867 2f FCB $2F 3757 f868 05 FCB REL 3758 f869 42 4c 4f 20 FCC 'BLO ' 3759 f86d 25 FCB $25 3760 f86e 05 FCB REL 3761 f86f 42 4c 53 20 FCC 'BLS ' 3762 f873 23 FCB $23 3763 f874 05 FCB REL 3764 f875 42 4c 54 20 FCC 'BLT ' 3765 f879 2d FCB $2D 3766 f87a 05 FCB REL 3767 f87b 42 4d 49 20 FCC 'BMI ' 3768 f87f 2b FCB $2B 3769 f880 05 FCB REL 3770 f881 42 4e 45 20 FCC 'BNE ' 3771 f885 26 FCB $26 3772 f886 05 FCB REL 3773 f887 42 50 4c 20 FCC 'BPL ' 3774 f88b 2a FCB $2A 3775 f88c 05 FCB REL 3776 f88d 42 52 41 20 FCC 'BRA ' 3777 f891 20 FCB $20 3778 f892 05 FCB REL 3779 f893 42 52 43 4c FCC 'BRCL' (BRCLR) 3780 f897 1f FCB $1F 3781 f898 13 FCB BTB 3782 f899 42 52 4e 20 FCC 'BRN ' 3783 f89d 21 FCB $21 3784 f89e 05 FCB REL 3785 f89f 42 52 53 45 FCC 'BRSE' (BRSET) 3786 f8a3 1e FCB $1E 3787 f8a4 13 FCB BTB 3788 f8a5 42 53 45 54 FCC 'BSET' 3789 f8a9 1c FCB $1C 3790 f8aa 14 FCB SETCLR 3791 f8ab 42 53 52 20 FCC 'BSR ' 3792 f8af 8d FCB $8D 3793 f8b0 05 FCB REL 3794 f8b1 42 56 43 20 FCC 'BVC ' 3795 f8b5 28 FCB $28 3796 f8b6 05 FCB REL 3797 f8b7 42 56 53 20 FCC 'BVS ' 3798 f8bb 29 FCB $29 3799 f8bc 05 FCB REL 3800 f8bd 43 42 41 20 FCC 'CBA ' 3801 f8c1 11 FCB $11 3802 f8c2 01 FCB INH 3803 f8c3 43 4c 43 20 FCC 'CLC ' 3804 f8c7 0c FCB $0C 3805 f8c8 01 FCB INH 3806 f8c9 43 4c 49 20 FCC 'CLI ' 3807 f8cd 0e FCB $0E 3808 f8ce 01 FCB INH 3809 f8cf 43 4c 52 20 FCC 'CLR ' 3810 f8d3 6f FCB $6F 3811 f8d4 04 FCB GRP2 3812 f8d5 43 4c 52 41 FCC 'CLRA' 3813 f8d9 4f FCB $4F 3814 f8da 01 FCB INH 3815 f8db 43 4c 52 42 FCC 'CLRB' 3816 f8df 5f FCB $5F 3817 f8e0 01 FCB INH 3818 f8e1 43 4c 56 20 FCC 'CLV ' 3819 f8e5 0a FCB $0A 3820 f8e6 01 FCB INH 3821 f8e7 43 4d 50 41 FCC 'CMPA' 3822 f8eb 81 FCB $81 3823 f8ec 03 FCB GEN 3824 f8ed 43 4d 50 42 FCC 'CMPB' 3825 f8f1 c1 FCB $C1 3826 f8f2 03 FCB GEN 3827 f8f3 43 4f 4d 20 FCC 'COM ' 3828 f8f7 63 FCB $63 3829 f8f8 04 FCB GRP2 3830 f8f9 43 4f 4d 41 FCC 'COMA' 3831 f8fd 43 FCB $43 3832 f8fe 01 FCB INH 3833 f8ff 43 4f 4d 42 FCC 'COMB' 3834 f903 53 FCB $53 3835 f904 01 FCB INH 3836 f905 43 50 44 20 FCC 'CPD ' 3837 f909 83 FCB $83 3838 f90a 15 FCB CPD 3839 f90b 43 50 58 20 FCC 'CPX ' 3840 f90f 8c FCB $8C 3841 f910 09 FCB XLIMM 3842 f911 43 50 59 20 FCC 'CPY ' 3843 f915 8c FCB $8C 3844 f916 11 FCB YLIMM 3845 f917 44 41 41 20 FCC 'DAA ' 3846 f91b 19 FCB $19 3847 f91c 01 FCB INH 3848 f91d 44 45 43 20 FCC 'DEC ' 3849 f921 6a FCB $6A 3850 f922 04 FCB GRP2 3851 f923 44 45 43 41 FCC 'DECA' 3852 f927 4a FCB $4A 3853 f928 01 FCB INH 3854 f929 44 45 43 42 FCC 'DECB' 3855 f92d 5a FCB $5A 3856 f92e 01 FCB INH 3857 f92f 44 45 53 20 FCC 'DES ' 3858 f933 34 FCB $34 3859 f934 01 FCB INH 3860 f935 44 45 58 20 FCC 'DEX ' 3861 f939 09 FCB $09 3862 f93a 01 FCB INH 3863 f93b 44 45 59 20 FCC 'DEY ' 3864 f93f 09 FCB $09 3865 f940 02 FCB P2INH 3866 f941 45 4f 52 41 FCC 'EORA' 3867 f945 88 FCB $88 3868 f946 03 FCB GEN 3869 f947 45 4f 52 42 FCC 'EORB' 3870 f94b c8 FCB $C8 3871 f94c 03 FCB GEN 3872 f94d 46 44 49 56 FCC 'FDIV' 3873 f951 03 FCB $03 3874 f952 01 FCB INH 3875 f953 49 44 49 56 FCC 'IDIV' 3876 f957 02 FCB $02 3877 f958 01 FCB INH 3878 f959 49 4e 43 20 FCC 'INC ' 3879 f95d 6c FCB $6C 3880 f95e 04 FCB GRP2 3881 f95f 49 4e 43 41 FCC 'INCA' 3882 f963 4c FCB $4C 3883 f964 01 FCB INH 3884 f965 49 4e 43 42 FCC 'INCB' 3885 f969 5c FCB $5C 3886 f96a 01 FCB INH 3887 f96b 49 4e 53 20 FCC 'INS ' 3888 f96f 31 FCB $31 3889 f970 01 FCB INH 3890 f971 49 4e 58 20 FCC 'INX ' 3891 f975 08 FCB $08 3892 f976 01 FCB INH 3893 f977 49 4e 59 20 FCC 'INY ' 3894 f97b 08 FCB $08 3895 f97c 02 FCB P2INH 3896 f97d 4a 4d 50 20 FCC 'JMP ' 3897 f981 6e FCB $6E 3898 f982 04 FCB GRP2 3899 f983 4a 53 52 20 FCC 'JSR ' 3900 f987 8d FCB $8D 3901 f988 07 FCB NIMM 3902 f989 4c 44 41 41 FCC 'LDAA' 3903 f98d 86 FCB $86 3904 f98e 03 FCB GEN 3905 f98f 4c 44 41 42 FCC 'LDAB' 3906 f993 c6 FCB $C6 3907 f994 03 FCB GEN 3908 f995 4c 44 44 20 FCC 'LDD ' 3909 f999 cc FCB $CC 3910 f99a 08 FCB LIMM 3911 f99b 4c 44 53 20 FCC 'LDS ' 3912 f99f 8e FCB $8E 3913 f9a0 08 FCB LIMM 3914 f9a1 4c 44 58 20 FCC 'LDX ' 3915 f9a5 ce FCB $CE 3916 f9a6 09 FCB XLIMM 3917 f9a7 4c 44 59 20 FCC 'LDY ' 3918 f9ab ce FCB $CE 3919 f9ac 11 FCB YLIMM 3920 f9ad 4c 53 4c 20 FCC 'LSL ' 3921 f9b1 68 FCB $68 3922 f9b2 04 FCB GRP2 3923 f9b3 4c 53 4c 41 FCC 'LSLA' 3924 f9b7 48 FCB $48 3925 f9b8 01 FCB INH 3926 f9b9 4c 53 4c 42 FCC 'LSLB' 3927 f9bd 58 FCB $58 3928 f9be 01 FCB INH 3929 f9bf 4c 53 4c 44 FCC 'LSLD' 3930 f9c3 05 FCB $05 3931 f9c4 01 FCB INH 3932 f9c5 4c 53 52 20 FCC 'LSR ' 3933 f9c9 64 FCB $64 3934 f9ca 04 FCB GRP2 3935 f9cb 4c 53 52 41 FCC 'LSRA' 3936 f9cf 44 FCB $44 3937 f9d0 01 FCB INH 3938 f9d1 4c 53 52 42 FCC 'LSRB' 3939 f9d5 54 FCB $54 3940 f9d6 01 FCB INH 3941 f9d7 4c 53 52 44 FCC 'LSRD' 3942 f9db 04 FCB $04 3943 f9dc 01 FCB INH 3944 f9dd 4d 55 4c 20 FCC 'MUL ' 3945 f9e1 3d FCB $3D 3946 f9e2 01 FCB INH 3947 f9e3 4e 45 47 20 FCC 'NEG ' 3948 f9e7 60 FCB $60 3949 f9e8 04 FCB GRP2 3950 f9e9 4e 45 47 41 FCC 'NEGA' 3951 f9ed 40 FCB $40 3952 f9ee 01 FCB INH 3953 f9ef 4e 45 47 42 FCC 'NEGB' 3954 f9f3 50 FCB $50 3955 f9f4 01 FCB INH 3956 f9f5 4e 4f 50 20 FCC 'NOP ' 3957 f9f9 01 FCB $01 3958 f9fa 01 FCB INH 3959 f9fb 4f 52 41 41 FCC 'ORAA' 3960 f9ff 8a FCB $8A 3961 fa00 03 FCB GEN 3962 fa01 4f 52 41 42 FCC 'ORAB' 3963 fa05 ca FCB $CA 3964 fa06 03 FCB GEN 3965 fa07 50 53 48 41 FCC 'PSHA' 3966 fa0b 36 FCB $36 3967 fa0c 01 FCB INH 3968 fa0d 50 53 48 42 FCC 'PSHB' 3969 fa11 37 FCB $37 3970 fa12 01 FCB INH 3971 fa13 50 53 48 58 FCC 'PSHX' 3972 fa17 3c FCB $3C 3973 fa18 01 FCB INH 3974 fa19 50 53 48 59 FCC 'PSHY' 3975 fa1d 3c FCB $3C 3976 fa1e 02 FCB P2INH 3977 fa1f 50 55 4c 41 FCC 'PULA' 3978 fa23 32 FCB $32 3979 fa24 01 FCB INH 3980 fa25 50 55 4c 42 FCC 'PULB' 3981 fa29 33 FCB $33 3982 fa2a 01 FCB INH 3983 fa2b 50 55 4c 58 FCC 'PULX' 3984 fa2f 38 FCB $38 3985 fa30 01 FCB INH 3986 fa31 50 55 4c 59 FCC 'PULY' 3987 fa35 38 FCB $38 3988 fa36 02 FCB P2INH 3989 fa37 52 4f 4c 20 FCC 'ROL ' 3990 fa3b 69 FCB $69 3991 fa3c 04 FCB GRP2 3992 fa3d 52 4f 4c 41 FCC 'ROLA' 3993 fa41 49 FCB $49 3994 fa42 01 FCB INH 3995 fa43 52 4f 4c 42 FCC 'ROLB' 3996 fa47 59 FCB $59 3997 fa48 01 FCB INH 3998 fa49 52 4f 52 20 FCC 'ROR ' 3999 fa4d 66 FCB $66 4000 fa4e 04 FCB GRP2 4001 fa4f 52 4f 52 41 FCC 'RORA' 4002 fa53 46 FCB $46 4003 fa54 01 FCB INH 4004 fa55 52 4f 52 42 FCC 'RORB' 4005 fa59 56 FCB $56 4006 fa5a 01 FCB INH 4007 fa5b 52 54 49 20 FCC 'RTI ' 4008 fa5f 3b FCB $3B 4009 fa60 01 FCB INH 4010 fa61 52 54 53 20 FCC 'RTS ' 4011 fa65 39 FCB $39 4012 fa66 01 FCB INH 4013 fa67 53 42 41 20 FCC 'SBA ' 4014 fa6b 10 FCB $10 4015 fa6c 01 FCB INH 4016 fa6d 53 42 43 41 FCC 'SBCA' 4017 fa71 82 FCB $82 4018 fa72 03 FCB GEN 4019 fa73 53 42 43 42 FCC 'SBCB' 4020 fa77 c2 FCB $C2 4021 fa78 03 FCB GEN 4022 fa79 53 45 43 20 FCC 'SEC ' 4023 fa7d 0d FCB $0D 4024 fa7e 01 FCB INH 4025 fa7f 53 45 49 20 FCC 'SEI ' 4026 fa83 0f FCB $0F 4027 fa84 01 FCB INH 4028 fa85 53 45 56 20 FCC 'SEV ' 4029 fa89 0b FCB $0B 4030 fa8a 01 FCB INH 4031 fa8b 53 54 41 41 FCC 'STAA' 4032 fa8f 87 FCB $87 4033 fa90 07 FCB NIMM 4034 fa91 53 54 41 42 FCC 'STAB' 4035 fa95 c7 FCB $C7 4036 fa96 07 FCB NIMM 4037 fa97 53 54 44 20 FCC 'STD ' 4038 fa9b cd FCB $CD 4039 fa9c 07 FCB NIMM 4040 fa9d 53 54 4f 50 FCC 'STOP' 4041 faa1 cf FCB $CF 4042 faa2 01 FCB INH 4043 faa3 53 54 53 20 FCC 'STS ' 4044 faa7 8f FCB $8F 4045 faa8 07 FCB NIMM 4046 faa9 53 54 58 20 FCC 'STX ' 4047 faad cf FCB $CF 4048 faae 10 FCB XNIMM 4049 faaf 53 54 59 20 FCC 'STY ' 4050 fab3 cf FCB $CF 4051 fab4 12 FCB YNIMM 4052 fab5 53 55 42 41 FCC 'SUBA' 4053 fab9 80 FCB $80 4054 faba 03 FCB GEN 4055 fabb 53 55 42 42 FCC 'SUBB' 4056 fabf c0 FCB $C0 4057 fac0 03 FCB GEN 4058 fac1 53 55 42 44 FCC 'SUBD' 4059 fac5 83 FCB $83 4060 fac6 08 FCB LIMM 4061 fac7 53 57 49 20 FCC 'SWI ' 4062 facb 3f FCB $3F 4063 facc 01 FCB INH 4064 facd 54 41 42 20 FCC 'TAB ' 4065 fad1 16 FCB $16 4066 fad2 01 FCB INH 4067 fad3 54 41 50 20 FCC 'TAP ' 4068 fad7 06 FCB $06 4069 fad8 01 FCB INH 4070 fad9 54 42 41 20 FCC 'TBA ' 4071 fadd 17 FCB $17 4072 fade 01 FCB INH 4073 fadf 54 50 41 20 FCC 'TPA ' 4074 fae3 07 FCB $07 4075 fae4 01 FCB INH 4076 fae5 54 45 53 54 FCC 'TEST' 4077 fae9 00 FCB $00 4078 faea 01 FCB INH 4079 faeb 54 53 54 20 FCC 'TST ' 4080 faef 6d FCB $6D 4081 faf0 04 FCB GRP2 4082 faf1 54 53 54 41 FCC 'TSTA' 4083 faf5 4d FCB $4D 4084 faf6 01 FCB INH 4085 faf7 54 53 54 42 FCC 'TSTB' 4086 fafb 5d FCB $5D 4087 fafc 01 FCB INH 4088 fafd 54 53 58 20 FCC 'TSX ' 4089 fb01 30 FCB $30 4090 fb02 01 FCB INH 4091 fb03 54 53 59 20 FCC 'TSY ' 4092 fb07 30 FCB $30 4093 fb08 02 FCB P2INH 4094 fb09 54 58 53 20 FCC 'TXS ' 4095 fb0d 35 FCB $35 4096 fb0e 01 FCB INH 4097 fb0f 54 59 53 20 FCC 'TYS ' 4098 fb13 35 FCB $35 4099 fb14 02 FCB P2INH 4100 fb15 57 41 49 20 FCC 'WAI ' 4101 fb19 3e FCB $3E 4102 fb1a 01 FCB INH 4103 fb1b 58 47 44 58 FCC 'XGDX' 4104 fb1f 8f FCB $8F 4105 fb20 01 FCB INH 4106 fb21 58 47 44 59 FCC 'XGDY' 4107 fb25 8f FCB $8F 4108 fb26 02 FCB P2INH 4109 fb27 42 52 53 45 FCC 'BRSE' bit direct modes for 4110 fb2b 12 FCB $12 disassembler. 4111 fb2c 16 FCB BTBD 4112 fb2d 42 52 43 4c FCC 'BRCL' 4113 fb31 13 FCB $13 4114 fb32 16 FCB BTBD 4115 fb33 42 53 45 54 FCC 'BSET' 4116 fb37 14 FCB $14 4117 fb38 17 FCB SETCLRD 4118 fb39 42 43 4c 52 FCC 'BCLR' 4119 fb3d 15 FCB $15 4120 fb3e 17 FCB SETCLRD 4121 fb3f 04 FCB EOT End of table 4122 4123 ********************************************** 4124 0000 PG1 EQU $0 4125 0001 PG2 EQU $1 4126 0002 PG3 EQU $2 4127 0003 PG4 EQU $3 4128 4129 ****************** 4130 *disassem() - disassemble the opcode. 4131 ****************** 4132 *(check for page prebyte) 4133 *baseop=pc[0]; 4134 *pnorm=PG1; 4135 *if(baseop==$18) pnorm=PG2; 4136 *if(baseop==$1A) pnorm=PG3; 4137 *if(baseop==$CD) pnorm=PG4; 4138 *if(pnorm != PG1) dispc=pc+1; 4139 *else dispc=pc; (dispc points to next byte) 4140 4141 fb40 DISASSM EQU * 4142 fb40 de b2 [ 4 ] LDX PC address 4143 fb42 a6 00 [ 4 ] LDAA 0,X opcode 4144 fb44 c6 00 [ 2 ] LDAB #PG1 4145 fb46 81 18 [ 2 ] CMPA #$18 4146 fb48 27 0a [ 3 ] BEQ DISP2 jump if page2 4147 fb4a 81 1a [ 2 ] CMPA #$1A 4148 fb4c 27 05 [ 3 ] BEQ DISP3 jump if page3 4149 fb4e 81 cd [ 2 ] CMPA #$CD 4150 fb50 26 04 [ 3 ] BNE DISP1 jump if not page4 4151 fb52 5c [ 2 ] DISP4 INCB set up page value 4152 fb53 5c [ 2 ] DISP3 INCB 4153 fb54 5c [ 2 ] DISP2 INCB 4154 fb55 08 [ 3 ] INX 4155 fb56 df b8 [ 4 ] DISP1 STX DISPC point to opcode 4156 fb58 d7 c3 [ 3 ] STAB PNORM save page 4157 4158 *If(opcode == ($00-$5F or $8D or $8F or $CF)) 4159 * if(pnorm == (PG3 or PG4)) 4160 * disillop(); return(); 4161 * b=disrch(opcode,NULL); 4162 * if(b==0) disillop(); return(); 4163 4164 fb5a a6 00 [ 4 ] LDAA 0,X get current opcode 4165 fb5c 97 b6 [ 3 ] STAA BASEOP 4166 fb5e 08 [ 3 ] INX 4167 fb5f df b8 [ 4 ] STX DISPC point to next byte 4168 fb61 81 5f [ 2 ] CMPA #$5F 4169 fb63 23 0f [ 3 ] BLS DIS1 jump if in range 4170 fb65 81 8d [ 2 ] CMPA #$8D 4171 fb67 27 0b [ 3 ] BEQ DIS1 jump if bsr 4172 fb69 81 8f [ 2 ] CMPA #$8F 4173 fb6b 27 07 [ 3 ] BEQ DIS1 jump if xgdx 4174 fb6d 81 cf [ 2 ] CMPA #$CF 4175 fb6f 27 03 [ 3 ] BEQ DIS1 jump if stop 4176 fb71 7e fc 0b [ 3 ] JMP DISGRP try next part of map 4177 fb74 d6 c3 [ 3 ] DIS1 LDAB PNORM 4178 fb76 c1 02 [ 2 ] CMPB #PG3 4179 fb78 25 04 [ 3 ] BLO DIS2 jump if page 1 or 2 4180 fb7a bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4181 fb7d 39 [ 5 ] RTS 4182 fb7e d6 b6 [ 3 ] DIS2 LDAB BASEOP opcode 4183 fb80 5f [ 2 ] CLRB class=null 4184 fb81 bd fc f4 [ 6 ] JSR DISRCH 4185 fb84 5d [ 2 ] TSTB 4186 fb85 26 04 [ 3 ] BNE DISPEC jump if opcode found 4187 fb87 bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4188 fb8a 39 [ 5 ] RTS 4189 4190 * if(opcode==$8D) dissrch(opcode,REL); 4191 * if(opcode==($8F or $CF)) disrch(opcode,INH); 4192 4193 fb8b 96 b6 [ 3 ] DISPEC LDAA BASEOP 4194 fb8d 81 8d [ 2 ] CMPA #$8D 4195 fb8f 26 04 [ 3 ] BNE DISPEC1 4196 fb91 c6 05 [ 2 ] LDAB #REL 4197 fb93 20 0a [ 3 ] BRA DISPEC3 look for BSR opcode 4198 fb95 81 8f [ 2 ] DISPEC1 CMPA #$8F 4199 fb97 27 04 [ 3 ] BEQ DISPEC2 jump if XGDX opcode 4200 fb99 81 cf [ 2 ] CMPA #$CF 4201 fb9b 26 05 [ 3 ] BNE DISINH jump not STOP opcode 4202 fb9d c6 01 [ 2 ] DISPEC2 LDAB #INH 4203 fb9f bd fc f4 [ 6 ] DISPEC3 JSR DISRCH find other entry in table 4204 4205 * if(class==INH) /* INH */ 4206 * if(pnorm==PG2) 4207 * b=disrch(baseop,P2INH); 4208 * if(b==0) disillop(); return(); 4209 * prntmne(); 4210 * return(); 4211 4212 fba2 DISINH EQU * 4213 fba2 d6 b7 [ 3 ] LDAB CLASS 4214 fba4 c1 01 [ 2 ] CMPB #INH 4215 fba6 26 18 [ 3 ] BNE DISREL jump if not inherent 4216 fba8 d6 c3 [ 3 ] LDAB PNORM 4217 fbaa c1 00 [ 2 ] CMPB #PG1 4218 fbac 27 0e [ 3 ] BEQ DISINH1 jump if page1 4219 fbae 96 b6 [ 3 ] LDAA BASEOP get opcode 4220 fbb0 c6 02 [ 2 ] LDAB #P2INH class=p2inh 4221 fbb2 bd fc f4 [ 6 ] JSR DISRCH 4222 fbb5 5d [ 2 ] TSTB 4223 fbb6 26 04 [ 3 ] BNE DISINH1 jump if found 4224 fbb8 bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4225 fbbb 39 [ 5 ] RTS 4226 fbbc bd fd 17 [ 6 ] DISINH1 JSR PRNTMNE 4227 fbbf 39 [ 5 ] RTS 4228 4229 * elseif(class=REL) /* REL */ 4230 * if(pnorm != PG1) 4231 * disillop(); return(); 4232 * prntmne(); 4233 * disrelad(); 4234 * return(); 4235 4236 fbc0 DISREL EQU * 4237 fbc0 d6 b7 [ 3 ] LDAB CLASS 4238 fbc2 c1 05 [ 2 ] CMPB #REL 4239 fbc4 26 10 [ 3 ] BNE DISBTD 4240 fbc6 7d 00 c3 [ 6 ] TST PNORM 4241 fbc9 27 04 [ 3 ] BEQ DISREL1 jump if page1 4242 fbcb bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4243 fbce 39 [ 5 ] RTS 4244 fbcf bd fd 17 [ 6 ] DISREL1 JSR PRNTMNE output mnemonic 4245 fbd2 bd fd 4d [ 6 ] JSR DISRELAD compute relative address 4246 fbd5 39 [ 5 ] RTS 4247 4248 * else /* SETCLR,SETCLRD,BTB,BTBD */ 4249 * if(class == (SETCLRD or BTBD)) 4250 * if(pnorm != PG1) 4251 * disillop(); return(); /* illop */ 4252 * prntmne(); /* direct */ 4253 * disdir(); /* output $byte */ 4254 * else (class == (SETCLR or BTB)) 4255 * prntmne(); /* indexed */ 4256 * disindx(); 4257 * outspac(); 4258 * disdir(); 4259 * outspac(); 4260 * if(class == (BTB or BTBD)) 4261 * disrelad(); 4262 * return(); 4263 4264 fbd6 DISBTD EQU * 4265 fbd6 d6 b7 [ 3 ] LDAB CLASS 4266 fbd8 c1 17 [ 2 ] CMPB #SETCLRD 4267 fbda 27 04 [ 3 ] BEQ DISBTD1 4268 fbdc c1 16 [ 2 ] CMPB #BTBD 4269 fbde 26 11 [ 3 ] BNE DISBIT jump not direct bitop 4270 fbe0 7d 00 c3 [ 6 ] DISBTD1 TST PNORM 4271 fbe3 27 04 [ 3 ] BEQ DISBTD2 jump if page 1 4272 fbe5 bd fd c5 [ 6 ] JSR DISILLOP 4273 fbe8 39 [ 5 ] RTS 4274 fbe9 bd fd 17 [ 6 ] DISBTD2 JSR PRNTMNE 4275 fbec bd fd a5 [ 6 ] JSR DISDIR operand(direct) 4276 fbef 20 06 [ 3 ] BRA DISBIT1 4277 fbf1 DISBIT EQU * 4278 fbf1 bd fd 17 [ 6 ] JSR PRNTMNE 4279 fbf4 bd fd 31 [ 6 ] JSR DISINDX operand(indexed) 4280 fbf7 bd e4 e7 [ 6 ] DISBIT1 JSR OUTSPAC 4281 fbfa bd fd a5 [ 6 ] JSR DISDIR mask 4282 fbfd d6 b7 [ 3 ] LDAB CLASS 4283 fbff c1 13 [ 2 ] CMPB #BTB 4284 fc01 27 04 [ 3 ] BEQ DISBIT2 jump if btb 4285 fc03 c1 16 [ 2 ] CMPB #BTBD 4286 fc05 26 03 [ 3 ] BNE DISBIT3 jump if not bit branch 4287 fc07 bd fd 4d [ 6 ] DISBIT2 JSR DISRELAD relative address 4288 fc0a 39 [ 5 ] DISBIT3 RTS 4289 4290 4291 *Elseif($60 <= opcode <= $7F) /* GRP2 */ 4292 * if(pnorm == (PG3 or PG4)) 4293 * disillop(); return(); 4294 * if((pnorm==PG2) and (opcode != $6x)) 4295 * disillop(); return(); 4296 * b=disrch(baseop & $6F,NULL); 4297 * if(b==0) disillop(); return(); 4298 * prntmne(); 4299 * if(opcode == $6x) 4300 * disindx(); 4301 * else 4302 * disext(); 4303 * return(); 4304 4305 fc0b DISGRP EQU * 4306 fc0b 81 7f [ 2 ] CMPA #$7F a=opcode 4307 fc0d 22 2a [ 3 ] BHI DISNEXT try next part of map 4308 fc0f d6 c3 [ 3 ] LDAB PNORM 4309 fc11 c1 02 [ 2 ] CMPB #PG3 4310 fc13 25 04 [ 3 ] BLO DISGRP2 jump if page 1 or 2 4311 fc15 bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4312 fc18 39 [ 5 ] RTS 4313 fc19 84 6f [ 2 ] DISGRP2 ANDA #$6F mask bit 4 4314 fc1b 5f [ 2 ] CLRB class=null 4315 fc1c bd fc f4 [ 6 ] JSR DISRCH 4316 fc1f 5d [ 2 ] TSTB 4317 fc20 26 04 [ 3 ] BNE DISGRP3 jump if found 4318 fc22 bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4319 fc25 39 [ 5 ] RTS 4320 fc26 bd fd 17 [ 6 ] DISGRP3 JSR PRNTMNE 4321 fc29 96 b6 [ 3 ] LDAA BASEOP get opcode 4322 fc2b 84 f0 [ 2 ] ANDA #$F0 4323 fc2d 81 60 [ 2 ] CMPA #$60 4324 fc2f 26 04 [ 3 ] BNE DISGRP4 jump if not 6x 4325 fc31 bd fd 31 [ 6 ] JSR DISINDX operand(indexed) 4326 fc34 39 [ 5 ] RTS 4327 fc35 bd fd b2 [ 6 ] DISGRP4 JSR DISEXT operand(extended) 4328 fc38 39 [ 5 ] RTS 4329 4330 *Else ($80 <= opcode <= $FF) 4331 * if(opcode == ($87 or $C7)) 4332 * disillop(); return(); 4333 * b=disrch(opcode&$CF,NULL); 4334 * if(b==0) disillop(); return(); 4335 4336 fc39 DISNEXT EQU * 4337 fc39 81 87 [ 2 ] CMPA #$87 a=opcode 4338 fc3b 27 04 [ 3 ] BEQ DISNEX1 4339 fc3d 81 c7 [ 2 ] CMPA #$C7 4340 fc3f 26 04 [ 3 ] BNE DISNEX2 4341 fc41 bd fd c5 [ 6 ] DISNEX1 JSR DISILLOP "illegal opcode" 4342 fc44 39 [ 5 ] RTS 4343 fc45 84 cf [ 2 ] DISNEX2 ANDA #$CF 4344 fc47 5f [ 2 ] CLRB class=null 4345 fc48 bd fc f4 [ 6 ] JSR DISRCH 4346 fc4b 5d [ 2 ] TSTB 4347 fc4c 26 04 [ 3 ] BNE DISNEW jump if mne found 4348 fc4e bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4349 fc51 39 [ 5 ] RTS 4350 4351 * if(opcode&$CF==$8D) disrch(baseop,NIMM; (jsr) 4352 * if(opcode&$CF==$8F) disrch(baseop,NIMM; (sts) 4353 * if(opcode&$CF==$CF) disrch(baseop,XNIMM; (stx) 4354 * if(opcode&$CF==$83) disrch(baseop,LIMM); (subd) 4355 4356 fc52 96 b6 [ 3 ] DISNEW LDAA BASEOP 4357 fc54 84 cf [ 2 ] ANDA #$CF 4358 fc56 81 8d [ 2 ] CMPA #$8D 4359 fc58 26 04 [ 3 ] BNE DISNEW1 jump not jsr 4360 fc5a c6 07 [ 2 ] LDAB #NIMM 4361 fc5c 20 16 [ 3 ] BRA DISNEW4 4362 fc5e 81 8f [ 2 ] DISNEW1 CMPA #$8F 4363 fc60 26 04 [ 3 ] BNE DISNEW2 jump not sts 4364 fc62 c6 07 [ 2 ] LDAB #NIMM 4365 fc64 20 0e [ 3 ] BRA DISNEW4 4366 fc66 81 cf [ 2 ] DISNEW2 CMPA #$CF 4367 fc68 26 04 [ 3 ] BNE DISNEW3 jump not stx 4368 fc6a c6 10 [ 2 ] LDAB #XNIMM 4369 fc6c 20 06 [ 3 ] BRA DISNEW4 4370 fc6e 81 83 [ 2 ] DISNEW3 CMPA #$83 4371 fc70 26 0c [ 3 ] BNE DISGEN jump not subd 4372 fc72 c6 08 [ 2 ] LDAB #LIMM 4373 fc74 bd fc f4 [ 6 ] DISNEW4 JSR DISRCH 4374 fc77 5d [ 2 ] TSTB 4375 fc78 26 04 [ 3 ] BNE DISGEN jump if found 4376 fc7a bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4377 fc7d 39 [ 5 ] RTS 4378 4379 * if(class == (GEN or NIMM or LIMM )) /* GEN,NIMM,LIMM,CPD */ 4380 * if(opcode&$CF==$83) 4381 * if(pnorm==(PG3 or PG4)) disrch(opcode#$CF,CPD) 4382 * class=LIMM; 4383 * if((pnorm == (PG2 or PG4) and (opcode != ($Ax or $Ex))) 4384 * disillop(); return(); 4385 * disgenrl(); 4386 * return(); 4387 4388 fc7e d6 b7 [ 3 ] DISGEN LDAB CLASS get class 4389 fc80 c1 03 [ 2 ] CMPB #GEN 4390 fc82 27 08 [ 3 ] BEQ DISGEN1 4391 fc84 c1 07 [ 2 ] CMPB #NIMM 4392 fc86 27 04 [ 3 ] BEQ DISGEN1 4393 fc88 c1 08 [ 2 ] CMPB #LIMM 4394 fc8a 26 31 [ 3 ] BNE DISXLN jump if other class 4395 fc8c 96 b6 [ 3 ] DISGEN1 LDAA BASEOP 4396 fc8e 84 cf [ 2 ] ANDA #$CF 4397 fc90 81 83 [ 2 ] CMPA #$83 4398 fc92 26 0f [ 3 ] BNE DISGEN3 jump if not #$83 4399 fc94 d6 c3 [ 3 ] LDAB PNORM 4400 fc96 c1 02 [ 2 ] CMPB #PG3 4401 fc98 25 09 [ 3 ] BLO DISGEN3 jump not pg3 or 4 4402 fc9a c6 15 [ 2 ] LDAB #CPD 4403 fc9c bd fc f4 [ 6 ] JSR DISRCH look for cpd mne 4404 fc9f c6 08 [ 2 ] LDAB #LIMM 4405 fca1 d7 b7 [ 3 ] STAB CLASS set class to limm 4406 fca3 d6 c3 [ 3 ] DISGEN3 LDAB PNORM 4407 fca5 c1 01 [ 2 ] CMPB #PG2 4408 fca7 27 04 [ 3 ] BEQ DISGEN4 jump if page 2 4409 fca9 c1 03 [ 2 ] CMPB #PG4 4410 fcab 26 0c [ 3 ] BNE #DISGEN5 jump not page 2 or 4 4411 fcad 96 b6 [ 3 ] DISGEN4 LDAA BASEOP 4412 fcaf 84 b0 [ 2 ] ANDA #$B0 mask bits 6,3-0 4413 fcb1 81 a0 [ 2 ] CMPA #$A0 4414 fcb3 27 04 [ 3 ] BEQ DISGEN5 jump if $Ax or $Ex 4415 fcb5 bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4416 fcb8 39 [ 5 ] RTS 4417 fcb9 bd fd 6f [ 6 ] DISGEN5 JSR DISGENRL process general class 4418 fcbc 39 [ 5 ] RTS 4419 4420 * else /* XLIMM,XNIMM,YLIMM,YNIMM */ 4421 * if(pnorm==(PG2 or PG3)) 4422 * if(class==XLIMM) disrch(opcode&$CF,YLIMM); 4423 * else disrch(opcode&$CF,YNIMM); 4424 * if((pnorm == (PG3 or PG4)) 4425 * if(opcode != ($Ax or $Ex)) 4426 * disillop(); return(); 4427 * class=LIMM; 4428 * disgen(); 4429 * return(); 4430 4431 fcbd d6 c3 [ 3 ] DISXLN LDAB PNORM 4432 fcbf c1 01 [ 2 ] CMPB #PG2 4433 fcc1 27 04 [ 3 ] BEQ DISXLN1 jump if page2 4434 fcc3 c1 02 [ 2 ] CMPB #PG3 4435 fcc5 26 13 [ 3 ] BNE DISXLN4 jump not page3 4436 fcc7 96 b6 [ 3 ] DISXLN1 LDAA BASEOP 4437 fcc9 84 cf [ 2 ] ANDA #$CF 4438 fccb d6 b7 [ 3 ] LDAB CLASS 4439 fccd c1 09 [ 2 ] CMPB #XLIMM 4440 fccf 26 04 [ 3 ] BNE DISXLN2 4441 fcd1 c6 11 [ 2 ] LDAB #YLIMM 4442 fcd3 20 02 [ 3 ] BRA DISXLN3 look for ylimm 4443 fcd5 c6 12 [ 2 ] DISXLN2 LDAB #YNIMM look for ynimm 4444 fcd7 bd fc f4 [ 6 ] DISXLN3 JSR DISRCH 4445 fcda d6 c3 [ 3 ] DISXLN4 LDAB PNORM 4446 fcdc c1 02 [ 2 ] CMPB #PG3 4447 fcde 25 0c [ 3 ] BLO DISXLN5 jump if page 1 or 2 4448 fce0 96 b6 [ 3 ] LDAA BASEOP get opcode 4449 fce2 84 b0 [ 2 ] ANDA #$B0 mask bits 6,3-0 4450 fce4 81 a0 [ 2 ] CMPA #$A0 4451 fce6 27 04 [ 3 ] BEQ DISXLN5 jump opcode = $Ax or $Ex 4452 fce8 bd fd c5 [ 6 ] JSR DISILLOP "illegal opcode" 4453 fceb 39 [ 5 ] RTS 4454 fcec c6 08 [ 2 ] DISXLN5 LDAB #LIMM 4455 fcee d7 b7 [ 3 ] STAB CLASS 4456 fcf0 bd fd 6f [ 6 ] JSR DISGENRL process general class 4457 fcf3 39 [ 5 ] RTS 4458 4459 4460 ****************** 4461 *disrch(a=opcode,b=class) 4462 *return b=0 if not found 4463 * else mneptr=points to mnemonic 4464 * class=class of opcode 4465 ****************** 4466 *x=#MNETABL 4467 *while(x[0] != eot) 4468 * if((opcode==x[4]) && ((class=NULL) || (class=x[5]))) 4469 * mneptr=x; 4470 * class=x[5]; 4471 * return(1); 4472 * x += 6; 4473 *return(0); /* not found */ 4474 4475 fcf4 DISRCH EQU * 4476 fcf4 ce f7 c1 [ 3 ] LDX #MNETABL point to top of table 4477 fcf7 a1 04 [ 4 ] DISRCH1 CMPA 4,X test opcode 4478 fcf9 26 0f [ 3 ] BNE DISRCH3 jump not this entry 4479 fcfb 5d [ 2 ] TSTB 4480 fcfc 27 04 [ 3 ] BEQ DISRCH2 jump if class=null 4481 fcfe e1 05 [ 4 ] CMPB 5,X test class 4482 fd00 26 08 [ 3 ] BNE DISRCH3 jump not this entry 4483 fd02 e6 05 [ 4 ] DISRCH2 LDAB 5,X 4484 fd04 d7 b7 [ 3 ] STAB CLASS 4485 fd06 df bc [ 4 ] STX MNEPTR return ptr to mnemonic 4486 fd08 5c [ 2 ] INCB 4487 fd09 39 [ 5 ] RTS return found 4488 fd0a 37 [ 3 ] DISRCH3 PSHB save class 4489 fd0b c6 06 [ 2 ] LDAB #6 4490 fd0d 3a [ 3 ] ABX 4491 fd0e e6 00 [ 4 ] LDAB 0,X 4492 fd10 c1 04 [ 2 ] CMPB #EOT test end of table 4493 fd12 33 [ 4 ] PULB 4494 fd13 26 e2 [ 3 ] BNE DISRCH1 4495 fd15 5f [ 2 ] CLRB 4496 fd16 39 [ 5 ] RTS return not found 4497 4498 ****************** 4499 *prntmne() - output the mnemonic pointed 4500 *at by mneptr. 4501 ****************** 4502 *outa(mneptr[0-3]); 4503 *outspac; 4504 *return(); 4505 4506 fd17 PRNTMNE EQU * 4507 fd17 de bc [ 4 ] LDX MNEPTR 4508 fd19 a6 00 [ 4 ] LDAA 0,X 4509 fd1b bd e4 d1 [ 6 ] JSR OUTA output char1 4510 fd1e a6 01 [ 4 ] LDAA 1,X 4511 fd20 bd e4 d1 [ 6 ] JSR OUTA output char2 4512 fd23 a6 02 [ 4 ] LDAA 2,X 4513 fd25 bd e4 d1 [ 6 ] JSR OUTA output char3 4514 fd28 a6 03 [ 4 ] LDAA 3,X 4515 fd2a bd e4 d1 [ 6 ] JSR OUTA output char4 4516 fd2d bd e4 e7 [ 6 ] JSR OUTSPAC 4517 fd30 39 [ 5 ] RTS 4518 4519 ****************** 4520 *disindx() - process indexed mode 4521 ****************** 4522 *disdir(); 4523 *outa(','); 4524 *if(pnorm == (PG2 or PG4)) outa('Y'); 4525 *else outa('X'); 4526 *return(); 4527 4528 fd31 DISINDX EQU * 4529 fd31 bd fd a5 [ 6 ] JSR DISDIR output $byte 4530 fd34 86 2c [ 2 ] LDAA #',' 4531 fd36 bd e4 d1 [ 6 ] JSR OUTA output , 4532 fd39 d6 c3 [ 3 ] LDAB PNORM 4533 fd3b c1 01 [ 2 ] CMPB #PG2 4534 fd3d 27 04 [ 3 ] BEQ DISIND1 jump if page2 4535 fd3f c1 03 [ 2 ] CMPB #PG4 4536 fd41 26 04 [ 3 ] BNE DISIND2 jump if not page4 4537 fd43 86 59 [ 2 ] DISIND1 LDAA #'Y' 4538 fd45 20 02 [ 3 ] BRA DISIND3 4539 fd47 86 58 [ 2 ] DISIND2 LDAA #'X' 4540 fd49 bd e4 d1 [ 6 ] DISIND3 JSR OUTA output x or y 4541 fd4c 39 [ 5 ] RTS 4542 4543 ****************** 4544 *disrelad() - compute and output relative address. 4545 ****************** 4546 * braddr = dispc[0] + (dispc++);( 2's comp arith) 4547 *outa('$'); 4548 *out2bsp(braddr); 4549 *return(); 4550 4551 fd4d DISRELAD EQU * 4552 fd4d de b8 [ 4 ] LDX DISPC 4553 fd4f e6 00 [ 4 ] LDAB 0,X get relative offset 4554 fd51 08 [ 3 ] INX 4555 fd52 df b8 [ 4 ] STX DISPC 4556 fd54 5d [ 2 ] TSTB 4557 fd55 2b 03 [ 3 ] BMI DISRLD1 jump if negative 4558 fd57 3a [ 3 ] ABX 4559 fd58 20 04 [ 3 ] BRA DISRLD2 4560 fd5a 09 [ 3 ] DISRLD1 DEX 4561 fd5b 5c [ 2 ] INCB 4562 fd5c 26 fc [ 3 ] BNE DISRLD1 subtract 4563 fd5e df ba [ 4 ] DISRLD2 STX BRADDR save address 4564 fd60 bd e4 e7 [ 6 ] JSR OUTSPAC 4565 fd63 86 24 [ 2 ] LDAA #'$' 4566 fd65 bd e4 d1 [ 6 ] JSR OUTA 4567 fd68 ce 00 ba [ 3 ] LDX #BRADDR 4568 fd6b bd e4 e1 [ 6 ] JSR OUT2BSP output address 4569 fd6e 39 [ 5 ] RTS 4570 4571 4572 ****************** 4573 *disgenrl() - output data for the general cases which 4574 *includes immediate, direct, indexed, and extended modes. 4575 ****************** 4576 *prntmne(); 4577 *if(baseop == ($8x or $Cx)) /* immediate */ 4578 * outa('#'); 4579 * disdir(); 4580 * if(class == LIMM) 4581 * out1byt(dispc++); 4582 *elseif(baseop == ($9x or $Dx)) /* direct */ 4583 * disdir(); 4584 *elseif(baseop == ($Ax or $Ex)) /* indexed */ 4585 * disindx(); 4586 *else (baseop == ($Bx or $Fx)) /* extended */ 4587 * disext(); 4588 *return(); 4589 4590 fd6f DISGENRL EQU * 4591 fd6f bd fd 17 [ 6 ] JSR PRNTMNE print mnemonic 4592 fd72 96 b6 [ 3 ] LDAA BASEOP get opcode 4593 fd74 84 b0 [ 2 ] ANDA #$B0 mask bits 6,3-0 4594 fd76 81 80 [ 2 ] CMPA #$80 4595 fd78 26 17 [ 3 ] BNE DISGRL2 jump if not immed 4596 fd7a 86 23 [ 2 ] LDAA #'#' do immediate 4597 fd7c bd e4 d1 [ 6 ] JSR OUTA 4598 fd7f bd fd a5 [ 6 ] JSR DISDIR 4599 fd82 d6 b7 [ 3 ] LDAB CLASS 4600 fd84 c1 08 [ 2 ] CMPB #LIMM 4601 fd86 27 01 [ 3 ] BEQ DISGRL1 jump class = limm 4602 fd88 39 [ 5 ] RTS 4603 fd89 de b8 [ 4 ] DISGRL1 LDX DISPC 4604 fd8b bd e4 d5 [ 6 ] JSR OUT1BYT 4605 fd8e df b8 [ 4 ] STX DISPC 4606 fd90 39 [ 5 ] RTS 4607 fd91 81 90 [ 2 ] DISGRL2 CMPA #$90 4608 fd93 26 04 [ 3 ] BNE DISGRL3 jump not direct 4609 fd95 bd fd a5 [ 6 ] JSR DISDIR do direct 4610 fd98 39 [ 5 ] RTS 4611 fd99 81 a0 [ 2 ] DISGRL3 CMPA #$A0 4612 fd9b 26 04 [ 3 ] BNE DISGRL4 jump not indexed 4613 fd9d bd fd 31 [ 6 ] JSR DISINDX do extended 4614 fda0 39 [ 5 ] RTS 4615 fda1 bd fd b2 [ 6 ] DISGRL4 JSR DISEXT do extended 4616 fda4 39 [ 5 ] RTS 4617 4618 ***************** 4619 *disdir() - output "$ next byte" 4620 ***************** 4621 fda5 DISDIR EQU * 4622 fda5 86 24 [ 2 ] LDAA #'$' 4623 fda7 bd e4 d1 [ 6 ] JSR OUTA 4624 fdaa de b8 [ 4 ] LDX DISPC 4625 fdac bd e4 d5 [ 6 ] JSR OUT1BYT 4626 fdaf df b8 [ 4 ] STX DISPC 4627 fdb1 39 [ 5 ] RTS 4628 4629 ***************** 4630 *disext() - output "$ next 2 bytes" 4631 ***************** 4632 fdb2 DISEXT EQU * 4633 fdb2 86 24 [ 2 ] LDAA #'$' 4634 fdb4 bd e4 d1 [ 6 ] JSR OUTA 4635 fdb7 de b8 [ 4 ] LDX DISPC 4636 fdb9 bd e4 e1 [ 6 ] JSR OUT2BSP 4637 fdbc df b8 [ 4 ] STX DISPC 4638 fdbe 39 [ 5 ] RTS 4639 4640 4641 ***************** 4642 *disillop() - output "illegal opcode" 4643 ***************** 4644 fdbf 49 4c 4c 4f 50 DISMSG1 FCC 'ILLOP' 4645 fdc4 04 FCB EOT 4646 fdc5 DISILLOP EQU * 4647 fdc5 3c [ 4 ] PSHX 4648 fdc6 ce fd bf [ 3 ] LDX #DISMSG1 4649 fdc9 bd e4 fd [ 6 ] JSR OUTSTRG0 no cr 4650 fdcc 38 [ 5 ] PULX 4651 fdcd 39 [ 5 ] RTS 4652 4653 * Equates 4654 0008 JPORTD EQU $08 4655 0009 JDDRD EQU $09 4656 002b JBAUD EQU $2B 4657 002c JSCCR1 EQU $2C 4658 002d JSCCR2 EQU $2D 4659 002e JSCSR EQU $2E 4660 002f JSCDAT EQU $2F 4661 * 4662 4663 ************ 4664 * boot [] - Use SCI to talk to an 'hc11 in 4665 * boot mode. Downloads 256 bytes starting at addr. 4666 * Default addr = $2000. 4667 ************ 4668 4669 *Get arguments 4670 *If no args, default $2000 4671 fdce bd e2 f1 [ 6 ] BOOT JSR WSKIP 4672 fdd1 81 0d [ 2 ] CMPA #$0D 4673 fdd3 26 06 [ 3 ] BNE BOT1 jump if arguments 4674 fdd5 18 ce 20 00 [ 4 ] LDY #$2000 4675 fdd9 20 19 [ 3 ] BRA BOT2 go - use default address 4676 4677 *Else get arguments 4678 fddb bd e2 1c [ 6 ] BOT1 JSR BUFFARG 4679 fdde 7d 00 ad [ 6 ] TST COUNT 4680 fde1 27 0a [ 3 ] BEQ BOTERR jump if no address 4681 fde3 bd e2 f1 [ 6 ] JSR WSKIP 4682 fde6 18 de 94 [ 5 ] LDY SHFTREG start address 4683 fde9 81 0d [ 2 ] CMPA #$D 4684 fdeb 27 07 [ 3 ] BEQ BOT2 go - use arguments 4685 fded ce e6 63 [ 3 ] BOTERR LDX #MSG9 "bad argument" 4686 fdf0 bd e4 fa [ 6 ] JSR OUTSTRG 4687 fdf3 39 [ 5 ] RTS 4688 4689 *Boot routine 4690 fdf4 c6 ff [ 2 ] BOT2 LDAB #$FF control character ($ff -> download) 4691 fdf6 bd fe 09 [ 6 ] JSR BTSUB set up SCI and send control char 4692 4693 *Download 256 byte block 4694 fdf9 5f [ 2 ] CLRB counter 4695 fdfa 18 a6 00 [ 5 ] BLOP LDAA 0,Y 4696 fdfd a7 2f [ 4 ] STAA JSCDAT,X write to transmitter 4697 fdff 18 08 [ 4 ] INY 4698 fe01 1f 2e 80 fc [ 7 ] BRCLR JSCSR,X $80 * wait for TDRE 4699 fe05 5a [ 2 ] DECB 4700 fe06 26 f2 [ 3 ] BNE BLOP 4701 fe08 39 [ 5 ] RTS 4702 4703 ************************************************ 4704 *Subroutine 4705 * btsub - sets up SCI and outputs control character 4706 * On entry, B = control character 4707 * On exit, X = $1000 4708 * A = $0C 4709 *************************** 4710 4711 fe09 BTSUB EQU * 4712 fe09 ce 10 00 [ 3 ] LDX #$1000 to use indexed addressing 4713 fe0c 86 02 [ 2 ] LDAA #$02 4714 fe0e a7 08 [ 4 ] STAA JPORTD,X drive transmitter line 4715 fe10 a7 09 [ 4 ] STAA JDDRD,X high 4716 fe12 6f 2d [ 6 ] CLR JSCCR2,X turn off XMTR and RCVR 4717 fe14 86 22 [ 2 ] LDAA #$22 BAUD = /16 4718 fe16 a7 2b [ 4 ] STAA JBAUD,X 4719 fe18 86 0c [ 2 ] LDAA #$0C TURN ON XMTR & RCVR 4720 fe1a a7 2d [ 4 ] STAA JSCCR2,X 4721 fe1c e7 2f [ 4 ] STAB JSCDAT,X 4722 fe1e 1f 2e 80 fc [ 7 ] BRCLR JSCSR,X $80 * wait for TDRE 4723 fe22 39 [ 5 ] RTS 4724 4725 ****************** 4726 * 4727 * EVBTEST - This routine makes it a little easier 4728 * on us to test this board. 4729 * 4730 ****************** 4731 4732 fe23 86 ff [ 2 ] EVBTEST LDAA #$FF 4733 4734 fe25 b7 10 00 [ 4 ] STAA $1000 Write ones to port A 4735 4736 fe28 7f 00 a9 [ 6 ] CLR AUTOLF Turn off auto lf 4737 fe2b bd e3 30 [ 6 ] JSR HOSTCO Connect host 4738 fe2e bd ef 3f [ 6 ] JSR HOSTINIT Initialize host 4739 4740 fe31 86 7f [ 2 ] LDAA #$7f 4741 fe33 bd ef 57 [ 6 ] JSR HOSTOUT Send Delete to Altos 4742 fe36 86 0d [ 2 ] LDAA #$0d 4743 fe38 bd ef 57 [ 6 ] JSR HOSTOUT Send 4744 fe3b 7c 00 a9 [ 6 ] INC AUTOLF Turn on Auto LF 4745 fe3e ce 00 6e [ 3 ] LDX #INBUFF+5 Point at Load message 4746 fe41 df b0 [ 4 ] STX PTR0 Set pointer for load command 4747 fe43 18 ce fe 61 [ 4 ] LDY #MSGEVB Point at cat line 4748 fe47 18 a6 00 [ 5 ] LOOP LDAA 0,Y Loop to xfer command line 4749 fe4a 81 04 [ 2 ] CMPA #04 Into buffalo line buffer 4750 fe4c 27 07 [ 3 ] BEQ DONE Quit on $04 4751 fe4e a7 00 [ 4 ] STAA 0,X 4752 fe50 08 [ 3 ] INX next character 4753 fe51 18 08 [ 4 ] INY 4754 fe53 20 f2 [ 3 ] BRA LOOP 4755 fe55 7f 00 c1 [ 6 ] DONE CLR TMP2 Set load vs. verify 4756 fe58 bd ef 97 [ 6 ] JSR LOAD1B Jmp into middle of load 4757 fe5b 8e 00 68 [ 3 ] LDS #STACK Reset Stack 4758 fe5e 7e c0 b3 [ 3 ] JMP $C0B3 Jump to Downloaded code 4759 4760 fe61 63 61 74 20 65 76 MSGEVB FCC /cat evbtest.out/ 62 74 65 73 74 2e 6f 75 74 4761 fe70 0d FCB $0D 4762 fe71 04 FCB $04 4763 4764 ffa0 ORG ROMBS+$1FA0 4765 *** Jump table *** 4766 ffa0 7e e1 8f [ 3 ] .UPCASE JMP UPCASE 4767 ffa3 7e e2 ff [ 3 ] .WCHEK JMP WCHEK 4768 ffa6 7e e3 0a [ 3 ] .DCHEK JMP DCHEK 4769 ffa9 7e e3 61 [ 3 ] .INIT JMP INIT 4770 ffac 7e e3 87 [ 3 ] .INPUT JMP INPUT 4771 ffaf 7e e3 b3 [ 3 ] .OUTPUT JMP OUTPUT 4772 ffb2 7e e4 c3 [ 3 ] .OUTLHL JMP OUTLHLF 4773 ffb5 7e e4 c7 [ 3 ] .OUTRHL JMP OUTRHLF 4774 ffb8 7e e4 d1 [ 3 ] .OUTA JMP OUTA 4775 ffbb 7e e4 d5 [ 3 ] .OUT1BY JMP OUT1BYT 4776 ffbe 7e e4 e4 [ 3 ] .OUT1BS JMP OUT1BSP 4777 ffc1 7e e4 e1 [ 3 ] .OUT2BS JMP OUT2BSP 4778 ffc4 7e e4 ed [ 3 ] .OUTCRL JMP OUTCRLF 4779 ffc7 7e e4 fa [ 3 ] .OUTSTR JMP OUTSTRG 4780 ffca 7e e4 fd [ 3 ] .OUTST0 JMP OUTSTRG0 4781 ffcd 7e e5 1a [ 3 ] .INCHAR JMP INCHAR 4782 ffd0 7e e3 40 [ 3 ] .VECINT JMP VECINIT 4783 4784 ffd6 ORG ROMBS+$1FD6 4785 *** Vectors *** 4786 ffd6 00 c4 VSCI FDB JSCI 4787 ffd8 00 c7 VSPI FDB JSPI 4788 ffda 00 ca VPAIE FDB JPAIE 4789 ffdc 00 cd VPAO FDB JPAO 4790 ffde 00 d0 VTOF FDB JTOF 4791 ffe0 00 d3 VTOC5 FDB JTOC5 4792 ffe2 00 d6 VTOC4 FDB JTOC4 4793 ffe4 00 d9 VTOC3 FDB JTOC3 4794 ffe6 00 dc VTOC2 FDB JTOC2 4795 ffe8 00 df VTOC1 FDB JTOC1 4796 ffea 00 e2 VTIC3 FDB JTIC3 4797 ffec 00 e5 VTIC2 FDB JTIC2 4798 ffee 00 e8 VTIC1 FDB JTIC1 4799 fff0 00 eb VRTI FDB JRTI 4800 fff2 00 ee VIRQ FDB JIRQ 4801 fff4 00 f1 VXIRQ FDB JXIRQ 4802 fff6 00 f4 VSWI FDB JSWI 4803 fff8 00 f7 VILLOP FDB JILLOP 4804 fffa 00 fa VCOP FDB JCOP 4805 fffc 00 fd VCLM FDB JCLM 4806 fffe e0 00 VRST FDB BUFFALO 4807 .DCHEK ffa6 .INCHAR ffcd .INIT ffa9 .INPUT ffac .OUT1BS ffbe .OUT1BY ffbb .OUT2BS ffc1 .OUTA ffb8 .OUTCRL ffc4 .OUTLHL ffb2 .OUTPUT ffaf .OUTRHL ffb5 .OUTST0 ffca .OUTSTR ffc7 .UPCASE ffa0 .VECINT ffd0 .WCHEK ffa3 ACIA 9800 ACL1 e299 ACL2 e2b7 ACL3 e78b ACL4 f1c0 AMODE 00c1 ASSARG f799 ASSARG1 f7a6 ASSARG2 f7ac ASSCHEK f451 ASSCHK1 f45f ASSCOMM 00be ASSEM f307 ASSEM1 f324 ASSLOOP f328 ASSLP0 f35e ASSLP1 f361 ASSLP10 f3b1 ASSLP11 f3be ASSLP12 f3c6 ASSLP13 f3d0 ASSLP14 f3d9 ASSLP15 f3dd ASSLP2 f37f ASSLP3 f394 ASSLP4 f3a2 ASSLP5 f3ae AUTOLF 00a9 BASEOP 00b6 BAUD 102b BITOP f6a4 BITOP1 f6ad BITOP2 f6b2 BITOP3 f6bd BITOP4 f6c8 BLOP fdfa BOOT fdce BOT1 fddb BOT2 fdf4 BOTERR fded BPCLR e19a BPCLR1 e19f BPRINT e742 BPRINT1 e74a BPSRCH e751 BPSRCH1 e752 BPSRCH2 e75d BRADDR 00ba BREAK e6a7 BRKDEF e6e7 BRKDEF1 e6f6 BRKDEF2 e71e BRKDEF3 e736 BRKDEL e6b2 BRKDEL1 e6c7 BRKDEL2 e6d6 BRKDEL3 e6e4 BRKTABL 0096 BTB 0013 BTBD 0016 BTSUB fe09 BUFF1 e059 BUFF2 e070 BUFF3 e082 BUFF4 e0a5 BUFF5 e0b2 BUFFALO e000 BUFFARG e21c BUFFLNG 0023 BUFFLP e22b BUFFRTS e23e BUFISIT e00a BULK e766 BULK1 e771 BULK2 e783 BULK3 e786 BULKALL e76b BULKDLY e792 BYTE f042 BYTE0 f044 BYTE1 f04d CALL e8a7 CALL2 e8bf CALL3 e8c3 CHGBYT e267 CHGBYT1 e285 CHGBYT2 e2a3 CHGBYT3 e2c1 CHGBYT4 e2d2 CHGWAIT e2d3 CHGWAIT1 e2d7 CHK2 e320 CHK3 e32c CHK4 e32f CHKABRT e312 CHKABRT1 e31b CLASS 00b7 COMBUFF 008c COMM0 e0fa COMM1 e10c COMM2 e132 COMM3 e143 COMM4 e14c COMTABL e524 CONFIG 103f COPRST 103a COUNT 00ad CPD 0015 CTLA 0001 CTLB 0002 CTLW 0017 CTLX 0018 DCHEK e30a DCHEK1 e311 DECBUFF e2e9 DEL 007f DFLOP 4000 DIS1 fb74 DIS2 fb7e DISASSM fb40 DISBIT fbf1 DISBIT1 fbf7 DISBIT2 fc07 DISBIT3 fc0a DISBTD fbd6 DISBTD1 fbe0 DISBTD2 fbe9 DISDIR fda5 DISEXT fdb2 DISGEN fc7e DISGEN1 fc8c DISGEN3 fca3 DISGEN4 fcad DISGEN5 fcb9 DISGENRL fd6f DISGRL1 fd89 DISGRL2 fd91 DISGRL3 fd99 DISGRL4 fda1 DISGRP fc0b DISGRP2 fc19 DISGRP3 fc26 DISGRP4 fc35 DISILLOP fdc5 DISIND1 fd43 DISIND2 fd47 DISIND3 fd49 DISINDX fd31 DISINH fba2 DISINH1 fbbc DISMSG1 fdbf DISNEW fc52 DISNEW1 fc5e DISNEW2 fc66 DISNEW3 fc6e DISNEW4 fc74 DISNEX1 fc41 DISNEX2 fc45 DISNEXT fc39 DISP1 fb56 DISP2 fb54 DISP3 fb53 DISP4 fb52 DISPC 00b8 DISPEC fb8b DISPEC1 fb95 DISPEC2 fb9d DISPEC3 fb9f DISRCH fcf4 DISRCH1 fcf7 DISRCH2 fd02 DISRCH3 fd0a DISREL fbc0 DISREL1 fbcf DISRELAD fd4d DISRLD1 fd5a DISRLD2 fd5e DISXLN fcbd DISXLN1 fcc7 DISXLN2 fcd5 DISXLN3 fcd7 DISXLN4 fcda DISXLN5 fcec DOBTB f62e DOCPD f5c4 DOCPD1 f5ce DOCPD2 f5d7 DODEF f533 DOGDEF f6e0 DOGEN f6ca DOGENE f584 DOGIMM f700 DOGIMM1 f712 DOGINDX f728 DOGINDY f719 DOGLIM f6e3 DOGLIM1 f6e8 DOGLIM2 f6f5 DOGOTH f737 DOGOTH0 f73f DOGOTH1 f758 DOGRP f592 DOGRP1 f5a1 DOGRP2 f5ab DOGRPRT f5c3 DOINDEX f76a DOINDX0 f777 DOINDX1 f77e DOINDX2 f792 DOINH f53b DOLIM f571 DONE fe55 DONOI f57b DOOP f498 DOOP1 f4c1 DOOP2 f4cf DOP2I f536 DOPLP1 f4a1 DOPLP2 f4b7 DOREL f542 DOREL1 f54a DOREL2 f565 DOSET f62e DOSET1 f638 DOSET2 f647 DOSET22 f654 DOSET3 f665 DOSET33 f66d DOSET4 f67a DOSET5 f682 DOSET6 f69e DOSW1 f4d8 DOSW10 f517 DOSW11 f51e DOSW12 f525 DOSW13 f52c DOSW2 f4df DOSW3 f4e6 DOSW4 f4ed DOSW5 f4f4 DOSW6 f4fb DOSW7 f502 DOSW8 f509 DOSW9 f510 DOXLI f5ee DOXLI1 f5f8 DOXNOI f5e5 DOYLI f60f DOYLI1 f618 DOYLI2 f620 DOYNOI f606 DUART d000 DUMP e79b DUMP1 e7e4 DUMP3 e80e DUMP4 e810 DUMP5 e835 DUMPASC e801 DUMPDAT e7f8 DUMPERR e7dd DUMPLP e7ec EMIT f7b7 ENDBUFF 008c EOT 0004 EPAGE f7af EPAGRT f7b6 EVBTEST fe23 EXEC e18a EXTDEV 00ab FILL e836 FILL1 e87c FILL2 e892 FILLBAD e89a FILLERR e893 GEN 0003 GO e8f4 GO1 e90c GO2 e910 GO3 e937 GRP2 0004 HELP ea61 HELPMSG1 ea68 HEXBIN e1e9 HEXNMB e201 HEXNOT e215 HEXRTS e218 HEXSHFT e208 HOST eecf HOST0 eeda HOST1 eee3 HOST2 eef6 HOST3 eef9 HOSTCO e330 HOSTDEV 00ac HOSTEND ef04 HOSTIN ef4b HOSTINIT ef3f HOSTOUT ef57 HPRIO 103c IMM 0006 IMMED 0000 INACIA e47a INACIA1 e489 INACIA2 e48e INBUFF 0069 INCBUFF e2e3 INCDEC e2ed INCHAR e51a INDX 0001 INDY 0002 INH 0001 INIT e361 INIT1 e36e INIT2 e377 INIT3 e381 INIT4 e384 INPUT e387 INPUT1 e39b INPUT2 e3a4 INPUT3 e3ae INPUT4 e3b1 INSCI e43f INSCI1 e44b INUART e404 INUART1 e40e IODEV 00aa JBAUD 002b JCLM 00fd JCOP 00fa JDDRD 0009 JILLOP 00f7 JIRQ 00ee JPAIE 00ca JPAO 00cd JPORTD 0008 JRTI 00eb JSCCR1 002c JSCCR2 002d JSCDAT 002f JSCI 00c4 JSCSR 002e JSPI 00c7 JSWI 00f4 JTIC1 00e8 JTIC2 00e5 JTIC3 00e2 JTOC1 00df JTOC2 00dc JTOC3 00d9 JTOC4 00d6 JTOC5 00d3 JTOF 00d0 JXIRQ 00f1 LIMM 0008 LIMMED 0003 LOAD ef6d LOAD1 ef70 LOAD10 effe LOAD11 f00e LOAD12 f02a LOAD13 f032 LOAD1A ef7a LOAD1B ef97 LOAD2 efa0 LOAD6 efb2 LOAD65 efbb LOAD7 efc5 LOAD75 efd4 LOAD8 efe7 LOOP fe47 MAIN e0b2 MAIN1 e0c4 MAIN2 e0dc MAIN3 e0e7 MAIN4 e0f6 MEM1 f080 MEM2 f083 MEM3 f089 MEM4 f094 MEMBS f0d3 MEMCR f112 MEMLF f0ca MEMOFF f0e2 MEMOFF1 f0f0 MEMOFF2 f0f8 MEMOFF3 f101 MEMORY f05f MEMSL f0dc MEMSP f0c1 MEMUA f0d3 MNEPTR 00bc MNETABL f7c1 MOVE f116 MOVE1 f152 MOVE2 f155 MOVE3 f18d MOVEA f180 MOVEB f1a4 MOVEDLY f1c6 MOVELP1 f16b MOVELP2 f18f MOVERR f14b MOVPROG f1b2 MOVRTS f1b1 MSG1 e5f8 MSG10 e670 MSG11 e687 MSG12 e68c MSG13 e69b MSG2 e63c MSG3 e642 MSG4 e64b MSG5 e650 MSG6 e655 MSG8 e65a MSG9 e663 MSGA1 f255 MSGA2 f26c MSGA3 f284 MSGA4 f293 MSGA5 f2a0 MSGA6 f2b3 MSGA7 f2cb MSGA8 f2e6 MSGA9 f2f3 MSGDIR f243 MSGEVB fe61 MSLASH f077 MSNEXT f469 MSRCH f460 MSRCH1 f46c MSRCH2 f477 NIMM 0007 NULL 0000 OLDPC 00ae ONACIA e46e ONSCI e42f ONUART e3d9 OPTION 1039 OTHER 0004 OUT1BSP e4e4 OUT1BYT e4d5 OUT2BSP e4e1 OUTA e4d1 OUTACIA e493 OUTACIA1 e4a4 OUTACIA2 e4ac OUTACIA3 e4ad OUTCRLF e4ed OUTLHLF e4c3 OUTPUT e3b3 OUTPUT1 e3bf OUTPUT2 e3c8 OUTPUT3 e3d2 OUTPUT4 e3d5 OUTRHLF e4c7 OUTSCI e44c OUTSCI1 e45b OUTSCI2 e461 OUTSCI3 e46d OUTSPAC e4e7 OUTSTRG e4fa OUTSTRG0 e4fd OUTSTRG1 e4fe OUTSTRG2 e511 OUTSTRG3 e518 OUTUART e40f OUTUART1 e41e OUTUART2 e424 OUTUART3 e42e P2INH 0002 PAGE1 0000 PAGE2 0018 PAGE3 001a PAGE4 00cd PARSE f425 PARSLP f432 PARSRT f450 PC 00b2 PG1 0000 PG2 0001 PG3 0002 PG4 0003 PNORM 00c3 PORTA d000 PORTB d008 PORTE 100a PPROG 103b PRNTMNE fd17 PROCEED e943 PROMPT 003e PTR0 00b0 PTR1 00b2 PTR2 00b4 PTR3 00b6 PTR4 00b8 PTR5 00ba PTR6 00bc PTR7 00be PTRMEM 00ae PX 00b4 PY 00b5 RAMBS 0000 READBUFF e2dc READLN f3e0 REG1 f1de REG2 f1e9 REG3 f1f0 REG4 f1fc REG5 f1ff REG6 f21a REG7 f231 REG8 f235 REG9 f242 REGBS 1000 REGISTER f1d1 REGLIST e1a6 REGS 009e REL 0005 REMBPS ea0d REMBPS1 ea0e REMBPS2 ea21 RESTACK ea2c RESTACK1 ea44 RETURN e8d7 RLN0 f3e3 RLN1 f3ef RLN2 f40f RLN3 f41d RLNQUIT f423 ROMBS e000 RPRI1 e1df RPRINT e1db RPRN2 e1d5 RPRNT1 e1bb SAVSTACK ea45 SCCR1 102c SCCR2 102d SCDAT 102f SCSR 102e SETBPS e9e1 SETBPS1 e9e2 SETBPS2 e9f9 SETCLR 0014 SETCLRD 0017 SHFTREG 0094 SIGNON e09b SP 00a7 SRCH e151 SRCH1 e158 SRCH2 e16d SRCHLP e175 STACK 0068 STOPIT e35a SWI 003f SWIIN e91c TARGCO e338 TCNT 100e TCTL1 1020 TERM0 e248 TERM1 e253 TERM2 e256 TERM3 e266 TERMARG e23f TERMRES ef61 TFLG1 1023 TMP1 00c0 TMP2 00c1 TMP3 00c2 TMP4 00c3 TMSK1 1022 TMSK2 1024 TOC5 101e TRACE e94c TRACE1 e96d TRACE2 e971 TRACE3 e97f TRACE9 e9d3 TRACEIN e9b9 TXB1 ef2b TXBDU ef1e TXBREAK ef0b TXBSCI ef11 TXBWAIT ef36 TXBWAIT1 ef3a UPCASE e18f UPCASE1 e199 USTACK 004a VCLM fffc VCOP fffa VECINIT e340 VECLOOP e34a VECNEXT e353 VERIFY ef65 VILLOP fff8 VIRQ fff2 VPAIE ffda VPAO ffdc VRST fffe VRTI fff0 VSCI ffd6 VSPI ffd8 VSWI fff6 VTIC1 ffee VTIC2 ffec VTIC3 ffea VTOC1 ffe8 VTOC2 ffe6 VTOC3 ffe4 VTOC4 ffe2 VTOC5 ffe0 VTOF ffde VXIRQ fff4 WCHEK e2ff WCHEK1 e309 WSKIP e2f1 WSKIP1 e2fe XLIMM 0009 XNIMM 0010 YFLAG 00c2 YLIMM 0011 YNIMM 0012