Mercurial > hg > Members > kono > os9 > sbc09
diff src/monitor.lst @ 57:2088fd998865
sbc09 directry clean up
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 23 Jul 2018 16:07:12 +0900 |
parents | |
children | ef64e3f4e229 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/monitor.lst Mon Jul 23 16:07:12 2018 +0900 @@ -0,0 +1,3052 @@ +0000: ;Buggy machine language monitor and rudimentary O.S. version 1.0 +0000: +0000: * Memory map of SBC +0000: * $0-$40 Zero page variables reserved by monitor and O.S. +0000: * $40-$FF Zero page portion for user programs. +0000: * $100-$17F Xmodem buffer 0, terminal input buffer, +0000: * $180-$1FF Xmodem buffer 1, terminal output buffer. +0000: * $200-$27F Terminal input line. +0000: * $280-$2FF Variables reserved by monitor and O.S. +0000: * $300-$400 System stack. +0000: * $400-$7FFF RAM for user programs and data. +0000: * $8000-$DFFF PROM for user programs. +0000: * $E000-$E1FF I/O addresses. +0000: * $E200-$E3FF Reserved. +0000: * $E400-$FFFF Monitor ROM +0000: +0000: * Reserved Zero page addresses +0000: org $0000 +0000: setdp 0 +0000: * First the I/O routine vectors. +0000: getchar rmb 3 ;Jump to getchar routine. +0003: putchar rmb 3 ;Jump to putchar routine. +0006: getline rmb 3 ;Jump to getline routine. +0009: putline rmb 3 ;Jump to putline routine. +000C: putcr rmb 3 ;Jump to putcr routine. +000F: getpoll rmb 3 ;Jump to getpoll routine. +0012: xopenin rmb 3 ;Jump to xopenin routine. +0015: xopenout rmb 3 ;Jump to xopenout routine. +0018: xabortin rmb 3 ;Jump to xabortin routine. +001B: xclosein rmb 3 ;Jump to xclosein routine. +001E: xcloseout rmb 3 ;Jump to xcloseout routine. +0021: delay rmb 3 ;Jump to delay routine. +0024: +0024: *Next the system variables in the zero page. +0024: temp rmb 2 ;hex scanning/disasm +0026: temp2 rmb 2 ;Hex scanning/disasm +0028: temp3 rmb 2 ;Used in Srecords, H command +002A: timer rmb 3 ;3 byte timer, incremented every 20ms +002D: xpacknum rmb 1 ;Packet number for XMODEM block, +002E: xsum rmb 1 ;XMODEM checksum +002F: lastok rmb 1 ;flag to indicate last block was OK +0030: xcount rmb 1 ;Count of characters in buffer. +0031: xmode rmb 1 ;XMODEM mode, 0 none, 1 out, 2 in. +0032: +0032: * I/O buffers. +0080: buflen equ 128 ;Length of input line buffer. +0032: org $100 +0100: buf0 rmb 128 ;Xmodem buffer 0, serial input buffer. +0180: buf1 rmb 128 ;Xmodem buffer 1, serial output buffer. +0200: linebuf rmb buflen ;Input line buffer. +0280: +0280: +0280: * Interrupt vectors (start at $280) +0280: * All interrupts except RESET are vectored through jumps. +0280: * FIRQ is timer interrupt, IRQ is ACIA interrupt. +0280: swi3vec rmb 3 +0283: swi2vec rmb 3 +0286: firqvec rmb 3 +0289: irqvec rmb 3 +028C: swivec rmb 3 +028F: nmivec rmb 3 +0292: xerrvec rmb 3 ;Error handler for XMODEM error. +0295: exprvec rmb 3 ;Expression evaluator in assembler. +0298: asmerrvec rmb 3 ;Error handler for assembler errors. +029B: +029B: * Next the non zero page system variables. +029B: oldpc rmb 2 ;Saved pc value for J command. +029D: addr rmb 2 ;Address parameter. +029F: length rmb 2 ;Length parameter. +02A1: +0004: brkpoints equ 4 ;Number of settable breakpoints. +02A1: bpaddr rmb brkpoints*3 ;Address and byte for each break point. +02AD: stepbp rmb 3 ;Address of P command break point. +02B0: +02B0: sorg rmb 2 ;Origin address of S record entry. +02B2: soffs rmb 2 ;Offset load adrr-addr in record +02B4: +02B4: oldgetc rmb 2 ;Old getchar address. +02B6: oldputc rmb 2 ;Old putchar address. +02B8: oldputcr rmb 2 ;Old putcr address. +02BA: lastterm rmb 1 ;Last terminating character. +02BB: filler rmb 1 ;Filler at end of XMODEM file. +02BC: xmcr rmb 1 ;end-of-line characters for XMODEM send. +02BD: savesp rmb 2 ;Save sp to restore it on error. +02BF: +02BF: * Following variables are used by assembler/disassembler. +02BF: prebyte rmb 1 +02C0: opc1 rmb 1 +02C1: opcode rmb 1 +02C2: postbyte rmb 1 +02C3: amode rmb 1 +02C4: operand rmb 2 +02C6: mnembuf rmb 5 ;Buffer to store capitalized mnemonic. +02CB: opsize rmb 1 ;SIze (in bytes) of extra oeprand (0--2) +02CC: uncert rmb 1 ;Flag to indicate that op is unknown. +02CD: dpsetting rmb 2 +02CF: +02CF: endvars equ * +02CF: +0400: ramstart equ $400 ;first free RAM address. +02CF: +8000: ramtop equ $8000 ;top of RAM. +02CF: +02CF: * I/O port addresses +E000: aciactl equ $e000 ;Control port of ACIA +E000: aciasta equ $e000 ;Status port of ACIA +E001: aciadat equ $e001 ;Data port of ACIA +02CF: +02CF: * ASCII control characters. +0001: SOH equ 1 +0004: EOT equ 4 +0006: ACK equ 6 +0008: BS equ 8 +0009: TAB equ 9 +000A: LF equ 10 +000D: CR equ 13 +0015: NAK equ 21 +0018: CAN equ 24 +007F: DEL equ 127 +02CF: +00DF: CASEMASK equ $DF ;Mask to make lowercase into uppercase. +02CF: +02CF: * Monitor ROM starts here. +02CF: org $E400 +E400: +E400: 1AFF reset orcc #$FF ;Disable interrupts. +E402: 4F clra +E403: 1F8B tfr a,dp ;Set direct page register to 0. +E405: 10CE0400 lds #ramstart +E409: 8EE520 ldx #intvectbl +E40C: CE0280 ldu #swi3vec +E40F: C61B ldb #osvectbl-intvectbl +E411: 8D37 bsr blockmove ;Initialize interrupt vectors from ROM. +E413: 8EE53B ldx #osvectbl +E416: CE0000 ldu #0 +E419: C624 ldb #endvecs-osvectbl +E41B: 8D2D bsr blockmove ;Initialize I/O vectors from ROM. +E41D: 8D33 bsr initacia ;Initialize serial port. +E41F: 1C00 andcc #$0 ;Enable interrupts +E421: * Put the 'saved' registers of the program being monitored on top of the +E421: * stack. There are 12 bytes on the stack for cc,b,a,dp,x,y,u and pc +E421: * pc is initialized to $400, the rest to zero. +E421: 8E0000 ldx #0 +E424: 1F12 tfr x,y +E426: CE0400 ldu #ramstart +E429: 3450 pshs x,u +E42B: 3430 pshs x,y +E42D: 3430 pshs x,y +E42F: 8E029B ldx #oldpc +E432: C634 ldb #endvars-oldpc +E434: 6F80 clvar clr ,x+ +E436: 5A decb +E437: 26FB bne clvar ;Clear the variable area. +E439: CC1A03 ldd #$1A03 +E43C: FD02BB std filler ;Set XMODEM filler and end-of-line. +E43F: 8EE5E2 ldx #welcome +E442: BDE502 jsr outcount +E445: 9D0C jsr putcr ;Print a welcome message. +E447: 7EE579 jmp cmdline +E44A: * Block move routine, from X to U length B. Modifies them all and A. +E44A: A680 blockmove lda ,x+ +E44C: A7C0 sta ,u+ +E44E: 5A decb +E44F: 26F9 bne blockmove +E451: 39 rts +E452: +E452: * Initialize serial communications port, buffers, interrupts. +E452: C603 initacia ldb #$03 +E454: F7E000 stb aciactl +E457: C635 ldb #%00110101 +E459: 39 rts +E45A: +E45A: * O.S. routine to read a character into B register. +E45A: F6E000 osgetc ldb aciasta +E45D: C501 bitb #$01 +E45F: 27F9 beq osgetc +E461: F6E001 ldb aciadat +E464: 39 rts +E465: +E465: ;O.S. rotuine to check if there is a character ready to be read. +E465: F6E000 osgetpoll ldb aciasta +E468: C501 bitb #$01 +E46A: 2602 bne poltrue +E46C: 5F clrb +E46D: 39 rts +E46E: C6FF poltrue ldb #$ff +E470: 39 rts +E471: +E471: * O.S. routine to write the character in the B register. +E471: 3402 osputc pshs a +E473: B6E000 putcloop lda aciasta +E476: 8502 bita #$02 +E478: 27F9 beq putcloop +E47A: F7E001 stb aciadat +E47D: 3502 puls a +E47F: 39 rts +E480: +E480: * O.S. routine to read a line into memory at address X, at most B chars +E480: * long, return actual length in B. Permit backspace editing. +E480: 3412 osgetl pshs a,x +E482: D724 stb temp +E484: 4F clra +E485: 9D00 osgetl1 jsr getchar +E487: C47F andb #$7F +E489: C108 cmpb #BS +E48B: 2704 beq backsp +E48D: C17F cmpb #DEL +E48F: 2614 bne osgetl2 +E491: 4D backsp tsta ;Recognize BS and DEL as backspace key. +E492: 27F1 beq osgetl1 ;ignore if line already zero length. +E494: C608 ldb #BS +E496: 9D03 jsr putchar +E498: C620 ldb #' ' +E49A: 9D03 jsr putchar +E49C: C608 ldb #BS ;Send BS,space,BS. This erases last +E49E: 9D03 jsr putchar ;character on most terminals. +E4A0: 301F leax -1,x ;Decrement address. +E4A2: 4A deca +E4A3: 20E0 bra osgetl1 +E4A5: C10D osgetl2 cmpb #CR +E4A7: 270D beq newline +E4A9: C10A cmpb #LF +E4AB: 2613 bne osgetl3 ;CR or LF character ends line. +E4AD: F602BA ldb lastterm +E4B0: C10D cmpb #CR +E4B2: 27D1 beq osgetl1 ;Ignore LF if it comes after CR +E4B4: C60A ldb #LF +E4B6: F702BA newline stb lastterm +E4B9: 9D0C jsr putcr +E4BB: 1F89 tfr a,b ;Move length to B +E4BD: 3512 puls a,x ;restore registers. +E4BF: 39 rts ;<--- Here is the exit point. +E4C0: C109 osgetl3 cmpb #TAB +E4C2: 270F beq dotab +E4C4: C120 cmpb #' ' +E4C6: 25BD blo osgetl1 ;Ignore control characters. +E4C8: 9124 cmpa temp +E4CA: 27B9 beq osgetl1 ;Ignore char if line full. +E4CC: 9D03 jsr putchar ;Echo the character. +E4CE: E780 stb ,x+ ;Store it in memory. +E4D0: 4C inca +E4D1: 20B2 bra osgetl1 +E4D3: C620 dotab ldb #' ' +E4D5: 9124 cmpa temp +E4D7: 27AC beq osgetl1 +E4D9: 9D03 jsr putchar +E4DB: E780 stb ,x+ +E4DD: 4C inca +E4DE: 8507 bita #7 ;Insert spaces until length mod 8=0 +E4E0: 26F1 bne dotab +E4E2: 20A1 bra osgetl1 +E4E4: +E4E4: * O.S. routine to write a line starting at address X, B chars long. +E4E4: 3416 osputl pshs a,b,x +E4E6: 1F98 tfr b,a +E4E8: 4D tsta +E4E9: 2707 beq osputl1 +E4EB: E680 osputl2 ldb ,x+ +E4ED: 9D03 jsr putchar +E4EF: 4A deca +E4F0: 26F9 bne osputl2 +E4F2: 3516 osputl1 puls a,b,x +E4F4: 39 rts +E4F5: +E4F5: * O.S. routine to terminate a line. +E4F5: 3404 oscr pshs b +E4F7: C60D ldb #CR +E4F9: 9D03 jsr putchar +E4FB: C60A ldb #LF +E4FD: 9D03 jsr putchar ;Send the CR and LF characters. +E4FF: 3504 puls b +E501: 39 rts +E502: +E502: * Output a counted string at addr X +E502: 3414 outcount pshs x,b +E504: E680 ldb ,x+ +E506: 9D09 jsr putline +E508: 3514 puls x,b +E50A: 39 rts +E50B: +E50B: 0C2C timerirq inc timer+2 +E50D: 2608 bne endirq +E50F: 0C2B inc timer+1 +E511: 2604 bne endirq +E513: 0C2A inc timer +E515: 3B rti +E516: 12 aciairq nop +E517: 3B endirq rti +E518: +E518: * Wait D times 20ms. +E518: D32B osdly addd timer+1 +E51A: 10932B dlyloop cmpd timer+1 +E51D: 26FB bne dlyloop +E51F: 39 rts +E520: +E520: * This table will be copied to the interrupt vector area in RAM. +E520: 7EE517 intvectbl jmp endirq +E523: 7EE517 jmp endirq +E526: 7EE50B jmp timerirq +E529: 7EE516 jmp aciairq +E52C: 7EE56A jmp unlaunch +E52F: 7EE517 jmp endirq +E532: 7EEE4B jmp xerrhand +E535: 7EF6F9 jmp expr +E538: 7E0298 jmp asmerrvec +E53B: * And this one to the I/O vector table. +E53B: 7EE45A osvectbl jmp osgetc +E53E: 7EE471 jmp osputc +E541: 7EE480 jmp osgetl +E544: 7EE4E4 jmp osputl +E547: 7EE4F5 jmp oscr +E54A: 7EE465 jmp osgetpoll +E54D: 7EED44 jmp xopin +E550: 7EED67 jmp xopout +E553: 7EED8C jmp xabtin +E556: 7EEDCF jmp xclsin +E559: 7EEDAC jmp xclsout +E55C: 7EE518 jmp osdly +E55F: endvecs equ * +E55F: +E55F: * The J command returns here. +E55F: 3410 stakregs pshs x ;Stack something where the pc comes +E561: 347F pshs cc,b,a,dp,x,y,u ;Stack the normal registers. +E563: BE029B ldx oldpc +E566: AF6A stx 10,s ;Stack the old pc value. +E568: 2007 bra unlaunch1 +E56A: * The G and P commands return here through a breakpoint. +E56A: * Registers are already stacked. +E56A: EC6A unlaunch ldd 10,s +E56C: 830001 subd #1 +E56F: ED6A std 10,s ;Decrement pc before breakpoint +E571: 1C00 unlaunch1 andcc #$0 ;reenable the interrupts. +E573: BDE9C1 jsr disarm ;Disarm the breakpoints. +E576: BDE916 jsr dispregs +E579: 9D1E cmdline jsr xcloseout +E57B: 10FF02BD sts savesp +E57F: 8E0200 ldx #linebuf +E582: C680 ldb #buflen +E584: 9D06 jsr getline +E586: 5D tstb +E587: 27F0 beq cmdline ;Ignore line if it is empty +E589: 3A abx +E58A: 6F84 clr ,x ;Make location after line zero. +E58C: 8E0200 ldx #linebuf +E58F: E680 ldb ,x+ +E591: C4DF andb #CASEMASK ;Make 1st char uppercase. +E593: C041 subb #'A' +E595: 253E bcs unk +E597: C11A cmpb #26 +E599: 243A bcc unk ;Unknown cmd if it is not a letter. +E59B: 8EE5A1 ldx #cmdtab +E59E: 58 aslb ;Index into command table. +E59F: 6E95 jmp [b,x] +E5A1: +E5A1: FC02E9F7E5D5E784 cmdtab fdb asm,break,unk,dump +E5A9: E7DEEBA7E88BE857 fdb enter,find,go,hex +E5B1: E845E89AE5D5E5D5 fdb inp,jump,unk,unk +E5B9: EB6AE5D5E5D5E8B9 fdb move,unk,unk,prog +E5C1: E5D5E95DEA65E8C5 fdb unk,regs,srec,trace +E5C9: F6A2E5D5E5D5EE52 fdb unasm,unk,unk,xmodem +E5D1: E5D5E5D5 fdb unk,unk +E5D5: +E5D5: * Unknown command handling routine. +E5D5: 9D18 unk jsr xabortin +E5D7: 8EE5FF ldx #unknown +E5DA: BDE502 jsr outcount +E5DD: 9D0C jsr putcr +E5DF: 7EE579 jmp cmdline +E5E2: +E5E2: +E5E2: +E5E2: * Here are some useful messages. +E5E2: 1C welcome fcb unknown-welcome-1 +E5E3: 57656C636F6D6520 fcc "Welcome to BUGGY version 1.0" +E5EC: 6F20425547475920 +E5F4: 76657273696F6E20 +E5FC: 312E30 +E5FF: 0F unknown fcb brkmsg-unknown-1 +E600: 556E6B6E6F776E20 fcc "Unknown command" +E609: 6F6D6D616E64 +E60F: 0E brkmsg fcb clrmsg-brkmsg-1 +E610: 427265616B706F69 fcc "Breakpoint set" +E619: 7420736574 +E61E: 12 clrmsg fcb fullmsg-clrmsg-1 +E61F: 427265616B706F69 fcc "Breakpoint cleared" +E628: 7420636C65617265 +E630: 64 +E631: 10 fullmsg fcb smsg-fullmsg-1 +E632: 427265616B706F69 fcc "Breakpoints full" +E63B: 74732066756C6C +E642: 11 smsg fcb lastrec-smsg-1 +E643: 4572726F7220696E fcc "Error in S record" +E64C: 53207265636F7264 +E654: 0A lastrec fcb xsmsg-lastrec-1 +E655: 5339303330303030 fcc "S9030000FC" +E65E: 43 +E65F: 11 xsmsg fcb xrmsg-xsmsg-1 +E660: 537461727420584D fcc "Start XMODEM Send" +E669: 44454D2053656E64 +E671: 14 xrmsg fcb xamsg-xrmsg-1 +E672: 537461727420584D fcc "Start XMODEM Receive" +E67B: 44454D2052656365 +E683: 697665 +E686: 17 xamsg fcb invmmsg-xamsg-1 +E687: 584D4F44454D2074 fcc "XMODEM transfer aborted" +E690: 616E736665722061 +E698: 626F72746564 +E69E: 10 invmmsg fcb exprmsg-invmmsg-1 +E69F: 496E76616C696420 fcc "Invalid mnemonic" +E6A8: 6E656D6F6E6963 +E6AF: 10 exprmsg fcb modemsg-exprmsg-1 +E6B0: 4578707265737369 fcc "Expression error" +E6B9: 6E206572726F72 +E6C0: 15 modemsg fcb brmsg-modemsg-1 +E6C1: 4164647265737369 fcc "Addressing mode error" +E6CA: 67206D6F64652065 +E6D2: 72726F72 +E6D6: 0F brmsg fcb endmsg-brmsg-1 +E6D7: 4272616E63682074 fcc "Branch too long" +E6E0: 6F206C6F6E67 +E6E6: endmsg equ * +E6E6: +E6E6: * Output hex digit contained in A +E6E6: 8B90 hexdigit adda #$90 +E6E8: 19 daa +E6E9: 8940 adca #$40 +E6EB: 19 daa ;It's the standard conversion trick ascii +E6EC: 1F89 tfr a,b ;to hex without branching. +E6EE: 9D03 jsr putchar +E6F0: 39 rts +E6F1: +E6F1: * Output contents of A as two hex digits +E6F1: 3402 outbyte pshs a +E6F3: 44 lsra +E6F4: 44 lsra +E6F5: 44 lsra +E6F6: 44 lsra +E6F7: 8DED bsr hexdigit +E6F9: 3502 puls a +E6FB: 840F anda #$0f +E6FD: 20E7 bra hexdigit +E6FF: +E6FF: * Output contents of d as four hex digits +E6FF: 3404 outd pshs b +E701: 8DEE bsr outbyte +E703: 3502 puls a +E705: 8DEA bsr outbyte +E707: 39 rts +E708: +E708: * Skip X past spaces, B is first non-space character. +E708: E680 skipspace ldb ,x+ +E70A: C120 cmpb #' ' +E70C: 27FA beq skipspace +E70E: 39 rts +E70F: +E70F: * Convert ascii hex digit in B register to binary Z flag set if no hex digit. +E70F: C030 convb subb #'0' +E711: 2513 blo convexit +E713: C109 cmpb #9 +E715: 230C bls cb2 +E717: C4DF andb #CASEMASK ;Make uppercase. +E719: C007 subb #7 ;If higher than digit 9 it must be a letter. +E71B: C109 cmpb #9 +E71D: 2307 bls convexit +E71F: C10F cmpb #15 +E721: 2203 bhi convexit +E723: 1CFB cb2 andcc #$FB ;clear zero +E725: 39 rts +E726: 1A04 convexit orcc #$04 +E728: 39 rts +E729: +E729: DC24 scanexit ldd temp +E72B: 301F leax -1,x +E72D: 0D26 tst temp2 +E72F: 39 rts ;<-- exit point of scanhex +E730: +E730: * Scan for hexadecimal number at address X return in D, Z flag is set it no +E730: * number found. +E730: 0F24 scanhex clr temp +E732: 0F25 clr temp+1 +E734: 0F26 clr temp2 +E736: 8DD0 bsr skipspace +E738: BDE70F scloop jsr convb +E73B: 27EC beq scanexit +E73D: 3404 pshs b +E73F: DC24 ldd temp +E741: 58 aslb +E742: 49 rola +E743: 58 aslb +E744: 49 rola +E745: 58 aslb +E746: 49 rola +E747: 58 aslb +E748: 49 rola +E749: EBE0 addb ,s+ +E74B: DD24 std temp +E74D: 0C26 inc temp2 +E74F: E680 ldb ,x+ +E751: 20E5 bra scloop +E753: +E753: FD029F scan2parms std length +E756: 8DD8 bsr scanhex +E758: 2710 beq sp2 +E75A: FD029D std addr +E75D: 8DA9 bsr skipspace +E75F: C12C cmpb #',' +E761: 2607 bne sp2 +E763: 8DCB bsr scanhex +E765: 2703 beq sp2 +E767: FD029F std length +E76A: 39 sp2 rts +E76B: +E76B: * Scan two hexdigits at in and convert to byte into A, Z flag if error. +E76B: 8D9B scanbyte bsr skipspace +E76D: 8DA0 bsr convb +E76F: 2712 beq sb1 +E771: 1F98 tfr b,a +E773: E680 ldb ,x+ +E775: 8D98 bsr convb +E777: 270A beq sb1 +E779: 48 asla +E77A: 48 asla +E77B: 48 asla +E77C: 48 asla +E77D: D724 stb temp +E77F: 9B24 adda temp +E781: 1CFB andcc #$fb ;Clear zero flag +E783: 39 sb1 rts +E784: +E784: +E784: * This is the code for the D command, hex/ascii dump of memory +E784: * Syntax: D or D<addr> or D<addr>,<length> +E784: 8E0201 dump ldx #linebuf+1 +E787: CC0040 ldd #$40 +E78A: BDE753 jsr scan2parms ;Scan address and length, default length=64 +E78D: 10BE029D ldy addr +E791: 8610 dh1 lda #16 +E793: 9725 sta temp+1 +E795: 1F20 tfr y,d +E797: BDE6FF jsr outd +E79A: C620 ldb #' ' +E79C: 9D03 jsr putchar +E79E: A6A0 dh2 lda ,y+ ;display row of 16 mem locations as hex +E7A0: BDE6F1 jsr outbyte +E7A3: C620 ldb #' ' +E7A5: 9625 lda temp+1 +E7A7: 8109 cmpa #9 +E7A9: 2602 bne dh6 +E7AB: C62D ldb #'-' ;Do a - after the eighth byte. +E7AD: 9D03 dh6 jsr putchar +E7AF: 0A25 dec temp+1 +E7B1: 26EB bne dh2 +E7B3: 3130 leay -16,y ;And now for the ascii dump. +E7B5: 8610 lda #16 +E7B7: E6A0 dh3 ldb ,y+ +E7B9: C120 cmpb #' ' +E7BB: 2402 bhs dh4 +E7BD: C62E ldb #'.' +E7BF: C17F dh4 cmpb #DEL +E7C1: 2502 blo dh5 +E7C3: C62E ldb #'.' ;Convert all nonprintables to . +E7C5: 9D03 dh5 jsr putchar +E7C7: 4A deca +E7C8: 26ED bne dh3 +E7CA: 9D0C jsr putcr +E7CC: FC029F ldd length +E7CF: 830010 subd #16 +E7D2: FD029F std length +E7D5: 22BA bhi dh1 +E7D7: 10BF029D sty addr +E7DB: 7EE579 jmp cmdline +E7DE: +E7DE: * This is the code for the E command, enter hex bytes or ascii string. +E7DE: * Syntax E or E<addr> or E<addr> <bytes> or E<addr>"string" +E7DE: 8E0201 enter ldx #linebuf+1 +E7E1: BDE730 jsr scanhex +E7E4: 2703 beq ent1 +E7E6: FD029D std addr +E7E9: 8D26 ent1 bsr entline +E7EB: 1026FD8A lbne cmdline ;No bytes, then enter interactively. +E7EF: C645 ent2 ldb #'E' +E7F1: 9D03 jsr putchar +E7F3: FC029D ldd addr +E7F6: BDE6FF jsr outd +E7F9: C620 ldb #' ' +E7FB: 9D03 jsr putchar ;Display Eaddr + space +E7FD: 8E0200 ldx #linebuf +E800: C680 ldb #buflen +E802: 9D06 jsr getline ;Get the line. +E804: 3A abx +E805: 6F84 clr ,x +E807: 8E0200 ldx #linebuf +E80A: 8D05 bsr entline +E80C: 26E1 bne ent2 +E80E: 7EE579 jmp cmdline +E811: +E811: * Enter a line of hex bytes or ascci string at address X, Z if empty. +E811: BDE708 entline jsr skipspace +E814: 5D tstb +E815: 272B beq entexit +E817: C122 cmpb #'"' +E819: 270F beq entasc +E81B: 301F leax -1,x +E81D: 10BE029D ldy addr +E821: BDE76B entl2 jsr scanbyte ;Enter hex digits. +E824: 2715 beq entdone +E826: A7A0 sta ,y+ +E828: 20F7 bra entl2 +E82A: 10BE029D entasc ldy addr +E82E: A680 entl3 lda ,x+ +E830: 4D tsta +E831: 2708 beq entdone +E833: 8122 cmpa #'"' +E835: 2704 beq entdone +E837: A7A0 sta ,y+ +E839: 20F3 bra entl3 +E83B: 10BF029D entdone sty addr +E83F: 1CFB andcc #$fb +E841: 39 rts +E842: 1A04 entexit orcc #$04 +E844: 39 rts +E845: +E845: *This is the code for the I command, display the contents of an address +E845: * Syntax: Iaddr +E845: 8E0201 inp ldx #linebuf+1 +E848: BDE730 jsr scanhex +E84B: 1F01 tfr d,x +E84D: A684 lda ,x ;Read the byte from memory. +E84F: BDE6F1 jsr outbyte ;Display itin hex. +E852: 9D0C jsr putcr +E854: 7EE579 jmp cmdline +E857: +E857: *This is the code for the H command, display result of simple hex expression +E857: *Syntax Hhexnum{+|-hexnum} +E857: 8E0201 hex ldx #linebuf+1 +E85A: BDE730 jsr scanhex +E85D: DD28 std temp3 +E85F: BDE708 hexloop jsr skipspace +E862: C12B cmpb #'+' +E864: 2609 bne hex1 +E866: BDE730 jsr scanhex +E869: D328 addd temp3 +E86B: DD28 std temp3 +E86D: 20F0 bra hexloop +E86F: C12D hex1 cmpb #'-' +E871: 260E bne hexend +E873: BDE730 jsr scanhex +E876: 53 comb +E877: 43 coma +E878: C30001 addd #1 +E87B: D328 addd temp3 +E87D: DD28 std temp3 +E87F: 20DE bra hexloop +E881: DC28 hexend ldd temp3 +E883: BDE6FF jsr outd +E886: 9D0C jsr putcr +E888: 7EE579 jmp cmdline +E88B: +E88B: * This is the code for the G command, jump to the program +E88B: * Syntax G or G<addr> +E88B: 8E0201 go ldx #linebuf+1 +E88E: BDE730 jsr scanhex +E891: 2702 beq launch +E893: ED6A std 10,s ;Store parameter in pc location. +E895: BDE9DB launch jsr arm ;Arm the breakpoints. +E898: 35FF puls cc,b,a,dp,x,y,u,pc +E89A: +E89A: * This is the code for the J command, run a subroutine. +E89A: * Syntax J<addr> +E89A: 8E0201 jump ldx #linebuf+1 +E89D: EC6A ldd 10,s +E89F: FD029B std oldpc ;Save old pc +E8A2: BDE730 jsr scanhex +E8A5: ED6A std 10,s ;Store parameter in PC location +E8A7: 1F41 tfr s,x +E8A9: 327E leas -2,s +E8AB: 1F43 tfr s,u +E8AD: C60C ldb #12 ;Move the saved register set 2 addresses +E8AF: BDE44A jsr blockmove ;down on the stack. +E8B2: CCE55F ldd #stakregs +E8B5: ED6C std 12,s ;Prepare subroutine return address. +E8B7: 20DC bra launch ;Jump to the routine. +E8B9: +E8B9: +E8B9: * This is the code for the P command, run instruction followed by breakpoint +E8B9: * Syntax P +E8B9: 10AE6A prog ldy 10,s ;Get program counter value. +E8BC: BDF3C9 jsr disdecode ;Find out location past current insn. +E8BF: 10BF02AD sty stepbp +E8C3: 20D0 bra launch +E8C5: +E8C5: * This is the code for the T command, single step trace an instruction. +E8C5: * Syntax T +E8C5: BDE8CE trace jsr traceone +E8C8: BDE916 jsr dispregs +E8CB: 7EE579 jmp cmdline +E8CE: +E8CE: 1A50 traceone orcc #$50 ;Disable the interrupts. +E8D0: ECE1 ldd ,s++ +E8D2: FD029B std oldpc ;Remove saved pc from stack. +E8D5: CCE8EA ldd #traceret +E8D8: FD0287 std firqvec+1 ;Adjust timer IRQ vector. +E8DB: 13 sync ;Synchronize on the next timer interrupt. +E8DC: ;1 cycle +E8DC: 8E1159 ldx #4441 ;3 cycles +E8DF: 301F traceloop leax -1,x ;6 cycles\x4441= 39969 cycles. +E8E1: 26FC bne traceloop ;3 cycles/ +E8E3: 12 nop ;2 cycles. +E8E4: 12 nop ;2 cycles. +E8E5: 12 nop ;2 cycles. +E8E6: 2102 brn traceret ;3 cycles. +E8E8: 35FF puls x,y,u,a,b,dp,cc,pc ;17 cycles, total=39999 20ms @ 2MHz +E8EA: ;Pull all registers and execute. +E8EA: ;Is timed such that next timer IRQ +E8EA: ;occurs right after it. +E8EA: 3501 traceret puls cc +E8EC: 347F pshs x,y,u,a,b,dp,cc;Store full register set instead of cc. +E8EE: CCE50B ldd #timerirq +E8F1: FD0287 std firqvec+1 ;Restore timer IRQ vector. +E8F4: 6E9F029B jmp [oldpc] +E8F8: +E8F8: +E8F8: * Display the contents of 8 bit register, name in B, contents in A +E8F8: 9D03 disp8 jsr putchar +E8FA: C63D ldb #'=' +E8FC: 9D03 jsr putchar +E8FE: BDE6F1 jsr outbyte +E901: C620 ldb #' ' +E903: 9D03 jsr putchar +E905: 39 rts +E906: +E906: * Display the contents of 16 bit register, name in B, contents in Y +E906: 9D03 disp16 jsr putchar +E908: C63D ldb #'=' +E90A: 9D03 jsr putchar +E90C: 1F20 tfr y,d +E90E: BDE6FF jsr outd +E911: C620 ldb #' ' +E913: 9D03 jsr putchar +E915: 39 rts +E916: +E916: * Display the contents of the registers and disassemble instruction at +E916: * PC location. +E916: C658 dispregs ldb #'X' +E918: 10AE66 ldy 6,s ;Note that there's one return address on +E91B: 8DE9 bsr disp16 ;stack so saved register offsets are +E91D: C659 ldb #'Y' ;inremented by 2. +E91F: 10AE68 ldy 8,s +E922: 8DE2 bsr disp16 +E924: C655 ldb #'U' +E926: 10AE6A ldy 10,s +E929: 8DDB bsr disp16 +E92B: C653 ldb #'S' +E92D: 1F42 tfr s,y +E92F: 312E leay 14,y ;S of the running program is 12 higher, +E931: ;because regs are not stacked when running. +E931: 8DD3 bsr disp16 +E933: C641 ldb #'A' +E935: A663 lda 3,s +E937: 8DBF bsr disp8 +E939: C642 ldb #'B' +E93B: A664 lda 4,s +E93D: 8DB9 bsr disp8 +E93F: C644 ldb #'D' +E941: A665 lda 5,s +E943: 8DB3 bsr disp8 +E945: C643 ldb #'C' +E947: A662 lda 2,s +E949: 8DAD bsr disp8 +E94B: 9D0C jsr putcr +E94D: C650 ldb #'P' +E94F: 10AE6C ldy 12,s +E952: 8DB2 bsr disp16 +E954: BDF3C9 jsr disdecode +E957: BDF4AC jsr disdisp ;Disassemble instruction at PC +E95A: 9D0C jsr putcr +E95C: 39 rts +E95D: +E95D: +E95D: * This is the code for the R command, display or alter the registers. +E95D: * Syntax R or R<letter><hex> +E95D: 8E0201 regs ldx #linebuf+1 +E960: BDE708 jsr skipspace +E963: 5D tstb +E964: 2605 bne setreg +E966: 8DAE bsr dispregs ;Display regs ifnothing follows. +E968: 7EE579 jmp cmdline +E96B: 108EE9B7 setreg ldy #regtab +E96F: 4F clra +E970: C4DF andb #CASEMASK ;Make letter uppercase. +E972: 6DA4 sr1 tst ,y +E974: 1027FC5D lbeq unk ;At end of register tab, unknown reg +E978: E1A0 cmpb ,y+ +E97A: 2703 beq sr2 ;Found the register? +E97C: 4C inca +E97D: 20F3 bra sr1 +E97F: 3402 sr2 pshs a +E981: BDE730 jsr scanhex ;Convert the hex argument. +E984: 3406 pshs d +E986: A662 lda 2,s ;Get register number. +E988: 8104 cmpa #4 +E98A: 2409 bcc sr3 +E98C: E661 ldb 1,s ;It's 8 bit. +E98E: 3263 leas 3,s ;Remove temp stuff from stack. +E990: E7E6 stb a,s ;Store it in the reg on stack. +E992: 7EE579 jmp cmdline +E995: 8108 sr3 cmpa #8 +E997: 240C bcc sr4 +E999: 3510 puls x ;It's 16 bit. +E99B: 3261 leas 1,s +E99D: 48 lsla +E99E: 8004 suba #4 ;Convert reg no to stack offset. +E9A0: AFE6 stx a,s +E9A2: 7EE579 jmp cmdline +E9A5: 3540 sr4 puls u ;It's the stack pointer. +E9A7: 3261 leas 1,s +E9A9: 3354 leau -12,u +E9AB: 1F41 tfr s,x +E9AD: 1F34 tfr u,s ;Set new stack pointer. +E9AF: C60C ldb #12 +E9B1: BDE44A jsr blockmove ;Move register set to new stack location. +E9B4: 7EE579 jmp cmdline +E9B7: +E9B7: 4341424458595550 regtab FCC "CABDXYUPS " +E9C0: 20 +E9C1: +E9C1: * Disarm the breakpoints, this is replace the SWI instructions with the +E9C1: * original byte. +E9C1: 8E02A1 disarm ldx #bpaddr +E9C4: 8605 lda #brkpoints+1 +E9C6: EE81 disarm1 ldu ,x++ +E9C8: E680 ldb ,x+ ;Get address in u, byte in b +E9CA: 11830000 cmpu #0 +E9CE: 2702 beq disarm2 +E9D0: E7C4 stb ,u +E9D2: 4A disarm2 deca +E9D3: 26F1 bne disarm1 +E9D5: CE0000 ldu #0 +E9D8: EF1D stu -3,x ;Clear the step breakpoint. +E9DA: 39 rts +E9DB: +E9DB: * Arm the breakponts, this is replace the byte at the breakpoint address +E9DB: * with an SWI instruction. +E9DB: 8E02AD arm ldx #bpaddr+brkpoints*3 +E9DE: 8605 lda #brkpoints+1 ;Arm them in reverse order of disarming. +E9E0: EE84 arm1 ldu ,x ;Get address in u. +E9E2: 270D beq arm2 +E9E4: E6C4 ldb ,u +E9E6: E702 stb 2,x +E9E8: 11A36C cmpu 12,s ;Compare to program counter location +E9EB: 2704 beq arm2 +E9ED: C63F ldb #$3F +E9EF: E7C4 stb ,u ;Store SWI instruction if not equal. +E9F1: 301D arm2 leax -3,x +E9F3: 4A deca +E9F4: 26EA bne arm1 +E9F6: 39 rts +E9F7: +E9F7: * This is the code for the break command, set, clear display breakpoints. +E9F7: * Syntax B or B<addr>. B displays, B<addr> sets or clears breakpoint. +E9F7: 8604 break lda #brkpoints +E9F9: 9727 sta temp2+1 ;Store number of breakpoints to visit. +E9FB: 8E0201 ldx #linebuf+1 +E9FE: BDE730 jsr scanhex +EA01: 273B beq dispbp ;No number then display breakpoints +EA03: 8E02A1 ldx #bpaddr +EA06: CE0000 ldu #0 +EA09: 1F32 tfr u,y +EA0B: 10A384 bp1 cmpd ,x +EA0E: 2720 beq clearit ;Found the breakpoint, so clear it, +EA10: 11A384 cmpu ,x ;Is location zero +EA13: 2602 bne bp2 +EA15: 1F12 tfr x,y ;Set free address to y +EA17: 3003 bp2 leax 3,x +EA19: 0A27 dec temp2+1 +EA1B: 26EE bne bp1 +EA1D: 108C0000 cmpy #0 ;Address not found in list of breakpoints +EA21: 2716 beq bpfull ;Was free address found. +EA23: EDA4 std ,y ;If so, store breakpoint there. +EA25: 8EE60F ldx #brkmsg +EA28: BDE502 bpexit jsr outcount +EA2B: 9D0C jsr putcr +EA2D: 7EE579 jmp cmdline +EA30: 4F clearit clra +EA31: 5F clrb +EA32: ED84 std ,x +EA34: 8EE61E ldx #clrmsg +EA37: 20EF bra bpexit +EA39: 8EE631 bpfull ldx #fullmsg +EA3C: 20EA bra bpexit +EA3E: +EA3E: 8E02A1 dispbp ldx #bpaddr +EA41: EC84 dbp1 ldd ,x +EA43: 2707 beq dbp2 +EA45: BDE6FF jsr outd +EA48: C620 ldb #' ' +EA4A: 9D03 jsr putchar +EA4C: 3003 dbp2 leax 3,x +EA4E: 0A27 dec temp2+1 +EA50: 26EF bne dbp1 +EA52: 9D0C jsr putcr +EA54: 7EE579 jmp cmdline +EA57: +EA57: * Scan hex byte into a and add it to check sum in temp2+1 +EA57: BDE76B addchk jsr scanbyte +EA5A: 10270077 lbeq srecerr +EA5E: 1F89 tfr a,b +EA60: DB27 addb temp2+1 +EA62: D727 stb temp2+1 +EA64: 39 rts +EA65: +EA65: * This tis the code for the S command, the Motorola S records entry. +EA65: * Syntax SO<addr> or SS<addr>,<len> or S1<bytes> or S9<bytes> +EA65: 8E0201 srec ldx #linebuf+1 +EA68: E680 ldb ,x+ +EA6A: C4DF andb #CASEMASK +EA6C: C14F cmpb #'O' +EA6E: 2772 beq setsorg +EA70: C153 cmpb #'S' +EA72: 277C beq sendrec +EA74: E61F ldb -1,x +EA76: 0F28 clr temp3 +EA78: C131 cmpb #'1' +EA7A: 2706 beq readrec +EA7C: C139 cmpb #'9' +EA7E: 2655 bne srecerr +EA80: 0C28 inc temp3 +EA82: 0F27 readrec clr temp2+1 ;clear checksum. +EA84: 8DD1 bsr addchk +EA86: 8002 suba #2 ;discount the address bytes from the count. +EA88: 9729 sta temp3+1 ;Read length byte. +EA8A: 8DCB bsr addchk +EA8C: 3402 pshs a +EA8E: 8DC7 bsr addchk +EA90: 3504 puls b +EA92: 1E89 exg a,b ;Read address into d. +EA94: FE02B0 ldu sorg +EA97: 270F beq rr1 +EA99: FE02B2 ldu soffs +EA9C: 260A bne rr1 +EA9E: 3406 pshs d ;Sorg is nonzero and soffs is zero, now +EAA0: B302B0 subd sorg ;set soffs +EAA3: FD02B2 std soffs +EAA6: 3506 puls d +EAA8: B302B2 rr1 subd soffs ;Subtract the address offset. +EAAB: 1F02 tfr d,y +EAAD: 8DA8 rr2 bsr addchk +EAAF: 0A29 dec temp3+1 +EAB1: 2704 beq endrec +EAB3: A7A0 sta ,y+ +EAB5: 20F6 bra rr2 +EAB7: 0C27 endrec inc temp2+1 ;Check checksum. +EAB9: 261A bne srecerr +EABB: 0D28 tst temp3 +EABD: 1027FAB8 lbeq cmdline ;Was it no S9 record? +EAC1: 108C0000 cmpy #0 +EAC5: 2703 beq endrec1 +EAC7: 10AF6A sty 10,s ;Store address into program counter. +EACA: 4F endrec1 clra +EACB: 5F clrb +EACC: FD02B0 std sorg ;Reset sorg, next S loads will be normal. +EACF: FD02B2 std soffs +EAD2: 7EE579 jmp cmdline +EAD5: 9D18 srecerr jsr xabortin +EAD7: 8EE642 ldx #smsg ;Error in srecord, display message. +EADA: BDE502 jsr outcount +EADD: 9D0C jsr putcr +EADF: 7EE579 jmp cmdline +EAE2: BDE730 setsorg jsr scanhex ;Set S record origin. +EAE5: FD02B0 std sorg +EAE8: 4F clra +EAE9: 5F clrb +EAEA: FD02B2 std soffs +EAED: 7EE579 jmp cmdline +EAF0: * Send a memory region as S-records. +EAF0: CC0100 sendrec ldd #$100 ;Scan address and length parameter. +EAF3: BDE753 jsr scan2parms +EAF6: FC02B0 ldd sorg +EAF9: 2709 beq ss1 +EAFB: FC029D ldd addr +EAFE: B302B0 subd sorg +EB01: FD02B2 std soffs ;Compute offset for origin. +EB04: FC029F ss1 ldd length +EB07: 2748 beq endss ;All bytes sent? +EB09: 10830010 cmpd #16 +EB0D: 2502 blo ss2 +EB0F: C610 ldb #16 ;If more than 16 left, then send 16. +EB11: D724 ss2 stb temp +EB13: 50 negb +EB14: FE029F ldu length +EB17: 33C5 leau b,u +EB19: FF029F stu length ;Discount line length from length. +EB1C: C653 ldb #'S' +EB1E: 9D03 jsr putchar +EB20: C631 ldb #'1' +EB22: 9D03 jsr putchar +EB24: 0F25 clr temp+1 ;Clear check sum +EB26: D624 ldb temp +EB28: CB03 addb #3 +EB2A: 8D30 bsr checkout ;Output byte b as hex and add to check sum. +EB2C: FC029D ldd addr +EB2F: 1F02 tfr d,y +EB31: B302B2 subd soffs +EB34: 1E89 exg a,b +EB36: 8D24 bsr checkout +EB38: 1E89 exg a,b +EB3A: 8D20 bsr checkout ;Output address (add into check sum) +EB3C: E6A0 ss3 ldb ,y+ +EB3E: 8D1C bsr checkout +EB40: 0A24 dec temp +EB42: 26F8 bne ss3 +EB44: 10BF029D sty addr +EB48: D625 ldb temp+1 +EB4A: 53 comb +EB4B: 8D0F bsr checkout ;Output checksum byte. +EB4D: 9D0C jsr putcr +EB4F: 20B3 bra ss1 +EB51: 8EE654 endss ldx #lastrec +EB54: BDE502 jsr outcount +EB57: 9D0C jsr putcr +EB59: 7EE579 jmp cmdline +EB5C: * Output byte in register B and add it into check sum at temp+1 +EB5C: 3402 checkout pshs a +EB5E: 1F98 tfr b,a +EB60: DB25 addb temp+1 +EB62: D725 stb temp+1 +EB64: BDE6F1 jsr outbyte +EB67: 3502 puls a +EB69: 39 rts +EB6A: +EB6A: * This is the code for the M command, move memory region. +EB6A: * Syntax: Maddr1,addr2,length +EB6A: 8E0201 move ldx #linebuf+1 +EB6D: BDE730 jsr scanhex +EB70: 1027FA61 lbeq unk +EB74: DD28 std temp3 +EB76: BDE708 jsr skipspace +EB79: C12C cmpb #',' +EB7B: 1026FA56 lbne unk +EB7F: BDE730 jsr scanhex +EB82: 1027FA4F lbeq unk +EB86: 1F03 tfr d,u +EB88: BDE708 jsr skipspace +EB8B: C12C cmpb #',' +EB8D: 1026FA44 lbne unk +EB91: BDE730 jsr scanhex +EB94: 1027FA3D lbeq unk +EB98: 1F02 tfr d,y ;Read the argument separated by commas +EB9A: 9E28 ldx temp3 ;src addr to x, dest addr to u, length to y +EB9C: ;Don't tolerate syntax deviations. +EB9C: A680 mvloop lda ,x+ +EB9E: A7C0 sta ,u+ +EBA0: 313F leay -1,y +EBA2: 26F8 bne mvloop ;Perform the block move. +EBA4: 7EE579 jmp cmdline +EBA7: +EBA7: +EBA7: * This is the code for the F command, find byte/ascii string in memory. +EBA7: * Syntax: Faddr bytes or Faddr "ascii" +EBA7: 8E0201 find ldx #linebuf+1 +EBAA: BDE730 jsr scanhex +EBAD: 1F02 tfr d,y ;Scan the start address. +EBAF: BDE708 jsr skipspace +EBB2: C122 cmpb #'"' +EBB4: 2611 bne findhex +EBB6: CE0200 ldu #linebuf ;Quote found, so scan for quoted string. +EBB9: 4F clra +EBBA: E680 fstrloop ldb ,x+ +EBBC: 271F beq startsrch ;End of line without final quote. +EBBE: C122 cmpb #'"' +EBC0: 271B beq startsrch ;End quote found +EBC2: E7C0 stb ,u+ +EBC4: 4C inca +EBC5: 20F3 bra fstrloop +EBC7: CE0200 findhex ldu #linebuf ;Convert string of hex bytes. +EBCA: 301F leax -1,x ;String will be stored at start of line +EBCC: 4F clra ;buffer and may overwrite part of the +EBCD: 3402 fhexloop pshs a ;already converted string. +EBCF: BDE76B jsr scanbyte +EBD2: 1F89 tfr a,b +EBD4: 3502 puls a +EBD6: 2705 beq startsrch +EBD8: E7C0 stb ,u+ +EBDA: 4C inca +EBDB: 20F0 bra fhexloop +EBDD: 4D startsrch tsta ;Start searching, start addr in Y, +EBDE: ;string starts at linebuf, length A +EBDE: 1027F997 lbeq cmdline ;Quit with zero length string. +EBE2: 0F28 clr temp3 +EBE4: 9729 sta temp3+1 +EBE6: 1F21 srchloop tfr y,x +EBE8: 9629 lda temp3+1 +EBEA: 8CE100 cmpx #$e100 +EBED: 2409 bcc srch1 +EBEF: 3086 leax a,x +EBF1: 8CE000 cmpx #$e000 ;Stop at I/O addresses. +EBF4: 1024F981 lbcc cmdline +EBF8: 1F21 srch1 tfr y,x +EBFA: CE0200 ldu #linebuf +EBFD: E680 srch2 ldb ,x+ +EBFF: E1C0 cmpb ,u+ +EC01: 2614 bne srch3 ;Not equal, try next address. +EC03: 4A deca +EC04: 26F7 bne srch2 +EC06: 1F20 tfr y,d +EC08: BDE6FF jsr outd ;String found +EC0B: 9D0C jsr putcr +EC0D: 0C28 inc temp3 +EC0F: 9628 lda temp3 +EC11: 8110 cmpa #$10 +EC13: 1027F962 lbeq cmdline ;If 10 matches found, just stop. +EC17: 3121 srch3 leay 1,y +EC19: 20CB bra srchloop +EC1B: +EC1B: * Send the contents of the xmodem buffer and get it acknowledged, zero flag +EC1B: * is set if transfer aborted. +EC1B: C601 xsendbuf ldb #SOH +EC1D: BDE471 jsr osputc ;Send SOH +EC20: D62D ldb xpacknum +EC22: BDE471 jsr osputc ;Send block number. +EC25: 53 comb +EC26: BDE471 jsr osputc ;and its complement. +EC29: 0F2E clr xsum +EC2B: 8680 lda #128 +EC2D: 8E0100 ldx #buf0 +EC30: E684 xsloop ldb ,x +EC32: DB2E addb xsum +EC34: D72E stb xsum +EC36: E680 ldb ,x+ +EC38: BDE471 jsr osputc +EC3B: 4A deca +EC3C: 26F2 bne xsloop ;Send the buffer contents. +EC3E: D62E ldb xsum +EC40: BDE471 jsr osputc ;Send the check sum +EC43: BDE45A waitack jsr osgetc +EC46: C118 cmpb #CAN +EC48: 270C beq xsabt ;^X for abort. +EC4A: C115 cmpb #NAK +EC4C: 27CD beq xsendbuf ;Send again if NAK +EC4E: C106 cmpb #ACK +EC50: 26F1 bne waitack +EC52: 0C2D inc xpacknum +EC54: 1CFB xsok andcc #$fb ;Clear zero flag after ACK +EC56: 39 xsabt rts +EC57: +EC57: * Start an XMODEM send session. +EC57: C601 xsendinit ldb #1 +EC59: D72D stb xpacknum ;Initialize block number. +EC5B: BDE45A waitnak jsr osgetc +EC5E: C118 cmpb #CAN +EC60: 27F4 beq xsabt ;If ^X exit with zero flag. +EC62: C115 cmpb #NAK +EC64: 27EE beq xsok +EC66: 20F3 bra waitnak ;Wait until NAK received. +EC68: +EC68: * Send ETX and wait for ack. +EC68: C604 xsendeot ldb #EOT +EC6A: BDE471 jsr osputc +EC6D: BDE45A waitack2 jsr osgetc +EC70: C118 cmpb #CAN +EC72: 27E2 beq xsabt +EC74: C115 cmpb #NAK +EC76: 27F0 beq xsendeot +EC78: C106 cmpb #ACK +EC7A: 27D8 beq xsok +EC7C: 20EF bra waitack2 +EC7E: +EC7E: * Read character into B with a timeout of A seconds, Carry set if timeout. +EC7E: 48 gettimeout asla +EC7F: C632 ldb #50 +EC81: 3D mul +EC82: 1F98 tfr b,a +EC84: 9B2C adda timer+2 +EC86: BDE465 gt1 jsr osgetpoll +EC89: 5D tstb +EC8A: 2607 bne gtexit +EC8C: 912C cmpa timer+2 +EC8E: 26F6 bne gt1 +EC90: 1A01 orcc #$1 +EC92: 39 rts +EC93: BDE45A gtexit jsr osgetc +EC96: 1CFE andcc #$fe +EC98: 39 rts +EC99: +EC99: * Wait until line becomes quiet. +EC99: 8603 purge lda #3 +EC9B: BDEC7E jsr gettimeout +EC9E: 24F9 bcc purge +ECA0: 39 rts +ECA1: +ECA1: * Receive an XMODEM block and wait till it is OK, Z set if etx. +ECA1: 8603 xrcvbuf lda #3 +ECA3: 0D2F tst lastok +ECA5: 2709 beq sendnak +ECA7: C606 ldb #ACK +ECA9: BDE471 jsr osputc ;Send an ack. +ECAC: 8605 lda #5 +ECAE: 2005 bra startblock +ECB0: C615 sendnak ldb #NAK +ECB2: BDE471 jsr osputc ;Send a NAK +ECB5: 0F2F startblock clr lastok +ECB7: 8DC5 bsr gettimeout +ECB9: 8603 lda #3 +ECBB: 25F3 bcs sendnak ;Keep sending NAKs when timed out. +ECBD: C104 cmpb #EOT +ECBF: 2752 beq xrcveot ;End of file reached, acknowledge EOT. +ECC1: C101 cmpb #SOH +ECC3: 2649 bne purgeit ;Not, SOH, bad block. +ECC5: 8601 lda #1 +ECC7: 8DB5 bsr gettimeout +ECC9: 2543 bcs purgeit +ECCB: D12D cmpb xpacknum ;Is it the right block? +ECCD: 2707 beq xr1 +ECCF: 5C incb +ECD0: D12D cmpb xpacknum ;Was it the previous block. +ECD2: 263A bne purgeit +ECD4: 0C2F inc lastok +ECD6: D72E xr1 stb xsum +ECD8: 8601 lda #1 +ECDA: 8DA2 bsr gettimeout +ECDC: 2530 bcs purgeit +ECDE: 53 comb +ECDF: D12E cmpb xsum ;Is the complement of the block number OK +ECE1: 262B bne purgeit +ECE3: 8E0100 ldx #buf0 +ECE6: 0F2E clr xsum +ECE8: 8601 xrloop lda #1 +ECEA: 8D92 bsr gettimeout +ECEC: 2520 bcs purgeit +ECEE: E780 stb ,x+ +ECF0: DB2E addb xsum +ECF2: D72E stb xsum +ECF4: 8C0180 cmpx #buf0+128 +ECF7: 26EF bne xrloop ;Get the data bytes. +ECF9: 8601 lda #1 +ECFB: 8D81 bsr gettimeout +ECFD: 250F bcs purgeit +ECFF: D12E cmpb xsum +ED01: 260B bne purgeit ;Check the check sum. +ED03: 0D2F tst lastok +ED05: 269A bne xrcvbuf ;Block was the previous block, get next one +ED07: 0C2F inc lastok +ED09: 0C2D inc xpacknum +ED0B: 1CFB andcc #$fb +ED0D: 39 rts +ED0E: BDEC99 purgeit jsr purge +ED11: 209D bra sendnak +ED13: 8603 xrcveot lda #3 ;EOT was received. +ED15: C606 ldb #ACK +ED17: BDE471 ackloop jsr osputc +ED1A: 4A deca +ED1B: 26FA bne ackloop ;Send 3 acks in a row. +ED1D: 39 rts +ED1E: +ED1E: +ED1E: 9E01 savevecs ldx getchar+1 +ED20: BF02B4 stx oldgetc +ED23: 9E04 ldx putchar+1 +ED25: BF02B6 stx oldputc +ED28: 9E0D ldx putcr+1 +ED2A: BF02B8 stx oldputcr +ED2D: 7F02BA clr lastterm +ED30: 39 rts +ED31: +ED31: BE02B4 rstvecs ldx oldgetc +ED34: 9F01 stx getchar+1 +ED36: BE02B6 ldx oldputc +ED39: 9F04 stx putchar+1 +ED3B: BE02B8 ldx oldputcr +ED3E: 9F0D stx putcr+1 +ED40: 7F02BA clr lastterm +ED43: 39 rts +ED44: +ED44: * O.S. routine to open input through XMODEM transfer. +ED44: 3416 xopin pshs x,a,b +ED46: 8EE65F ldx #xsmsg +ED49: BDE502 jsr outcount +ED4C: 9D0C jsr putcr ;Display message to start XMODEM send. +ED4E: 8DCE bsr savevecs +ED50: 8EF492 ldx #noop +ED53: 9F04 stx putchar+1 ;Disable character output. +ED55: 8EEE12 ldx #xgetc +ED58: 9F01 stx getchar+1 ; +ED5A: 0F2F clr lastok +ED5C: 0F30 clr xcount +ED5E: 8601 lda #1 +ED60: 972D sta xpacknum +ED62: 4C inca +ED63: 9731 sta xmode ;set xmode to 2. +ED65: 3596 puls x,a,b,pc +ED67: +ED67: * O.S. routine to open output through XMODEM transfer. +ED67: 3416 xopout pshs x,a,b +ED69: 8DB3 bsr savevecs +ED6B: 8EE671 ldx #xrmsg +ED6E: BDE502 jsr outcount ;Display message to start XMODEM receive +ED71: 9D0C jsr putcr +ED73: 8EEDD9 ldx #xputc +ED76: 9F04 stx putchar+1 +ED78: 8EEDF7 ldx #xputcr +ED7B: 9F0D stx putcr+1 +ED7D: BDEC57 jsr xsendinit +ED80: 102700B7 lbeq xerror +ED84: 0F30 clr xcount +ED86: 8601 lda #1 +ED88: 9731 sta xmode +ED8A: 3596 puls x,a,b,pc +ED8C: +ED8C: +ED8C: * O.S. routine to abort input through XMODEM transfer. +ED8C: 9631 xabtin lda xmode +ED8E: 8102 cmpa #2 +ED90: 263C bne xclsend +ED92: BDEC99 jsr purge +ED95: C618 ldb #CAN +ED97: 8608 lda #8 +ED99: BDE471 xabtloop jsr osputc +ED9C: 4A deca +ED9D: 26FA bne xabtloop ;Send 8 CAN characters to kill transfer. +ED9F: 8D90 bsr rstvecs +EDA1: 0F31 clr xmode +EDA3: 8EE686 ldx #xamsg +EDA6: BDE502 jsr outcount +EDA9: 9D0C jsr putcr ;Send diagnostic message. +EDAB: 39 rts +EDAC: +EDAC: * O.S. routine to close output through XMODEM transfer. +EDAC: 9631 xclsout lda xmode +EDAE: 8101 cmpa #1 +EDB0: 261C bne xclsend +EDB2: 0D30 tst xcount +EDB4: 270C beq xclsdone +EDB6: 8680 lda #128 +EDB8: 9030 suba xcount +EDBA: F602BB xclsloop ldb filler +EDBD: 8D1A bsr xputc +EDBF: 4A deca +EDC0: 26F8 bne xclsloop ;Transfer filler chars to force block out. +EDC2: BDEC68 xclsdone jsr xsendeot ;Send EOT +EDC5: 10270072 lbeq xerror +EDC9: BDED31 jsr rstvecs +EDCC: 0F31 clr xmode +EDCE: 39 xclsend rts +EDCF: +EDCF: * O.S. routine to close input through XMODEM, by gobbling up the remaining +EDCF: * bytes. +EDCF: D631 xclsin ldb xmode +EDD1: C102 cmpb #2 +EDD3: 26F9 bne xclsend +EDD5: 9D03 jsr putchar +EDD7: 20F6 bra xclsin +EDD9: +EDD9: * putchar routine for XMODEM +EDD9: 3416 xputc pshs x,a,b +EDDB: 9630 lda xcount +EDDD: 0C30 inc xcount +EDDF: 8E0100 ldx #buf0 +EDE2: E786 stb a,x ;Store character in XMODEM buffer. +EDE4: 817F cmpa #127 +EDE6: 260D bne xputc1 ;is buffer full? +EDE8: 0F30 clr xcount +EDEA: 3460 pshs y,u +EDEC: BDEC1B jsr xsendbuf +EDEF: 10270048 lbeq xerror +EDF3: 3560 puls y,u +EDF5: 3596 xputc1 puls x,a,b,pc +EDF7: +EDF7: * putcr routine for XMODEM +EDF7: 3404 xputcr pshs b +EDF9: F602BC ldb xmcr +EDFC: C502 bitb #2 +EDFE: 2704 beq xputcr1 +EE00: C60D ldb #CR +EE02: 8DD5 bsr xputc +EE04: F602BC xputcr1 ldb xmcr +EE07: C501 bitb #1 +EE09: 2704 beq xputcr2 +EE0B: C60A ldb #LF +EE0D: 8DCA bsr xputc +EE0F: 3504 xputcr2 puls b +EE11: 39 rts +EE12: +EE12: * getchar routine for XMODEM +EE12: 3412 xgetc pshs x,a +EE14: 0D30 tst xcount ;No characters left? +EE16: 260D bne xgetc1 +EE18: 3460 pshs y,u +EE1A: BDECA1 jsr xrcvbuf ;Receive new block. +EE1D: 3560 puls y,u +EE1F: 2710 beq xgetcterm ;End of input? +EE21: 8680 lda #128 +EE23: 9730 sta xcount +EE25: 9630 xgetc1 lda xcount +EE27: 40 nega +EE28: 8E0180 ldx #buf0+128 +EE2B: E686 ldb a,x ;Get character from buffer +EE2D: 0A30 dec xcount +EE2F: 3592 puls x,a,pc +EE31: BDED31 xgetcterm jsr rstvecs +EE34: 0F31 clr xmode +EE36: F602BB ldb filler +EE39: 3592 puls x,a,pc +EE3B: +EE3B: BDED31 xerror jsr rstvecs ;Restore I/O vectors +EE3E: 0F31 clr xmode +EE40: 8EE686 ldx #xamsg +EE43: BDE502 jsr outcount +EE46: 9D0C jsr putcr +EE48: 7E0292 jmp xerrvec +EE4B: +EE4B: 10FE02BD xerrhand lds savesp +EE4F: 7EE579 jmp cmdline +EE52: +EE52: * This is the code for the X command, various XMODEM related commands. +EE52: * Syntax: XSaddr,len XLaddr,len XX XOcrlf,filler, XSSaddr,len +EE52: 8E0201 xmodem ldx #linebuf+1 +EE55: A680 lda ,x+ +EE57: 84DF anda #CASEMASK ;Convert to uppercase. +EE59: 8158 cmpa #'X' +EE5B: 274A beq xeq +EE5D: 814C cmpa #'L' +EE5F: 2733 beq xload +EE61: 814F cmpa #'O' +EE63: 2747 beq xopts +EE65: 8153 cmpa #'S' +EE67: 1026F76A lbne unk +EE6B: A684 lda ,x +EE6D: 84DF anda #CASEMASK +EE6F: 8153 cmpa #'S' +EE71: 271A beq xss +EE73: CC0100 ldd #$100 ;XSaddr,len command. +EE76: BDE753 jsr scan2parms ;Send binary through XMODEM +EE79: 9D15 jsr xopenout +EE7B: FE029D ldu addr +EE7E: 10BE029F ldy length +EE82: E6C0 xsbinloop ldb ,u+ +EE84: 9D03 jsr putchar +EE86: 313F leay -1,y +EE88: 26F8 bne xsbinloop ;Send all the bytes through XMODEM. +EE8A: 7EE579 jmp cmdline +EE8D: 3001 xss leax 1,x ;XSSaddr,len command. +EE8F: 9D15 jsr xopenout ;Send Srecords through XMODEM +EE91: 7EEAF0 jmp sendrec +EE94: BDE730 xload jsr scanhex ;XLaddr command +EE97: 1F02 tfr d,y ;Load binary through XMODEM +EE99: 9D12 jsr xopenin +EE9B: 9D00 xlodloop jsr getchar +EE9D: 0D31 tst xmode ;File ended? then done +EE9F: 1027F6D6 lbeq cmdline +EEA3: E7A0 stb ,y+ +EEA5: 20F4 bra xlodloop +EEA7: 9D12 xeq jsr xopenin ;XX command +EEA9: 7EE579 jmp cmdline ;Execute commands received from XMODEM +EEAC: CC001A xopts ldd #$1a +EEAF: BDE753 jsr scan2parms +EEB2: B6029E lda addr+1 +EEB5: B702BC sta xmcr +EEB8: B602A0 lda length+1 +EEBB: B702BB sta filler +EEBE: 7EE579 jmp cmdline +EEC1: +EEC1: * mnemonics table, ordered alphabetically. +EEC1: * 5 bytes name, 1 byte category, 2 bytes opcode, 8 bytes total. +EEC1: 4142582020 mnemtab fcc "ABX " +EEC6: 00 fcb 0 +EEC7: 003A fdb $3a +EEC9: 4144434120 fcc "ADCA " +EECE: 07 fcb 7 +EECF: 0089 fdb $89 +EED1: 4144434220 fcc "ADCB " +EED6: 07 fcb 7 +EED7: 00C9 fdb $c9 +EED9: 4144444120 fcc "ADDA " +EEDE: 07 fcb 7 +EEDF: 008B fdb $8b +EEE1: 4144444220 fcc "ADDB " +EEE6: 07 fcb 7 +EEE7: 00CB fdb $cb +EEE9: 4144444420 fcc "ADDD " +EEEE: 08 fcb 8 +EEEF: 00C3 fdb $c3 +EEF1: 414E444120 fcc "ANDA " +EEF6: 07 fcb 7 +EEF7: 0084 fdb $84 +EEF9: 414E444220 fcc "ANDB " +EEFE: 07 fcb 7 +EEFF: 00C4 fdb $c4 +EF01: 414E444343 fcc "ANDCC" +EF06: 02 fcb 2 +EF07: 001C fdb $1c +EF09: 41534C2020 fcc "ASL " +EF0E: 0A fcb 10 +EF0F: 0008 fdb $08 +EF11: 41534C4120 fcc "ASLA " +EF16: 00 fcb 0 +EF17: 0048 fdb $48 +EF19: 41534C4220 fcc "ASLB " +EF1E: 00 fcb 0 +EF1F: 0058 fdb $58 +EF21: 4153522020 fcc "ASR " +EF26: 0A fcb 10 +EF27: 0007 fdb $07 +EF29: 4153524120 fcc "ASRA " +EF2E: 00 fcb 0 +EF2F: 0047 fdb $47 +EF31: 4153524220 fcc "ASRB " +EF36: 00 fcb 0 +EF37: 0057 fdb $57 +EF39: 4243432020 fcc "BCC " +EF3E: 04 fcb 4 +EF3F: 0024 fdb $24 +EF41: 4243532020 fcc "BCS " +EF46: 04 fcb 4 +EF47: 0025 fdb $25 +EF49: 4245512020 fcc "BEQ " +EF4E: 04 fcb 4 +EF4F: 0027 fdb $27 +EF51: 4247452020 fcc "BGE " +EF56: 04 fcb 4 +EF57: 002C fdb $2c +EF59: 4247542020 fcc "BGT " +EF5E: 04 fcb 4 +EF5F: 002E fdb $2e +EF61: 4248492020 fcc "BHI " +EF66: 04 fcb 4 +EF67: 0022 fdb $22 +EF69: 4248532020 fcc "BHS " +EF6E: 04 fcb 4 +EF6F: 0024 fdb $24 +EF71: 4249544120 fcc "BITA " +EF76: 07 fcb 7 +EF77: 0085 fdb $85 +EF79: 4249544220 fcc "BITB " +EF7E: 07 fcb 7 +EF7F: 00C5 fdb $c5 +EF81: 424C452020 fcc "BLE " +EF86: 04 fcb 4 +EF87: 002F fdb $2f +EF89: 424C4F2020 fcc "BLO " +EF8E: 04 fcb 4 +EF8F: 0025 fdb $25 +EF91: 424C532020 fcc "BLS " +EF96: 04 fcb 4 +EF97: 0023 fdb $23 +EF99: 424C542020 fcc "BLT " +EF9E: 04 fcb 4 +EF9F: 002D fdb $2d +EFA1: 424D492020 fcc "BMI " +EFA6: 04 fcb 4 +EFA7: 002B fdb $2b +EFA9: 424E452020 fcc "BNE " +EFAE: 04 fcb 4 +EFAF: 0026 fdb $26 +EFB1: 42504C2020 fcc "BPL " +EFB6: 04 fcb 4 +EFB7: 002A fdb $2a +EFB9: 4252412020 fcc "BRA " +EFBE: 04 fcb 4 +EFBF: 0020 fdb $20 +EFC1: 42524E2020 fcc "BRN " +EFC6: 04 fcb 4 +EFC7: 0021 fdb $21 +EFC9: 4253522020 mnembsr fcc "BSR " +EFCE: 04 fcb 4 +EFCF: 008D fdb $8d +EFD1: 4256432020 fcc "BVC " +EFD6: 04 fcb 4 +EFD7: 0028 fdb $28 +EFD9: 4256532020 fcc "BVS " +EFDE: 04 fcb 4 +EFDF: 0029 fdb $29 +EFE1: 434C522020 fcc "CLR " +EFE6: 0A fcb 10 +EFE7: 000F fdb $0f +EFE9: 434C524120 fcc "CLRA " +EFEE: 00 fcb 0 +EFEF: 004F fdb $4f +EFF1: 434C524220 fcc "CLRB " +EFF6: 00 fcb 0 +EFF7: 005F fdb $5f +EFF9: 434D504120 fcc "CMPA " +EFFE: 07 fcb 7 +EFFF: 0081 fdb $81 +F001: 434D504220 fcc "CMPB " +F006: 07 fcb 7 +F007: 00C1 fdb $c1 +F009: 434D504420 fcc "CMPD " +F00E: 09 fcb 9 +F00F: 1083 fdb $1083 +F011: 434D505320 fcc "CMPS " +F016: 09 fcb 9 +F017: 118C fdb $118c +F019: 434D505520 fcc "CMPU " +F01E: 09 fcb 9 +F01F: 1183 fdb $1183 +F021: 434D505820 fcc "CMPX " +F026: 08 fcb 8 +F027: 008C fdb $8c +F029: 434D505920 fcc "CMPY " +F02E: 09 fcb 9 +F02F: 108C fdb $108c +F031: 434F4D2020 fcc "COM " +F036: 0A fcb 10 +F037: 0003 fdb $03 +F039: 434F4D4120 fcc "COMA " +F03E: 00 fcb 0 +F03F: 0043 fdb $43 +F041: 434F4D4220 fcc "COMB " +F046: 00 fcb 0 +F047: 0053 fdb $53 +F049: 4357414920 fcc "CWAI " +F04E: 02 fcb 2 +F04F: 003C fdb $3c +F051: 4441412020 fcc "DAA " +F056: 00 fcb 0 +F057: 0019 fdb $19 +F059: 4445432020 fcc "DEC " +F05E: 0A fcb 10 +F05F: 000A fdb $0a +F061: 4445434120 fcc "DECA " +F066: 00 fcb 0 +F067: 004A fdb $4a +F069: 4445434220 fcc "DECB " +F06E: 00 fcb 0 +F06F: 005A fdb $5a +F071: 454F524120 fcc "EORA " +F076: 07 fcb 7 +F077: 0088 fdb $88 +F079: 454F524220 fcc "EORB " +F07E: 07 fcb 7 +F07F: 00C8 fdb $c8 +F081: 4551552020 fcc "EQU " +F086: 0D fcb 13 +F087: 0005 fdb 5 +F089: 4558472020 fcc "EXG " +F08E: 0B fcb 11 +F08F: 001E fdb $1e +F091: 4643422020 mnemfcb fcc "FCB " +F096: 0D fcb 13 +F097: 0007 fdb 7 +F099: 4643432020 fcc "FCC " +F09E: 0D fcb 13 +F09F: 0008 fdb 8 +F0A1: 4644422020 fcc "FDB " +F0A6: 0D fcb 13 +F0A7: 0009 fdb 9 +F0A9: 494E432020 fcc "INC " +F0AE: 0A fcb 10 +F0AF: 000C fdb $0c +F0B1: 494E434120 fcc "INCA " +F0B6: 00 fcb 0 +F0B7: 004C fdb $4c +F0B9: 494E434220 fcc "INCB " +F0BE: 00 fcb 0 +F0BF: 005C fdb $5c +F0C1: 4A4D502020 fcc "JMP " +F0C6: 0A fcb 10 +F0C7: 000E fdb $0e +F0C9: 4A53522020 mnemjsr fcc "JSR " +F0CE: 08 fcb 8 +F0CF: 008D fdb $8d +F0D1: 4C42434320 fcc "LBCC " +F0D6: 05 fcb 5 +F0D7: 1024 fdb $1024 +F0D9: 4C42435320 fcc "LBCS " +F0DE: 05 fcb 5 +F0DF: 1025 fdb $1025 +F0E1: 4C42455120 fcc "LBEQ " +F0E6: 05 fcb 5 +F0E7: 1027 fdb $1027 +F0E9: 4C42474520 fcc "LBGE " +F0EE: 05 fcb 5 +F0EF: 102C fdb $102c +F0F1: 4C42475420 fcc "LBGT " +F0F6: 05 fcb 5 +F0F7: 102E fdb $102e +F0F9: 4C42484920 fcc "LBHI " +F0FE: 05 fcb 5 +F0FF: 1022 fdb $1022 +F101: 4C42485320 fcc "LBHS " +F106: 05 fcb 5 +F107: 1024 fdb $1024 +F109: 4C424C4520 fcc "LBLE " +F10E: 05 fcb 5 +F10F: 102F fdb $102f +F111: 4C424C4F20 fcc "LBLO " +F116: 05 fcb 5 +F117: 1025 fdb $1025 +F119: 4C424C5320 fcc "LBLS " +F11E: 05 fcb 5 +F11F: 1023 fdb $1023 +F121: 4C424C5420 fcc "LBLT " +F126: 05 fcb 5 +F127: 102D fdb $102d +F129: 4C424D4920 fcc "LBMI " +F12E: 05 fcb 5 +F12F: 102B fdb $102b +F131: 4C424E4520 fcc "LBNE " +F136: 05 fcb 5 +F137: 1026 fdb $1026 +F139: 4C42504C20 fcc "LBPL " +F13E: 05 fcb 5 +F13F: 102A fdb $102a +F141: 4C42524120 fcc "LBRA " +F146: 06 fcb 6 +F147: 0016 fdb $16 +F149: 4C42524E20 fcc "LBRN " +F14E: 05 fcb 5 +F14F: 1021 fdb $1021 +F151: 4C42535220 fcc "LBSR " +F156: 06 fcb 6 +F157: 0017 fdb $17 +F159: 4C42564320 fcc "LBVC " +F15E: 05 fcb 5 +F15F: 1028 fdb $1028 +F161: 4C42565320 fcc "LBVS " +F166: 05 fcb 5 +F167: 1029 fdb $1029 +F169: 4C44412020 fcc "LDA " +F16E: 07 fcb 7 +F16F: 0086 fdb $86 +F171: 4C44422020 fcc "LDB " +F176: 07 fcb 7 +F177: 00C6 fdb $c6 +F179: 4C44442020 fcc "LDD " +F17E: 08 fcb 8 +F17F: 00CC fdb $cc +F181: 4C44532020 fcc "LDS " +F186: 09 fcb 9 +F187: 10CE fdb $10ce +F189: 4C44552020 fcc "LDU " +F18E: 08 fcb 8 +F18F: 00CE fdb $ce +F191: 4C44582020 fcc "LDX " +F196: 08 fcb 8 +F197: 008E fdb $8e +F199: 4C44592020 fcc "LDY " +F19E: 09 fcb 9 +F19F: 108E fdb $108e +F1A1: 4C45415320 fcc "LEAS " +F1A6: 03 fcb 3 +F1A7: 0032 fdb $32 +F1A9: 4C45415520 fcc "LEAU " +F1AE: 03 fcb 3 +F1AF: 0033 fdb $33 +F1B1: 4C45415820 fcc "LEAX " +F1B6: 03 fcb 3 +F1B7: 0030 fdb $30 +F1B9: 4C45415920 fcc "LEAY " +F1BE: 03 fcb 3 +F1BF: 0031 fdb $31 +F1C1: 4C534C2020 fcc "LSL " +F1C6: 0A fcb 10 +F1C7: 0008 fdb $08 +F1C9: 4C534C4120 fcc "LSLA " +F1CE: 00 fcb 0 +F1CF: 0048 fdb $48 +F1D1: 4C534C4220 fcc "LSLB " +F1D6: 00 fcb 0 +F1D7: 0058 fdb $58 +F1D9: 4C53522020 fcc "LSR " +F1DE: 0A fcb 10 +F1DF: 0004 fdb $04 +F1E1: 4C53524120 fcc "LSRA " +F1E6: 00 fcb 0 +F1E7: 0044 fdb $44 +F1E9: 4C53524220 fcc "LSRB " +F1EE: 00 fcb 0 +F1EF: 0054 fdb $54 +F1F1: 4D554C2020 fcc "MUL " +F1F6: 00 fcb 0 +F1F7: 003D fdb $3d +F1F9: 4E45472020 fcc "NEG " +F1FE: 0A fcb 10 +F1FF: 0000 fdb $00 +F201: 4E45474120 fcc "NEGA " +F206: 00 fcb 0 +F207: 0040 fdb $40 +F209: 4E45474220 fcc "NEGB " +F20E: 00 fcb 0 +F20F: 0050 fdb $50 +F211: 4E4F502020 fcc "NOP " +F216: 00 fcb 0 +F217: 0012 fdb $12 +F219: 4F52412020 fcc "ORA " +F21E: 07 fcb 7 +F21F: 008A fdb $8a +F221: 4F52422020 fcc "ORB " +F226: 07 fcb 7 +F227: 00CA fdb $ca +F229: 4F52434320 fcc "ORCC " +F22E: 02 fcb 2 +F22F: 001A fdb $1a +F231: 4F52472020 fcc "ORG " +F236: 0D fcb 13 +F237: 000C fdb 12 +F239: 5053485320 fcc "PSHS " +F23E: 0C fcb 12 +F23F: 0034 fdb $34 +F241: 5053485520 fcc "PSHU " +F246: 0C fcb 12 +F247: 0036 fdb $36 +F249: 50554C5320 fcc "PULS " +F24E: 0C fcb 12 +F24F: 0035 fdb $35 +F251: 50554C5520 fcc "PULU " +F256: 0C fcb 12 +F257: 0037 fdb $37 +F259: 524D422020 fcc "RMB " +F25E: 0D fcb 13 +F25F: 0000 fdb 0 +F261: 524F4C2020 fcc "ROL " +F266: 0A fcb 10 +F267: 0009 fdb $09 +F269: 524F4C4120 fcc "ROLA " +F26E: 00 fcb 0 +F26F: 0049 fdb $49 +F271: 524F4C4220 fcc "ROLB " +F276: 00 fcb 0 +F277: 0059 fdb $59 +F279: 524F522020 fcc "ROR " +F27E: 0A fcb 10 +F27F: 0006 fdb $06 +F281: 524F524120 fcc "RORA " +F286: 00 fcb 0 +F287: 0046 fdb $46 +F289: 524F524220 fcc "RORB " +F28E: 00 fcb 0 +F28F: 0056 fdb $56 +F291: 5254492020 fcc "RTI " +F296: 00 fcb 0 +F297: 003B fdb $3b +F299: 5254532020 fcc "RTS " +F29E: 00 fcb 0 +F29F: 0039 fdb $39 +F2A1: 5342434120 fcc "SBCA " +F2A6: 07 fcb 7 +F2A7: 0082 fdb $82 +F2A9: 5342434220 fcc "SBCB " +F2AE: 07 fcb 7 +F2AF: 00C2 fdb $c2 +F2B1: 5345542020 fcc "SET " +F2B6: 0D fcb 13 +F2B7: 000F fdb 15 +F2B9: 5345544450 fcc "SETDP" +F2BE: 0D fcb 13 +F2BF: 000E fdb 14 +F2C1: 5345582020 fcc "SEX " +F2C6: 00 fcb 0 +F2C7: 001D fdb $1d +F2C9: 5354412020 fcc "STA " +F2CE: 07 fcb 7 +F2CF: 0087 fdb $87 +F2D1: 5354422020 fcc "STB " +F2D6: 07 fcb 7 +F2D7: 00C7 fdb $c7 +F2D9: 5354442020 fcc "STD " +F2DE: 08 fcb 8 +F2DF: 00CD fdb $cd +F2E1: 5354532020 fcc "STS " +F2E6: 09 fcb 9 +F2E7: 10CF fdb $10cf +F2E9: 5354552020 fcc "STU " +F2EE: 08 fcb 8 +F2EF: 00CF fdb $cf +F2F1: 5354582020 fcc "STX " +F2F6: 08 fcb 8 +F2F7: 008F fdb $8f +F2F9: 5354592020 fcc "STY " +F2FE: 09 fcb 9 +F2FF: 108F fdb $108f +F301: 5355424120 fcc "SUBA " +F306: 07 fcb 7 +F307: 0080 fdb $80 +F309: 5355424220 fcc "SUBB " +F30E: 07 fcb 7 +F30F: 00C0 fdb $c0 +F311: 5355424420 fcc "SUBD " +F316: 08 fcb 8 +F317: 0083 fdb $83 +F319: 5357492020 fcc "SWI " +F31E: 00 fcb 0 +F31F: 003F fdb $3f +F321: 5357493220 fcb "SWI2 " +F326: 01 fcb 1 +F327: 103F fdb $103f +F329: 5357493320 fcb "SWI3 " +F32E: 01 fcb 1 +F32F: 113F fdb $113f +F331: 53594E4320 fcc "SYNC " +F336: 00 fcb 0 +F337: 0013 fdb $13 +F339: 5446522020 fcc "TFR " +F33E: 0B fcb 11 +F33F: 001F fdb $1f +F341: 5453542020 fcc "TST " +F346: 0A fcb 10 +F347: 000D fdb $0d +F349: 5453544120 fcc "TSTA " +F34E: 00 fcb 0 +F34F: 004D fdb $4d +F351: 5453544220 fcc "TSTB " +F356: 00 fcb 0 +F357: 005D fdb $5d +F359: +0093: mnemsize equ (*-mnemtab)/8 +F359: +F359: * Register table for PUSH/PULL and TFR/EXG instructions. +F359: * 3 bytes for name, 1 for tfr/exg, 1 for push/pull, 5 total +F359: 582020 asmregtab fcc "X " +F35C: 0110 fcb $01,$10 +F35E: 592020 fcc "Y " +F361: 0220 fcb $02,$20 +F363: 552020 aregu fcc "U " +F366: 0340 fcb $03,$40 +F368: 532020 aregs fcc "S " +F36B: 0440 fcb $04,$40 +F36D: 504320 fcc "PC " +F370: 0580 fcb $05,$80 +F372: 412020 fcc "A " +F375: 0802 fcb $08,$02 +F377: 422020 fcc "B " +F37A: 0904 fcb $09,$04 +F37C: 442020 fcc "D " +F37F: 0006 fcb $00,$06 +F381: 434320 fcc "CC " +F384: 0A01 fcb $0a,$01 +F386: 434352 fcc "CCR" +F389: 0A01 fcb $0a,$01 +F38B: 445020 fcc "DP " +F38E: 0B08 fcb $0b,$08 +F390: 445052 fcc "DPR" +F393: 0B08 fcb $0b,$08 +F395: 3F2020 reginval fcc "? " +F398: +F398: 58595553 ixregs fcc "XYUS" +F39C: +F39C: * opcode offsets to basic opcode, depends on first nibble. +F39C: 000000000000A090 opcoffs fcb 0,0,0,0,0,0,-$60,-$70 +F3A4: 00F0E0D000F0E0D0 fcb 0,-$10,-$20,-$30,0,-$10,-$20,-$30 +F3AC: * mode depending on first nibble of opcode. +F3AC: 0300000000000504 modetab fcb 3,0,0,0,0,0,5,4,1,3,5,4,1,3,5,4 +F3B5: 03050401030504 +F3BC: * mode depending on category code stored in mnemtab +F3BC: 0000010506070701 modetab2 fcb 0,0,1,5,6,7,7,1,2,2,0,8,9 +F3C5: 02000809 +F3C9: * modes in this context: 0 no operands, 1 8-bit immediate, 2 16 bit imm, +F3C9: * 3, 8-bit address, 4 16 bit address, 5 indexed with postbyte, 6 short +F3C9: * relative, 7 long relative, 8 pushpul, 9 tftetx +F3C9: +F3C9: * Decode instruction pointed to by Y for disassembly (and to find out +F3C9: * how long it is). On return, U points to appropriate mnemonic table entry, +F3C9: * Y points past instruction. +F3C9: * It's rather clumsy code, but we do want to reuse the same table +F3C9: * as used with assembling. +F3C9: 7F02BF disdecode clr prebyte +F3CC: 7F02C3 clr amode +F3CF: A6A0 lda ,y+ +F3D1: 8110 cmpa #$10 +F3D3: 2704 beq ddec1 +F3D5: 8111 cmpa #$11 +F3D7: 2605 bne ddec2 +F3D9: B702BF ddec1 sta prebyte ;Store $10 or $11 prebyte. +F3DC: A6A0 lda ,y+ ;Get new opcode. +F3DE: B702C1 ddec2 sta opcode +F3E1: 44 lsra +F3E2: 44 lsra +F3E3: 44 lsra +F3E4: 44 lsra ;Get high nibble. +F3E5: 8EF3AC ldx #modetab +F3E8: E686 ldb a,x +F3EA: F702C3 stb amode +F3ED: 8EF39C ldx #opcoffs +F3F0: A686 lda a,x +F3F2: BB02C1 adda opcode ;Add opcode offset to opcode. +F3F5: B702C0 ddec4 sta opc1 ;Store the 'basis' opcode. +F3F8: CEEEC1 ldu #mnemtab +F3FB: 8E0093 ldx #mnemsize +F3FE: C60D ddecloop ldb #13 +F400: E145 cmpb 5,u ;Compare category code with 13 +F402: 2708 beq ddec3 ;13=pseudo op, no valid opcode +F404: FC02BF ldd prebyte +F407: 10A346 cmpd 6,u +F40A: 2722 beq ddecfound ;Opcode&prebyte agree, operation found. +F40C: 3348 ddec3 leau 8,u ;point to next mnemonic +F40E: 301F leax -1,x +F410: 26EC bne ddecloop +F412: CEF091 ldu #mnemfcb ;mnemonic not found, use FCB byte. +F415: 8603 lda #3 +F417: B702C3 sta amode ;Store mode 3, 8 bit address. +F41A: B602C1 lda opcode +F41D: 7D02BF tst prebyte +F420: 2708 beq ddec5 +F422: B602BF lda prebyte ;if it was the combination prebyte +F425: 7F02BF clr prebyte ;and opcode that was not found, +F428: 313F leay -1,y ;FCB just the prebyte +F42A: B702C5 ddec5 sta operand+1 ;The byte must be stored as operand. +F42D: 39 rts +F42E: 1183EFC9 ddecfound cmpu #mnembsr +F432: 260A bne ddec6 +F434: 868D lda #$8d ;Is it really the BSR opcode? +F436: B102C1 cmpa opcode +F439: 2703 beq ddec6 +F43B: CEF0C9 ldu #mnemjsr ;We mistakenly found BSR instead of JSR +F43E: B602C3 ddec6 lda amode +F441: 84FE anda #$FE +F443: 260A bne ddec7 +F445: A645 lda 5,u ;nibble-dependent mode was 0 or 1, +F447: 8EF3BC ldx #modetab2 ;use category dependent mode instead. +F44A: A686 lda a,x +F44C: B702C3 sta amode +F44F: B602C3 ddec7 lda amode +F452: 48 asla +F453: 8EF458 ldx #disdectab +F456: 6E96 jmp [a,x] ;jump dependent on definitive mode. +F458: F492F48CF493F48C disdectab fdb noop,opdec1,opdec2,opdec1,opdec2,opdecidx +F461: 93F49D +F464: F48CF493F497F497 fdb opdec1,opdec2,opdecpb,opdecpb +F46C: F492F492F492F492 disdectab1 fdb noop,noop,noop,noop,noop,noop,noop,noop +F475: 92F492F492F492 +F47C: F48CF493F492F492 fdb opdec1,opdec2,noop,noop,opdec1,opdec2,noop,opdec2 +F485: 8CF493F492F493 +F48C: E6A0 opdec1 ldb ,y+ +F48E: 1D sex +F48F: FD02C4 od1a std operand +F492: 39 noop rts +F493: ECA1 opdec2 ldd ,y++ +F495: 20F8 bra od1a +F497: E6A0 opdecpb ldb ,y+ +F499: F702C2 odpa stb postbyte +F49C: 39 rts +F49D: E6A0 opdecidx ldb ,y+ +F49F: 2AF8 bpl odpa ;postbytes <$80 have no extra operands. +F4A1: F702C2 stb postbyte +F4A4: C40F andb #$0f +F4A6: 58 aslb +F4A7: 8EF46C ldx #disdectab1 +F4AA: 6E95 jmp [b,x] +F4AC: +F4AC: * Display disassembled instruction after the invocation of disdecode. +F4AC: * U points to mnemonic table entry. +F4AC: 1F31 disdisp tfr u,x +F4AE: C605 ldb #5 +F4B0: 9D09 jsr putline ;Display the mnemonic. +F4B2: C620 ldb #' ' +F4B4: 9D03 jsr putchar +F4B6: B602C3 lda amode +F4B9: 48 asla +F4BA: 8EF4BF ldx #disdisptab +F4BD: 6E96 jmp [a,x] ;Perform action dependent on mode. +F4BF: F492F4D3F4D7F4E1 disdisptab fdb noop,disim8,disim16,disadr8,disadr16 +F4C8: D9 +F4C9: F599F4E9F4F7F557 fdb disidx,disrel8,disrel16,distfr,dispush +F4D2: 0E +F4D3: 8D29 disim8 bsr puthash +F4D5: 200A bra disadr8 +F4D7: 8D25 disim16 bsr puthash +F4D9: 8D27 disadr16 bsr putdol +F4DB: FC02C4 ldd operand +F4DE: 7EE6FF jmp outd +F4E1: 8D1F disadr8 bsr putdol +F4E3: B602C5 lda operand+1 +F4E6: 7EE6F1 jmp outbyte +F4E9: 8D17 disrel8 bsr putdol +F4EB: F602C5 ldb operand+1 +F4EE: 1D sex +F4EF: 109F24 dr8a sty temp +F4F2: D324 addd temp +F4F4: 7EE6FF jmp outd +F4F7: 8D09 disrel16 bsr putdol +F4F9: FC02C4 ldd operand +F4FC: 20F1 bra dr8a +F4FE: +F4FE: C623 puthash ldb #'#' +F500: 0E03 jmp putchar +F502: C624 putdol ldb #'$' +F504: 0E03 jmp putchar +F506: C62C putcomma ldb #',' +F508: 0E03 jmp putchar +F50A: C620 putspace ldb #' ' +F50C: 0E03 jmp putchar +F50E: +F50E: C60C dispush ldb #12 +F510: 8EF359 ldx #asmregtab ;Walk through the register table. +F513: 0F24 clr temp +F515: B602C2 regloop lda postbyte +F518: A404 anda 4,x +F51A: 2735 beq dispush1 ;Is bit corresponding to reg set in postbyte +F51C: 8CF363 cmpx #aregu +F51F: 260B bne dispush3 +F521: 9725 sta temp+1 +F523: B602C1 lda opcode +F526: 8402 anda #2 +F528: 2627 bne dispush1 ;no u register in pshu pulu. +F52A: 9625 lda temp+1 +F52C: 8CF368 dispush3 cmpx #aregs +F52F: 260B bne dispush4 +F531: 9725 sta temp+1 +F533: B602C1 lda opcode +F536: 8402 anda #2 +F538: 2717 beq dispush1 ;no s register in pshs puls. +F53A: 9625 lda temp+1 +F53C: 43 dispush4 coma +F53D: B402C2 anda postbyte ;remove the bits from postbyte. +F540: B702C2 sta postbyte +F543: 3404 pshs b +F545: 0D24 tst temp +F547: 2702 beq dispush2 +F549: 8DBB bsr putcomma ;print comma after first register. +F54B: 8D2B dispush2 bsr disregname +F54D: 0C24 inc temp +F54F: 3504 puls b +F551: 3005 dispush1 leax 5,x +F553: 5A decb +F554: 26BF bne regloop +F556: 39 rts +F557: +F557: B602C2 distfr lda postbyte +F55A: 44 lsra +F55B: 44 lsra +F55C: 44 lsra +F55D: 44 lsra +F55E: 8D07 bsr distfrsub +F560: 8DA4 bsr putcomma +F562: B602C2 lda postbyte +F565: 840F anda #$0f +F567: C60C distfrsub ldb #12 +F569: 8EF359 ldx #asmregtab +F56C: A103 distfrloop cmpa 3,x +F56E: 2705 beq distfrend +F570: 3005 leax 5,x +F572: 5A decb +F573: 26F7 bne distfrloop +F575: 8D01 distfrend bsr disregname +F577: 39 rts +F578: +F578: 8603 disregname lda #3 +F57A: 1F13 tfr x,u +F57C: E6C0 drnloop ldb ,u+ +F57E: C120 cmpb #' ' +F580: 2705 beq drnend +F582: 9D03 jsr putchar +F584: 4A deca +F585: 26F5 bne drnloop +F587: 39 drnend rts +F588: +F588: B602C2 disidxreg lda postbyte +F58B: 44 lsra +F58C: 44 lsra +F58D: 44 lsra +F58E: 44 lsra +F58F: 44 lsra +F590: 8403 anda #3 +F592: 8EF398 ldx #ixregs +F595: E686 ldb a,x +F597: 0E03 jmp putchar +F599: +F599: 0F24 disidx clr temp +F59B: B602C2 lda postbyte +F59E: 2B23 bmi disidx1 +F5A0: 841F anda #$1f +F5A2: 8510 bita #$10 +F5A4: 2605 bne negoffs +F5A6: BDF692 jsr outdecbyte +F5A9: 200A bra discomma +F5AB: C62D negoffs ldb #'-' +F5AD: 9D03 jsr putchar +F5AF: 8AF0 ora #$f0 +F5B1: 40 nega +F5B2: BDF692 jsr outdecbyte +F5B5: BDF506 discomma jsr putcomma ;Display ,Xreg and terminating ] +F5B8: 8DCE disindex bsr disidxreg +F5BA: 0D24 disindir tst temp ;Display ] if indirect. +F5BC: 2704 beq disidxend +F5BE: C65D ldb #']' +F5C0: 9D03 jsr putchar +F5C2: 39 disidxend rts +F5C3: 8510 disidx1 bita #$10 +F5C5: 2706 beq disidx2 +F5C7: C65B ldb #'[' +F5C9: 9D03 jsr putchar +F5CB: 0C24 inc temp +F5CD: B602C2 disidx2 lda postbyte +F5D0: 840F anda #$0f +F5D2: 48 asla +F5D3: 8EF672 ldx #disidxtab +F5D6: 6E96 jmp [a,x] ;Jump to routine for indexed mode +F5D8: 8602 disadec2 lda #2 +F5DA: 2002 bra disadeca +F5DC: 8601 disadec1 lda #1 +F5DE: BDF506 disadeca jsr putcomma +F5E1: C62D disadloop ldb #'-' +F5E3: 9D03 jsr putchar +F5E5: 4A deca +F5E6: 26F9 bne disadloop +F5E8: 20CE bra disindex +F5EA: 8602 disainc2 lda #2 +F5EC: 2002 bra disainca +F5EE: 8601 disainc1 lda #1 +F5F0: 9725 disainca sta temp+1 +F5F2: BDF506 jsr putcomma +F5F5: BDF588 jsr disidxreg +F5F8: 9625 lda temp+1 +F5FA: C62B disailoop ldb #'+' +F5FC: 9D03 jsr putchar +F5FE: 4A deca +F5FF: 26F9 bne disailoop +F601: 7EF5BA jmp disindir +F604: C641 disax ldb #'A' +F606: 9D03 jsr putchar +F608: 7EF5B5 jmp discomma +F60B: C642 disbx ldb #'B' +F60D: 9D03 jsr putchar +F60F: 7EF5B5 jmp discomma +F612: C644 disdx ldb #'D' +F614: 9D03 jsr putchar +F616: 7EF5B5 jmp discomma +F619: C63F disinval ldb #'?' +F61B: 9D03 jsr putchar +F61D: 7EF5BA jmp disindir +F620: B602C5 disnx lda operand+1 +F623: 2B09 bmi disnxneg +F625: BDF502 disnx1 jsr putdol +F628: BDE6F1 jsr outbyte +F62B: 7EF5B5 jmp discomma +F62E: C62D disnxneg ldb #'-' +F630: 9D03 jsr putchar +F632: 40 nega +F633: 20F0 bra disnx1 +F635: BDF502 disnnx jsr putdol +F638: FC02C4 ldd operand +F63B: BDE6FF jsr outd +F63E: 7EF5B5 jmp discomma +F641: BDF502 disnpc jsr putdol +F644: F602C5 ldb operand+1 +F647: 1D sex +F648: 109F26 disnpca sty temp2 +F64B: D326 addd temp2 +F64D: BDE6FF jsr outd +F650: 8EF66E ldx #commapc +F653: C604 ldb #4 +F655: 9D09 jsr putline +F657: 7EF5BA jmp disindir +F65A: BDF502 disnnpc jsr putdol +F65D: FC02C4 ldd operand +F660: 20E6 bra disnpca +F662: BDF502 disdirect jsr putdol +F665: FC02C4 ldd operand +F668: BDE6FF jsr outd +F66B: 7EF5BA jmp disindir +F66E: +F66E: 2C504352 commapc fcc ",PCR" +F672: +F672: F5EEF5EAF5DCF5D8 disidxtab fdb disainc1,disainc2,disadec1,disadec2 +F67A: F5B5F60BF604F619 fdb discomma,disbx,disax,disinval +F682: F620F635F619F612 fdb disnx,disnnx,disinval,disdx +F68A: F641F65AF619F662 fdb disnpc,disnnpc,disinval,disdirect +F692: +F692: * Display byte A in decimal (0<=A<20) +F692: 810A outdecbyte cmpa #10 +F694: 2506 blo odb1 +F696: 800A suba #10 +F698: C631 ldb #'1' +F69A: 9D03 jsr putchar +F69C: 8B30 odb1 adda #'0' +F69E: 1F89 tfr a,b +F6A0: 0E03 jmp putchar +F6A2: +F6A2: * This is the code for the U command, unassemble instructions in memory. +F6A2: * Syntax: U or Uaddr or Uaddr,length +F6A2: 8E0201 unasm ldx #linebuf+1 +F6A5: CC0014 ldd #20 +F6A8: BDE753 jsr scan2parms ;Scan address,length parameters. +F6AB: FC029D ldd addr +F6AE: F3029F addd length +F6B1: FD029F std length +F6B4: 10BE029D ldy addr +F6B8: 1F20 unasmloop tfr y,d +F6BA: BDE6FF jsr outd ;Display instruction address +F6BD: BDF50A jsr putspace +F6C0: 3420 pshs y +F6C2: BDF3C9 jsr disdecode +F6C5: 3510 puls x +F6C7: 109F24 sty temp +F6CA: 0F26 clr temp2 +F6CC: A680 unadishex lda ,x+ +F6CE: BDE6F1 jsr outbyte +F6D1: 0C26 inc temp2 +F6D3: 0C26 inc temp2 +F6D5: 9C24 cmpx temp +F6D7: 26F3 bne unadishex ;Display instruction bytes as hex. +F6D9: C620 unadisspc ldb #' ' +F6DB: 9D03 jsr putchar +F6DD: 0C26 inc temp2 +F6DF: 860B lda #11 +F6E1: 9126 cmpa temp2 ;Fill out with spaces to width 11. +F6E3: 26F4 bne unadisspc +F6E5: 26E5 bne unadishex +F6E7: BDF4AC jsr disdisp ;Display disassembled instruction. +F6EA: 9D0C jsr putcr +F6EC: 10BC029F cmpy length +F6F0: 23C6 bls unasmloop +F6F2: 10BF029D sty addr +F6F6: 7EE579 jmp cmdline +F6F9: +F6F9: * Simple 'expression evaluator' for assembler. +F6F9: E684 expr ldb ,x +F6FB: C12D cmpb #'-' +F6FD: 2603 bne pos +F6FF: 5F clrb +F700: 3001 leax 1,x +F702: 3404 pos pshs b +F704: 8D11 bsr scanfact +F706: 270C beq exprend1 +F708: 6DE0 tst ,s+ +F70A: 2607 bne exprend ;Was the minus sign there. +F70C: 43 coma +F70D: 53 comb +F70E: C30001 addd #1 +F711: 1CFB andcc #$fb ;Clear Z flag for valid result. +F713: 39 exprend rts +F714: 3504 exprend1 puls b +F716: 39 rts +F717: +F717: E680 scanfact ldb ,x+ +F719: C124 cmpb #'$' +F71B: 1027F011 lbeq scanhex ;Hex number if starting with dollar. +F71F: C127 cmpb #''' +F721: 260E bne scandec ;char if starting with ' else decimal +F723: E680 ldb ,x+ +F725: A684 lda ,x +F727: 8127 cmpa #''' +F729: 2602 bne scanchar2 +F72B: 3001 leax 1,x ;Increment past final quote if it's there. +F72D: 4F scanchar2 clra +F72E: 1CFB andcc #$fb ;Clear zero flag. +F730: 39 rts +F731: C130 scandec cmpb #'0' +F733: 252F blo noexpr +F735: C139 cmpb #'9' +F737: 222B bhi noexpr +F739: 0F24 clr temp +F73B: 0F25 clr temp+1 +F73D: C030 scandloop subb #'0' +F73F: 251C bcs sdexit +F741: C10A cmpb #10 +F743: 2418 bcc sdexit +F745: 3404 pshs b +F747: DC24 ldd temp +F749: 58 aslb +F74A: 49 rola +F74B: 3406 pshs d +F74D: 58 aslb +F74E: 49 rola +F74F: 58 aslb +F750: 49 rola +F751: E3E1 addd ,s++ ;Multiply number by 10. +F753: EBE0 addb ,s+ +F755: 8900 adca #0 ;Add digit to 10. +F757: DD24 std temp +F759: E680 ldb ,x+ ;Get next character. +F75B: 20E0 bra scandloop +F75D: DC24 sdexit ldd temp +F75F: 301F leax -1,x +F761: 1CFB andcc #$fb +F763: 39 rts +F764: 1A04 noexpr orcc #$04 +F766: 39 rts +F767: +F767: * Assemble the instruction pointed to by X. +F767: * Fisrt stage: copy mnemonic to mnemonic buffer. +F767: 8605 asminstr lda #5 +F769: CE02C6 ldu #mnembuf +F76C: E680 mncploop ldb ,x+ +F76E: 2715 beq mncpexit +F770: C120 cmpb #' ' +F772: 2711 beq mncpexit ;Mnemonic ends at first space or null +F774: C4DF andb #CASEMASK +F776: C141 cmpb #'A' +F778: 2504 blo nolet +F77A: C15A cmpb #'Z' +F77C: 2302 bls mnemcp1 ;Capitalize letters, but only letters. +F77E: E61F nolet ldb -1,x +F780: E7C0 mnemcp1 stb ,u+ ;Copy to mnemonic buffer. +F782: 4A deca +F783: 26E7 bne mncploop +F785: 4D mncpexit tsta +F786: 2707 beq mncpdone +F788: C620 ldb #' ' +F78A: E7C0 mnfilloop stb ,u+ +F78C: 4A deca +F78D: 26FB bne mnfilloop ;Fill the rest of mnem buffer with spaces. +F78F: * Second stage: look mnemonic up using binary search. +F78F: 9F28 mncpdone stx temp3 +F791: 0F24 clr temp ;Low index=0 +F793: 8693 lda #mnemsize +F795: 9725 sta temp+1 ;High index=mnemsize. +F797: D625 bsrchloop ldb temp+1 +F799: C1FF cmpb #$ff +F79B: 2739 beq invmnem ;lower limit -1? +F79D: D124 cmpb temp +F79F: 2535 blo invmnem ;hi index lower than low index? +F7A1: 4F clra +F7A2: DB24 addb temp ;Add indexes. +F7A4: 8900 adca #0 +F7A6: 44 lsra +F7A7: 56 rorb ;Divide by 2 to get average +F7A8: D726 stb temp2 +F7AA: 58 aslb +F7AB: 49 rola +F7AC: 58 aslb +F7AD: 49 rola +F7AE: 58 aslb +F7AF: 49 rola ;Multiply by 8 to get offset. +F7B0: CEEEC1 ldu #mnemtab +F7B3: 33CB leau d,u ;Add offset to table base +F7B5: 1F32 tfr u,y +F7B7: 8605 lda #5 +F7B9: 8E02C6 ldx #mnembuf +F7BC: E680 bscmploop ldb ,x+ +F7BE: E1A0 cmpb ,y+ +F7C0: 2606 bne bscmpexit ;Characters don't match? +F7C2: 4A deca +F7C3: 26F7 bne bscmploop +F7C5: 7EF7DC jmp mnemfound ;We found the mnemonic. +F7C8: D626 bscmpexit ldb temp2 +F7CA: 2405 bcc bscmplower +F7CC: 5A decb +F7CD: D725 stb temp+1 ;mnembuf<table, adjust high limit. +F7CF: 20C6 bra bsrchloop +F7D1: 5C bscmplower incb +F7D2: D724 stb temp ;mnembuf>table, adjust low limit. +F7D4: 20C1 bra bsrchloop +F7D6: 8EE69E invmnem ldx #invmmsg +F7D9: 7E0298 jmp asmerrvec +F7DC: * Stage 3: Perform routine depending on category code. +F7DC: 7F02CC mnemfound clr uncert +F7DF: 10BE029D ldy addr +F7E3: A645 lda 5,u +F7E5: 48 asla +F7E6: 8EF7F0 ldx #asmtab +F7E9: AD96 jsr [a,x] +F7EB: 10BF029D sty addr +F7EF: 39 rts +F7F0: F812F816F81AF82F asmtab fdb onebyte,twobyte,immbyte,lea +F7F8: F855F868F87BF882 fdb sbranch,lbranch,lbra,acc8 +F800: F893F8A4F8B7F8D9 fdb dreg1,dreg2,oneaddr,tfrexg +F808: F902F928 fdb pushpul,pseudo +F80C: +F80C: E7A0 putbyte stb ,y+ +F80E: 39 rts +F80F: EDA1 putword std ,y++ +F811: 39 rts +F812: +F812: E647 onebyte ldb 7,u ;Cat 0, one byte opcode w/o operands RTS +F814: 20F6 bra putbyte +F816: EC46 twobyte ldd 6,u ;Cat 1, two byte opcode w/o operands SWI2 +F818: 20F5 bra putword +F81A: E647 immbyte ldb 7,u ;Cat 2, opcode w/ immdiate operand ANDCC +F81C: 8DEE bsr putbyte +F81E: BDF94B jsr scanops +F821: F602C3 ldb amode +F824: C101 cmpb #1 +F826: 1026038A lbne moderr +F82A: F602C5 ldb operand+1 +F82D: 20DD bra putbyte +F82F: E647 lea ldb 7,u ;Cat 3, LEA +F831: 8DD9 bsr putbyte +F833: BDF94B jsr scanops +F836: B602C3 lda amode +F839: 8101 cmpa #1 +F83B: 10270375 lbeq moderr ;No immediate w/ lea +F83F: 8103 cmpa #3 +F841: 102402BE lbhs doaddr +F845: BDFAF6 jsr set3 +F848: 868F lda #$8f +F84A: B702C2 sta postbyte +F84D: 8602 lda #2 +F84F: B702CB sta opsize ;Use 8F nn nn for direct mode. +F852: 7EFB03 jmp doaddr +F855: E647 sbranch ldb 7,u ;Cat 4, short branch instructions +F857: 8DB3 bsr putbyte +F859: BDF943 jsr startop +F85C: 301F leax -1,x +F85E: BD0295 jsr exprvec +F861: 10270349 lbeq exprerr +F865: 7EFB6C jmp shortrel +F868: EC46 lbranch ldd 6,u ;Cat 5, long brach w/ two byte opcode +F86A: 8DA3 bsr putword +F86C: BDF943 lbra1 jsr startop +F86F: 301F leax -1,x +F871: BD0295 jsr exprvec +F874: 10270336 lbeq exprerr +F878: 7EFB90 jmp longrel +F87B: E647 lbra ldb 7,u ;Cat 6, long branch w/ one byte opcode. +F87D: BDF80C jsr putbyte +F880: 20EA bra lbra1 +F882: 8601 acc8 lda #1 ;Cat 7, 8-bit two operand instructions ADDA +F884: B702CB sta opsize +F887: BDF94B jsr scanops +F88A: BDF929 jsr adjopc +F88D: BDF80C jsr putbyte +F890: 7EFB03 jmp doaddr +F893: 8602 dreg1 lda #2 ;Cat 8, 16-bit 2operand insns 1byte opc LDX +F895: B702CB sta opsize +F898: BDF94B jsr scanops +F89B: BDF929 jsr adjopc +F89E: BDF80C jsr putbyte +F8A1: 7EFB03 jmp doaddr +F8A4: 8602 dreg2 lda #2 ;Cat 9, 16-bit 2operand insns 2byte opc LDY +F8A6: B702CB sta opsize +F8A9: BDF94B jsr scanops +F8AC: BDF929 jsr adjopc +F8AF: A646 lda 6,u +F8B1: BDF80F jsr putword +F8B4: 7EFB03 jmp doaddr +F8B7: BDF94B oneaddr jsr scanops ;Cat 10, one-operand insns NEG..CLR +F8BA: E647 ldb 7,u +F8BC: B602C3 lda amode +F8BF: 8101 cmpa #1 +F8C1: 102702EF lbeq moderr ;No immediate mode +F8C5: 8103 cmpa #3 +F8C7: 2408 bhs oaind ;indexed etc +F8C9: B602CB lda opsize +F8CC: 4A deca +F8CD: 2704 beq oadir +F8CF: CB10 addb #$10 ;Add $70 for extended direct. +F8D1: CB60 oaind addb #$60 ;And $60 for indexed etc. +F8D3: BDF80C oadir jsr putbyte ;And nothing for direct8. +F8D6: 7EFB03 jmp doaddr +F8D9: BDF943 tfrexg jsr startop ;Cat 11, TFR and EXG +F8DC: 301F leax -1,x +F8DE: E647 ldb 7,u +F8E0: BDF80C jsr putbyte +F8E3: BDFBCC jsr findreg +F8E6: E6C4 ldb ,u +F8E8: 58 aslb +F8E9: 58 aslb +F8EA: 58 aslb +F8EB: 58 aslb +F8EC: F702C2 stb postbyte +F8EF: E680 ldb ,x+ +F8F1: C12C cmpb #',' +F8F3: 102602BD lbne moderr +F8F7: BDFBCC jsr findreg +F8FA: E6C4 ldb ,u +F8FC: FA02C2 orb postbyte +F8FF: 7EF80C jmp putbyte +F902: BDF943 pushpul jsr startop ;Cat 12, PSH and PUL +F905: 301F leax -1,x +F907: E647 ldb 7,u +F909: BDF80C jsr putbyte +F90C: 7F02C2 clr postbyte +F90F: BDFBCC pploop jsr findreg +F912: E641 ldb 1,u +F914: FA02C2 orb postbyte +F917: F702C2 stb postbyte +F91A: E680 ldb ,x+ +F91C: C12C cmpb #',' +F91E: 27EF beq pploop +F920: 301F leax -1,x +F922: F602C2 ldb postbyte +F925: 7EF80C jmp putbyte +F928: pseudo ;Cat 13, pseudo oeprations +F928: 39 rts +F929: +F929: * Adjust opcdoe depending on mode (in $80-$FF range) +F929: E647 adjopc ldb 7,u +F92B: B602C3 lda amode +F92E: 8102 cmpa #2 +F930: 2708 beq adjdir ;Is it direct? +F932: 8103 cmpa #3 +F934: 2401 bhs adjind ;Indexed etc? +F936: 39 rts ;Not, then immediate, no adjust. +F937: CB20 adjind addb #$20 ;Add $20 to opcode for indexed etc modes. +F939: 39 rts +F93A: CB10 adjdir addb #$10 ;Add $10 to opcode for direct8 +F93C: B602CB lda opsize +F93F: 4A deca +F940: 26F5 bne adjind ;If opsize=2, add another $20 for extended16 +F942: 39 rts +F943: +F943: * Start scanning of operands. +F943: 9E28 startop ldx temp3 +F945: 7F02C3 clr amode +F948: 7EE708 jmp skipspace +F94B: +F94B: * amode settings in assembler: 1=immediate, 2=direct/extended, 3=indexed +F94B: * etc. 4=pc relative, 5=indirect, 6=pcrelative and indirect. +F94B: +F94B: * This subroutine scans the assembler operands. +F94B: 8DF6 scanops bsr startop +F94D: C15B cmpb #'[' +F94F: 2607 bne noindir +F951: 8605 lda #5 ;operand starts with [, then indirect. +F953: B702C3 sta amode +F956: E680 ldb ,x+ +F958: C123 noindir cmpb #'#' +F95A: 10270087 lbeq doimm +F95E: C12C cmpb #',' +F960: 1027009A lbeq dospecial +F964: C4DF andb #CASEMASK ;Convert to uppercase. +F966: 8686 lda #$86 +F968: C141 cmpb #'A' +F96A: 270C beq scanacidx +F96C: 8685 lda #$85 +F96E: C142 cmpb #'B' +F970: 2706 beq scanacidx +F972: 868B lda #$8B +F974: C144 cmpb #'D' +F976: 2616 bne scanlab +F978: E680 scanacidx ldb ,x+ ;Could it be A,X B,X or D,X +F97A: C12C cmpb #',' +F97C: 260E bne nocomma +F97E: B702C2 sta postbyte +F981: 7F02CB clr opsize +F984: BDFAF6 jsr set3 +F987: BDFAD8 jsr scanixreg +F98A: 2041 bra scanend +F98C: 301F nocomma leax -1,x +F98E: 301F scanlab leax -1,x ;Point to the start of the operand +F990: BD0295 jsr exprvec +F993: 10270217 lbeq exprerr +F997: FD02C4 std operand +F99A: 7D02CC tst uncert +F99D: 2609 bne opsz2 ;Go for extended if operand unknown. +F99F: B302CD subd dpsetting +F9A2: 4D tsta ;Can we use 8-bit operand? +F9A3: 2603 bne opsz2 +F9A5: 4C inca +F9A6: 2002 bra opsz1 +F9A8: 8602 opsz2 lda #2 +F9AA: B702CB opsz1 sta opsize ;Set opsize depending on magnitude of op. +F9AD: B602C3 lda amode +F9B0: 8105 cmpa #5 +F9B2: 260C bne opsz3 ;Or was it indirect. +F9B4: 8602 lda #2 ;Then we have postbyte and opsize=2 +F9B6: B702CB sta opsize +F9B9: 868F lda #$8F +F9BB: B702C2 sta postbyte +F9BE: 2005 bra opsz4 +F9C0: 8602 opsz3 lda #2 +F9C2: B702C3 sta amode ;Assume direct or absolute addressing +F9C5: E680 opsz4 ldb ,x+ +F9C7: C12C cmpb #',' +F9C9: 10270086 lbeq doindex ;If followed by, then indexed. +F9CD: B602C3 scanend lda amode +F9D0: 8105 cmpa #5 +F9D2: 2510 blo scanend2 ;Was it an indirect mode? +F9D4: B602C2 lda postbyte +F9D7: 8A10 ora #$10 ;Set indirect bit. +F9D9: B702C2 sta postbyte +F9DC: E680 ldb ,x+ +F9DE: C15D cmpb #']' ;Check for the other ] +F9E0: 102701D0 lbeq moderr +F9E4: 39 scanend2 rts +F9E5: BD0295 doimm jsr exprvec ;Immediate addressing. +F9E8: 102701C2 lbeq exprerr +F9EC: FD02C4 std operand +F9EF: B602C3 lda amode +F9F2: 8105 cmpa #5 +F9F4: 102701BC lbeq moderr ;Inirect mode w/ imm is illegal. +F9F8: 8601 lda #$01 +F9FA: B702C3 sta amode +F9FD: 39 rts +F9FE: BDFAF6 dospecial jsr set3 +FA01: 7F02CB clr opsize +FA04: 4F clra +FA05: E680 adecloop ldb ,x+ +FA07: C12D cmpb #'-' +FA09: 2603 bne adecend +FA0B: 4C inca ;Count the - signs for autodecrement. +FA0C: 20F7 bra adecloop +FA0E: 301F adecend leax -1,x +FA10: 8102 cmpa #2 +FA12: 1022019E lbhi moderr +FA16: 4D tsta +FA17: 262F bne autodec +FA19: 7F02C2 clr postbyte +FA1C: BDFAD8 jsr scanixreg +FA1F: 4F clra +FA20: E680 aincloop ldb ,x+ +FA22: C12B cmpb #'+' +FA24: 2603 bne aincend +FA26: 4C inca +FA27: 20F7 bra aincloop ;Count the + signs for autoincrement. +FA29: 301F aincend leax -1,x +FA2B: 8102 cmpa #2 +FA2D: 10220183 lbhi moderr +FA31: 4D tsta +FA32: 260A bne autoinc +FA34: 8684 lda #$84 +FA36: BA02C2 ora postbyte +FA39: B702C2 sta postbyte +FA3C: 208F bra scanend +FA3E: 8B7F autoinc adda #$7f +FA40: BA02C2 ora postbyte +FA43: B702C2 sta postbyte +FA46: 2085 bra scanend +FA48: 8B81 autodec adda #$81 +FA4A: B702C2 sta postbyte +FA4D: BDFAD8 jsr scanixreg +FA50: 16FF7A lbra scanend +FA53: 7F02C2 doindex clr postbyte +FA56: BDFAF6 jsr set3 +FA59: E680 ldb ,x+ +FA5B: C4DF andb #CASEMASK ;Convert to uppercase. +FA5D: C150 cmpb #'P' +FA5F: 10270057 lbeq dopcrel ;Check for PC relative. +FA63: 301F leax -1,x +FA65: 7F02CB clr opsize +FA68: 8D6E bsr scanixreg +FA6A: FC02C4 ldd operand +FA6D: 7D02CC tst uncert +FA70: 2638 bne longindex ;Go for long index if operand unknown. +FA72: 1083FFF0 cmpd #-16 +FA76: 2D18 blt shortindex +FA78: 1083000F cmpd #15 +FA7C: 2E12 bgt shortindex +FA7E: B602C3 lda amode +FA81: 8105 cmpa #5 +FA83: 2717 beq shortind1 ;Indirect may not be 5-bit index +FA85: ;It's a five-bit index. +FA85: C41F andb #$1f +FA87: FA02C2 orb postbyte +FA8A: F702C2 stb postbyte +FA8D: 16FF3D lbra scanend +FA90: 1083FF80 shortindex cmpd #-128 +FA94: 2D14 blt longindex +FA96: 1083007F cmpd #127 +FA9A: 2E0E bgt longindex +FA9C: 7C02CB shortind1 inc opsize +FA9F: C688 ldb #$88 +FAA1: FA02C2 orb postbyte +FAA4: F702C2 stb postbyte +FAA7: 16FF23 lbra scanend +FAAA: 8602 longindex lda #$2 +FAAC: B702CB sta opsize +FAAF: C689 ldb #$89 +FAB1: FA02C2 orb postbyte +FAB4: F702C2 stb postbyte +FAB7: 16FF13 lbra scanend +FABA: E680 dopcrel ldb ,x+ +FABC: C4DF andb #CASEMASK ;Convert to uppercase +FABE: C143 cmpb #'C' +FAC0: 2506 blo pcrelend +FAC2: C152 cmpb #'R' +FAC4: 2202 bhi pcrelend +FAC6: 20F2 bra dopcrel ;Scan past the ,PCR +FAC8: 301F pcrelend leax -1,x +FACA: C68C ldb #$8C +FACC: FA02C2 orb postbyte ;Set postbyte +FACF: F702C2 stb postbyte +FAD2: 7C02C3 inc amode ;Set addr mode to PCR +FAD5: 16FEF5 lbra scanend +FAD8: +FAD8: * Scan for one of the 4 index registers and adjust postbyte. +FAD8: E680 scanixreg ldb ,x+ +FADA: C4DF andb #CASEMASK ;Convert to uppercase. +FADC: 3410 pshs x +FADE: 8EF398 ldx #ixregs +FAE1: 4F clra +FAE2: E180 scidxloop cmpb ,x+ +FAE4: 2707 beq ixfound +FAE6: 8B20 adda #$20 +FAE8: 2AF8 bpl scidxloop +FAEA: 7EFBB4 jmp moderr ;Index register not found where expected. +FAED: BA02C2 ixfound ora postbyte +FAF0: B702C2 sta postbyte ;Set index reg bits in postbyte. +FAF3: 3510 puls x +FAF5: 39 rts +FAF6: +FAF6: * This routine sets amode to 3, if it was less. +FAF6: B602C3 set3 lda amode +FAF9: 8103 cmpa #3 +FAFB: 2405 bhs set3a +FAFD: 8603 lda #3 +FAFF: B702C3 sta amode +FB02: 39 set3a rts +FB03: +FB03: * This subroutine lays down the address. +FB03: B602C3 doaddr lda amode +FB06: 8103 cmpa #3 +FB08: 250D blo doa1 +FB0A: F602C2 ldb postbyte +FB0D: BDF80C jsr putbyte +FB10: B602C3 lda amode +FB13: 8401 anda #1 +FB15: 2715 beq doapcrel ;pc rel modes. +FB17: B602CB doa1 lda opsize +FB1A: 4D tsta +FB1B: 27E5 beq set3a +FB1D: 4A deca +FB1E: 2706 beq doa2 +FB20: FC02C4 ldd operand +FB23: 7EF80F jmp putword +FB26: F602C5 doa2 ldb operand+1 +FB29: 7EF80C jmp putbyte +FB2C: 10BF029D doapcrel sty addr +FB30: FC02C4 ldd operand +FB33: B3029D subd addr +FB36: 830001 subd #1 +FB39: 7D02CC tst uncert +FB3C: 2614 bne pcrlong +FB3E: 1083FF80 cmpd #-128 +FB42: 2D0E blt pcrlong +FB44: 1083FF81 cmpd #-127 +FB48: 2E08 bgt pcrlong +FB4A: 8601 lda #1 +FB4C: B702CB sta opsize +FB4F: 7EF80C jmp putbyte +FB52: 830001 pcrlong subd #1 +FB55: 313F leay -1,y +FB57: 7C02C2 inc postbyte +FB5A: 3406 pshs d +FB5C: F602C2 ldb postbyte +FB5F: BDF80C jsr putbyte +FB62: 8602 lda #2 +FB64: B702CB sta opsize +FB67: 3506 puls d +FB69: 7EF80F jmp putword +FB6C: +FB6C: * This routine checks and lays down short relative address. +FB6C: 10BF029D shortrel sty addr +FB70: B3029D subd addr +FB73: 830001 subd #1 +FB76: 1083FF80 cmpd #-128 +FB7A: 2D2C blt brerr +FB7C: 1083007F cmpd #127 +FB80: 2E26 bgt brerr +FB82: BDF80C jsr putbyte +FB85: 8604 lda #4 +FB87: B702C3 sta amode +FB8A: 8601 lda #1 +FB8C: B702CB sta opsize +FB8F: 39 rts +FB90: * This routine lays down long relative address. +FB90: 10BF029D longrel sty addr +FB94: B3029D subd addr +FB97: 830002 subd #2 +FB9A: BDF80F jsr putword +FB9D: 8604 lda #4 +FB9F: B702C3 sta amode +FBA2: 8602 lda #2 +FBA4: B702CB sta opsize +FBA7: 39 rts +FBA8: +FBA8: 8EE6D6 brerr ldx #brmsg +FBAB: 7E0298 jmp asmerrvec +FBAE: 8EE6AF exprerr ldx #exprmsg +FBB1: 7E0298 jmp asmerrvec +FBB4: 8EE6C0 moderr ldx #modemsg +FBB7: 7E0298 jmp asmerrvec +FBBA: 3410 asmerr pshs x +FBBC: 9D18 jsr xabortin +FBBE: 3510 puls x +FBC0: BDE502 jsr outcount +FBC3: 9D0C jsr putcr +FBC5: 10FE02BD lds savesp +FBC9: 7EE579 jmp cmdline +FBCC: +FBCC: * Find register for TFR and PSH instruction +FBCC: C60C findreg ldb #12 +FBCE: 3424 pshs y,b +FBD0: CEF359 ldu #asmregtab +FBD3: 1F12 findregloop tfr x,y +FBD5: 8603 lda #3 +FBD7: E6C4 frcmps ldb ,u +FBD9: C120 cmpb #' ' +FBDB: 2606 bne frcmps1 +FBDD: E6A4 ldb ,y +FBDF: C141 cmpb #'A' +FBE1: 2D18 blt frfound +FBE3: E6A0 frcmps1 ldb ,y+ +FBE5: C4DF andb #CASEMASK +FBE7: E1C0 cmpb ,u+ +FBE9: 2606 bne frnextreg +FBEB: 4A deca +FBEC: 26E9 bne frcmps +FBEE: 4C inca +FBEF: 200A bra frfound +FBF1: 4C frnextreg inca +FBF2: 33C6 leau a,u +FBF4: 6AE4 dec ,s +FBF6: 26DB bne findregloop +FBF8: 16FFB9 lbra moderr +FBFB: 33C6 frfound leau a,u +FBFD: 1F21 tfr y,x +FBFF: 3524 puls y,b +FC01: 39 rts +FC02: +FC02: * This is the code for the A command, assemble instructions. +FC02: * Syntax: Aaddr +FC02: 8E0201 asm ldx #linebuf+1 +FC05: BDE730 jsr scanhex +FC08: FD029D std addr +FC0B: FC029D asmloop ldd addr +FC0E: BDE6FF jsr outd +FC11: C620 ldb #' ' +FC13: 9D03 jsr putchar ;Print address and space. +FC15: 8E0200 ldx #linebuf +FC18: C680 ldb #128 +FC1A: 9D06 jsr getline ;Get new line +FC1C: 5D tstb +FC1D: 1027E958 lbeq cmdline ;Exit on empty line. +FC21: 3A abx +FC22: 6F84 clr ,x ;Make line zero terminated. +FC24: 8E0200 ldx #linebuf +FC27: BDF767 jsr asminstr +FC2A: 20DF bra asmloop +FC2C: +FC2C: * Jump table for monitor routines that are usable by other programs. +FC2C: org $ffc0 +FFC0: 7EE6F1 jmp outbyte +FFC3: 7EE6FF jmp outd +FFC6: 7EE76B jmp scanbyte +FFC9: 7EE730 jmp scanhex +FFCC: 7EF717 jmp scanfact +FFCF: 7EF767 jmp asminstr +FFD2: +FFD2: +FFD2: * Interrupt vector addresses at top of ROM. Most are vectored through jumps +FFD2: * in RAM. +FFD2: org $fff2 +FFF2: 0280 fdb swi3vec +FFF4: 0283 fdb swi2vec +FFF6: 0286 fdb firqvec +FFF8: 0289 fdb irqvec +FFFA: 028C fdb swivec +FFFC: 028F fdb nmivec +FFFE: E400 fdb reset +0000: +0000: end +0 Pass 2 errors. + +SYMBOL TABLE + ACC8 02 f882 ACIACTL 00 e000 ACIADAT 00 e001 ACIAIRQ 02 e516 + ACIASTA 00 e000 ACK 00 0006 ACKLOOP 02 ed17 ADDCHK 02 ea57 + ADDR 02 029d ADECEND 02 fa0e ADECLOOP 02 fa05 ADJDIR 02 f93a + ADJIND 02 f937 ADJOPC 02 f929 AINCEND 02 fa29 AINCLOOP 02 fa20 + AMODE 02 02c3 AREGS 02 f368 AREGU 02 f363 ARM 02 e9db + ARM1 02 e9e0 ARM2 02 e9f1 ASM 02 fc02 ASMERR 02 fbba + ASMERRVEC 02 0298 ASMINSTR 02 f767 ASMLOOP 02 fc0b ASMREGTAB 02 f359 + ASMTAB 02 f7f0 AUTODEC 02 fa48 AUTOINC 02 fa3e BACKSP 02 e491 + BLOCKMOVE 02 e44a BP1 02 ea0b BP2 02 ea17 BPADDR 02 02a1 + BPEXIT 02 ea28 BPFULL 02 ea39 BREAK 02 e9f7 BRERR 02 fba8 + BRKMSG 02 e60f BRKPOINTS 00 0004 BRMSG 02 e6d6 BS 00 0008 + BSCMPEXIT 02 f7c8 BSCMPLOOP 02 f7bcBSCMPLOWER 02 f7d1 BSRCHLOOP 02 f797 + BUF0 02 0100 BUF1 02 0180 BUFLEN 00 0080 CAN 00 0018 + CASEMASK 00 00df CB2 02 e723 CHECKOUT 02 eb5c CLEARIT 02 ea30 + CLRMSG 02 e61e CLVAR 02 e434 CMDLINE 02 e579 CMDTAB 02 e5a1 + COMMAPC 02 f66e CONVB 02 e70f CONVEXIT 02 e726 CR 00 000d + DBP1 02 ea41 DBP2 02 ea4c DDEC1 02 f3d9 DDEC2 02 f3de + DDEC3 02 f40c DDEC4 02 f3f5 DDEC5 02 f42a DDEC6 02 f43e + DDEC7 02 f44f DDECFOUND 02 f42e DDECLOOP 02 f3fe DEL 00 007f + DELAY 02 0021 DH1 02 e791 DH2 02 e79e DH3 02 e7b7 + DH4 02 e7bf DH5 02 e7c5 DH6 02 e7ad DISADEC1 02 f5dc + DISADEC2 02 f5d8 DISADECA 02 f5de DISADLOOP 02 f5e1 DISADR16 02 f4d9 + DISADR8 02 f4e1 DISAILOOP 02 f5fa DISAINC1 02 f5ee DISAINC2 02 f5ea + DISAINCA 02 f5f0 DISARM 02 e9c1 DISARM1 02 e9c6 DISARM2 02 e9d2 + DISAX 02 f604 DISBX 02 f60b DISCOMMA 02 f5b5 DISDECODE 02 f3c9 + DISDECTAB 02 f458DISDECTAB1 02 f46c DISDIRECT 02 f662 DISDISP 02 f4ac +DISDISPTAB 02 f4bf DISDX 02 f612 DISIDX 02 f599 DISIDX1 02 f5c3 + DISIDX2 02 f5cd DISIDXEND 02 f5c2 DISIDXREG 02 f588 DISIDXTAB 02 f672 + DISIM16 02 f4d7 DISIM8 02 f4d3 DISINDEX 02 f5b8 DISINDIR 02 f5ba + DISINVAL 02 f619 DISNNPC 02 f65a DISNNX 02 f635 DISNPC 02 f641 + DISNPCA 02 f648 DISNX 02 f620 DISNX1 02 f625 DISNXNEG 02 f62e + DISP16 02 e906 DISP8 02 e8f8 DISPBP 02 ea3e DISPREGS 02 e916 + DISPUSH 02 f50e DISPUSH1 02 f551 DISPUSH2 02 f54b DISPUSH3 02 f52c + DISPUSH4 02 f53cDISREGNAME 02 f578 DISREL16 02 f4f7 DISREL8 02 f4e9 + DISTFR 02 f557 DISTFREND 02 f575DISTFRLOOP 02 f56c DISTFRSUB 02 f567 + DLYLOOP 02 e51a DOA1 02 fb17 DOA2 02 fb26 DOADDR 02 fb03 + DOAPCREL 02 fb2c DOIMM 02 f9e5 DOINDEX 02 fa53 DOPCREL 02 faba + DOSPECIAL 02 f9fe DOTAB 02 e4d3 DPSETTING 02 02cd DR8A 02 f4ef + DREG1 02 f893 DREG2 02 f8a4 DRNEND 02 f587 DRNLOOP 02 f57c + DUMP 02 e784 ENDIRQ 02 e517 ENDMSG 02 e6e6 ENDREC 02 eab7 + ENDREC1 02 eaca ENDSS 02 eb51 ENDVARS 02 02cf ENDVECS 02 e55f + ENT1 02 e7e9 ENT2 02 e7ef ENTASC 02 e82a ENTDONE 02 e83b + ENTER 02 e7de ENTEXIT 02 e842 ENTL2 02 e821 ENTL3 02 e82e + ENTLINE 02 e811 EOT 00 0004 EXPR 02 f6f9 EXPREND 02 f713 + EXPREND1 02 f714 EXPRERR 02 fbae EXPRMSG 02 e6af EXPRVEC 02 0295 + FHEXLOOP 02 ebcd FILLER 02 02bb FIND 02 eba7 FINDHEX 02 ebc7 + FINDREG 02 fbccFINDREGLOOP 02 fbd3 FIRQVEC 02 0286 FRCMPS 02 fbd7 + FRCMPS1 02 fbe3 FRFOUND 02 fbfb FRNEXTREG 02 fbf1 FSTRLOOP 02 ebba + FULLMSG 02 e631 GETCHAR 02 0000 GETLINE 02 0006 GETPOLL 02 000f +GETTIMEOUT 02 ec7e GO 02 e88b GT1 02 ec86 GTEXIT 02 ec93 + HEX 02 e857 HEX1 02 e86f HEXDIGIT 02 e6e6 HEXEND 02 e881 + HEXLOOP 02 e85f IMMBYTE 02 f81a INITACIA 02 e452 INP 02 e845 + INTVECTBL 02 e520 INVMMSG 02 e69e INVMNEM 02 f7d6 IRQVEC 02 0289 + IXFOUND 02 faed IXREGS 02 f398 JUMP 02 e89a LASTOK 02 002f + LASTREC 02 e654 LASTTERM 02 02ba LAUNCH 02 e895 LBRA 02 f87b + LBRA1 02 f86c LBRANCH 02 f868 LEA 02 f82f LENGTH 02 029f + LF 00 000a LINEBUF 02 0200 LONGINDEX 02 faaa LONGREL 02 fb90 + MNCPDONE 02 f78f MNCPEXIT 02 f785 MNCPLOOP 02 f76c MNEMBSR 02 efc9 + MNEMBUF 02 02c6 MNEMCP1 02 f780 MNEMFCB 02 f091 MNEMFOUND 02 f7dc + MNEMJSR 02 f0c9 MNEMSIZE 00 0093 MNEMTAB 02 eec1 MNFILLOOP 02 f78a + MODEMSG 02 e6c0 MODERR 02 fbb4 MODETAB 02 f3ac MODETAB2 02 f3bc + MOVE 02 eb6a MVLOOP 02 eb9c NAK 00 0015 NEGOFFS 02 f5ab + NEWLINE 02 e4b6 NMIVEC 02 028f NOCOMMA 02 f98c NOEXPR 02 f764 + NOINDIR 02 f958 NOLET 02 f77e NOOP 02 f492 OADIR 02 f8d3 + OAIND 02 f8d1 OD1A 02 f48f ODB1 02 f69c ODPA 02 f499 + OLDGETC 02 02b4 OLDPC 02 029b OLDPUTC 02 02b6 OLDPUTCR 02 02b8 + ONEADDR 02 f8b7 ONEBYTE 02 f812 OPC1 02 02c0 OPCODE 02 02c1 + OPCOFFS 02 f39c OPDEC1 02 f48c OPDEC2 02 f493 OPDECIDX 02 f49d + OPDECPB 02 f497 OPERAND 02 02c4 OPSIZE 02 02cb OPSZ1 02 f9aa + OPSZ2 02 f9a8 OPSZ3 02 f9c0 OPSZ4 02 f9c5 OSCR 02 e4f5 + OSDLY 02 e518 OSGETC 02 e45a OSGETL 02 e480 OSGETL1 02 e485 + OSGETL2 02 e4a5 OSGETL3 02 e4c0 OSGETPOLL 02 e465 OSPUTC 02 e471 + OSPUTL 02 e4e4 OSPUTL1 02 e4f2 OSPUTL2 02 e4eb OSVECTBL 02 e53b + OUTBYTE 02 e6f1 OUTCOUNT 02 e502 OUTD 02 e6ffOUTDECBYTE 02 f692 + PCRELEND 02 fac8 PCRLONG 02 fb52 POLTRUE 02 e46e POS 02 f702 + POSTBYTE 02 02c2 PPLOOP 02 f90f PREBYTE 02 02bf PROG 02 e8b9 + PSEUDO 02 f928 PURGE 02 ec99 PURGEIT 02 ed0e PUSHPUL 02 f902 + PUTBYTE 02 f80c PUTCHAR 02 0003 PUTCLOOP 02 e473 PUTCOMMA 02 f506 + PUTCR 02 000c PUTDOL 02 f502 PUTHASH 02 f4fe PUTLINE 02 0009 + PUTSPACE 02 f50a PUTWORD 02 f80f RAMSTART 00 0400 RAMTOP 00 8000 + READREC 02 ea82 REGINVAL 02 f395 REGLOOP 02 f515 REGS 02 e95d + REGTAB 02 e9b7 RESET 02 e400 RR1 02 eaa8 RR2 02 eaad + RSTVECS 02 ed31 SAVESP 02 02bd SAVEVECS 02 ed1e SB1 02 e783 + SBRANCH 02 f855SCAN2PARMS 02 e753 SCANACIDX 02 f978 SCANBYTE 02 e76b + SCANCHAR2 02 f72d SCANDEC 02 f731 SCANDLOOP 02 f73d SCANEND 02 f9cd + SCANEND2 02 f9e4 SCANEXIT 02 e729 SCANFACT 02 f717 SCANHEX 02 e730 + SCANIXREG 02 fad8 SCANLAB 02 f98e SCANOPS 02 f94b SCIDXLOOP 02 fae2 + SCLOOP 02 e738 SDEXIT 02 f75d SENDNAK 02 ecb0 SENDREC 02 eaf0 + SET3 02 faf6 SET3A 02 fb02 SETREG 02 e96b SETSORG 02 eae2 + SHORTIND1 02 fa9cSHORTINDEX 02 fa90 SHORTREL 02 fb6c SKIPSPACE 02 e708 + SMSG 02 e642 SOFFS 02 02b2 SOH 00 0001 SORG 02 02b0 + SP2 02 e76a SR1 02 e972 SR2 02 e97f SR3 02 e995 + SR4 02 e9a5 SRCH1 02 ebf8 SRCH2 02 ebfd SRCH3 02 ec17 + SRCHLOOP 02 ebe6 SREC 02 ea65 SRECERR 02 ead5 SS1 02 eb04 + SS2 02 eb11 SS3 02 eb3c STAKREGS 02 e55fSTARTBLOCK 02 ecb5 + STARTOP 02 f943 STARTSRCH 02 ebdd STEPBP 02 02ad SWI2VEC 02 0283 + SWI3VEC 02 0280 SWIVEC 02 028c TAB 00 0009 TEMP 02 0024 + TEMP2 02 0026 TEMP3 02 0028 TFREXG 02 f8d9 TIMER 02 002a + TIMERIRQ 02 e50b TRACE 02 e8c5 TRACELOOP 02 e8df TRACEONE 02 e8ce + TRACERET 02 e8ea TWOBYTE 02 f816 UNADISHEX 02 f6cc UNADISSPC 02 f6d9 + UNASM 02 f6a2 UNASMLOOP 02 f6b8 UNCERT 02 02cc UNK 02 e5d5 + UNKNOWN 02 e5ff UNLAUNCH 02 e56a UNLAUNCH1 02 e571 WAITACK 02 ec43 + WAITACK2 02 ec6d WAITNAK 02 ec5b WELCOME 02 e5e2 XABORTIN 02 0018 + XABTIN 02 ed8c XABTLOOP 02 ed99 XAMSG 02 e686 XCLOSEIN 02 001b + XCLOSEOUT 02 001e XCLSDONE 02 edc2 XCLSEND 02 edce XCLSIN 02 edcf + XCLSLOOP 02 edba XCLSOUT 02 edac XCOUNT 02 0030 XEQ 02 eea7 + XERRHAND 02 ee4b XERROR 02 ee3b XERRVEC 02 0292 XGETC 02 ee12 + XGETC1 02 ee25 XGETCTERM 02 ee31 XLOAD 02 ee94 XLODLOOP 02 ee9b + XMCR 02 02bc XMODE 02 0031 XMODEM 02 ee52 XOPENIN 02 0012 + XOPENOUT 02 0015 XOPIN 02 ed44 XOPOUT 02 ed67 XOPTS 02 eeac + XPACKNUM 02 002d XPUTC 02 edd9 XPUTC1 02 edf5 XPUTCR 02 edf7 + XPUTCR1 02 ee04 XPUTCR2 02 ee0f XR1 02 ecd6 XRCVBUF 02 eca1 + XRCVEOT 02 ed13 XRLOOP 02 ece8 XRMSG 02 e671 XSABT 02 ec56 + XSBINLOOP 02 ee82 XSENDBUF 02 ec1b XSENDEOT 02 ec68 XSENDINIT 02 ec57 + XSLOOP 02 ec30 XSMSG 02 e65f XSOK 02 ec54 XSS 02 ee8d + XSUM 02 002e