TriOS-alt/flash/bellatrix/PasDebug.spin

356 lines
13 KiB
Plaintext
Raw Normal View History

''****************************************
''* Propeller Assembly Source Debugger *
''* (PASD) needs PASD.exe on PC *
''****************************************
'' version 0.2 , August 2007
''
'' (c)2007 Andy Schenk, Insonix GmbH
'' www.insonix.ch/propeller
'' It's allowed to use this only for non commercial projects.
CON
BAUDRATE = 115200
VAR
long cog 'cog flag/id
long serpins '11 contiguous longs
long bitticks
long cpntr 'pointer to code in main ram
PUB start(rxpin, txpin, codeptr) : okay
'' Start PASD driver - starts a cog
'' returns false if no cog available
''
longfill(@serpins, 0, 3)
serpins := txpin<<16 + rxpin
bitticks := clkfreq / BAUDRATE
cpntr := codeptr
okay := cog := cognew(@entry, @serpins) + 1
repeat until bitticks == 0 'wait until PC ready
PUB stop
'' Stop the driver - frees a cog
if cog
cogstop(cog~ - 1)
DAT
'*********************************
'* Assembly language PASD driver *
'*********************************
org
entry
mov t1,par 'get parameter address
rdword t2,t1 'get rx_pin
mov rxmask,#1
shl rxmask,t2
add t1,#2 'get tx_pin
rdword t2,t1
mov txmask,#1
pasdi shl txmask,t2
add t1,#2 'get bit ticks
pasdd rdlong bittime,t1
pasdp add t1,#4 'get codepointer
pasdr rdlong cogadr,t1
sub t1,#4
or outa,txmask 'tx_pin = output/idle
or dira,txmask
call #charin 'wait until PC sends start
wrlong K0,t1 'report ready to spin
wrlong K0,sharep 'prepare execute
cmdloop call #charin 'wait for cmd from PC
cmp rxd,#5 wz 'mouse/debugger command?
if_nz jmp #cmdloop
call #charin 'Command
mov t1,rxd
and t1,#$7F
call #charin 'Val L
mov t2,rxd
call #charin 'Val H
shl rxd,#8
or t2,rxd
cmp t1,#"d" wz 'dump cog ram?
if_z jmp #dumpcog
cmp t1,#"m" wz 'dump hub-ram?
if_z jmp #dumphub
cmp t1,#"i" wz 'Init?
if_z jmp #initpar
cmp t1,#"r" wz 'Run/Cont?
if_z jmp #runcont
cmp t1,#"p" wz 'Stop? = Restart
if_z jmp #resetcog
cmp t1,#"s" wz 'Step?
if_z jmp #single
cmp t1,#"b" wz 'Set Break?
if_z jmp #setbrk
cmp t1,#"w" wz 'Write clong?
if_z jmp #wrcode
cmp t1,#"l" wz 'Low word clong
if_z jmp #lowword
cmp t1,#"h" wz 'High word clong
if_z jmp #highword
cmp t1,#"e" wz 'Execute clong
if_z jmp #execlong
jmp #cmdloop
'-------------
dumpcog mov t3,#511
movs i_getind,#0
dcloop mov op,i_getind
call #execute
mov op,i_write
call #execute
add i_getind,#1
rdlong t1,shareg
call #sendlong
djnz t3,#dcloop
mov op,i_nop
call #execute
jmp #cmdloop
'-------------
dumphub mov t3,#128
dhloop rdlong t1,t2
call #sendlong
add t2,#4
djnz t3,#dhloop
mov op,i_nop
call #execute
jmp #cmdloop
'-------------
resetcog cogstop cognr
mov t1,cogpar 'restart cog
shl t1,#14
or t1,cogadr
shl t1,#2
or t1,cognr
coginit t1
jmp #cmdloop
'-------------
initpar mov op,i_cogid 'get cogid
call #execute
mov op,i_write
call #execute
rdlong cognr,shareg
movs i_getind,#$1F0 'get cogpar-reg
mov op,i_getind
call #execute
mov op,i_write
call #execute
rdlong cogpar,shareg
mov t1,cogadr
call #sendlong
jmp #cmdloop
'-------------
runcont movs i_jump,t2 'start addr
wrlong K0,shareg 'clr brk addr
mov op,i_jump
call #execute 'jump
'-------------
waitbrk mov dtime,rate
waitlp test rxmask,ina wz 'if not rx start
if_z jmp #cmdloop
djnz dtime,#waitlp 'wait rate
mov t1,watchId
call #sendlong 'send ina repeatly
mov t1,ina
call #sendlong
rdlong t1,shareg
tjz t1,#waitbrk 'wait for break
shl t1,#16
or t1,brkId 'add Break ID
call #sendlong
jmp #cmdloop
'-------------
single movs i_getind,t2 'get Instr from addr
getsngl mov op,i_getind
call #execute
mov op,i_write
'dosngle call #execute
call #execute
rdlong op,shareg 'and execute
dosngle wrlong K0,shareg 'clr brk addr
call #execute
rdlong t1,shareg wz 'get addr+c/z
if_nz jmp #waitbrk 'if no break
mov op,i_break
call #execute 'force break ??
jmp #waitbrk
'-------------
execlong mov op,clong 'Exec 1 op in clong
jmp #dosngle
'-------------
lowword mov clong,t2
jmp #cmdloop
'-------------
highword shl t2,#16
or clong,t2
jmp #cmdloop
'-------------
setbrk wrlong i_break,shareg 'break instr
jmp #wrtoadr
'-------------
wrcode wrlong clong,shareg 'write code
wrtoadr movd i_setind,t2 'to addr
mov op,i_setind
call #execute
jmp #cmdloop
'-------------
i_getind mov pasdd,0-0 'opcodes for asm cog
i_write wrlong pasdd,pasdr
i_nop nop
i_cogid cogid pasdd
i_jump jmp #0-0
i_setind rdlong 0-0,pasdr
i_break jmpret pasdd,#0
i_clrd mov pasdd,#0
'-------------
execute wrlong op,sharep 'set instruction
mov dtime,#72
add dtime,cnt 'wait for execution
waitcnt dtime,#48
wrlong K0,sharep 'sync
waitcnt dtime,#32
execute_ret ret
'-------------
sendlong mov txd,t1 'send long t1 as 4 bytes
call #charout
mov txd,t1
shr txd,#8
call #charout
mov txd,t1
shr txd,#16
call #charout
mov txd,t1
shr txd,#24
call #charout
sendlong_ret ret
'-------------
charout and txd,#$FF 'send 1 character
mov txcnt,#10
or txd,#$100 'add stoppbit
shl txd,#1 'add startbit
mov dtime,cnt
add dtime,bittime
sendbit shr txd,#1 wc 'test LSB
mov ti,outa
if_nc andn ti,txmask 'bit=0 or
if_c or ti,txmask 'bit=1
mov outa,ti
waitcnt dtime,bittime 'wait 1 bit
djnz txcnt,#sendbit '10 times
waitcnt dtime,bittime '2 stopbits
charout_ret ret
'------------
charin test rxmask,ina wz 'wait until stop
if_z jmp #charin
charstart test rxmask,ina wz 'wait until startbit
if_nz jmp #charstart
mov dtime,bittime
shr dtime,#1
add dtime,bittime '1.5 bittime
add dtime,cnt
mov rxcnt,#8
mov rxd,#0
charbits waitcnt dtime,bittime
shr rxd,#1
test rxmask,ina wz 'shift in bits
if_nz or rxd,#$80
djnz rxcnt,#charbits
waitcnt dtime,bittime 'wait until stopbit
charin_ret ret
'------------
'
' Initialized data
'
sharep long $7FFC
shareg long $7FF8
K512 long 512
K0 long 0
d_inc long $200
brkId long $7F06
rate long 400_000
watchId long $0006
'
' Uninitialized data
'
t1 res 1
t2 res 1
t3 res 1
bittime res 1
dtime res 1
rxmask res 1
rxd res 1
rxbits res 1
rxcnt res 1
txmask res 1
txd res 1
txcnt res 1
ti res 1
clong res 1
op res 1
cognr res 1
cogadr res 1
cogpar res 1
vp res 1
vparr res 1
' Add this little debugger kernel at the begin of your Assembly code:
{
' --------- Debugger Kernel add this at Entry (Addr 0) ---------
long $34FC1202,$6CE81201,$83C120B,$8BC0E0A,$E87C0E03,$8BC0E0A
long $EC7C0E05,$A0BC1207,$5C7C0003,$5C7C0003,$7FFC,$7FF8
' --------------------------------------------------------------
}