view doc/origin/monitor.tex @ 86:4967d1acd34a

add sbc09.asm
author Shinji KONO <>
date Mon, 20 Aug 2018 00:48:11 +0900
parents 2088fd998865
line wrap: on
line source

\title{A macine language monitor for the 6809 Processor}
\author{L.C. Benschop}

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

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}

\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.


\chapter{Extending the built-in Assembler}

\chapter{Assembly listing of monitor program}
0000:                         ;Buggy machine language monitor and rudimentary O.S. version 1.0
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:                 * 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:                 *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:                 * 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:                 * 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:                 * 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:                 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:                 sorg            rmb 2           ;Origin address of S record entry.
02B2:                 soffs           rmb 2           ;Offset load adrr-addr in record
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:                 * 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:                 endvars         equ *
02CF:                 ramstart        equ $400        ;first free RAM address.
02CF:                 ramtop          equ $8000       ;top of RAM.
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:                 * 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:                 CASEMASK        equ $DF         ;Mask to make lowercase into uppercase.
02CF:                 * Monitor ROM starts here.
02CF:                                 org $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:                 * Initialize serial communications port, buffers, interrupts.
E452: C603            initacia        ldb #$03
E454: F7E000                          stb aciactl
E457: C635                            ldb #%00110101
E459: 39                              rts
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:                 ;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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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: 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:                 * Wait D times 20ms.
E4F7: D32B            osdly           addd timer+1
E4F9: 10932B          dlyloop         cmpd timer+1
E4FC: 26FB                            bne dlyloop
E4FE: 39                              rts             
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:                 * 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: 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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: DC24            scanexit        ldd temp
E70A: 301F                            leax -1,x
E70C: 0D26                            tst temp2
E70E: 39                              rts             <-- exit point of scanhex
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: 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:                 * 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:                 * 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:                 * 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:                 * 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:                 *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:                 *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:                 * 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:                 * 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:                 * 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:                 * This is the code for the T command, single step trace an instruction.
E8A4:                 * Syntax T
E8A4: 7EE558          trace           jmp cmdline
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:                 * 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:                 * 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:                 * 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: 43414244585955  regtab          FCC "CABDXYUPS "
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:                 * 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:                 * 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: 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * Wait until line becomes quiet.
EC41: 8603            purge           lda #3
EC43: BDEC2D                          jsr gettimeout
EC46: 24F9                            bcc purge
EC48: 39                              rts
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: 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: 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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:                 * 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: 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: 10FE02BD        xerrhand        lds savesp
EDF1: 7EE558                          jmp cmdline
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:                 * 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:                 mnemsize        equ (*-mnemtab)/8
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: 58595553        ixregs          fcc "XYUS"
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:                 * 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:                 * 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: 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: 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: 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: 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: 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: 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: 2C504352        commapc         fcc ",PCR"
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:                 * 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:                 * 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:                 * 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: 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:                 * 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: E7A0            putbyte         stb ,y+
F7B0: 39                              rts
F7B1: EDA1            putword         std ,y++
F7B3: 39                              rts
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:                 * 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:                 * Start scanning of operands.
F8E5: 9E28            startop         ldx temp3
F8E7: 7F02C3                          clr amode
F8EA: 7EE6E7                          jmp skipspace
F8ED:                 * amode settings in assembler: 1=immediate, 2=direct/extended, 3=indexed
F8ED:                 * etc. 4=pc relative, 5=indirect, 6=pcrelative and indirect.
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:                 * 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:                 * 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:                 * 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:                 * 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: 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:                 * 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:                 * 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:                 * 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:                 * 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:                                 end
0 Pass 2 errors.

      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
      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