.TITLE GETPUT FORTRAN GET/PUT INTERFACE .IDENT /GCE001/ ; .MCALL FDOF$L,FCSBT$,GET$S,PUT$S ;NOTE THE $F4P$ CONDITIONAL SELECTS MACRO OR FORTRAN CALLS ; ... FOR MACRO THE FDBS MUST BE POINTED AT BY A TABLE OF ;ADDRESSES BEGINNING AT FDBTBL AND WITH FCBTBE AS END. ; THIS ALLOWS US TO ASSOCIATE A LUN WITH AN FDB. ; FDOF$L ;DEFINE FDB OFFSETS FCSBT$ ;DEFINE FDB BIT DEFINITIONS FFDBLN = 6*2 ;LENGTH OF FORTRAN FDB HEADER ; .PSECT $MACOD,RW,I,LCL,CON .IF DF,$F4P$ ;CHECK FOR F4P INTERFACE .IFTF ;ALWAYS DEFINE HERE .GLOBL FDBTBL,FDBTBE FDBTBL: .WORD 0,0,0,0 ;1-4 .WORD 2,2 ;5,6 .WORD 2,2 ;7,8 (8 GETS 0) .WORD 0,0,0,0,0,0,0,0 ;MORE LUNS FDBTBE: .WORD 0 ;SAFETY MARGIN 1 WORD .IFF ;MACRO ONLY HAS DEFS OF FDB AREA HERE .MCALL FDBDF$ FD.LST:: FDBDF$ ;ALLOCATE FDB FDBSZ == .-FD.LST ;SIZE OF AN FDB ENTRY .REPT 15. ;ALLOW LOTSA FDB ENTRIES FDBDF$ .ENDR ;DISCIPLINE FOR OPERATION WILL BE TO CALL ICHAN TO GET A CHANNEL AND ;CLOSEC TO CLOSE IT. IN ANY CASE IF IN MACRO AND OPENING A LUN, ;SET THE FDB ADDRESS INTO FDBTBL (CALL BUKKEP(LUN) IN FORTRAN) ;AND CALL CLOSEC TO CLOSE IT. .ENDC .PAGE ; ;...............................................................; ; ; () MODULE: GETSTR.MAC ; ; () PROCEDURE: CLSALL ; ; () DESCRIPTION: ; ; MACRO ; THIS PROCEDURE STEPS THROUGH THE T.LUNS AND ; T.FDBS TABLES, EXTRACTS A LUN FROM THE T.LUNS ; TABLE, INITIATES CLOSEC TO CLOSE THE LUN AND ; THEN ZEROES THE T.LUNS ENTRY AND THE ASSOCIATED ; T.FDBS ENTRY. THIS PROCESS IS REPEATED UNTIL ; ALL ENTRIES IN BOTH TABLES ARE CLEARED. ; ; FORTRAN ; THIS PROCEDURE STEPS THROUGH FDBTBL, EXTRACTS ; AN FDB ADDRESS, ASSOCIATES A LUN WITH THE ; FDBTBL ENTRY AND INITIATES PROCESSING AS ; FOLLOWS: ; ; * IF THE FDBTBL ENTRY IS GREATER THAN ; 100(8), CLOSE$ IS INITIATED TO CLOSE THE ; FILE ASSOCIATED WITH THE FDBTBL ENTRY. ; * IF THE FDBTBL ENTRY IS LESS THAN OR EQUAL ; TO 100(8), PROCESSING OF THE ENTRY IS ; COMPLETE. IF THE ASSOCIATED LUN IS IN THE ; RANGE 5 TO 8, THE FDBTBL ENTRY IS REPLACED ; WITH 2. IF THE ASSOCIATED LUN IS BETWEEN ; 1 AND 4 OR GREATER THAN 8, THE FDBTBL ; ENTRY IS ZEROED. ; ; () CALL SEQUENCE: JSR PC,CLSALL ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; CLOSEC CLOSE LUN ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; ; CLSALL:: JSR R5,S.RSAV ;SAVE REGISTERS .IF NDF,$F4P$ ;CHECK FOR F4P INTERFACE MOV #T.LUNS,R3 ;LUN LIST ADDRESS MOV #T.FDBS,R4 ;FDB ADDRESS LIST MOV #ABLK,R5 ;ARG LIST ADDRESS 1$: MOV (R3),ALNN ;GET LUN FROM LUN LIST BEQ 2$ ;ZERO MEANS NONE TO DO JSR PC,CLOSEC ;ZERO CHANNEL CLR @R3 ;ZERO LUN LIST ENTRY CLR @R4 ;ZERO ADDRESS LIST ENTRY 2$: CMP (R3)+,(R4)+ ;PASS LIST ENTRIES CMP R3,#T.FDBS ;PAST END? BLO 1$ ;IF NOT, GET NEXT LUN .IFF ;FORTRAN VERSION. NO T.LUNS TABLE, NOR T.FDBS, WILL EXIST. MOV #FDBTBL,R4 ;FDB ADDRESS LIST MOV #</2>,R3 ;LENGTH MOV #ABLK,R5 ;ARG LIST ADDRESS MOV #1,R2 ;START=LUN 1 1$: MOV R2,ALNN ;GET LUN INC R2 ;GET NEXT LUN MOV @R4,R0 ;GET THE FDB .MCALL CLOSE$ CMP R0,#100 ;R0 A "SMALL" NUMBER (NOT FDB ADDR)? BLOS 2$ ;IF LOS YES, SKIP CLOSE CLOSE$ R0 ;TRY TO CLOSE IT CLR R0 ;NOW SET 0 = NEW FDBLST VAL CMP R2,#5 ;LUN 5,6,7,8 NOT USED BLO 4$ ;IF LO THEN 1-4 CMP R0,#9. ;LUN 9 OR OVER? BHIS 4$ ;IF HIS YES MOV #2,R0 ;ELSE FILL IN FDBTBL WITH 2 4$: MOV R0,@R4 ;FILL IN FDBTBL 2$: TST (R4)+ ;POINT TO NEXT FDBTBL ENTRY DEC R3 ;COUNT LUNS TO DO BGT 1$ ;CLOSE ALL WE CAN .ENDC JSR R5,S.RRES ;RESTORE REGISTERS RTS PC ;RETURN ABLK: .WORD 1 ;ARG LIST - NUMBER OF ARGUMENTS ALN: .WORD ALNN ;ADDRESS OF LUN ALNN: .WORD 0 ;LUN ; IOST: IOSB: .WORD 0,0 ROWN: .BYTE -1,2 .WORD FONR ;READ FILE OWNER BLK FONR: .WORD 0,0 .PAGE ; ;...............................................................; ; ; ; ; () PROCEDURE: BUKKEP ; ; () DESCRIPTION: ; ; THIS PROCEDURE CHECKS THE INPUT LUN; IF EQUAL ; TO ZERO, THE LUN IS SET TO 8. $FCHNL IS THEN ; INITIATED TO GET THE FORTRAN LUB ADDRESS FOR ; THE SPECIFIED LUN. IF A $FCHNL ERROR OCCURS, ; PROCESSING IS TERMINATED. OTHERWISE, THE ; ADDRESS OF THE FORTRAN FDB IS CALCULATED AND ; STORED IN THE FDBTBL ENTRY FOR THE SPECIFIED ; LUN. ; ; () CALL SEQUENCE: CALL BUKKEP (LUN) ; ; () INPUT PARAMETERS: ; ; LUN ADDRESS OF LUN TO INITIALIZE ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; ; .if df,$f4p$ BUKKEP:: MOV @2(R5),R2 ;GET LUN BNE 2$ ;CHECK FOR LUN = 0 MOV #8.,R2 ;CHNL 0 BECOMES LUN 8 2$: CALL $FCHNL ;GET THE FORTRAN FDB (LUB) BCS 1$ ;IF ERROR, RETURN ADD #FFDBLN,R0 ;UPDATE FDB ADDRESS MOV @2(R5),R2 ;GET LUN BNE 3$ ;CHECK FOR LUN = 0 MOV #8.,R2 ;CHNL 0 BECOMES LUN 8 3$: ASL R2 ;CONVERT TO BYTE OFFSET MOV R0,FDBTBL(R2) ;FILL IN FDBTBL 1$: RTS PC ;RETURN .endc ;...............................................................; ; ; ; ; () PROCEDURE: CLOSEU ; ; () DESCRIPTION: ; ; THIS PROCEDURE CHECKS THE INPUT LUN; IF ZERO ; OR GREATER THAN 16, PROCESSING IS TERMINATED. ; OTHERWISE, THE FDBTBL ENTRY FOR THE SPECIFIED ; LUN IS ZEROED. ; ; () CALL SEQUENCE: CALL CLOSEU (LUN) ; ; () INPUT PARAMETERS: ; ; LUN ADDRESS OF LUN TO CLOSE ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; ; CLOSEU:: JSR R5,S.RSAV ;SAVE REGISTERS MOV @2(R5),R0 ;GET LUN TO CLOSE DEC R0 ;CHECK FOR LUN > 0 BLT 1$ ;ASSURE VALID ASL R0 ;MAKE A WORD INDEX CMP R0,# ;LUN BHIS 1$ ;OVER THE END OF THE TABLE CLR FDBTBL(R0) ;MARK IT FREE NOW 1$: JSR R5,S.RRES ;RESTORE REGISTERS RTS PC ;RETURN ;...............................................................; ; ; ; ; () PROCEDURE: CLOSEC ; ; () DESCRIPTION: ; ; THIS PROCEDURE CHECKS THE INPUT LUN; IF ZERO ; OR GREATER THAN 16, PROCESSING IS TERMINATED. ; OTHERWISE, THE LUN IS USED AS AN INDEX INTO ; FDBTBL. IF THE FDBTBL ENTRY IS ZERO OR ODD, ; THE LUN IS ALREADY CLOSED SO PROCESSING IS ; TERMINATED. ELSE, THE BLOCK-BUFFER DESCRIPTOR ; BLOCK ENTRY OF THE FDB IS CHECKED; IF ZERO, ; THE LUN IS ALREADY CLOSED AND THE FDBTBL ENTRY ; IS ZEROED. IF NOT ZERO, CLOSE$ IS INITIATED ; TO CLOSE TH LUN AND THE FDBTBL ENTRY IS ZEROED. ; ; () CALL SEQUENCE: JSR PC,CLOSEC ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST ; 1 NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN TO BE CLOSED ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; CLOSEC:: JSR R5,S.RSAV ;SAVE REGISTERS MOV @2(R5),R0 ;GET LUN TO CLOSE DEC R0 ;CHECK FOR LUN > 0 BLT 1$ ;ASSURE VALID ASL R0 ;MAKE A WORD INDEX CMP R0,# ;LUN BHIS 1$ ;OVER THE END OF THE TABLE MOV R0,R1 ;SAVE POINTER MOV FDBTBL(R0),R0 ;GET FDB POINTER BEQ 1$ ;IF ZERO, DONE BIT #1,R0 ;ODD - CLOSED ALREADY? BNE 1$ ;YES, SKIP RE-CLOSE .MCALL CLOSE$ TST F.BDB(R0) ;IS THE LUN REALLY OPEN? BEQ 5$ ;IF NOT, NO CLOSE NEEDED CLOSE$ R0 ;CLOSE THE LUN 5$: CLR FDBTBL(R1) ;MARK IT FREE NOW 1$: JSR R5,S.RRES ;RESTORE REGISTERS RTS PC ;RETURN ;...............................................................; ; ; ; ; () PROCEDURE: IGETC ; ; () DESCRIPTION: ; ; THIS PROCEDURE SCANS FDBTBL SEARCHING FOR THE ; FIRST NONZERO ENTRY OTHER THAN THE 5TH THRU ; 8TH ENTRIES. IF THE FORTRAN INTERFACE IS ; ENABLED, $FCHNL IS INITIATED TO DETERMINE THE ; FDB ADDRESS TO MOVE INTO THE FDBTBL ENTRY. IF ; THE FORTRAN INTERFACE IS NOT ENABLED, THE ; APPROPRIATE FD.LST ENTRY ADDRESS IS DETERMINED ; AND MOVED INTO THE FDBTBL ENTRY. ; ; NOTE: ASSUMES CLOSEC WILL BE CALLED TO CLOSE ; THE LUN PRIOR TO REUSE. ; ; () CALL SEQUENCE: JSR PC,IGETC ; ; () OUTPUT PARAMETERS: ; ; R0 99: FDBTBL FULL ; 1 - 16: LUN ASSIGNED ; C BIT 0: NO ERROR ; 1: FDBTBL FULL ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; IGETC:: JSR R5,S.RSAV ;SAVE REGISTERS MOV #FDBTBL,R1 ;FDB POINTER TABLE ADDRESS MOV #1,R2 ;FIRST VALID LUN 1$: TST (R1) ;THIS LUN EMPTY? BNE 2$ ;IF NOT GET NEXT 15$: CMP R2,#5 ;OMIT LUN 5 BEQ 2$ CMP R2,#6 ;OMIT LUN 6 BEQ 2$ CMP R2,#5 ;1-4? BLT 8$ ;YES, PROCESS IT CMP R2,#8. ;9 OR OVER? BLT 2$ ;NO, SKIP THIS CHNL 8$: ;GOT ONE! .IF DF,$F4P$ ;CHECK FOR F4P INTERFACE MOV R1,-(SP) ;SAVE FDB TABLE ADDRESS CALL $FCHNL ;GET FORTRAN FDB AREA MOV (SP)+,R1 ;RESTORE FDB TABLE ADDRESS ADD #FFDBLN,R0 ;GET FDB AREA MOV R0,(R1) ;FILL IN CHANNEL FOR NEXT TIME .IFF MOV R2,R3 ;GET LUN NUMBER ; *** NOTICE THE CODE HERE REQUIRES FDB DEFS TO ALL BE TOGETHER, ; FIRST FDB AT FD.LST AND FDB SIZE GLOBALLY AVAILABLE AS FDBSIZ ; AND ALSO THAT FDBTBL AND FDBTBE BE DEFINED. MUL #FDBSZ,R3 ;MULTIPLY BY SIZE OF AN FDB ADD #FD.LST,R3 ;ADD IN START OF LIST MOV R3,(R1) ;MOVE FDB ADDRESS TO FDBTBL .ENDC MOV R2,R0 ;GET LUN NUMBER NOW BR 4$ ;RETURN LUN IN R0 2$: CMP R2,#5 ;VALID RANGE? BLT 16$ ;IF 1-4 MAYBE CMP R2,#8. BLE 17$ ;17$ IF 5-8 RANGE 16$: ;HERE LUN MUST BE TESTED. IF NOT OPEN, ALLOW ITS USE. .IF DF,OP$TS. ;NORMALLY EXCLUDE THIS MOV @R1,R0 ;GET THE FDB POINTER BIT #1,R0 ;ODD MEANS CLOSED NOW BNE 17$ ;TEST IF FDB IS OPEN. NEED AN IO.RAT TO DO THIS UNFORTUNATELY...NO STATUS ;IN USER SPACE AUTOMATICALLY. ADD #F.FNB,R0 ;POINTER FILENAME BLK .MCALL QIOW$S QIOW$S #IO.RAT,R2,R2,,#IOST,, TSTB @#$DSW ;ERROR? BPL 17$ ;NO, FILE IS IN USE NOW. ;FILE IS CLOSED. ALLOW USE OF THIS LUN. BR 15$ ;GO BACK, SEE ABOUT THIS ONE. .ENDC 17$: TST (R1)+ ;INCREMENT FDBTBL POINTER INC R2 ;INCREMENT LUN CMP R1,#FDBTBE ;END OF FDBTBL? BLO 1$ ;IF NOT GO AHEAD ; ;ELSE SAY LUN 99 (ILLEGAL) MOV #99.,(SP) ;RETURN R0 WITH LUN 99. ; TOP OF STACK GETS RESTORED INTO R0. JSR R5,S.RRES ;RESTORE REGISTERS SEC ;RETURN CARRY SET RTS PC ;RETURN 4$: MOV R0,@SP ;RETURN R0 WITH LUN CHOSEN JSR R5,S.RRES ;RESTORE REGISTERS CLC ;CARRY CLEAR IF ALL WELL RTS PC ;RETURN .GLOBL GETFDB ;...............................................................; ; ; () PROCEDURE: GETFDB ; ; () DESCRIPTION: ; ; THIS PROCEDURE CHECKS THE INPUT LUN; IF ZERO ; IT IS REPLACED WITH 8. IF THE FORTRAN INTERFACE ; IS ENABLED, $FCHNL IS INITIATED TO DETERMINE ; THE ADDRESS OF THE FDB ASSOCIATED WITH THE LUN. ; THE ADDRESS IS MOVED TO THE APPROPRIATE FDBTBL ; ENTRY. THEN, THE RECORD ACCESS AND RECORD- ; BUFFER DESCRIPTOR PORTIONS OF THE FDB ARE SAVED ; ON THE STACK AND CONTROL IS RETURNED TO THE ; CALLING COROUTINE. ON RETURN, THE FDB INFORMA- ; TION IS RESTORED AND PROCESSING IS TERMINATED. ; IF THE FORTRAN INTERFACE IS DISABLED, THE LUN ; IS CHECKED. IF THE LUN IS NEGATIVE OR GREATER ; THAN 16, PROCESSING IS TERMINATED. OTHERWISE, ; THE ADDRESS OF THE FDB ASSIGNED TO THE LUN IS ; REMOVED FROM FDBTBL. IF THE FDB ADDRESS IS ; INVALID (0 OR ODD), THE ERROR RETURN CODE IS ; SET. ; ; () CALL SEQUENCE: CALL GETFDB ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST: ; P1 NOT USED ; LUN ADDRESS OF LUN TO FIND FDB FOR ; P3 NOT USED ; P4 NOT USED ; ERR ERROR RETURN CODE ; ; () OUTPUT PARAMETERS: ; ; ERR -99: NO FDB FOUND ; R0 -1: NO FDB FOUND ; ADR: FDB ADDRESS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; GETFDB: MOV @2(R5),R2 ;GET LUN ; *** CHANGE RT11 LUNS TO RSX LUNS ; *** GCE 4/11/85 CMP R2,#TFIL ;R2 IN VALID RANGE? BLO 642$ ;IF LO IT'S OK CLR R2 ;ELSE JUST CLEAR IT 642$: ASL R2 ;ENWORD MOV T.LUNS(R2),R2 ;GET RSX LUN FROM TABLE CMP R2,#TFIL ;LEGAL RESULT? BLOS 643$ ;IF SO YES MOV @2(R5),R2 ;IF NOT RECLAIM CALLER ARG 643$: TST R2 ;CHECK LUN AGAIN ; *** BNE 42$ ;CHECK FOR LUN = 0 MOV #8.,R2 ;LUN 0 BECOMES LUN 8 42$: .IF DF,$F4P$ ;IF FORTRAN INTERFACE .PRINT ;ASSEMBLED FOR FORTRAN CALLS CALL $FCHNL ;GET ASSOCIATED FFDB BCS 100$ ;CS - ILLEGAL LUN ADD #FFDBLN,R0 ;OFFSET TO REAL FDB ;STUFF FDB ADDRESS INTO FDBTBL MOV @2(R5),R2 ;GET LUN ; STUCK WITH GIVEN LUNS HERE FOR FORTRAN VERSION. BNE 142$ ;CHECK FOR LUN = 0 MOV #8.,R2 ;LUN 0 BECOMES LUN 8 142$: MOV R2,R1 ;COPY LUN DEC R1 ;REDUCE TO START AT 0 ASL R1 ;CONVERT TO BYTE OFFSET MOV R0,FDBTBL(R1) ;FILL IN THE FDB ADDRESS NOW ;END OF COPY. THIS WILL ENSURE FDBTBL WILL BE OK. MOV SP,R1 ;SAVE STACK POINTER SUB #12,SP ;MAKE ROOM FOR SAVE MOV (R1),(SP) ;SET UP FOR COROUTINE MOV F.URBD(R0),(R1) ;SAVE FORTRAN FDB INFO MOV F.URBD+2(R0),-(R1) MOV F.NRBD(R0),-(R1) MOV F.NRBD+2(R0),-(R1) MOV F.RACC(R0),-(R1) JSR PC,@(SP)+ ;CALL COROUTINE MOV (SP)+,F.RACC(R0) ;RESTORE FORTRAN FDB INFO MOV (SP)+,F.NRBD+2(R0) MOV (SP)+,F.NRBD(R0) MOV (SP)+,F.URBD+2(R0) MOV (SP)+,F.URBD(R0) .IFF ;IF MACRO-11 INTERFACE .PRINT ;ASSEMBLED FOR MACRO-11 CALLS, FDBTBL AND FDBTBE ARE TBL ADDRS ;R2 HAS LUN NUMBER. LOCATE FDB FROM IT VIA TABLE WHICH MUST BE ;SET UP. MOV #-1,R0 ;R0 ILLEGAL TILL PROVEN OTHERWISE ; *** NOTE R2 NOW HAS RSX LUNS FROM TABLE. THIS TABLE (T.LUNS) ; ** SET UP IN MICCSI PROGRAM. DEC R2 ;MAKE TABLE INDEX BLT 75$ ;ILLEGAL IF NEG ASL R2 ;MAKE IT A WORD INDEX CMP R2,# ;PAST FDBTBE? (END OF FCB TBL ADDR) BHIS 75$ ;IF SO ALSO ILLEGAL MOV FDBTBL(R2),R0 ;GET FDB ADDRESS BEQ 100$ ;IF 0, NO FDB BIT #1,R0 ;CHECK FOR ODD ADDRESS BNE 100$ ;IF ODD, FDB NOT OPEN 75$: .ENDC RETURN ;RETURN 100$: MOV #-99.,@10(R5) ;ILLEGAL LUN CODE TST (SP)+ RETURN ;RETURN ; .ENABL LSB XFDB: .WORD 0,0,0,0,0,0,0,0 ;FDB SAVE AREA ; ;...............................................................; ; ; ; ; () PROCEDURE: GSTR1 ; ; () DESCRIPTION: ; ; THIS PROCEDURE SETS THE FDB SAVE OFFSET TO 6 ; AND THEN INITIATES GETT TO PERFORM THE READ ; OR REWIND OPERATION. ; ; () CALL SEQUENCE: CALL GSTR1,ARG ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST(ARG): ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN(OPTIONAL) ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; SIZ ADDRESS OF RECORD BUFFER BYTE ; LENGTH(OPTIONAL) ; ERR ADDRESS OF ERROR BYTE(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; GETT PERFORM READ OR REWIND ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; GSTR1:: JSR R5,S.RSAV ;SAVE REGS ACROSS THESE CALLS MOV #6,R4 ;FDB SAVE OFFSET JSR PC,GETT ;BUT DO THE WORK JSR R5,S.RRES ;RESTORE REGS RTS PC ;RETURN ;...............................................................; ; ; ; ; () PROCEDURE: GSTR2 ; ; () DESCRIPTION: ; ; THIS PROCEDURE SETS THE FDB SAVE OFFSET TO 4 ; AND THEN INITIATES GETT TO PERFORM THE READ ; OR REWIND OPERATION. ; ; () CALL SEQUENCE: CALL GSTR2,ARG ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST(ARG): ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN(OPTIONAL) ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; SIZ ADDRESS OF RECORD BUFFER BYTE ; LENGTH(OPTIONAL) ; ERR ADDRESS OF ERROR BYTE(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; GETT PERFORM READ OR REWIND ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; GSTR2:: JSR R5,S.RSAV ;SAVE REGS ACROSS THESE CALLS MOV #4,R4 ;FDB SAVE OFFSET JSR PC,GETT ;BUT DO THE WORK JSR R5,S.RRES ;RESTORE REGS RTS PC ;RETURN ;...............................................................; ; ; ; () PROCEDURE: GSTR4 ; ; () DESCRIPTION: ; ; THIS PROCEDURE SETS THE FDB SAVE OFFSET TO 2 ; AND THEN INITIATES GETT TO PERFORM THE READ ; OR REWIND OPERATION. ; ; () CALL SEQUENCE: CALL GSTR4,ARG ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST(ARG): ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN(OPTIONAL) ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; SIZ ADDRESS OF RECORD BUFFER BYTE ; LENGTH(OPTIONAL) ; ERR ADDRESS OF ERROR BYTE(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; GETT PERFORM READ OR REWIND ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; GSTR4:: JSR R5,S.RSAV ;SAVE REGS ACROSS THESE CALLS MOV #2,R4 ;FDB SAVE OFFSET JSR PC,GETT ;BUT DO THE WORK JSR R5,S.RRES ;RESTORE REGS RTS PC ;RETURN ;...............................................................; ; ; () PROCEDURE: GETSTR ; ; () DESCRIPTION: ; ; THIS PROCEDURE SETS THE FDB SAVE OFFSET TO 8 ; AND THEN INITIATES GET TO PERFORM THE READ ; OR REWIND OPERATION. ; ; () CALL SEQUENCE: CALL GETSTR,ARG ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST(ARG): ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN(OPTIONAL) ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; SIZ ADDRESS OF RECORD BUFFER BYTE ; LENGTH(OPTIONAL) ; ERR ADDRESS OF ERROR BYTE(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; GET PERFORM READ OR REWIND ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; GETSTR:: JSR R5,S.RSAV ;SAVE REGS ACROSS THESE CALLS MOV #10,R4 ;FDB SAVE OFFSET JSR PC,GET ;BUT DO THE WORK JSR R5,S.RRES ;RESTORE REGS RTS PC ;RETURN ;...............................................................; ; ; () PROCEDURE: GET/GETT ; ; () DESCRIPTION: ; ; IF THIS PROCEDURE IS ENTERED VIA THE GET ENTRY ; POINT, THE FDB SAVE OFFSET IS FORCED TO ZERO, ; OTHERWISE, THE SPECIFIEC FDB SAVE OFFSET IS ; USED. THE NUMBER OF ARGUMENTS IS THEN CHECKED. ; IF AT LEAST ONE ARGUMENT IS SPECIFIED (LUN), ; THE LUN PARAMETER IS UTILIZED AS INPUT TO ; GETFDB TO DETERMINE THE ADDRESS OF THE ASSIGNED ; FDB. IF NO ARGUMENTS ARE SPECIFIED, THE LAST ; FDB ADDRESS SAVED AT THE SPECIFIED FDB OFFSET ; IS RETRIEVED. THE CURRENT FDB ADDRESS IS THEN ; STORED AT THE FDB SAVE OFFSET. THE PROCEDURE ; THEN PERFORMS THE APPROPRIATE OPERATION AS ; LISTED BELOW: ; ; * IF 0 OR 1 ARGUMENTS ARE SPECIFIED, THE ; FILE IS REWOUND. ; * IF MORE THAN 1 ARGUMENT IS SPECIFIED, A ; SEQUENTIAL READ OF THE FILE IS PERFORMED. ; THE BYTE FOLLOWING THE LAST BYTE OF THE ; RECORD IS THEN ZEROED. ; ; () CALL SEQUENCE: JSR PC,GET AND JSR PC,GETT ; ; () INPUT PARAMETERS: ; ; R4 FDB SAVE OFFSET ; R5 ADDRESS OF ARGUMENT LIST: ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN(OPTIONAL) ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; SIZ ADDRESS OF RECORD BUFFER BYTE ; LENGTH(OPTIONAL) ; ERR ADDRESS OF ERROR BYTE(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () INPUT FILES: ; ; ANY SEQUENTIAL FILE ASSIGNED ; TO THE SPECIFIED LUN ; ; () PROCEDURES CALLED: ; ; GETFDB GET FDB ADDRESS FOR LUN ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; GET:: CLR R4 ;FDB SAVE OFFSET GETT: CMPB @R5,#1 ;AT LEAST 1 ARG? BHIS 174$ ;YES, BRANCH 474$: MOV XFDB(R4),R0 ;GET LAST USED FDB ADDRESS BEQ 274$ ;IF NONE, ERROR 174$: CMP 2(R5),#177777 ;NO REAL ARG? BEQ 474$ ;GET LAST USED FDB ADDRESS CALL GETFDB ;GET FDB ADDRESS CMP R0,#-1 ;CHECK FOR ERROR BNE 74$ ;DO ERROR KLUG=2 ADD #12+KLUG,SP ;**** NEW, RESTORE STACK 274$: SEC ;SET CARRY FOR ERROR RTS PC ;ERROR RETURN 74$: MOV R0,XFDB(R4) ;SAVE FDB ADDR BIC #FD.PLC,F.RACC(R0) ;CLEAR LOCATE MODE CMPB @R5,#1 ;CALLED WITH 0 OR 1 ARGS FOR REWIND? BHI 10$ ;IF HI NO, DO OPERATION ; TSTB @R5 ;CALLED WITH NO ARGS FOR REWIND? ; BNE 10$ ;IF NOT, NORMAL GET CLR R3 ;POINT TO BYTE 0 CLR R1 ;OF BLOCK... MOV #1,R2 ;#1 (TO 32 BITS) JSR PC,.POINT ;THANKS TO FCS... ;THEN RETURN. .IF DF,$F4P$ ;IF FORTRAN INTERFACE ADD #KLUG+12,SP ;POP OUT OF RESTORE FDB STUFF .ENDC RTS PC ;RETURN 10$: GET$S R0,4(R5),@6(R5) ;GET A RECORD BCC 216$ ;IF NO ERROR, BRANCH JMP X110$ ;PROCESS ERROR 216$: ; BCS X110$ ;CS - IT FAILED .IF DF,..GS. ;NORMAL RETURNS LENGTH OR - ERR CODE MOV F.NRBD(R0),@10(R5) ;RETURN RECORD LENGTH .IFF ;RT11 DOESN'T RETURN THE LENGTH BUT NULLS THE CHARACTER AFTER THE ;LAST LINE. DO SO HERE TOO. MOV R1,-(SP) ;SAVE R1 MOV 4(R5),R1 ;GET START OF RECORD ADD F.NRBD(R0),R1 ;ADD LENGTH TO POINT AFTER END CLRB @R1 ;NULL THE LAST BYTE READ IN MOV (SP)+,R1 ;RESTORE R1 ;(INCREDIBLE, ISN'T IT?) CLRB @10(R5) ;AND 0 ERR CODE .ENDC RETURN ;RETURN ; ;PUT LOGICAL RECORD ENTRY POINT ; CALL PUT(LUN,BUF,SIZE,STAT) ;EXTRA PUTSTR CALL ADDED FOR RT11 COMPATIBILITY ; PSV: .WORD 0 ;WRK AREA ARGP: .WORD 4 LN: .WORD 0 BF: .WORD 0 .WORD SZ ER: .WORD 0 SZ: .WORD 0 BUFFP: .WORD BUFF BUFF: .BLKB 512. bffe:: .blkw 20. ;safety margin TBUF: .BYTE 40,0 ;JUST A SPACE TCC: .WORD 0 ;NO SPECIAL FORMAT CONTROLS TARGS: .WORD 4 ;TEMP ARGLIST .WORD 0 ;LUN FOR PSTR1 TER: .WORD 0 ;ERR RETURN ADDRESS TOUT: .WORD TBUF ;STRING ADDRESS TTCC: .WORD TCC ;FORMAT CONTROL CHAR ;...............................................................; ; ; () PROCEDURE: PSTR1 ; ; () DESCRIPTION: ; ; THIS PROCEDURE INITIATES PSTRR TO PERFORM ; THE REWIND OR WRITE OPERATION. ; ; () CALL SEQUENCE: CALL PSTR1,ARG, ; ; () INPUT PARAMETERS: ; ; ARG ADDRESS OF ARGUMENT LIST: ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN ; ERR ADDRESS OF ERROR BYTE ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; CC ADDRESS OF CARRIAGE CONTROL ; CHARACTER(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; PSTR1:: JSR R5,S.RSAV ;SAVE REGS JSR PC,PSTRR ;DO THE WORK JSR R5,S.RRES ;RESTORE REGS RTS PC ;RETURN ;...............................................................; ; ; () PROCEDURE: PSTRR ; ; () DESCRIPTION: ; ; THIS PROCEDURE BUILDS AN INTERNAL ARGUMENT ; LIST UTILIZING THE LUN AND ERR ADDRESSES AS ; SPECIFIED. IF BUF AND CC ARE SPECIFIED, THEY ; ARE MOVED TO THE INTERNAL ARGUMENT LIST, ELSE, ; A 2 BYTE BUFFER CONSISTING OF A SPACE AND A ; NULL CHARACTER IS USED FOR THE INTERNAL BUF ; ARGUMENT AND A ZERO WORD FOR THE CC ARGUMENT. ; CONTROL THEN PASSES TO THE PUTSTR PRPROCEDURE. ; ; () CALL SEQUENCE: JSR PC,PSTRR ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST: ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN ; ERR ADDRESS OF ERROR BYTE ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; CC ADDRESS OF CARRIAGE CONTROL ; CHARACTER(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; () END: ;...............................................................; PSTRR: MOV 2(R5),TARGS+2 ;COPY LUN ADDRESS MOV 4(R5),TER ;AND ERROR ADDRESS MOV #TBUF,TOUT ;GET SHORT CALL TEMP BUFFER ADDRESS MOV #TCC,TTCC ;AND FORMAT CONTROL ADDRESS CMPB @R5,#2 ;2 ARG CALL TO EMIT LAST BUFFER? BLE 1$ ;IF NOT DO NORMAL THINGS MOV 6(R5),TOUT ;LIKE COPY CALLER BUFFER ADDRESS MOV 10(R5),TTCC ;AND FORMAT CONTROL ADDRESS 1$: MOV #TARGS,R5 ;POINT FORMAT LIST AT OUR ARG LIST ;...............................................................; ; ; () PROCEDURE: PUTSTR ; ; () DESCRIPTION: ; ; THIS PROCEDURE CHECKS THE NUMBER OF INPUT ; ARGUMENTS. IF NONE, GETFDB IS INITIATED TO ; DETERMINE THE ADDRESS OF THE FDB ASSOCIATED ; WITH ANY LUN. IF AN ERROR OCCURS IN GETFDB, ; PROCESSING TERMINATES, OTHERWISE, THE FILE ; ASSOCIATED WITH THE LUN IS REWOUND AND ; PROCESSING TERMINATES. ; ; IF THE INPUT ARGUMENTS ARE SPECIFIED, THE ; RECORD BUFFER IS SCANNED OF A BUFFER TERMINATOR ; AND THE BUFFER LENGTH IS CALCULATED. THE ; CC CHARACTER IS THEN CHECKED. IF IT IS '$' OR ; '+', THE ENTIRE CONTENTS OF THE BUFFER ARE ; MOVED TO THE FIRST AVAILABLE SPACE IN AN ; INTERNAL BUFFER. IF THE CC CHARACTER IS A '+' ; THEN A IS ADDED PAST THE LAST CHARACTER IN ; THE INTERNAL BUFFER AND PROCESSING TERMINATES. ; IF THE CC CHARACTER IS NOT '$' OR '+', BUT DATA ; HAS BEEN PREVIOUSLY MOVED TO THE INTERNAL ; BUFFER, THE CURRENT BUFFER IS APPENDED TO THE ; INTERNAL BUFFER AND ITS NEW LENGTH IS CALCU- ; LATED. IF THE INTERNAL BUFFER IS EMPTY, NO ; DATA IS MOVED TO THE INTERNAL BUFFER. FINALLY, ; THE CC CHARACTER IS CHECKED FOR '0' OR '1', AND ; IF FOUND, A DOUBLE SPACE OR FORMFEED IS ; PERFORMED. PUT IS THEN INITIATED TO WRITE ; THE APPROPRIATE BUFFER(INPUT OR INTERNAL) TO ; THE OUTPUT FILE. ; ; () CALL SEQUENCE: JSR PC,PUTSTR ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST: ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN ; ERR ADDRESS OF ERROR BYTE ; BUF ADDRESS OF RECORD BUFFER(OPTIONAL) ; CC ADDRESS OF CARRIAGE CONTROL ; CHARACTER(OPTIONAL) ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () OUTPUT FILES: ; ; ANY SEQUENTIAL FILE ASSIGNED ; TO THE SPECIFIED LUN ; ; () PROCEDURES CALLED: ; ; S.RSAV SAVE REGISTERS ; GETFDB GET FDB ADDRESS ; PUT WRITE BUFFER TO OUTPUT FILE ; S.RRES RESTORE REGISTERS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; ; () END: ;...............................................................; PUTSTR:: TSTB @R5 ;CALLED WITH NO ARGS FOR REWIND? BNE 10$ ;IF NOT, NORMAL GET CALL GETFDB ;GET FDB ADDRESS CMP R0,#-1 ;CHECK FOR ERROR BNE 74$ ;NONE, PROCESS REQUEST SEC ;ERROR, FORCE CARRY RTS PC ;ERROR RETURN 74$: CLR R3 ;POINT TO BYTE 0 CLR R1 ;OF BLOCK... MOV #1,R2 ;#1 (TO 32 BITS) JSR PC,.POINT ;THANKS TO FCS... ;THEN RETURN. .IF DF,$F4P$ ADD #12+KLUG,SP ;POP OUT OF RESTORE FDB STUFF .ENDC RTS PC ;RETURN 10$: JSR R5,S.RSAV ;SAVE REGS MOV 2(R5),LN ;LUN ADDRESS MOV 6(R5),BF ;BUFFER ADDRESS MOV 4(R5),ER ;ERR ADDRESS .iif df,$gx.$,CLRB @4(R5) ;SET INITIALLY NO ERROR MOV 6(R5),R0 ;BUFFER ADDRESS ; 3RD ARG SAYS IF WE SHOULD BUFFER RECORDS. ;SEE IF WE NEED TO BUFFER THE RECORD. ; $ MEANS NO CRLF, AND + MEANS NO LF. ASSUME THAT WE WILL EVENTUALLY ;GET A RECORD WITH CR AT THE END AND ACCORDINGLY ALLOW RECORDS TO BE ;APPENDED UNTIL SUCH A RECORD IS SEEN. MOV #512.,R1 ;MAX LENGTH OF BUFFER MOV R0,R2 ;BUFFER ADDRESS 1$: BITB #177,(R2)+ ;CHECK BYTE OF BUFFER FOR TERMINATOR BEQ 2$ ;FOUND TERMINATOR SOB R1,1$ ;KEEP LOOKING 2$: DEC R2 ;ADDRESS OF TERMINATOR SUB R0,R2 ;GET LENGTH OF BUFFER BLE 4$ ;ENSURE OK MOV R2,SZ ;SIZE OF BUFFER ;TEST 3RD ARGUMENT HERE. EMIT NO RECORD IF A $ OR +. ;IGNORE FF OR DOUBLE SPACING STUFF FOR NOW. CMPB @10(R5),#'$ ;WAS THIS A "$" TYPE RECORD BEQ 210$ ;IF SO SERVICE ADDING MORE TO BUFFER CMPB @10(R5),#'+ ;ALSO + AS FMT CONTROL BEQ 210$ ;NOT SPECIAL. WILL IT BE NECESSARY TO OUTPUT AN OUTSTANDING SPECIAL ;RECORD HERE? CMP BUFFP,#BUFF ;AT START OF BUFFER? BEQ 11$ ;IF SO NOTHING TO DO ;COPY THIS RECORD TO END OF BUFFER AND SHIP IT OUT. MOV R2,-(SP) ;SAVE COUNTER MOV 6(R5),R0 ;GET ADDR OF BUFFER 12$: MOVB (R0)+,@BUFFP ;FILL IN BUFFER INC BUFFP ;UPDATE POINTER cmp buffp,#bffe ;be sure we don't pass end blos 411$ mov #buff,buffp mov #buff,bf br 11$ ;if we pass end ship it out right now 411$: DEC R2 ;DECREMENT COUNTER BGT 12$ ;COPY DATA TO BUFFER AFTER WHAT'S THERE ;NOW FILL IN ARRY MOV BUFFP,SZ ;INTERNAL BUFFER START ADDRESS SUB #,SZ ;CALCULATE INTERNAL BUFFER LENGTH MOV #BUFF,BUFFP ;RESET BUFFER TO START MOV #BUFF,BF ;SET START OF RECORD FOR THE PUT MOV (SP)+,R2 ;RESTORE COUNTER BR 11$ ;GO SHIP OUT THE RECORD ; 210$: ; HERE SERVICE SPECIAL RECORDS THAT WE JUST SHOVE INTO BUFF ;FIRST JUST COPY THE DATA. THEN EMIT A C.R. IF CODE WAS "+". MOV R2,-(SP) ;SAVE R2 MOV 6(R5),R0 ;DATA BUFFER ADDRESS 14$: MOVB (R0)+,@BUFFP ;SHOVE OUT DATA INC BUFFP ;COUNT IT cmp buffp,#bffe ;be sure we don't pass end blos 311$ mov #buff,buffp ;reset else mov #buff,bf ;for next time br 11$ 311$: SOB R2,14$ ;MOVE ALL DATA CMPB @10(R5),#'+ ;SHALL WE ADD THE C.R.? BNE 15$ ;IF NE NO MOVB #15,@BUFFP ;IF EQ YES INC BUFFP ;SO FILL IT IN AND COUNT IT 15$: MOV (SP)+,R2 ;RESTORE R2 BR 4$ ;SKIP ACTUAL OUTPUT HERE. 11$: MOVB @10(R5),FCCR ;SAVE CC BYTE MOV ARGP+2,FCL+2 ;COPY LUN ADDRESS CMPB FCCR,#'0 ;DBL SPACE? BNE 131$ ;IF NE SKIP, TRY FFD MOV #DSPC,FCL+4 ;ELSE SET DBL SPACE BUFFER OUT MOV #FCL,R5 ;POINT AT ARGLIST JSR PC,PUT ;EMIT EXTRA SPACES BR 133$ 131$: CMPB FCCR,#'1 ;FORMFEED OUT? BNE 133$ ;IF NOT, TIME TO EMIT THE RECORD MOV #FFD,FCL+4 ;ELSE SET FORMFEED RECORD AS OUTPUT MOV #FCL,R5 ;POINT AT THE DUMMY ARGLIST JSR PC,PUT ;AND OUTPUT IT 133$: MOV #ARGP,R5 ;GET ARG POINTER JSR PC,PUT ;EMIT RECORD 4$: JSR R5,S.RRES ;RESTORE REGISTERS RTS PC ;RETURN ;BUFFERS FOR FORMFEED OR DBL SPACE OUTPUT FFD: .BYTE 14,40 ;ASCII FORMFEED CHARACTER .EVEN DSPC: .BYTE 15,12 ;EXTRA SPACING .EVEN FCCR: .WORD 0 ;CARRIAGE CONTROL STORAGE ;ARG LIST USED FOR DOUBLE SPACES OR FORMFEEDS FCL: .WORD 4 ;4 ARGS .WORD 0 ;LUN ADDRESS .WORD FFD ;BUFFER ADDRESS .WORD FTWO ;2 BYTES .WORD FFEE ;ERROR ADDRESS FTWO: .WORD 2 ;BYTE COUNT FFEE: .WORD 0 ;DUMMY ERROR ADDR ;...............................................................; ; ; () PROCEDURE: PUT ; ; () DESCRIPTION: ; ; THIS PROCEDURE INITIATES GETFDB TO DETERMINE ; THE ADDRESS OF THE FDB ASSOCIATED WITH THE ; INPUT LUN. IF AN ERROR OCCURS IN GETFDB, ; PROCESSING IS TERMINATED. OTHERWISE, THE ; SPECIFIED BUFFER IS WRITTEN TO THE OUTPUT FILE. ; ; () CALL SEQUENCE: JSR PC,PUT ; ; () INPUT PARAMETERS: ; ; R5 ADDRESS OF ARGUMENT LIST: ; NUM NUMBER OF ARGUMENTS IN LIST ; LUN ADDRESS OF LUN ; BUF ADDRESS OF BUFFER ; COUNT ADDRESS OF BUFFER BYTE LENGTH ; ERR ADDRESS OF ERROR WORD ; ; () OUTPUT PARAMETERS: ; ; ERR 0: NO ERROR ; -1: END OF FILE ; -3: ILLEGAL RECORD SIZE ; >0: OTHER I/O ERROR CODE ; C BIT 0: NO ERROR ; 1: ERROR ; ; () OUTPUT FILES: ; ANY SEQUENTIAL FILE ASSIGNED ; TO THE SPECIFIED LUN ; ; () PROCEDURES CALLED: ; ; GETFDB GET FDB ADDRESS ; ; () AUTHORS: GCE RCA CHERRY HILL ; ; () REVISION HISTORY: ; ; 3/11/82 MJZ ADD COMMENTARY ; ; () END: ;...............................................................; PUT:: CALL GETFDB ;GET FDB ADDRESS CMP R0,#-1 ;CHECK FOR ERROR BNE 74$ ;NO ERROR SEC ;ERROR, FORCE CARRY RTS PC ;ERROR RETURN 74$: BIC #FD.PLC,F.RACC(R0) ;CLEAR LOCATE MODE PUT$S R0,4(R5),@6(R5) ;PUT A RECORD BCS X110$ ;CS - IT FAILED X410$: CLRB @10(R5) ;RETURN SUCCESS RETURN X110$: MOVB F.ERR(R0),R1 ;GET ERROR - SIGN EXTEND CMPB R1,#333 ;CHECK FOR SPURIOUS NO FILE ERR BEQ X410$ ;IF SO RETURN OK CMPB R1,#IE.EOF ;ERROR IS EOF? BNE 111$ ;IF NE NO MOV #-1,R1 ;IF EQ YES 111$: ;;;;; M.G. 1/13/82 START CMPB R1,#IE.RBG ;ERROR IS ILLEGAL RECORD SIZE BNE 112$ ;IF NE, NO MOV #-3.,R1 ;IF EQ, YES 112$: MOVB R1,@10(R5) ;AND RETURN IT ;;;;; M.G. 1/13/82 STOP RETURN ;RETURN ; .DSABL LSB .END