// ReadVec.sr // Last modified October 20, 1979 6:02 PM by Taft get "BRAVO1.DF"; get "AltoFileSys.D"; get "OM.DF"; get "VM.Df"; get "Q.Df"; get "BFS.Def"; // Incoming Procedures external [ ult; errhlt; move; ugt movec; umin; ActOnPages; RealDA ]; // Incoming Statics external [ fillInDA; DCread; DCwrite dnbp ]; // Outgoing Procedures external [ ReadVec; RW; FindCfc ]; // Outgoing Statics // Local Statics manifest [ pmidCw = 5; pmidVecDest = 6 pmidCwMaxMove = 7; pmidBwdF = 11 cwFill = -2 ] // R E A D V E C // let ReadVec(cfa,cw,vecDest; numargs na) be [ let bwdF = cfa >> CFA.fa.charPos rshift 1 if bwdF ne 0 then errhlt("fp1"); if na ne 3 then errhlt("na"); if cw eq cwFill then errhlt("cwF"); RW(cfa, cw, vecDest, DCread); ]; // R W // and RW(cfa, cw, vecDest, dc) be [ let buf = vec #400; let firstPage = cfa >> CFA.fa.pageNumber; let firstDA = cfa >> CFA.fa.da; while cw ne 0 do [ manifest biteSize=64; let DAs=vec biteSize; let CAs = vec biteSize movec(DAs, DAs+biteSize-1, fillInDA) movec(CAs, CAs+biteSize-1, buf) DAs=DAs-firstPage; DAs!firstPage=firstDA let lastPage = firstPage; let fileId = vec 3; fileId ! 0 = cfa >> CFA.fp.version; move(lv cfa >> CFA.fp.serialNumber, fileId+1, 2); CAs = CAs-firstPage; let lastPageFound = nil; let numCharsLast = nil; if vecDest ne 0 then [ for pgn = firstPage to firstPage+biteSize-1 do [ lastPage = pgn; if pgn eq 0 then [ CAs ! pgn = buf; if dc eq DCwrite then errhlt("p0"); loop; ] if ult(cw, #400) then [ // done by movec // if (cw ne 0) then // CAs ! lastPage = buf; break; ]; CAs ! pgn = vecDest vecDest = vecDest+#400; cw = cw-#400; ]; ] if (dc eq DCwrite) & (vecDest ne 0) & ult(cw, #400) & (cw ne 0) then [ move(vecDest, buf, cw); ]; lastPageFound=ActOnPages(CAs, DAs, fileId, firstPage, lastPage, dc, lv numCharsLast) cfa >> CFA.fa.da = DAs ! lastPageFound; cfa >> CFA.fa.pageNumber = lastPageFound; cfa >> CFA.fa.charPos = numCharsLast; if (vecDest ne 0) & (lastPageFound ne lastPage) then errhlt("lp"); if (vecDest ne 0) & ult(cw, #400) & (cw ne 0) then [ move(buf, vecDest, cw); break; ]; if numCharsLast ne #1000 then break firstPage=lastPageFound+1; firstDA=DAs!firstPage ] ] // T C B U F T O V E C // // and TcBufToVec(zone,FReturn) = valof // [ let scanParams = zone >> CBZ.extra; // let qBufRead = scanParams >> SCP.qBufRead // let frameLC = scanParams >> SCP.fmCaller // until LengthQ(qBufRead) eq 0 do // [ let buf = Dequeue(qBufRead) // let ca = buf >> BUF.ca // Enqueue(scanParams >> SCP.qBufFree,buf) // let pwSrc = ca+frameLC ! pmidBwdF // if (frameLC ! pmidCw eq cwFill) then // frameLC ! pmidCw = @pwSrc // let tcwRem = frameLC ! pmidCw // let tcwRemMove = frameLC ! pmidCwMaxMove // let tcwScan = umin(#400-frameLC ! pmidBwdF,tcwRem) // let tcwMove = umin(tcwScan,tcwRemMove) // unless (tcwRemMove eq 0) then // [ move(pwSrc,frameLC ! pmidVecDest,tcwMove) // frameLC ! pmidCwMaxMove = tcwRemMove-tcwMove // frameLC ! pmidVecDest = frameLC ! pmidVecDest+tcwMove // ] // frameLC ! pmidBwdF = 0 // unless (tcwRem eq cwNil) then // frameLC ! pmidCw = tcwRem-tcwScan // ] // test (frameLC ! pmidCw eq 0) ifso // resultis tcDone // ifnot resultis tcToYou // ] // L F I LE // and FindCfc(fptr,dblL) be [ let cfa = vec lCFA move(fptr,cfa,lFP) cfa >> CFA.fa.pageNumber = 0 cfa >> CFA.fa.da = RealDA(cfa >> CFA.fp.leaderVirtualDa) cfa >> CFA.fa.charPos = 0 ReadVec(cfa,-1,0) dblL ! 0 = ((cfa >> CFA.fa.pageNumber-1) << FPG.hi) lshift 9 dblL ! 1 = (((cfa >> CFA.fa.pageNumber-1) << FPG.lo) lshift 9)+cfa >> CFA.fa.charPos ]