*******************************************************************************
*
*       E V A L U A T I O N  M O N I T O R  FOR THE  M C 6 8 H C 0 5 A 6
*
*       THE MONITOR HAS THE FOLLOWING COMMANDS:
*
*       R --  PRINT REGISTERS.
*             FORMAT IS CCCCC AA XX PPP
*
*       P --  PROGRAM/EXAMINE MEMORY (RAM OR EEPROM).
*             *** SEE "V" COMMAND ***
*             TYPE P AAAA TO BEGIN,
*               THEN TYPE: =  -- TO RE-EXAMINE CURRENT
*                          ^  -- TO EXAMINE PREVIOUS
*                          CR -- TO EXAMINE NEXT
*                          DD -- NEW DATA
*               ANYTHING ELSE EXITS PROGRAM COMMAND.
*
*       G --  EXECUTE FROM ADDRESS.  FORMAT IS
*               G AAAA.  AAAA IS ANY VALID MEMORY ADDRESS.
*
*       S --  DISPLAY MACHINE STATE.  ALL IMPORTANT REGISTERS ARE
*               DISPLAYED.
*
*       D --  XFER (DUMP) 256 BYTES OF MEMORY OUT OF TO THE TERMINAL
*
*       V --  Vpp CHARGE PUMP ENABLE/DISABLE. (TOGGLE ACTION)
*             THE CHARGE PUMP MUST BE ENABLED BEFORE ATTEMPTING
*             ANY PROGRAMMING/ERASING OPERATION.
*
*       M --  FILL MEMORY BETWEEN START AND END ADDRESS WITH DATA. 
*             DOES A BYTE ERASE FIRST
*             TYPE : M SSSS EEEE DD
*
*       B --  BULK ERASE ALL EEPROM LOCATIONS. (SEE 'V' COMMAND)
*
*       T --  TRANSFER EXTERNAL EPROM CONTENTS TO EEPROM (BOOTSTRAP)
*             THE STANDARD BOOTSTRAP CIRCUIT MUST BE USED.
*
*       A --  ASSEMBLE/DIASSEMBLE AT A SPECIFIED ADDRESS (EEPROM INCLUDED)
*
*       L --  DOWNLOAD S-RECORD FILE INTO MEMORY.
*
*       CREATED FROM '805 EVAL PROGRAM - 9/9/85 NJA
*       REV 1.1 - MODIFIED "DELAY" TO CLEAR OPCOML. 6/6/86 BS.
*       REV 1.2 - ADDED A JUMPER TEST TO VECTOR INTO EEPROM UPON RESET
*                 AND ALL INTERRUPT VECTORS. 5/4/87 NAJI N.
*       REV 1.3 - ADDED EEPROM WRITE/ERASE CYCLING CODE WRITTEN BY
*                 BOB BOLLISH. 7/15/87
*       REV 1.4 - ADDED THE MEMORY FILL FUNCTION, COMBINED M AND P
*                 COMMANDS TO FORM P COMMAND, FIXED DOWNLOAD,
*                 BOB B. FIXED GATE STRESS.
*                 NAJI N. 3/16/88
*
******************************************************************************
*
*       SPECIAL EQUATES
*
*
CR      EQU     $0D     CARRIAGE RETURN
PROMPT  EQU     '.      PROMPT CHARACTER
FWD     EQU     CR      GO TO NEXT BYTE
BACKB   EQU     '^      GO TO PREVIOUS BYTE
SAME    EQU     '=      RE-EXAMINE SAME BYTE
*
*       CHARACTER CONSTANTS
LF      EQU     $0A     LINE FEED
BL      EQU     $20     BLANK
EOS     EQU     $00     END OF STRING
BUFEND  EQU     31
*
INITSP  EQU     $FF     INITIAL STACK POINTER VALUE
STACK   EQU     INITSP-5  TOP OF STACK
CTLS    EQU     $13        CONTROL-S (XOFF)
CTLQ    EQU     $11        CONTROL-Q (XON)
CTLX    EQU     $18        CONTROL-X (CANCEL)
CTLH    EQU     $08        CONTROL-H (BACK SPACE)
MASK    EQU     $1F        USER ADDRESS MASK, MSB
*
*       RAM VARIABLES
*
*
        ORG     $50
RAM     RMB     5
GET     RMB     5       4-BYTE NO-MANS LAND, SEE PICK AND DROP SUBROUTINES
XTEMP   RMB     1       X REG. TEMP FOR GETC,PUTC
DTEMP   RMB     3       START OF MODIFIABLE CODE (SEE DUMP)
DTEMPE  RMB     1       END OF MODIFIABLE CODE
TEMP    RMB     1     
TEMP1   RMB     1      
TEMP2   RMB     1      
BYTEON  RMB     1       Byte programming pulse width
SETTLE  RMB     1       Vpp settling time
ERASET  RMB     1       Bulk erase time
SPEED   RMB     1       Vpp timings flag. 0=FAST 1=SLOW
TOKEN   RMB     1
CODE     RMB       1                   COMMAND CODE
ERR      RMB       1                   ERROR CODE
BUFR     RMB       BUFEND              INPUT BUFFER
TOTAL    RMB       2                   2 BYTE NUMBER/LAST PARAMETER
PTR      RMB       1                   INPUT BUFFER PTR
CMDPT    RMB       1                   COMMAND NAME POINTER
ECHO     RMB       1                   INPUT ECHO FLAG
SAVOUT   RMB       1
SAVX     RMB       1                   SAVED X REGISTER
SAVA     RMB       1                   SAVED A REGISTER
SAVE     RMB       1                   SAVE DATA STORE
*
SSBP     RMB       4                   SSBP ADDRESSES
*
PROCPC   RMB       2                   PROCEED PC ADDR
NUMBYT   RMB       1                   NUMBER OF BYTES IN DIS-ASSEMBLY
OPTS     RMB       1                   DIS-ASSEMBLY TYPES
BRKFLG   RMB       1                   BREAK-KEY FLAG
*
*
*       I/0 REGISTER ADDRESSES
*
PORTA   EQU     $000    I/O PORT 0
PORTB   EQU     $001    I/O PORT 1
PORTC   EQU     $002    I/O PORT 2
PORTD   EQU     $003    I/O PORT 3
DDR     EQU        4    DATA DIRECTION REGISTER OFFSET
*
*       EQUATES NEEDED FOR ADDED EEPROM ROUTINES
*
BAUD    EQU     $0D     SCI baud rate register
BULK    EQU     4       BIT 4 of Programming register (Bulk operation enable)
CPEN    EQU     6       BIT 6 of Programming register (Charge pump enable)
DUALTH  EQU     $1A     MS.Byte of timer register
EEPGM   EQU     0       BIT 0 of Programming register (Vpp enable)
EEPGMN  EQU     1       BIT 1 of Programming register (Vpp enable)
ERASE   EQU     3       BIT 3 of Programming register (Erase enable)
LATCH   EQU     2       BIT 2 of Programming register (Latch arm)
OCF     EQU     6       BIT 6 of Timer Status register (Output compare flag)
OPCOMH  EQU     $16     MS.Byte of output compare register
OPCOML  EQU     $17     LS.Byte of output compare register
PROG    EQU     $1C     Programming register location
ROW     EQU     6       BIT 6 of Programming register (ROW operation enable)
SCCR1   EQU     $0E     SCI control register 1
SCCR2   EQU     $0F     SCI control register 2
SCSR    EQU     $10     SCI status register
SCIDAT  EQU     $11     SCI data register
TIMSR   EQU     $13     Timer status register
CHKSUM  EQU     PTR   Checksum byte
*
******************************************************************************
        ORG     $0900
*
*
*       STATE --- PRINT MACHINE STATE
*
*                A  B  C  D
*               DD DD DD DD
*
*       HEADER STRING FOR I/O REGISTER DISPLAY
*
IOMSG   FCB     CR,LF
        FCC     / A  B  C  D /
        FCB     CR,LF,EOS
*
STATE   CLRX
STATE2  LDA     IOMSG,X GET NEXT CHAR
        CMP     #EOS    QUIT?
        BEQ     STATE3  YES, NOW PRINT VALUES
        JSR     PUTC    NO, PRINT CHAR
        INCX            BUMP POINTER
        BRA     STATE2  DO IT AGAIN
*
*       NOW PRINT VALUES UNDERNEATH THE HEADER
*
STATE3  CLRX
PIO     LDA     ,X      START WITH I/O PORTS
        JSR     PUTBYT
        JSR     PUTS
        INCX
        CPX     #4      END OF I/O?
        BNE     PIO     NO, DO MORE
*
        JSR     PUTS
        BRA     MONIT    ALL DONE
*
*       PCC --- PRINT CONDITION CODES
*
*       STRING FOR PCC SUBROUTINE
*
CCSTR   FCC     /HINZC/
*
PCC     LDA     STACK+1 CONDITION CODES IN ACCA
        ASLA            MOVE H BIT TO BIT 7
        ASLA
        ASLA
        STA     GET     SAVE IT
        CLRX
PCC2    LDA     #'.
        ASL     GET     PUT BIT IN C
        BCC     PCC3    BIT OFF MEANS PRINT .
        LDA     CCSTR,X PICKUP APPROPRIATE CHARACTER
PCC3    JSR     PUTC    PRINT . OR CHARACTER
        INCX            POINT TO NEXT IN STRING
        CPX     #5      QUIT AFTER PRINTING ALL 5 BITS
        BLO     PCC2
        RTS
*
*      REGS --- PRINT CPU REGISTERS
*
REGS    JSR     PCC     PRINT CC REGISTER
        JSR     PUTS    SEPARATE FROM NEXT STUFF
        CLR     GET+1   POINT TO PAGE ZERO,
        LDA     #STACK+2
        STA     GET+2
        JSR     OUT2HS  CONTINUE PRINT WITH A
        JSR     OUT2HS  X AND FINALLY THE
        JSR     OUT4HS  PROGRAM COUNTER
        BRA     MONIT
*
*       FALL INTO MAIN LOOP
*
*       MONIT --- PRINT PROMPT AND DECODE COMMANDS
*
MONIT1  EQU     *
        BRCLR   7,PORTD,MONIT  IF MONITOR MODE, KEEP GOING
        JMP     $08FA   IN USER MODE, VECTOR TO EEPROM
MONIT   JSR     CRLF    GO TO NEXT LINE
        LDA     #PROMPT
        JSR     PUTC    PRINT THE PROMPT
        JSR     GETC    GET THE COMMAND CHARACTER
        AND     #%1111111 MASK PARITY
        JSR     PUTS    PRINT SPACE (WON'T DESTROY A)
        CMP     #'R     REGISTERS
        BEQ     REGS
        CMP     #'G     EXECUTE
        BEQ     EXEC
        CMP     #'M     MEMORY
        BEQ     MEMORY
        CMP     #'H     HELP INFORMATION
        BEQ     INFJMP
        CMP     #'A     ASSEMBLER/DISASSEMBLER
        BEQ     AS_DIS
        CMP     #'S     DISPLAY MACHINE STATE
        BNE     MONIT2
        JMP     STATE   COMMANDS ARE GETTING TOO FAR AWAY
*
MONIT2  EQU     *
        CMP     #'D     DUMP MEMORY
        BEQ     XFR
        CMP     #'V     Vpp CHARGE PUMP ENABLE/DISABLE
        BEQ     CHARGE
        CMP     #'B     BULK ERASE
        BEQ     BULKE
        CMP     #'P     PROGRAM EEPROM OR RAM
        BEQ     PROGIT
        CMP     #'T     TRANSFER PROGRAM INTO EEPROM
        BEQ     BOOT
        CMP     #'F     FAST/SLOW Vpp timings set-up
        BEQ     TIMING
        CMP     #'L     DOWNLOAD 
        BEQ     DLOAD
INFJMP  JMP     INFO    Else display menu if none of above
XFR     JMP     DMEM
CHARGE  JMP     CHARGP
BULKE   JMP     BULKER
MEMORY  JMP     FILMEM
BOOT    JMP     BOOTS
TIMING  JMP     TIMTOG
AS_DIS  JMP     ASMTOP
DLOAD   JMP     DOWN
*
*       EXEC --- EXECUTE FROM GIVEN ADDRESS
*
EXEC    JSR     GETBYT  GET HIGH NYBBLE
        BCS     MONIT    BAD DIGIT
        TAX             SAVE FOR A SECOND
        JSR     GETBYT  NOW THE LOW BYTE
        BCS     MONIT    BAD ADDRESS
        STA     TEMP2   PROGRAM COUNTER LOW
        STX     TEMP1   PROGRAM COUNTER HIGH
        LDA     #$CC    'JUMP'
        STA     TEMP
        JMP     TEMP
*
MONIT3  JMP     MONIT
*      PROGRAM --- PROGRAM/EXAMINE EEPROM OR RAM
*
PROGIT  JSR     GETBYT  BUILD ADDRESS
BADONE  BCS     MONIT3   BAD HEX CHARACTER
        STA     GET+1
        JSR     GETBYT
        BCS     BADONE   BAD HEX CHARACTER
        STA     GET+2   ADDRESS IS NOW IN GET+1&2
MEM2    JSR     CRLF    BEGIN NEW LINE
        LDA     GET+1   PRINT CURRENT LOCATION
        AND     #$1F    MASK UPPER 3 BITS (8K MAP)
        JSR     PUTBYT
        LDA     GET+2
        JSR     PUTBYT
        JSR     PUTS    A BLANK, THEN
        JSR     PICK    GET THAT BYTE
        JSR     PUTBYT  AND PRINT IT
        JSR     PUTS    ANOTHER BLANK,
        JSR     GETBYT  TRY TO GET A BYTE
        BCS     MEM3    MIGHT BE A SPECIAL CHARACTER
        JSR     IFEE    OTHERWISE, PUT IT AND CONTINUE
MEM4    JSR     BUMP    GO TO NEXT ADDRESS
        BRA     MEM2    AND REPEAT
MEM3    CMP     #SAME   RE-EXAMINE SAME?
        BEQ     MEM2    YES, RETURN WITHOUT BUMPING
        CMP     #FWD    GO TO NEXT?
        BEQ     MEM4    YES, BUMP THEN LOOP
        CMP     #BACKB  GO BACK ONE BYTE?
        BNE     XMONIT   NO, EXIT MEMORY COMMAND
        DEC     GET+2   DECREMENT LOW BYTE
        LDA     GET+2   CHECK FOR UNDERFLOW
        CMP     #$FF
        BNE     MEM2    NO UNDERFLOW
        DEC     GET+1
        BRA     MEM2
INFO    CLRX
INFO1   LDA     DUMP,X  GET CHARACTER
        BEQ     XMONIT  IF 00,RETURN
        JSR     PUTC    OUTPUT CHAR
        INCX
        BEQ     INFO2   DO NEXT PAGE
        JMP     INFO1
INFO2   LDA     DUMP+$100,X  GET CHARACTER
        BEQ     XMONIT  IF 00,RETURN
        JSR     PUTC    OUTPUT CHAR
        INCX
        BEQ     INFO3   DO NEXT PAGE
        JMP     INFO2
INFO3   LDA     DUMP+$200,X  GET CHARACTER
        BEQ     XMONIT  IF 00,RETURN
        JSR     PUTC    OUTPUT CHAR
        INCX
        BEQ     XMONIT  END OF DUMP SO RETURN
        JMP     INFO3
*
*       CONVENIENT TRANSFER POINT BACK TO MONIT
*
XMONIT   JMP     MONIT    RETURN TO MONIT
*
DMEM    LDA     #$D6    OPCODE FOR LDA OFFSET,X
        STA     DTEMP   SET UP MODIFIABLE CODE
        LDA     #$81    OPCODE FOR RTS
        STA     DTEMPE
DMEM2   JSR     GETBYT  GET HIGH BYTE
        BCS     XMONIT    BAD DIGIT
        STA     DTEMP+1  SET UP HIGH ADDRESS
        STA     TEMP1   SAVE FOR LATER
        JSR     GETBYT  NOW THE LOW BYTE
        BCS     XMONIT    BAD ADDRESS
        STA     DTEMP+2  SET UP LOW BYTE
        STA     TEMP    SAVE FOR LATER
        CLRX
DMEMN   JSR     CRLF
        LDA     TEMP1
        JSR     PUTBYT  SHOW ADDRESS
        LDA     TEMP
        JSR     PUTBYT
        ADD     #$10
        STA     TEMP    UPDATE ADRESS
        BNE     LO
        LDA     TEMP1
        ADD     #$01
        STA     TEMP1
LO      JSR     PUTS
        JSR     PUTS
DMEM5   JSR     DTEMP   EXECUTE MODIFIED CODE
        JSR     PUTBYT  Echo character to terminal
        JSR     PUTS
        INCX
        BEQ     XMONIT  ALL DONE
        TXA
        AND     #$0F    END OF THE LINE
        BNE     DMEM5
        BRA     DMEMN

*      UTILITIES
*
*      PICK --- GET BYTE FROM ANYWHERE IN MEMORY
*               THIS IS A HORRIBLE ROUTINE (NOT MERELY
*               SELF-MODIFYING, BUT SELF-CREATING)
*
*      GET+1&2 POINT TO ADDRESS TO READ,
*      BYTE IS RETURNED IN A
*      X IS UNCHANGED AT EXIT
*
PICK    STX     XTEMP   SAVE X
        LDX     #$D6    D6=LDA 2-BYTE INDEXED
        BRA     COMMON
*
*
*       DROP --- PUT BYTE TO ANY MEMORY LOCATION.
*                HAS THE SAME UNDESIRABLE PROPERTIES
*                AS PICK
*       A HAS BYTE TO STORE, AND GET+1&2 POINTS
*       TO LOCATION TO STORE
*       A AND X UNCHANGED AT EXIT
*
*
DROP    STX     XTEMP   SAVE X
        LDX     #$D7    D7=STA 2-BYTE INDEXED
*
*
COMMON  STX     GET     PUT OPCODE IN PLACE
        LDX     #$81    81=RTS
        STX     GET+3   NOW THE RETURN
        CLRX            WE WANT ZERO OFFSET
        JSR     GET     EXECUTE THIS MESS
        LDX     XTEMP   RESTORE X
        RTS             AND EXIT
*
*       BUMP --- ADD ONE TO CURRENT MEMORY POINTER
*
*       A AND X UNCHANGED
*
BUMP    INC     GET+2   INCREMENT LOW BYTE
        BNE     BUMP2   NON-ZERO MEANS  NO CARRY
        INC     GET+1   INCREMENT HIGH NYBBLE
BUMP2   RTS
*
*
*       OUT4HS --- PRINT WORD POINTED TO AS AN ADDRESS, BUMP POINTER
*                  X IS UNCHANGED AT EXIT
*
OUT4HS  BSR     PICK    GET HIGH NYBBLE
        AND     #$1F    MASK HIGH BITS
        BSR     PUTBYT  AND PRINT IT
        BSR     BUMP    GO TO NEXT ADDRESS
*
*       OUT2HS --- PRINT BYTE POINTED TO, THEN A SPACE. BUMP POINTER
*                  X IS UNCHANGED AT EXIT
*
OUT2HS  BSR     PICK    GET THE BYTE
OUT2HS1 STA     GET     SAVE A
        LSRA
        LSRA
        LSRA
        LSRA            SHIFT HIGH TO LOW
        BSR     PUTNYB
        LDA     GET
        BSR     PUTNYB
        BSR     BUMP    GO TO NEXT
        BSR     PUTS    FINISH UP WITH A BLANK
        RTS
*
*       PUTBYT --- PRINT A IN HEX
*               A AND X UNCHANGED
*
PUTBYT  STA     GET     SAVE A
        LSRA
        LSRA
        LSRA
        LSRA            SHIFT HIGH NYBBLE DOWN
        BSR     PUTNYB  PRINT IT
        LDA     GET
        BSR     PUTNYB  PRINT LOW NYBBLE
        RTS
*
*       PUTNYB --- PRINT LOWER NYBBLE OF A IN HEX
*               A AND X UNCHANGED, HIGH NYBBLE
*               OF A IS IGNORED.
*
PUTNYB  STA     GET+3   SAVE A IN YET ANOTHER TEMP
        AND     #$F     MASK OFF HIGH NYBBLE
        ADD     #'0     ADD ASCII ZERO
        CMP     #'9     CHECK FOR A-F
        BLS     PUTNY2
        ADD     #'A-'9-1 ADJUSTMENT FOR HEX A-F
PUTNY2  JSR     PUTC
        LDA     GET+3   RESTORE A
        RTS
*
*       CRLF --- PRINT CARRIAGE RETURN, LINE FEED
*                A AND X UNCHANGED
*
CRLF    STA     GET     SAVE
        LDA     #CR
        JSR     PUTC
        LDA     #LF
        BSR     PUTC
        LDA     GET     RESTORE
        RTS
*
*       PUTS --- PRINT A BLANK (SPACE)
*                A AND X UNCHANGED
*
PUTS    STA     GET     SAVE
        LDA     #BL
        BSR     PUTC
        LDA     GET     RESTORE
        RTS
*
*       GETBYT --- GET A HEX BYTE FROM TERMINAL
*
*       A GETS THE BYTE TYPED IF  IT  WAS  A  VALID  HEX  NUMBER,
*       OTHERWISE  A GETS THE LAST CHARACTER TYPED.  THE C-BIT IS
*       SET  ON  NON-HEX  CHARACTERS;   CLEARED   OTHERWISE.    X
*       UNCHANGED IN ANY CASE.
*
GETBYT  BSR     GETNYB  BUILD BYTE FROM 2 NYBBLES
        BCS     NOBYT   BAD CHARACTER IN INPUT
        ASLA
        ASLA
        ASLA
        ASLA            SHIFT NYBBLE TO HIGH NYBBLE
        STA     GET     SAVE IT
        BSR     GETNYB  GET LOW NYBBLE NOW
        BCS     NOBYT   BAD CHARACTER
        ADD     GET     C-BIT CLEARED
NOBYT   RTS
*
*       GETNYB --- GET HEX NYBBLE FROM TERMINAL
*
*       A GETS THE NYBBLE TYPED IF  IT  WAS  IN  THE  RANGE  0-F,
*       OTHERWISE  A  GETS THE CHARACTER TYPED.  THE C-BIT IS SET
*       ON  NON-HEX  CHARACTERS;   CLEARED   OTHERWISE.    X   IS
*       UNCHANGED.
*
GETNYB  BSR     GETC    GET THE CHARACTER
        AND     #%1111111 MASK PARITY
        STA     GET+3   SAVE IT JUST IN CASE
        SUB     #'0     SUBTRACT ASCII ZERO
        BMI     NOTHEX  WAS LESS THAN '0'
        CMP     #9
        BLS     GOTIT
        SUB     #'A-'9-1 FUNNY ADJUSTMENT
        CMP     #$F     TOO BIG?
        BHI     NOTHEX  WAS GREATER THAN 'F'
        CMP     #9        CHECK BETWEEN 9 AND A
        BLS     NOTHEX
GOTIT   CLC             C=0 MEANS GOOD HEX CHAR
        RTS
NOTHEX  LDA     GET+3   GET SAVED CHARACTER
        SEC
        RTS             RETURN WITH ERROR
*
*       S E R I A L   I / O   R O U T I N E S
*
*
*       DEFINITION OF SERIAL I/O LINES
*
*
*       GETC --- GET A CHARACTER FROM THE TERMINAL
*
*       A GETS THE CHARACTER TYPED, X IS UNCHANGED.
*
GETC    BRCLR   5,SCSR,*  WAIT FOR RDRF
        LDA     SCIDAT  Get character & clear RDRF bit
        TST     ECHO    ECHO DATA ?
        BEQ     GETCC
        JSR     PUTC    ECHO BACK
GETCC   AND     #$7F    MASK PARITY
        RTS             AND RETURN
*
*       PUTC --- PRINT A ON THE TERMINAL
*
*       X AND A UNCHANGED
*
PUTC    BRCLR   7,SCSR,*  WAIT FOR TDRE
        STA     SCIDAT    OUTPUT THE CHARACTER
        RTS
*
******************************************************************************
*                                                                            *
*                      E E P R O M   O P E R A T I O N S                     *
*                      =================================                     *
*                                                                            *
******************************************************************************
*
BULKER  CLRX            Point to erase check message
SPEW    LDA     ERAMSG,X Get a character
        CMP     #$04    Reached end of message?
        BEQ     SURE    Then make sure that user really wants to erase EEPROM
        JSR     PUTC    Else send the character to the terminal
        INCX            Point to next character
        BRA     SPEW    Keep sending characters until EOM is reached
*
ERAMSG  FCB     CR,LF
        FCC     *Do you really want to erase the EEPROM (Y/N)?*
        FCB     $04
*
SURE    JSR     GETC    Get the reply
        CMP     #'Y     Erase really wanted?
        BEQ     WIPE    Branch if yes
        CMP     #'y     Check lower case reply
        BEQ     WIPE
        JMP     MONIT   Return to monitor if erase not really wanted
*
WIPE    LDA     PROG    OK, erase really wanted so get current PROG state
        AND     #%01000000      Extract CPEN bit
        ORA     #%00011100      Combine with BULK, ERASE & LATCH
        STA     PROG    Restore to programming register
        STA     $0100   Write to Array to latch busses
        BSET    EEPGM,PROG      Apply Vpp  (IF CPEN WAS SET)
        BCLR    EEPGMN,PROG      Apply Vpp  (IF CPEN WAS SET)
        LDA     ERASET  Get erase time variable
        JSR     DELAY   Delay for that time
        BSET    EEPGMN,PROG      Remove Vpp
        BCLR    EEPGM,PROG      Remove Vpp
        LDA     SETTLE  Get Vpp settling time
        JSR     DELAY
        LDA     PROG    Get current PROG state
        AND     #%01000010      Extract CPEN bit
        STA     PROG    Clear every PROG bit but keep old CPEN and EEPGMN state
*
*       Now verify the contents were correctly erased
*       N.B. Vectors CANNOT be checked in monitor board.
*
        LDA     #$FF
        STA     PORTB           SET UP VERIFY DATA
        STA     PORTB+DDR
        STA     PORTA+DDR       AND ADDRESS
        LDA     #$20                    Reset LS.Address to $20
        STA     GET+2
        STA     PORTA                   Reset address bus to $0020
        CLR     GET+1                   Reset MS.Address to $00
        JMP     CHECK
*
******************************************************************************
*
TIMTOG  BRCLR   0,SPEED,GOSLOW Slow down timings if they are now fast
*
GOFAST  LDA     #2              Else speed up timings if they are slow
        STA     BYTEON          2mS byte program time
        LDA     #2              2mS Vpp settling time
        STA     SETTLE
        LDA     #10             10mS bulk erase time
        STA     ERASET
        LDA     #'F
        JSR     PUTC
        LDA     #'A
        JSR     PUTC
        LDA     #'S
        JSR     PUTC
        LDA     #'T
        JSR     PUTC
        CLR     SPEED           Set speed flag=FAST=0
        JMP     MONIT           Return to monitor.....
*
GOSLOW  LDA     #9              Slow down timings if they are fast
        STA     BYTEON          09mS byte program time
        LDA     #2              02mS Vpp settling time
        STA     SETTLE
        LDA     #100            100mS bulk erase time
        STA     ERASET
        LDA     #'S
        JSR     PUTC
        LDA     #'L
        JSR     PUTC
        LDA     #'O
        JSR     PUTC
        LDA     #'W
        JSR     PUTC
        COM     SPEED           Set speed flag=SLOW=1
        JMP     MONIT           Return to monitor.....
*
******************************************************************************
*
CHARGP  BRCLR   CPEN,PROG,CPON  Put charge pump on if it's off
*
CPOFF   BCLR    CPEN,PROG       Else turn it off if it's on
        LDA     #'O             Tell user it's now OFF
        JSR     PUTC
        LDA     #'F
        JSR     PUTC
        LDA     #'F
        JSR     PUTC
        JMP     MONIT           Return to monitor.....
*
CPON    BSET    CPEN,PROG       Enable charge pump
        LDA     #'O             Tell user it's now ON
        JSR     PUTC
        LDA     #'N
        JSR     PUTC
MONITX  JMP     MONIT           Return to monitor.....
*
******************************************************************************
*
FILMEM  JSR     GETBYT  BUILD START ADDRESS
        BCS     MONITX  BAD HEX CHARACTER
        STA     GET+1
        JSR     GETBYT
        BCS     MONITX  BAD HEX CHARACTER
        STA     GET+2   START ADDRESS IS NOW IN GET+1&2
        JSR	PUTS	PRINT SPACE
        JSR     GETBYT  BUILD END ADDRESS
        BCS     MONITX
        STA     SSBP+1
        JSR     GETBYT
        BCS     MONITX
        STA     SSBP+2  END ADDRES IS NOW IN SSBP+1:SSBP+2
        JSR   	PUTS	PRINT SPACE
        JSR	GETBYT	GET DATA BYTE TO BE PUT IN MEMORY
        STA 	SSBP
        JSR     CRLF    BEGIN NEW LINE
        LDA	#$C7
        STA 	GET	"STA" EXTENDED
        LDA	#$81	
        STA	GET+3	"RTS"
DONE2	LDA	SSBP	GET DATA
	JSR	IFEE	PROGRAM/WRITE IT
	JSR	BUMP	ADVANCE ADDRESS
	LDA	SSBP+1	GET END ADDRESS MSB
	CMP	GET+1
	BLO	DONE1	REACHED END ADDRESS
	BHI	DONE2	NOT DONE YET
	LDA	SSBP+2
	CMP	GET+2	COMPARE LSB
	BLO	DONE1	DONE.
	BRA	DONE2	DO NEXT BYTE
DONE1	JMP	MONIT
***
ZAP     STX     XTEMP   SAVE X
        BSET    LATCH,PROG Prepare to latch next data & address that is written
        LDX     #$D7    D7=STA 2-BYTE INDEXED
        STX     GET     PUT OPCODE IN PLACE
        LDX     #$81    81=RTS
        STX     GET+3   NOW THE RETURN
        CLRX            WE WANT ZERO OFFSET
        JSR     GET     EXECUTE THIS  (Write to array latches busses)
        BSET    EEPGM,PROG      Apply Vpp to EEPROM arrays
        BCLR    EEPGMN,PROG     Apply Vpp to EEPROM arrays
        LDA     BYTEON  Get Vpp pulse width for byte programming
        JSR     DELAY   Wait for that period
        BSET    EEPGMN,PROG     Remove Vpp
        BCLR    EEPGM,PROG      Remove Vpp
        LDA     SETTLE  Get Vpp settling time
        JSR     DELAY   Wait for Vpp to settle
        AND     #%01000010 Clear all bits but leave CPEN and EEPGMN intact
        STA     PROG
        LDX     XTEMP   RESTORE X
        RTS             AND EXIT
*
******************************************************************************
*
* DELAY N mS SUBROUTINE. ON ENTRY, ACCUMULATOR SHOULD CONTAIN THE TIME DELAY
* WANTED IN MILLISECONDS. AT THE END OF THE DELAY BIT 'OLVL' WILL BE CLOCKED
* TO THE 'TCMP' PIN.   ( ASSUMES 2MHz OSCILLATOR FREQUENCY ).
*
*
DELAY   ADD     DUALTH          ADD WANTED DELAY VALUE TO CURRENT TIMER COUNT
        STA     OPCOMH          STORE NEW VALUE BACK INTO MS.COMPARE REGISTER
        LDA     TIMSR           ACCESS TIMER STATUS REGISTER.......
        CLR     OPCOML          ...THEN WRITE TO LS.COMPARE REGISTER TO CLEAR OCF BIT.
HOLD    BRCLR   OCF,TIMSR,HOLD  NOW WAIT FOR COMPARE FLAG TO BE SET
        RTS                     RETURN AFTER WANTED DELAY
*
******************************************************************************
*                                                                            *
*               BOOTSTRAP EXTERNAL EPROM CONTENTS INTO EEPROM                *
*               =============================================                *
*                                                                            *
******************************************************************************
*
BOOTS   CLR     PORTB+DDR               Initialise PORT-B for reading EPROM
        LDA     #%11111111              Initialise PORT-A & C as outputs
        STA     PORTA+DDR
        STA     PORTC+DDR
*
        LDA     #$20                    Get initial PORT-A value
        STA     PORTA                   Set starting address to $0020
        STA     GET+2
        CLR     GET+1
        LDA     #%00100000              Get initial PORT-C value
        STA     PORTC                   Turn on 'PROGRAMMING' LED
*
PRGLOP  LDA     PORTB                   Read one EPROM byte
        JSR     ZAP                     Program one EEPROM byte
        BSR     NXTADR                  POINT TO NEXT ADDRESS TO BE PROGRAMMED
        BNE     PRGLOP                  KEEP PROGRAMMING UNTIL END IS REACHED
        LDA     #$20                    Reset LS.Address to $20
        STA     GET+2
        STA     PORTA                   Reset address bus to $0020
        CLR     GET+1                   Reset MS.Address to $00
        LDA     #%01100000   GET INITIAL LED STATUS FOR A VERIFY, AND ENABLE ROM
        STA     PORTC           PLACE LED AND ROM STATUS ON PORT PINS
*
CHECK   BCLR    5,PORTC         INDICATE EEPROM VERIFING
        JSR     PICK            Get a byte from the EEPROM
        CMP     PORTB           Compare to corresponding EPROM byte
        BNE     DIFFER          Branch if they don't match
PROCED  BSR     NXTADR          POINT TO NEXT ADDRESS TO BE COMPARED
        BNE     CHECK           KEEP CHECKING BYTES UP UNTIL EEPROM END
        BRA     END             Exit if end reached
*
DIFFER  BSET    5,PORTC         INDICATE EEPROM NOT VERIFIED
        STA     TEMP            Save incorrect byte
        LDA     GET+1           Get MS.Byte of incorrect address
        JSR     CRLF
        LDA     TEMP            Get back incorrect byte
        JSR     PUTBYT          Output incorrect byte
        JSR     PUTS
        LDA     PORTB           Read wanted byte
        JSR     PUTBYT          Output wanted byte
        JSR     PUTS
        LDA     GET+1           Get MS.Byte of incorrect address
        JSR     PUTBYT          Output MS. error address
        LDA     GET+2           Get LS.Byte of incorrect address
        JSR     PUTBYT          Output LS. error address
        BRA     PROCED
MON     JMP     MONIT           Return to monitor.......
*
END     BRA     MON 
*
******************************************************************************
*
*  NXTADR SUBROUTINE
*
*  COMPUTES NEXT EEPROM ADDRESS TO BE PROGRAMMED, VERIFIED, OR DUMPED.
*  PUTS THIS ADDRESS ON PORTS A (LS BYTE) AND C (MS BYTE) AND UPDATES
*  RAMSUB ALSO. SKIPS THE RAM, BOOTSTRAP AND UNUSED AREAS. RETURNS WITH
*  Z=1 IF THE COMPUTED ADDRESS IS = $0900, MEANING THAT A PASS THROUGH THE
*  MEMORY MAP HAS BEEN COMPLETED. OTHERWISE Z=0.
*
NXTADR  LDA     GET+1           GET MS.BYTE OF LAST ADDRESS USED
        BNE     NOT04F          BRANCH IF NOT IN PAGE ZERO EEPROM AREA
        LDX     GET+2           GET LS.BYTE OF LAST ADDRESS USED
        CPX     #$4F            HAS THE LAST BYTE OF PAGE ZERO EEPROM BEEN ACCESSED?
        BNE     NOT04F          BRANCH IF HAVE NOT JUST ACCESSED $004F
*
* MUST HAVE JUST ACCESSED LAST PAGE ZERO EEPROM LOCATION IF HERE SO
* FORCE NEXT ADDRESS INCREMENT TO POINT TO MAIN EEPROM AREA AT $0100.
*
        LDX     #$0100-1        POINT TO ADDRESS BELOW THE ONE WANTED
        STX     GET+2           PLACE IN LOCATION THAT WILL BE INCREMENTED
        STX     PORTA           PRESET PORTA PRIOR TO INCREMENT
*
* 16 BIT ADDRESS INCREMENT
*
NOT04F  INC     GET+2           INCREMENT LS. ADDRESS BYTE
        INC     PORTA           UPDATE LS.ADDRESS AT PORT A
        BNE     GOBACK          RETURN IF A PAGE BOUNDARY WAS NOT REACHED
        INCA                    INCREMENT MS. ADDRESS IF BOUNDARY WAS REACHED
        STA     GET+1           UPDATE MEMORY POINTER
*
* LOOK OUT FOR HAVING GONE THROUGH THE ENTIRE MEMORY MAP.
*
        CMP     #$09            WAS THAT THE END OF EEPROM ( $0900 )?
        BEQ     GOBACK          EXIT WITH Z=1 IF THE END WAS REACHED.
*
*
* COMBINE MS. ADDRESS BYTE WITH OLD TSC & LED LEVELS THEN UPDATE PORT C
*
        LDA     PORTC           GET OLD MS. ADDRESS AND CONTROL LINES
        AND     #%11100000      MASK OUT ADDRESS LINES, LEAVING CONTROL 
LINES
        ORA     GET+1           COMBINE OLD CONTROL LINES WITH NEW ADDRESS
        STA     PORTC           UPDATE PORT C
GOBACK  RTS
*
******************************************************************************
*
*      RESET --- POWER ON RESET ROUTINE
*
RESET   EQU     *
        BRCLR   7,PORTD,RESET1  IF MONITOR MODE, GO ON
        JMP     $08FD           USER MODE, VECTOR TO EEPROM
RESET1  BRSET   5,PORTD,RESET2  IF NOT WRITE ERASE CYCLING, MONITOR
        JMP     BEGWE 
*
RESET2  LDA     #%00110000      Prescaler/13, Rate /1 ==> 9600 @ PH2 = 2MHz  
        STA     BAUD            Set baud rate for SCI
        LDA     #%00000000      Set SCI for 8 Data bits communication
        STA     SCCR1
        LDA     #%00001100      Enable transmitter and receiver
        STA     SCCR2
*
        LDA     #$1
        STA     SPEED   Set default Vpp timings to SLOW. Set flag=1
        LDA     #9      Get default EEPROM programming pulse width
        STA     BYTEON  Save it
        LDA     #2      Get default Vpp settling time
        STA     SETTLE  Save it
        LDA     #100    Get default bulk erase time
        STA     ERASET  Save it
*
*       PRINT SIGN-ON MESSAGE
*
        LDA     #$FF
        STA     ECHO    ECHO DATA
        CLRX
BABBLE  LDA     MONMSG,X   GET NEXT CHARACTER
        CMP     #EOS    LAST CHAR?
        BEQ     MSTART  YES, START MONITOR
        JSR     PUTC    AND PRINT IT
        INCX            ADVANCE TO NEXT CHAR
        BRA     BABBLE  MORE MESSAGE
*
MSTART  JMP     MONIT1
*
*       MONMSG --- POWER UP MESSAGE
*
MONMSG     FCB     CR,LF,LF
        FCC     /EVALUATION MONITOR AND PROGRAMMER FOR THE 68HC05A6 (REV 1.4)/
        FCB     CR,LF
        FCC     /FOR HELP ,TYPE H/
        FCB     EOS
DUMP    FCB     $0A,$0D
        FCC     /THE MONITOR HAS THE FOLLOWING COMMANDS:/
        FCB     $0A,$0D
        FCC     *A --  ASSEMBLE/DISASSEMBLE.*
        FCB     $0A,$0D
        FCC     *B --  BULK ERASE ENTIRE EEPROM.*
        FCB     $0A,$0D
        FCC     /D --  DUMP 256 BYTES OF MEMORY./
        FCB     $0A,$0D
        FCC     /G --  EXECUTE FROM ADDRESS./
        FCB     $0A,$0D
        FCC     /H --  HELP/
        FCB     $0A,$0D
        FCC     'L --  DOWNLOAD S-RECORD INTO MEMORY.'
        FCB     $0D,$0A
        FCC     *M --  MEMORY FILL WITH DATA.*
        FCB     $0A,$0D
        FCC     *P --  PROGRAM/EXAMINE EEPROM OR RAM.*
        FCB     $0A,$0D
        FCC     /R --  REGISTER DISPLAY./
        FCB     $0A,$0D
        FCC     /S --  DISPLAY MACHINE STATE./
        FCB     $0A,$0D
        FCC     /T --  TRANSFER A PROGRAM INTO EEPROM./
        FCB     $0A,$0D
        FCC     *V --  Vpp CHARGE PUMP ENABLE/DISABLE.*
        FCB     $0A,$0D
        FCB     $00

*==============================================================================
*
*  PRINT DOUBLE BYTE CONTAINED IN GET+1 : GET+2
*
PRTAD    LDA       GET+1               GET MSB
         AND       #MASK               MASK MSB TO PC RANGE
         JSR       PUTBYT              PRINT IT
         LDA       GET+2               GET LSB
         JSR       PUTBYT              PRINT IT
         RTS                           RETURN
*==============================================================================
*  UPDATE LONG ADDRESS ROUTINES
*
*    ROUTINE TO INCREMENT LONG ADDRESS
*
UPMEMX   ADD       GET+2               UPDATE ADDR CONTENTS
         STA       GET+2               STORE UPDATED VALUE (LSB)
         CLRA
UPIT     ADC       GET+1               ADD CARRY FROM LSB TO MSB
STORIT   STA       GET+1               STORE UPDATED MSB
         RTS
*
*    ROUTINE TO DECREMENT LONG ADDRESS
*
BAMEM    LDA       #1
BAMEMX   STA       SAVE                SAVE DEC CNTR
         LDA       GET+2               GET ADDR LSB
         SUB       SAVE                UPDATE ADDR CONTENTS
         STA       GET+2               STORE UPDATED VALUE (LSB)
         LDA       GET+1               GET ADDR MSB
         SBC       #$00                SUBTRACT CARRY FROM LSB TO MSB
         BRA       STORIT              MASK AND STORE
*==============================================================================
*  COPY DOUBLE BYTE ADDRESS FROM CMD:CMD+1
*
COPYAD   LDA       GET+1               GET MSB FOR MOVE
         AND       #MASK               MASK MSB TO PC RANGE
         STA       ,X                  STORE IT
         LDA       GET+2               GET LSB FOR MOVE
         STA       1,X                 STORE IT
         RTS                           RETURN
*
*   COPY DOUBLE BYTE ADDRESS TO CMD:CMD+1
*
COPYTA   LDA       ,X                  GET MSB FOR MOVE
         STA       GET+1               STORE IT
         LDA       1,X                 GET LSB FOR MOVE
         STA       GET+2               STORE IT
         RTS                           RETURN
*
* THIS ROUTINE COMPARES TWO ADDRESSES AND SETS EQUAL STATUS BIT IF:
*   A) GET+1:GET+2 > GET+3:GET+4
*
CHKDNE   LDA       GET+3               GET END ADDR. MSB
         CMP       GET+1               LESS THAN LOWER ADDR?
         BLO       ATEND               YES, END SEARCH
         BHI       OUTIS               NO, GREATER THAN LOWER ADDR.
         LDA       GET+4               NO, EQUAL, GET END ADDR LSB
         CMP       GET+2               LESS THAN LOWER ADDR.?
         BLO       ATEND               YES, END SEARCH
         LDA       #$01                NOT END
OUTIS    RTS
*
ATEND    CLRA                          SET END (EQUAL STATUS BIT)
         RTS
*******************************************************************************
*                                                                             *
*                     TRACE/DIS-ASSEMBLY OVERHEAD                             *
*                                                                             *
*         +--------+--------+--------+--------+                               *
*         | INDXED | IMMED  | INH(X) | INH(A) |  <--- INST TYPE (OPTS)        *
*         +--------+--------+--------+--------+                               *
*              3        2        1        0      <--- BIT                     *
*                                                                             *
*==============================================================================
*   THIS ROUTINE WILL CALCULATE THE NUMBER OF BYTES AT A PC ADDRESS
*
CLCBYT   CLR       NUMBYT              SET 1 BYTE COUNT
         CLR       OPTS                RESET INST TYPES
         JSR       PICK                GET OP-CODE AT PC
         STA       SAVE                SAVE IT
         AND       #$0F                GET LSN OF OP-CODE
         TAX                           PUT IT IN 'X' REG
         LDA       SAVE                RESTORE OP-CODE
         AND       #$F0                GET MSN OF OP-CODE
*
*  DETERMINE NUMBER OF BYTES IN COMMAND BY THE OP-CODE
*
         BNE       TST10               MSN = 0 ?
         JMP       BR3BYT              YES, 'BTB' VARIETY  (3)
TST10    CMP       #$10                NO, MSN = 1 ?
         BEQ       TT2BYT              YES, 'BSC' VARIETY (2)
         CMP       #$20                NO, IS MSN = 2 ?
         BNE       TST70               NO
         JMP       BR2BYT              YES, 'REL' VARIETY  (2)
*
*  CHECK FOR MSN <= 7.  HASH OUT BAD OP-CODES.
*
TST70    CMP       #$70                NO, MSN > 7 ?
         BHI       GTR7                YES
         TSTX                          NO, CHECK FOR BAD CODES, X0 ?
         BEQ       OKCDE               YES, GOOD CODE
         CMP       #$40                CHCK FOR MUL INSTR.
         BNE       RESUM               NO, RESUME
         CMPX      #$02
         BEQ       IS1BYT              YES, IT IS MUL INSTR.
RESUM    CMPX      #$02                NO, X1/X2 ?
         BLS       BADCDE              YES, BAD CODE
         CMPX      #$05                NO, X5 ?
         BEQ       BADCDE              YES, BAD CODE
         CMPX      #$0B                NO, XB ?
         BEQ       BADCDE              YES, BAD CODE
         CMPX      #$0E                NO, XE ?
         BNE       OKCDE               NO, GOOD CODE
BADCDE   INC       ERR                 YES, BAD CODE
         RTS                           RETURN
*
*  MSN = 1/2/3/4/5/6/7.  CODE IS OK.  GET NUMBER OF BYTES.
*
OKCDE    CMP       #$30                IS MSN = 3 ?
         BEQ       TT2BYT              YES, 'RMW(DIR)' VARIETY (2)
         CMP       #$40                NO, IS MSN = 4 ?
         BEQ       OBJA                YES, 'RMW(INH(A))' VARIETY (1)
         CMP       #$50                NO, IS MSN = 5 ?
         BEQ       OBJX                YES, 'RMW(INH(X))' VARIETY (1)
         BSET      3,OPTS              NO, SET 'X'-INDEX FLAG
         CMP       #$60                IS MSN = 6 ?
         BEQ       TT2BYT              YES, 'RMW(IX1)' VARIETY (2)
         BRA       IS1BYT              NO, MSN = 7, 'RMW(IX)' VARIETY (1)
*
OBJA     BSET      0,OPTS              SET 'RMW(INH(A))' FLAG
OBJX     BSET      1,OPTS              SET 'RMW(INH(X))' FLAG
         BRA       IS1BYT              1 BYTE
*
*  MSN = 8/9/A/B/C/D/E/F.  GET NUMBER OF BYTES
*
GTR7     CMP       #$80                IS MSN = 8 ?
         BEQ       IS80                YES, 'CTRL(INH)' VARIETY (1)
         CMP       #$90                NO, IS MSN = 9 ?
         BNE       CHKA                NO
         CMPX      #$06                YES, IS LSN <= 6 ?
         BLS       BADCDE              YES, BAD CODE
         CMPX      #$0E                NO, IS LSN = E ?
         BEQ       BADCDE              YES, BAD CODE
*==============================================================================
*  INSTRUCTION LENGTH = 1 BYTE.
*
IS1BYT   LDA       #$01                NO, 'CTRL(INH)' VARIETY (1)
         BRA       BP3                 SET IT
*
*  MSN = A/B/C/D/E/F.  FIND BAD OP-CODES.
*
CHKA     CMP       #$A0                MSN = A ?
         BNE       CHKB                NO
         CMPX      #$0D                YES, BSR ?
         BEQ       TT2BYT              YES
         CMPX      #$07                NO, LSN <= 7 ?
         BEQ       BADCDE              YES, BAD CODE
         CMPX      #$0C                NO, LSN = C ?
         BEQ       BADCDE              YES, BAD CODE
         CMPX      #$0F                NO, LSN = F ?
         BEQ       BADCDE              YES, BAD CODE
         BSET      2,OPTS              NO, SET IMMEDIATE FLAG
TT2BYT   BRA       IS2BYT              'RM(IMM)' VARIETY (2)
*
*  MSN = B/C/D/E/F.
*
CHKB     CMP       #$B0                NO, IS MSN = B ?
         BEQ       IS2BYT              YES, 'RM(DIR)' VARIETY (2)
         CMP       #$C0                NO, IS MSN = C ?
         BEQ       IS3BYT              YES, 'RM(EXT)' VARIETY (3)
         BSET      3,OPTS              NO, SET 'X'-INDEXED FLAG
         CMP       #$D0                IS MSN = D ?
         BEQ       IS3BYT              YES, 'RM(IX2)' VARIETY (3)
         CMP       #$E0                NO, IS MSN = E ?
         BEQ       IS2BYT              YES, 'RM(IX1)' VARIETY (2)
*
*  OP-CODE MSN = F, CHECK FOR LSN = C/D  (JMP/JSR)
*
ISF0     BSR       CHKCD               NO, 'RM(IX)' VARIETY (1), IS LSN = C/D ?
         BNE       IS1BYT              NO, SET BREAK
*         LDX       #OFFX               YES, INDEXED, NO OFFSET
*         JSR       GETINR              GET USER 'X' REGISTER
         BRA       BP3                 USE IT AS JUMP DESTINATION
*
*  OP-CODE MSN = 8, CHECK FOR LSN = 0/1/3 (RTI/RTS/SWI)
*
IS80     DECX                          IS OP-CODE = 'RTI' ?
         BMI       ISRTI               YES
         BEQ       ISRTS               NO, IS OP-CODE = 'RTS' ?
         CMPX      #$02                NO, IS OP-CODE = 'SWI' ?
         BNE       MAYBAD              NO
*
*   'SWI' INSTRUCTION.  GET BREAK ADDR FROM USER.
*
ISSWI    EQU       *
*ISSWI    JSR       GETSWI              YES, 'SWI', GET VECTOR
         CLRX                          SET NO 'X' INDEX FLAG
         BRA       GETRTN
*
*  CHECK FOR BAD CODES (REST BAD IF NMOS, CHECK FOR 'STOP'/'WAIT' IF CMOS)
*
MAYBAD   CMPX      #$0C                NO, IS LSN <= D ?
         BLS       BADCDE              YES, BAD OP-CODE
         BRA       IS1BYT              NO, ('STOP'/'WAIT') (CMOS VERSION)
*
*  'RTI'/'RTS' INSTRUCTION.  GET BREAK ADDR FROM USER.
*
ISRTI    EQU       *
*ISRTI    LDX       #OFFRTI             'RTI', SET TO ACCESS UPC
*         BRA       GETRTN
*
ISRTS    EQU       *
*ISRTS    LDX       #OFFRTS             'RTS', SET TO ACCESS UPC
GETRTN   RTS
*==============================================================================
*  TEST LSN OF OP-CODE FOR $C OR $D  (JMP/JSR) INSTRUCTIONS
*
CHKCD    CMPX      #$0C                LSN = C ?
         BEQ       ISCD                YES
         CMPX      #$0D                NO, LSN = D ?
ISCD     RTS                           SET EQ BIT ACCORDINGLY
*==============================================================================
*  INSTRUCTION LENGTH = 3 BYTES.  CHECK FOR LSN = C/D (JMP/JSR)
*
IS3BYT   INC       NUMBYT              SET 3 BYTE COUNT
         INC       NUMBYT
         BSR       CHKCD               IS LSN = C/D ?
         BEQ       ISCD2               YES, 'JMP'/'JSR'
         LDA       #$03                NO, SET FOR 3 BYTE
BP3      JSR       UPMEMX              GET BREAK ADDR
*
BP2      LDX       #SSBP               SET BREAKPOINT ADDRESS
         JSR       COPYAD
         RTS
*
*  OP-CODE MSN = C/D, LSN = C/D (JMP/JSR (EXT/IX2))
*
ISCD2    CLRX                          SET NO INDEXED
         CMP       #$C0                IS MSN = C ?
         BEQ       JMP1                YES, NO INDEX
*         LDX       #OFFX               NO, D, SET 'X' INDEX
JMP1     JSR       BUMP                SET TO NEXT MEMORY ADDR
*         JSR       GET2                GET TWO BYTES FROM MEMORY
*TSTIND   CLRA                          PRESET 'X' OFFSET
*         TSTX                          'X' INDEXED ?
*         BEQ       NOXIND              NO
*         JSR       GETINR              YES, GET 'X' REGISTER CONTENTS
*NOXIND   STA       SAVA                STORE 'X' INDEX
*         JSR       COPYC1              GET BREAK ADDR
*         LDA       SAVA                GET 'X' INDEX OFFSET
         BRA       BP3                 SET BREAK ADDR
*==============================================================================
*  INSTRUCTION LENGTH = 2 BYTES.  CHECK FOR LSN = C/D (JMP/JSR/BSR)
*
IS2BYT   INC       NUMBYT              SET 2 BYTE COUNT
         BSR       CHKCD               IS LSN = C/D ?
         BNE       NOTCD1              NO
         CMP       #$A0                YES, IS MSN = A ?
         BEQ       BR2BYT              YES, 'BSR(REL)'
         BHI       GRTA0               NO, GREATER THAN A ?
NOTCD1   LDA       #$02                NO, SET BREAK FOR 2 BYTES
         BRA       BP3
*
GRTA0    CMP       #$B0                OP-CODE MSN = B ?
         BNE       ISE0                NO, MUST BE $E
*
*  OP-CODE MSN = B, LSN = C/D  (JMP/JSR DIRECT)
*
*         JSR       GET1                YES, GET DATA AT NEXT LOCATION
*OFF0     CLR       CMD+2               CLEAR DESTINATION ADDR
*         CLR       CMD+3
*         BRA       NOXIND              GET DIRECT ADDR
*
*  OP-CODE MSN = E, LSN = C/D  (JMP/JSR IX1)
*
ISE0     CLR       GET+3               SET 8-BIT INDEX
*         LDX       #OFFX               SET OFFSET FOR 'X'-INDEX
*         JSR       GET1                GET MEMORY CONTENTS
         BRA       BP3                 GO GET 'X'
*==============================================================================
*  CONDITIONAL BRANCH INSTRUCTIONS (AND 'BSR') SET TWO BREAKS (DON'T CHECK CCR)
*
BR2BYT   LDA       #$01                SET FOR 2 BYTE BRANCH INST
         BRA       DO2BP
*
BR3BYT   LDA       #$02                SET FOR 3 BYTE BRANCH INST
DO2BP    STA       NUMBYT              SET BYTE COUNT
         INCA                          UPDATE ADDR TO NEXT INST
         JSR       UPMEMX
         LDX       #SSBP+2             SAVE ADDR AS 'DROP THROUGH' BREAK
         JSR       COPYAD
         JSR       BAMEM               BACKUP ADDR TO BRANCH OFFSET
         JSR       PICK                GET OFFSET DATA BYTE
         TAX                           SAVE DATA
         JSR       BUMP                RESET ADDR TO NEXT INST
         TXA                           RESTORE OFFSET DATA
         TSTA                          IS IT NEGATIVE ?
         BPL       BP3                 NO
         DEC       GET+1               YES, ADJUST BRANCH TO ADDR MSB
         BRA       BP3                 SET SSBP
*******************************************************************************
*                                                                             *
*                      BUFFER INPUT ROUTINE                                   *
*                                                                             *
*==============================================================================
*  FILL INPUT BUFFER ROUTINE
*
NEWBUF   JSR       CRLF
FILBUF   LDA       #'>                 PRINT PROMPT
         JSR       PUTC   
FLTAPE   CLRX                          CLEAR BUFFER INDEX
NXT      JSR       GETC                GET CHAR
         CMP       #CTLX               CONTROL-X ?
         BEQ       NEWBUF              YES, CANCEL LINE
         CMP       #CTLH               CONTROL-H?
         BNE       STIKIT              NO
         CPX       #$00                IS IT BEGINNING OF BUFFER?
         BEQ       BSP1                YES, DON'T DO ANYTHING
         DECX                          DECREMENT POINTER
BSP1     BRA       NXT                 GET NEXT CHARACTER
*
STIKIT   STA       BUFR,X              STORE IT
         INCX                          INC INDEX
         CMPX      #BUFEND-1           MAX CHARS ENTERED ?
         BEQ       FULL                YES, THAT'S ALL ALLOWED
         CMP       #$0D                <CR> ?
         BNE       NXT                 NO, CONTINUE
FULL     LDA       #$0D                INSURE <CR>
         STA       BUFR,X                AS LAST CHAR
         CLR       PTR                 INIT BUFFER PTR
         RTS                           RETURN
*==============================================================================
*  GET CHAR FROM INPUT BUFFER ROUTINE
*
GETCHR   STX       SAVE                SAVE X REGISTER
         LDX       PTR                 GET BUFFER PTR
         LDA       BUFR,X              GET NEXT CHAR
         INC       PTR                 UPDATE BUFFER PTR
         LDX       SAVE                RESTORE X
         STA       SAVA                STORE CHAR
         RTS                           RETURN
*=============================================================================
* MAKE ASCII CHAR. UPPER CASE
*
LOWCAS   CMP       #$60                LOWER CASE ?
         BLS       LOWCC               NO, STORE IN BUFFER
         SUB       #$20                YES, CHANGE TO UPPER CASE
         STA       SAVA
LOWCC    RTS
*******************************************************************************
*                                                                             *
*                         NUMBER EVALUATION ROUTINE                           *
*                                                                             *
*==============================================================================
*  EVALUATE NUMBER ROUTINE
*
EVNMB    CLR       TOTAL               CLEAR NUMBER DATA AREA
         CLR       TOTAL+1
         JSR       GETCHR              GET CHAR, STORE IN SAVA
         CMP       #'$                 IS IT '$' ?
         BNE       EVASC               NO, TAKE THIS CHAR
*
EVLT     JSR       GETCHR              NO, GET CHAR FROM BUFFER
EVASC    JSR       LOWCAS              MAKE UPPER CASE
         CLR       SAVOUT              RESET VALID NUMBER FLAG
         DEC       SAVOUT
         SUB       #$30                LESS THAN 0 ?
         BMI       OUT                 YES
         CMP       #$09                NO, GREATER THAN 9 ?
         BLS       GOOD                NO, OK
         SUB       #$07                YES, COULD BE A-F
         CMP       #$09                GREATER THAN $0A ?
         BLS       OUT                 NO
         CMP       #$0F                IN RANGE A-F ?
         BHI       OUT                 NO
*
GOOD     STA       SAVOUT              SAVE VALID HEX NIBBLE
         LDA       TOTAL               GET CURRENT MSB
         LDX       TOTAL+1             GET CURRENT LSB OF TOTAL
         LSLX                          SHIFT MSN OF LSB TO LSN OF MSB
         ROLA
         LSLX
         ROLA
         LSLX
         ROLA
         LSLX
         ROLA
         STA       TOTAL               MAKE NEW MSB
         TXA                           GET CURRENT LSB OF TOTAL
         ORA       SAVOUT              ADD IN NEW NIBBLE
         STA       TOTAL+1             MAKE NEW LSB
         LDX       SAVE                RESTORE 'X' REGISTER (SAVED IN GETCHR)
         TST       DDR                 HOST I/O ?
         BNE       OUT                 YES.
         BRA       EVLT
*
OUT      RTS                           DONE
*******************************************************************************
*                                                                             *
*                     SINGLE LINE DIS-ASSEMBLER                               *
*                                                                             *
*******************************************************************************
DISASM   LDX       #PROCPC             SAVE PC ADDR
         JSR       COPYAD
*
*    INITIALIZE DIS-ASSEMBLY LINE OUTPUT
*
         JSR       CRLF                START NEW LINE
         JSR       PRTAD               PRINT OPEN ADDRESS
         LDA       #$20                LOAD 'A' WITH SPACE
         LDX       #29                 CLEAR 30 CHARS OF BUFFER
CLRBF    STA       BUFR,X              STORE A SPACE
         DECX                          DONE ?
         BPL       CLRBF               NO
*
         JSR       CLCBYT              GET NUMBER OF BYTES FROM OP-CODE
         JSR       DISASM1             RESTORE PC ADDR
*
*    PUT DATA IN BUFFER FOR DISPLAY
*
         LDA       NUMBYT              GET NUMBER OF BYTES
         STA       SAVE                SAVE IT
         STA       TOKEN               SAVE IT FOR EXIT
         LDX       #$02                SET PTR TO BUFFER
         STX       PTR
PTNXT    JSR       GM                  GET DATA AT PC AND PUT IN BUFFER
         INC       PTR                 PUT A SPACE AFTER IT
         JSR       BUMP                UPDATE ADDR
         DEC       SAVE                DONE ?
         BPL       PTNXT               NO
         JSR       DISASM1             YES, RESTORE PC ADDR
*
*    INVALID OP-CODE IS AN 'FCB'
*
         TST       ERR                 BAD OP-CODE ?
         BEQ       NOFCB               NO
         JSR       BAMEM               YES, BACKUP MEMORY
         INC       NUMBYT              SET 1 BYTE (FOR DIS-ASSEMBLY)
         LDX       #38                 SET INDEX TO 'FCB' TEXT OFFSET
         BRA       TOUTC               DO IT !!
*
*    DETERMINE INSTRUCTION FORMAT
*
NOFCB    JSR       PICK                GET DATA AT ADDR
         AND       #$0F                MASK MSN
         TAX                           SAVE LSN IN 'X'
         JSR       PICK                GET DATA
         CMP       #$0F                IS MSN = 0 ?
         BHI       NOTBRC              NO
*=============================================================================
*   BRCLR/BRSET ROUTINES
*
BRCS     STA       SAVE                SAVE OP-CODE
         LDX       #23                 SET BUFFER INDEX TO 23
         STX       PTR
         JSR       COMMAD              PUT IN A ',$'
         JSR       DOREL0              PUT IN BRANCH TO ADDRESS
         CLRX                          SET BRCLR/BRSET INDEX TO LOOKUP
*
CMN      STX       CMDPT               SAVE LOOKUP INDEX
         LDX       #18                 SET BUFFER INDEX TO 18
         STX       PTR
         LDA       SAVE                RESTORE OP-CODE
         BRCLR     0,SAVE,ISSET        'CLR' TYPE ?
         INC       CMDPT               YES, SET LOOKUP INDEX TO 'CLR'
*
ISSET    LSRA                          GET BIT BEING SET/CLEARED/TESTED
         JSR       MAKASC              PUT IT IN BUFFER
         JSR       COMMAD              PUT IN ',$'
*
         JSR       UGM                 UPDATE ADDR/GET DATA/PUT IN BUFFER
DUIT     CLR       NUMBYT              SET NO BYTES TO DO
         LDX       CMDPT               GET LOOKUP INDEX
         LDX       ODTBL,X             GET INDEX
TOUTC    BRA       OUTCDE              PUT INST IN BUFFER
*
NOTBRC   CMP       #$1F                NO, MSN = 1 ?
         BHI       NOTBCS              NO
*=============================================================================
*  BSET/BCLR ROUTINES
*
BCS      SUB       #$10                ADJUST OP-CODE FOR 'BSET'/'BCLR'
         STA       SAVE                SAVE OP-CODE
         LDX       #$02                SET INDEX TO LOOKUP TABLE FOR 'BSET'
         BRA       CMN                 GET DIRECT ADDR
*
*
NOTBCS   CMP       #$2F                MSN = 2 ?
         BHI       NOTREL              NO
         TXA                           YES, RELATIVE BRANCH
         ADD       #$05
         BRA       RELBR
*
NOTREL   CMP       #$7F                NO, MSN > 7 ?
         BHI       GT80                YES
         LDX       LOTBL,X             NO, ACCESS LOWER TABLE
         BRA       OUTCDE
*
GT80     CMP       #$9F                MSN > 9 ?
         BHI       GTA0                YES
*
         CMP       #$8F                NO, IS IT $8F (WAIT) ? (CMOS VERSION)
         BNE       GETX                NO                     (CMOS VERSION)
         LDX       #$02                YES,                   (CMOS VERSION)
*
GETX     LDX       SPTBL,X             NO, ACCESS SPECIAL INST TABLE
         BRA       OUTCDE
*
GTA0     CMP       #$AD                'BSR' INST ?
         BNE       NOTBSR              NO
         LDA       #$04                YES, SET OFFSET FOR 'BSR'
*=============================================================================
*  BSR/RELATIVE BRANCH ROUTINE
*
RELBR    STA       CMDPT               SAVE INST POINTER
         LDX       #18                 SET BUFFER POINTER TO 18
         STX       PTR
         JSR       DOREL               PUT BRANCH ADDR IN BUFFER
         BRA       DUIT                SET TO PRINT INST
*
*  INSTRUCTIONS WITH MSN > $7 PROCESSED HERE
*
NOTBSR   LDX       HITBL,X             ACCESS HIGH TABLE
*
*   PUT INSTRUCTION TEXT IN BUFFER
*
OUTCDE   STX       CODE                GET INST CODE
         CLR       SAVE                CLEAR NUMBER OF INSTS FOUND
         CLRX                          RESET POSITION TABLE INDEX
LODA     LDA       POSFMT,X            GET POSITION
         CMP       #$0F                END OF INST ?
         BHI       CKCD                YES
ADX      INCX                          NO, GO TO NEXT POSITION
         BRA       LODA                CONTINUE
*
*    CHECK INSTRUCTION INDEX AGAINST DESIRED INDEX
*
CKCD     AND       #$0F                AT END, MASK END BIT
         STA       CMDPT               SAVE HIGHEST CHAR POSITION
         LDA       SAVE                GET NUMBER OF INSTS FOUND SO FAR
         CMP       CODE                EQUAL TO ONE LOOKING FOR ?
         BEQ       FNDIT               YES, FOUND IT !
         INC       SAVE                NO, UPDATE NUMBER OF INSTS FOUND
         BRA       ADX                 KEEP LOOKING
*
*    GET INSTRUCTION MNEMONIC FROM TABLE
*
FNDIT    LDA       POSFMT,X            GET POSITION
         AND       #$0F                MASK OFF FORMAT
         CMP       CMDPT               EQUAL TO CHAR POSITION LOOKING FOR ?
         BHI       LOOKS               NO, KEEP LOOKING
         LDA       INSTS,X             YES, GET CHAR
         AND       #$7F                MASK FOR LAST CHAR
         STX       SAVX                STORE TABLE INDEX
         STA       SAVE                SAVE CHAR
         LDA       CMDPT               GET CHAR POSITION
         ADD       #12                 INST STARTS AT INDEX 12 IN BUFFER
         TAX                           STORE BUFFER INDEX
         LDA       SAVE                RESTORE INST CHAR
         STA       BUFR,X              PUT IT IN BUFFER
         DEC       CMDPT               DEC CHAR POSITION
         BMI       OUTOF               DONE ?
         LDX       SAVX                NO, RESTORE TABLE INDEX
LOOKS    DECX                          DECREMENT TABLE INDEX
         BRA       FNDIT               LOOK AGAIN
*
*    DETERMINE RMW(INH(A)/INH(X))
*
OUTOF    BRSET     0,OPTS,DOA          IS THIS A 'RMW(INH(A))' COMMAND ?
         BRCLR     1,OPTS,NOTDO        NO, IS IT A 'RMW(INH(X))' COMMAND ?
         LDA       #'X                 YES, INSERT 'X'
         BRA       DOXA
DOA      LDA       #'A                 'RM(INH(A))', INSERT 'A'
DOXA     STA       BUFR+15             PUT IN BUFFER
*
*    DETERMINE IF IMMEDIATE OPERAND
*
NOTDO    LDX       #18                 SET OPERAND BUFFER INDEX TO 18
         STX       PTR
         BRCLR     2,OPTS,DOOP1        IMMEDIATE INST ?
         LDA       #'#                 YES, PUT '#' IN BUFFER
         BSR       STRU
*
*    PUT OPERAND IN BUFFER
*
DOOP1    TST       NUMBYT              OPERAND ?
         BEQ       NOOP                NO
         BSR       DOLLAR              YES, PUT '$' IN BUFFER
DOOP     JSR       BUMP                UPDATE ADDR/GET DATA
         JSR       PICK
         DEC       NUMBYT              MORE TO DO ?
         BMI       NOOP                NO
         BEQ       NOMASK              YES, TWO BYTES ?
         AND       #MASK               YES, MASK MSN
NOMASK   BSR       MAKHEX              NO, PUT DATA IN BUFFER
         BRA       DOOP                YES, GET NEXT BYTE IN OPERAND (IF ANY)
*
*    DETERMINE IF INDEX SPECIFIED
*
NOOP     BRCLR     3,OPTS,PTBUF        NO, INDEXED ?
         LDA       #',                 YES, PUT ',' IN BUFFER
         BSR       STRU
         LDA       #'X                 PUT 'X' IN BUFFER
         BSR       STRU
*
*    PRINT DIS-ASSEMBLY BUFFER
*
PTBUF    CLRX                          RESET BUFFER INDEX
NXTOX    LDA       BUFR,X              GET BUFFER CHAR
         JSR       PUTC                PRINT BUFFER CHAR
         INCX                          UPDATE BUFFER INDEX
         CMPX      #29                 DONE ?
         BLS       NXTOX               NO
*         LDX       #SSTOP              YES, RESET ANY SSBP ADDRS
*         JSR       CLEAR
         CLR       ERR                 RESET INVALID OP-CODE FLAG
*
*    POINT TO START OF DIS-ASSEMBLY
*
DISASM1  LDX       #PROCPC             RESTORE PC ADDR
         JSR       COPYTA
         RTS                           RETURN
*******************************************************************************
*                                                                             *
*                   DIS-ASSEMBLY OVERHEAD ROUTINES                            *
*                                                                             *
*==============================================================================
*  FORMAT ASCII OUTPUT TO BUFFER ROUTINE
*
UGM      JSR       BUMP                UPDATE MEMORY ADDR
GM       JSR       PICK                GET DATA AT ADDR
MAKHEX   LDX       PTR                 GET BUFFER POINTER
         STA       SAVA                SAVE DATA TO FORMAT
         BSR       DOMSB               FORMAT MSN
         LDA       SAVA                RESTORE DATA BYTE
         AND       #$0F                GET LSN
         BRA       MAKASC              FORMAT LSN
*
DOMSB    LSRA                          SHIFT OUT LSN
         LSRA
         LSRA
         LSRA
MAKASC   ADD       #$30                OFFSET FOR ASCII
         CMP       #$39                A-F ?
         BLS       STRU                NO
         ADD       #$07                YES, ADJUST TO 'A'-'F'
STRU     STA       BUFR,X              STORE CHAR
         INCX                          INC BUFFER POINTER
         STX       PTR                 SAVE IT
         RTS
*=============================================================================
*  PUT ',' AND/OR '$' INTO DIS-ASSEMBLY BUFFER
*
COMMAD   LDA       #',                 STORE ',' IN BUFFER
         BSR       STRU
DOLLAR   LDA       #'$                 STORE '$' IN BUFFER
         BSR       STRU
         RTS                           RETURN
*============================================================================
*  RETRIEVE/INSERT BRANCH TO ADDRESS ROUTINE
*
DOREL    BSR       DOLLAR              PUT '$' IN BUFFER
DOREL0   LDA       SSBP                GET SAVED BRANCH DESTINATION ADDR
         AND       #MASK               MASK MSB TO PC RANGE
         BSR       MAKHEX              FORMAT IN BUFFER
         LDA       SSBP+1              DO LSB
         BSR       MAKHEX
         RTS
*==============================================================================
*    INSTRUCTION LOOK-UP TABLES
*
LOTBL    FCB       48,0,47,33,46,0
         FCB       53,4,45,52,35,0,39
         FCB       66
         FCB       0,31
*
HITBL    FCB       63
         FCB       32,57,34,2,15,43
         FCB       60,37,0,50,1,41
         FCB       42,44
         FCB       62
*
ODTBL    FCB       26,24,27,6,28
BRTBL    FCB       23,25,11,17,5,7
         FCB       21,8,9,10,22,19
         FCB       18,20,14,13
*
SPTBL    FCB       55,56,68
         FCB       64
         FCB       0,0,0,65,29,58,30,59
         FCB       54,49,61
         FCB       67
*******************************************************************************
*                                                                             *
*                      LINE-BY-LINE ASSEMBLER                                 *
*                                                                             *
*******************************************************************************
*ASMTOP   DEC       TOKEN               MUST BE 1 TOKEN ONLY
*         BNE       ISERRX              NOT 1, ERROR
ASMTOP   CLR       BRKFLG              CLEAR '.' TERMINATOR FLAG
         JSR       GETBYT
         STA       GET+1               SAVE MSB OF ADDRESS
         JSR       GETBYT              GET LSB OF ADDRESS
         STA       GET+2
*
ASM      JSR       DISASM              DIS-ASSEMBLE CURRENT LINE
         CLR       NUMBYT              CLEAR NUMBER OF BYTES IN ASSEMBLY
         JSR       FILBUF              GET LINE
         JSR       GETCHR              READ FIRST CHAR, SAVE IN SAVA
         CMP       #$0D                IS IT <CR> ?
         BNE       NOTD                NO
TONXT    LDA       TOKEN               YES, UPDATE TO NEXT ADDR
         INCA                          ADJUST
         JSR       UPMEMX
         BRA       ASM                 CONTINUE
*
*    CHECK FOR TERMINATOR
*
NOTD     CMP       #'.                 IS FIRST CHAR = '.' ?
         BEQ       ATOPX               YES, STOP
         DEC       PTR                 POINT TO FIRST CHAR
         CLR       CMDPT               CLEAR CHAR INDEX
         CLR       CODE                CLEAR OP-CODE
*
*    VALIDATE INSTRUCTION MNEMONIC
*
         LDX       #$FF                RESET CHAR TABLE PTR
GOT      JSR       GETCHR              GET INST CHAR
         JSR       LOWCAS              MAKE UPPER CASE
NEXTCD   INCX                          UPDATE TABLE INDEX
         LDA       POSFMT,X            GET POSITION INDEX
         CMP       #$0F                LAST CHAR IN INST ?
         BLS       NOEND               NO
         AND       #$0F                YES, MASK IN CASE LAST POSITION
         INC       CODE                UPDATE NUMBER OF INSTS FOUND
NOEND    CMP       CMDPT               CHAR AT SAME CHAR POSITION AS READ ?
         BEQ       FNDCD               YES TEST FOR EQUAL
         BHI       NEXTCD              NO, LOWER ?
ISERRX   EQU       *
*ISERRX   INC       ERR                 YES, ERROR
ATOPX    JMP       MONIT
*
FNDCD    LDA       INSTS,X             GET INST CHAR
         BEQ       ISERRX              END OF TABLE, ERROR
         AND       #$7F                NO, MASK IF LAST CHAR
         CMP       SAVA                EQUAL TO READ CHAR ?
         BHI       ISERRX              CHAR ALPHA LT TABLE, ERROR
         BNE       NEXTCD              CHAR ALPHA GT TABLE, TRY NEXT CHAR
         LDA       INSTS,X             CHARS EQUAL, LAST CHAR ?
         BMI       GOODCD              YES, GOOD INST
         INC       CMDPT               NO, INC CHAR INDEX
         BRA       GOT                 CONTINUE
*
*    VALID INSTRUCTION.  GET FORMAT/OP-CODE
*
GOODCD   LDA       POSFMT,X            GET INST FORMAT
         LSRA                          IT IS IN MSN, SHIFT IT TO LSN
         LSRA
         LSRA
         LSRA
         STA       SAVX                SAVE FORMAT
         LDX       CODE                GET INST CODE
         DECX                          DECREMENT FOR 0
         LDA       OPCDE,X             INDEX TO OP-CODES
         STA       CODE                SAVE OP-CODE
*
*    IF FORMAT = 4, TEST FOR RMW(INH(A)/INH(X))
*
         LDA       SAVX                RESTORE FORMAT
         CMP       #$04                IS IT 4 ?
         BNE       NOTAX               NO
         JSR       GETCHR              YES, COULD BE 'RMW(INH(A)/INH(X))'
         JSR       LOWCAS              MAKE UPPER CASE
         CMP       #'A                 IS NEXT CHAR = 'A' ?
         BEQ       FNDA                YES, 'MMA' FORM
         CMP       #'X                 NO, IS IT 'X' ?
         BNE       TST0D               NO
*
         LDA       #$20                'X', ADJUST OP-CODE BY $20
         BRA       TSTIT
FNDA     LDA       #$10                'A', ADJUST OP-CODE BY $10
TSTIT    ADD       CODE                ADD TO OP-CODE
         STA       CODE                SAVE OP-CODE
         LDA       #$01                SET TO FORMAT 1
         STA       SAVX                STORE IT
*
*    TEST VALID INSTRUCTION TERMINATOR (<SP> OR <CR>)
*
NOTAX    JSR       GETCHR              GET NEXT CHAR
TST0D    CMP       #'.                 IS IT '.' ?
         BEQ       ISTERM
         CMP       #$0D                NO, IS IT <CR> ?
         BNE       TSTSP
ISTERM   LDA       SAVX                YES, GET FORMAT
         DECA                          IS IT ONE ?
         BNE       ISERRX              NO, ERROR
         DEC       PTR                 YES, BACKUP POINTER
         BRA       NOT0D               CONTINUE
*
TSTSP    CMP       #$20                IS CHAR = <SP> ?
         BNE       ISERRX              NO, ERROR
*
*    JUMP VIA INSTRUCTION FORMAT
*
NOT0D    LDA       SAVX                RESTORE INST FORMAT
         LSLA                          ADJUST TO JUMP TABLE
         ADD       SAVX
         TAX
FMTJMP   JMP       FMTJMP,X            GO TO IT !!
*
         JMP       FMT1                NO OPERANDS
         JMP       FMT2                BRCLR/BRSET
         JMP       FMT3                REL BRANCH
         JMP       FMT4                DIR/INDX 0 OFF/IND 8 OFF
         JMP       FMT5                ASSEMBLER DIRECTIVES
         JMP       FMT6                INDEXED
         JMP       FMT7                INDEXED/IMMEDIATE
*==============================================================================
*   BRCLR/BRSET
*
FMT8     BSR       GETBIT              GET BIT TO SET/CLEAR
         JSR       EVNMB               EVALUATE MEM LOCATION
         TST       TOTAL               MUST BE DIRECT
         BNE       TERRA               NOT, ERROR
         LDA       SAVA                RESTORE TERM CHAR
         CMP       #',                 IS IT A ',' ?
TERRA    BNE       ISERRA              NO, ERROR
         LDA       TOTAL+1             YES, SAVE DIR ADDR
         STA       SAVX
         LDA       #$02                SET 3 BYTE COMMAND
         BRA       FMT31
*==============================================================================
*  RELATIVE BRANCH
*
FMT3     LDA       #$01                SET 2 BYTE COMMAND
FMT31    STA       NUMBYT              SAVE NUMBER OF BYTES
*         JSR       GETCHR              GET NEXT CHAR
*         CMP       #'*                 IS IT '*' (PC RELATIVE BRANCH) ?
*         BNE       NOTSTR              NO
**
**  DESTINATION ADDR IS PC RELATIVE
**
*         JSR       GETCHR              YES, GET NEXT CHAR
*         CMP       #$0D                IS IT <CR> ?
*         BNE       NOTHRE              NO
*         DEC       PTR                 SET POINTER BACK
*         BRA       REL                 USE CURRENT LC AS BRANCH DEST
**
**  PC RELATIVE +/-
**
*NOTHRE   STA       CMDPT               SAVE '+'/'-'
*         JSR       EVNMB               GET NUMBER OF BYTES TO OFFSET BY
*         TST       TOTAL               GREATER THAN $FF ?
*         BNE       ISERRA              YES, ERROR
*         LDA       TOTAL+1             NO, GET NUMBER OF BYTES
*         LDX       CMDPT               RESTORE '+'/'-'
*         CMPX      #'-                 MINUS ?
*         BEQ       MINUS               YES
*         CMPX      #'+                 NO, PLUS ?
*         BNE       ISERRA              NO, ERROR
**
*         JSR       UPMEMX              YES, ADD OFFSET TO ADDR
*         BRA       REL
**
*MINUS    JSR       BAMEMX              SUBT OFFSET FROM ADDR
*REL      LDX       #TOTAL              STORE BRANCH TO ADDR
*         JSR       COPYAD
*         JSR       DISASM1             RESTORE CURRENT LC ADDR
*         BRA       RLBR
**
**  DESTINATION ADDR IS ABSOLUTE
**
*NOTSTR   DEC       PTR                 NOT PC RELATIVE
         JSR       EVNMB               EVALUTE DESTINATION ADDR
RLBR     LDA       NUMBYT              GET NUMBER OF BYTES IN INST
         INCA                          ADJUST
         JSR       UPMEMX              UPDATE PC FOR OFFSET CALCULATION
         LDA       TOTAL               SAVE DESTINATION ADDR
         STA       GET+3
         LDA       TOTAL+1
         STA       GET+4
         JSR       CHKDNE              DESTINATION > SOURCE ?
         BNE       LTHAN               NO
*
*  BRANCH IS BACKWARD
*
         LDA       GET+4               YES, BACKWARD BRANCH
         JSR       BAMEMX              BACK UP
         LDA       GET+3               SUBTRACT FOR MSB
         SUB       GET+1
         BNE       ISERRA              NOT ZERO, ERROR
         LDA       GET+2               GET LSB (OFFSET)
         NEGA                          NEGATIVE OFFSET
         BMI       PUTIN               ERROR IF NOT MINUS
ISERRA   JMP       ISERRX              ERROR
*
*  BRANCH IS FORWARD
*
LTHAN    LDA       GET+4               GET DESTINATION
         SUB       GET+2               SUBTRACT SOURCE
         STA       GET+2               SAVE OFFSET
         LDA       GET+3               ADJUST FOR MSB
         SBC       GET+1
         BNE       ISERRA              ERROR IF NOT ZERO
         LDA       GET+2               GET OFFSET
         BMI       ISERRA              ERROR IF NEGATIVE
*
PUTIN    STA       TOTAL+1             SAVE OFFSET
         LDA       SAVX                RESTORE DIR ADDR (FROM BRSET/BRCLR)
         STA       TOTAL
         JMP       ENDLIN              PUT IN MEMORY
*==============================================================================
*     BCLR/BSET
*
FMT2     BSR       GETBIT              GET BIT IN QUESTION
         JMP       ISIMM               EVALUATE DIR
*
*      VERIFY AND CALCULATE BIT OFFSET
*
GETBIT   JSR       EVNMB               EVALUATE BIT VALUE
         LDA       TOTAL+1             GET LSB
         AND       #$0F                MASK OFF LSN
         CMP       #0                  LESS THAN '0' ?
         BLO       ISERRC              YES, ERROR
         CMP       #7                  NO, GREATER THAN '7' ?
         BHI       ISERRC              YES, ERROR
         ASLA                          NO, MULT BY 2
         ADD       CODE                ADD IN OP-CODE BASE
         STA       CODE                SAVE IT
         LDA       SAVA                GET NEXT CHAR
         CMP       #',                 IS IT ',' ?
         BNE       ISERRB              NO, ERROR
         RTS                           RETURN
*==============================================================================
*     DIR, INDEXED WITH 0 OFFSET OR INDEXED WITH 8-BIT OFFSET
*
FMT4     JSR       GETCHR              GET NEXT CHAR
         CMP       #',                 IS IT ',' ?
         BNE       NOTDX               NO, MUST BE DIRECT
         CLRA                          YES, ADJUST OP-CODE FOR 0 INDEX
         BRA       INDXN               STORE IT
*
NOTDX    INC       NUMBYT              INC INST BYTE COUNT
         DEC       PTR                 BACK UP PTR
         JSR       EVNMB               DIRECT, EVALUATE DEST
         TST       TOTAL               GREATER THEN $FF ?
         BEQ       CKIND               NO, DIRECT
ISERRC   BRA       ISERRB              YES, ERROR
*==============================================================================
*  INDEXED/EXTENDED
*
FMT6     JSR       GETCHR              GET CHAR
         BRA       TST1D               SKIP IMMEDIATE
*==============================================================================
*  IMMEDIATE/INDEXED/EXTENDED
*
FMT7     JSR       GETCHR              GET CHAR, SAVE IN SAVA
         CMP       #'#                 IMMEDIATE ?
         BEQ       ISIMM               YES
*          BEQ       FCBS                YES
TST1D    CMP       #',                 NO, INDEXED NO OFFSET ?
         BEQ       CKIND               YES
         INC       NUMBYT              NO, INC ASSEMBLY BYTE COUNT
         DEC       PTR                 POINT BACK
         JSR       EVNMB               EVALUTE ADDR, SAVE IN TOTAL:TOTAL+1
         LDA       #$10                ADJUST OP-CODE FOR DIR
         TST       TOTAL               EXTENDED ?
         BEQ       NOTEXT              NO
         INC       NUMBYT              YES, INC ASSEMBLY BYTE COUNT
         ADD       #$10                ADJUST OP-CODE FOR EXTENDED
*
*  SAVE ADJUSTED OP-CODE
*
NOTEXT   ADD       CODE                ADD OP-CODE BASE
         STA       CODE                SAVE NEW OP-CODE
CKIND    LDA       #$10                SET OP-CODE UPDATE
INDXN    STA       SAVX
         LDA       SAVA                RESTORE TERM CHAR
         CMP       #',                 IS IT ',' ?
         BNE       ENDLIN              NO
*
*    TEST VALID INDEX SPECIFICATION
*
INDXNO   JSR       GETCHR              GET NEXT CHAR
         JSR       LOWCAS              MAKE UPPER CASE
         CMP       #'X                 IS IT 'X' ?
         BNE       ISERRB              NO, ERROR
         LDA       SAVX                YES, GET OP-CODE BASE UPDATE
         BRSET     1,NUMBYT,STR        EXTENDED ?
         ADD       #$20                NO, ADD FOR DIRECT
         BRSET     0,NUMBYT,STR        DIRECT ?
         ADD       #$20                NO, ADD FOR NO OFFSET
STR      ADD       CODE                ADD TO CODE
         STA       CODE                STORE UPDATED OP-CODE
         BRA       FMT1
*
*    VERIFY <CR> TO END LINE
*
AFINIS   DEC       BRKFLG
FMT1     JSR       GETCHR              GET NEXT LAST
ENDLIN   LDA       SAVA                RESTORE LAST CHAR
         CMP       #$0D                IS IT <CR> ?
         BEQ       OK0D
         CMP       #'.                 NO, IS IT '.' ?
         BEQ       AFINIS
ISERRB   JMP       ISERRX              NO, ERROR
*
*    STORE OP-CODE/OPERAND DATA IN MEMORY
*
OK0D     JSR       DISASM1             YES, RESTORE START PC
         LDA       CODE                GET OP-CODE
PUTIT    JSR       IFEE                STORE BYTE
         JSR       BUMP                UPDATE ADDR PTR
         DEC       NUMBYT              DONE ?
         BMI       DISIS               YES
         CLRX                          NO, SET INDEX
         BRSET     0,NUMBYT,ZERO
         INCX
ZERO     LDA       TOTAL,X             GET BYTE TO STORE
         BRA       PUTIT               STORE IT
*
DISIS    JSR       DISASM1             RESTORE PC ADDR
         JSR       DISASM              DISASSEMBLE NEW LINE
         TST       BRKFLG              IF '.' TERMINATOR, ALL DONE
         BNE       BTOPX
         JMP       TONXT               CONTINUE
BTOPX    JMP       MONIT               DONE
*
*==============================================================================
*      ASSEMBLER DIRECTIVES
*
FMT5     BRA       ISERRB              NO ASSEMBLER DIRECTIVES
*
ISIMM    JSR       EVNMB               GET BYTE
         TST       TOTAL               IS IT GREATER THEN $FF ?
         BNE       ISERRB              YES, ERROR
         DEC       PTR                 NO, BACK UP TO TERM CHAR
*
IMMC     INC       NUMBYT              INC ASSEMBLY BYTE COUNT
RSTS     BRA       FMT1                CHECK TERM CHAR
*
* IF ADDRESS IS A VALID EEPROM ADDRESS, PROGRAM IT. ELSE WRITE
* DATA TO RAM.
*
IFEE     EQU       *
         STA       TEMP2               SAVE A
         LDA       GET+1               IS IT PAGE 0 ADDRESS?
         BNE       NOTPG0              NO
         LDA       GET+2               YES, IS IT 20<>4F
         CMP       #$20
         BLO       NOTEEAD             NOT EE ADDRESS
         CMP       #$4F
         BHI       NOTEEAD             NOT EE ADDRESS
YESEE    BSET      ERASE,PROG          YES EEPROM ADDRESS
         JSR       ZAP                 ERASE BYTE BEFORE PROGRAMMING IT
         LDA       TEMP2               GET BYTE
         JSR       ZAP                 PROGRAM IT
         RTS
*
NOTPG0   CMP       #$08                ADDRESS <08XX
         BLS       YESEE               YES, PROGRAM IT
NOTEEAD  LDA       TEMP2
         JSR       DROP                WRITE NON-EE LOCATIONS
         RTS
*
*============================================================================
*      INSTRUCTION CHAR TABLE
*
INSTS    FCB       'A,'D,'C+$80        ADC
         FCB             'D+$80        ADD
         FCB          'N,'D+$80        AND
         FCB          'S,'L+$80        ASL
         FCB             'R+$80        ASR
*
         FCB       'B,'C,'C+$80        BCC
         FCB              'L,'R+$80    BCLR
         FCB              'S+$80       BSC
         FCB          'E,'Q+$80        BEQ
         FCB          'H,'C,'C+$80     BHCC
         FCB                'S+$80     BHCS
         FCB             'I+$80        BHI
         FCB             'S+$80        BHS
         FCB          'I,'H+$80        BIH
         FCB             'L+$80        BIL
         FCB             'T+$80        BIT
         FCB          'L,'O+$80        BLO
         FCB             'S+$80        BLS
         FCB          'M,'C+$80        BMC
         FCB             'I+$80        BMI
         FCB             'S+$80        BMS
         FCB          'N,'E+$80        BNE
         FCB          'P,'L+$80        BPL
         FCB          'R,'A+$80        BRA
         FCB             'C,'L,'R+$80  BRCLR
         FCB             'N+$80        BRN
         FCB             'S,'E,'T+$80  BRSET
         FCB          'S,'E,'T+$80     BSET
         FCB             'R+$80        BSR
*
         FCB       'C,'L,'C+$80        CLC
         FCB             'I+$80        CLI
         FCB             'R+$80        CLR
         FCB          'M,'P+$80        CMP
         FCB          'O,'M+$80        COM
         FCB          'P,'X+$80        CPX
*
         FCB       'D,'E,'C+$80        DEC
         FCB             'X+$80        DEX
*
         FCB       'E,'O,'R+$80        EOR
*
         FCB       'F,'C,'B+$80        FCB
*
         FCB       'I,'N,'C+$80        INC
         FCB             'X+$80        INX
*
         FCB       'J,'M,'P+$80        JMP
         FCB          'S,'R+$80        JSR
*
         FCB       'L,'D,'A+$80        LDA
         FCB             'X+$80        LDX
         FCB          'S,'L+$80        LSL
         FCB             'R+$80        LSR
*
         FCB       'M,'U,'L+$80        MUL
*
         FCB       'N,'E,'G+$80        NEG
         FCB          'O,'P+$80        NOP
*
         FCB       'O,'R,'A+$80        ORA
         FCB             'G+$80        ORG
*
         FCB       'R,'O,'L+$80        ROL
         FCB             'R+$80        ROR
         FCB          'S,'P+$80        RSP
         FCB          'T,'I+$80        RTI
         FCB             'S+$80        RTS
*
         FCB       'S,'B,'C+$80        SBC
         FCB          'E,'C+$80        SEC
         FCB             'I+$80        SEI
         FCB          'T,'A+$80        STA
         FCB             'O,'P+$80     STOP      (CMOS VERSION)
         FCB             'X+$80        STX
         FCB          'U,'B+$80        SUB
         FCB          'W,'I+$80        SWI
*
         FCB       'T,'A,'X+$80        TAX
         FCB          'S,'T+$80        TST
         FCB          'X,'A+$80        TXA
*
         FCB       'W,'A,'I,'T+$80     WAIT      (CMOS VERSION)
         FCB       0
*============================================================================
*  POSITION/FORMAT TABLE
*
POSFMT   FCB       0,1,2+$70           ADC
         FCB           2+$70           ADD
         FCB         1,2+$70           AND
         FCB         1,2+$40           ASL
         FCB           2+$40           ASR
*
         FCB       0,1,2+$30           BCC
         FCB           2,3+$20         BCLR
         FCB           2+$30           BCS
         FCB         1,2+$30           BEQ
         FCB         1,2,3+$30         BHCC
         FCB             3+$30         BHCS
         FCB           2+$30           BHI
         FCB           2+$30           BHS
         FCB         1,2+$30           BIH
         FCB           2+$30           BIL
         FCB           2+$70           BIT
         FCB         1,2+$30           BLO
         FCB           2+$30           BLS
         FCB         1,2+$30           BMC
         FCB           2+$30           BMI
         FCB           2+$30           BMS
         FCB         1,2+$30           BNE
         FCB         1,2+$30           BPL
         FCB         1,2+$30           BRA
         FCB           2,3,4+$80       BRCLR
         FCB           2+$30           BRN
         FCB           2,3,4+$80       BRSET
         FCB         1,2,3+$20         BSET
         FCB           2+$30           BSR
*
         FCB       0,1,2+$10           CLC
         FCB           2+$10           CLI
         FCB           2+$40           CLR
         FCB         1,2+$70           CMP
         FCB         1,2+$40           COM
         FCB         1,2+$70           CPX
*
         FCB       0,1,2+$40           DEC
         FCB           2+$10           DEX
*
         FCB       0,1,2+$70           EOR
*
         FCB       0,1,2+$50           FCB
*
         FCB       0,1,2+$40           INC
         FCB           2+$10           INX
*
         FCB       0,1,2+$60           JMP
         FCB         1,2+$60           JSR
*
         FCB       0,1,2+$70           LDA
         FCB           2+$70           LDX
         FCB         1,2+$40           LSL
         FCB           2+$40           LSR
*
         FCB       0,1,2+$10           MUL
*
         FCB       0,1,2+$40           NEG
         FCB         1,2+$10           NOP
*
         FCB       0,1,2+$70           ORA
         FCB           2+$50           ORG
*
         FCB       0,1,2+$40           ROL
         FCB           2+$40           ROR
         FCB         1,2+$10           RSP
         FCB         1,2+$10           RTI
         FCB           2+$10           RTS
*
         FCB       0,1,2+$70           SBC
         FCB         1,2+$10           SEC
         FCB           2+$10           SEI
         FCB         1,2+$60           STA
         FCB       2,3+$10             STOP      (CMOS VERSION)
         FCB           2+$60           STX
         FCB         1,2+$70           SUB
         FCB         1,2+$10           SWI
*
         FCB       0,1,2+$10           TAX
         FCB         1,2+$40           TST
         FCB         1,2+$10           TXA
*
         FCB       0,1,2,3+$10         WAIT      (CMOS VERSION)
         FCB       0
*==============================================================================
*  OP-CODE BASE TABLE
*
OPCDE    FCB       $A9                 ADC
         FCB       $AB                 ADD
         FCB       $A4                 AND
         FCB       $38                 ASL
         FCB       $37                 ASR
*
         FCB       $24                 BCC
         FCB       $11                 BCLR
         FCB       $25                 BCS
         FCB       $27                 BEQ
         FCB       $28                 BHCC
         FCB       $29                 BHCS
         FCB       $22                 BHI
         FCB       $24                 BHS
         FCB       $2F                 BIH
         FCB       $2E                 BIL
         FCB       $A5                 BIT
         FCB       $25                 BLO
         FCB       $23                 BLS
         FCB       $2C                 BMC
         FCB       $2B                 BMI
         FCB       $2D                 BMS
         FCB       $26                 BNE
         FCB       $2A                 BPL
         FCB       $20                 BRA
         FCB       $01                 BRCLR
         FCB       $21                 BRN
         FCB       $00                 BRSET
         FCB       $10                 BSET
         FCB       $AD                 BSR
*
         FCB       $98                 CLC
         FCB       $9A                 CLI
         FCB       $3F                 CLR
         FCB       $A1                 CMP
         FCB       $33                 COM
         FCB       $A3                 CPX
*
         FCB       $3A                 DEC
         FCB       $5A                 DEX
*
         FCB       $A8                 EOR
*
         FCB       $01                 FCB
*
         FCB       $3C                 INC
         FCB       $5C                 INX
*
         FCB       $AC                 JMP
         FCB       $AD                 JSR
*
         FCB       $A6                 LDA
         FCB       $AE                 LDX
         FCB       $38                 LSL
         FCB       $34                 LSR
*
         FCB       $42                 MUL
*
         FCB       $30                 NEG
         FCB       $9D                 NOP
*
         FCB       $AA                 ORA
         FCB       $00                 ORG
*
         FCB       $39                 ROL
         FCB       $36                 ROR
         FCB       $9C                 RSP
         FCB       $80                 RTI
         FCB       $81                 RTS
*
         FCB       $A2                 SBC
         FCB       $99                 SEC
         FCB       $9B                 SEI
         FCB       $A7                 STA
         FCB       $8E                 STOP      (CMOS VERSION)
         FCB       $AF                 STX
         FCB       $A0                 SUB
         FCB       $83                 SWI
*
         FCB       $97                 TAX
         FCB       $3D                 TST
         FCB       $9F                 TXA
*
         FCB       $8F                 WAIT      (CMOS VERSION)
*==============================================================================
*  DOWNLOAD COMMAND  
*
DOWN     JSR       CRLF                START NEW LINE ON TERMINAL
         LDA       #$34                SET BAUD RATE TO 600 @ 4MHZ OSC.
         STA       BAUD
         CLR       ECHO                NO ECHO
*
LOADSS   CLR       NUMBYT              RESET END DUMP FLAG
*
*    WAIT FOR S-RECORDS
*
LOADS    JSR       GETC                YES, GET CHAR FROM HOST
         CMP       #'S                 IS IT 'S' ?
         BNE       LOADS               NO, KEEP LOOKING
         JSR       GETC                YES, GET NEXT CHAR
         CMP       #'9                 IS IT '9' ?
         BEQ       ENDLD               YES, END OF LOAD
         CMP       #'1                 NO, IS IT '1' ?
         BNE       LOADS               NO, KEEP LOOKING
         BRA       GETLIN              YES
*
*    PROCESS S-RECORD BYTE COUNT
*
ENDLD    INC       NUMBYT              SET END LOAD FLAG
GETLIN   CLR       CHKSUM              RESET CHECKSUM
         BSR       EVBYT               GET NUMBER OF BYTES IN RECORD
         SUB       #$03                ADJUST FOR CKSUM, ADDR (3 BYTES)
         STA       CMDPT               STORE COUNT
*
*    GET DATA STORE ADDRESS
*
         BSR       EVBYT               GET LOAD ADDRESS MSB
         STA       GET+1               STORE IT
         BSR       EVBYT               GET LOAD ADDR LSB
         STA       GET+2               STORE NEW LSB
*
*    STORE DATA IN MEMORY
*
NEWBYT   DEC       CMDPT               ALL DATA BYTES INPUT ?
         BMI       GETCKS              YES, GET CHECKSUM
         BSR       EVBYT               NO, GET DATA BYTE
         JSR       IFEE                STORE IT AT CURRENT ADDR
         JSR       BUMP                UPDATE ADDRESS
         BRA       NEWBYT              CONTINUE
*
*    VERIFY CHECKSUM
*
GETCKS   LDX       CHKSUM              TEMP SAVE CHECKSUM
         STX       CMDPT
         BSR       EVBYT               GET CHECKSUM FROM FILE
         TST       NUMBYT              END OF LOAD ?
         BNE       NOLOAD              YES, IGNORE CHECKSUM
         COMA                          NO, COMPLEMENT IT
         CMP       CMDPT               CALCULATED EQUAL READ (CHECKSUM) ?
         BEQ       LOADS               YES, KEEP GOING
*
NOLOAD   LDA       #$30                RESTORE BAUD RATE
         STA       BAUD
ISERR8   EQU       *                   NO, ERROR
         COM       ECHO                RE-ENABLE ECHO
         JMP       MONIT               RETURN
*==============================================================================
*   THIS ROUTINE WILL EVALUATE AN INPUT BYTE FROM HOST/CASSETTE
*
EVBYT    JSR       GETBYT              READ DATA BYTE 
         STA       TOTAL
         ADD       CHKSUM              ADD TO CHECKSUM
         STA       CHKSUM
         LDA       TOTAL
         RTS                           RETURN
*

********************************************************************* 
* WRITE ERASE CYCLING ROUTINE FOR THE 68HC05A6                      * 
* THIS CODE TO BE USED ON THE 68HC05C4                              * 
* BURN-IN BOARDS REVISION 2.60                                      * 
* BOB BOLLISH  7/7/87  SOURCE PGM.= A6BURN60                        * 
********************************************************************* 
* MONITOR W/E                                                       *
* A6 WRITE ERASE AND GATE STRESS ROUTINES FROM MONITOR PGM          *
* 1-6-88 BOB BOLLISH                                                *
* CREATED FROM A6BURN60 FROM THE MONITOR PGM                        *
* REVISION HISTORY                                                  *
* REVISION 1.0 ADDED WHOLE ARRAY VERIFY ROUTINE 1-8-87              *
*********************************************************************
DDRC    EQU     $0006           *PORT C DATA DIR. REG. 
SCDAT   EQU     $0011           *SERIAL COMM'S DATA REG. 
GTNUM   EQU     $0040           *CVAL=$40 # OF GATE STRESS OPTION LOC. 
CYCNUM  EQU     $0041           *DAVL=$41 # OF W/E CYCLES OPTION LOC. 
PIND3   EQU     3
RDRF    EQU     5               *SCSR BIT5; - RECIEVE DATA REG. 
NUM     EQU     32              *NUMBER OF BYTES TO XFER TO RAM. 
ROM     EQU     $0A00
DESTIN  EQU     RAM
RAMSUB  EQU     RAM
ADDRHI  EQU     RAM+1
ADDRLO  EQU     RAM+2
DELAY1  EQU     RAM+4
TIME    EQU     RAM+5
LOW     EQU     RAM+6
HIGH    EQU     RAM+7
CYCL    EQU     RAM+8
CYCH    EQU     RAM+9
NUM1    EQU     RAM+10  
CMP     EQU     RAM+11
PDATA   EQU     RAM+12
ETIME   EQU     RAM+13
AVAL    EQU     RAM+14
BVAL    EQU     RAM+15
CVAL    EQU     RAM+16
DVAL    EQU     RAM+17
***************************************************************** 
* RAMSUB=       $C7             *LDA/STA EXTENDED               * 
* ADDH  =       $01             *CURRENT ADDRESS HIGH BYTE      * 
* ADDL  =       $00             *CURRENT ADDRESS LOE BYTE       *
* RTS   =       $81             *RETURN FROM RAMSUB             * 
* DELAY =       $02             *2MS DELAY TIME                 * 
* TIME  =       $0A             *10 MS DELAY TIME               * 
* HIGH  =       $09             *HIGH ORDER ADDRESS BOUNDRY     * 
* LOW   =       $00             *LOW ORDER ADDRESS BOUNDRY      * 
* CYCH  =       $00             *NUMBER OF W/E CYCLES DONE      * 
* CYCL  =       $00             
* CMP   =       $07             *COMPARE VALUE x 256 # OF CYCLES* 
* PDATA =       $00             *DATA TO BE PROGRAMMED          * 
* ETIME =       $64             *ERASE TIME 100 MS              * 
* AVAL  =       $8D             *                               * 
* BVAL  =       $FF             *GATE STRESS COUNT VARIABLES    * 
* CVAL  =       $02             *02=4HRS                        *
* DVAL  =       $02             *CYCLE VAR.                     *
***************************************************************** 
* LOAD VARIABLES INTO RAM BEFORE PROGRAM START                  * 
*****************************************************************
        ORG     *   
SOURCE  FCB     $C7             *$50-RAMSUB
        FDB     $0020           *$51-ADDRESS
        FCB     $81             *$53-RTS
        FCB     $02             *$54-DELAY
        FCB     $0A             *$55-TIME
        FCB     $00             *$56-LOW
        FCB     $00             *$57-HIGH
        FCB     $00             *$58-CYCL
        FCB     $00             *$59-CYCH
        FCB     $04             *$5A-NUM1
        FCB     $07             *$5B-CMP
        FCB     $00             *$5C-PDATA
        FCB     $64             *$5D-ETIME
        FCB     $8D             *$5E-GATE STRESS VAR. 
        FCB     $FF             *$5F-GATE STRESS VAR. 
        FCB     $02             *$60-GATE STRESS VAR.= 2  HRS. 
        FCB     $02             *$61-512  WRITE ERASE CYCLES 
****************************************************************************** 
* MOVE ALL CONSTANT BYTES/VARIABLES INTO RAM TO BE USED LATER BRANCH TO READ * 
* VAR. READ PORTD3 AND BRANCH IF LOW TO LOAD RAM AND EXECUTE ROUTINE.        * 
****************************************************************************** 
BEGWE   BRCLR   PIND3,PORTD,LDRAM
        JSR     TOGGLE
TOG     JSR     TOGGLE1         KEEP TOGGLING PC7
        LDA     #$FF            DELAY 255 MS.
        JSR     DELNMS
        BIL     TOG             HANG UNTIL IRQ GOES HIGH *

        LDX     #NUM
NEXT    LDA     SOURCE-1,X
        STA     DESTIN-1,X
        DECX
        BNE     NEXT
        BRA     RLSTRT
**************************************************************************** 
* LOAD RAM WITH USER PROGRAM VIA THE SCI.                                  * 
*                                                                          * 
* THE DATA SHOULD BE IN THE THE FORM OF 1 START BIT,8 DATA-BITS,1 STOP BIT.* 
* THE FIRST BYTE SHOULD BE A COUNT OF THE TOTAL NUMBER OF BYTES TO BE SENT * 
* INCLUDUNG THAT BYTE. THE FIRST BYBTE IS LOADED INTO $50 SO THE FIRST     
* 
* PROGRAM BYTE WILL BE LOADED INTO $51. THAT IS WERE THE PROGRAM EXECUTION * 
* WILL BEGIN.                                                              * 
* IF A COUNT IS USED THAT IS GRATER THAN( PROGRAM LENGTH+1)                * 
* THEN THE ROUTINE WILL HANG AFTER THE LAST PROGRAM BYTE IS SENT.          
* 
**************************************************************************** 
LDRAM   CLR     SCCR1       8 BITS
        LDA     #$30        9600 BAUD @ 2 MHZ
        STA     BAUD
        LDA     #$0C        ENABLE TX AND RX
        STA     SCCR2
        LDX     #RAM        *POINT TO START OF RAM
WAITRX  BRCLR   RDRF,SCSR,WAITRX        *WAIT FOR RX REGISTER TO FILL
        LDA     SCDAT       *READ DATA BYTE FROM RX REGISTER 
        STA     ,X          *STORE DATA IN RAM
        INCX                *MOVE TO NEXT RAM LOACATION 
        DEC     RAM         *DECREMENT THE PROGRAM SIZE COUNTER (1ST BYTE 
SENT) 
        BNE     WAITRX      *IF ENTIRE PROGRAM NOT LOADED, CONTINUE LOADING 
JMPRAM  JMP     RAM+1       *JUMP TO PGM IN RAM
******************************************************************************** 
* START MAIN PROGRAM. GATE STRESS ALL EEPROM BYTES THEN BEGIN WRITE/ERASE      * 
* CYCLING DESIGNATED #OF CYCLES STORE ANY PROGRAM OR ERASE FAILURE TO          * 
* LOCATION $0020-0021.THEN STORE  THE #OF CYCLES COMPLETED TO LOCATION         * 
* $0030-0031. IF THE PART PASSES THEN STORE THE #OF CYCLES COMPLETED TO        * 
* LOCATION $0030-0031 THEN BRANCH ON SELF MODE.                                * 
******************************************************************************** 
GOPASS  JMP     PASS
CNTDN   INC     CYCL
        BNE     SKP
        INC     CYCH
SKP     BIL     GOPASS          *BRANCH TO PASS IF IRQ. LOW. 
        LDA     CYCH            *BRANCH TO PASS IF COMPLETE. 
        CMP     DVAL
        BEQ     GOPASS
        BRA     CSTART          *CONTINUE.
*******************************************************************
RLSTRT  JSR     FIRST
        JSR     HRDTIM 
CSTART  JSR     ERASE1          * REAL START OF PROGRAM
        LDA     #$FF
        STA     PDATA
        BSR     INIT
        BSR     VERF            * GOTO VERF SUBROUTINE
        CLR     PDATA
PRGLOOP BSR     BPROG           * BYTE PGM 1 BYTE
        BSR     NXTADDR         * INC AND CHECK ADDRESS
        BNE     PRGLOOP         * DO AGAIN
        BSR     INIT            * SUBROUTINE INITIALIZES STARTING ADDRESS
        BSR     VERF
        BRA     CNTDN
****************************************************************
* SUBROUTINE TO VERIFY THE ENTIRE EEPROM . PDATA IS THE COMPARED
* VALUE. GOTO ERROR IF IT DOES NOT VERIFY.
****************************************************************
VERF    BCLR    0,RAMSUB        * MAKE RAMSUB A LDA
LOOP    JSR     RAMSUB          * GET THE ADDRESS TO VERF.
        CMP     PDATA           * COMPARE TO THE VALUE IN PDATA
        BNE     ERROR           * GOTO THE ERROR ROUTINE
        BSR     NXTADDR         * GET NEXT ADDRESS
        BNE     LOOP            * DO IT AGAIN                

INIT    LDA     #$20            * FIRST  EPROM LOC.
        STA     ADDRLO          * ACC. SHOULD EQUAL $20
        CLR     ADDRHI          * MS.BYTE=$00
        RTS                     * ESCAPE SUBROUTINE     
*****************************************************************
*       INCREMENT TO THE NEXT VALID EEPROM ADDRESS SUBROUTINE
*****************************************************************
NXTADDR LDA     ADDRHI          * LOAD TO ACC.THE MS. BYTE OF ADDRESS
        BNE     MID             * IF NOT 00 THEN GOTO MIDDLE EEPROM CHECK
        LDX     ADDRLO          * LOAD TO INDEX THE LS. BYTE OF ADDRESS
        CMPX    #RAM-1          * COMPARE TO 4F         
        BNE     MID             * IF NOT EQUAL JMP TO MIDDLE EEPROM CHECK
        LDX     #$FF            * IF EQUAL TO 4F THEN PAGE 0 BOUNDRY            
        STX     ADDRLO          * STORE NEW LS. BYTE ADDRESS                            
MID     INC     ADDRLO          * INC THE LS. BYTE OF ADDRESS
        BNE     GOBACK1         * IF NOT EQUAL TO 00 THEN ESCAPE Z BIT=0
        INCA                    * INC MS. BYTE OF ADDRESS
        CMP     #$09            * CHECK IF DONE WAS ADDRESS=$08FF
        BEQ     GOBACK1         * IF MS.BYTE OF ADDRESS=09 THE ESCAPE Z BIT=1
INMAIN  STA     ADDRHI          * STA THE MS. BYTE OF ADDRESS
GOBACK1 RTS                     * ESCAPE SUBROUTINE
******************************************************************************** 
* BULK-GATE-STRESS ROUTINE.CVAL DETERMINES THE #OF HOURS TO RUN GATE STRESS    * 
******************************************************************************** 
HRDTIM  BSR     RDVAR           *GO READ $40-$41 AND SETUP C&DVAR 
        LDA     GTNUM
        CMP     #$FF             *COMPARE CVAL TO $FF 
        BEQ     ESCAPE          *ESCAPE FROM GATE STRESS ROUTINE.IF GTNUM=$00 
LOOP3   LDA     #$FF
        STA     BVAL
LOOP2   LDA     #$8D            *CONSTANT TO FIX 1HR. PER INC OF OUTER 
        STA     AVAL            *-LOOP @1MHZ BUS
LOOP1   JSR     ERASE1
        JSR     TOGGLE1         *TOGGLE BIT7 PORT C
        DEC     AVAL
        BNE     LOOP1
        DEC     BVAL
        BNE     LOOP2
        DEC     CVAL
        BNE     LOOP3
ESCAPE  RTS
******************************************************************************** 
* DETERMINE IF THE THE CODE IS TO BE RUN AS WRITTEN (4HR GATE STRESS AND 1024  * 
* WRITE ERASE CYCLES). IF LOCATION $0041 IS EQUAL TO $FF THEN USE THE VALUE IN * 
* VAR. DVAL. ELSE READ THE LOCATION AND AND USE IT FOR THE DVAL. IF LOCATION 40* 
* $0040 IS EQUAL TO $FF THEN USE THE VALUE IN CVAL.ELSE READ THE LOCATION AND  * 
* USE IT FOR CVAL.                                                             * 
******************************************************************************** 
RDVAR   LDA     GTNUM           *GET THE # OF GATE STRESS CYCLES TO RUN. 
        CMP     #$FF            *CMP GTNUM TO FF THEN BRANCH TO READ AND STORE 
        BNE     RCVAL           *-ROUTINE IF NOT EQUAL TO FF. 
READD   LDA     CYCNUM          *GET CYCLE VALUE
        CMP     #$FF            *CMP CYCNUM TO FF THEN BRANCH TO READ AND STORE 
        BNE     RDVAL           *-ROUTINE IF NOT EQUAL TO FF.
        RTS

RCVAL   STA     CVAL            *STORE CONTENT OF $40 T0 CVAL 
        BRA     READD
RDVAL   STA     DVAL            *STORE CONTENT OF $41 TO DVAL 
        RTS

******************************************************************************
* SUBROUTNE TO BYTE PROGRAM A SINGLE A6 EEPROM BYTE PGM TIME PER BYTE=10MS     * 
********************************************************************************
BPROG   BSET    0,RAMSUB        *C7-STA
        BSET    2,PROG          *$46-$1C
        LDA     PDATA           *DATA TO BE PROGRAMMED 
        JSR     RAMSUB          *STA TO CURRENT LOCATION 
        INC     PROG            *$45-$1C
        BCLR    1,PROG          *$43-$1C
        LDA     TIME
        BSR     ZAP1
        BRA     TOGGLE1         *TOGGLE BIT7 PORT C
        RTS
*****************************************************************
*                      ERROR DETECTED SUBROUTINE
*****************************************************************               
PASS    CLR     ADDRLO          *IF PASS FAIL ADDRESS=0000
ERROR   RSP                     * RESET STACK POINTER TO FF.
        LDA     #20
        STA     TIME
        JSR     ERASE2
        LDA     ADDRHI          * SAVE FAIL LOCATION MS. BYTE
        STA     HIGH
        LDA     ADDRLO          * SAVE FAIL LOCATION LS. BYTE
        STA     LOW             
        CLR     ADDRHI          * DEFINE THE FAILURE STORE MS.BYTE ADDRESS
        LDA     #$20
        STA     ADDRLO          * DEFINE THE FAILURE STORE LS.BYTE ADDRESS

NEXT1   LDX     NUM1            * LOAD THE INDEX REG. WITH # OF BYTES TO PGM
        LDA     LOW-1,X         * LOAD THE ACC. WITH THE BYTE TO BE PGMED
        STA     PDATA           * STORE TO PDATA
        BSR     BPROG           * GOTO PROGRAMING ROUTINES
        INC     ADDRLO          * INCREMENT THE LOCATION TO BE PROGRAMMED
        DEC     NUM1            * DECREMENT TO GET THE NEXT BYTE
        BNE     NEXT1           * DO IT AGAIN
        BSET    7,PORTC         * TURN OFF THE LED ON PORTC BIT7
SELF    BRA     SELF            * END OF TEST HOLD      
************************************************************************* 
* SUBROUTINE TO BULK ERASE THE A6 EEPROM.THE BULK ERASE TIME IS SET TO  *   
* 100MS @ 1MHZ BUS.                                                     *       
*************************************************************************
FIRST   BSET    6,PROG          *$42-$1C
        LDA     ETIME
        BSR     DELNMS          *CHARGE PUMP RAMP UP TIME 
        RTS
ERASE1  LDX     #$5E
        STX     PROG            *$5E-$1C
STORE   LDA     #$FF    
        STA     $20             *STA-$20
        INC     PROG            *$5F-$1C
        BCLR    1,PROG          *$5D-$1C
        LDA     ETIME
ZAP1    BSR     DELNMS          *DELAY 100MS
        INC     PROG
        LDA     DELAY1
        BSR     DELNMS
        LDA     #$42
        STA     PROG
        RTS
        
ERASE2  LDX     #$6E            *ROW ERASE
        STX     PROG            *$6E-$1C
        BSR     STORE
        RTS
******************************************************************************** 
*       TIME DELAY SUBROUTINE THE VALUE IN THE ACC. = # OF MS DELAY            *
******************************************************************************** 
DELNMS  ADD     $1A
        STA     $16
        LDA     $13
        STA     $17
HOLD1   BRCLR   6,$13,HOLD1
        RTS
******************************************************************************** 
* TOGGLE PORT C BIT 7 ROUTINE TO VERIFY STARTUP                                * 
******************************************************************************** 
TOGGLE  BSET    7,DDRC
TOGGLE1 COM     PORTC
        RTS
        page


        ORG $1FF4

VECSPI  FDB $08EE  SPI VECTOR
VECSCI  FDB $08F1  SCI VECTOR
VECTMR  FDB $08F4  TIMER VECTOR
VECIRQ  FDB $08F7  IRQ VECTOR
VECSWI  FDB $08FA  SWI VECTOR
VECRST  FDB RESET

        END


