Mercurial > hg > Members > kono > os9 > sbc09
view doc/origin/monitor.tex @ 191:d0f5894e9b3a default tip
some how load: confilicts in gmake
author | kono |
---|---|
date | Thu, 07 Dec 2023 09:37:15 +0900 |
parents | 2088fd998865 |
children |
line wrap: on
line source
\documentstyle[a4wide]{report} \title{A macine language monitor for the 6809 Processor} \author{L.C. Benschop} \begin{document} \maketitle \tableofcontents \chapter{Introduction} The program {\tt monitor.asm} is a program that is intended to be included in the ROM of a 6809 based single board computer. The program allows a user to communicate with the single board computer through a serial port. It allows a user to enter machine code, examine memory and registers, to set breakpoints, to trace a program and more. Furthermore, data can be sent to and be received from the single board computer through the X-MODEM protocol. \section{A bit of history.} In the seventies you could buy single board microcomputers that had a hexadecimal keypad and 7-segment displays. These computers typically had less than 1 kilobyte of RAM and a simple monitor program in ROM. An interface to a cassette recorder (or paper tape reader/writer) and a terminal was possible, but not standard. The typical way to program the machine was entering hexadecimal machine codes on the keypad. Machine code was the only language in which you could program them, especially if you only had a hexadecimal keypad and 7-segment led displays. You typically used these machines to experiment with hardware interfacing, as games and calculations were a bit limited with only six 7-sengment digits. Next came simple home computers, like the TRS80, the Apple ][ and the Commodore PET. These machines had BASIC in ROM and they used a simple cassette recorder to store data. These computers had a TV or a low quality monitor as display and a QWERTY keyboard. These machines could be upgraded with a floppy disk drive and a printer and then they could be used for professional work. These machines had 4 to 64 kilobyts of memory. Apart from assembly language you could use BASIC, Forth and sometimes Pascal to program these machines. Most useful programs (and the best games) were programmed in assembly language. Many of these machines had BASIC in ROM and no machine code monitor. You had to load that separately. Today we have personal computers that run DOS, Windows, Unix or something else. New computers have 4 to 16 megabytes of RAM and hard disks of more than 500 Megabytes. Apart from having in the order of 1000 times more storage, they are also 1000 times faster than the old 8-bit home computers. Programming? You can use Visual BASIC, C++ and about every other programming language on the planet. But programs have become bigger and bigger. Programming is not the same as it was before. I guess there is some demand for small 8-bit computer systems that are simple to build, easy to interface to all kinds of hobby projects, fun to program and small enough to integrate into a home-built project. Do we want to use hexadecimal keyboards and 7-segment displays? I guess not many people want to use them. Do we want to use a cassette recorder for data storage and a TV as a display? Not me. And if you build your own 8-bit microprocessor, do you want to waste your time and money on a hexadecimal keypad or a cassette interface that you do not like to use and that you do not need anyway? PCs of five years ago are more than adequate to run an editor, a terminal program and a cross assembler for your favourite 8-bit processor. If you equip an 8-bit system with some static CMOS RAM, a serial interface and a monitor in ROM, you can use the keyboard, hard disk and monitor of your PC for program development and the 8-bit micro can be disconnected from the PC and do its task, once it is programmed. Cross development is nothing special. How do you think the microprocessor in you microwave was programmed? But it is not practical for a hobbyist to program an EPROM for each program change. Professional developers of embedded processors have expensive tools, like ROM emulators, processor emulators etc. to see what the processor is doing on its way to the next crash. For a hobbyist it is much more practival to have a slightly more expensive embedded computer that you can run an interactive debugger on. And you are not even limited to assembly language. If you have 32k ROM you can have both the monitor program and a BASIC interpreter and some aplication code in ROM. Nothing prevents you from having Forth as well. \chapter{Hardware that the program is supposed to run on} \chapter{Use of the monitor commands} \item{Usage of the memory} \chapter{Operating System Facilities} \begin{description} \item[getchar] address \$00. \item[putchar] address \$03. \item[getline] address \$06. \item[putline] address \$09. \item[putcr] address \$0C. \item[getpoll] address \$0F. \item[xopenin] address \$12. \item[xopenout] address \$15. \item[xabortin] address \$18. \item[xclosein] address \$1B. \item[xcloseout] address \$1E. \item[delay] address \$21. \end{description} \end{description} \chapter{Extending the built-in Assembler} \appendix \chapter{Assembly listing of monitor program} {\footnotesize \begin{verbatim} 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: * 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. 0032: 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: 02A1: 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: 02CF: ramstart equ $400 ;first free RAM address. 02CF: 02CF: ramtop equ $8000 ;top of RAM. 02CF: 02CF: * I/O port addresses 02CF: aciactl equ $e000 ;Control port of ACIA 02CF: aciasta equ $e000 ;Status port of ACIA 02CF: aciadat equ $e001 ;Data port of ACIA 02CF: 02CF: * ASCII control characters. 02CF: SOH equ 1 02CF: EOT equ 4 02CF: ACK equ 6 02CF: BS equ 8 02CF: LF equ 10 02CF: CR equ 13 02CF: NAK equ 21 02CF: CAN equ 24 02CF: DEL equ 127 02CF: 02CF: 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: 8EE4FF ldx #intvectbl E40C: CE0280 ldu #swi3vec E40F: C61B ldb #osvectbl-intvectbl E411: 8D37 bsr blockmove ;Initialize interrupt vectors from ROM. E413: 8EE51A 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: 8EE5C1 ldx #welcome E442: BDE4E1 jsr outcount E445: 9D0C jsr putcr ;Print a welcome message. E447: 7EE558 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: 2704 beq newline E4A9: C10A cmpb #LF E4AB: 2607 bne osgetl3 ;CR or LF character ends line. E4AD: 9D0C newline jsr putcr E4AF: 1F89 tfr a,b ;Move length to B E4B1: 3512 puls a,x ;restore registers. E4B3: 39 rts ;<--- Here is the exit point. E4B4: C120 osgetl3 cmpb #' ' E4B6: 25CD blo osgetl1 ;Ignore control characters. E4B8: 9124 cmpa temp E4BA: 27C9 beq osgetl1 ;Ignore char if line full. E4BC: 9D03 jsr putchar ;Echo the character. E4BE: E780 stb ,x+ ;Store it in memory. E4C0: 4C inca E4C1: 20C2 bra osgetl1 E4C3: E4C3: * O.S. routine to write a line starting at address X, B chars long. E4C3: 3416 osputl pshs a,b,x E4C5: 1F98 tfr b,a E4C7: 4D tsta E4C8: 2707 beq osputl1 E4CA: E680 osputl2 ldb ,x+ E4CC: 9D03 jsr putchar E4CE: 4A deca E4CF: 26F9 bne osputl2 E4D1: 3516 osputl1 puls a,b,x E4D3: 39 rts E4D4: E4D4: * O.S. routine to terminate a line. E4D4: 3404 oscr pshs b E4D6: C60D ldb #CR E4D8: 9D03 jsr putchar E4DA: C60A ldb #LF E4DC: 9D03 jsr putchar ;Send the CR and LF characters. E4DE: 3504 puls b E4E0: 39 rts E4E1: E4E1: * Output a counted string at addr X E4E1: 3414 outcount pshs x,b E4E3: E680 ldb ,x+ E4E5: 9D09 jsr putline E4E7: 3514 puls x,b E4E9: 39 rts E4EA: E4EA: 0C2C timerirq inc timer+2 E4EC: 2608 bne endirq E4EE: 0C2B inc timer+1 E4F0: 2604 bne endirq E4F2: 0C2A inc timer E4F4: 3B rti E4F5: 12 aciairq nop E4F6: 3B endirq rti E4F7: E4F7: * Wait D times 20ms. E4F7: D32B osdly addd timer+1 E4F9: 10932B dlyloop cmpd timer+1 E4FC: 26FB bne dlyloop E4FE: 39 rts E4FF: E4FF: * This table will be copied to the interrupt vector area in RAM. E4FF: 7EE4F6 intvectbl jmp endirq E502: 7EE4F6 jmp endirq E505: 7EE4EA jmp timerirq E508: 7EE4F5 jmp aciairq E50B: 7EE549 jmp unlaunch E50E: 7EE4F6 jmp endirq E511: 7EEDED jmp xerrhand E514: 7EF69B jmp expr E517: 7E0298 jmp asmerrvec E51A: * And this one to the I/O vector table. E51A: 7EE45A osvectbl jmp osgetc E51D: 7EE471 jmp osputc E520: 7EE480 jmp osgetl E523: 7EE4C3 jmp osputl E526: 7EE4D4 jmp oscr E529: 7EE465 jmp osgetpoll E52C: 7EECE6 jmp xopin E52F: 7EED09 jmp xopout E532: 7EED2E jmp xabtin E535: 7EED71 jmp xclsin E538: 7EED4E jmp xclsout E53B: 7EE4F7 jmp osdly E53E: endvecs equ * E53E: E53E: * The J command returns here. E53E: 3410 stakregs pshs x ;Stack something where the pc comes E540: 347F pshs ccr,b,a,dp,x,y,u ;Stack the normal registers. E542: BE029B ldx oldpc E545: AF6A stx 10,s ;Stack the old pc value. E547: 2007 bra unlaunch1 E549: * The G and P commands return here through a breakpoint. E549: * Registers are already stacked. E549: EC6A unlaunch ldd 10,s E54B: 830001 subd #1 E54E: ED6A std 10,s ;Decrement pc before breakpoint E550: 1C00 unlaunch1 andcc #$0 ;reenable the interrupts. E552: BDE970 jsr disarm ;Disarm the breakpoints. E555: BDE8C5 jsr dispregs E558: 9D1E cmdline jsr xcloseout E55A: 10FF02BD sts savesp E55E: 8E0200 ldx #linebuf E561: C680 ldb #buflen E563: 9D06 jsr getline E565: 5D tstb E566: 27F0 beq cmdline ;Ignore line if it is empty E568: 3A abx E569: 6F84 clr ,x ;Make location after line zero. E56B: 8E0200 ldx #linebuf E56E: E680 ldb ,x+ E570: C4DF andb #CASEMASK ;Make 1st char uppercase. E572: C041 subb #'A' E574: 253E bcs unk E576: C11A cmpb #26 E578: 243A bcc unk ;Unknown cmd if it is not a letter. E57A: 8EE580 ldx #cmdtab E57D: 58 aslb ;Index into command table. E57E: 6E95 jmp [b,x] E580: E580: FBA4E9A6E5B4E7 cmdtab fdb asm,break,unk,dump E588: E7BDEB56E86AE8 fdb enter,find,go,hex E590: E824E879E5B4E5 fdb inp,jump,unk,unk E598: EB19E5B4E5B4E8 fdb move,unk,unk,prog E5A0: E5B4E90CEA14E8 fdb unk,regs,srec,trace E5A8: F644E5B4E5B4ED fdb unasm,unk,unk,xmodem E5B0: E5B4E5B4 fdb unk,unk E5B4: E5B4: * Unknown command handling routine. E5B4: 9D18 unk jsr xabortin E5B6: 8EE5DE ldx #unknown E5B9: BDE4E1 jsr outcount E5BC: 9D0C jsr putcr E5BE: 7EE558 jmp cmdline E5C1: E5C1: E5C1: E5C1: * Here are some useful messages. E5C1: 1C welcome fcb unknown-welcome-1 E5C2: 57656C636F6D65 fcc "Welcome to BUGGY version 1.0" E5DE: 0F unknown fcb brkmsg-unknown-1 E5DF: 556E6B6E6F776E fcc "Unknown command" E5EE: 0E brkmsg fcb clrmsg-brkmsg-1 E5EF: 427265616B706F fcc "Breakpoint set" E5FD: 12 clrmsg fcb fullmsg-clrmsg-1 E5FE: 427265616B706F fcc "Breakpoint cleared" E610: 10 fullmsg fcb smsg-fullmsg-1 E611: 427265616B706F fcc "Breakpoints full" E621: 11 smsg fcb lastrec-smsg-1 E622: 4572726F722069 fcc "Error in S record" E633: 0A lastrec fcb xsmsg-lastrec-1 E634: 53393033303030 fcc "S9030000FC" E63E: 11 xsmsg fcb xrmsg-xsmsg-1 E63F: 53746172742058 fcc "Start XMODEM Send" E650: 14 xrmsg fcb xamsg-xrmsg-1 E651: 53746172742058 fcc "Start XMODEM Receive" E665: 17 xamsg fcb invmmsg-xamsg-1 E666: 584D4F44454D20 fcc "XMODEM transfer aborted" E67D: 10 invmmsg fcb exprmsg-invmmsg-1 E67E: 496E76616C6964 fcc "Invalid mnemonic" E68E: 10 exprmsg fcb modemsg-exprmsg-1 E68F: 45787072657373 fcc "Expression error" E69F: 15 modemsg fcb brmsg-modemsg-1 E6A0: 41646472657373 fcc "Addressing mode error" E6B5: 0F brmsg fcb endmsg-brmsg-1 E6B6: 4272616E636820 fcc "Branch too long" E6C5: endmsg equ * E6C5: E6C5: * Output hex digit contained in A E6C5: 8B90 hexdigit adda #$90 E6C7: 19 daa E6C8: 8940 adca #$40 E6CA: 19 daa ;It's the standard conversion trick ascii E6CB: 1F89 tfr a,b ;to hex without branching. E6CD: 9D03 jsr putchar E6CF: 39 rts E6D0: E6D0: * Output contents of A as two hex digits E6D0: 3402 outbyte pshs a E6D2: 44 lsra E6D3: 44 lsra E6D4: 44 lsra E6D5: 44 lsra E6D6: 8DED bsr hexdigit E6D8: 3502 puls a E6DA: 840F anda #$0f E6DC: 20E7 bra hexdigit E6DE: E6DE: * Output contents of d as four hex digits E6DE: 3404 outd pshs b E6E0: 8DEE bsr outbyte E6E2: 3502 puls a E6E4: 8DEA bsr outbyte E6E6: 39 rts E6E7: E6E7: * Skip X past spaces, B is first non-space character. E6E7: E680 skipspace ldb ,x+ E6E9: C120 cmpb #' ' E6EB: 27FA beq skipspace E6ED: 39 rts E6EE: E6EE: * Convert ascii hex digit in B register to binary Z flag set if no hex digit. E6EE: C030 convb subb #'0' E6F0: 2513 blo convexit E6F2: C109 cmpb #9 E6F4: 230C bls cb2 E6F6: C4DF andb #CASEMASK ;Make uppercase. E6F8: C007 subb #7 ;If higher than digit 9 it must be a letter. E6FA: C109 cmpb #9 E6FC: 2307 bls convexit E6FE: C10F cmpb #15 E700: 2203 bhi convexit E702: 1CFB cb2 andcc #$FB ;clear zero E704: 39 rts E705: 1A04 convexit orcc #$04 E707: 39 rts E708: E708: DC24 scanexit ldd temp E70A: 301F leax -1,x E70C: 0D26 tst temp2 E70E: 39 rts <-- exit point of scanhex E70F: E70F: * Scan for hexadecimal number at address X return in D, Z flag is set it no E70F: * number found. E70F: 0F24 scanhex clr temp E711: 0F25 clr temp+1 E713: 0F26 clr temp2 E715: 8DD0 bsr skipspace E717: BDE6EE scloop jsr convb E71A: 27EC beq scanexit E71C: 3404 pshs b E71E: DC24 ldd temp E720: 58 aslb E721: 49 rola E722: 58 aslb E723: 49 rola E724: 58 aslb E725: 49 rola E726: 58 aslb E727: 49 rola E728: EBE0 addb ,s+ E72A: DD24 std temp E72C: 0C26 inc temp2 E72E: E680 ldb ,x+ E730: 20E5 bra scloop E732: E732: FD029F scan2parms std length E735: 8DD8 bsr scanhex E737: 2710 beq sp2 E739: FD029D std addr E73C: 8DA9 bsr skipspace E73E: C12C cmpb #',' E740: 2607 bne sp2 E742: 8DCB bsr scanhex E744: 2703 beq sp2 E746: FD029F std length E749: 39 sp2 rts E74A: E74A: * Scan two hexdigits at in and convert to byte into A, Z flag if error. E74A: 8D9B scanbyte bsr skipspace E74C: 8DA0 bsr convb E74E: 2712 beq sb1 E750: 1F98 tfr b,a E752: E680 ldb ,x+ E754: 8D98 bsr convb E756: 270A beq sb1 E758: 48 asla E759: 48 asla E75A: 48 asla E75B: 48 asla E75C: D724 stb temp E75E: 9B24 adda temp E760: 1CFB andcc #$fb ;Clear zero flag E762: 39 sb1 rts E763: E763: E763: * This is the code for the D command, hex/ascii dump of memory E763: * Syntax: D or D<addr> or D<addr>,<length> E763: 8E0201 dump ldx #linebuf+1 E766: CC0040 ldd #$40 E769: BDE732 jsr scan2parms ;Scan address and length, default length=64 E76C: 10BE029D ldy addr E770: 8610 dh1 lda #16 E772: 9725 sta temp+1 E774: 1F20 tfr y,d E776: BDE6DE jsr outd E779: C620 ldb #' ' E77B: 9D03 jsr putchar E77D: A6A0 dh2 lda ,y+ ;display row of 16 mem locations as hex E77F: BDE6D0 jsr outbyte E782: C620 ldb #' ' E784: 9625 lda temp+1 E786: 8109 cmpa #9 E788: 2602 bne dh6 E78A: C62D ldb #'-' ;Do a - after the eighth byte. E78C: 9D03 dh6 jsr putchar E78E: 0A25 dec temp+1 E790: 26EB bne dh2 E792: 3130 leay -16,y ;And now for the ascii dump. E794: 8610 lda #16 E796: E6A0 dh3 ldb ,y+ E798: C120 cmpb #' ' E79A: 2402 bhs dh4 E79C: C62E ldb #'.' E79E: C17F dh4 cmpb #DEL E7A0: 2502 blo dh5 E7A2: C62E ldb #'.' ;Convert all nonprintables to . E7A4: 9D03 dh5 jsr putchar E7A6: 4A deca E7A7: 26ED bne dh3 E7A9: 9D0C jsr putcr E7AB: FC029F ldd length E7AE: 830010 subd #16 E7B1: FD029F std length E7B4: 22BA bhi dh1 E7B6: 10BF029D sty addr E7BA: 7EE558 jmp cmdline E7BD: E7BD: * This is the code for the E command, enter hex bytes or ascii string. E7BD: * Syntax E or E<addr> or E<addr> <bytes> or E<addr>"string" E7BD: 8E0201 enter ldx #linebuf+1 E7C0: BDE70F jsr scanhex E7C3: 2703 beq ent1 E7C5: FD029D std addr E7C8: 8D26 ent1 bsr entline E7CA: 1026FD8A lbne cmdline ;No bytes, then enter interactively. E7CE: C645 ent2 ldb #'E' E7D0: 9D03 jsr putchar E7D2: FC029D ldd addr E7D5: BDE6DE jsr outd E7D8: C620 ldb #' ' E7DA: 9D03 jsr putchar ;Display Eaddr + space E7DC: 8E0200 ldx #linebuf E7DF: C680 ldb #buflen E7E1: 9D06 jsr getline ;Get the line. E7E3: 3A abx E7E4: 6F84 clr ,x E7E6: 8E0200 ldx #linebuf E7E9: 8D05 bsr entline E7EB: 26E1 bne ent2 E7ED: 7EE558 jmp cmdline E7F0: E7F0: * Enter a line of hex bytes or ascci string at address X, Z if empty. E7F0: BDE6E7 entline jsr skipspace E7F3: 5D tstb E7F4: 272B beq entexit E7F6: C122 cmpb #'"' E7F8: 270F beq entasc E7FA: 301F leax -1,x E7FC: 10BE029D ldy addr E800: BDE74A entl2 jsr scanbyte ;Enter hex digits. E803: 2715 beq entdone E805: A7A0 sta ,y+ E807: 20F7 bra entl2 E809: 10BE029D entasc ldy addr E80D: A680 entl3 lda ,x+ E80F: 4D tsta E810: 2708 beq entdone E812: 8122 cmpa #'"' E814: 2704 beq entdone E816: A7A0 sta ,y+ E818: 20F3 bra entl3 E81A: 10BF029D entdone sty addr E81E: 1CFB andcc #$fb E820: 39 rts E821: 1A04 entexit orcc #$04 E823: 39 rts E824: E824: *This is the code for the I command, display the contents of an address E824: * Syntax: Iaddr E824: 8E0201 inp ldx #linebuf+1 E827: BDE70F jsr scanhex E82A: 1F01 tfr d,x E82C: A684 lda ,x ;Read the byte from memory. E82E: BDE6D0 jsr outbyte ;Display itin hex. E831: 9D0C jsr putcr E833: 7EE558 jmp cmdline E836: E836: *This is the code for the H command, display result of simple hex expression E836: *Syntax Hhexnum{+|-hexnum} E836: 8E0201 hex ldx #linebuf+1 E839: BDE70F jsr scanhex E83C: DD28 std temp3 E83E: BDE6E7 hexloop jsr skipspace E841: C12B cmpb #'+' E843: 2609 bne hex1 E845: BDE70F jsr scanhex E848: D328 addd temp3 E84A: DD28 std temp3 E84C: 20F0 bra hexloop E84E: C12D hex1 cmpb #'-' E850: 260E bne hexend E852: BDE70F jsr scanhex E855: 53 comb E856: 43 coma E857: C30001 addd #1 E85A: D328 addd temp3 E85C: DD28 std temp3 E85E: 20DE bra hexloop E860: DC28 hexend ldd temp3 E862: BDE6DE jsr outd E865: 9D0C jsr putcr E867: 7EE558 jmp cmdline E86A: E86A: * This is the code for the G command, jump to the program E86A: * Syntax G or G<addr> E86A: 8E0201 go ldx #linebuf+1 E86D: BDE70F jsr scanhex E870: 2702 beq launch E872: ED6A std 10,s ;Store parameter in pc location. E874: BDE98A launch jsr arm ;Arm the breakpoints. E877: 35FF puls ccr,b,a,dp,x,y,u,pc E879: E879: * This is the code for the J command, run a subroutine. E879: * Syntax J<addr> E879: 8E0201 jump ldx #linebuf+1 E87C: EC6A ldd 10,s E87E: FD029B std oldpc ;Save old pc E881: BDE70F jsr scanhex E884: ED6A std 10,s ;Store parameter in PC location E886: 1F41 tfr s,x E888: 327E leas -2,s E88A: 1F43 tfr s,u E88C: C60C ldb #12 ;Move the saved register set 2 addresses E88E: BDE44A jsr blockmove ;down on the stack. E891: CCE53E ldd #stakregs E894: ED6C std 12,s ;Prepare subroutine return address. E896: 20DC bra launch ;Jump to the routine. E898: E898: E898: * This is the code for the P command, run instruction followed by breakpoint E898: * Syntax P E898: 10AE6A prog ldy 10,s ;Get program counter value. E89B: BDF36B jsr disdecode ;Find out location past current insn. E89E: 10BF02AD sty stepbp E8A2: 20D0 bra launch E8A4: E8A4: * This is the code for the T command, single step trace an instruction. E8A4: * Syntax T E8A4: 7EE558 trace jmp cmdline E8A7: E8A7: * Display the contents of 8 bit register, name in B, contents in A E8A7: 9D03 disp8 jsr putchar E8A9: C63D ldb #'=' E8AB: 9D03 jsr putchar E8AD: BDE6D0 jsr outbyte E8B0: C620 ldb #' ' E8B2: 9D03 jsr putchar E8B4: 39 rts E8B5: E8B5: * Display the contents of 16 bit register, name in B, contents in Y E8B5: 9D03 disp16 jsr putchar E8B7: C63D ldb #'=' E8B9: 9D03 jsr putchar E8BB: 1F20 tfr y,d E8BD: BDE6DE jsr outd E8C0: C620 ldb #' ' E8C2: 9D03 jsr putchar E8C4: 39 rts E8C5: E8C5: * Display the contents of the registers and disassemble instruction at E8C5: * PC location. E8C5: C658 dispregs ldb #'X' E8C7: 10AE66 ldy 6,s ;Note that there's one return address on E8CA: 8DE9 bsr disp16 ;stack so saved register offsets are E8CC: C659 ldb #'Y' ;inremented by 2. E8CE: 10AE68 ldy 8,s E8D1: 8DE2 bsr disp16 E8D3: C655 ldb #'U' E8D5: 10AE6A ldy 10,s E8D8: 8DDB bsr disp16 E8DA: C653 ldb #'S' E8DC: 1F42 tfr s,y E8DE: 312E leay 14,y ;S of the running program is 12 higher, E8E0: ;because regs are not stacked when running. E8E0: 8DD3 bsr disp16 E8E2: C641 ldb #'A' E8E4: A663 lda 3,s E8E6: 8DBF bsr disp8 E8E8: C642 ldb #'B' E8EA: A664 lda 4,s E8EC: 8DB9 bsr disp8 E8EE: C644 ldb #'D' E8F0: A665 lda 5,s E8F2: 8DB3 bsr disp8 E8F4: C643 ldb #'C' E8F6: A662 lda 2,s E8F8: 8DAD bsr disp8 E8FA: 9D0C jsr putcr E8FC: C650 ldb #'P' E8FE: 10AE6C ldy 12,s E901: 8DB2 bsr disp16 E903: BDF36B jsr disdecode E906: BDF44E jsr disdisp ;Disassemble instruction at PC E909: 9D0C jsr putcr E90B: 39 rts E90C: E90C: E90C: * This is the code for the R command, display or alter the registers. E90C: * Syntax R or R<letter><hex> E90C: 8E0201 regs ldx #linebuf+1 E90F: BDE6E7 jsr skipspace E912: 5D tstb E913: 2605 bne setreg E915: 8DAE bsr dispregs ;Display regs ifnothing follows. E917: 7EE558 jmp cmdline E91A: 108EE966 setreg ldy #regtab E91E: 4F clra E91F: C4DF andb #CASEMASK ;Make letter uppercase. E921: 6DA4 sr1 tst ,y E923: 1027FC8D lbeq unk ;At end of register tab, unknown reg E927: E1A0 cmpb ,y+ E929: 2703 beq sr2 ;Found the register? E92B: 4C inca E92C: 20F3 bra sr1 E92E: 3402 sr2 pshs a E930: BDE70F jsr scanhex ;Convert the hex argument. E933: 3406 pshs d E935: A662 lda 2,s ;Get register number. E937: 8104 cmpa #4 E939: 2409 bcc sr3 E93B: E661 ldb 1,s ;It's 8 bit. E93D: 3263 leas 3,s ;Remove temp stuff from stack. E93F: E7E6 stb a,s ;Store it in the reg on stack. E941: 7EE558 jmp cmdline E944: 8108 sr3 cmpa #8 E946: 240C bcc sr4 E948: 3510 puls x ;It's 16 bit. E94A: 3261 leas 1,s E94C: 48 lsla E94D: 8004 suba #4 ;Convert reg no to stack offset. E94F: AFE6 stx a,s E951: 7EE558 jmp cmdline E954: 3540 sr4 puls u ;It's the stack pointer. E956: 3261 leas 1,s E958: 3354 leau -12,u E95A: 1F41 tfr s,x E95C: 1F34 tfr u,s ;Set new stack pointer. E95E: C60C ldb #12 E960: BDE44A jsr blockmove ;Move register set to new stack location. E963: 7EE558 jmp cmdline E966: E966: 43414244585955 regtab FCC "CABDXYUPS " E970: E970: * Disarm the breakpoints, this is replace the SWI instructions with the E970: * original byte. E970: 8E02A1 disarm ldx #bpaddr E973: 8605 lda #brkpoints+1 E975: EE81 disarm1 ldu ,x++ E977: E680 ldb ,x+ ;Get address in u, byte in b E979: 11830000 cmpu #0 E97D: 2702 beq disarm2 E97F: E7C4 stb ,u E981: 4A disarm2 deca E982: 26F1 bne disarm1 E984: CE0000 ldu #0 E987: EF1D stu -3,x ;Clear the step breakpoint. E989: 39 rts E98A: E98A: * Arm the breakponts, this is replace the byte at the breakpoint address E98A: * with an SWI instruction. E98A: 8E02AD arm ldx #bpaddr+brkpoints*3 E98D: 8605 lda #brkpoints+1 ;Arm them in reverse order of disarming. E98F: EE84 arm1 ldu ,x ;Get address in u. E991: 270D beq arm2 E993: E6C4 ldb ,u E995: E702 stb 2,x E997: 11A36C cmpu 12,s ;Compare to program counter location E99A: 2704 beq arm2 E99C: C63F ldb #$3F E99E: E7C4 stb ,u ;Store SWI instruction if not equal. E9A0: 301D arm2 leax -3,x E9A2: 4A deca E9A3: 26EA bne arm1 E9A5: 39 rts E9A6: E9A6: * This is the code for the break command, set, clear display breakpoints. E9A6: * Syntax B or B<addr>. B displays, B<addr> sets or clears breakpoint. E9A6: 8604 break lda #brkpoints E9A8: 9727 sta temp2+1 ;Store number of breakpoints to visit. E9AA: 8E0201 ldx #linebuf+1 E9AD: BDE70F jsr scanhex E9B0: 273B beq dispbp ;No number then display breakpoints E9B2: 8E02A1 ldx #bpaddr E9B5: CE0000 ldu #0 E9B8: 1F32 tfr u,y E9BA: 10A384 bp1 cmpd ,x E9BD: 2720 beq clearit ;Found the breakpoint, so clear it, E9BF: 11A384 cmpu ,x ;Is location zero E9C2: 2602 bne bp2 E9C4: 1F12 tfr x,y ;Set free address to y E9C6: 3003 bp2 leax 3,x E9C8: 0A27 dec temp2+1 E9CA: 26EE bne bp1 E9CC: 108C0000 cmpy #0 ;Address not found in list of breakpoints E9D0: 2716 beq bpfull ;Was free address found. E9D2: EDA4 std ,y ;If so, store breakpoint there. E9D4: 8EE5EE ldx #brkmsg E9D7: BDE4E1 bpexit jsr outcount E9DA: 9D0C jsr putcr E9DC: 7EE558 jmp cmdline E9DF: 4F clearit clra E9E0: 5F clrb E9E1: ED84 std ,x E9E3: 8EE5FD ldx #clrmsg E9E6: 20EF bra bpexit E9E8: 8EE610 bpfull ldx #fullmsg E9EB: 20EA bra bpexit E9ED: E9ED: 8E02A1 dispbp ldx #bpaddr E9F0: EC84 dbp1 ldd ,x E9F2: 2707 beq dbp2 E9F4: BDE6DE jsr outd E9F7: C620 ldb #' ' E9F9: 9D03 jsr putchar E9FB: 3003 dbp2 leax 3,x E9FD: 0A27 dec temp2+1 E9FF: 26EF bne dbp1 EA01: 9D0C jsr putcr EA03: 7EE558 jmp cmdline EA06: EA06: * Scan hex byte into a and add it to check sum in temp2+1 EA06: BDE74A addchk jsr scanbyte EA09: 10270077 lbeq srecerr EA0D: 1F89 tfr a,b EA0F: DB27 addb temp2+1 EA11: D727 stb temp2+1 EA13: 39 rts EA14: EA14: * This tis the code for the S command, the Motorola S records entry. EA14: * Syntax SO<addr> or SS<addr>,<len> or S1<bytes> or S9<bytes> EA14: 8E0201 srec ldx #linebuf+1 EA17: E680 ldb ,x+ EA19: C4DF andb #CASEMASK EA1B: C14F cmpb #'O' EA1D: 2772 beq setsorg EA1F: C153 cmpb #'S' EA21: 277C beq sendrec EA23: E61F ldb -1,x EA25: 0F28 clr temp3 EA27: C131 cmpb #'1' EA29: 2706 beq readrec EA2B: C139 cmpb #'9' EA2D: 2655 bne srecerr EA2F: 0C28 inc temp3 EA31: 0F27 readrec clr temp2+1 ;clear checksum. EA33: 8DD1 bsr addchk EA35: 8002 suba #2 ;discount the address bytes from the count. EA37: 9729 sta temp3+1 ;Read length byte. EA39: 8DCB bsr addchk EA3B: 3402 pshs a EA3D: 8DC7 bsr addchk EA3F: 3504 puls b EA41: 1E89 exg a,b ;Read address into d. EA43: FE02B0 ldu sorg EA46: 270F beq rr1 EA48: FE02B2 ldu soffs EA4B: 260A bne rr1 EA4D: 3406 pshs d ;Sorg is nonzero and soffs is zero, now EA4F: B302B0 subd sorg ;set soffs EA52: FD02B2 std soffs EA55: 3506 puls d EA57: B302B2 rr1 subd soffs ;Subtract the address offset. EA5A: 1F02 tfr d,y EA5C: 8DA8 rr2 bsr addchk EA5E: 0A29 dec temp3+1 EA60: 2704 beq endrec EA62: A7A0 sta ,y+ EA64: 20F6 bra rr2 EA66: 0C27 endrec inc temp2+1 ;Check checksum. EA68: 261A bne srecerr EA6A: 0D28 tst temp3 EA6C: 1027FAE8 lbeq cmdline ;Was it no S9 record? EA70: 108C0000 cmpy #0 EA74: 2703 beq endrec1 EA76: 10AF6A sty 10,s ;Store address into program counter. EA79: 4F endrec1 clra EA7A: 5F clrb EA7B: FD02B0 std sorg ;Reset sorg, next S loads will be normal. EA7E: FD02B2 std soffs EA81: 7EE558 jmp cmdline EA84: 9D18 srecerr jsr xabortin EA86: 8EE621 ldx #smsg ;Error in srecord, display message. EA89: BDE4E1 jsr outcount EA8C: 9D0C jsr putcr EA8E: 7EE558 jmp cmdline EA91: BDE70F setsorg jsr scanhex ;Set S record origin. EA94: FD02B0 std sorg EA97: 4F clra EA98: 5F clrb EA99: FD02B2 std soffs EA9C: 7EE558 jmp cmdline EA9F: * Send a memory region as S-records. EA9F: CC0100 sendrec ldd #$100 ;Scan address and length parameter. EAA2: BDE732 jsr scan2parms EAA5: FC02B0 ldd sorg EAA8: 2709 beq ss1 EAAA: FC029D ldd addr EAAD: B302B0 subd sorg EAB0: FD02B2 std soffs ;Compute offset for origin. EAB3: FC029F ss1 ldd length EAB6: 2748 beq endss ;All bytes sent? EAB8: 10830010 cmpd #16 EABC: 2502 blo ss2 EABE: C610 ldb #16 ;If more than 16 left, then send 16. EAC0: D724 ss2 stb temp EAC2: 50 negb EAC3: FE029F ldu length EAC6: 33C5 leau b,u EAC8: FF029F stu length ;Discount line length from length. EACB: C653 ldb #'S' EACD: 9D03 jsr putchar EACF: C631 ldb #'1' EAD1: 9D03 jsr putchar EAD3: 0F25 clr temp+1 ;Clear check sum EAD5: D624 ldb temp EAD7: CB03 addb #3 EAD9: 8D30 bsr checkout ;Output byte b as hex and add to check sum. EADB: FC029D ldd addr EADE: 1F02 tfr d,y EAE0: B302B2 subd soffs EAE3: 1E89 exg a,b EAE5: 8D24 bsr checkout EAE7: 1E89 exg a,b EAE9: 8D20 bsr checkout ;Output address (add into check sum) EAEB: E6A0 ss3 ldb ,y+ EAED: 8D1C bsr checkout EAEF: 0A24 dec temp EAF1: 26F8 bne ss3 EAF3: 10BF029D sty addr EAF7: D625 ldb temp+1 EAF9: 53 comb EAFA: 8D0F bsr checkout ;Output checksum byte. EAFC: 9D0C jsr putcr EAFE: 20B3 bra ss1 EB00: 8EE633 endss ldx #lastrec EB03: BDE4E1 jsr outcount EB06: 9D0C jsr putcr EB08: 7EE558 jmp cmdline EB0B: * Output byte in register B and add it into check sum at temp+1 EB0B: 3402 checkout pshs a EB0D: 1F98 tfr b,a EB0F: DB25 addb temp+1 EB11: D725 stb temp+1 EB13: BDE6D0 jsr outbyte EB16: 3502 puls a EB18: 39 rts EB19: EB19: * This is the code for the M command, move memory region. EB19: * Syntax: Maddr1,addr2,length EB19: 8E0201 move ldx #linebuf+1 EB1C: BDE70F jsr scanhex EB1F: 1027FA91 lbeq unk EB23: DD28 std temp3 EB25: BDE6E7 jsr skipspace EB28: C12C cmpb #',' EB2A: 1026FA86 lbne unk EB2E: BDE70F jsr scanhex EB31: 1027FA7F lbeq unk EB35: 1F03 tfr d,u EB37: BDE6E7 jsr skipspace EB3A: C12C cmpb #',' EB3C: 1026FA74 lbne unk EB40: BDE70F jsr scanhex EB43: 1027FA6D lbeq unk EB47: 1F02 tfr d,y ;Read the argument separated by commas EB49: 9E28 ldx temp3 ;src addr to x, dest addr to u, length to y EB4B: ;Don't tolerate syntax deviations. EB4B: A680 mvloop lda ,x+ EB4D: A7C0 sta ,u+ EB4F: 313F leay -1,y EB51: 26F8 bne mvloop ;Perform the block move. EB53: 7EE558 jmp cmdline EB56: EB56: EB56: * This is the code for the F command, find byte/ascii string in memory. EB56: * Syntax: Faddr bytes or Faddr "ascii" EB56: 8E0201 find ldx #linebuf+1 EB59: BDE70F jsr scanhex EB5C: 1F02 tfr d,y ;Scan the start address. EB5E: BDE6E7 jsr skipspace EB61: C122 cmpb #'"' EB63: 2611 bne findhex EB65: CE0200 ldu #linebuf ;Quote found, so scan for quoted string. EB68: 4F clra EB69: E680 fstrloop ldb ,x+ EB6B: 271F beq startsrch ;End of line without final quote. EB6D: C122 cmpb #'"' EB6F: 271B beq startsrch ;End quote found EB71: E7C0 stb ,u+ EB73: 4C inca EB74: 20F3 bra fstrloop EB76: CE0200 findhex ldu #linebuf ;Convert string of hex bytes. EB79: 301F leax -1,x ;String will be stored at start of line EB7B: 4F clra ;buffer and may overwrite part of the EB7C: 3402 fhexloop pshs a ;already converted string. EB7E: BDE74A jsr scanbyte EB81: 1F89 tfr a,b EB83: 3502 puls a EB85: 2705 beq startsrch EB87: E7C0 stb ,u+ EB89: 4C inca EB8A: 20F0 bra fhexloop EB8C: 4D startsrch tsta ;Start searching, start addr in Y, EB8D: ;string starts at linebuf, length A EB8D: 1027F9C7 lbeq cmdline ;Quit with zero length string. EB91: 0F28 clr temp3 EB93: 9729 sta temp3+1 EB95: 1F21 srchloop tfr y,x EB97: 9629 lda temp3+1 EB99: 8CE100 cmpx #$e100 EB9C: 2409 bcc srch1 EB9E: 3086 leax a,x EBA0: 8CE000 cmpx #$e000 ;Stop at I/O addresses. EBA3: 1024F9B1 lbcc cmdline EBA7: 1F21 srch1 tfr y,x EBA9: CE0200 ldu #linebuf EBAC: E680 srch2 ldb ,x+ EBAE: E1C0 cmpb ,u+ EBB0: 2614 bne srch3 ;Not equal, try next address. EBB2: 4A deca EBB3: 26F7 bne srch2 EBB5: 1F20 tfr y,d EBB7: BDE6DE jsr outd ;String found EBBA: 9D0C jsr putcr EBBC: 0C28 inc temp3 EBBE: 9628 lda temp3 EBC0: 8110 cmpa #$10 EBC2: 1027F992 lbeq cmdline ;If 10 matches found, just stop. EBC6: 3121 srch3 leay 1,y EBC8: 20CB bra srchloop EBCA: EBCA: * Send the contents of the xmodem buffer and get it acknowledged, zero flag EBCA: * is set if transfer aborted. EBCA: C601 xsendbuf ldb #SOH EBCC: BDE471 jsr osputc ;Send SOH EBCF: D62D ldb xpacknum EBD1: BDE471 jsr osputc ;Send block number. EBD4: 53 comb EBD5: BDE471 jsr osputc ;and its complement. EBD8: 0F2E clr xsum EBDA: 8680 lda #128 EBDC: 8E0100 ldx #buf0 EBDF: E684 xsloop ldb ,x EBE1: DB2E addb xsum EBE3: D72E stb xsum EBE5: E680 ldb ,x+ EBE7: BDE471 jsr osputc EBEA: 4A deca EBEB: 26F2 bne xsloop ;Send the buffer contents. EBED: D62E ldb xsum EBEF: BDE471 jsr osputc ;Send the check sum EBF2: BDE45A waitack jsr osgetc EBF5: C118 cmpb #CAN EBF7: 270C beq xsabt ;^X for abort. EBF9: C115 cmpb #NAK EBFB: 27CD beq xsendbuf ;Send again if NAK EBFD: C106 cmpb #ACK EBFF: 26F1 bne waitack EC01: 0C2D inc xpacknum EC03: 1CFB xsok andcc #$fb ;Clear zero flag after ACK EC05: 39 xsabt rts EC06: EC06: * Start an XMODEM send session. EC06: C601 xsendinit ldb #1 EC08: D72D stb xpacknum ;Initialize block number. EC0A: BDE45A waitnak jsr osgetc EC0D: C118 cmpb #CAN EC0F: 27F4 beq xsabt ;If ^X exit with zero flag. EC11: C115 cmpb #NAK EC13: 27EE beq xsok EC15: 20F3 bra waitnak ;Wait until NAK received. EC17: EC17: * Send ETX and wait for ack. EC17: C604 xsendeot ldb #EOT EC19: BDE471 jsr osputc EC1C: BDE45A waitack2 jsr osgetc EC1F: C118 cmpb #CAN EC21: 27E2 beq xsabt EC23: C115 cmpb #NAK EC25: 27F0 beq xsendeot EC27: C106 cmpb #ACK EC29: 27D8 beq xsok EC2B: 20EF bra waitack2 EC2D: EC2D: * Read character into B with a timeout of A seconds, Carry set if timeout. EC2D: 48 gettimeout asla EC2E: 48 asla EC2F: BDE465 gt1 jsr osgetpoll EC32: 5D tstb EC33: 2606 bne gtexit EC35: 4A deca EC36: 26F7 bne gt1 EC38: 1A01 orcc #$1 EC3A: 39 rts EC3B: BDE45A gtexit jsr osgetc EC3E: 1CFE andcc #$fe EC40: 39 rts EC41: EC41: * Wait until line becomes quiet. EC41: 8603 purge lda #3 EC43: BDEC2D jsr gettimeout EC46: 24F9 bcc purge EC48: 39 rts EC49: EC49: * Receive an XMODEM block and wait till it is OK, Z set if etx. EC49: 8603 xrcvbuf lda #3 EC4B: 0D2F tst lastok EC4D: 2709 beq sendnak EC4F: C606 ldb #ACK EC51: BDE471 jsr osputc ;Send an ack. EC54: 860A lda #10 EC56: 2005 bra startblock EC58: C615 sendnak ldb #NAK EC5A: BDE471 jsr osputc ;Send a NAK EC5D: 0F2F startblock clr lastok EC5F: 8DCC bsr gettimeout EC61: 8603 lda #3 EC63: 25F3 bcs sendnak ;Keep sending NAKs when timed out. EC65: C104 cmpb #EOT EC67: 2752 beq xrcveot ;End of file reached, acknowledge EOT. EC69: C101 cmpb #SOH EC6B: 2649 bne purgeit ;Not, SOH, bad block. EC6D: 8601 lda #1 EC6F: 8DBC bsr gettimeout EC71: 2543 bcs purgeit EC73: D12D cmpb xpacknum ;Is it the right block? EC75: 2707 beq xr1 EC77: 5C incb EC78: D12D cmpb xpacknum ;Was it the previous block. EC7A: 263A bne purgeit EC7C: 0C2F inc lastok EC7E: D72E xr1 stb xsum EC80: 8601 lda #1 EC82: 8DA9 bsr gettimeout EC84: 2530 bcs purgeit EC86: 53 comb EC87: D12E cmpb xsum ;Is the complement of the block number OK EC89: 262B bne purgeit EC8B: 8E0100 ldx #buf0 EC8E: 0F2E clr xsum EC90: 8601 xrloop lda #1 EC92: 8D99 bsr gettimeout EC94: 2520 bcs purgeit EC96: E780 stb ,x+ EC98: DB2E addb xsum EC9A: D72E stb xsum EC9C: 8C0180 cmpx #buf0+128 EC9F: 26EF bne xrloop ;Get the data bytes. ECA1: 8601 lda #1 ECA3: 8D88 bsr gettimeout ECA5: 250F bcs purgeit ECA7: D12E cmpb xsum ECA9: 260B bne purgeit ;Check the check sum. ECAB: 0D2F tst lastok ECAD: 269A bne xrcvbuf ;Block was the previous block, get next one ECAF: 0C2F inc lastok ECB1: 0C2D inc xpacknum ECB3: 1CFB andcc #$fb ECB5: 39 rts ECB6: BDEC41 purgeit jsr purge ECB9: 209D bra sendnak ECBB: 8603 xrcveot lda #3 ;EOT was received. ECBD: C606 ldb #ACK ECBF: BDE471 ackloop jsr osputc ECC2: 4A deca ECC3: 26FA bne ackloop ;Send 3 acks in a row. ECC5: 39 rts ECC6: ECC6: ECC6: 9E01 savevecs ldx getchar+1 ECC8: BF02B4 stx oldgetc ECCB: 9E04 ldx putchar+1 ECCD: BF02B6 stx oldputc ECD0: 9E0D ldx putcr+1 ECD2: BF02B8 stx oldputcr ECD5: 39 rts ECD6: ECD6: BE02B4 rstvecs ldx oldgetc ECD9: 9F01 stx getchar+1 ECDB: BE02B6 ldx oldputc ECDE: 9F04 stx putchar+1 ECE0: BE02B8 ldx oldputcr ECE3: 9F0D stx putcr+1 ECE5: 39 rts ECE6: ECE6: * O.S. routine to open input through XMODEM transfer. ECE6: 3416 xopin pshs x,a,b ECE8: 8EE63E ldx #xsmsg ECEB: BDE4E1 jsr outcount ECEE: 9D0C jsr putcr ;Display message to start XMODEM send. ECF0: 8DD4 bsr savevecs ECF2: 8EF434 ldx #noop ECF5: 9F04 stx putchar+1 ;Disable character output. ECF7: 8EEDB4 ldx #xgetc ECFA: 9F01 stx getchar+1 ; ECFC: 0F2F clr lastok ECFE: 0F30 clr xcount ED00: 8601 lda #1 ED02: 972D sta xpacknum ED04: 4C inca ED05: 9731 sta xmode ;set xmode to 2. ED07: 3596 puls x,a,b,pc ED09: ED09: * O.S. routine to open output through XMODEM transfer. ED09: 3416 xopout pshs x,a,b ED0B: 8DB9 bsr savevecs ED0D: 8EE650 ldx #xrmsg ED10: BDE4E1 jsr outcount ;Display message to start XMODEM receive ED13: 9D0C jsr putcr ED15: 8EED7B ldx #xputc ED18: 9F04 stx putchar+1 ED1A: 8EED99 ldx #xputcr ED1D: 9F0D stx putcr+1 ED1F: BDEC06 jsr xsendinit ED22: 102700B7 lbeq xerror ED26: 0F30 clr xcount ED28: 8601 lda #1 ED2A: 9731 sta xmode ED2C: 3596 puls x,a,b,pc ED2E: ED2E: ED2E: * O.S. routine to abort input through XMODEM transfer. ED2E: 9631 xabtin lda xmode ED30: 8102 cmpa #2 ED32: 263C bne xclsend ED34: BDEC41 jsr purge ED37: C618 ldb #CAN ED39: 8608 lda #8 ED3B: BDE471 xabtloop jsr osputc ED3E: 4A deca ED3F: 26FA bne xabtloop ;Send 8 CAN characters to kill transfer. ED41: 8D93 bsr rstvecs ED43: 0F31 clr xmode ED45: 8EE665 ldx #xamsg ED48: BDE4E1 jsr outcount ED4B: 9D0C jsr putcr ;Send diagnostic message. ED4D: 39 rts ED4E: ED4E: * O.S. routine to close output through XMODEM transfer. ED4E: 9631 xclsout lda xmode ED50: 8101 cmpa #1 ED52: 261C bne xclsend ED54: 0D30 tst xcount ED56: 270C beq xclsdone ED58: 8680 lda #128 ED5A: 9030 suba xcount ED5C: F602BB xclsloop ldb filler ED5F: 8D1A bsr xputc ED61: 4A deca ED62: 26F8 bne xclsloop ;Transfer filler chars to force block out. ED64: BDEC17 xclsdone jsr xsendeot ;Send EOT ED67: 10270072 lbeq xerror ED6B: BDECD6 jsr rstvecs ED6E: 0F31 clr xmode ED70: 39 xclsend rts ED71: ED71: * O.S. routine to close input through XMODEM, by gobbling up the remaining ED71: * bytes. ED71: D631 xclsin ldb xmode ED73: C102 cmpb #2 ED75: 26F9 bne xclsend ED77: 9D03 jsr putchar ED79: 20F6 bra xclsin ED7B: ED7B: * putchar routine for XMODEM ED7B: 3416 xputc pshs x,a,b ED7D: 9630 lda xcount ED7F: 0C30 inc xcount ED81: 8E0100 ldx #buf0 ED84: E786 stb a,x ;Store character in XMODEM buffer. ED86: 817F cmpa #127 ED88: 260D bne xputc1 ;is buffer full? ED8A: 0F30 clr xcount ED8C: 3460 pshs y,u ED8E: BDEBCA jsr xsendbuf ED91: 10270048 lbeq xerror ED95: 3560 puls y,u ED97: 3596 xputc1 puls x,a,b,pc ED99: ED99: * putcr routine for XMODEM ED99: 3404 xputcr pshs b ED9B: F602BC ldb xmcr ED9E: C502 bitb #2 EDA0: 2704 beq xputcr1 EDA2: C60D ldb #CR EDA4: 8DD5 bsr xputc EDA6: F602BC xputcr1 ldb xmcr EDA9: C501 bitb #1 EDAB: 2704 beq xputcr2 EDAD: C60A ldb #LF EDAF: 8DCA bsr xputc EDB1: 3504 xputcr2 puls b EDB3: 39 rts EDB4: EDB4: * getchar routine for XMODEM EDB4: 3412 xgetc pshs x,a EDB6: 0D30 tst xcount ;No characters left? EDB8: 260D bne xgetc1 EDBA: 3460 pshs y,u EDBC: BDEC49 jsr xrcvbuf ;Receive new block. EDBF: 3560 puls y,u EDC1: 2710 beq xgetcterm ;End of input? EDC3: 8680 lda #128 EDC5: 9730 sta xcount EDC7: 9630 xgetc1 lda xcount EDC9: 40 nega EDCA: 8E0180 ldx #buf0+128 EDCD: E686 ldb a,x ;Get character from buffer EDCF: 0A30 dec xcount EDD1: 3592 puls x,a,pc EDD3: BDECD6 xgetcterm jsr rstvecs EDD6: 0F31 clr xmode EDD8: F602BB ldb filler EDDB: 3592 puls x,a,pc EDDD: EDDD: BDECD6 xerror jsr rstvecs ;Restore I/O vectors EDE0: 0F31 clr xmode EDE2: 8EE665 ldx #xamsg EDE5: BDE4E1 jsr outcount EDE8: 9D0C jsr putcr EDEA: 7E0292 jmp xerrvec EDED: EDED: 10FE02BD xerrhand lds savesp EDF1: 7EE558 jmp cmdline EDF4: EDF4: * This is the code for the X command, various XMODEM related commands. EDF4: * Syntax: XSaddr,len XLaddr,len XX XOcrlf,filler, XSSaddr,len EDF4: 8E0201 xmodem ldx #linebuf+1 EDF7: A680 lda ,x+ EDF9: 84DF anda #CASEMASK ;Convert to uppercase. EDFB: 8158 cmpa #'X' EDFD: 274A beq xeq EDFF: 814C cmpa #'L' EE01: 2733 beq xload EE03: 814F cmpa #'O' EE05: 2747 beq xopts EE07: 8153 cmpa #'S' EE09: 1026F7A7 lbne unk EE0D: A684 lda ,x EE0F: 84DF anda #CASEMASK EE11: 8153 cmpa #'S' EE13: 271A beq xss EE15: CC0100 ldd #$100 ;XSaddr,len command. EE18: BDE732 jsr scan2parms ;Send binary through XMODEM EE1B: 9D15 jsr xopenout EE1D: FE029D ldu addr EE20: 10BE029F ldy length EE24: E6C0 xsbinloop ldb ,u+ EE26: 9D03 jsr putchar EE28: 313F leay -1,y EE2A: 26F8 bne xsbinloop ;Send all the bytes through XMODEM. EE2C: 7EE558 jmp cmdline EE2F: 3001 xss leax 1,x ;XSSaddr,len command. EE31: 9D15 jsr xopenout ;Send Srecords through XMODEM EE33: 7EEA9F jmp sendrec EE36: BDE70F xload jsr scanhex ;XLaddr command EE39: 1F02 tfr d,y ;Load binary through XMODEM EE3B: 9D12 jsr xopenin EE3D: 9D00 xlodloop jsr getchar EE3F: 0D31 tst xmode ;File ended? then done EE41: 1027F713 lbeq cmdline EE45: E7A0 stb ,y+ EE47: 20F4 bra xlodloop EE49: 9D12 xeq jsr xopenin ;XX command EE4B: 7EE558 jmp cmdline ;Execute commands received from XMODEM EE4E: CC001A xopts ldd #$1a EE51: BDE732 jsr scan2parms EE54: B6029E lda addr+1 EE57: B702BC sta xmcr EE5A: B602A0 lda length+1 EE5D: B702BB sta filler EE60: 7EE558 jmp cmdline EE63: EE63: * mnemonics table, ordered alphabetically. EE63: * 5 bytes name, 1 byte category, 2 bytes opcode, 8 bytes total. EE63: 4142582020 mnemtab fcc "ABX " EE68: 00 fcb 0 EE69: 003A fdb $3a EE6B: 4144434120 fcc "ADCA " EE70: 07 fcb 7 EE71: 0089 fdb $89 EE73: 4144434220 fcc "ADCB " EE78: 07 fcb 7 EE79: 00C9 fdb $c9 EE7B: 4144444120 fcc "ADDA " EE80: 07 fcb 7 EE81: 008B fdb $8b EE83: 4144444220 fcc "ADDB " EE88: 07 fcb 7 EE89: 00CB fdb $cb EE8B: 4144444420 fcc "ADDD " EE90: 08 fcb 8 EE91: 00C3 fdb $c3 EE93: 414E444120 fcc "ANDA " EE98: 07 fcb 7 EE99: 0084 fdb $84 EE9B: 414E444220 fcc "ANDB " EEA0: 07 fcb 7 EEA1: 00C4 fdb $c4 EEA3: 414E444343 fcc "ANDCC" EEA8: 02 fcb 2 EEA9: 001C fdb $1c EEAB: 41534C2020 fcc "ASL " EEB0: 0A fcb 10 EEB1: 0008 fdb $08 EEB3: 41534C4120 fcc "ASLA " EEB8: 00 fcb 0 EEB9: 0048 fdb $48 EEBB: 41534C4220 fcc "ASLB " EEC0: 00 fcb 0 EEC1: 0058 fdb $58 EEC3: 4153522020 fcc "ASR " EEC8: 0A fcb 10 EEC9: 0007 fdb $07 EECB: 4153524120 fcc "ASRA " EED0: 00 fcb 0 EED1: 0047 fdb $47 EED3: 4153524220 fcc "ASRB " EED8: 00 fcb 0 EED9: 0057 fdb $57 EEDB: 4243432020 fcc "BCC " EEE0: 04 fcb 4 EEE1: 0024 fdb $24 EEE3: 4243532020 fcc "BCS " EEE8: 04 fcb 4 EEE9: 0025 fdb $25 EEEB: 4245512020 fcc "BEQ " EEF0: 04 fcb 4 EEF1: 0027 fdb $27 EEF3: 4247452020 fcc "BGE " EEF8: 04 fcb 4 EEF9: 002C fdb $2c EEFB: 4247542020 fcc "BGT " EF00: 04 fcb 4 EF01: 002E fdb $2e EF03: 4248492020 fcc "BHI " EF08: 04 fcb 4 EF09: 0022 fdb $22 EF0B: 4248532020 fcc "BHS " EF10: 04 fcb 4 EF11: 0024 fdb $24 EF13: 4249544120 fcc "BITA " EF18: 07 fcb 7 EF19: 0085 fdb $85 EF1B: 4249544220 fcc "BITB " EF20: 07 fcb 7 EF21: 00C5 fdb $c5 EF23: 424C452020 fcc "BLE " EF28: 04 fcb 4 EF29: 002F fdb $2f EF2B: 424C4F2020 fcc "BLO " EF30: 04 fcb 4 EF31: 0025 fdb $25 EF33: 424C532020 fcc "BLS " EF38: 04 fcb 4 EF39: 0023 fdb $23 EF3B: 424C542020 fcc "BLT " EF40: 04 fcb 4 EF41: 002D fdb $2d EF43: 424D492020 fcc "BMI " EF48: 04 fcb 4 EF49: 002B fdb $2b EF4B: 424E452020 fcc "BNE " EF50: 04 fcb 4 EF51: 0026 fdb $26 EF53: 42504C2020 fcc "BPL " EF58: 04 fcb 4 EF59: 002A fdb $2a EF5B: 4252412020 fcc "BRA " EF60: 04 fcb 4 EF61: 0020 fdb $20 EF63: 42524E2020 fcc "BRN " EF68: 04 fcb 4 EF69: 0021 fdb $21 EF6B: 4253522020 mnembsr fcc "BSR " EF70: 04 fcb 4 EF71: 008D fdb $8d EF73: 4256432020 fcc "BVC " EF78: 04 fcb 4 EF79: 0028 fdb $28 EF7B: 4256532020 fcc "BVS " EF80: 04 fcb 4 EF81: 0029 fdb $29 EF83: 434C522020 fcc "CLR " EF88: 0A fcb 10 EF89: 000F fdb $0f EF8B: 434C524120 fcc "CLRA " EF90: 00 fcb 0 EF91: 004F fdb $4f EF93: 434C524220 fcc "CLRB " EF98: 00 fcb 0 EF99: 005F fdb $5f EF9B: 434D504120 fcc "CMPA " EFA0: 07 fcb 7 EFA1: 0081 fdb $81 EFA3: 434D504220 fcc "CMPB " EFA8: 07 fcb 7 EFA9: 00C1 fdb $c1 EFAB: 434D504420 fcc "CMPD " EFB0: 09 fcb 9 EFB1: 1083 fdb $1083 EFB3: 434D505320 fcc "CMPS " EFB8: 09 fcb 9 EFB9: 118C fdb $118c EFBB: 434D505520 fcc "CMPU " EFC0: 09 fcb 9 EFC1: 1183 fdb $1183 EFC3: 434D505820 fcc "CMPX " EFC8: 08 fcb 8 EFC9: 008C fdb $8c EFCB: 434D505920 fcc "CMPY " EFD0: 09 fcb 9 EFD1: 108C fdb $108c EFD3: 434F4D2020 fcc "COM " EFD8: 0A fcb 10 EFD9: 0003 fdb $03 EFDB: 434F4D4120 fcc "COMA " EFE0: 00 fcb 0 EFE1: 0043 fdb $43 EFE3: 434F4D4220 fcc "COMB " EFE8: 00 fcb 0 EFE9: 0053 fdb $53 EFEB: 4357414920 fcc "CWAI " EFF0: 02 fcb 2 EFF1: 003C fdb $3c EFF3: 4441412020 fcc "DAA " EFF8: 00 fcb 0 EFF9: 0019 fdb $19 EFFB: 4445432020 fcc "DEC " F000: 0A fcb 10 F001: 000A fdb $0a F003: 4445434120 fcc "DECA " F008: 00 fcb 0 F009: 004A fdb $4a F00B: 4445434220 fcc "DECB " F010: 00 fcb 0 F011: 005A fdb $5a F013: 454F524120 fcc "EORA " F018: 07 fcb 7 F019: 0088 fdb $88 F01B: 454F524220 fcc "EORB " F020: 07 fcb 7 F021: 00C8 fdb $c8 F023: 4551552020 fcc "EQU " F028: 0D fcb 13 F029: 0005 fdb 5 F02B: 4558472020 fcc "EXG " F030: 0B fcb 11 F031: 001E fdb $1e F033: 4643422020 mnemfcb fcc "FCB " F038: 0D fcb 13 F039: 0007 fdb 7 F03B: 4643432020 fcc "FCC " F040: 0D fcb 13 F041: 0008 fdb 8 F043: 4644422020 fcc "FDB " F048: 0D fcb 13 F049: 0009 fdb 9 F04B: 494E432020 fcc "INC " F050: 0A fcb 10 F051: 000C fdb $0c F053: 494E434120 fcc "INCA " F058: 00 fcb 0 F059: 004C fdb $4c F05B: 494E434220 fcc "INCB " F060: 00 fcb 0 F061: 005C fdb $5c F063: 4A4D502020 fcc "JMP " F068: 0A fcb 10 F069: 000E fdb $0e F06B: 4A53522020 mnemjsr fcc "JSR " F070: 08 fcb 8 F071: 008D fdb $8d F073: 4C42434320 fcc "LBCC " F078: 05 fcb 5 F079: 1024 fdb $1024 F07B: 4C42435320 fcc "LBCS " F080: 05 fcb 5 F081: 1025 fdb $1025 F083: 4C42455120 fcc "LBEQ " F088: 05 fcb 5 F089: 1027 fdb $1027 F08B: 4C42474520 fcc "LBGE " F090: 05 fcb 5 F091: 102C fdb $102c F093: 4C42475420 fcc "LBGT " F098: 05 fcb 5 F099: 102E fdb $102e F09B: 4C42484920 fcc "LBHI " F0A0: 05 fcb 5 F0A1: 1022 fdb $1022 F0A3: 4C42485320 fcc "LBHS " F0A8: 05 fcb 5 F0A9: 1024 fdb $1024 F0AB: 4C424C4520 fcc "LBLE " F0B0: 05 fcb 5 F0B1: 102F fdb $102f F0B3: 4C424C4F20 fcc "LBLO " F0B8: 05 fcb 5 F0B9: 1025 fdb $1025 F0BB: 4C424C5320 fcc "LBLS " F0C0: 05 fcb 5 F0C1: 1023 fdb $1023 F0C3: 4C424C5420 fcc "LBLT " F0C8: 05 fcb 5 F0C9: 102D fdb $102d F0CB: 4C424D4920 fcc "LBMI " F0D0: 05 fcb 5 F0D1: 102B fdb $102b F0D3: 4C424E4520 fcc "LBNE " F0D8: 05 fcb 5 F0D9: 1026 fdb $1026 F0DB: 4C42504C20 fcc "LBPL " F0E0: 05 fcb 5 F0E1: 102A fdb $102a F0E3: 4C42524120 fcc "LBRA " F0E8: 06 fcb 6 F0E9: 0016 fdb $16 F0EB: 4C42524E20 fcc "LBRN " F0F0: 05 fcb 5 F0F1: 1021 fdb $1021 F0F3: 4C42535220 fcc "LBSR " F0F8: 06 fcb 6 F0F9: 0017 fdb $17 F0FB: 4C42564320 fcc "LBVC " F100: 05 fcb 5 F101: 1028 fdb $1028 F103: 4C42565320 fcc "LBVS " F108: 05 fcb 5 F109: 1029 fdb $1029 F10B: 4C44412020 fcc "LDA " F110: 07 fcb 7 F111: 0086 fdb $86 F113: 4C44422020 fcc "LDB " F118: 07 fcb 7 F119: 00C6 fdb $c6 F11B: 4C44442020 fcc "LDD " F120: 08 fcb 8 F121: 00CC fdb $cc F123: 4C44532020 fcc "LDS " F128: 09 fcb 9 F129: 10CE fdb $10ce F12B: 4C44552020 fcc "LDU " F130: 08 fcb 8 F131: 00CE fdb $ce F133: 4C44582020 fcc "LDX " F138: 08 fcb 8 F139: 008E fdb $8e F13B: 4C44592020 fcc "LDY " F140: 09 fcb 9 F141: 108E fdb $108e F143: 4C45415320 fcc "LEAS " F148: 03 fcb 3 F149: 0032 fdb $32 F14B: 4C45415520 fcc "LEAU " F150: 03 fcb 3 F151: 0033 fdb $33 F153: 4C45415820 fcc "LEAX " F158: 03 fcb 3 F159: 0030 fdb $30 F15B: 4C45415920 fcc "LEAY " F160: 03 fcb 3 F161: 0031 fdb $31 F163: 4C534C2020 fcc "LSL " F168: 0A fcb 10 F169: 0008 fdb $08 F16B: 4C534C4120 fcc "LSLA " F170: 00 fcb 0 F171: 0048 fdb $48 F173: 4C534C4220 fcc "LSLB " F178: 00 fcb 0 F179: 0058 fdb $58 F17B: 4C53522020 fcc "LSR " F180: 0A fcb 10 F181: 0004 fdb $04 F183: 4C53524120 fcc "LSRA " F188: 00 fcb 0 F189: 0044 fdb $44 F18B: 4C53524220 fcc "LSRB " F190: 00 fcb 0 F191: 0054 fdb $54 F193: 4D554C2020 fcc "MUL " F198: 00 fcb 0 F199: 003D fdb $3d F19B: 4E45472020 fcc "NEG " F1A0: 0A fcb 10 F1A1: 0000 fdb $00 F1A3: 4E45474120 fcc "NEGA " F1A8: 00 fcb 0 F1A9: 0040 fdb $40 F1AB: 4E45474220 fcc "NEGB " F1B0: 00 fcb 0 F1B1: 0050 fdb $50 F1B3: 4E4F502020 fcc "NOP " F1B8: 00 fcb 0 F1B9: 0012 fdb $12 F1BB: 4F52412020 fcc "ORA " F1C0: 07 fcb 7 F1C1: 008A fdb $8a F1C3: 4F52422020 fcc "ORB " F1C8: 07 fcb 7 F1C9: 00CA fdb $ca F1CB: 4F52434320 fcc "ORCC " F1D0: 02 fcb 2 F1D1: 001A fdb $1a F1D3: 4F52472020 fcc "ORG " F1D8: 0D fcb 13 F1D9: 000C fdb 12 F1DB: 5053485320 fcc "PSHS " F1E0: 0C fcb 12 F1E1: 0034 fdb $34 F1E3: 5053485520 fcc "PSHU " F1E8: 0C fcb 12 F1E9: 0036 fdb $36 F1EB: 50554C5320 fcc "PULS " F1F0: 0C fcb 12 F1F1: 0035 fdb $35 F1F3: 50554C5520 fcc "PULU " F1F8: 0C fcb 12 F1F9: 0037 fdb $37 F1FB: 524D422020 fcc "RMB " F200: 0D fcb 13 F201: 0000 fdb 0 F203: 524F4C2020 fcc "ROL " F208: 0A fcb 10 F209: 0009 fdb $09 F20B: 524F4C4120 fcc "ROLA " F210: 00 fcb 0 F211: 0049 fdb $49 F213: 524F4C4220 fcc "ROLB " F218: 00 fcb 0 F219: 0059 fdb $59 F21B: 524F522020 fcc "ROR " F220: 0A fcb 10 F221: 0006 fdb $06 F223: 524F524120 fcc "RORA " F228: 00 fcb 0 F229: 0046 fdb $46 F22B: 524F524220 fcc "RORB " F230: 00 fcb 0 F231: 0056 fdb $56 F233: 5254492020 fcc "RTI " F238: 00 fcb 0 F239: 003B fdb $3b F23B: 5254532020 fcc "RTS " F240: 00 fcb 0 F241: 0039 fdb $39 F243: 5342434120 fcc "SBCA " F248: 07 fcb 7 F249: 0082 fdb $82 F24B: 5342434220 fcc "SBCB " F250: 07 fcb 7 F251: 00C2 fdb $c2 F253: 5345542020 fcc "SET " F258: 0D fcb 13 F259: 000F fdb 15 F25B: 5345544450 fcc "SETDP" F260: 0D fcb 13 F261: 000E fdb 14 F263: 5345582020 fcc "SEX " F268: 00 fcb 0 F269: 001D fdb $1d F26B: 5354412020 fcc "STA " F270: 07 fcb 7 F271: 0087 fdb $87 F273: 5354422020 fcc "STB " F278: 07 fcb 7 F279: 00C7 fdb $c7 F27B: 5354442020 fcc "STD " F280: 08 fcb 8 F281: 00CD fdb $cd F283: 5354532020 fcc "STS " F288: 09 fcb 9 F289: 10CF fdb $10cf F28B: 5354552020 fcc "STU " F290: 08 fcb 8 F291: 00CF fdb $cf F293: 5354582020 fcc "STX " F298: 08 fcb 8 F299: 008F fdb $8f F29B: 5354592020 fcc "STY " F2A0: 09 fcb 9 F2A1: 108F fdb $108f F2A3: 5355424120 fcc "SUBA " F2A8: 07 fcb 7 F2A9: 0080 fdb $80 F2AB: 5355424220 fcc "SUBB " F2B0: 07 fcb 7 F2B1: 00C0 fdb $c0 F2B3: 5355424420 fcc "SUBD " F2B8: 08 fcb 8 F2B9: 0083 fdb $83 F2BB: 5357492020 fcc "SWI " F2C0: 00 fcb 0 F2C1: 003F fdb $3f F2C3: 5357493220 fcb "SWI2 " F2C8: 01 fcb 1 F2C9: 103F fdb $103f F2CB: 5357493320 fcb "SWI3 " F2D0: 01 fcb 1 F2D1: 113F fdb $113f F2D3: 53594E4320 fcc "SYNC " F2D8: 00 fcb 0 F2D9: 0013 fdb $13 F2DB: 5446522020 fcc "TFR " F2E0: 0B fcb 11 F2E1: 001F fdb $1f F2E3: 5453542020 fcc "TST " F2E8: 0A fcb 10 F2E9: 000D fdb $0d F2EB: 5453544120 fcc "TSTA " F2F0: 00 fcb 0 F2F1: 004D fdb $4d F2F3: 5453544220 fcc "TSTB " F2F8: 00 fcb 0 F2F9: 005D fdb $5d F2FB: F2FB: mnemsize equ (*-mnemtab)/8 F2FB: F2FB: * Register table for PUSH/PULL and TFR/EXG instructions. F2FB: * 3 bytes for name, 1 for tfr/exg, 1 for push/pull, 5 total F2FB: 582020 asmregtab fcc "X " F2FE: 0110 fcb $01,$10 F300: 592020 fcc "Y " F303: 0220 fcb $02,$20 F305: 552020 aregu fcc "U " F308: 0340 fcb $03,$40 F30A: 532020 aregs fcc "S " F30D: 0440 fcb $04,$40 F30F: 504320 fcc "PC " F312: 0580 fcb $05,$80 F314: 412020 fcc "A " F317: 0802 fcb $08,$02 F319: 422020 fcc "B " F31C: 0904 fcb $09,$04 F31E: 442020 fcc "D " F321: 0006 fcb $00,$06 F323: 434320 fcc "CC " F326: 0A01 fcb $0a,$01 F328: 434352 fcc "CCR" F32B: 0A01 fcb $0a,$01 F32D: 445020 fcc "DP " F330: 0B08 fcb $0b,$08 F332: 445052 fcc "DPR" F335: 0B08 fcb $0b,$08 F337: 3F2020 reginval fcc "? " F33A: F33A: 58595553 ixregs fcc "XYUS" F33E: F33E: * opcode offsets to basic opcode, depends on first nibble. F33E: 000000000000A0 opcoffs fcb 0,0,0,0,0,0,-$60,-$70 F346: 00F0E0D000F0E0 fcb 0,-$10,-$20,-$30,0,-$10,-$20,-$30 F34E: * mode depending on first nibble of opcode. F34E: 03000000000005 modetab fcb 3,0,0,0,0,0,5,4,1,3,5,4,1,3,5,4 F35E: * mode depending on category code stored in mnemtab F35E: 00000105060707 modetab2 fcb 0,0,1,5,6,7,7,1,2,2,0,8,9 F36B: * modes in this context: 0 no operands, 1 8-bit immediate, 2 16 bit imm, F36B: * 3, 8-bit address, 4 16 bit address, 5 indexed with postbyte, 6 short F36B: * relative, 7 long relative, 8 pushpul, 9 tftetx F36B: F36B: * Decode instruction pointed to by Y for disassembly (and to find out F36B: * how long it is). On return, U points to appropriate mnemonic table entry, F36B: * Y points past instruction. F36B: * It's rather clumsy code, but we do want to reuse the same table F36B: * as used with assembling. F36B: 7F02BF disdecode clr prebyte F36E: 7F02C3 clr amode F371: A6A0 lda ,y+ F373: 8110 cmpa #$10 F375: 2704 beq ddec1 F377: 8111 cmpa #$11 F379: 2605 bne ddec2 F37B: B702BF ddec1 sta prebyte ;Store $10 or $11 prebyte. F37E: A6A0 lda ,y+ ;Get new opcode. F380: B702C1 ddec2 sta opcode F383: 44 lsra F384: 44 lsra F385: 44 lsra F386: 44 lsra ;Get high nibble. F387: 8EF34E ldx #modetab F38A: E686 ldb a,x F38C: F702C3 stb amode F38F: 8EF33E ldx #opcoffs F392: A686 lda a,x F394: BB02C1 adda opcode ;Add opcode offset to opcode. F397: B702C0 ddec4 sta opc1 ;Store the 'basis' opcode. F39A: CEEE63 ldu #mnemtab F39D: 8E0093 ldx #mnemsize F3A0: C60D ddecloop ldb #13 F3A2: E145 cmpb 5,u ;Compare category code with 13 F3A4: 2708 beq ddec3 ;13=pseudo op, no valid opcode F3A6: FC02BF ldd prebyte F3A9: 10A346 cmpd 6,u F3AC: 2722 beq ddecfound ;Opcode&prebyte agree, operation found. F3AE: 3348 ddec3 leau 8,u ;point to next mnemonic F3B0: 301F leax -1,x F3B2: 26EC bne ddecloop F3B4: CEF033 ldu #mnemfcb ;mnemonic not found, use FCB byte. F3B7: 8603 lda #3 F3B9: B702C3 sta amode ;Store mode 3, 8 bit address. F3BC: B602C1 lda opcode F3BF: 7D02BF tst prebyte F3C2: 2708 beq ddec5 F3C4: B602BF lda prebyte ;if it was the combination prebyte F3C7: 7F02BF clr prebyte ;and opcode that was not found, F3CA: 313F leay -1,y ;FCB just the prebyte F3CC: B702C5 ddec5 sta operand+1 ;The byte must be stored as operand. F3CF: 39 rts F3D0: 1183EF6B ddecfound cmpu #mnembsr F3D4: 260A bne ddec6 F3D6: 868D lda #$8d ;Is it really the BSR opcode? F3D8: B102C1 cmpa opcode F3DB: 2703 beq ddec6 F3DD: CEF06B ldu #mnemjsr ;We mistakenly found BSR instead of JSR F3E0: B602C3 ddec6 lda amode F3E3: 84FE anda #$FE F3E5: 260A bne ddec7 F3E7: A645 lda 5,u ;nibble-dependent mode was 0 or 1, F3E9: 8EF35E ldx #modetab2 ;use category dependent mode instead. F3EC: A686 lda a,x F3EE: B702C3 sta amode F3F1: B602C3 ddec7 lda amode F3F4: 48 asla F3F5: 8EF3FA ldx #disdectab F3F8: 6E96 jmp [a,x] ;jump dependent on definitive mode. F3FA: F434F42EF435F4 disdectab fdb noop,opdec1,opdec2,opdec1,opdec2,opdecidx F406: F42EF435F439F4 fdb opdec1,opdec2,opdecpb,opdecpb F40E: F434F434F434F4 disdectab1 fdb noop,noop,noop,noop,noop,noop,noop,noop F41E: F42EF435F434F4 fdb opdec1,opdec2,noop,noop,opdec1,opdec2,noop,opdec2 F42E: E6A0 opdec1 ldb ,y+ F430: 1D sex F431: FD02C4 od1a std operand F434: 39 noop rts F435: ECA1 opdec2 ldd ,y++ F437: 20F8 bra od1a F439: E6A0 opdecpb ldb ,y+ F43B: F702C2 odpa stb postbyte F43E: 39 rts F43F: E6A0 opdecidx ldb ,y+ F441: 2AF8 bpl odpa ;postbytes <$80 have no extra operands. F443: F702C2 stb postbyte F446: C40F andb #$0f F448: 58 aslb F449: 8EF40E ldx #disdectab1 F44C: 6E95 jmp [b,x] F44E: F44E: * Display disassembled instruction after the invocation of disdecode. F44E: * U points to mnemonic table entry. F44E: 1F31 disdisp tfr u,x F450: C605 ldb #5 F452: 9D09 jsr putline ;Display the mnemonic. F454: C620 ldb #' ' F456: 9D03 jsr putchar F458: B602C3 lda amode F45B: 48 asla F45C: 8EF461 ldx #disdisptab F45F: 6E96 jmp [a,x] ;Perform action dependent on mode. F461: F434F475F479F4 disdisptab fdb noop,disim8,disim16,disadr8,disadr16 F46B: F53BF48BF499F4 fdb disidx,disrel8,disrel16,distfr,dispush F475: 8D29 disim8 bsr puthash F477: 200A bra disadr8 F479: 8D25 disim16 bsr puthash F47B: 8D27 disadr16 bsr putdol F47D: FC02C4 ldd operand F480: 7EE6DE jmp outd F483: 8D1F disadr8 bsr putdol F485: B602C5 lda operand+1 F488: 7EE6D0 jmp outbyte F48B: 8D17 disrel8 bsr putdol F48D: F602C5 ldb operand+1 F490: 1D sex F491: 109F24 dr8a sty temp F494: D324 addd temp F496: 7EE6DE jmp outd F499: 8D09 disrel16 bsr putdol F49B: FC02C4 ldd operand F49E: 20F1 bra dr8a F4A0: F4A0: C623 puthash ldb #'#' F4A2: 0E03 jmp putchar F4A4: C624 putdol ldb #'$' F4A6: 0E03 jmp putchar F4A8: C62C putcomma ldb #',' F4AA: 0E03 jmp putchar F4AC: C620 putspace ldb #' ' F4AE: 0E03 jmp putchar F4B0: F4B0: C60C dispush ldb #12 F4B2: 8EF2FB ldx #asmregtab ;Walk through the register table. F4B5: 0F24 clr temp F4B7: B602C2 regloop lda postbyte F4BA: A404 anda 4,x F4BC: 2735 beq dispush1 ;Is bit corresponding to reg set in postbyte F4BE: 8CF305 cmpx #aregu F4C1: 260B bne dispush3 F4C3: 9725 sta temp+1 F4C5: B602C1 lda opcode F4C8: 8402 anda #2 F4CA: 2627 bne dispush1 ;no u register in pshu pulu. F4CC: 9625 lda temp+1 F4CE: 8CF30A dispush3 cmpx #aregs F4D1: 260B bne dispush4 F4D3: 9725 sta temp+1 F4D5: B602C1 lda opcode F4D8: 8402 anda #2 F4DA: 2717 beq dispush1 ;no s register in pshs puls. F4DC: 9625 lda temp+1 F4DE: 43 dispush4 coma F4DF: B402C2 anda postbyte ;remove the bits from postbyte. F4E2: B702C2 sta postbyte F4E5: 3404 pshs b F4E7: 0D24 tst temp F4E9: 2702 beq dispush2 F4EB: 8DBB bsr putcomma ;print comma after first register. F4ED: 8D2B dispush2 bsr disregname F4EF: 0C24 inc temp F4F1: 3504 puls b F4F3: 3005 dispush1 leax 5,x F4F5: 5A decb F4F6: 26BF bne regloop F4F8: 39 rts F4F9: F4F9: B602C2 distfr lda postbyte F4FC: 44 lsra F4FD: 44 lsra F4FE: 44 lsra F4FF: 44 lsra F500: 8D07 bsr distfrsub F502: 8DA4 bsr putcomma F504: B602C2 lda postbyte F507: 840F anda #$0f F509: C60C distfrsub ldb #12 F50B: 8EF2FB ldx #asmregtab F50E: A103 distfrloop cmpa 3,x F510: 2705 beq distfrend F512: 3005 leax 5,x F514: 5A decb F515: 26F7 bne distfrloop F517: 8D01 distfrend bsr disregname F519: 39 rts F51A: F51A: 8603 disregname lda #3 F51C: 1F13 tfr x,u F51E: E6C0 drnloop ldb ,u+ F520: C120 cmpb #' ' F522: 2705 beq drnend F524: 9D03 jsr putchar F526: 4A deca F527: 26F5 bne drnloop F529: 39 drnend rts F52A: F52A: B602C2 disidxreg lda postbyte F52D: 44 lsra F52E: 44 lsra F52F: 44 lsra F530: 44 lsra F531: 44 lsra F532: 8403 anda #3 F534: 8EF33A ldx #ixregs F537: E686 ldb a,x F539: 0E03 jmp putchar F53B: F53B: 0F24 disidx clr temp F53D: B602C2 lda postbyte F540: 2B23 bmi disidx1 F542: 841F anda #$1f F544: 8510 bita #$10 F546: 2605 bne negoffs F548: BDF634 jsr outdecbyte F54B: 200A bra discomma F54D: C62D negoffs ldb #'-' F54F: 9D03 jsr putchar F551: 8AF0 ora #$f0 F553: 40 nega F554: BDF634 jsr outdecbyte F557: BDF4A8 discomma jsr putcomma ;Display ,Xreg and terminating ] F55A: 8DCE disindex bsr disidxreg F55C: 0D24 disindir tst temp ;Display ] if indirect. F55E: 2704 beq disidxend F560: C65D ldb #']' F562: 9D03 jsr putchar F564: 39 disidxend rts F565: 8510 disidx1 bita #$10 F567: 2706 beq disidx2 F569: C65B ldb #'[' F56B: 9D03 jsr putchar F56D: 0C24 inc temp F56F: B602C2 disidx2 lda postbyte F572: 840F anda #$0f F574: 48 asla F575: 8EF614 ldx #disidxtab F578: 6E96 jmp [a,x] ;Jump to routine for indexed mode F57A: 8602 disadec2 lda #2 F57C: 2002 bra disadeca F57E: 8601 disadec1 lda #1 F580: BDF4A8 disadeca jsr putcomma F583: C62D disadloop ldb #'-' F585: 9D03 jsr putchar F587: 4A deca F588: 26F9 bne disadloop F58A: 20CE bra disindex F58C: 8602 disainc2 lda #2 F58E: 2002 bra disainca F590: 8601 disainc1 lda #1 F592: 9725 disainca sta temp+1 F594: BDF4A8 jsr putcomma F597: BDF52A jsr disidxreg F59A: 9625 lda temp+1 F59C: C62B disailoop ldb #'+' F59E: 9D03 jsr putchar F5A0: 4A deca F5A1: 26F9 bne disailoop F5A3: 7EF55C jmp disindir F5A6: C641 disax ldb #'A' F5A8: 9D03 jsr putchar F5AA: 7EF557 jmp discomma F5AD: C642 disbx ldb #'B' F5AF: 9D03 jsr putchar F5B1: 7EF557 jmp discomma F5B4: C644 disdx ldb #'D' F5B6: 9D03 jsr putchar F5B8: 7EF557 jmp discomma F5BB: C63F disinval ldb #'?' F5BD: 9D03 jsr putchar F5BF: 7EF55C jmp disindir F5C2: B602C5 disnx lda operand+1 F5C5: 2B09 bmi disnxneg F5C7: BDF4A4 disnx1 jsr putdol F5CA: BDE6D0 jsr outbyte F5CD: 7EF557 jmp discomma F5D0: C62D disnxneg ldb #'-' F5D2: 9D03 jsr putchar F5D4: 40 nega F5D5: 20F0 bra disnx1 F5D7: BDF4A4 disnnx jsr putdol F5DA: FC02C4 ldd operand F5DD: BDE6DE jsr outd F5E0: 7EF557 jmp discomma F5E3: BDF4A4 disnpc jsr putdol F5E6: F602C5 ldb operand+1 F5E9: 1D sex F5EA: 109F26 disnpca sty temp2 F5ED: D326 addd temp2 F5EF: BDE6DE jsr outd F5F2: 8EF610 ldx #commapc F5F5: C604 ldb #4 F5F7: 9D09 jsr putline F5F9: 7EF55C jmp disindir F5FC: BDF4A4 disnnpc jsr putdol F5FF: FC02C4 ldd operand F602: 20E6 bra disnpca F604: BDF4A4 disdirect jsr putdol F607: FC02C4 ldd operand F60A: BDE6DE jsr outd F60D: 7EF55C jmp disindir F610: F610: 2C504352 commapc fcc ",PCR" F614: F614: F590F58CF57EF5 disidxtab fdb disainc1,disainc2,disadec1,disadec2 F61C: F557F5ADF5A6F5 fdb discomma,disbx,disax,disinval F624: F5C2F5D7F5BBF5 fdb disnx,disnnx,disinval,disdx F62C: F5E3F5FCF5BBF6 fdb disnpc,disnnpc,disinval,disdirect F634: F634: * Display byte A in decimal (0<=A<20) F634: 810A outdecbyte cmpa #10 F636: 2506 blo odb1 F638: 800A suba #10 F63A: C631 ldb #'1' F63C: 9D03 jsr putchar F63E: 8B30 odb1 adda #'0' F640: 1F89 tfr a,b F642: 0E03 jmp putchar F644: F644: * This is the code for the U command, unassemble instructions in memory. F644: * Syntax: U or Uaddr or Uaddr,length F644: 8E0201 unasm ldx #linebuf+1 F647: CC0014 ldd #20 F64A: BDE732 jsr scan2parms ;Scan address,length parameters. F64D: FC029D ldd addr F650: F3029F addd length F653: FD029F std length F656: 10BE029D ldy addr F65A: 1F20 unasmloop tfr y,d F65C: BDE6DE jsr outd ;Display instruction address F65F: BDF4AC jsr putspace F662: 3420 pshs y F664: BDF36B jsr disdecode F667: 3510 puls x F669: 109F24 sty temp F66C: 0F26 clr temp2 F66E: A680 unadishex lda ,x+ F670: BDE6D0 jsr outbyte F673: 0C26 inc temp2 F675: 0C26 inc temp2 F677: 9C24 cmpx temp F679: 26F3 bne unadishex ;Display instruction bytes as hex. F67B: C620 unadisspc ldb #' ' F67D: 9D03 jsr putchar F67F: 0C26 inc temp2 F681: 860B lda #11 F683: 9126 cmpa temp2 ;Fill out with spaces to width 11. F685: 26F4 bne unadisspc F687: 26E5 bne unadishex F689: BDF44E jsr disdisp ;Display disassembled instruction. F68C: 9D0C jsr putcr F68E: 10BC029F cmpy length F692: 23C6 bls unasmloop F694: 10BF029D sty addr F698: 7EE558 jmp cmdline F69B: F69B: * Simple 'expression evaluator' for assembler. F69B: E684 expr ldb ,x F69D: C12D cmpb #'-' F69F: 2603 bne pos F6A1: 5F clrb F6A2: 3001 leax 1,x F6A4: 3404 pos pshs b F6A6: 8D11 bsr scanfact F6A8: 270C beq exprend1 F6AA: 6DE0 tst ,s+ F6AC: 2607 bne exprend ;Was the minus sign there. F6AE: 43 coma F6AF: 53 comb F6B0: C30001 addd #1 F6B3: 1CFB andcc #$fb ;Clear Z flag for valid result. F6B5: 39 exprend rts F6B6: 3504 exprend1 puls b F6B8: 39 rts F6B9: F6B9: E680 scanfact ldb ,x+ F6BB: C124 cmpb #'$' F6BD: 1027F04E lbeq scanhex ;Hex number if starting with dollar. F6C1: C127 cmpb #''' F6C3: 260E bne scandec ;char if starting with ' else decimal F6C5: E680 ldb ,x+ F6C7: A684 lda ,x F6C9: 8127 cmpa #''' F6CB: 2602 bne scanchar2 F6CD: 3001 leax 1,x ;Increment past final quote if it's there. F6CF: 4F scanchar2 clra F6D0: 1CFB andcc #$fb ;Clear zero flag. F6D2: 39 rts F6D3: C130 scandec cmpb #'0' F6D5: 252F blo noexpr F6D7: C139 cmpb #'9' F6D9: 222B bhi noexpr F6DB: 0F24 clr temp F6DD: 0F25 clr temp+1 F6DF: C030 scandloop subb #'0' F6E1: 251C bcs sdexit F6E3: C10A cmpb #10 F6E5: 2418 bcc sdexit F6E7: 3404 pshs b F6E9: DC24 ldd temp F6EB: 58 aslb F6EC: 49 rola F6ED: 3406 pshs d F6EF: 58 aslb F6F0: 49 rola F6F1: 58 aslb F6F2: 49 rola F6F3: E3E1 addd ,s++ ;Multiply number by 10. F6F5: EBE0 addb ,s+ F6F7: 8900 adca #0 ;Add digit to 10. F6F9: DD24 std temp F6FB: E680 ldb ,x+ ;Get next character. F6FD: 20E0 bra scandloop F6FF: DC24 sdexit ldd temp F701: 301F leax -1,x F703: 1CFB andcc #$fb F705: 39 rts F706: 1A04 noexpr orcc #$04 F708: 39 rts F709: F709: * Assemble the instruction pointed to by X. F709: * Fisrt stage: copy mnemonic to mnemonic buffer. F709: 8605 asminstr lda #5 F70B: CE02C6 ldu #mnembuf F70E: E680 mncploop ldb ,x+ F710: 2715 beq mncpexit F712: C120 cmpb #' ' F714: 2711 beq mncpexit ;Mnemonic ends at first space or null F716: C4DF andb #CASEMASK F718: C141 cmpb #'A' F71A: 2504 blo nolet F71C: C15A cmpb #'Z' F71E: 2302 bls mnemcp1 ;Capitalize letters, but only letters. F720: E61F nolet ldb -1,x F722: E7C0 mnemcp1 stb ,u+ ;Copy to mnemonic buffer. F724: 4A deca F725: 26E7 bne mncploop F727: 4D mncpexit tsta F728: 2707 beq mncpdone F72A: C620 ldb #' ' F72C: E7C0 mnfilloop stb ,u+ F72E: 4A deca F72F: 26FB bne mnfilloop ;Fill the rest of mnem buffer with spaces. F731: * Second stage: look mnemonic up using binary search. F731: 9F28 mncpdone stx temp3 F733: 0F24 clr temp ;Low index=0 F735: 8693 lda #mnemsize F737: 9725 sta temp+1 ;High index=mnemsize. F739: D625 bsrchloop ldb temp+1 F73B: C1FF cmpb #$ff F73D: 2739 beq invmnem ;lower limit -1? F73F: D124 cmpb temp F741: 2535 blo invmnem ;hi index lower than low index? F743: 4F clra F744: DB24 addb temp ;Add indexes. F746: 8900 adca #0 F748: 44 lsra F749: 56 rorb ;Divide by 2 to get average F74A: D726 stb temp2 F74C: 58 aslb F74D: 49 rola F74E: 58 aslb F74F: 49 rola F750: 58 aslb F751: 49 rola ;Multiply by 8 to get offset. F752: CEEE63 ldu #mnemtab F755: 33CB leau d,u ;Add offset to table base F757: 1F32 tfr u,y F759: 8605 lda #5 F75B: 8E02C6 ldx #mnembuf F75E: E680 bscmploop ldb ,x+ F760: E1A0 cmpb ,y+ F762: 2606 bne bscmpexit ;Characters don't match? F764: 4A deca F765: 26F7 bne bscmploop F767: 7EF77E jmp mnemfound ;We found the mnemonic. F76A: D626 bscmpexit ldb temp2 F76C: 2405 bcc bscmplower F76E: 5A decb F76F: D725 stb temp+1 ;mnembuf<table, adjust high limit. F771: 20C6 bra bsrchloop F773: 5C bscmplower incb F774: D724 stb temp ;mnembuf>table, adjust low limit. F776: 20C1 bra bsrchloop F778: 8EE67D invmnem ldx #invmmsg F77B: 7E0298 jmp asmerrvec F77E: * Stage 3: Perform routine depending on category code. F77E: 7F02CC mnemfound clr uncert F781: 10BE029D ldy addr F785: A645 lda 5,u F787: 48 asla F788: 8EF792 ldx #asmtab F78B: AD96 jsr [a,x] F78D: 10BF029D sty addr F791: 39 rts F792: F7B4F7B8F7BCF7 asmtab fdb onebyte,twobyte,immbyte,lea F79A: F7F7F80AF81DF8 fdb sbranch,lbranch,lbra,acc8 F7A2: F835F846F859F8 fdb dreg1,dreg2,oneaddr,tfrexg F7AA: F8A4F8CA fdb pushpul,pseudo F7AE: F7AE: E7A0 putbyte stb ,y+ F7B0: 39 rts F7B1: EDA1 putword std ,y++ F7B3: 39 rts F7B4: F7B4: E647 onebyte ldb 7,u ;Cat 0, one byte opcode w/o operands RTS F7B6: 20F6 bra putbyte F7B8: EC46 twobyte ldd 6,u ;Cat 1, two byte opcode w/o operands SWI2 F7BA: 20F5 bra putword F7BC: E647 immbyte ldb 7,u ;Cat 2, opcode w/ immdiate operand ANDCC F7BE: 8DEE bsr putbyte F7C0: BDF8ED jsr scanops F7C3: F602C3 ldb amode F7C6: C101 cmpb #1 F7C8: 1026038A lbne moderr F7CC: F602C5 ldb operand+1 F7CF: 20DD bra putbyte F7D1: E647 lea ldb 7,u ;Cat 3, LEA F7D3: 8DD9 bsr putbyte F7D5: BDF8ED jsr scanops F7D8: B602C3 lda amode F7DB: 8101 cmpa #1 F7DD: 10270375 lbeq moderr ;No immediate w/ lea F7E1: 8103 cmpa #3 F7E3: 102402BE lbhs doaddr F7E7: BDFA98 jsr set3 F7EA: 868F lda #$8f F7EC: B702C2 sta postbyte F7EF: 8602 lda #2 F7F1: B702CB sta opsize ;Use 8F nn nn for direct mode. F7F4: 7EFAA5 jmp doaddr F7F7: E647 sbranch ldb 7,u ;Cat 4, short branch instructions F7F9: 8DB3 bsr putbyte F7FB: BDF8E5 jsr startop F7FE: 301F leax -1,x F800: BD0295 jsr exprvec F803: 10270349 lbeq exprerr F807: 7EFB0E jmp shortrel F80A: EC46 lbranch ldd 6,u ;Cat 5, long brach w/ two byte opcode F80C: 8DA3 bsr putword F80E: BDF8E5 lbra1 jsr startop F811: 301F leax -1,x F813: BD0295 jsr exprvec F816: 10270336 lbeq exprerr F81A: 7EFB32 jmp longrel F81D: E647 lbra ldb 7,u ;Cat 6, long branch w/ one byte opcode. F81F: BDF7AE jsr putbyte F822: 20EA bra lbra1 F824: 8601 acc8 lda #1 ;Cat 7, 8-bit two operand instructions ADDA F826: B702CB sta opsize F829: BDF8ED jsr scanops F82C: BDF8CB jsr adjopc F82F: BDF7AE jsr putbyte F832: 7EFAA5 jmp doaddr F835: 8602 dreg1 lda #2 ;Cat 8, 16-bit 2operand insns 1byte opc LDX F837: B702CB sta opsize F83A: BDF8ED jsr scanops F83D: BDF8CB jsr adjopc F840: BDF7AE jsr putbyte F843: 7EFAA5 jmp doaddr F846: 8602 dreg2 lda #2 ;Cat 9, 16-bit 2operand insns 2byte opc LDY F848: B702CB sta opsize F84B: BDF8ED jsr scanops F84E: BDF8CB jsr adjopc F851: A646 lda 6,u F853: BDF7B1 jsr putword F856: 7EFAA5 jmp doaddr F859: BDF8ED oneaddr jsr scanops ;Cat 10, one-operand insns NEG..CLR F85C: E647 ldb 7,u F85E: B602C3 lda amode F861: 8101 cmpa #1 F863: 102702EF lbeq moderr ;No immediate mode F867: 8103 cmpa #3 F869: 2408 bhs oaind ;indexed etc F86B: B602CB lda opsize F86E: 4A deca F86F: 2704 beq oadir F871: CB10 addb #$10 ;Add $70 for extended direct. F873: CB60 oaind addb #$60 ;And $60 for indexed etc. F875: BDF7AE oadir jsr putbyte ;And nothing for direct8. F878: 7EFAA5 jmp doaddr F87B: BDF8E5 tfrexg jsr startop ;Cat 11, TFR and EXG F87E: 301F leax -1,x F880: E647 ldb 7,u F882: BDF7AE jsr putbyte F885: BDFB6E jsr findreg F888: E6C4 ldb ,u F88A: 58 aslb F88B: 58 aslb F88C: 58 aslb F88D: 58 aslb F88E: F702C2 stb postbyte F891: E680 ldb ,x+ F893: C12C cmpb #',' F895: 102602BD lbne moderr F899: BDFB6E jsr findreg F89C: E6C4 ldb ,u F89E: FA02C2 orb postbyte F8A1: 7EF7AE jmp putbyte F8A4: BDF8E5 pushpul jsr startop ;Cat 12, PSH and PUL F8A7: 301F leax -1,x F8A9: E647 ldb 7,u F8AB: BDF7AE jsr putbyte F8AE: 7F02C2 clr postbyte F8B1: BDFB6E pploop jsr findreg F8B4: E641 ldb 1,u F8B6: FA02C2 orb postbyte F8B9: F702C2 stb postbyte F8BC: E680 ldb ,x+ F8BE: C12C cmpb #',' F8C0: 27EF beq pploop F8C2: 301F leax -1,x F8C4: F602C2 ldb postbyte F8C7: 7EF7AE jmp putbyte F8CA: pseudo ;Cat 13, pseudo oeprations F8CA: 39 rts F8CB: F8CB: * Adjust opcdoe depending on mode (in $80-$FF range) F8CB: E647 adjopc ldb 7,u F8CD: B602C3 lda amode F8D0: 8102 cmpa #2 F8D2: 2708 beq adjdir ;Is it direct? F8D4: 8103 cmpa #3 F8D6: 2401 bhs adjind ;Indexed etc? F8D8: 39 rts ;Not, then immediate, no adjust. F8D9: CB20 adjind addb #$20 ;Add $20 to opcode for indexed etc modes. F8DB: 39 rts F8DC: CB10 adjdir addb #$10 ;Add $10 to opcode for direct8 F8DE: B602CB lda opsize F8E1: 4A deca F8E2: 26F5 bne adjind ;If opsize=2, add another $20 for extended16 F8E4: 39 rts F8E5: F8E5: * Start scanning of operands. F8E5: 9E28 startop ldx temp3 F8E7: 7F02C3 clr amode F8EA: 7EE6E7 jmp skipspace F8ED: F8ED: * amode settings in assembler: 1=immediate, 2=direct/extended, 3=indexed F8ED: * etc. 4=pc relative, 5=indirect, 6=pcrelative and indirect. F8ED: F8ED: * This subroutine scans the assembler operands. F8ED: 8DF6 scanops bsr startop F8EF: C15B cmpb #'[' F8F1: 2607 bne noindir F8F3: 8605 lda #5 ;operand starts with [, then indirect. F8F5: B702C3 sta amode F8F8: E680 ldb ,x+ F8FA: C123 noindir cmpb #'#' F8FC: 10270087 lbeq doimm F900: C12C cmpb #',' F902: 1027009A lbeq dospecial F906: C4DF andb #CASEMASK ;Convert to uppercase. F908: 8686 lda #$86 F90A: C141 cmpb #'A' F90C: 270C beq scanacidx F90E: 8685 lda #$85 F910: C142 cmpb #'B' F912: 2706 beq scanacidx F914: 868B lda #$8B F916: C144 cmpb #'D' F918: 2616 bne scanlab F91A: E680 scanacidx ldb ,x+ ;Could it be A,X B,X or D,X F91C: C12C cmpb #',' F91E: 260E bne nocomma F920: B702C2 sta postbyte F923: 7F02CB clr opsize F926: BDFA98 jsr set3 F929: BDFA7A jsr scanixreg F92C: 2041 bra scanend F92E: 301F nocomma leax -1,x F930: 301F scanlab leax -1,x ;Point to the start of the operand F932: BD0295 jsr exprvec F935: 10270217 lbeq exprerr F939: FD02C4 std operand F93C: 7D02CC tst uncert F93F: 2609 bne opsz2 ;Go for extended if operand unknown. F941: B302CD subd dpsetting F944: 4D tsta ;Can we use 8-bit operand? F945: 2603 bne opsz2 F947: 4C inca F948: 2002 bra opsz1 F94A: 8602 opsz2 lda #2 F94C: B702CB opsz1 sta opsize ;Set opsize depending on magnitude of op. F94F: B602C3 lda amode F952: 8105 cmpa #5 F954: 260C bne opsz3 ;Or was it indirect. F956: 8602 lda #2 ;Then we have postbyte and opsize=2 F958: B702CB sta opsize F95B: 868F lda #$8F F95D: B702C2 sta postbyte F960: 2005 bra opsz4 F962: 8602 opsz3 lda #2 F964: B702C3 sta amode ;Assume direct or absolute addressing F967: E680 opsz4 ldb ,x+ F969: C12C cmpb #',' F96B: 10270086 lbeq doindex ;If followed by, then indexed. F96F: B602C3 scanend lda amode F972: 8105 cmpa #5 F974: 2510 blo scanend2 ;Was it an indirect mode? F976: B602C2 lda postbyte F979: 8A10 ora #$10 ;Set indirect bit. F97B: B702C2 sta postbyte F97E: E680 ldb ,x+ F980: C15D cmpb #']' ;Check for the other ] F982: 102701D0 lbeq moderr F986: 39 scanend2 rts F987: BD0295 doimm jsr exprvec ;Immediate addressing. F98A: 102701C2 lbeq exprerr F98E: FD02C4 std operand F991: B602C3 lda amode F994: 8105 cmpa #5 F996: 102701BC lbeq moderr ;Inirect mode w/ imm is illegal. F99A: 8601 lda #$01 F99C: B702C3 sta amode F99F: 39 rts F9A0: BDFA98 dospecial jsr set3 F9A3: 7F02CB clr opsize F9A6: 4F clra F9A7: E680 adecloop ldb ,x+ F9A9: C12D cmpb #'-' F9AB: 2603 bne adecend F9AD: 4C inca ;Count the - signs for autodecrement. F9AE: 20F7 bra adecloop F9B0: 301F adecend leax -1,x F9B2: 8102 cmpa #2 F9B4: 1022019E lbhi moderr F9B8: 4D tsta F9B9: 262F bne autodec F9BB: 7F02C2 clr postbyte F9BE: BDFA7A jsr scanixreg F9C1: 4F clra F9C2: E680 aincloop ldb ,x+ F9C4: C12B cmpb #'+' F9C6: 2603 bne aincend F9C8: 4C inca F9C9: 20F7 bra aincloop ;Count the + signs for autoincrement. F9CB: 301F aincend leax -1,x F9CD: 8102 cmpa #2 F9CF: 10220183 lbhi moderr F9D3: 4D tsta F9D4: 260A bne autoinc F9D6: 8684 lda #$84 F9D8: BA02C2 ora postbyte F9DB: B702C2 sta postbyte F9DE: 208F bra scanend F9E0: 8B7F autoinc adda #$7f F9E2: BA02C2 ora postbyte F9E5: B702C2 sta postbyte F9E8: 2085 bra scanend F9EA: 8B81 autodec adda #$81 F9EC: B702C2 sta postbyte F9EF: BDFA7A jsr scanixreg F9F2: 16FF7A lbra scanend F9F5: 7F02C2 doindex clr postbyte F9F8: BDFA98 jsr set3 F9FB: E680 ldb ,x+ F9FD: C4DF andb #CASEMASK ;Convert to uppercase. F9FF: C150 cmpb #'P' FA01: 10270057 lbeq dopcrel ;Check for PC relative. FA05: 301F leax -1,x FA07: 7F02CB clr opsize FA0A: 8D6E bsr scanixreg FA0C: FC02C4 ldd operand FA0F: 7D02CC tst uncert FA12: 2638 bne longindex ;Go for long index if operand unknown. FA14: 1083FFF0 cmpd #-16 FA18: 2D18 blt shortindex FA1A: 1083000F cmpd #15 FA1E: 2E12 bgt shortindex FA20: B602C3 lda amode FA23: 8105 cmpa #5 FA25: 2717 beq shortind1 ;Indirect may not be 5-bit index FA27: ;It's a five-bit index. FA27: C41F andb #$1f FA29: FA02C2 orb postbyte FA2C: F702C2 stb postbyte FA2F: 16FF3D lbra scanend FA32: 1083FF80 shortindex cmpd #-128 FA36: 2D14 blt longindex FA38: 1083007F cmpd #127 FA3C: 2E0E bgt longindex FA3E: 7C02CB shortind1 inc opsize FA41: C688 ldb #$88 FA43: FA02C2 orb postbyte FA46: F702C2 stb postbyte FA49: 16FF23 lbra scanend FA4C: 8602 longindex lda #$2 FA4E: B702CB sta opsize FA51: C689 ldb #$89 FA53: FA02C2 orb postbyte FA56: F702C2 stb postbyte FA59: 16FF13 lbra scanend FA5C: E680 dopcrel ldb ,x+ FA5E: C4DF andb #CASEMASK ;Convert to uppercase FA60: C143 cmpb #'C' FA62: 2506 blo pcrelend FA64: C152 cmpb #'R' FA66: 2202 bhi pcrelend FA68: 20F2 bra dopcrel ;Scan past the ,PCR FA6A: 301F pcrelend leax -1,x FA6C: C68C ldb #$8C FA6E: FA02C2 orb postbyte ;Set postbyte FA71: F702C2 stb postbyte FA74: 7C02C3 inc amode ;Set addr mode to PCR FA77: 16FEF5 lbra scanend FA7A: FA7A: * Scan for one of the 4 index registers and adjust postbyte. FA7A: E680 scanixreg ldb ,x+ FA7C: C4DF andb #CASEMASK ;Convert to uppercase. FA7E: 3410 pshs x FA80: 8EF33A ldx #ixregs FA83: 4F clra FA84: E180 scidxloop cmpb ,x+ FA86: 2707 beq ixfound FA88: 8B20 adda #$20 FA8A: 2AF8 bpl scidxloop FA8C: 7EFB56 jmp moderr ;Index register not found where expected. FA8F: BA02C2 ixfound ora postbyte FA92: B702C2 sta postbyte ;Set index reg bits in postbyte. FA95: 3510 puls x FA97: 39 rts FA98: FA98: * This routine sets amode to 3, if it was less. FA98: B602C3 set3 lda amode FA9B: 8103 cmpa #3 FA9D: 2405 bhs set3a FA9F: 8603 lda #3 FAA1: B702C3 sta amode FAA4: 39 set3a rts FAA5: FAA5: * This subroutine lays down the address. FAA5: B602C3 doaddr lda amode FAA8: 8103 cmpa #3 FAAA: 250D blo doa1 FAAC: F602C2 ldb postbyte FAAF: BDF7AE jsr putbyte FAB2: B602C3 lda amode FAB5: 8401 anda #1 FAB7: 2715 beq doapcrel ;pc rel modes. FAB9: B602CB doa1 lda opsize FABC: 4D tsta FABD: 27E5 beq set3a FABF: 4A deca FAC0: 2706 beq doa2 FAC2: FC02C4 ldd operand FAC5: 7EF7B1 jmp putword FAC8: F602C5 doa2 ldb operand+1 FACB: 7EF7AE jmp putbyte FACE: 10BF029D doapcrel sty addr FAD2: FC02C4 ldd operand FAD5: B3029D subd addr FAD8: 830001 subd #1 FADB: 7D02CC tst uncert FADE: 2614 bne pcrlong FAE0: 1083FF80 cmpd #-128 FAE4: 2D0E blt pcrlong FAE6: 1083FF81 cmpd #-127 FAEA: 2E08 bgt pcrlong FAEC: 8601 lda #1 FAEE: B702CB sta opsize FAF1: 7EF7AE jmp putbyte FAF4: 830001 pcrlong subd #1 FAF7: 313F leay -1,y FAF9: 7C02C2 inc postbyte FAFC: 3406 pshs d FAFE: F602C2 ldb postbyte FB01: BDF7AE jsr putbyte FB04: 8602 lda #2 FB06: B702CB sta opsize FB09: 3506 puls d FB0B: 7EF7B1 jmp putword FB0E: FB0E: * This routine checks and lays down short relative address. FB0E: 10BF029D shortrel sty addr FB12: B3029D subd addr FB15: 830001 subd #1 FB18: 1083FF80 cmpd #-128 FB1C: 2D2C blt brerr FB1E: 1083007F cmpd #127 FB22: 2E26 bgt brerr FB24: BDF7AE jsr putbyte FB27: 8604 lda #4 FB29: B702C3 sta amode FB2C: 8601 lda #1 FB2E: B702CB sta opsize FB31: 39 rts FB32: * This routine lays down long relative address. FB32: 10BF029D longrel sty addr FB36: B3029D subd addr FB39: 830002 subd #2 FB3C: BDF7B1 jsr putword FB3F: 8604 lda #4 FB41: B702C3 sta amode FB44: 8602 lda #2 FB46: B702CB sta opsize FB49: 39 rts FB4A: FB4A: 8EE6B5 brerr ldx #brmsg FB4D: 7E0298 jmp asmerrvec FB50: 8EE68E exprerr ldx #exprmsg FB53: 7E0298 jmp asmerrvec FB56: 8EE69F moderr ldx #modemsg FB59: 7E0298 jmp asmerrvec FB5C: 3410 asmerr pshs x FB5E: 9D18 jsr xabortin FB60: 3510 puls x FB62: BDE4E1 jsr outcount FB65: 9D0C jsr putcr FB67: 10FE02BD lds savesp FB6B: 7EE558 jmp cmdline FB6E: FB6E: * Find register for TFR and PSH instruction FB6E: C60C findreg ldb #12 FB70: 3424 pshs y,b FB72: CEF2FB ldu #asmregtab FB75: 1F12 findregloop tfr x,y FB77: 8603 lda #3 FB79: E6C4 frcmps ldb ,u FB7B: C120 cmpb #' ' FB7D: 2606 bne frcmps1 FB7F: E6A4 ldb ,y FB81: C141 cmpb #'A' FB83: 2D18 blt frfound FB85: E6A0 frcmps1 ldb ,y+ FB87: C4DF andb #CASEMASK FB89: E1C0 cmpb ,u+ FB8B: 2606 bne frnextreg FB8D: 4A deca FB8E: 26E9 bne frcmps FB90: 4C inca FB91: 200A bra frfound FB93: 4C frnextreg inca FB94: 33C6 leau a,u FB96: 6AE4 dec ,s FB98: 26DB bne findregloop FB9A: 16FFB9 lbra moderr FB9D: 33C6 frfound leau a,u FB9F: 1F21 tfr y,x FBA1: 3524 puls y,b FBA3: 39 rts FBA4: FBA4: * This is the code for the A command, assemble instructions. FBA4: * Syntax: Aaddr FBA4: 8E0201 asm ldx #linebuf+1 FBA7: BDE70F jsr scanhex FBAA: FD029D std addr FBAD: FC029D asmloop ldd addr FBB0: BDE6DE jsr outd FBB3: C620 ldb #' ' FBB5: 9D03 jsr putchar ;Print address and space. FBB7: 8E0200 ldx #linebuf FBBA: C680 ldb #128 FBBC: 9D06 jsr getline ;Get new line FBBE: 5D tstb FBBF: 1027E995 lbeq cmdline ;Exit on empty line. FBC3: 3A abx FBC4: 6F84 clr ,x ;Make line zero terminated. FBC6: 8E0200 ldx #linebuf FBC9: BDF709 jsr asminstr FBCC: 20DF bra asmloop FBCE: FBCE: * Jump table for monitor routines that are usable by other programs. FBCE: org $ffc0 FFC0: 7EE6D0 jmp outbyte FFC3: 7EE6DE jmp outd FFC6: 7EE74A jmp scanbyte FFC9: 7EE70F jmp scanhex FFCC: 7EF6B9 jmp scanfact FFCF: 7EF709 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 f824 ACIACTL 00 e000 ACIADAT 00 e001 ACIAIRQ 02 e4f5 ACIASTA 00 e000 ACK 00 0006 ACKLOOP 02 ecbf ADDCHK 02 ea06 ADDR 02 029d ADECEND 02 f9b0 ADECLOOP 02 f9a7 ADJDIR 02 f8dc ADJIND 02 f8d9 ADJOPC 02 f8cb AINCEND 02 f9cb AINCLOOP 02 f9c2 AMODE 02 02c3 AREGS 02 f30a AREGU 02 f305 ARM 02 e98a ARM1 02 e98f ARM2 02 e9a0 ASM 02 fba4 ASMERR 02 fb5c ASMERRVEC 02 0298 ASMINSTR 02 f709 ASMLOOP 02 fbad ASMREGTAB 02 f2fb ASMTAB 02 f792 AUTODEC 02 f9ea AUTOINC 02 f9e0 BACKSP 02 e491 BLOCKMOVE 02 e44a BP1 02 e9ba BP2 02 e9c6 BPADDR 02 02a1 BPEXIT 02 e9d7 BPFULL 02 e9e8 BREAK 02 e9a6 BRERR 02 fb4a BRKMSG 02 e5ee BRKPOINTS 00 0004 BRMSG 02 e6b5 BS 00 0008 BSCMPEXIT 02 f76a BSCMPLOOP 02 f75eBSCMPLOWER 02 f773 BSRCHLOOP 02 f739 BUF0 02 0100 BUF1 02 0180 BUFLEN 00 0080 CAN 00 0018 CASEMASK 00 00df CB2 02 e702 CHECKOUT 02 eb0b CLEARIT 02 e9df CLRMSG 02 e5fd CLVAR 02 e434 CMDLINE 02 e558 CMDTAB 02 e580 COMMAPC 02 f610 CONVB 02 e6ee CONVEXIT 02 e705 CR 00 000d DBP1 02 e9f0 DBP2 02 e9fb DDEC1 02 f37b DDEC2 02 f380 DDEC3 02 f3ae DDEC4 02 f397 DDEC5 02 f3cc DDEC6 02 f3e0 DDEC7 02 f3f1 DDECFOUND 02 f3d0 DDECLOOP 02 f3a0 DEL 00 007f DELAY 02 0021 DH1 02 e770 DH2 02 e77d DH3 02 e796 DH4 02 e79e DH5 02 e7a4 DH6 02 e78c DISADEC1 02 f57e DISADEC2 02 f57a DISADECA 02 f580 DISADLOOP 02 f583 DISADR16 02 f47b DISADR8 02 f483 DISAILOOP 02 f59c DISAINC1 02 f590 DISAINC2 02 f58c DISAINCA 02 f592 DISARM 02 e970 DISARM1 02 e975 DISARM2 02 e981 DISAX 02 f5a6 DISBX 02 f5ad DISCOMMA 02 f557 DISDECODE 02 f36b DISDECTAB 02 f3faDISDECTAB1 02 f40e DISDIRECT 02 f604 DISDISP 02 f44e DISDISPTAB 02 f461 DISDX 02 f5b4 DISIDX 02 f53b DISIDX1 02 f565 DISIDX2 02 f56f DISIDXEND 02 f564 DISIDXREG 02 f52a DISIDXTAB 02 f614 DISIM16 02 f479 DISIM8 02 f475 DISINDEX 02 f55a DISINDIR 02 f55c DISINVAL 02 f5bb DISNNPC 02 f5fc DISNNX 02 f5d7 DISNPC 02 f5e3 DISNPCA 02 f5ea DISNX 02 f5c2 DISNX1 02 f5c7 DISNXNEG 02 f5d0 DISP16 02 e8b5 DISP8 02 e8a7 DISPBP 02 e9ed DISPREGS 02 e8c5 DISPUSH 02 f4b0 DISPUSH1 02 f4f3 DISPUSH2 02 f4ed DISPUSH3 02 f4ce DISPUSH4 02 f4deDISREGNAME 02 f51a DISREL16 02 f499 DISREL8 02 f48b DISTFR 02 f4f9 DISTFREND 02 f517DISTFRLOOP 02 f50e DISTFRSUB 02 f509 DLYLOOP 02 e4f9 DOA1 02 fab9 DOA2 02 fac8 DOADDR 02 faa5 DOAPCREL 02 face DOIMM 02 f987 DOINDEX 02 f9f5 DOPCREL 02 fa5c DOSPECIAL 02 f9a0 DPSETTING 02 02cd DR8A 02 f491 DREG1 02 f835 DREG2 02 f846 DRNEND 02 f529 DRNLOOP 02 f51e DUMP 02 e763 ENDIRQ 02 e4f6 ENDMSG 02 e6c5 ENDREC 02 ea66 ENDREC1 02 ea79 ENDSS 02 eb00 ENDVARS 02 02cf ENDVECS 02 e53e ENT1 02 e7c8 ENT2 02 e7ce ENTASC 02 e809 ENTDONE 02 e81a ENTER 02 e7bd ENTEXIT 02 e821 ENTL2 02 e800 ENTL3 02 e80d ENTLINE 02 e7f0 EOT 00 0004 EXPR 02 f69b EXPREND 02 f6b5 EXPREND1 02 f6b6 EXPRERR 02 fb50 EXPRMSG 02 e68e EXPRVEC 02 0295 FHEXLOOP 02 eb7c FILLER 02 02bb FIND 02 eb56 FINDHEX 02 eb76 FINDREG 02 fb6e FINDREGLOOP 02 fb75 FIRQVEC 02 0286 FRCMPS 02 fb79 FRCMPS1 02 fb85 FRFOUND 02 fb9d FRNEXTREG 02 fb93 FSTRLOOP 02 eb69 FULLMSG 02 e610 GETCHAR 02 0000 GETLINE 02 0006 GETPOLL 02 000fGETTIMEOUT 02 ec2d GO 02 e86a GT1 02 ec2f GTEXIT 02 ec3b HEX 02 e836 HEX1 02 e84e HEXDIGIT 02 e6c5 HEXEND 02 e860 HEXLOOP 02 e83e IMMBYTE 02 f7bc INITACIA 02 e452 INP 02 e824 INTVECTBL 02 e4ff INVMMSG 02 e67d INVMNEM 02 f778 IRQVEC 02 0289 IXFOUND 02 fa8f IXREGS 02 f33a JUMP 02 e879 LASTOK 02 002f LASTREC 02 e633 LASTTERM 02 02ba LAUNCH 02 e874 LBRA 02 f81d LBRA1 02 f80e LBRANCH 02 f80a LEA 02 f7d1 LENGTH 02 029f LF 00 000a LINEBUF 02 0200 LONGINDEX 02 fa4c LONGREL 02 fb32 MNCPDONE 02 f731 MNCPEXIT 02 f727 MNCPLOOP 02 f70e MNEMBSR 02 ef6b MNEMBUF 02 02c6 MNEMCP1 02 f722 MNEMFCB 02 f033 MNEMFOUND 02 f77e MNEMJSR 02 f06b MNEMSIZE 00 0093 MNEMTAB 02 ee63 MNFILLOOP 02 f72c MODEMSG 02 e69f MODERR 02 fb56 MODETAB 02 f34e MODETAB2 02 f35e MOVE 02 eb19 MVLOOP 02 eb4b NAK 00 0015 NEGOFFS 02 f54d NEWLINE 02 e4ad NMIVEC 02 028f NOCOMMA 02 f92e NOEXPR 02 f706 NOINDIR 02 f8fa NOLET 02 f720 NOOP 02 f434 OADIR 02 f875 OAIND 02 f873 OD1A 02 f431 ODB1 02 f63e ODPA 02 f43b OLDGETC 02 02b4 OLDPC 02 029b OLDPUTC 02 02b6 OLDPUTCR 02 02b8 ONEADDR 02 f859 ONEBYTE 02 f7b4 OPC1 02 02c0 OPCODE 02 02c1 OPCOFFS 02 f33e OPDEC1 02 f42e OPDEC2 02 f435 OPDECIDX 02 f43f OPDECPB 02 f439 OPERAND 02 02c4 OPSIZE 02 02cb OPSZ1 02 f94c OPSZ2 02 f94a OPSZ3 02 f962 OPSZ4 02 f967 OSCR 02 e4d4 OSDLY 02 e4f7 OSGETC 02 e45a OSGETL 02 e480 OSGETL1 02 e485 OSGETL2 02 e4a5 OSGETL3 02 e4b4 OSGETPOLL 02 e465 OSPUTC 02 e471 OSPUTL 02 e4c3 OSPUTL1 02 e4d1 OSPUTL2 02 e4ca OSVECTBL 02 e51a OUTBYTE 02 e6d0 OUTCOUNT 02 e4e1 OUTD 02 e6deOUTDECBYTE 02 f634 PCRELEND 02 fa6a PCRLONG 02 faf4 POLTRUE 02 e46e POS 02 f6a4 POSTBYTE 02 02c2 PPLOOP 02 f8b1 PREBYTE 02 02bf PROG 02 e898 PSEUDO 02 f8ca PURGE 02 ec41 PURGEIT 02 ecb6 PUSHPUL 02 f8a4 PUTBYTE 02 f7ae PUTCHAR 02 0003 PUTCLOOP 02 e473 PUTCOMMA 02 f4a8 PUTCR 02 000c PUTDOL 02 f4a4 PUTHASH 02 f4a0 PUTLINE 02 0009 PUTSPACE 02 f4ac PUTWORD 02 f7b1 RAMSTART 00 0400 RAMTOP 00 8000 READREC 02 ea31 REGINVAL 02 f337 REGLOOP 02 f4b7 REGS 02 e90c REGTAB 02 e966 RESET 02 e400 RR1 02 ea57 RR2 02 ea5c RSTVECS 02 ecd6 SAVESP 02 02bd SAVEVECS 02 ecc6 SB1 02 e762 SBRANCH 02 f7f7 SCAN2PARMS 02 e732 SCANACIDX 02 f91a SCANBYTE 02 e74a SCANCHAR2 02 f6cf SCANDEC 02 f6d3 SCANDLOOP 02 f6df SCANEND 02 f96f SCANEND2 02 f986 SCANEXIT 02 e708 SCANFACT 02 f6b9 SCANHEX 02 e70f SCANIXREG 02 fa7a SCANLAB 02 f930 SCANOPS 02 f8ed SCIDXLOOP 02 fa84 SCLOOP 02 e717 SDEXIT 02 f6ff SENDNAK 02 ec58 SENDREC 02 ea9f SET3 02 fa98 SET3A 02 faa4 SETREG 02 e91a SETSORG 02 ea91 SHORTIND1 02 fa3e SHORTINDEX 02 fa32 SHORTREL 02 fb0e SKIPSPACE 02 e6e7 SMSG 02 e621 SOFFS 02 02b2 SOH 00 0001 SORG 02 02b0 SP2 02 e749 SR1 02 e921 SR2 02 e92e SR3 02 e944 SR4 02 e954 SRCH1 02 eba7 SRCH2 02 ebac SRCH3 02 ebc6 SRCHLOOP 02 eb95 SREC 02 ea14 SRECERR 02 ea84 SS1 02 eab3 SS2 02 eac0 SS3 02 eaeb STAKREGS 02 e53eSTARTBLOCK 02 ec5d STARTOP 02 f8e5 STARTSRCH 02 eb8c STEPBP 02 02ad SWI2VEC 02 0283 SWI3VEC 02 0280 SWIVEC 02 028c TEMP 02 0024 TEMP2 02 0026 TEMP3 02 0028 TFREXG 02 f87b TIMER 02 002a TIMERIRQ 02 e4ea TRACE 02 e8a4 TWOBYTE 02 f7b8 UNADISHEX 02 f66e UNADISSPC 02 f67b UNASM 02 f644 UNASMLOOP 02 f65a UNCERT 02 02cc UNK 02 e5b4 UNKNOWN 02 e5de UNLAUNCH 02 e549 UNLAUNCH1 02 e550 WAITACK 02 ebf2 WAITACK2 02 ec1c WAITNAK 02 ec0a WELCOME 02 e5c1 XABORTIN 02 0018 XABTIN 02 ed2e XABTLOOP 02 ed3b XAMSG 02 e665 XCLOSEIN 02 001b XCLOSEOUT 02 001e XCLSDONE 02 ed64 XCLSEND 02 ed70 XCLSIN 02 ed71 XCLSLOOP 02 ed5c XCLSOUT 02 ed4e XCOUNT 02 0030 XEQ 02 ee49 XERRHAND 02 eded XERROR 02 eddd XERRVEC 02 0292 XGETC 02 edb4 XGETC1 02 edc7 XGETCTERM 02 edd3 XLOAD 02 ee36 XLODLOOP 02 ee3d XMCR 02 02bc XMODE 02 0031 XMODEM 02 edf4 XOPENIN 02 0012 XOPENOUT 02 0015 XOPIN 02 ece6 XOPOUT 02 ed09 XOPTS 02 ee4e XPACKNUM 02 002d XPUTC 02 ed7b XPUTC1 02 ed97 XPUTCR 02 ed99 XPUTCR1 02 eda6 XPUTCR2 02 edb1 XR1 02 ec7e XRCVBUF 02 ec49 XRCVEOT 02 ecbb XRLOOP 02 ec90 XRMSG 02 e650 XSABT 02 ec05 XSBINLOOP 02 ee24 XSENDBUF 02 ebca XSENDEOT 02 ec17 XSENDINIT 02 ec06 XSLOOP 02 ebdf XSMSG 02 e63e XSOK 02 ec03 XSS 02 ee2f XSUM 02 002e \end{verbatim} } \end{document}