.TITLE P.RDWR PASCAL READ AND WRITE ROUTINES .PSECT P$RDWR .GLOBL P$FGET,P$FPUT,P$TCIA ;MISC IN=4 OUT=2 ;PASCAL FILE BLOCK OFFSETS EOF=2 LUN=3 MAXSIZ=4 LINK=8. FDBPNT=8. HOWOPN=18. FILE=20. BUFHDR=30. BUFSIZ=30. MODE=32. STATUS=33. VALID=34. DOSBUF=36. BUFFER=38. .PAGE .SBTTL P$FRDC - READ CHARACTER .GLOBL P$FRDC P$FRDC: ;PASCAL READ CHARACTER PROCEDURE ;REGISTERS ;USES: R3 ;R3 -> PASCAL FILE BLOCK ;SETS: R0 ;R0 = RETURNED CHARACTER ;DESTROYS: R1,R2 ;STACK TEMPS: 1 WORD CLR -(SP) BITB #1,MODE(R3) ;ASCII => TERMINAL BEQ TRDC MOVB @(R3),(SP) MOV #1,R0 JSR PC,P$FGET BR XRDC TRDC: MOV #1,R0 JSR PC,P$FGET MOVB @(R3),(SP) XRDC: MOV (SP)+,R0 BIC #177400,R0 RTS PC .PAGE .SBTTL P$FWRC - WRITE CHARACTER .GLOBL P$FWRC P$FWRC: ;PASCAL WRITE CHARACTER PROCEDURE ;REGISTERS ;USES: R0,R3 ;R0 = CHARACTER TO BE WRITTEN ;R3 -> PASCAL FILE BLOCK ;DESTROYS: R0 LF=012 CR=015 CMPB #LF,R0 ;IF LF, INSERT CR AHEAD OF IT BNE WRC MOVB #CR,@(R3) MOV #1,R0 JSR PC,P$FPUT MOVB #LF,R0 WRC: MOVB R0,@(R3) MOV #1,R0 JSR PC,P$FPUT RTS PC .PAGE .SBTTL P$FWRS - WRITE STRING .GLOBL P$FWRS P$FWRS: ;PASCAL WRITE STRING PROCEDURE ;REGISTERS ;USES: R0,R1,R3 ;R0 -> STRING ;R1 = LENGTH OF STRING ;R3 -> PASCAL FILE BLOCK ;DESTROYS: R0,R1,R2 TST R1 BLE WRSRET MOV R0,R2 WRSLOP: MOVB (R2)+,@(R3) MOV #1,R0 JSR PC,P$FPUT SOB R1,WRSLOP WRSRET: RTS PC .PAGE .SBTTL P$FWRI - CONVERT AND WRITE INTEGER .GLOBL P$FWRI P$FWRI: ;CONVERTS INTEGER IN R0 ;TO STRING, RIGHT ADJUSTED IN ;A FIELD, WITH LEADING ZEROS ;SUPPRESSED. IF NEGATIVE, A '-' ;IS PREFIXED. ;REGISTERS ;USES: R0,R1,R3 ;R0 = (SIGNED) INTEGER TO BE OUTPUT ;R1 = FIELD WIDTH ;R3 -> PASCAL FILE BLOCK ;DESTROYS: R0,R1,R2 ;SAVES AND RESTORES: R4 ;STACK TEMPS: 6 WORDS MOV R4,-(SP) ;SAVE R4 MOV R3,-(SP) ;SAVE PFB POINTER MOV R1,-(SP) ;SAVE FIELD WIDTH SUB #6.,SP ;ROOM FOR TEMPS PFB=8. ;OFFSET FROM SP FIELDW=6. TST R1 ;IS FIELD WIDTH > 0 BLE WRI15 ;IF NOT RETURN MOV SP,R1 ;R1 -> DIGIT STORAGE JSR PC,P$TCIA MOV R2,R0 ;ACTUAL FIELD WIDTH MOV PFB(SP),R3 MOV FIELDW(SP),R4 SUB R2,R4 ;IS FIELD WIDE ENOUGH? BLT WRI13 ;NO BEQ WRI11 ;EXACT, DON'T NEED LEADING BLANKS WRI10: MOVB #' ,@(R3) ;PUT OUT LEADING BLANKS MOV #1,R0 JSR PC,P$FPUT DEC R4 BGT WRI10 WRI11: MOV SP,R1 ;R1 -> SIGN AND DIGITS WRI12: MOVB (R1)+,@(R3) ;PUT OUT DIGITS MOV #1,R0 JSR PC,P$FPUT DEC R2 BGT WRI12 BR WRI15 WRI13: MOV FIELDW(SP),R4 ;FIELD NOT WIDE ENOUGH WRI14: MOVB #'*,@(R3) ;PUT OUT '*' IN FIELD MOV #1,R0 JSR PC,P$FPUT DEC R4 BGT WRI14 WRI15: ADD #10.,SP MOV (SP)+,R4 ;RESTORE R4 RTS PC .PAGE .SBTTL P$FWRJ - CONVERT AND WRITE INTEGER .GLOBL P$FWRJ P$FWRJ: ;CONVERTS INTEGER IN R0 TO STRING, ;LEFT ADJUSTED IN A FIELD OF EXACT ;WIDTH, WITH LEADING ZEROS SUPPRESSED. ;IF NEGATIVE, A '-' IS PREFIXED. ;REGISTERS ;USES: R0,R3 ;R0 = (SIGNED) INTEGER TO BE OUTPUT ;R3 -> PASCAL FILE BLOCK ;DESTROYS: R0,R1,R2 ;STACK TEMPS: 4 WORDS SUB #6,SP MOV SP,R1 ;R1 -> STRING MOV R3,-(SP) ;SAVE R3 JSR PC,P$TCIA ;CONVERT INTEGER TO ASCII MOV (SP)+,R3 ;RESTORE R3 MOV R0,R1 ;R1 = FIELD WIDTH MOV SP,R0 ;R0 -> STRING JSR PC,P$FWRS ;OUTPUT STRING ADD #6,SP RTS PC .PAGE .SBTTL P$FWRO - WRITE OCTAL .GLOBL P$FWRO P$FWRO: ;WRITE OUT CONTENTS OF R0 IN OCTAL ;REGISTERS ;USES: R0,R3 ;R0 = NUMBER TO BE OUTPUT IN OCTAL ;R3 -> PASCAL FILE BLOCK ;DESTROYS: R0,R1,R2 MOV R0,R1 ROL R1 MOV R1,R0 ROL R0 BIC #177776,R0 BIS #'0,R0 JSR PC,P$FWRC MOV #5,R2 WRO: ROL R1 ROL R1 ROL R1 MOV R1,R0 ROL R0 BIC #177770,R0 BIS #'0,R0 JSR PC,P$FWRC DEC R2 BGT WRO RTS PC .END