Mercurial > hg > Members > kono > nitros9-code
changeset 2185:c0bb67e4bd97
Start of WireBug
author | boisy |
---|---|
date | Mon, 09 Mar 2009 01:03:07 +0000 |
parents | 410d0f81ff00 |
children | f2f1920e10e8 |
files | level1/cmds/calldbg.asm level1/modules/wbug.asm |
diffstat | 2 files changed, 467 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/cmds/calldbg.asm Mon Mar 09 01:03:07 2009 +0000 @@ -0,0 +1,48 @@ +******************************************************************** +* CallDBG - Calls the debugger +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2005/04/04 Boisy G. Pitre +* Created. + + nam CallDBG + ttl Calls the debugger + + ifp1 + use defsfile + endc + +tylg set Prgrm+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + + mod eom,name,tylg,atrv,start,size + + org 0 + rmb 450 +size equ . + +name fcs /CallDBG/ + fcb edition + +start + ldb #$01 + lda #$02 +* os9 F$Debug call debugger + swi + lda #$03 + ldb #$04 + leax start,pcr + +exit clrb + os9 F$Exit + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/wbug.asm Mon Mar 09 01:03:07 2009 +0000 @@ -0,0 +1,419 @@ +******************************************************************** +* wbug - WireBug for 6809/6309 +* +* $Id$ +* +* For Level 1, wbug must be run from the command line in order for +* the debugger to be properly setup. +* +* For Level 2, this module is called by the kernel at boot time. +* +* A process can invoke the debugger by executing an os9 F$Debug instruction. +* SWI can also invoke the debugger but should be reserved for breakpoints only. +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2005/04/03 Boisy G. Pitre +* Started. +* +* 2 2008/02/07 Boisy G. Pitre +* Revamped to use F$Debug for debugger entry and SWI for breakpoints. +* Confirmed working under Level 1, but under Level 2, system calls +* currently crash the CoCo 3. + + NAM KrnP3 + TTL WireBug for 6809/6309 + + IFP1 + USE defsfile + USE dwdefs.d + ENDC + + IFEQ LEVEL-1 +tylg SET Prgrm+Objct + ELSE +tylg SET Systm+Objct + ENDC +atrv SET ReEnt+rev +rev SET $00 +edition SET 2 + +cbsize EQU 24 + +* offsets into our on-stack storage + ORG 0 +callregs RMB 2 + IFEQ LEVEL-1 +l1exitvct RMB 2 + ENDC +combuff RMB cbsize +size EQU . + + +L0000 MOD eom,name,tylg,atrv,start,size + +SvcTbl equ * + fcb F$Debug + fdb dbgent-*-2 + fcb $80 + + +name EQU * + IFEQ LEVEL-1 + FCS /wbug/ + ELSE + FCS /KrnP3/ + FCB edition + +nextname FCC /KrnP4/ next module name to link to + FCB C$CR + ENDC + +subname FCS /dw3/ + +start +* attach to low level module + clra + leax subname,pcr + os9 F$Link + bcs ex@ + IFGT Level-1 + sty <D.DWSUB + ELSE + sty >D.DWSUB + ENDC +* install F$Debug system call + leay SvcTbl,pcr + os9 F$SSvc + bcs ex@ + leax brkent,pcr get pointer to breakpoint entry + IFEQ LEVEL-1 + stx >D.SWI store in D.SWI global + clrb clear carry +ex@ os9 F$Exit and exit + ELSE + stx <D.XSWI store in D.XSWI global +* get next KrnP module going +gol2 lda #tylg get next module type (same as this one!) + leax <nextname,pcr get address of next module name + os9 F$Link attempt to link to it + bcs ex@ no good...skip this + jsr ,y else go execute it +ex@ rts return + ENDC + + +* Breakpoint Entry +* +* We enter here when a process or the system executes an SWI instruction. +brkent + IFEQ LEVEL-1 +* In Level 1, we get called right from the SWI vector, so we need to set U to point to the registers on the stack. + leau ,s point X to regs on stack + leay rtiexit,pc + ENDC +* This is a breakpoint; back up PC to point at SWI + ldd R$PC,u + subd #$01 length of SWI instruction + std R$PC,u + IFEQ LEVEL-1 + bra cmn + ENDC + +* Code common to both debugger and breakpoint entries +* Debugger Entry +* +* We enter here when a process or the system executes an os9 F$Debug instruction. +dbgent + IFEQ LEVEL-1 + leay rtsexit,pc + ENDC +cmn pshs cc + orcc #IntMasks + leas -size,s make room on stack for temp statics + leax ,s point X to our temp statics + exg x,u exchange X and U + stx callregs,u save pointer to caller regs + IFEQ LEVEL-1 + sty l1exitvct,u + ENDC + pshs u + IFGT Level-1 + ldu <D.DWSUB + ELSE + ldu >D.DWSUB + ENDC + jsr ,u initialize I/O + puls u + + lda #OP_WIREBUG_MODE + IFEQ LEVEL-1 + ldb #$02 assume CoCo 2 + ELSE + ldb #$03 assume CoCo 3 + ENDC + std combuff,u + IFNE H6309 + lda #$03 6309 + ELSE + lda #$08 6809 + ENDC + sta combuff+2,u + lbsr _sendtohost + +* mainloop - processes requests from the server +mainloop + leax combuff,u point to comm buffer + pshs u + IFGT Level-1 + ldu <D.DWSUB + ELSE + ldu >D.DWSUB + ENDC +l@ + ldy #24 + ldd #133 + jsr 3,u get packet + cmpd #$0000 no data? + beq l@ + puls u +* bcs + tfr y,d put checksum in D + subb 23,x + cmpb combuff+23,u does it match the checksum from the packet? + beq processmsg if not, send checksum error + bsr _sendcsumerror + bra mainloop + +* Here we have a message with a valid checksum. +* Now we evaluate the command byte. +processmsg + lda combuff,u get command byte + cmpa #OP_WIREBUG_READMEM Read Memory? + lbeq _readmem branch if so + cmpa #OP_WIREBUG_READREGS Read Registers? + lbeq _readregs branch if so + cmpa #OP_WIREBUG_WRITEMEM Write Memory? + lbeq _writemem branch if so + cmpa #OP_WIREBUG_WRITEREGS Write Registers? + lbeq _writeregs branch if so + cmpa #OP_WIREBUG_GO Run Target? + bne mainloop + +_go +* clr combuff,u +* bsr _sendtohost + leas size,s recover space on stack + IFEQ LEVEL-1 + jmp [l1exitvct,u] + ENDC +rtsexit puls cc + clrb + rts +rtiexit puls cc + rti + + +* Destroys A +_sendcsumerror + lda #E$CRC +_senderror + sta combuff,u + bra _sendtohost + +* Destroys A +_sendillnumerror + lda #16 + bra _senderror + +* This routine reads memory from the calling process' address space +* using F$Move. +_readmem + ldx combuff+1,u get source pointer + ldb combuff+3,u get count + cmpb #1 + bge ok1@ +bad1@ bsr _sendillnumerror + bra mainloop +ok1@ cmpb #22 + bgt bad1@ if > 22, its illegal count + + IFEQ LEVEL-1 +* Level 1 copy + leay combuff+1,u point U to destination +l@ lda ,x+ get byte at Y and inc + sta ,y+ save byte at X and inc + decb done? + bne l@ branch if not + ELSE +* Level 2 copy + clra + tfr d,y put count in Y + pshs u,x save source pointer + leau combuff+1,u point U to destination + ldx D.Proc get current process pointer + lda P$Task,x get source task # + ldb D.SysTsk get destination task # + puls x restore source pointer + os9 F$Move move 'em out! + puls u restore statics pointer + ENDC + + bsr _sendtohost + lbra mainloop + + +* This routine writes memory from the host to the calling process' +* address space using F$Move. +_writemem + leax combuff+4,u point X to source + IFEQ LEVEL-1 +* Level 1 copy + ldb combuff+3,u get count of packet + ldy combuff+1,u get destination pointer +l@ lda ,x+ get byte at Y and inc + sta ,y+ save byte at X and inc + decb done? + bne l@ branch if not + ELSE +* Level 2 + clra + ldb combuff+3,u get count of packet + tfr d,y put count in Y + pshs u,x save on stack + ldu combuff+1,u get destination pointer + ldx <D.Proc get current process pointer + lda <D.SysTsk get source task # + ldb P$Task,x get destination task # + puls x restore source pointer + os9 F$Move move 'em out! + puls u restore our static pointer + ENDC + ldd #$0100 assume successful write + bsr _sendtohost + lbra mainloop + + +* This routine sends the contents of combuff,u to the communications +* hardware. +* +* Also, we compute the checksum as we send the bytes out so that +* we do not have to call a separate routine. +* +* Entry: +* X = address of packet to send +_sendtohost + leax combuff,u + ldb #23 B = count of packet - 1 + clra A = checksum +l@ adda ,x+ add up + decb until + bne l@ we've reached the end + sta ,x save computed checksum + leax -23,x + ldy #24 + pshs u + IFGT Level-1 + ldu <D.DWSUB + ELSE + ldu >D.DWSUB + ENDC + jsr 6,u write it out + puls u,pc + + +* Target registers: DO NOT CHANGE! +TASK_REGS +REG_STATE RMB 1 +REG_PAGE RMB 1 +REG_SP RMB 2 +REG_U RMB 2 +REG_Y RMB 2 +REG_X RMB 2 +REG_F RMB 1 F BEFORE E, SO W IS LEAST SIG. FIRST +REG_E RMB 1 +REG_B RMB 1 B BEFORE A, SO D IS LEAST SIG. FIRST +REG_A RMB 1 +REG_DP RMB 1 +REG_CC RMB 1 +REG_MD RMB 1 +REG_V RMB 2 +REG_PC RMB 2 +TASK_REG_SZ EQU *-TASK_REGS + + +_readregs + ldy callregs,u get pointer to caller's regs + leax combuff+1,u + ldb R$DP,y + stb ,x+ DP + ldb R$CC,y + stb ,x+ CC + ldd R$D,y D + std ,x++ + IFNE H6309 + ldd R$W,y W + exg a,b + std ,x++ + ELSE + leax 2,x + ENDC + ldd R$X,y X + exg a,b + std ,x++ + ldd R$Y,y Y + exg a,b + std ,x++ + ldd R$U,y U + exg a,b + std ,x++ + + IFNE H6309 +* construct MD from shadow register in NitrOS-9 globals + lda >D.MDREG MD + sta ,x+ + tfr v,d + std x++ V + ELSE + leax 3,x + ENDC + + ldd R$PC,y + std 2,x PC + ldy >D.Proc get SP from proc desc + ldd P$SP,y + std ,x + bsr _sendtohost + lbra mainloop + + + +_writeregs + ldy callregs,u get caller's reg ptr + ldd combuff+1,u + std R$DP,y + ldd combuff+3,u + std R$D,y + IFNE H6309 + ldd combuff+5,u + std R$W,y + ENDC + ldd combuff+7,u + std R$X,y + ldd combuff+9,u + std R$Y,y + ldd combuff+11,u + std R$U,y + + ldd combuff+17,u + std R$PC,y + + ldy >D.Proc + std P$SP,y + + lbra mainloop + + EMOD +eom EQU * + END