6809 Monitor

Diane Bruce db at db.net
Tue Oct 2 14:46:21 CDT 2018


On Tue, Oct 02, 2018 at 12:24:47PM -0700, tim lindner via cctalk wrote:
> Does anyone have source to a 6809 monitor program?
> 
> I'm looking for something I can make work in a CoCo.
> 
> Functionality I'm looking for is something that will let me read and
> write to memory.

I have a copy of psymon.s if you want it.

> 
> -- 
> --
> tim lindner
> 
> "Proper User Policy apparently means Simon Says."

-- 
- db at FreeBSD.org db at db.net http://artemis.db.net/~db
-------------- next part --------------
*************************************************
* psymon version 1.00
*
* copyright (c) 1979 percom data company, inc.
* percom data company, inc. grants unrestricted
* royalty-free license for the use of this
* program provided the user clearly acknowledges
* its origin.
*
* while this monitor is very simple, its true
* power lies in its extensibility and in the
* tools that it provides for other software
* to use.  This operating system is dedicated
* to harold mauch and his legendary 512 byte
* operating system.
*
* psymon Much modified version 4.00
*
* commands:
*   m <address>     - memory examine/change
*   o <address>     - memory change (output to I/O port no read)
*   g <address>     - go to address
*   r <register>    - register examine/change
*   l <address>     - load program from tape, optional load address
*   s <start> <end> - save program to tape
*   b <address>     - set/list breakpoints
*   u <address>     - unset breakpoints
*   e start end dest - Burn EEPROM at dest with data from start, end
*
* other comments to be added here later
*
* Extensive modifications for GPE
* - acia changed to 68681 DUART, I know strange to use a 68k part on 6809
* - removed 'z' command
* - moved I/O,ram,rom addresses as needed
* - removed special code for special dcb's for punch since 
*   debug port will be used for all uploads/downloads and need the bytes.
*   (There is lots of ROM on target system, but I am unwilling to attempt
*   relocating monitor since that would entail working out padding,
*   see my next note)
* - Original programmer did not make use of 'lbra' and 'lbsr' instructions
*   for reaching code ie. used 'stepping stone' technique, makes me wonder
*   if this was originally a 6800 monitor?
* - Added 'o' command
* - DCB is obviously "Device Control Block" but no reference to that
*   in "FLEX" or "OS9" so I have no idea where this came from.
*
*   DB. Feb 19 1990
*   DB. Feb 25 1990
*************************************************
* system address constants (GPE version)
RUNSYS equ 1 ; if bottom bit is set on INPORT, Run 2nd ROM
rom1 equ 0F800H ; base add of psymon rom
rom2 equ 0C000H ; base add of extension rom
ram equ 0000 ; base add of ram
termnl equ 8000H ; system terminal acia
* ascii character constants
cr equ 0dH ; carriage return
lf equ 0AH ; line feed
sp equ 20H ; space
* acia control configurations
 MREG equ 0 ; Mode register (MR1,MR2)
 SREG equ 1 ; Status register
 CSREG equ 1 ; Clock select register
 CREG equ 2 ; Command register
 RHR equ 3 ; Receiver holding register
 THR equ 3 ; Transmitter holding register
 OPCR equ 0DH ; Output port conf reg.
 INPORT equ 0DH ; Same as above, read input port
 SETOP equ 0EH
 RESETOP equ 0FH

* yes, THR is the same as RHR
*
* Bit masks for SREG (status register)
*
 RXRDY equ 01H ; RXRDY equ %00000001
 TXRDY equ 04H ; TXRDY equ %00000100
 RXBRK equ 80H ; RXBRK equ %10000000
 FRAME equ 40H ; FRAME equ %01000000
 PARER equ 20H ; PARER equ %00100000
 OVRUN equ 10H ; OVRUN equ %00010000

*
* Commands for CREG
*
 RESETRX equ 20H ; RESETRX equ %00100000
 RESETTX equ 30H ; RESETTX equ %00110000
 RESETMR equ 10H ; RESETMR equ %00010000
 ENBTX   equ 04H ; ENBTX   equ %00000100 Enable Transmitter
 ENBRX   equ 01H ; ENBRX   equ %00000001 Enable Receiver
 DISTX   equ 08H ; DISTX   equ %00001000 Disable Transmitter
 DISRX   equ 02H ; DISRX   equ %00000010 Disable Receiver
 ENABLE  equ 05H ; ENABLE  equ %00000101 Enable both RX and TX
*
* Commands for MR
* Whenever MR is pointing to MR1 and then is written to, MR flips to MR2.
*
 RXRTSNO equ 0
 RXRTSYES equ 80H ; RXRTSYES equ %10000000
 RXINTRDY equ 0
 RXINTFUL equ 40H ; RXINTFUL equ %01000000
*
* MR1 equ RXRTSNO|RXINTRDY|ERRORCHAR|NOPARITY|BITS8
 MR1 equ 13H ; MR1 equ %00010011
*MR2 equ NORMAL|TXRTSNO|CTSCTLNO|STOP1
 MR2 equ 07H ; MR2 equ %00000111
*
* Commands for CSREG
*
B9600 equ 0BBH ; B9600 equ %10111011
*
BURNRAM equ 1400H ; where EEPROM routine goes
*
* psymon dcb offsets
 dcblnk equ 0 ; ptr to next dcb in chain
 dcbdid equ 2 ; ascii 2 char device id
 dcbdvr equ 4 ; device driver address
 dcbioa equ 6 ; device io address
 dcberr equ 8 ; error status  code
 dcbext equ 9 ; dcb extension byte count
 dcbapp equ 10 ; driver dcb appendage
* psymon dcb function codes
 readfn equ 01H ; read
 writfn equ 02H ; write
 statfn equ 04H ; read status
 initfn equ 08H ; init the 68681
 baudfn equ 10H ; set baud rate (for 68681 only)

* psymon ram definitions (mp-a2 version)
 org ram
* psymon internal stack (& register) space
 rmb 800H ; stack space
stack:
regc: rmb 1 ; condition code register
rega: rmb 1 ; a register
regb: rmb 1 ; b register
regd: rmb 1 ; dp register
regx: rmb 2 ; x register
regy: rmb 2 ; y register
regu: rmb 2 ; u register
regp: rmb 2 ; pc
* psymon breakpoint table
bptabl: rmb 30 ; space for 10 breakpoints
bptend: 
* psymon work areas
memptr: rmb 2 ; pointer for M command
usrtbl: rmb 2 ; address of user command table
comand: rmb 1 ; command char storage
cksum: rmb 1 ; load & save checksum
begadd: rmb 2 ;  begin address for save
endadd: rmb 2 ; end   address for save
offsetflg: rmb 1
offset: rmb 2
stkptr: rmb 2 ; contents of stack pointer
* the psymon console dcb
condcb: rmb 10 ; no extensions
* psymon dcb pointers
dcbchn: rmb 2 ; base of dcb chain
cidcb: rmb 2 ; console input dcb
cedcb: rmb 2 ; console echo dcb
codcb: rmb 2 ; console output dcb
tpdcb: rmb 2 ; cassette tape dcb
* psymon vectors
swi3v: rmb 2 ; software interrupt 3
swi2v: rmb 2 ; software interrupt 2
firqv: rmb 2 ; fast interrupt request
irqv: rmb 2  ; interrupt request
swiv: rmb 2  ; software interrupt
nmiv: rmb 2  ; non-maskable interrupt
restrt: rmb 2 ; re-entry into psymon
* psymon rom coding
org 0F800H ; rom1
*************************************************
* psymon initialization
*************************************************
init: ld s #stack ; set up stack pointer
 tfr s x ; point x at stack
init1: clr ,x+ ; clear a byte
 cmp x #condcb+2 ; all fields clear?
 bne init1 ; loop if not
 lea y ramint,pcr ; point to ram data
init2: ld d ,y++ ; move 2 bytes
 st d ,x++
 cmp x #restrt+2 ; end of ram?
 bne init2 ; loop if not
 ld x #condcb ; point to dcb
 ld b #initfn
 lbsr reqio ; reset acia
 ld x #termnl
 ld a INPORT,x
 bit a #RUNSYS ; Run the system ROM?
 bne monent
 ld a rom2 ; check for second rom
 cmp a #'V' ; is there a version code there?
 bne monent ; branch if not
 jmp rom2+4 ; else call second rom
*************************************************
* psymon user entry
*************************************************
monent: ld s #stack ; set stack pointer
 st s stkptr
*************************************************
* get command
*************************************************
getcmd: lea x prompt,pcr ; display prompt
 lbsr pstrng
 lbsr inchr ; input command character
 cmp a #'a'
 blo getupper
 and a #0DFH ; convert to upper
getupper: bsr lookup ; look it up
 bne getcmd ; loop if not found
 lbsr outsp ; output a space
 jsr [0,x] ; call command routine
 bra getcmd ; go back for more
prompt: fcb cr,lf
 str "cmd"
 fcb '?'+80H ; end of string
*************************************************
* look up command in table
*************************************************
lookup: ld y #comand ; point y at command
 st a ,y ; save command character
 ld x usrtbl ; get user table address
 beq look1 ; branch if none
 bsr search ; else search user table
 beq serchx ; go if found
look1: lea x cmdtbl,pcr ; search internal table
*************************************************
* general table search
*
* entry requirements:  x - points to table
*                      y - points to item
*                      first byte of table must
*                      contain item length
*                      last byte must be ff
*
* exit conditions:  c - z set if found, clear
*                       if not found
*                   x - points to address of routine
*                       for match
*                   a,b - changed
*
*************************************************
search: ld b ,x+ ; get item length
serch1: bsr compar ; compare current item
 abx ; advance to next item
 beq serchx ; exit if match
 lea x 2,x ; step over address
 tst ,x  ; end of table?
 bpl serch1 ; loop if not
serchx: rts
*************************************************
* general string compare
*
* entry requirements:  x - address of string 1
*                      y - address of string 2
*                      b - length of strings
*
* exit conditions:  c - set per compare 1:2
*                   b,x,y - unchanged
*                   a - changed
*
*************************************************
compar: pshs b x y ; save registers
comp1: ld a ,x+ ; get next char
 cmp a ,y+ ; compare it
 bne comp2 ; exit if unmatched
 dec b ; decrement loop count
 bne comp1
comp2: puls b x y pc ; restore registers & return
*************************************************
* load program from tape, with optional load address
*************************************************
tload: clr offsetflg
 lbsr gethex ; get optional offset value
 beq tload0
 st x offset
 ld a #1
 st a offsetflg
tload0: ld x cedcb ; save default echo mode
 pshs x
 clr a ; set d to 0
 clr b
 st d cedcb ; set no echo
 bsr load  ; load the tape
 puls x ; restore echo mode
 st x cedcb
 tst cksum ; any errors?
 beq loadx ; branch if not
*************************************************
* display error indicator of '?'
*************************************************
error: ld a #'?' ; display error indicator
 lbra outchr
*************************************************
* load program in hex format
*
* entry requirements:  none
*
* exit conditions:  all registers changed
*                   cksum non-zero if error
*
*************************************************
load: tfr s y ; mark stack for error recovery
load1: lbsr inchr ; get a character
load2: cmp a #'S' ;  start of record?
 bne load1 ; loop if not
 lbsr inchr ; get another character
 cmp a #'9' ; end of load?
 beq loadx ; branch if yes
 cmp a #'1' ; start of record?
 bne load2  ; loop if not
 clr cksum ; init checksum
 bsr inbyte ; read length
 sub a #2 ; adjust it
 tfr a b ; save in b
 bsr inbyte ; get address hi
 st a ,--s ; save on stack
 bsr inbyte ; get address lo
 st a 1,s ; put on stack
 puls x ; address now in x
 tst offsetflg
 beq load3
 exg d x
 sub d offset ; subtract from given load address
 exg d x
load3: bsr inbyte ; read a byte
 dec b ;  decrement count
 beq load4 ; branch if done
 st a ,x ; store byte
 cmp a ,x+ ; verify good store
 bne load5 ; branch if error
 bra load3
load4: inc cksum ; check checksum
 beq load1 ; loop if good
load5: ld a #0ffH ; set error flag
 st a cksum
 tfr y s ; restore stack
loadx: rts
*************************************************
* input a byte
*************************************************
inbyte: bsr inhex ; get hex digit
 beq load4 ; branch if error
 asl a  ; shift to ms half
 asl a
 asl a
 asl a
 pshs a ; save digit
 bsr inhex ; get another digit
 beq load4 ; branch if error
 add a ,s ; combine halves
 st a ,s ; save on stack
 add a cksum ; add to checksum
 st a cksum
 puls a pc ; get result & return
*************************************************
* get hex number from console
*
* entry requirements:  none
*
* exit conditions:  a - last char input
*                   b - hex digit count
*                   x - hex number
*                   c - set according to b
*
*************************************************
gethex: clr b ;  init digit count & result
 ld x #0
gethx1: bsr inhex ; get a digit
 beq gethx2 ; go if not hex
 exg d x ; old result to a,b
 asl b ; shift left 1 digit
 rol a
 asl b
 rol a
 asl b
 rol a
 asl b
 rol a
 exg d x ; replace result
 lea x a,x ; add in new digit
 inc b ; add to digit count
 bra gethx1 ; loop for more
gethx2: tst b ;  set/reset z flag
 rts
*************************************************
* get hex digit from console
*
* entry requirements:  none
*
* exit conditions:  a - hex digit or non-hex
*                   c - z flag set if a not hex
*                   all other regs preserved
*
*************************************************
inhex: bsr inchr ; get a character
 cmp a #'a' 
 blo inhexupper
 and a #0DFH ; convert to upper
inhexupper: pshs a ; save it
 sub a #30H ; convert to binary
 bmi inhex2 ; branch if not numeric
 cmp a #09H ; greater than 9?
 bls inhex1 ; branch if not
 sub a #07H ; else convert letter
inhex1: cmp a #0fH ; greater than 15?
 bls inhex3 ; branch if not
inhex2: ld a ,s ; get original char back
inhex3: cmp a ,s+ ; set/reset z flag
 rts
*************************************************
* console input routine
*
* entry requirements:  none
*
* exit conditions:  a - character with parity removed
*                   all other regs except c preserved
*
*************************************************
inchr: pshs b x ; save registers
 ld x cidcb ; point to input dcb
 ld b #readfn ; set up for read
 bsr reqio ; read a character
 and a #7fH ; remove parity
 ld x cedcb ; point to echo dcb
 pshs a ; save character
 bne outch1 ; branch if echo
 puls a b x pc ; else restore regs & return
*************************************************
* console output routine
*
* entry requirements:  a - character to be output
*
* exit conditions:  all registers preserved except c
*
*************************************************
outchr: pshs a b x ; save registers
 ld x codcb ; point to output dcb
outch1: ld b #writfn ; set function
 bsr reqio ; output the character
 puls a b x pc ; restore regs & return
*************************************************
* perform io requests
*
* entry requirements:  a - driver parameter
*                      b - function code
*                      x - dcb address
*
* exit conditions:  a - driver result
*                   all other regs except c preserved
*
*************************************************
reqio: pshs b x y ; save registers
 jsr [dcbdvr,x] ; call driver
 puls b x y pc ; restore regs & return
*************************************************
* display double byte
*
* entry requirements:  a,b - double byte to print
*
* exit conditions:  all regs preserved but c
*
*************************************************
dspdby: bsr outhex ; display a as 2 hex digits
 exg a b
 bsr dspsby ; display b as 2 hex digits
 exg a b ; restore a & b
 rts
*************************************************
* display a byte and space
*
* entry requirements:  a - byte to be displayed
*
* exit conditions:  all regs but c preserved
*
*************************************************
dspsby: bsr outhex ; display byte in a
*************************************************
* output a space to the console                 *
*                                               *
* entry requirements:  none                     *
*                                               *
* exit conditions:  all registers reserved      *
*                   except c                    *
*                                               *
*************************************************
outsp: pshs a ; save a register
 ld a #sp ; output a space
*************************************************
* output character, restore a, & return         *
*************************************************
outchx: bsr outchr ; display character
 puls a pc ; restore & exit
*************************************************
* display a register as 2 hex digits            *
*                                               *
* entry requirements:  a - byte to display      *
*                                               *
* exit conditions:  all registers preserved     *
*                   except c                    *
*                                               *
*************************************************
outhex: pshs a ; save the byte
 lsr a ; get ms byte
 lsr a
 lsr a
 lsr a
 bsr outdig ; display it
 ld a ,s ; get ls digit
 bsr outdig ; display it
 puls a pc ; restore a & return
*************************************************
* display a hex digit                           *
*************************************************
outdig: and a #0fH ; mask off digit
 add a #30H ; convert to ascii
 cmp a #39H ; bigger than 9?
 bls outchr ; go if not
 add a #07H ; convert to letter
 bra outchr ; print and exit
*************************************************
* print a string to the console                 *
*                                               *
* entry conditions:  x - points to string       *
*                    last byte has bit 7 on     *
*                                               *
* exit conditions:  x - points 1 byte past end  *
*                   a,c - changed               *
*                                               *
*************************************************
pstrng: ld a ,x ; get a character
 and a #7fH ; mask off
 bsr outchr ; display it
 tst ,x+ ; was it last?
 bpl pstrng ; loop if not
 rts
*************************************************
* print cr/lf on console                         *
*                                                *
* entry requirements:  none                      *
*                                                *
* exit conditions:  all registers preserved      *
*                   except c                     *
*                                                *
**************************************************
crlf: pshs a ; save a register
 ld a #cr ; output cr
 bsr outchr
 ld a #lf ; output lf & exit
 bra outchx
**************************************************
* save program on tape                           *
**************************************************
tsave: lbsr gethex ; get start address
 beq tsave2 ; go if none
 st x begadd ; save start
 lbsr gethex ; get end address
 bne tsave1 ; go if entered
 ld x begadd ; duplicate address
 inc b ; set address indicator
tsave1: st x endadd ; save end
tsave2: pshs a ; save terminator
 tst b ; any address entered?
 beq tsave3 ; go if not
 bsr save ; save the program
tsave3: puls a ; get terminator
 cmp a #cr ; was it return?
 bne tsave4 ; go if not
 ld b #'9' ; output s9 record
 bsr outsn
tsave4: rts
*************************************************
* save a program in hex                         *
*                                               *
* entry requirements:  save addresses are in    *
*                      begaddr & endaddr        *
*                                               *
* exit conditions:  all registers change        *
*                                               *
*************************************************
save: ld x begadd ; point at first byte
save1: ld b #'1' ; begin new s1 record
 bsr outsn
 clr cksum ; init checksum
 ld d endadd ; calculate bytes to save
 pshs x
 sub d ,s++
 tst a ; greater than 255?
 bne save2 ; go if yes
 cmp b #16 ; less than full record?
 blo save3 ; go if yes
save2: ld b #15 ; set full record size
save3: inc b ; correct record size
 tfr b a ; output record size
 add a #3 ; adjust for address,count
 bsr outbyt
 pshs x ; address to stack
 puls a ; output address high
 bsr outbyt
 puls a ; output address low
 bsr outbyt
save4: ld a ,x+ ; save a data byte
 bsr outbyt
 dec b ; loop until 0
 bne save4
 ld a cksum ; get checksum
 com a ; compliment it because it was good
  bsr outbyt ; output it
 lea y -1,x ;
 cmp y endadd
 bne save1 ; loop if not
 rts
************************************************
* output byte as hex and add to checksum       *
************************************************
outbyt: lbsr outhex ; output byte as hex
 add a cksum ; add to checksum
 st a cksum
 rts
************************************************
* output 'S' tape record headers               *
************************************************
outsn: lbsr crlf ; begin new line
 ld a #'S' ; output 'S' header
 lbsr outchr
 tfr b a ; record type to a
 lbra outchr
************************************************
* memory examine and change                    *
************************************************
memec: lbsr gethex ; get address
 bne memec1 ; go if good
 ld x memptr ; use previous
memec1: st x memptr ; update ram pointer
 lbsr crlf ; begin new line
 tfr x d ; display address
 lbsr dspdby
 ld a ,x+ ; get contents
 lbsr dspsby ; display them
 tfr x y ; save address in y
 lbsr gethex ; get change data
 exg d x ; save delim, get new
 beq memec2 ; go if no change
 st b -1,y ; update memory
 cmp b -1,y ; verify good store
 beq memec2 ; go if good store
 lbsr error ; display error
memec2: tfr x d ; get delimiter in a
 tfr y x ; get next address in x
 cmp a #cr ; end of update?
 beq memec3 ; go if yes
 cmp a #':' ; backing up?
 bne memec1 ; loop if not
 lea x ,--x ; back up 2
 bra memec1 ; continue
memec3: rts
************************************************
* memory change                                *
************************************************
change: lbsr gethex ; get address
 bne change1 ; go if good
 ld x memptr ; use previous
change1: st x memptr ; update ram pointer
 lbsr crlf ; begin new line
 tfr x d ; display address
 lbsr dspdby
 lea x 1,x
 tfr x y ; save address in y
 lbsr gethex ; get change data
 exg d x ; save delim, get new
 beq change2 ; go if no change
 st b -1,y  ; update memory
change2: tfr x d ; get delimiter in a
 tfr y x ; get next address in x
 cmp a #cr ;  end of update?
 beq change3 ; go if yes
 cmp a #':' ; backing up?
 bne change1 ; loop if not
 lea x ,--x ; back up 2
 bra change1 ; continue
change3: rts
****
* eeprom
* Rather specialized code to burn EEPROMs
*
****
eeprom:
 lea x burnrom,pcr ; Copy ROM EEPROM code to RAM
 ld y #BURNRAM ; Where RAM portion will be
 ld b #2AH ; endburnrom-burnrom+1
prom0: ld a ,x+ ; copy code to ram
 st a ,y+
 dec b
 bne prom0
*
 lbsr gethex ; read hex # for Source object
 beq promerror ; if none given this is error
 st x begadd
 lbsr gethex ; get second hex #
 tfr x d
 sub d begadd ; ensure is above start address
 blo promerror
 tfr d y ; save # bytes to copy 
 lea y 1,y ; bump # bytes to copy
 lbsr gethex ; get destination address
 beq promerror ; none given, give up.
 tfr x u
 ld x begadd
 jsr BURNRAM
promerror: rts
*
* This code is copied into RAM
* it is called with
* x -> source address of data to be written to eprom
* u -> destination eprom address
* y -> number of bytes to write
*
burnrom: pshs x
 ld x #termnl
 ld a #0
 st a OPCR,x ; set all bits for output
 ld a #18H ; %11000 ; clear bits 3 + 4 to enable ROM for writes
 st a SETOP,x
 puls x
burnnext: ld b ,x+
 st b ,u
burnpoll: ld a ,u ; keep looping
 pshs b ; until dest byte = source byte
 cmp a ,s+
 bne burnpoll
 lea u 1,u ; bump dest.
 lea y -1,y ; bump down byte counter
 bne burnnext
 ld x #termnl
 ld a #18H ; %11000 ; reset bits 3 + 4 to disable ROM for writes
 st a RESETOP,x
 rts
endburnrom:
************************************************
* go to address                                *
************************************************
go: ld s stkptr ; set up stack
 lbsr gethex ; get target address
 beq go1 ; go if none
 st x regp
go1: ld x regp
 st x 10,s ; store in pc on stack
 ld a regc
 or a #80H ; set 'e' flag in cc
 st a ,s
 ld a rega ; set 'a' reg
 st a 1,s
 ld a regb
 st a 2,s
 ld a regd
 st a 3,s
 ld d regx
 st d 4,s
 ld d regy
 st d 6,s
 ld d regu
 st d 8,s
intret: rti ; load registers and go
***********************************************
* breakpoint (software interrupt) trap         *
************************************************
brkpnt: ld x 10,s ; get program counter
 lea x -1,x ; decrement by 1
 st x 10,s ; replace on stack
 ld b #0FFH ; $ff flag for single removal
 lbsr rembk ; remove breakpoint
************************************************
* interrupt (hardware/software) trap           *
************************************************
trap: st s stkptr ; save stack pointer
 lbsr crlf ; begin new line
 bsr regdmp ; dump registers
 lbra getcmd ; get next command
************************************************
* register examine and change                  *
************************************************
regec: lbsr inchr ;  get register to examine
 cmp a #'a'
 blo regupper
 and a #0DFH ; convert to upper
regupper: lbsr crlf ; begin new line
 clr b ; clear offset count
 lea x regids,pcr ; point to register id string
regec1: cmp a b,x ; check register name
 beq regec2 ; go if found
 inc b ; advance count
 cmp b #11 ; end of list?
 bls regec1 ; loop if not
 bra regdmp ; bad id - dump all
regec2: pshs b ; save offset
 bsr rdump ; display the reg & contents
 lbsr gethex ; get new value
 puls b ; restore offset
 beq regecx ; go if no change
 lea y b,y ; point to reg on stack
 cmp b #3 ; single byte reg?
 tfr x d ; get new data in a,b
 bls regec3 ; go if single
 st a ,y+ ; store ms byte
regec3: st b ,y ; store ls byte
regecx: rts
regids: str "CABDXXYYUUPP"
************************************************
* complete register dump                       *
************************************************
regdmp: lea x regids,pcr ; point to id string
 clr b ; clear offset counter
rgdmp1: ld a b,x ; get reg name
 bsr rdump ; display it
 inc b ; bump to next reg
 cmp b #11 ; all printed?
 bls rgdmp1 ; loop if not
 ld a #'S' ; display stack id
 bsr dspid
 ld y #stkptr-12 ; y+b=>stkptr
 bra  rdump1
************************************************
* display register contents                    *
************************************************
rdump: bsr dspid ; display register id
 ld y stkptr ; point y at stack
 cmp b #3 ; single byte reg?
 bls rdump2 ; go if yes
rdump1: ld a b,y ; display ms byte
 lbsr outhex
 inc b ; advance offset
rdump2: ld a b,y ; display a byte
 lbra dspsby
************************************************
* display register id                          *
************************************************
dspid: lbsr outchr ; display reg name
 ld a #'=' ; display '='
 lbra outchr
************************************************
* set a breakpoint                             *
************************************************
setbk: lbsr gethex ; get address
 beq dspbk ; go if none entered
 bsr initbp ; point y at bp table
setbk1: ld d ,y ; empty slot?
 beq setbk2 ; go if yes
 bsr nextbp ; advance to next slot
 bne setbk1 ; loop if not end
 bra dspbk ; exit
setbk2: st x ,y ; save address
 beq dspbk ; go if address = 0
 ld a ,x ; get contents
 st a 2,y ; save in table
 ld a #3fH ; swi op code
 st a ,x ; set break
************************************************
* display all breakpoints                      *
************************************************
dspbk: lbsr crlf ;  begin new line
 bsr initbp ; point y at bp table
dspbk1: ld d ,y ; get address of bp
 beq dspbk2 ; go if inactive
 lbsr dspdby ; display address
dspbk2: bsr nextbp ; advance pointer
 bne dspbk1 ; loop if not end
 rts
************************************************
* initialize breakpoint table pointer          *
************************************************
initbp: ld y #bptabl ; point y at bp table
 rts
************************************************
* advance breakpoint table pointer             *
************************************************
nextbp: lea y 3,y ; advance to next entry
 cmp y #bptend ; check for end of table
 rts
************************************************
* unset a breakpoint                           *
************************************************
unsbk: lbsr gethex ; get address
************************************************
* remove one or more breakpoints               *
************************************************
rembk: bsr initbp ; point y at bp table
rembk1: tst b ; remove all?
 beq rembk2 ; go if yes
 cmp x ,y ; find address?
 beq unset ; go if yes
 bra rembk3 ; loop if no
rembk2: bsr unset ; unset it
rembk3: bsr nextbp ; advance pointer
 bne rembk1 ; loop if not end
 rts
*************************************************
* remove a breakpoint                           *
*************************************************
unset: ld x ,y ; get address of bp
 beq unset1 ; go if inactive
 ld a 2,y ; get contents
 st a ,x ; replace bp
 clr 0,y ; mark bp inactive
 clr 1,y
unset1: rts
*************************************************
* terminal driver (acia)                        *
*************************************************
termdr: clr dcberr,x ; no errors possible
 ld x dcbioa,x ; get i/o address
 lsr b ; read function?
 bcs termrd ; go if yes
 lsr b ; write functions?
 bcs termwt ; go if yes
 lsr b ; status function?
 bcs termst ; go if yes
 lsr b ; init function?
 bcc term1 ; go if not
 ld b #RESETRX
 st b CREG,x
 ld b #RESETTX
 st b CREG,x
 ld b #RESETMR
 st b CREG,x
 ld b #MR1
 st b MREG,x ; This store flips MREG to MR2
 ld b #MR2
 st b MREG,x
 ld b #B9600
 st b CSREG,x
 ld b #ENABLE ; enable RX and TX
 st b CREG,x
term1: rts
termrd: ld b SREG,x ; get status
 bit b #RXRDY 
 beq termrd ; loop if no input
 ld a RHR,x  ; get character
 rts
termwt: ld b SREG,x ; get status
 bit b #TXRDY ; ready for output?
 beq termwt ; loop if not
 st a THR,x ; output character
 rts
termst: ld a SREG,x ; get status
 and a #0FH ; $F mask off ready bits
 rts
************************************************
* psymon command table                         *
************************************************
cmdtbl: fcb 1 ; item length
 fcb 'M' ;  memory examine/change
 fdb memec
 fcb 'O' ; memory change
 fdb change
 fcb 'E' ; EEPROM burn!
 fdb eeprom
 fcb 'G' ; goto address
 fdb go
 fcb 'L' ; program load
 fdb tload
 fcb 'S' ; program save
 fdb tsave
 fcb 'R' ; register examine/change
 fdb regec
 fcb 'B' ; set/print breakpoints
 fdb setbk
 fcb 'U' ; unset breakpoints
 fdb unsbk
 fcb 0ffH ; end sentinel
************************************************
* ram initialization data                      *
************************************************
ramint: str "cn" ; console dcb id
 fdb termdr ; console driver
 fdb termnl ; console I/O address
 fdb 0 ; error status, ext
 fdb condcb ; dcb chain pointer
 fdb condcb ; dcb pointers
 fdb condcb
 fdb condcb
 fdb condcb
 fdb trap ; interrupt vectors
 fdb trap
 fdb intret
 fdb trap
 fdb brkpnt
 fdb trap
 fdb monent
************************************************
* interrupt handlers                           *
************************************************
hwswi3: jmp [swi3v] ; software interrupt 3
hwswi2: jmp [swi2v] ; software interrupt 2
firq: jmp [firqv] ; fast interrupt request
hwirq: jmp [irqv] ; interrupt request
hwswi: jmp [swiv] ; software interrupt
nmi: jmp [nmiv] ; non-maskable interrupt
************************************************
* software vectors                             *
************************************************
 org 0FFE0H ; $ffe0
 fdb dspsby ; display single byte
 fdb dspdby ; display double byte
 fdb gethex ; get hex number from console
 fdb pstrng ; print string to console
 fdb inchr  ; input character
 fdb outchr ; output character
 fdb reqio  ; perform I/O request
 fdb monent ; monitor re-entry
************************************************
* hardware vectors                             *
************************************************
 fdb init ; reserved by motorola
 fdb hwswi3 ; software interrupt 3
 fdb hwswi2 ; software interrupt 2
 fdb firq ; fast interruupt request
 fdb hwirq  ; interrupt request
 fdb hwswi  ; software interrupt
 fdb nmi  ; non-maskable interrupt
 fdb init ; restart
 end



More information about the cctalk mailing list