// GateConIO.bcpl // Last modified March 6, 1979 10:39 PM by Boggs get "AltoDefs.d" external [ // outgoing procedures GetString; GetNumber; Confirm; Ws; Wss // incoming procedures Puts; Gets; Resets; Endofs; Block PutTemplate; BackSpace; DefaultArgs SetTimer; TimerHasExpired; MoveBlock // incoming statics dsp; keys ] structure String [ length byte; char^1,255 byte ] //---------------------------------------------------------------------------- let GetString(prompt, addr, echo, char; numargs na) = valof //---------------------------------------------------------------------------- // returns false if del is typed (return to command level) // addr is the address of the string that should get the result. // prompt is a prompt string printed in the obvious places [ Resets(keys) DefaultArgs(lv na, 2, true, 0) if prompt ne 0 then Ws(prompt) let count = 0 [ char = char ne 0 ? char, Gets(keys); switchon char into [ case $*N: case $*S: case $*033: case $*T: [ Puts(dsp, $*S) addr>>String.length = count resultis count ] case $*027: //word delete [ if echo then for i = count to 1 by -1 do BackSpace(dsp, addr>>String.char^i) count = 0 endcase ] case $*177: //command delete [ Ws(" XXX") resultis false endcase ] case $*001: //^A case $*010: //BS [ if count ne 0 & echo then [ BackSpace(dsp, addr>>String.char^count) count = count -1 ] endcase ] default: [ if count ls 255 & char gr 40b then [ count = count +1 addr>>String.char^count = char if echo then Puts(dsp, char) ] endcase ] ] char = 0 ] repeat ] //---------------------------------------------------------------------------- and GetNumber(string; numargs na) = valof //---------------------------------------------------------------------------- [ Resets(keys) if na gr 0 then Ws(string) let res = 0 let count = 0 [ let char = Gets(keys); switchon char into [ case $0: case $1: case $2: case $3: case $4: case $5: case $6: case $7: [ Puts(dsp, char) res = (res lshift 3) + (char&7) endcase ] case $*001: case $*010: [ if count ne 0 then [ BackSpace(dsp, $0+(res&7)) res = res rshift 3 ] endcase ] case $*N: case $*S: case $*033: [ Puts(dsp, $*S); resultis res ] case $*177: [ Ws(" XXX"); resultis 0 ] ] ] repeat ] //---------------------------------------------------------------------------- and Confirm(prompt; numargs na) = valof //---------------------------------------------------------------------------- [ Resets(keys) if na gr 0 then Ws(prompt) Ws(" [Confirm] ") let cursor = vec 16; MoveBlock(cursor, cursorBitMap, 16) MoveBlock(cursorBitMap, table [ 0; 1700b; 3740b; 7160b; 6060b; 60b 160b; 340b; 700b; 600b; 600b; 600b; 0; 0; 600b; 600b ], 16) manifest blinkInterval = 30 let timer = nil; SetTimer(lv timer, blinkInterval) let down = false let ok = valof [ test utilIn>>UtilIn.yellow eq 0 ifso down = true ifnot if down then [ Ws("Yes."); resultis true ] unless Endofs(keys) switchon Gets(keys) into [ case $Y: case $y: case $*N: [ Ws("Yes."); resultis true ] case $N: case $n: case $*177: [ Ws("No."); resultis false ] default: [ Ws("Yes or No: "); endcase ] ] if TimerHasExpired(lv timer) then [ for i = 0 to 15 do cursorBitMap!i = not cursorBitMap!i SetTimer(lv timer, blinkInterval) ] Block() ] repeat MoveBlock(cursorBitMap, cursor, 16) resultis ok ] //---------------------------------------------------------------------------- and Wss(stream, string) be //---------------------------------------------------------------------------- for i = 1 to string>>String.length do Puts(stream, string>>String.char^i) //---------------------------------------------------------------------------- and Ws(string) be Wss(dsp, string) //----------------------------------------------------------------------------