ASMB,L,C
      NAM RED.C,7 92060-16102 790403 REV. 1926 $CLIB
* 
*     NAME:   RED.C 
*     SOURCE: 92060-18056 
*     PGMR:   EARL STUTES 
* 
*************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977.  ALL RIGHTS     * 
* RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE-  * 
* REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * 
* OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.   * 
*************************************************************** 
      SPC 2 
* THIS IS THE TOP LEVEL DRIVE ROUTINE FOR THE COMPILER
* LIBRARY READ FUNCTION 
      SPC 3 
* PROC READFCB(FCB,BUFFER,LENGTH,LINE#);
* VALUE LENGTH;INTEGER LENGTH,LINE#;RECORD FCB; 
* INTEGER ARRAY BUFFER; 
* EXIT AT PARAMETER LIST + 1 WITH ERROR NUMBER IN A 
* EXIT AT PARAMETER LIST + 2 WITH RECORD NUMBER IN A AND
*      WORD COUNT IN B
* BEGIN 
*   ADDRESSSETUP; 
*   IF FCB.PROMPT <> 0 THEN 
*     EXEC(2,FCB.FLU,FCB.PROMPT,1); 
*   READARECORD;
*   IF ERROR THEN GO ERROR EXIT;
*   ALENGTH ;= B; 
*   WRITEAFTERREAD; 
*   IF ERROR THEN GO ERROR EXIT;
*   A := FCB.RECORD# := FCB.RECORD# + 1;
*   INCLUDE;
*   IF ERROR THEN GO ERROR EXIT;
*   B := RECORDLENGTH;
* END OF READFCB; 
      SKP 
      ENT RED.C 
      EXT C.GRW     ADDRESS OF THE WRITEAFTERREAD ROUTINE 
      EXT C.INS     ADDRESS OF THE INCLUDE ROUTINE
      EXT ADS.C     POINTER SETUP ROUTINE 
      EXT C.RC#     THE CURRENT RECORD #
      EXT C.??      THE FCB PROMPT CHARACTER AND FLAG 
* 
* PROC READFCB(FCB,BUFFER,LENGTH,LINE#);
* VALUE LENGTH;INTEGER LENGTH,LINE#;RECORD FCB; 
* INTEGER ARRAY BUFFER; 
* BEGIN 
ALEN  BSS 1 
RED.C BSS 1 
*   ADDRESSSETUP; 
      JSB ADS.C 
      DEC -2
*   IF FCB.PROMPT <> 0 THEN 
      LDA C.??,I
      SZA,RSS 
      JMP L00 
      JSB EXEC
      DEF *+4+1 
      DEF .2
      DEF C.FLU,I 
      DEF C.??,I
      DEF .1
*   READARECORD;
L00   JSB REDC. 
*   IF ERROR THEN GO ERROR EXIT;
      JMP RED.C,I 
*   ALENGTH := B; 
      STB ALEN
*   WRITEAFTERREAD; 
      JSB C.GRW,I 
*   IF ERROR THEN GO ERROR EXIT;
      JMP RED.C,I 
*   A := FCB.RECORD# := FCB.RECORD# + 1;
      LDA C.RC#,I 
      INA 
      STA C.RC#,I 
*   INCLUDE;
      JSB C.INS,I 
*   IF ERROR THEN GO ERROR EXIT;
      JMP RED.C,I 
*   B := RECORDLENGTH;
      LDB ALEN
* END OF READFCB; 
      ISZ RED.C 
      JMP RED.C,I 
      SKP 
* IT IS ASSUMED THAT THE REQUIRED ENVIRONMENT HAS BEEN SET UP 
* BY THE CALLING ROUTINE NAMELY THAT ALL PARAMETERS NECESSARY 
* FOR THE PROPER EXECUTION HAVE BEEN SET BEFORE THE CALL
* 
* IT IS ALSO ASSUMED THAT THE ROUTINE WILL RETURN TO P+1 ON 
* ERROR CONDITIONS WITH THE ERROR CODE IN THE A REGISTER. 
* 
* THE NORMAL RETURN WILL BE TO P+2 WITH THE WORD COUNT IN B 
* A AT THAT TIME WILL BE MEANINGLESS
      SPC 3 
*PROC READARECORD;
* BEGIN 
* INTEGER UP,SAVECOUNT,WORKCOUNT; 
* IF FCB.UNITRECORD THEN
*   EXEC(1,FCB.LU,USERBUFFER,RLENGTH) 
* ELSE
* [ IF (NOT BUFFERVALID) OR (FCB.BP > 128) THEN 
*   [ GETNEXTSECTOR(TRUE);
*     IF ERROR THEN GO TO ERROR EXIT; ] 
*   UP := 0;
*   WORKCOUNT := SAVECOUNT := DISCBUFFER[FCB.BP]; 
*   IF WORKCOUNT < 0 THEN 
*     GO EXIT 
*   ELSE
*   [ WHILE WORKCOUNT > 0 DO
*     [ FCB.BP := FCB.BP+1; 
*       IF FCB.BP > 128 THEN
*       [ GETNEXTSECTOR(TRUE);
*         IF ERROR THEN GO TO ERROR EXIT; ] 
*       USERBUFFER[UP] := DISCBUFFER[FCB.BP]; 
*       UP := UP+1; 
*       IF UP = RLENGTH THEN
*       [ B := RLENGTH; 
*         FCB.BP := FCB.BP + WORKCOUNT + 1; 
*         GO EXIT2;]; 
*       WORKCOUNT := WORKCOUNT-1 ]; 
*     FCB.BP := FCB.BP+2;]; 
*EXIT: B := SAVECOUNT;] 
*EXIT2: 
* END OF READARECORD; 
      SKP 
      EXT C.STR     FCB.STARTRACK 
      EXT C.FLU      THE FILE PRIMARY LU
      EXT C.BFF     THE FCB BUFFER POINTER
      EXT C.FAD     FMGR DIRECTORY ADDRESS
      EXT C.WRD 
BP    EQU C.WRD     DISC BUFFER POINTER 
      EXT EXEC      GUESS WHO 
      EXT C.PR1     THE CALLER'S FIRST PARAMETER
.UBUF EQU C.PR1 
      EXT C.FID     FCB ID WORD 
      EXT C.PR2      THE CALLER'S SECOND PARAMETER
RLEN  EQU C.PR2      LENGTH OF USER BUFFER
      EXT GES.C     THE READ/WRITE SECTOR WORK HORSE
*PROC READARECORD;
* BEGIN 
* INTEGER UP,SAVECOUNT,WORKCOUNT; 
UP    BSS 1         USER BUFFER POINTER 
SAVC  BSS 1         DISC RECORD LENGTH HOLDER 
WORKC  BSS 1         DISC RECORD WORKING COUNTER
.1    DEC 1 
.2    DEC 2 
.M1   DEC -1
      SPC 2 
B     EQU 1 
      ENT REDC. 
REDC. BSS 1 
* IF FCB.UNITRECORD THEN
      LDA C.FID,I   UNITRECORD FLAG IS THE SIGN BIT 
      SSA,RSS 
      JMP L0
*   EXEC(1,FCB.LU,USERBUFFER,RLENGTH) 
      JSB EXEC
      DEF *+4+1 
      DEF .1
      DEF C.FLU,I 
      DEF .UBUF,I 
      DEF RLEN,I
      JMP L5
* ELSE
* [ IF (NOT BUFFERVALID) OR (FCB.BP > 128) THEN 
L0    LDA C.BFF,I 
      AND =B77777 
      SZA,RSS 
      JMP GETIT 
      LDA BP,I
      ADA =D-129
      SSA 
      JMP L1
*   [ GETNEXTSECTOR(TRUE);
GETIT CCA 
      JSB GES.C 
*     IF ERROR THEN GO ERROR EXIT; ]
      JMP REDC.,I 
*   UP := 0;
L1    CLA 
      STA UP
*   WORKCOUNT := SAVECOUNT := DISCBUFFER[FCB.BP]; 
      LDB C.BFF 
      ADB BP,I
      LDA B,I 
      STA SAVC
*   IF WORKCOUNT < 0 THEN 
      SSA,RSS 
      JMP WHILE 
*     GO EXIT;
      JMP EXIT
*   ELSE
*      WHILE WORKCOUNT > 0 DO 
WHILE STA WORKC 
      SZA,RSS 
      JMP EWHIL 
*      [ FCB.BP := FCB.BP+1;
      ISZ BP,I
*        IF FCB.BP > 128 THEN 
      LDA BP,I
      ADA =D-129
      SSA 
      JMP L3
*        [ GETNEXTSECTOR(TRUE); 
      CCA 
      JSB GES.C 
*          IF ERROR THEN GO ERROR EXIT; ] 
      JMP REDC.,I 
*       END;
*       USERBUFFER[UP] := DISCBUFFER[FCB.BP]; 
L3    LDB C.BFF 
      ADB BP,I
      LDA B,I 
      LDB .UBUF 
      ADB UP
      STA B,I 
*       UP := UP+1; 
      ISZ UP
*       IF UP = RLENGTH THEN
      LDB UP
      CPB RLEN,I
      JMP *+2 
      JMP L4
*       [ B := RLENGTH; 
*         FCB.BP := FCB.BP + WORKCOUNT + 1; 
      LDA BP,I
      ADA WORKC 
      INA 
      STA BP,I
*         GO EXIT2;]
      JMP EXIT2 
*       WORKCOUNT := WORKCOUNT-1  ] 
L4    CCA 
      ADA WORKC 
      JMP WHILE 
EWHIL EQU * 
*   FCB.BP ;= FCB.BP+2  ];
      ISZ BP,I
* 
*FOLLOWING CODE CHANGED ON 790403 
*REV 1926-REMOVES FMP '005' TYPE ERROR. 
*NOTE, HOWEVER, THAT THE SPECIAL CASE WHEN
*RECORD POINTER > 128 IS IGNORED. 
* 
      LDB BP,I      POINTER > 128?
      ADB =D-129
      SSB,RSS 
      JMP OVER.     IF SO, IGNOR CHECK. 
      LDB C.BFF     GET BASE ADDRESS. 
      ADB BP,I      ADD OFFSET WORD POINTER.
      LDB B,I       SHOULD YIELD WORD CNT FOR RECORD. 
      CPB SAVC      MUST COMPARE WITH 1ST WORD OF RECORD. 
      JMP OVER. 
      LDA =D-5      SIMULATE -005 ERROR & RETURN. 
      JMP REDC.,I 
OVER. ISZ BP,I      'OVER.' LABEL ADDED!
* 
*THAT'S IT! 
* 
*EXIT: B := SAVECOUNT;
EXIT EQU *
      LDB SAVC
*EXIT2: 
EXIT2 EQU * 
L5    ISZ REDC. 
      JMP REDC.,I 
      END 
                    