68000 Assembler - version 2.71.F3w (Jul 27, 2006) Copyright 1985 by Brian R. Anderson. AmigaDOS conversion copyright 1991 by Charlie Gibbs. 1 100000 2 ORG $100000 3 700001 4 duart equ $700001 5 000000 6 mr1a equ 0 000000 7 mr2a equ 0 000002 8 sra equ 2 000002 9 csra equ 2 000004 10 cra equ 4 000006 11 tba equ 6 000008 12 acr equ 8 13 000010 14 mr1b equ 16 000010 15 mr2b equ 16 000012 16 srb equ 18 000012 17 csrb equ 18 000014 18 crb equ 20 000016 19 tbb equ 22 20 100000 000F0000 21 DC.L STACK ;RESET: initial SSP 100004 00100400 22 DC.L START ;RESET: initial PC 23 100008 00100A2C 24 st_excp DC.L BUS_ERROR 10000C 00100A34 25 DC.L ADRS_ERROR 100010 00100A3C 26 DC.L ILLEGAL_INST 100014 00100A44 27 DC.L DIV_ZERO 100018 00100400 28 DC.L START ;CHK not implemented 10001C 00100A4C 29 DC.L TRAP_V 100020 00100400 30 DC.L START ;priv. viol. not implemented 100024 00100A92 31 DC.L TRACE 32 ; 10007C 33 ORG $10007C ;skip reserved vectors 10007C 00100A54 34 DC.L LEVEL_7 100080 00100A5C 35 DC.L TO_CHAR_IN ;TRAP vector 0 100084 00100A62 36 DC.L TO_CHAR_OUT ;TRAP vector 1 100088 00100A68 37 DC.L TO_CRLF ;TRAP vector 2 10008C 00100A6E 38 DC.L TO_PRINT_MSG ;TRAP vector 3 100090 00100A74 39 DC.L TO_PRINT_BYTE ;TRAP vector 4 100094 00100A7A 40 DC.L TO_PRINT_WORD ;TRAP vector 5 100098 00100A80 41 DC.L TO_PRINT_LONG ;TRAP vector 6 10009C 00100A86 42 DC.L TO_GET_BYTE ;TRAP vector 7 1000A0 00100A8C 43 DC.L TO_GET_ADDR ;TRAP vector 8 1000A4 00100426 44 DC.L GETCMD ;TRAP vector 9 1000A8 45 nd_excp equ * 46 * 100400 47 ORG $100400 ;start of monitor 48 * 0F0000 49 STACK EQU $0F0000 0FFE00 50 BUFF EQU $0FFE00 51 * 0FFD00 52 REGAREA EQU $0FFD00 ;d0-d7 0FFD20 53 A_AREA EQU REGAREA+32 ;a0-a6 0FFD3C 54 A_SP EQU A_AREA+28 ;sp 0FFD40 55 A_SR EQU A_SP+4 ;sr 0FFD42 56 A_PC EQU A_SR+2 ;pc 0FFD46 57 NEXT EQU A_PC+4 ;end 58 * 000020 59 O_A0 EQU A_AREA-REGAREA ;a reg. offset 00003C 60 O_A7 EQU A_SP-REGAREA ;sp offset 000040 61 O_SR EQU A_SR-REGAREA ;sr offset 000042 62 O_PC EQU A_PC-REGAREA ;pc offset 63 * 100400 227C 00100008 64 START MOVEA.L #st_excp,A1 ;start of copy 100406 247C 00000008 65 MOVEA.L #$8,A2 ;copy destination 10040C 267C 001000A8 66 MOVEA.L #nd_excp,A3 ;end of copy 100412 14D9 67 CPLP MOVE.B (A1)+,(A2)+ ;do copy 100414 B7C9 68 CMP.L A1,A3 ;done? 100416 66FA 69 BNE CPLP ;no 100418 2E7C 000F0000 70 MOVEA.L #STACK,A7 ;init stack 10041E 6100 03B4 71 BSR INIT_DUART ;init serial chip 100422 6100 0454 72 BSR SIGN_ON ;greet user 100426 2E7C 000F0000 73 GETCMD MOVEA.L #STACK,A7 ;init stack 10042C 6100 0424 74 BSR CRLF 100430 123C 002A 75 MOVE.B #'*',D1 ;output command prompt 100434 6100 0408 76 BSR CHAR_OUT 100438 4282 77 CLR.L D2 ;init command-text buffer 10043A 2C7C 000FFE00 78 MOVEA.L #BUFF,A6 ;load buffer location 100440 6100 0576 79 BSR GETLINE ;fill buffer with text 100444 2C7C 000FFE00 80 MOVEA.L #BUFF,A6 ;reset buffer pointer 10044A 6100 05D0 81 BSR SKIP_BLK ;skip leading blanks 10044E 121E 82 INCOM MOVE.B (A6)+,D1 100450 6100 0554 83 BSR UPPER_CASE 100454 0C01 000D 84 CMPI.B #$0D,D1 100458 670C 85 BEQ SEARCH 10045A 0C01 0020 86 CMPI.B #$20,D1 ;test for SP 10045E 6706 87 BEQ SEARCH 100460 E19A 88 ROL.L #8,D2 ;prepare D2 for new letter 100462 1401 89 MOVE.B D1,D2 ;insert it into D2 100464 60E8 90 BRA INCOM ;get next letter 100466 7A09 91 SEARCH MOVE.L #9,D5 ;number of commands to check 100468 247C 0010048E 92 MOVEA.L #COMMANDS,A2 ;init command text pointer 10046E 227C 001004D6 93 MOVEA.L #COM_ADRS,A1 ;init command address pointer 100474 B492 94 TEST_NEXT CMP.L (A2),D2 ;compare command text 100476 6712 95 BEQ DO_JUMP ;branch if match 100478 588A 96 ADDQ.L #4,A2 ;point to abbreviated command 10047A B492 97 CMP.L (A2),D2 ;test again 10047C 670C 98 BEQ DO_JUMP 10047E 588A 99 ADDQ.L #4,A2 ;point to next command 100480 5889 100 ADDQ.L #4,A1 ;point to next address 100482 5385 101 SUBQ.L #1,D5 ;all commands checked yet? 100484 66EE 102 BNE TEST_NEXT 100486 6000 0448 103 BRA ERROR ;illegal command entered 10048A 2251 104 DO_JUMP MOVEA.L (A1),A1 ;get command address 10048C 4ED1 105 JMP (A1) ;and go execute command 10048E 44554D50 106 COMMANDS DC.B 'DUMP' ;full command name 100492 000000 107 DC.B 0,0,0 ;abbreviated name 100495 44 108 DC.B 'D' 100496 474F2020 109 DC.B 'GO ' 10049A 000000 110 DC.B 0,0,0 10049D 47 111 DC.B 'G' 10049E 45444954 112 DC.B 'EDIT' 1004A2 000000 113 DC.B 0,0,0 1004A5 45 114 DC.B 'E' 1004A6 4D4F5645 115 DC.B 'MOVE' 1004AA 000000 116 DC.B 0,0,0 1004AD 4D 117 DC.B 'M' 1004AE 46494C4C 118 DC.B 'FILL' 1004B2 000000 119 DC.B 0,0,0 1004B5 46 120 DC.B 'F' 1004B6 56524659 121 DC.B 'VRFY' 1004BA 000000 122 DC.B 0,0,0 1004BD 56 123 DC.B 'V' 1004BE 4C4F4144 124 DC.B 'LOAD' 1004C2 000000 125 DC.B 0,0,0 1004C5 4C 126 DC.B 'L' 1004C6 52454753 127 DC.B 'REGS' 1004CA 000000 128 DC.B 0,0,0 1004CD 52 129 DC.B 'R' 1004CE 48454C50 130 DC.B 'HELP' 1004D2 000000 131 DC.B 0,0,0 1004D5 48 132 DC.B 'H' 1004D6 001004FA 133 COM_ADRS DC.L DUMP ;DUMP execution address 1004DA 0010056A 134 DC.L GO 1004DE 001007A4 135 DC.L EDIT 1004E2 00100572 136 DC.L MOOV 1004E6 00100594 137 DC.L FILL 1004EA 001005B4 138 DC.L VRFY 1004EE 0010060A 139 DC.L LOAD 1004F2 001006E0 140 DC.L REGS 1004F6 00100A94 141 DC.L HELP 142 ; 1004FA 6100 044E 143 DUMP BSR GET_ADDR ;get the starting address 1004FE 0202 00F0 144 ANDI.B #$F0,D2 ;make lower nibble zero 100502 2842 145 MOVEA.L D2,A4 ;A4 is memory read register 100504 6100 0444 146 BSR GET_ADDR ;get the ending address 100508 2A42 147 MOVEA.L D2,A5 10050A 6100 0346 148 ADR_OUT BSR CRLF ;new line please 10050E 240C 149 MOVE.L A4,D2 ;print address 100510 6100 0398 150 BSR PRINT_LONG 100514 6100 034A 151 BSR BLANK ;and some blanks 100518 6100 0346 152 BSR BLANK 10051C 141C 153 BYTE_OUT MOVE.B (A4)+,D2 ;get a byte and increment A4 10051E 6100 0362 154 BSR PRINT_BYTE ;print the byte 100522 6100 033C 155 BSR BLANK 100526 220C 156 MOVE.L A4,D1 ;done 16 yet? 100528 0281 0000000F 157 ANDI.L #$0F,D1 10052E 66EC 158 BNE BYTE_OUT 100530 99FC 00000010 159 SUBA.L #16,A4 ;back up 16 bytes 100536 6100 0328 160 BSR BLANK 10053A 121C 161 ASCII_OUT MOVE.B (A4)+,D1 ;get a byte 10053C 0201 007F 162 ANDI.B #$7F,D1 100540 0C01 0020 163 CMPI.B #$20,D1 ;is it printable? 100544 6B06 164 BMI UN_PRINT 100546 0C01 007D 165 CMPI.B #$7D,D1 10054A 6B04 166 BMI SEND_IT 10054C 123C 002E 167 UN_PRINT MOVE.B #$2E,D1 ;use period for unprintables 100550 6100 02EC 168 SEND_IT BSR CHAR_OUT ;print the ASCII equivalent 100554 240C 169 MOVE.L A4,D2 ;done 16 yet? 100556 0282 0000000F 170 ANDI.L #$0F,D2 10055C 66DC 171 BNE ASCII_OUT 10055E 6100 042A 172 BSR FREEZE ;hold display? 100562 BBCC 173 CMPA.L A4,A5 ;done with dump? 100564 6B00 FEC0 174 BMI GETCMD 100568 60A0 175 BRA ADR_OUT 176 ; 10056A 6100 03DE 177 GO BSR GET_ADDR ;get execution address 10056E 2242 178 MOVEA.L D2,A1 100570 4ED1 179 JMP (A1) 180 ; 100572 6100 03D6 181 MOOV BSR GET_ADDR ;get starting address 100576 2242 182 MOVEA.L D2,A1 100578 6100 03D0 183 BSR GET_ADDR ;get ending address 10057C 2442 184 MOVEA.L D2,A2 10057E D5FC 00000001 185 ADDA.L #1,A2 ;include last location 100584 6100 03C4 186 BSR GET_ADDR ;get destination address 100588 2642 187 MOVEA.L D2,A3 10058A 16D9 188 MOOVEM MOVE.B (A1)+,(A3)+ ;move and increment pointers 10058C B5C9 189 CMPA.L A1,A2 ;at ending address yet? 10058E 66FA 190 BNE MOOVEM 100590 6000 FE94 191 BRA GETCMD 192 ; 100594 6100 03B4 193 FILL BSR GET_ADDR ;get starting address 100598 2242 194 MOVEA.L D2,A1 10059A 6100 03AE 195 BSR GET_ADDR ;get ending address 10059E 2442 196 MOVEA.L D2,A2 1005A0 D5FC 00000001 197 ADDA.L #1,A2 ;include last location 1005A6 6100 03A2 198 BSR GET_ADDR ;get byte value 1005AA 12C2 199 FILLEM MOVE.B D2,(A1)+ ;fill and increment pointer 1005AC B5C9 200 CMPA.L A1,A2 ;at ending address yet? 1005AE 66FA 201 BNE FILLEM 1005B0 6000 FE74 202 BRA GETCMD 203 ; 1005B4 6100 0394 204 VRFY BSR GET_ADDR ;get starting address 1005B8 2242 205 MOVEA.L D2,A1 1005BA 6100 038E 206 BSR GET_ADDR ;get ending address 1005BE 2442 207 MOVEA.L D2,A2 1005C0 D5FC 00000001 208 ADDA.L #1,A2 ;include last location 1005C6 6100 0382 209 BSR GET_ADDR ;get target address 1005CA 2642 210 MOVEA.L D2,A3 1005CC B709 211 VRFYEM CMP.B (A1)+,(A3)+ ;compare and increment pointers 1005CE 6732 212 BEQ EQUAL ;AOK 1005D0 6100 0280 213 BSR CRLF ;not equal 1005D4 2409 214 MOVE.L A1,D2 ;get 1st addr. 1005D6 5382 215 SUBQ.L #1,D2 ;back it up 1005D8 6100 02D0 216 BSR PRINT_LONG ;print it 1005DC 6100 0282 217 BSR BLANK 1005E0 1421 218 MOVE.B -(A1),D2 ;get 1st byte 1005E2 6100 029E 219 BSR PRINT_BYTE ;display it 1005E6 123C 0023 220 MOVE.B #'#',D1 ;not equal sign 1005EA 6100 0252 221 BSR CHAR_OUT ;display it 1005EE 1423 222 MOVE.B -(A3),D2 ;get 2nd byte 1005F0 6100 0290 223 BSR PRINT_BYTE ;display it 1005F4 6100 026A 224 BSR BLANK 1005F8 240B 225 MOVE.L A3,D2 ;get 2nd addr. 1005FA 6100 02AE 226 BSR PRINT_LONG ;display it 1005FE 5289 227 ADDQ.L #1,A1 ;restore addrs. 100600 528B 228 ADDQ.L #1,A3 100602 B5C9 229 EQUAL CMPA.L A1,A2 ;at ending address yet? 100604 66C6 230 BNE VRFYEM 100606 6000 FE1E 231 BRA GETCMD 232 ; 233 ********************************************************************* 234 * 235 * LOADSUB Loads data formatted in hexadecimal "S" format from the 236 * console port. S1 or S2 records are valid. 237 * 10060A 4247 238 LOAD CLR D7 10060C 6100 0244 239 BSR CRLF 100610 6100 00B6 240 LSUB1 BSR GETCH 100614 0C00 0053 241 CMP.B #'S',D0 100618 66F6 242 BNE.S LSUB1 10061A 6100 00AC 243 BSR GETCH 10061E 0C00 0039 244 CMP.B #'9',D0 100622 6706 245 beq.S LSUB2 100624 0C00 0038 246 CMP.B #'8',D0 100628 6624 247 BNE.S LSUB5 248 * 10062A 0807 0000 249 LSUB2 BTST #0,D7 10062E 670A 250 BEQ.S LSUB3 100630 47F9 00100B12 251 LEA.L INPERR,A3 100636 6100 0230 252 BSR PRINT_MSG 10063A 0807 0003 253 LSUB3 BTST #3,D7 10063E 670A 254 BEQ.S LSUB4 100640 47F9 00100B22 255 LEA.L CKSERR,A3 100646 6100 0220 256 BSR PRINT_MSG 10064A 6000 FDDA 257 LSUB4 BRA GETCMD 258 * 10064E 0C00 0031 259 LSUB5 CMP.B #'1',D0 100652 671E 260 BEQ.S LSUB6 100654 0C00 0032 261 CMP.B #'2',D0 100658 66B6 262 BNE.S LSUB1 10065A 4203 263 CLR.B D3 10065C 613C 264 BSR.S GTABYT 10065E 5900 265 SUB.B #4,D0 100660 1400 266 MOVE.b d0,D2 100662 4280 267 CLR.L D0 100664 6134 268 BSR.S GTABYT 100666 E180 269 ASL.L #8,D0 100668 6130 270 BSR.S GTABYT 10066A E180 271 ASL.L #8,D0 10066C 612C 272 BSR.S GTABYT 10066E 2440 273 MOVE.L D0,A2 100670 6012 274 BRA.S LSUB7 100672 4203 275 LSUB6 CLR.B D3 100674 6124 276 BSR.S GTABYT 100676 5700 277 SUB.B #3,D0 100678 1400 278 MOVE.b D0,D2 10067A 4280 279 CLR.L D0 10067C 611C 280 BSR.S GTABYT 10067E E180 281 ASL.L #8,D0 100680 6118 282 BSR.S GTABYT 100682 2440 283 MOVE.L D0,A2 100684 6114 284 LSUB7 BSR.S GTABYT 100686 14C0 285 MOVE.B D0,(a2)+ 100688 5302 286 SUB.B #1,D2 10068A 66F8 287 BNE LSUB7 10068C 610C 288 BSR.S GTABYT 10068E 5203 289 ADD.B #1,D3 100690 6700 FF7E 290 BEQ LSUB1 100694 0007 0008 291 OR.B #%00001000,D7 100698 6090 292 BRA LSUB2 293 * 10069A 6104 294 GTABYT BSR BYTE 10069C D600 295 ADD.B D0,D3 10069E 4E75 296 RTS 297 ; 1006A0 610A 298 BYTE BSR HEX 1006A2 E900 299 ASL.B #4,D0 1006A4 1C00 300 MOVE.B D0,D6 1006A6 6104 301 BSR HEX 1006A8 D006 302 ADD.B D6,D0 1006AA 4E75 303 RTS 304 ; 1006AC 611A 305 HEX BSR GETCH 1006AE 0400 0030 306 SUB.B #$30,D0 1006B2 6B0E 307 BMI.S NOT_HEX 1006B4 0C00 0009 308 CMP.B #9,D0 1006B8 6F0C 309 BLE.S HEX_OK 1006BA 5F00 310 SUB.B #7,D0 1006BC 0C00 000F 311 CMP.b #$F,D0 1006C0 6F04 312 BLE.S HEX_OK 1006C2 0007 0001 313 NOT_HEX OR.B #1,D7 1006C6 4E75 314 HEX_OK RTS 315 1006C8 49F9 00700001 316 GETCH LEA.L duart,A4 1006CE 082C 0000 0002 317 GTCH1 BTST.B #0,sra(A4) 1006D4 67F8 318 BEQ GTCH1 1006D6 102C 0006 319 MOVE.B tba(A4),D0 1006DA 0200 007F 320 AND.B #$7F,D0 1006DE 4E75 321 RTS 322 ; 1006E0 41FA F61E 323 REGS LEA.L REGAREA,A0 ;point to save area 1006E4 48D0FFFF 324 MOVEM.L D0-D7/A0-A7,(A0) ;save all regs. 1006E8 40C0 325 MOVE.W SR,D0 ;get status reg. 1006EA 3140 0040 326 MOVE.W D0,O_SR(A0) ;save it 1006EE 43FA FFFE 327 LEA.L *,A1 ;get pc 1006F2 2149 0042 328 MOVE.L A1,O_PC(A0) ;save it 1006F6 6104 329 BSR PREG ;call to disp. regs. 1006F8 6000 FD2C 330 BRA GETCMD ;done 331 * 1006FC 47FA F602 332 PREG LEA.L REGAREA,A3 ;point to save area 100700 7050 333 MOVEQ #'P',D0 100702 6100 008C 334 BSR WRCH 100706 7043 335 MOVEQ #'C',D0 100708 6100 0086 336 BSR WRCH 10070C 6100 0152 337 BSR BLANK 100710 242B 0042 338 MOVE.L O_PC(A3),D2 100714 6100 0194 339 BSR PRINT_LONG 100718 6100 0146 340 BSR BLANK 10071C 7053 341 MOVEQ #'S',D0 10071E 6170 342 BSR WRCH 100720 7052 343 MOVEQ #'R',D0 100722 616C 344 BSR WRCH 100724 6100 013A 345 BSR BLANK 100728 342B 0040 346 MOVE.W O_SR(A3),D2 10072C 6100 0172 347 BSR PRINT_WORD 100730 6100 0120 348 BSR CRLF 349 * 100734 47FA F5CA 350 LEA.L REGAREA,A3 100738 7844 351 MOVEQ #'D',D4 10073A 6102 352 BSR.S REG1 10073C 7841 353 MOVEQ #'A',D4 354 * drop through to 10073E 7600 355 REG1 MOVEQ #0,D3 100740 1004 356 REG2 MOVE.B D4,D0 100742 614C 357 BSR WRCH 100744 1203 358 MOVE.B D3,D1 100746 6100 0142 359 BSR TO_ASCII 10074A 6100 0114 360 BSR BLANK 10074E 5203 361 ADDQ.B #1,D3 100750 241B 362 MOVE.L (A3)+,D2 100752 6100 0156 363 BSR PRINT_LONG 100756 0C03 0008 364 CMP.B #8,D3 10075A 6710 365 BEQ.S REG3 10075C 6100 0102 366 BSR BLANK 100760 0C03 0004 367 CMP.B #4,D3 100764 66DA 368 BNE.S REG2 100766 6100 00EA 369 BSR CRLF 10076A 60D4 370 BRA.S REG2 10076C 6000 00E4 371 REG3 BRA CRLF 372 * 100770 2F08 373 T2EX MOVE.L A0,-(SP) ;save a0 for now 100772 207A F58C 374 MOVEA.L REGAREA,A0 ;point to save area 375 100776 48D07FFF 376 MOVEM.L D0-D7/A0-A6,(A0) ;save all regs. 10077A 215F 0020 377 MOVE.L (SP)+,O_A0(A0) ;fix real a0 10077E 225F 378 MOVE.L (SP)+,A1 ;get ret. addr. 100780 315F 0040 379 MOVE.W (SP)+,O_SR(A0) ;save SR 100784 215F 0042 380 MOVE.L (SP)+,O_PC(A0) ;save PC 100788 4E6A 381 MOVE.L USP,A2 ;save USP 10078A 214A 003C 382 MOVE.L A2,O_A7(A0) ;save in a7 383 10078E 4E75 384 RTS 385 * 100790 49F9 00700001 386 WRCH LEA.L duart,A4 ;point to DUART 100796 082C 0002 0002 387 WRCH1 BTST.B #2,sra(A4) ;check the TxRDY bit 10079C 67F8 388 BEQ WRCH1 ;loop until ready 10079E 1940 0006 389 MOVE.B D0,tba(A4) ;send the character 1007A2 4E75 390 RTS 391 * 1007A4 6100 01A4 392 EDIT BSR GET_ADDR ;get starting address 1007A8 2442 393 MOVEA.L D2,A2 ;A2 is the memory pointer 1007AA 6100 00A6 394 NEW_DATA BSR CRLF ;new line please 1007AE 240A 395 MOVE.L A2,D2 ;print data address 1007B0 6100 00F8 396 BSR PRINT_LONG 1007B4 6100 00AA 397 BSR BLANK 1007B8 1412 398 MOVE.B (A2),D2 ;get the data 1007BA 6100 00C6 399 BSR PRINT_BYTE ;and show it 1007BE 123C 003F 400 MOVE.B #'?',D1 ;output change prompt 1007C2 617A 401 BSR CHAR_OUT 1007C4 6100 0130 402 BSR GET_BYTE_T ;get new data 1007C8 0C02 002A 403 CMPI.B #'*',D2 ;no change requested? 1007CC 6602 404 BNE ENTER_IT ;jump if new data entered 1007CE 1212 405 MOVE.B (A2),D1 ;get old data back 1007D0 14C1 406 ENTER_IT MOVE.B D1,(A2)+ ;save data and increment pointer 1007D2 61D6 407 BSR NEW_DATA 408 * 409 * initialize DUART 410 * 1007D4 41F9 00700001 411 INIT_DUART LEA.L duart,A0 1007DA 117C 0000 0008 412 MOVE.B #0,acr(A0) 1007E0 117C 00CC 0002 413 MOVE.B #$CC,csra(A0) ;chan. A = 38.4k 1007E6 117C 0010 0004 414 MOVE.B #$10,cra(A0) ;point to mr1a 1007EC 10BC 0093 415 MOVE.B #$93,mr1a(A0) ;$13 for no hdw. flow ctrl 1007F0 10BC 0037 416 MOVE.B #$37,mr2a(A0) ;$07 for no hdw. flow ctrl 1007F4 117C 00CC 0012 417 MOVE.B #$CC,csrb(A0) ;chan. B = 38.4k 1007FA 117C 0010 0014 418 MOVE.B #$10,crb(A0) ;point to mr1b 100800 117C 0093 0010 419 MOVE.B #$93,mr1b(A0) ;$13 for no hdw. flow ctrl 100806 117C 0037 0010 420 MOVE.B #$37,mr2b(A0) ;$07 for no hdw. flow ctrl 10080C 117C 0005 0004 421 MOVE.B #5,cra(A0) ;enable TxDA, RxDA 100812 117C 0005 0014 422 MOVE.B #5,crb(A0) ;enable TxDB, RxDB 100818 4E75 423 RTS 424 ; 10081A 41F9 00700001 425 INSTAT LEA.L duart,A0 ;point to DUART 100820 1028 0002 426 MOVE.B sra(A0),D0 ;get ACIA status 100824 0200 0001 427 ANDI.B #1,D0 ;test RxRDY bit 100828 4E75 428 RTS 429 ; 10082A 61EE 430 CHAR_IN BSR INSTAT ;check receiver status 10082C 67FC 431 BEQ CHAR_IN ;loop if no character waiting 10082E 41F9 00700001 432 LEA.L duart,A0 ;point to DUART 100834 1228 0006 433 MOVE.B tba(A0),D1 ;get the ASCII character 100838 0201 007F 434 ANDI.B #$7F,D1 ;strip off MSB 10083C 4E75 435 RTS 436 ; 10083E 41F9 00700001 437 CHAR_OUT LEA.L duart,A0 ;point to DUART 100844 0828 0002 0002 438 CHAR_OUT2 BTST.B #2,sra(A0) ;check status 10084A 67F8 439 BEQ CHAR_OUT2 ;loop if not ready 10084C 1141 0006 440 MOVE.B D1,tba(A0) ;send it out 100850 4E75 441 RTS 442 ; 100852 123C 000D 443 CRLF MOVE.B #$0D,D1 ;send ASCII CR 100856 61E6 444 BSR CHAR_OUT 100858 123C 000A 445 MOVE.B #$0A,D1 ;send ASCII LF 10085C 61E0 446 BSR CHAR_OUT 10085E 4E75 447 RTS 448 ; 100860 123C 0020 449 BLANK MOVE.B #$20,D1 ;send ASCII SP 100864 61D8 450 BSR CHAR_OUT 100866 4E75 451 RTS 452 ; 100868 1213 453 PRINT_MSG MOVE.B (A3),D1 ;get a character 10086A 0C01 0000 454 CMP.B #0,D1 ;end of message? 10086E 6706 455 BEQ PRINT_MSG2 100870 61CC 456 BSR CHAR_OUT ;send character to display 100872 528B 457 ADDQ.L #1,A3 ;point to next character 100874 60F2 458 BRA PRINT_MSG 100876 4E75 459 PRINT_MSG2 RTS 460 ; 100878 267C 00100B31 461 SIGN_ON MOVEA.L #HELLO,A3 ;get starting message address 10087E 61E8 462 BSR PRINT_MSG ;send the message 100880 4E75 463 RTS 464 ; 100882 2202 465 PRINT_BYTE MOVE.L D2,D1 ;init conversion register 100884 E919 466 ROL.B #4,D1 ;look at upper nibble first 100886 6102 467 BSR TO_ASCII ;print ASCII equivalent 100888 2202 468 MOVE.L D2,D1 ;repeat for lower nibble 10088A 0201 000F 469 TO_ASCII ANDI.B #$0F,D1 ;strip off upper nibble 10088E 0601 0030 470 ADDI.B #$30,D1 ;add ASCII bias 100892 0C01 003A 471 CMPI.B #$3A,D1 ;test for alpha conversion 100896 6B04 472 BMI NO_ADD 100898 0601 0007 473 ADDI.B #7,D1 ;correct to 41H-47H (A-F) 10089C 61A0 474 NO_ADD BSR CHAR_OUT ;send character 10089E 4E75 475 RTS 476 ; 1008A0 E15A 477 PRINT_WORD ROL.W #8,D2 ;get upper 8 bits 1008A2 61DE 478 BSR PRINT_BYTE ;output first two characters 1008A4 E15A 479 ROL.W #8,D2 ;now do the lower 8 bits 1008A6 61DA 480 BSR PRINT_BYTE 1008A8 4E75 481 RTS 482 ; 1008AA 4842 483 PRINT_LONG SWAP D2 ;get upper 16 bits 1008AC 61F2 484 BSR PRINT_WORD ;do 4 character conversion 1008AE 4842 485 SWAP D2 ;and repeat for lower word 1008B0 61EE 486 BSR PRINT_WORD 1008B2 4E75 487 RTS 488 ; 1008B4 0C01 0047 489 VALDIG CMPI.B #'G',D1 ;greater than F? 1008B8 6A16 490 BPL ERROR 1008BA 0C01 0030 491 CMPI.B #'0',D1 ;less than 0? 1008BE 6B10 492 BMI ERROR 1008C0 0C01 003A 493 CMPI.B #'9'+1,D1 ;is it now A-F? 1008C4 6A02 494 BPL NEXT_TST 1008C6 4E75 495 RTS ;range is 0-9 1008C8 0C01 0041 496 NEXT_TST CMPI.B #'A',D1 ;less than A? 1008CC 6B02 497 BMI ERROR 1008CE 4E75 498 RTS ;range is A-F 499 ; 1008D0 267C 001008DC 500 ERROR MOVEA.L #WHAT,A3 ;get message pointer 1008D6 6190 501 BSR PRINT_MSG 1008D8 6000 FB4C 502 BRA GETCMD ;restart monitor program 1008DC 0D0A 503 WHAT DC.B $0D,$0A ;newline 1008DE 576861743F 504 DC.B 'What?' 1008E3 0D0A00 505 DC.B $0D,$0A,0 ;newline and end characters 506 ; 1008E6 0401 0030 507 TO_HEX SUBI.B #$30,D1 ;remove ASCII bias 1008EA 0C01 000A 508 CMPI.B #$0A,D1 ;0-9? 1008EE 6B04 509 BMI FIN_CONV 1008F0 0401 0007 510 SUBI.B #7,D1 ;remove alpha bias 1008F4 4E75 511 FIN_CONV RTS 512 ; 1008F6 2C7C 000FFE00 513 GET_BYTE_T MOVEA.L #BUFF,A6 ;TRAP entry point 1008FC 6100 00BA 514 BSR GETLINE 100900 2C7C 000FFE00 515 MOVEA.L #BUFF,A6 100906 6100 0114 516 GET_BYTE BSR SKIP_BLK ;MON entry point 10090A 121E 517 MOVE.B (A6)+,D1 ;get first digit 10090C 6100 0098 518 BSR UPPER_CASE 100910 0C01 000D 519 CMPI.B #$0D,D1 ;test for CR 100914 6720 520 BEQ NO_CHAN 100916 0C01 0020 521 CMPI.B #$20,D1 ;test for SP 10091A 671A 522 BEQ NO_CHAN 10091C 6196 523 BSR VALDIG ;check for valid digit 10091E 61C6 524 BSR TO_HEX ;convert into hex 100920 E919 525 ROL.B #4,D1 ;move first digit 100922 1401 526 MOVE.B D1,D2 ;save first digit 100924 121E 527 MOVE.B (A6)+,D1 ;get second digit 100926 6100 007E 528 BSR UPPER_CASE 10092A 6188 529 BSR VALDIG ;check for valid digit 10092C 61B8 530 BSR TO_HEX ;convert into hex 10092E D202 531 ADD.B D2,D1 ;form final result 100930 143C 0030 532 MOVE.B #'0',D2 ;change entered 100934 4E75 533 RTS 100936 143C 002A 534 NO_CHAN MOVE.B #'*',D2 ;no change character 10093A 4E75 535 RTS 536 ; 10093C 2C7C 000FFE00 537 GET_ADDR_T MOVEA.L #BUFF,A6 100942 6174 538 BSR GETLINE 100944 2C7C 000FFE00 539 MOVEA.L #BUFF,A6 10094A 6100 00D0 540 GET_ADDR BSR SKIP_BLK 10094E 4281 541 CLR.L D1 ;init temp register 100950 4282 542 CLR.L D2 ;init result register 100952 121E 543 NEXT_CHAR MOVE.B (A6)+,D1 ;get a character 100954 6150 544 BSR UPPER_CASE 100956 0C01 000D 545 CMPI.B #$0D,D1 ;exit if CR 10095A 6718 546 BEQ EXIT_ADR 10095C 0C01 0020 547 CMPI.B #$20,D1 ;exit if SP 100960 6712 548 BEQ EXIT_ADR 100962 6100 FF50 549 BSR VALDIG ;test for valid digit 100966 6100 FF7E 550 BSR TO_HEX ;convert digit into hex 10096A E99A 551 ROL.L #4,D2 ;prepare D2 for new digit 10096C 0202 00F0 552 ANDI.B #$F0,D2 100970 D401 553 ADD.B D1,D2 ;insert new digit 100972 60DE 554 BRA NEXT_CHAR ;and continue 100974 4E75 555 EXIT_ADR RTS 556 ; 100976 6100 FEA2 557 PANIC BSR INSTAT ;check for key 10097A 670C 558 BEQ EXIT_BRK ;return if none hit 10097C 6100 FEAC 559 TEST_KEY BSR CHAR_IN ;get key 100980 0C01 0003 560 TEST_KEY2 CMPI.B #3,D1 ;Control-C? 100984 6700 FAA0 561 BEQ GETCMD ;if yes, restart monitor 100988 4E75 562 EXIT_BRK RTS 563 ; 10098A 6100 FE8E 564 FREEZE BSR INSTAT ;check for key 10098E 670C 565 BEQ EXIT_FREZ ;return if none hit 100990 6100 FE98 566 BSR CHAR_IN ;get key 100994 0C01 0013 567 CMPI.B #$13,D1 ;Control-S? 100998 6704 568 BEQ HOLD_IT 10099A 60E4 569 BRA TEST_KEY2 ;Control-C? 10099C 4E75 570 EXIT_FREZ RTS 10099E 6100 FE7A 571 HOLD_IT BSR INSTAT ;wait for another key 1009A2 67FA 572 BEQ HOLD_IT 1009A4 60D6 573 BRA TEST_KEY ;let PANIC check for Control-C 574 ; 1009A6 0C01 0061 575 UPPER_CASE CMPI.B #'a',D1 ;check for lower case 1009AA 6B0A 576 BMI NO_CHG 1009AC 0C01 007B 577 CMPI.B #'z'+1,D1 ;first code after 'z' 1009B0 6A04 578 BPL NO_CHG 1009B2 0201 00DF 579 ANDI.B #$DF,D1 ;switch to upper case 1009B6 4E75 580 NO_CHG RTS 581 ; 1009B8 2A4E 582 GETLINE MOVEA.L A6,A5 ;copy pointer 1009BA 2C4D 583 GETLINE2 MOVEA.L A5,A6 ;reset pointer and 1009BC 4206 584 CLR.B D6 ;counter for scraped lines 1009BE 6100 FE6A 585 GET_CHARS BSR CHAR_IN ;get character 1009C2 0C01 000D 586 CMPI.B #$0D,D1 ;CR ends get line 1009C6 671C 587 BEQ EXIT 1009C8 0C01 0008 588 CMPI.B #$08,D1 ;back space key and the 1009CC 6726 589 BEQ BKSPS ;delete key are 1009CE 0C01 007F 590 CHECK_DELETE CMPI.B #$7F,D1 ;back space keys 1009D2 6720 591 BEQ BKSPS 1009D4 0C01 0015 592 CMPI.B #$15,D1 ;check for ^U and scrap the 1009D8 6714 593 BEQ LINE_REDO ;line if encountered 1009DA 1CC1 594 MOVE.B D1,(A6)+ ;otherwise place character 1009DC 5206 595 ADDQ.B #1,D6 ;in buffer, update counter and 1009DE 6100 FE5E 596 BSR CHAR_OUT ;echo it to the screen 1009E2 60DA 597 BRA GET_CHARS ;get another character 1009E4 1C81 598 EXIT MOVE.B D1,(A6) ;on exit place $0D in buffer and 1009E6 5206 599 ADDQ.B #1,D6 ;count it 1009E8 6100 FE68 600 BSR CRLF 1009EC 4E75 601 RTS 1009EE 6100 FE62 602 LINE_REDO BSR CRLF ;clean up the screen 1009F2 60C6 603 BRA GETLINE2 ;start over 1009F4 0C06 0000 604 BKSPS CMPI.B #0,D6 1009F8 67C4 605 BEQ GET_CHARS 1009FA 5306 606 SUBQ.B #1,D6 1009FC 9DFC 00000001 607 SUBA.L #1,A6 100A02 123C 0008 608 MOVE.B #8,D1 100A06 6100 FE36 609 BSR CHAR_OUT 100A0A 123C 0020 610 MOVE.B #' ',D1 100A0E 6100 FE2E 611 BSR CHAR_OUT 100A12 123C 0008 612 MOVE.B #8,D1 100A16 6100 FE26 613 BSR CHAR_OUT 100A1A 60A2 614 BRA GET_CHARS 615 ; 100A1C 0C16 0020 616 SKIP_BLK CMPI.B #' ',(A6) 100A20 6608 617 BNE EXIT_SKIP 100A22 DDFC 00000001 618 ADDA.L #1,A6 100A28 60F2 619 BRA SKIP_BLK 100A2A 4E75 620 EXIT_SKIP RTS 621 ; 100A2C 267C 00100AAA 622 BUS_ERROR MOVEA.L #MSG_1,A3 100A32 6066 623 BRA REPORT 100A34 267C 00100AB4 624 ADRS_ERROR MOVEA.L #MSG_2,A3 100A3A 605E 625 BRA REPORT 100A3C 267C 00100AC2 626 ILLEGAL_INST MOVEA.L #MSG_3,A3 100A42 6056 627 BRA REPORT 100A44 267C 00100ADC 628 DIV_ZERO MOVEA.L #MSG_4,A3 100A4A 604E 629 BRA REPORT 100A4C 267C 00100AF1 630 TRAP_V MOVEA.L #MSG_5,A3 100A52 6046 631 BRA REPORT 100A54 267C 00100B00 632 LEVEL_7 MOVEA.L #MSG_6,A3 100A5A 603E 633 BRA REPORT 100A5C 6100 FDCC 634 TO_CHAR_IN BSR CHAR_IN 100A60 4E73 635 RTE 100A62 6100 FDDA 636 TO_CHAR_OUT BSR CHAR_OUT 100A66 4E73 637 RTE 100A68 6100 FDE8 638 TO_CRLF BSR CRLF 100A6C 4E73 639 RTE 100A6E 6100 FDF8 640 TO_PRINT_MSG BSR PRINT_MSG 100A72 4E73 641 RTE 100A74 6100 FE0C 642 TO_PRINT_BYTE BSR PRINT_BYTE 100A78 4E73 643 RTE 100A7A 6100 FE24 644 TO_PRINT_WORD BSR PRINT_WORD 100A7E 4E73 645 RTE 100A80 6100 FE28 646 TO_PRINT_LONG BSR PRINT_LONG 100A84 4E73 647 RTE 100A86 6100 FE6E 648 TO_GET_BYTE BSR GET_BYTE_T 100A8A 4E73 649 RTE 100A8C 6100 FEAE 650 TO_GET_ADDR BSR GET_ADDR_T 100A90 4E73 651 RTE 100A92 4E73 652 TRACE RTE 100A94 267C 00100B5D 653 HELP MOVEA.L #H_MSG1,A3 100A9A 6100 FDB6 654 REPORT BSR CRLF ;new line thank you 100A9E 6100 FDC8 655 BSR PRINT_MSG ;print message pointed to by A3 100AA2 6100 FDAE 656 BSR CRLF 100AA6 6000 F97E 657 BRA GETCMD 658 100AAA 427573204572726F7200 659 MSG_1 DC.B 'Bus Error',0 100AB4 41646472657373204572726F 660 MSG_2 DC.B 'Address Error',0 100AC2 496C6C6567616C20496E7374 661 MSG_3 DC.B 'Illegal Instruction Error',0 100ADC 446976696465206279205A65 662 MSG_4 DC.B 'Divide by Zero Error',0 100AF1 5452415056204F766572666C 663 MSG_5 DC.B 'TRAPV Overflow',0 100B00 4C6576656C2D3720496E7465 664 MSG_6 DC.B 'Level-7 Interrupt',0 100B12 496E76616C696420696E7075 665 INPERR DC.B 'Invalid input',$d,$a,0 100B22 42616420636865636B73756D 666 CKSERR DC.B 'Bad checksum',$d,$a,0 667 100B31 0D0A 668 HELLO DC.B $0D,$0A ;newline 100B33 3638303030204D6F6E69746F 669 DC.B '68000 Monitor, Version 7.5, C1995 JLACD' 100B5A 0D0A00 670 DC.B $0D,$0A,0 ;newline and end characters 671 100B5D 0D0A0D0A 672 H_MSG1 DC.B $0D,$0A,$0D,$0A 100B61 2A2A2A203638303030204370 673 DC.B '*** 68000 Cpu-based Single Board Computer ***' 100B8E 0D0A 674 DC.B $0D,$0A 100B90 436F6D6D616E642053796E74 675 DC.B 'Command Syntax Action' 100BAD 0D0A0A 676 DC.B $0D,$0A,$0A 100BB0 44554D502034303020343446 677 DC.B 'DUMP 400 44F Display memory contents' 100BDE 0D0A 678 DC.B $0D,$0A 100BE0 202020202020202020202020 679 DC.B ' Ctrl-S freezes display' 100C0D 0D0A 680 DC.B $0D,$0A 100C0F 202020202020202020202020 681 DC.B ' Any key restarts display' 100C3E 0D0A 682 DC.B $0D,$0A 100C40 202020202020202020202020 683 DC.B ' Ctrl-C cancels dump' 100C6A 0D0A0A 684 DC.B $0D,$0A,$0A 100C6D 454449542038303030202020 685 DC.B 'EDIT 8000 Load RAM starting at 8000' 100C9D 0D0A 686 DC.B $0D,$0A 100C9F 202020202020202020202020 687 DC.B ' Use CR or blank to keep data' 100CD2 0D0A 688 DC.B $0D,$0A 100CD4 202020202020202020202020 689 DC.B ' Ctrl-C cancels patching' 100D02 0D0A0A 690 DC.B $0D,$0A,$0A 100D05 474F20383030302020202020 691 DC.B 'GO 8000 Execute program at 8000' 100D33 0D0A0A 692 DC.B $0D,$0A,$0A 100D36 4D4F56452038303030203830 693 DC.B 'MOVE 8000 80FF 8100 Move memory contents' 100D61 0D0A0A 694 DC.B $0D,$0A,$0A 100D64 46494C4C2031303020323030 695 DC.B 'FILL 100 200 00 Fill memory 100 to 200 with 0' 100D98 0D0A0A 696 DC.B $0D,$0A,$0A 100D9B 565246592031343030203135 697 DC.B 'VRFY 1400 1500 2000 Verify memory 1400 to 1500 with 2000' 100DD6 0D0A0A 698 DC.B $0D,$0A,$0A 100DD9 4C4F41442020202020202020 699 DC.B 'LOAD Load S-record file' 100E02 0D0A0A 700 DC.B $0D,$0A,$0A 100E05 524547532020202020202020 701 DC.B 'REGS Display registers' 100E2D 0D0A0A 702 DC.B $0D,$0A,$0A 100E30 416C6C20636F6D6D616E6473 703 DC.B 'All commands may be shortened to single letters.' 100E60 0D0A 704 DC.B $0D,$0A 100E62 55736520442C20452C20472C 705 DC.B 'Use D, E, G, M, F, V, L, R, or H. Lower case characters' 100E99 0D0A 706 DC.B $0D,$0A 100E9B 61732077656C6C2E 707 DC.B 'as well.' 100EA3 0D0A0A 708 DC.B $0D,$0A,$0A 100EA6 546869732036383030302073 709 DC.B 'This 68000 system was designed and programmed by' 100ED6 0D0A 710 DC.B $0D,$0A 100ED8 4A616D657320416E746F6E61 711 DC.B 'James Antonakos, Alan Dixon and Donovan McCarty.' 100F08 0D0A00 712 DC.B $0D,$0A,0 100F0B 713 END START End of assembly - no errors were found. Heap usage: -w4095,96 Total hunk sizes: 100f0c code, 0 data, 0 BSS