// GateConDebug.bcpl - a simple remote debugger
// Last modified March 6, 1979 10:43 PM by Boggs
get "Pup0.decl"
get "Pup1.decl"
get "GateConServ.decl"
external
[
//outgoing procedures
Debugger
//incoming procedures
Gets; PutTemplate; Puts; Ws; Confirm
OpenLevel1Socket; CloseLevel1Socket
GetBuf; ReleasePBI; SendCommand
//incoming statics
dsp; keys
]
//----------------------------------------------------------------------------
let Debugger() be
//----------------------------------------------------------------------------
[
let printMode = 1
let address = 0
let number = 0
let contents = 0
let cellOpen = false
let gotNumber = false
let soc = vec lenPupSoc; OpenLevel1Socket(soc)
Ws("*NDebugger*N")
[
gotNumber = false
let char = nil
number = 0
[
char = Gets(keys)
test char ge $0 & char le $7
ifso
[
number = number lshift 3 + (char-$0)
Puts(dsp, char)
gotNumber = true
]
ifnot
[
if char eq $. & not gotNumber then
[
Puts(dsp, $.)
number = address
gotNumber = true
char = Gets(keys)
]
break
]
] repeat
switchon char into
[
case $*033: //escape
[
if gotNumber then [ Ws("?*N"); endcase ]
Puts(dsp, $$)
switchon Gets(keys) into
[
case $=: //octal
[ printMode = 1; endcase ]
case $←: //bytes
[ printMode = 2; endcase ]
default: Ws("?*N")
]
endcase
]
case $←:
[ Ws(" ←"); Print(contents, 2); endcase ]
case $=:
[ Ws(" ="); Print(contents, 1); endcase ]
case $/:
[
Ws("/ ")
address = gotNumber ? number, contents
contents = Examine(soc, address, printMode)
cellOpen = true
endcase
]
case $*N:
[
if gotNumber then
test cellOpen
ifso Deposit(soc, address, number)
ifnot Puts(dsp, $?)
cellOpen = false
Puts(dsp, $*N)
endcase
]
case $*L:
[
if gotNumber then
test cellOpen
ifso Deposit(soc, address, number)
ifnot [ Ws("?*N"); endcase ]
address = address+1
PutTemplate(dsp, "*N$5O/ ", address)
contents = Examine(soc, address, printMode)
cellOpen = true
endcase
]
case $↑:
[
if gotNumber then
test cellOpen
ifso Deposit(soc, address, number)
ifnot [ Ws("?*N"); endcase ]
address = address-1
PutTemplate(dsp, "↑*N$5O/ ",address)
contents = Examine(soc, address, printMode)
cellOpen = true
endcase
]
case $*177:
[
Ws(" XXX ")
endcase
]
case $Q: case $q:
[ if Confirm("*NQuit Debugger") break ]
default:
[ Ws(" ? "); endcase ]
]
] repeat
CloseLevel1Socket(soc)
]
//----------------------------------------------------------------------------
and Print(value, mode) be
//----------------------------------------------------------------------------
[
switchon mode into
[
case 1:
[ PutTemplate(dsp, " $6UO ", value); endcase ]
case 2:
[
PutTemplate(dsp, " $3O $3O ", value rshift 8, value & #377)
endcase
]
]
]
//----------------------------------------------------------------------------
and Examine(soc, address, mode) = valof
//----------------------------------------------------------------------------
[
let pbi = GetBuf(soc)
pbi>>PBI.pup.words↑1 = address
pbi>>PBI.pup.words↑2 = 1
pbi = SendCommand(pbi, ptExamine, pupOvBytes + 4)
if pbi then
[
let value = pbi>>PBI.pup.words↑3
ReleasePBI(pbi)
Print(value, mode)
resultis value
]
]
//----------------------------------------------------------------------------
and Deposit(soc, address, value) be
//----------------------------------------------------------------------------
[
let pbi = GetBuf(soc)
pbi>>PBI.pup.words↑1 = address
pbi>>PBI.pup.words↑2 = 1
pbi>>PBI.pup.words↑3 = value
pbi = SendCommand(pbi, ptDeposit, pupOvBytes + 6)
if pbi then ReleasePBI(pbi)
]