.TITLE $$$023 - BREAK .IDENT /791112/ .MCALL .WRITW,.READW .GLOBL FB.EOF,FB.EOL,FB.ST2,FB.ST3,FB.VLD .GLOBL FB.BUF,FB.CHN,FB.LEN,FB.BLK .GLOBL FS.IN,FS.DIR,FS.OUT,FS.TTY,FS.EOF,FS.EOL .GLOBL V.AREA,P.ERD,P.ENO ; PARMS ; 1. POINTER TO FILE BLOCK ; REGISTER USE ; R0 - SCRATCH ; R1 -> FILE BLOCK ; R3 - SCRATCH ; R4 -> FILE BUFFER ; .PSECT $$$023:: MOV 2(SP),R1 MOV (SP)+,(SP) ; P.FBRK::MOV R3,-(SP) MOV R4,-(SP) BITB #FS.OUT,FB.ST2(R1) ;CHECK IF FILE OPEN FOR OUTPUT BEQ BRKER0 MOV R1,R4 ;POINTER TO FILE BLOCK ADD #FB.BUF,R4 ;POINTER TO START OF BUFFER BITB #FS.DIR,FB.ST3(R1);IS BUFFER DIRTY? BEQ REINIT ;NO, SKIP THE WRITE BITB #FS.IN,FB.ST2(R1) ;CHECK FOR UPDATE MODE BNE 4$ MOV (R1),R0 ;CURRENT BUFFER POSITION MOV FB.VLD(R1),R3 ;CURRENT VALID DATA COUNT BEQ 3$ 1$: CLRB (R0)+ ;CLEAR UP SOB R3,1$ 3$: CMP FB.BLK(R1),FB.LEN(R1);CHECK FOR EOF BEQ BRKER1 4$: .WRITW #V.AREA,FB.CHN(R1),R4,#256.,FB.BLK(R1) BCS P.EWR ;WRITE ERROR INC FB.BLK(R1) ;INCREMENT TO NEXT BLOCK NUMBER ; REINIT: MOV R4,(R1) ;RE-INITIALIZE BUFFER VARIABLE POINTER MOV #512.,FB.VLD(R1) ;...AND COUNT BICB #FS.DIR,FB.ST3(R1) ;NEW BUFFER NOT DIRTY YET ; BITB #FS.IN,FB.ST2(R1) ;UPDATE MODE? BEQ BRKFIN ;NO, SKIP READ OF NEXT BLOCK CMP FB.BLK(R1),FB.LEN(R1) ;CHECK FOR EOF BNE 8$ ; CLR FB.VLD(R1) ;SET EOF BISB #FS.EOF,FB.EOF(R1) BISB #FS.EOL,FB.EOL(R1) BR BRKFIN ; 8$: .READW #V.AREA,FB.CHN(R1),R4,#256.,FB.BLK(R1) BCS BRKER2 ASL R0 ;NUMBER OF BYTES READ MOV R0,FB.VLD(R1) ;VALID DATA BYTES ; BRKFIN: MOV (SP)+,R4 MOV (SP)+,R3 RTS PC ; BRKER0: JMP P.ENO BRKER1: FATAL BRKER2: JMP P.ERD P.EWR:: FATAL .END