// PupTest.bcpl - Pup package test program
// Copyright Xerox Corporation 1979, 1982
// Last modified February 15, 1982 5:10 PM by Boggs
get "Pup0.decl"
get "Pup1.decl"
get "PupTest.decl"
external
[
// outgoing procedures
Command; RemoteControl; PupTestFinish; SysErr
// incoming procedures
InitPupTest; CreateKeyboardStream
EtherBoot; Junta; MyFrame; Zero; MoveBlock
Ws; Wss; Confirm; PutTemplate
Gets; Puts; Endofs; Closes
Block; CallContextList; Dismiss
AddToZone; Free; Allocate; Enqueue; Dequeue; FlushQueue
OpenLevel1Socket; CloseLevel1Socket; ExchangePorts
CompletePup; SetAllocation; GetPBI; ReleasePBI
EchoUser; MiscServices; BSPSend; EFTPSend
PrintPupRT; PrintStatistics
// outgoing statics
State; Cmmd; checksums; checkdata; pbiCount
// incoming statics
keys; dsp; sysZone; spyBuffer
lvUserFinishProc; savedFinish
checkBuffer; ctxQ; sendPort; tp; bootFlag
numNets; socketQ; pbiFreeQ; dPSIB; pupRT
lenPup; lenPBI; maxPupDataBytes; overlapDataWithAck
]
manifest [ levBcpl = 3; stkLim = 335b ]
static
[
State; Cmmd; codeEnd; pbiCount
checksums = false
checkdata = false
]
structure Byte↑0,0 byte
//----------------------------------------------------------------------------
let PupTest(blv) be
//----------------------------------------------------------------------------
[
codeEnd = blv!29
InitPupTest()
Junta(levBcpl, AfterJunta)
]
//----------------------------------------------------------------------------
and AfterJunta() be
//----------------------------------------------------------------------------
[
CreateKeyboardStream()
//Add the remaining stack and the Juntaed OS parts to sysZone
let freeBegin = @stkLim
@stkLim = MyFrame() -120
AddToZone(sysZone, freeBegin, @stkLim-freeBegin)
AddToZone(sysZone, InitPupTest, codeEnd-InitPupTest) //Init code
let freeSlop = Allocate(sysZone, 1250) //later dynamic allocation needs
pbiCount = 0
[ //allocate as many additional pbis as we can
let pbi = Allocate(sysZone, lenPBI, true)
if pbi eq 0 break
Enqueue(pbiFreeQ, pbi)
pbiCount = pbiCount +1
] repeatwhile pbiCount ls 32767/maxPupDataBytes
Free(sysZone, freeSlop)
pbiCount = pbiCount-numNets
let soc = socketQ!0
while soc ne 0 do
[
SetAllocation(soc, pbiCount, pbiCount-1, pbiCount-1)
soc = soc!0
]
let fakeSoc = dPSIB - offset PupSoc.psib/16
SetAllocation(fakeSoc, pbiCount, pbiCount-1, pbiCount-1)
CallContextList(ctxQ!0) repeat
]
//----------------------------------------------------------------------------
and PupTestFinish() be
//----------------------------------------------------------------------------
[
@420b = 0; for i = 0 to 30000 loop
(table [ 63000b; 1401b ])(177776b)
@lvUserFinishProc = savedFinish
if bootFlag then EtherBoot(10b)
]
//----------------------------------------------------------------------------
and SysErr(p1, errNo, p2, p3, p4, p5) be
//----------------------------------------------------------------------------
[
let t = p1; p1 = errNo; errNo = t
(table [ 77403b; 1401b ])("Sys.errors", lv p1)
]
//----------------------------------------------------------------------------
and Command() be
//----------------------------------------------------------------------------
[
Cmmd = 0
[
Ws("*N> ")
State = stateStop
Block() repeatwhile Endofs(keys) & Cmmd eq 0
let char = Endofs(keys) ? Cmmd, Gets(keys)
switchon char into
[
case $*S:
[ Cmmd = 0; loop ]
case $C: case $c:
[
Ws("Pup checksums ")
Ws(checksums ? "disabled", "enabled")
checksums = not checksums
endcase
]
case $D: case $d:
[
Ws("Data Checking ")
Ws(checkdata ? "disabled", "enabled")
checkdata = not checkdata
endcase
]
case $E: case $e:
[ EchoUser(); endcase ]
case $S: case $s:
[ BSPSend(); endcase ]
case $Q: case $q:
[
if Cmmd eq 0 then unless Confirm("Quit ") endcase
finish
]
case $R: case $r:
[ EFTPSend(); endcase ]
case $P: case $p:
[
Ws("Print ")
switchon Gets(keys) into
[
case $R: case $r:
[ PrintPupRT(); endcase ]
case $S: case $s:
[ PrintStatistics(); endcase ]
case $?:
[ Ws("?*NRoutingTable, Statistics"); endcase ]
default: [ Puts(dsp, $?); endcase ]
]
endcase
]
case $M: case $m:
[ MiscServices(); endcase ]
case $?:
[
Ws("?*NEcho, SendBSP, Misc services, Quit")
Ws("*NPrint, Checksums, DataChecking, R=EFTP")
endcase
]
]
] repeat
]
//----------------------------------------------------------------------------
and RemoteControl() be //the context by which PupControl controls PupTest
//----------------------------------------------------------------------------
[
let lastID = 0
let controlSoc = vec lenPupSoc
OpenLevel1Socket(controlSoc, table [ 0; 0; socketPupControl ])
[
Block() repeatwhile controlSoc>>PupSoc.iQ.head eq 0
let pbi = Dequeue(lv controlSoc>>PupSoc.iQ)
unless pbi>>PBI.pup.type eq typeCmmd do
[ ReleasePBI(pbi); loop ]
if pbi>>PBI.pup.id↑2 ne lastID then
[
lastID = pbi>>PBI.pup.id↑2
let cb = lv pbi>>PBI.pup.words↑1
MoveBlock(sendPort, lv cb>>Cmmd.sendport, lenPort)
Cmmd = cb>>Cmmd.cmmd
checksums = cb>>Cmmd.checksums ne 0
checkdata = cb>>Cmmd.data ne 0
overlapDataWithAck = cb>>Cmmd.overlapDataWithAck ne 0
]
let stat = lv pbi>>PBI.pup.words↑1; Zero(stat, lenStats)
stat>>Stats.thruput = tp>>TP.thruput
stat>>Stats.avethruput = tp>>TP.aveThruput
stat>>Stats.state = State
stat>>Stats.checksums = checksums
stat>>Stats.data = checkdata
stat>>Stats.overlapDataWithAck = overlapDataWithAck
ExchangePorts(pbi)
CompletePup(pbi, typeOK, lenStats*2+pupOvBytes)
] repeat
]