/ / / / / / / / / / /COPYRIGHT (C) 1978,1979 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / /VERSION=1 / .TITLE SUBROUTINE GETREC /GETREC MAINTAINS THE POINTERS TO TREC, AND FETCHES A /RECORD FROM MASS STORAGE INTO TABLE TOVER. IF CFLAG /IS SET, GETREC FETCHES QUESTION POINTED TO BY CQUES. /WHEN DIRLOC POINTS AT RECORD 777, GETREC SETS /EXITFG AND RETURNS. GETREC SEARCHES FORWARD AND SETS /NEW QUESTION POINTERS WHEN IFLAG IS SET. .NOLIST BE .RSECT GETREC .NOLIST LN OCTAL XLIST .INCLUDE MACLIB.MA XLIST .MCALL USERV,HANDL,CLEAR .ENTRY GETR .EXTERNAL DIRBLK,LOGNUM,TABLE1,PAGEFG,QUES,CLOC,FLDPTR,RECBLK .EXTERNAL DIRFLG,DIRLOC,CFLAG,NEWFLG,CQUES,EXITFG,MAIN11 .EXTERNAL TREC,RECPTR,TFLD,TOVER,IFLAG,RECFLD,RECLOC,ERR1 .EXTERNAL ENTR1,TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,TTYPTR .EXTERNAL TEMP7,TEMP10,EREC,IQUES,EQUES,QUEPTR,MAIN12,TYPE FIELD 1 GETR, 0 CLA TAD (CIF CDF) RDF CDF .FLD DCA GETR20 /SETUP FOR EXIT CDF TABLE1 TAD CFLAG SZA CLA JMS I CF /IF CFLAG SET, GO FIND CHANGE QUESTION TAD IFLAG SZA CLA JMS I IFGN /IF IFLAG SET, GO FIND BRANCH QUESTION CDF TABLE1 TAD END CIA TAD DIRLOC TAD PAGEFG /DIRLOC IS INITIALIZED TO RECPTR /PAGEFG ALLOWS LAST THREE PAGES OR /FIRST THREE (BLOCK PHASING) SMA JMS I GET /IF END OF CURRENT DIRECTORY GO GET /NEXT CLA TAD DIRLOC DCA 10 /SETUP 10 TO POINT AT CURRENT QUESTION DCA TEMP3 /INITIALIZE BLOCK TALLY TAD I 10 TAD (-777 SNA JMP GETR11 /SET EXIT FLAG IF LAST RECORD TAD (777 DCA QUES /NOT LAST, SAVE QUESTION NUMBER TAD I 10 DCA TEMP2 /SAVE "ADDRESS" IN PSEUDOFIELD TAD I 10 JMP ACDEB BEDCA, DCA RECFLD /GET AND SAVE PSEUDOFIELD TAD 10 DCA DIRLOC /SAVE POINTER TO NEXT QUESTION TAD TEMP2 AND (7000 /ISOLATE THREE HIGH ORDER BITS CLL RTR;RTR;RTR;RTR /MULTIPLY BY TWO TAD TEMP3 DCA TEMP3 /ADD NUMBER OF BLOCKS FROM HIGH ORDER BITS TAD TEMP2 AND (777 DCA TEMP2 /NEXT GET DISPLACEMENT INTO PSEUDO FIELD GETR2, TAD TEMP2 TAD (-400 SPA JMP GETR3 DCA TEMP2 ISZ TEMP3 JMP GETR2 /FORM A LOOP WHICH CALCULATES NUMBER /OF BLOCKS TO ADD TO BASE TO GET BEGINNING /BLOCK OF DESIRED RECORD. GETR3, CLA TAD FLDPTR TAD RECFLD TAD (-1 /GET CORRECT DISPLACEMENT FOR /STARTING BLOCK OF CURRENT PSEUDOFIELD DCA 10 TAD I 10 /GET THE STARTING BLOCK NUMBER TAD TEMP3 /TEMP3 HAS NUMBER OF BLOCKS INTO PSEUDOFIELD DCA RBLK /STORE STARTING BLOCK NUMBER FOR HANDLER CALL TAD RBLK DCA RECBLK /SAVE STARTING BLOCK TAD TEMP2 DCA RECLOC /SAVE DISPLACEMENT INTO STARTING BLOCK TAD ENTR1 DCA GETR5 /SETUP PARAMETERS FOR MASS STORAGE CALL HANDL GETR6,GETR4,RBLK,ERR12,GETR5 /GO GET TWO BLOCKS CONTAINING RECORD AND /LOAD INTO TABLE TOVER GETR20, 0 JMP I GETR /RETURN GETR11, ISZ EXITFG TAD GETR20 DCA .+1 0 /TAKE DIFFERENT RETURN TO MAIN JMP I PSS2 /HERE WHEN RECORD 777 REACHED GETR4, TOVER GETR5, 0 GETR6, 0420 RBLK, RECBLK PSS2,MAIN12 /MAIN ENTRY TO AVOID TTY OUTPUT CF,CFG IFGN,IFG GET,GETR1 END,EREC /POINTER TO END OF RECORD DIRECTORY TABLE PAGE /THIS SECTION OF CODE IS BRANCHED TO IF THE CFLAG IS SET, /INDICATING THAT THE USER WISHES TO CHANGE THE ANSWER TO /A PREVIOUS QUESTION. THE CURRENT POINTERS ARE SAVED, /AND A SEARCH FOR THE QUESTION IS PERFORMED. CFG, 0 TAD DIRLOC DCA TEMP6 TAD LOGNUM DCA TEMP7 /SAVE ALL CURRENT TREC POINTERS TAD TTYPTR DCA 10 DCA I 10 /REMOVE # CHARACTER FROM TTY BUFFER JMS CHECK TAD (-4 SMA /CHECK THAT RESPONSE IS 3 OR LESS CHARACTERS JMP ERR13 TAD (4 /RESTORE NUMBER OF CHARACTERS JMS DEC /GO CONVERT FROM DECIMAL ASCII FORMAT /TO BINARY NUMBER DONE, DCA CQUES /ENTRY IN UQUES FORMED TAD CQUES SNA JMP ERR13 /ZERO IS NOT A VALID USER NUMBER DCA CLOC /PRESERVE USER QUESTION NUMBER CFG10, TAD CQUES TAD QUEPTR DCA 11 TAD I 11 SNA JMP ERR13 /IF ENTRY IS ZERO, QUESTION HAS NOT /BEEN ASKED YET DCA CQUES /SYSTEM RECORD NUMBER IS ENTERED IN UQUES /BY VIRTUE OF USER QUESTION NUMBER DISPLACEMENT /IN TABLE TQUES /NOW SEARCH BACKWARDS IN TREC FOR RECORD /DIRECTORY ENTRY CFG4, CLA CLL CMA RTL TAD DIRLOC CFG1, DCA TEMP5 /BACKUP ONE RECORD TAD TEMP5 DCA 11 TAD I 11 CIA TAD CQUES SNA CLA JMP CFG3 /GET RECORD NUMBER AND CHECK FOR MATCH TAD RECPTR TAD (3 CIA TAD 11 SPA CLA JMP CFG2 /CHECK IF ANY RECORD POINTERS LEFT IN CORE CLA CLL CMA RTL TAD TEMP5 JMP CFG1 /CONTINUE SEARCHING /HERE WHEN NEXT PREVIOUS SEGMENT OF DIRECTORY /IS REQUIRED CFG2, STA TAD LOGNUM SPA JMP ERR13 /BACKWARD SEARCH THROUGH TREC FOR ALL /SEGMENTS COMPLETE WTIHOUT FINDING /USER SPECIFIED NUMBER JMS I GET1 /GO GET DIRECTORY SEGMENT TAD DIRLOC TAD (600 DCA DIRLOC /POINT TO END OF DIRECTORY TABLE FOR /BACKWARD SEARCH JMP CFG4 /CONTINUE THE SEARCH GET1, GETR1 CFG3, STA TAD 11 DCA DIRLOC /SETUP TO ASK THIS QUESTION ERT, JMP I CFG DEC, 0 /HERE TO CONVERT USER QUETION NUMBER RESPONSE /TO BINARY NUMBER CIA DCA DEC10 /STORE PASSED PARAMETER.(NO. OF CHARACTERS) CDF TABLE1 TAD TTYPTR IAC DCA 10 /POINT TO TTY IN BUFFER DEC2, DCA DECNUM /INITIALIZE RESULT STORAGE TAD DECNUM CLL RTL /CURRENT RESULT X 4 TAD DECNUM /=NUMBER X 5 CLL RAL /=NUMBER X 10 TAD I 10 /ADD NEXT CHARACTER TAD (-260 /STRIP OFF ASCII BASE ISZ DEC10 JMP DEC2 /CONTINUE UNTIL SPECIFIED PASSES DONE JMP I DEC /AC CONTAINS ANSWER DECNUM,0 /PARTIAL RESULT STORAGE DEC10,0 /COUNTER FOR NUMBER OF PASSES TRC, TREC CFG12,EQUES /POINTER TO END OF UQUES TABLE ERR13, CLA TAD (13 JMP CIRR /THIS SECTION OF CODE WILL SEARCH FOR THE RECORD TO BE /BRANCHED TO IF AN I TYPE CONDITIONAL IS TRUE. PARAMETER /PASSED IS CQUES. IF CQUES IS EQUAL TO QUES-1, /A TIGHT LOOP IS DESIRED AND BRANCH IS TO /QUES-1. OTHERWISE, SEARCH FOR RECORD IS IN /FORWARD DIRECTION DOWN THE SCRIPT TABLE. PAGE IFG, 0 TAD DIRLOC TAD (-11 /POINT TO PREVIOUS RECORD IN TREC /ADD BASE DCA 12 /SETUP AUTOINDEX TAD I 12 /GET THE PREVIOUS RECORD NUMBER CIA TAD CQUES SNA CLA JMP IFG1 /CHECK FOR PREVIOUS QUESTION DESIRED. TAD DIRLOC DCA TEMP6 TAD DIRFLG DCA TEMP7 TAD QUES DCA TEMP10 /SAVE CURRENT TREC POINTERS CLA CLL CMA RAL TAD TEMP6 /EACH ITERATION OF FOLLOWING LOOP BUMPS /12 ONCE TO FETCH RECORD NUMBER, THEN /TWICE TO POINT AT NEXT RECORD. DCA 12 IFG4, CLA CLL CML RTL TAD 12 DCA 12 /POINT TO NEXT RECORD NUMBER IN DIRECTORY IFG5, TAD (-7575 TAD I 12 SNA JMP ERR14 TAD (7575 /IF RECORD NUMBER EQUALS -7575, END OF TREC REACHED CIA TAD CQUES SNA CLA JMP IFG2 /CHECK FOR RECORD NUMBER MATCH TAD 12 TAD PAGEFG /ADD CURRENT LOCATION PLUS PHASE PAGE TO /CHECK FOR END OF CURRENT RECORD DIRECTORY /OVERLAY. CIA TAD IFG10 /CHECK FOR END OF DIRECTORY SEGMENT. SPA CLA JMP IFG3 /END OF SEGMENT. GO GET NEXT JMP IFG4 /CONTINUE SEARCHING IFG2, STA TAD 12 /GET POINTER TO RECORD, BACKUP TO RECORD /NUMBER AND RENINITIALIZE RECORD LOCATION /POINTER. DCA DIRLOC DCA IFLAG /RESET I FLAG JMP I IFG /DONE SEARCH. GO BRING IN RECORD IFG3, TAD DIRFLG CIA TAD DIRBLK SPA CLA JMP ERR14 /CHECK FOR AT LEAST ONE MORE BLOCK OF /DIRECTORY. IFG6, JMS I GET2 /YES. GO GET TWO BLOCKS CDF TABLE1 TAD DIRLOC DCA 12 JMP IFG5 /CONTINUE SEARCH /HERE WHEN REPEAT OF PREVIOUS RECORD DESIRED IFG1, TAD DIRLOC TAD (-11 /BACKUP PAST I, R, RECORDS TO PREVIOUS RECORD DCA DIRLOC DCA IFLAG /RESET I FLAG ISZ IQUES /PREVENT INCREMENTING USER QUESTION NUMBER /IF REPEATING PREVIOUS QUESTION. CDF .FLD JMP I IFG ERR14, CLA /END OF DIRECTORY WITHOUT FINDING TARGET RECORD TAD LOGNUM SMA CLA JMP ER14 /IF LOGNUM IS NEGATIVE, START AGAIN AT BEGINNING /OF RECORD DIRECTORY (BRANCH BACK) JMP IFG6 /ERROR 50,ILLEGAL BRANCH ATTEMPTED ER14, TAD (50 JMP GERR GET2, GETR1 /POINTER TO RECORD DIRECTORY OVERLAY SUBROUTINE IFG10,EREC /POINTER TO END OF RECORD DIRECTORY OVERLAY CIRR, DCA CIRR1 ISZ IQUES DCA CFLAG TAD TEMP6 DCA DIRLOC TAD CIRR1 CDF .FLD CIF ERR1 JMS I RETUY 1 /OUTPUT ERROR MESSAGE AND RETURN TO QUESTION RETUY,ERR1 /LINK TO ERROR ROUTINE CIRR1,0 /TEMPORARY STORAGE FOR ERROR NUMBER PAGE /THIS SERVICE ROUTINE BRINGS IN TWO BLOCKS OF RECORD /DIRECTORY. IT TRACKS THE "PHASE" SINCE ONLY THE /FIRST 3 PAGES OF THE FIRST READ ARE USED, AND /THE SECOND THREE PAGES OF THE SECOND READ; /AND SO FORTH. GETR1, 0 DCA GETR14 TAD CFLAG SZA CLA JMP PHAS2 /IF CFLAG IS SET, GOING IN /BACKWARDS SEARCH ISZ LOGNUM NOP /DONT ALLOW ISZ TO BYPASS CLL PHAS3, CLL TAD LOGNUM RAR TAD LOGNUM DCA DIRFLG /MULTIPLY LOGICAL SEGMENT NUMBER /BY 1.5 TO GET STARTING BLOCK SNL CLA TAD (200 DCA PAGEFG /IF LINK IS ET, STARTING LOCATION /IN DIRECTORY IS 200 SZL TAD (200 TAD RECPTR TAD GETR14 DCA DIRLOC /INITIALIZE MOVING POINTER TO TREC ACCORDING /TO PAGE PHASE. TAD DIRFLG TAD TFLD DCA GETR12 /CACULATE STARTING BLOCK FOR /HANDLER CALL TAD ENTR1 DCA GETR13 /SETUP ENTRY ARGUMENT CDF .FLD HANDL GETR6,TRC,GETR12,ERR16,GETR13 CDF TABLE1 /GO GET TWO BLOCKS OF DIRECTORY JMP I GETR1 /RETURN WHEN READ DONE PHAS2, STA TAD LOGNUM DCA LOGNUM DCA GETR14 JMP PHAS3 /CFLAG IS SET, DECREMENT /LOGNUM FOR BACKWARD /SEARCH GETR14,0 /TEMP STORAGE FOR TYPE R BYPASS DISPLACEMENT ERR16, CLA TAD (16 JMP GERR RETU,ERR1 /LINK TO ERROR ROUTINE GETR12,0 GETR13,0 ERR12, CLA TAD (12 JMP GERR /HERE FOR COMMON FATAL ERROR EXIT GERR, CDF .FLD CIF ERR1 JMS I RETU 2 CHECK, 0 /HERE TO CHECK USER CHANGE ENTRY LIMITS CLA DCA CHECK3 /INITIALIZE CHAR. TALLY COUNT CHECK2, TAD I 10 TAD (-215 SNA JMP CHECK1 /CHECK FOR TRUNCATED ENTRY TAD (215-260 SPA JMP ERR13 /USER ENTRY MUST BE GREATER THAN ZERO TAD (260-272 SMA CLA JMP ERR13 /USER ENTRY MUST BE LESS THAN DECIMAL NINE ISZ CHECK3 /MAINTAIN TALLY OF NUMBER OF CHARACTERS BEFORE /CARRIAGE RETURN JMP CHECK2 /CONTINUE LOOP TIL CR. CHECK1, TAD CHECK3 JMP I CHECK /RETURN TO CALLER CHECK3,0 /NUMBER OF CHAR. INTTY BUFFER WHEN # REQ. ACDEB, CLL RAR RTR TAD (10 AND (27 SZL TAD (10 JMP BEDCA /RIGHT JUSTIFY FIELD BITS (GREATER THAN 32K)