.TITLE MISC .MCALL .READW,.WRITW,.PRINT ; ;get a character ; GETC:: CMP 6(R5),#512. ;END OF BUFFER? BLT 1$ ;YES, THEN GET ANOTHER BUFFER .READW #AREA,(R5),2(R5),#256.,4(R5) BCS E INC 4(R5) ;inc block # CLR 6(R5) ;clear buffer counter 1$: MOV 2(R5),R4 ;get char from buffer ADD 6(R5),R4 MOVB (R4),R0 INC 6(R5) ;inc buffer counter CLC E: RTS PC ; ; get from a text file ; GETT:: MOV R0,R5 ;set up io pointer 1$: JSR PC,GETC ;get char BCS EOF CMPB R0,#12 ;ignore line feed BEQ 1$ CMPB R0,#15 ;end if cr BEQ EOR MOVB R0,(R1)+ ;move char to user dest SOB R2,1$ ;go back for more EOR: MOV R1,R2 ;set eor pointer CLC ;io ok RTS PC ;return ; ;get char from object (binary) file ; GETB:: CLR -(SP) ;set up checksum MOV R0,R5 ;set up io pointers 1$: JSR PC,GETC ;get char BCS EOFF TSTB R0 ;ignore leading nulls BEQ 1$ CMPB R0,#1 ;wait for 1 BNE ERROR ;error if not INC (SP) ;add into checksum JSR PC,GETC ;get char BCS EOFF TSTB R0 ;next char must be a null BNE ERROR JSR PC,GETC ;get char BCS EOFF ADD R0,(SP) ;add to checksum MOVB R0,R3 ;save for rec length SWAB R3 CLRB R3 JSR PC,GETC ;get next half of rec length BCS ERROR ADD R0,(SP) ;add to checksum BISB R0,R3 ;put length together SWAB R3 SUB #4,R3 ;subtract the four bytes received so far 2$: JSR PC,GETC ;get char BCS EOFF ADD R0,(SP) ;add to checksum MOVB R0,(R1)+ ;move to user rec SOB R3,2$ ;get more JSR PC,GETC ;get checksum byte BCS EOFF ADD R0,(SP) ;add to it TSTB (SP) ;should be zero BNE ERROR ;if not then error TST (SP)+ ;restore stack MOV R1,R2 ;save eor pointer CLC ;io ok RTS PC ;return EOFF: TST (SP)+ CLR R0 EOF: SEC RTS PC ERROR: TST (SP)+ .PRINT #ERM MOV #-1,R0 BR EOF ; ;entry to get record ; GET:: TST 10(R0) ;check if binary file or ascii file BNE 1$ JSR PC,GETT ;ascii BR 2$ 1$: JSR PC,GETB ;binary 2$: RTS PC ; ; ascii write routine ; PUT:: MOV R0,R5 ;set up io pointers TST R2 BLE OUT 1$: MOVB (R1)+,R4 ;get one char JSR PC,WPUT ;output it BCS EOF SOB R2,1$ ;go back for more ; OUT: MOV R1,R2 ;set up eor pointer MOV #15,R4 ;output cr JSR PC,WPUT BCS EOF MOV #12,R4 ;output lf JSR PC,WPUT BCS EOF CLC ;io ok RTS PC ; WPUT:: CMP 6(R5),#512. ;buffer full? BLT 2$ .WRITW #AREA,(R5),2(R5),#256.,4(R5) BCC 4$ CLR R0 SEC RTS PC 4$: INC 4(R5) ;inc block pointer CLR 6(R5) ;clr buffer pointer MOV #256.,R0 ;pre zero counter MOV 2(R5),R3 3$: CLR (R3)+ SOB R0,3$ 2$: MOV 2(R5),R3 ;set up buffer pointer ADD 6(R5),R3 MOVB R4,(R3) ;place byte in buffer INC 6(R5) ;inc buffer counter CLC RTS PC ; ; radix 50 conversion ; $C5TA:: JSR PC,SAVREG MOV #R50P,R5 MOV R1,R50S MOV R0,6(R5) JSR PC,R50ASC JSR PC,RESREG ADD #3,R0 RTS PC ; ; octal to binary conversion ; $COTB:: CLR R1 1$: MOVB (R0)+,R2 CMPB R2,#'0 BLO 10$ CMPB R2,#'7 BHI 10$ SUB ZERO,R2 ASH #5,R2 .REPT 3 ROLB R2 ROL R1 .ENDR BR 1$ 10$: RTS PC ; ; save registers ; SAVREG:: MOV (SP)+,RTN MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) MOV RTN,PC RESREG:: MOV (SP)+,RTN MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 MOV RTN,PC ; .PSECT MISC,D ; RTN: .WORD 0 AREA: .BLKW 5 R50P: ; Parameter list for radix50 conversion .WORD 3 .WORD NOC .WORD R50S .WORD 0 NOC: .WORD 3 R50S: .WORD 0 ZERO: .ASCII /00/ ERM: .ASCIZ /Binary file read error (checksum)/ .END