// RemoteVMemInit1.bcpl - handles pulling in remote sysout // Last change November 30, 1981 9:59 PM by Bill van Melle // Last change September 7, 1981 1:04 PM by Bill van Melle get "LispBcpl.decl" get "VMem.decl" get "FtpProt.decl" get "AltoDefs.d" external [ // procedures defined here Retrieve; Wss; FixPassword // O.S. procedures CallSwat; Puts; PositionPage; WriteBlock; Ws // misc procedures used IndexedPageIO; LoadIPage; ReadStrng // pup procs BSPReadBlock // statics used LispFmap CtxRunning UserName; UserPassword // statics from RemoteVMemInit.bcpl VMStream; sysoutHost ] manifest [ firstMouseY = 50 lastMouseY = 800 ] //---------------------------------------------------------------------------- structure String: [ length byte; char↑1,255 byte ] //---------------------------------------------------------------------------- let Retrieve (remotePL, localPL) = valof [ // this two-level action needed to approve the file, // then retrieve it Ws ("*n{") Ws (sysoutHost) Ws ("}") Ws (remotePL>>PL.SFIL) Ws ("...") // print filename to show what we're doing resultis LispRetrieveFile ] and LispRetrieveFile (remotePL, localPL) = valof [ PositionPage (VMStream, FirstVmemBlock) let bspStream = CtxRunning>>FtpCtx.bspStream let buffer = CtxRunning>>FtpCtx.buffer let bufferLength = CtxRunning>>FtpCtx.bufferLength for i = 1 to FirstVmemBlock-1 // start at page 1--IFS has no leader page do BSPReadBlock (bspStream, buffer, 0, WordsPerPage lshift 1) // skip over the silly pages before the good stuff let nPages = lv remotePL>>FPL.SIZE nPages = (nPages!0 lshift 7 + nPages!1 rshift 9) / (bufferLength / WordsPerPage) // number of buffers full it will take to retrieve this let mouseInc = ((lastMouseY-firstMouseY) lshift 4) / nPages let mouseOff = mouseInc // thus the mouse crawls down screen as we read. // mouseInc is 2↑4 times amount to move per buffer full // mouseOff = mouseInc*pgno [ let bytesRead = BSPReadBlock (bspStream, buffer, 0, bufferLength lshift 1) FlipCursor() // flip once per buffer full (at same rate as ftp if 6 bufs) @mouseY = firstMouseY + (mouseOff rshift 4) if bytesRead eq 0 then break // done if (bytesRead & #777) ne 0 then CallSwat ("Sysout not integral number of pages") WriteBlock (VMStream, buffer, bytesRead rshift 1) mouseOff = mouseOff + mouseInc ] repeat resultis true ] and FlipCursor () be [ for i = 0 to 15 do cursorBitMap!i = not cursorBitMap!i ] and Wss (stream, str) be [ for i = 1 to str>>String.length do Puts(stream, str>>String.char↑i) ] and FixPassword (host) be [ Ws ("*n{") Ws (host) Ws ("} Login user: ") let haveDefaultName = UserName>>String.length gr 0 if haveDefaultName then Ws (UserName) unless ReadStrng (UserName, (UserName!-1 lshift 1) - 1, haveDefaultName) loop Ws (" (password) ") if ReadStrng (UserPassword, (UserPassword!-1 lshift 1) - 1, false, true) then return ] repeat