.TITLE BLOCK HANDLES BLOCK READ OF DB FILES .IDENT /03/ ; ; ; MODIFIED BY: P. GANDHI ; ; ; DATED: MARCH 1979 ; ; ; CALLING SEQ: ; ; CALL BOPEN(FILNO,BUFADR,BUFSIZ,RTNCD,FILNAM,NAMSIZ,DISK#,RECSIZ) ; ; FILNO - DATA BASE FILE NUMBER ; ; BUFADR - BUFFER ADDRESS TO BE USED FOR READ ; ; BUFSIZ - BUFFER SIZE ; ; RTNCD - RETURN CODE ; ; IF NO USING DATA BASE FILE ADD FOLLOWING ; ; FILNAM - FILE NAME STRING IF NOT DATA BASE FILE ; ; NAMSIZ - SIZE OF ABOVE STRING ; ; DISKNO - DISK NUMBER OF ABOVE FILE ; ; RECSIZ - RECORD SIZE OF ABOVE FILE ; .MCALL FDBDF$,NMBLK$,OPEN$,QIOW$S,CLOSE$ ; ; SEPARATE PSECT FOR FDB (MUST BE IN ROOT) ; .PSECT BFDB,RW,D,GBL,OVR FDB: FDBDF$ ; .PSECT BOPEN:: CLR @10(R5) ; CLEAR RETURN CODE MOV #1,SECLOW ;INIT SECTOR NUMBER CLR SECHI ; CMP (R5),#5 ;EXTERNAL FILE NAME IN CALL BLT 5$ ;NO DATA BASE FILE TO OPEN ; MOV 12(R5),FNMADR ; GET FILE NAME ADDRESS MOV @14(R5),FNMSZ ; GET FILE NAME STRING SIZE MOVB @16(R5),DV+2 ; MOVE DISK NUMBER MOV @20(R5),RECSIZ ; GET RECORD SIZE BR OPEN ; GO OPEN FILE ; 5$: MOV @2(R5),R2 ;GET FILE# PARM-1 MOV #SGA+184.,R3 ;POINT TO FILE DEFINITION TBL DEC R2 CLC ;CALC ADDRESS OF FILE NAME IN TBL MOV #38.,R1 MUL R2,R1 BCS OPERR ADD R1,R3 ; MOVB (R3)+,DV+2 ; GET DEVICE UNIT NUMBER INC R3 ; POINT TO FILE NAME BYTE MOV 32.(R3),RECSIZ ; GET RECORD SIZE ; MOV (R3)+,FNM ;GET FILE NAME MOV (R3)+,FNM+2 MOV (R3),FNM+4 MOV #FNM,FNMADR ; SET UP FILE NAME ADDRESS MOV #FNMEND-FNM,FNMSZ ; AND FILE NAME SIZE ; OPEN: OPEN$ #FDB,#FA.SHR!FO.RD,#1,#DSDESC,,#FD.RWM,#FDB,#0 BCS OPERR ;OPEN FAILURE ; MOV 4(R5),BUFADR ;STORE ADDRESS OF WORK BUFFER PARM-2 MOV @6(R5),BUFSIZ ;STORE SIZE OF WORK BUFFER PARM-3 CLR EOFIND ;CLEAR EOF INDICATOR MOV #512.,BUFBLK ;STORE DEFAULT SECNDRY BUFSIZ CMP RECSIZ,BUFBLK ;COMPARE IT TO RECSIZ BLE 25$ ;BRANCH IF RECSIZ LE SECTOR MOV RECSIZ,BUFBLK ;USE RECSIZ AS SECNDRY BFRSIZ 25$: CLR R2 ;CLEAR LEFT HAND REG MOV BUFSIZ,R3 ;SET UP FOR ROUNDING ASH #177767,R3 ;RIGHT SHIFT 9 BITS ASH #11,R3 ;LEFT SHIFT 9 BITS MOV R3,BUFSIZ ;SAVE ROUNDED PRIMARY BUFR SIZ JSR PC,RDBUF ;READ FIRST BUFFER RETURN ;RETURN TO CALLER OPERR: MOV #1,@10(R5) ;OPEN FAILURE INTO PARM-4 RETURN ;RETURN TO CALLER BREAD:: MOV EOFIND,@4(R5) ;STORE PREVIOUS EOF INDICATOR INTO PRM-2 BNE RET ;EOF!!!! MOV DISP,R1 ;CLEAR SECONDARY DISPLACEMENT ADD DISPB,R1 ;STORE PRIMARY DISPLACEMENT ADD BUFADR,R1 ;POINT TO PRIMARY BUFR SEGMENT MOV RECSIZ,R0 ;STORE RECSIZ INTO R0 MOV 2(R5),R2 ;STORE REC BUF ADR INTO R2 30$: MOV (R1)+,(R2)+ ;MOVE INTO REC BUF DEC R0 DEC R0 BNE 30$ CHECK: ADD RECSIZ,DISP ;BUMP SECNDRY DISP CMP BUFBLK,DISP BLE GETNXT MOV DISP,R1 ADD RECSIZ,R1 CMP BUFBLK,R1 BLT GETNXT RETURN GETNXT: ADD BUFBLK,DISPB CLR DISP CMP BUFSIZ,DISPB BLE RDNXT RETURN RDNXT: JSR PC,RDBUF RET: RETURN RDBUF: QIOW$S #IO.RVB,#1,#1,,#STAT,, CMP #0,NCRD BEQ RDERR CLR DISPB CLR DISP MOV NCRD,BUFSIZ CLR R2 MOV BUFSIZ,R3 DIV #1000,R2 ADD R2,SECLOW ADC SECHI RETURN RDERR: MOV #2,EOFIND RETURN BCLOSE:: CLOSE$ #FDB RETURN QIOP: QIOP1: BUFADR: .WORD 0 QIOP2: BUFSIZ: .WORD 0 QIOP3: .WORD 0 QIOP4: SECHI: .WORD 0 QIOP5: SECLOW: .WORD 1 QIOP6: .WORD 0 ; STAT: RTCD: .WORD 0 NCRD: .WORD 0 BUFBLK: .WORD 512. EOFIND: .WORD 0 DSDESC: .WORD DVSZ,DV .WORD UICSZ,UIC FNMSZ: .WORD 0 FNMADR: .WORD FNM DV: .ASCII /DB0:/ DVSZ=.-DV UIC: .ASCII /[100,105]/ UICSZ=.-UIC .EVEN FNM: .ASCII / / .ASCII /.DAT/ FNMEND=. ; RECSIZ: .WORD 0 BLKFAC: .WORD 0 DISP: .WORD 0 DISPB: .WORD 0 .PSECT SGA050,RW,D,GBL,OVR SGA: .BLKW 2560. .END