 ttl GIMIX IOP Debug ROM
 sttl Hardware Definitions
 abs
 pag

 lib constants
 lib macdefs
 lib iop_mem
 lib fio
 lib acia_6551
 lib clist
 lib outputq
 lib task
 lib tty
 lib vars
 sttl System Debug Code
 pag

 org DEBUGROM
*
* Vector of entry points
*
 fdb $1234 -- ROM present flag
 fdb DB_main Interractive debug monitor
 fdb DB_pdata
 fdb DB_phex
 fdb DB_phex2
 sttl Debug Routines
 pag

*
* Debug driver
*
DB_main pshs cc,d,x,y,u save all registers
 ldx #00f
 lbsr DB_pdata
10 ldx #01f print prompt
 lbsr DB_pdata
 lbsr DB_inch get character
 pshs a save character
 lda #'  let the guy know I saw it
 bsr DB_putch
 puls a restore character
 ldy #DB_cmds process command
20 tst 0,y end of table?
 beq 30f yes - error
 cmpa 0,y command match?
 bne 25f no - try next one
 jsr [1,y] yes - go process it
 bra 10b next command
25 leay 3,y next command entry
 bra 20b
30 ldx #02f illegal command
 bsr DB_pdata
 bra 10b
*
00 fcc $d,'IOP Debug',0
01 fcc $d,'>>',0
02 fcc ' ??',0

*
* Debug command table
*
DB_cmds
 fcb 'Q Quit - return to normal operation
 fdb quit
 fcb 'E Examine system memory
 fdb examine
 fcb 'M Modify system memory
 fdb modify
 fcb 'T Dump TTY Tables
 fdb dmp_tty
 fcb 'S Dump Task tables
 fdb dmp_task
 fcb 'R Print registers at time of entry to IOP DEBUG
 fdb dmp_regs
 fcb 0 end of table

* -- Quit debug mode
quit puls x return address from command processor
 puls cc,d,x,y,u,pc return to interrupt context

*
* This file contains routines for debug purposes.
*

DB_init pshs d,x save registers
 tst DB_iflg terminal initialized?
 bne 99f yes - exit
 lda #1
 sta DB_iflg
 ldx #DEBUGTRM reset terminal port
 sta status,x
 lda #$0B
 sta command,x
 lda SWITCH1 get baud rate from switches
 anda #$0F
 ora #$90 set up control info/baud rate
 sta control,x
99 puls d,x,pc

* Print character in (A) on debug port

DB_putch pshs d,x
 bsr DB_init initialize terminal if necessary
 ldx #DEBUGTRM
10 ldb status,x
 bitb #AC_XBSY xmitter busy?
 beq 10b
 sta data,x no - send character
 puls d,x,pc

* Print string (pointed to by X) on debug port

DB_pdata pshs d,x
10 lda ,x+ get next character
 beq 99f exit at end of string
 cmpa #CR map carriage returns to CR/LF
 bne 15f
 bsr DB_putch
 lda #NL send LF
15 bsr DB_putch
 bra 10b
99 puls d,x,pc return

* Print character in (A) in Hex

DB_phex pshs d,x
 ldx #00f string of nibbles
 lsra
 lsra
 lsra
 lsra
 lda a,x
 bsr DB_putch print character
 lda 0,s
 anda #$0F
 lda a,x
 bsr DB_putch print character
 puls d,x,pc
*
00 fcc '0123456789ABCDEF'

* Print the value in (D) in Hex
DB_phex2 pshs d
 bsr DB_phex print (A)
 lda 1,s
 bsr DB_phex print (B)
 puls d,pc return

* Print a space

DB_outsp lda #'
 bra DB_putch
*
* Read & Echo one character
*   DB_inch - Character in A
*
DB_inch pshs x save registers
 ldx #DEBUGTRM get port address
10 lda status,x wait for character present
 bita #AC_RBSY
 beq 10b
 lda data,x get character
 anda #$7F strip parity
 cmpa #'a map lower case -> upper case
 blo 20f
 anda #!$20
20 puls x restore register
 bra DB_putch print character
*
* Dump a range of memory (X..Y)
*
DB_dump pshs d,x,y,u
*
* Print one line (16 bytes) of data
*
10 lbsr DB_pcrlf start a new print line
 ldd 2,s print address
 lbsr DB_phex2
 lbsr DB_outsp
 lbsr DB_outsp
 ldx 2,s
 ldb #16 print 16 bytes
 pshs b
20 lda ,x+ get next byte to print
 lbsr DB_phex
 lbsr DB_outsp
 dec 0,s done?
 bne 20b no - go back
 ldx 1+2,s now print characters
 lbsr DB_outsp
 lbsr DB_outsp
 ldb #16
 stb 0,s
30 lda ,x+ get next byte
 cmpa #$20 printable?
 blo 35f no
 cmpa #$7F
 blo 40f go print character
35 lda #'. print period for unprintable
40 lbsr DB_putch print character
 dec 0,s done?
 bne 30b
 leas 1,s clean up stack
 stx 2,s update address
 cmpx 4,s any more?
 bls 10b yes - go to it
99 lbsr DB_pcrlf
 puls d,x,y,u,pc return

*
* DB_pcrlf - print carriage return/line feed
*
DB_pcrlf pshs d,x save registers
 ldx #CRLF
 lbsr DB_pdata
 puls d,x,pc return
CRLF fcc $d,0
 sttl DEBUG - Memory Modify Command
 pag
*
* Modify system memory
*
modify
 leas -2,s reserve temp space
 lbsr DB_getadr get starting address
 bcs mod99 exit if error
 std 0,s save address
*
mod10 ldx #modm00
 lbsr DB_pdata
 ldd 0,s print address
 lbsr DB_phex2
 lbsr DB_outsp
 ldx 0,s get byte address
 lda 0,x get value
 pshs a save current value
 lbsr DB_phex output it
 lbsr DB_outsp print a space
 lbsr DB_gethex get a hex digit
 bcs mod30 jump if error
 asla
 asla
 asla
 asla
 sta 0,s update value
 lbsr DB_gethex get second hex digit
 bcs mod40 exit if error
 ora ,s+ compute total value
mod20 ldx 0,s get memory address
 sta ,x+ update memory
 stx 0,s update address
 bra mod10 continue with next byte
*
mod30 cmpa #'. is it "go on" char?
 bne mod40 no - exit
 puls a restore original value
 bra mod20 yes - move to next address
*
mod40 leas 1,s clean up stack
mod99 puls x,pc return
*
modm00 fcc $d,'  - ',0
 sttl Memory Examine Command
 pag
*
* Examine memory (system)
*
examine
 leas -4,s reserve temp space
 lbsr DB_getadr get low address
 bcs 99f
 std 0,s save low limit
 lda #'-
 lbsr DB_putch
 lbsr DB_getadr get high address
 bcs 99f
 std 2,s save high limit
 puls x,y get limit registers
 lbsr DB_dump go dump memory
 rts exit
99 puls x,y,pc return - error

*
* get 4 hex digit address
*   return value in D
*
DB_getadr ldb #4 number of digits
 pshs b
 ldd #0 starting value
 pshs d
10 lbsr DB_gethex get a hex digit (in B)
 bcs 90f jump if error
 pshs a
 ldd 1,s fix up value
 aslb
 rola
 aslb
 rola
 aslb
 rola
 aslb
 rola
 orb ,s+
 std ,s
 dec 2,s done?
 bne 10b
 clc
90 puls d get value
 leas 1,s clean up stack
 rts return

*
* DB_gethex - get one hex digit
*
DB_gethex lbsr DB_inch read character
 cmpa #'0 check for legal digit
 blo 90f
 cmpa #'9
 bls 10f
 cmpa #'A legal digit?
 blo 90f no - error
 cmpa #'F
 bhi 90f
 adda #9 add bias
10 anda #$0F strip ASCII stuff
 clc
 rts all done - no error
90 sec illegal
 rts exit
 sttl Dump TTY Tables
 pag
*
* dmp_tty - dump TTY table
*
dmp_tty pshs d,x,y,u
 ldy #TTYTABS TTY table base address
 lda #MAX_TRM # TTYs in system
 pshs a
 ldx #00f
 lbsr DB_pdata
10 lbsr DB_pcrlf
 tfr y,d table address
 lbsr DB_phex2
 lbsr spc_2
 ldd tqin,y
 lbsr DB_phex2
 ldx #04f
 lbsr DB_pdata
 lda [tqin,y]
 lbsr DB_phex
 lbsr spc_2
 ldd tqout,y
 lbsr DB_phex2
 ldx #04f
 lbsr DB_pdata
 ldd [tqout,y]
 lbsr DB_phex2
 lbsr spc_2
 lda tflags,y
 lbsr DB_phex
 lbsr spc_2
 ldd tstate,y
 lbsr DB_phex2
 lbsr spc_2
 ldd tsold,y
 lbsr DB_phex2
 leay TTYSIZ,y next entry
 dec 0,s any more tables?
 bne 10b
 puls a clean stack
99 puls d,x,y,u,pc
*
00 fcc $d,'TTY   In Q    Out Q    Flag  State Sold',0
04 fcc '/',0
 sttl Dump Task Tables
 pag
*
* dmp_tasks - Print task tables
*
dmp_tasks pshs d,x,y,u
 ldx #00f
 lbsr DB_pdata
 lbsr DB_pcrlf
 lda #1 1=Busy, 0=Free
 pshs a
05 ldy #tsktab
10 lda tsstat,y get task state
 tst 0,s free or busy tasks?
 beq 11f jump for free
 cmpa #TFREE skip free tasks this time
 beq 20f
 bra 12f go print info
11 cmpa #TFREE skip non-free tasks this time
 bne 20f
12 tfr y,d
 lbsr DB_phex2
 bsr spc_2
 ldd tsstat,y
 lbsr DB_phex2
 bsr spc_2
 ldu umark0,y
 lda tsstat,y task sleeping?
 cmpa #TSLEEP
 bne 13f no
 ldd 0+7,u PC - in sleep
 bra 15f
13 ldd 0,u PC - from interrupt
15 lbsr DB_phex2
 bsr spc_2
 ldd tsevnt,y
 lbsr DB_phex2 event
 bsr spc_2
 lda tsdev,y
 lbsr DB_phex
 bsr spc_2
 lda tscmd,y
 lbsr DB_phex
 bsr spc_2
 ldd tsseq,y
 lbsr DB_phex2
 bsr spc_2
 lda tstval,y
 lbsr DB_phex
 lbsr DB_pcrlf
20 leay TSKSIZ,y
 cmpy #end_vars
 bne 10b
 dec 0,s next pass
 bpl 05b
 puls a clean stack
99 puls d,x,y,u,pc
00 fcc $d,'Task  State  PC   Event TTY CMD SEQ#  VAL',0
01 fcc '  ',0
spc_2 ldx #01b
 lbra DB_pdata
 sttl Dump IOP Registers
 pag

dmp_regs
 ldx #00f
 jsr DB_pdata
 leay 2,s point to stacked regs
 lda ,y+ CC
 jsr DB_phex
 ldx #01f
 jsr DB_pdata
 ldd ,y++ D
 jsr DB_phex2
 ldx #02f
 jsr DB_pdata
 ldd ,y++ X
 jsr DB_phex2
 ldx #03f
 jsr DB_pdata
 ldd ,y++ Y
 jsr DB_phex2
 ldx #04f
 jsr DB_pdata
 ldd ,y++ U
 jsr DB_phex2
 ldx #05f
 jsr DB_pdata
 tfr y,d
 jsr DB_phex2
 ldx #06f
 jsr DB_pdata
 ldd ,y++ D
 jsr DB_phex2
 rts
*
00 fcc $d,'CC = ',0
01 fcc   ', D = ',0
02 fcc   ', X = ',0
03 fcc   ', Y = ',0
04 fcc   ', U = ',0
05 fcc   ', S = ',0
06 fcc   ', PC = ',0
