*DECK C$AKRD
          IDENT  C$AKRD 
          TITLE  CBAKRD -  ACTUAL KEY READ
  
          MACHINE  ANY,I
          COMMENT  ACTUAL KEY READ, START 
          SST 
          B1=1
          SPACE  4
**        CBAKRD - ACTUAL KEY READ ROUTINES 
* 
*         CALLING SEQUENCE - READS
* 
*                MX4  1 IF AT END OR INV KEY SPECIFIED
*                MX4  0 IF NOT ABOVE
*                SB3  KEY ORDINAL FOR C.RDSIS ONLY
*                SB6  RETURN ADDRESS
*                SA0  ADDR OF FIT 
*                EQ   C.RDNAK  FOR READ ... NEXT  (UPPER) 
*            OR  EQ   C.RDRAK  FOR RANDOM READ    (UPPER) 
*            OR  EQ   C.RDSIS  FOR READ WITH KEY
*                LINE NBR  (LOWER)
*                EQ   NORMAL RETURN 
*                   INV KEY OR AT END CODE (IF ANY) 
*                   NORMAL RETURN 
* 
*         CALLING SEQUENCE - START
* 
*                MX4  1 IF INV KEY SPECIFIED
*                MX4  0 IF NO INV KEY 
*                SB6  RETURN ADDRESS
*                SA0  ADDR OF FIT 
*                SX1  KEY LENGTH
*                SB3  KEY NUMBER
*                SB4  RELATION
*            +   EQ   C.STAAK 
*            -   LINE NBR 
*            +   EQ   NORMAL RETURN 
*                   INV KEY CODE
*                   NORMAL
* 
*         DOES   - ROUTES REQUESTS TO CRM 
* 
*         USES   - EVERYTHING EXCEPT A0 
*CALL IOMICROS
  
*CALL IODEFSC 
          EJECT 
          ENTRY  C.RDNAK
 C.RDNAK  BSS    0           READ NEXT (SEQUENTIAL READ)
          SB5    READNXT
          EQ     INIT 
          SPACE  2
          ENTRY  C.RDRAK
 C.RDRAK  BSS    0           READ RANDOM
          SB5    READR
          SB3    B0          SET FOR PRIME KEY
          EQ     INIT 
          SPACE  2
          ENTRY  C.STAAK
 C.STAAK  BSS    0           START
 CDCS     IFNE   OP.DCS,OP.NO 
          SA7    =XC.SVKO    SAVE KEY SUB-SCHEMA ORDINAL, IF ONE
 CDCS     ENDIF 
          SB5    START
          EQ     INIT 
          SPACE  2
          ENTRY  C.RDSAK
 C.RDSAK  BSS    0           READ WITH KEY PHRASE 
          SB5    READR
          EQ     INIT 
          SPACE  2
 INIT     BSS    0
          RJ     =XC.SVRTN   SAVE RETURN
          STORE  A0,EX==XC.AKEX  SET ERROR EXIT 
          FETCH  A0,RECA,X2  GET RECORD AREA ADDRESS
          STORE  A0,DX=ATEND-1  SET DATA EXIT 
 CDCS     IFNE   OP.DCS,OP.NO 
          FETCH  A0,DBFO,X4 
          ZR     X4,INIT1    JUMP IF I/O NOT VIA CDCS 
          STORE  A0,WSA=X2
 INIT1    BSS    0
 CDCS     ENDIF 
          FETCH  A0,FNEX,X5  GET OP FILE NOT THERE FLAG 
          JP     B5          GO TO ROUTINE
          SPACE  4
 READNXT  BSS    0           SEQUENTIAL READ
          NG     X5,ATEND    JUMP IF NOT THERE
          RJ     =XC.SETKR   SET TO KEY OF REFERENCE
 CDCS     IFNE   OP.DCS,OP.NO 
          FETCH  A0,DBFO,X4 
          ZR     X4,NTDB1    JUMP IF NOT A DB FILE
          RJ     =XC.DMRD1   -GETN- VIA CDCS
          EQ     =XC.SETDS   SET FILE-STATUS FOR DUP KEYS AND RETURN
 NTDB1    BSS    0
 CDCS     ENDIF 
          GETN   A0,X2       READ NEXT RECORD 
          EQ     =XC.SETDS   SET FILE-STATUS FOR DUP KEYS AND RETURN
          SPACE  2
 READR    BSS    0           RANDOM READ
          NG     X5,=XC.INVKY  TAKE THE INVALID KEY EXIT IF OP FILE NULL
          RJ     =XC.SETKY   SET KEY OF REFERENCE 
 CDCS     IFNE   OP.DCS,OP.NO 
          FETCH  A0,DBFO,X4 
          ZR     X4,NTDB2 
          RJ     =XC.DMRD2   -GET- VIA CDCS 
          EQ     =XC.SETDS   SET FILE-STATUS FOR DUP KEYS AND RETURN
 NTDB2    BSS    0
 CDCS     ENDIF 
          GET    A0,X2       GET RECORD IN QUESTION 
          EQ     =XC.SETDS   SET FILE-STATUS FOR DUP KEYS AND RETURN
          SPACE  2
 START    BSS    0           START
          STORE  A0,MKL=X3   SET KEY LENGTH 
          STORE  A0,REL=B4   SET RELATION 
          RJ     =XC.SETKY   SET KEY OF REFERENCE 
          FETCH  A0,KL,X5 
          IX5    X5-X3       CHECK SPECIFIED SIZE AGAINST KEY SIZE
          NZ     X5,MKOK     JUMP IF DIFFERENT - AK MAJ KEY ACCESS
          STORE  A0,MKL=X5   CLEAR MAJ KEY
 CDCS     IFNE   OP.DCS,OP.NO 
 MKOK     FETCH  A0,DBFO,X4 
          ZR     X4,MKOK1    JUMP IF I/O NOT VIA CDCS 
          RJ     =XC.DMSTR   -START- VIA CDCS 
          EQ     MKOK2
 MKOK1    BSS    0
 CDCS     ELSE   1
 MKOK     BSS    0
          START  A0          POSITION FILE
 CDCS     IFNE   OP.DCS,OP.NO,1 
 MKOK2    BSS    0
          STORE  A0,RL=B0    CLEAR FIELDS 
          STORE  A0,MKL=B0
          EQ     =XC.SETDS   SET FILE-STATUS FOR DUP KEYS AND RETURN
          SPACE  4
          DATA   0           FOR RJ FROM CRM - IS DATA EXIT 
 ATEND    BSS    0           AT END - MUST FOLLOW DATA 0
 CDCS     IFNE   OP.DCS,OP.NO,1 
          RJ     =XC.A0B1    RESTORE A0 AND B1 (IF CDCS CALL) 
          SB3    B0 
          RJ     =XC.SETKY   RESET KEY TO PRIME KEY AND REY OF REF TO SA
          EQ     =XC.ATEND   GO TO AT END PROCESS 
          END 
