// RemoteVMemInit1.bcpl - handles pulling in remote sysout // Last change August 1, 1983 5:50 PM by Bill van Melle // Last change January 21, 1983 11:10 AM by Bill van Melle // Last change June 8, 1982 10:42 PM by Bill van Melle // Last change April 11, 1982 5:40 PM by Bill van Melle // Last change December 29, 1981 11:50 AM by Bill van Melle // 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 UNPACKDT; WRITEUDT // misc procedures used CheckIPage; ReadStrng; AppendString // pup procs BSPReadBlock; UserClose; ReleasePBI // statics used LispFmap CtxRunning VmemStream; UserName; UserPassword; dsp; SysinName // statics from RemoteVMemInit.bcpl sysoutFailed; nameInSysinIndex; ftpBadPup ] 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") SysinName>>String.length = nameInSysinIndex-1 // fill in correct name now. remotePL is ephemeral, so copy AppendString(SysinName, remotePL>>PL.SFIL) Ws (SysinName) Ws (", ") let utv = vec 7 UNPACKDT (lv remotePL>>PL.CDAT, utv) WRITEUDT (dsp, utv) Ws ("...") // print filename to show what we're doing resultis LispRetrieveFile ] and LispRetrieveFile (remotePL, localPL) = valof [ PositionPage (VmemStream, FirstVmemBlock) let bspStream = CtxRunning>>FtpCtx.bspStream let buffer = CtxRunning>>FtpCtx.buffer let bufferLength = CtxRunning>>FtpCtx.bufferLength for i = 1 to FirstVmemBlock // 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 FlipCursor() CheckIPage(buffer) WriteBlock (VmemStream, buffer, WordsPerPage) let nPages = @(buffer + IFPNActivePages) - FirstVmemBlock // number of pages left to go let bufSize = bufferLength / WordsPerPage bufferLength = bufSize * WordsPerPage // make sure multiple of page size let nbufs = nPages / bufSize // number of buffers full it will take to retrieve this let mouseInc = ((lastMouseY-firstMouseY) lshift 4) / nbufs 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 bufBytes = bufferLength lshift 1 [ let bytesRead = BSPReadBlock (bspStream, buffer, 0, bufBytes) FlipCursor() // flip once per buffer full (at same rate as ftp if 6 bufs) @mouseY = firstMouseY + (mouseOff rshift 4) if bytesRead eq 0 then CallSwat("Sysout too short") // done if (bytesRead & #777) ne 0 then CallSwat ("Sysout not integral number of pages") WriteBlock (VmemStream, buffer, bytesRead rshift 1) nPages = nPages - bufSize if nPages le 0 then [ // last useful page has been read. // quickly eat the rest of the stream // better would be to abort the BSP connection // [ bytesRead = BSPReadBlock (bspStream, buffer, 0, bufBytes) ] repeatuntil bytesRead eq 0 sysoutFailed = false if ftpBadPup then [ ReleasePBI(ftpBadPup); ftpBadPup = 0 ] // or else BSPCloseSocket will hang if BSPReadBlock (bspStream, buffer, 0, bufBytes) gr 0 then // still stuff to read [ UserClose(true) // abort connection ] break ] 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