.PAGE .TITLE FTOUTPUT SUBROUTINE FOR WRITING OUTPUT BLOCKS. .IDENT /30-APR-1984 V01.D/ ; ; V01.D TWD 30-APR-1984 Add check of output device type to ; see if the buffer should be truncated as with ; a terminal or line printer. ; ; Subroutine for writing completed blocks to the output device. ; This handles both foreign tape and disk I/O. ; ; Calling procedure is - ; PUSHL # Records in output block. ; PUSHL # Bytes remaining in output block. ; CALLS #2,^GFT_OUTPUT ; ; REGISTER USAGE: ; All registers are kept and used by this subroutine as they are used ; in the calling routines. The values in the FT control block are ; also used. ; Specific register usage: ; R0 - Used for status from system I/O routines. ; R1 - Used as a scratch register - points to the current RAB. ; The contents of R0 and R1 must be saved prior to calling ; this routine. ; R2-R9 - Not used. ; R10 - Pointer to FTCB. ; R11 - Pointer to FTIO. ; ; FTCBDEF ; FT CONTROL BLOCK DEFINITIONS. $SSDEF $RABDEF ; OUT_BYTE: .LONG 0 ; # BYTES WRITTEN TO FOREIGN TAPE. ; .PAGE .ENTRY FT_OUTPUT,^M<> ; NO REGISTERS SAVED. ; ; CHECK TO SEE IF THIS IS A FOREIGN TAPE OUTPUT OR NOT. ; IF RMS, BRANCH TO THE PROPER PLACE TO START. ; 20$: BBS #FLAG_V_FTOUT,FTCB_W_FLAG(R10),30$ BRB RMS_OUT_PUT ; GO DO THE RMS WRITE. ; ; WRITE THE BLOCK USING THE TAPE SUB CALL. ; 30$: PUSHAL FTCB+FTCB_Q_ISTAT ; PUSH THE ADDR. OF I/O STATUS BLOCK PUSHAL OUT_BYTE ; PUSH THE ADDR OF THE # BYTES WRITTEN PUSHAL FTCB+FTCB_L_ACT_OUTBLK ; PUSH ADDR. OF # BYTES TO WRITE. PUSHAL FT_OUT_DATA ; ADDR. OF OUTPUT DATA. PUSHAL FTCB+FTCB_L_OUTLUN ; ADDR. OF OUTPUT LOGICAL UNIT NUMBER. CALLS #5,G^WITAPE ; BRW FT_ERRORS ; CHECK ON THE ERRORS. ; ; ; SET FLAG INDICATING THAT OUTPUT HAS JUST COMPLETED. RESET: BBSS #FLAG_V_OUT_COMP,FTCB_W_FLAG(R10),5$ ; 5$: INCL FTCB_L_BLK_WRIT(R10) ; INCREMENT THE COUNT OF BLOCKS WRITTEN ; RET ; .PAGE .SUBTITLE USE THE RMS PUT TO GET THE DATA OUT. ; RMS_OUT_PUT: MOVL FTCB_L_OUT_RAB(R10),R1 ; GET THE ADDRESS OF THE OUTPUT RAB. ; ; CHECK THE "CHECK BUFFER" FLAG TO SEE IF THE BUFFER SIZE ; SHOULD BE CHECKED FOR TERMINALS AND LINE PRINTERS. ; BBC #FLAG_V_CKBUF,FTCB_W_FLAG(R10),30$ ; IF CLEAR - CONTINUE. CMPW FTCB_L_ACT_OUTBLK(R10),FTCB_W_OUT_BUF(R10) ; CHECK SIZE. BLEQ 30$ ; IF SIZE IS OK, CONTINUE. ; ; TRUNCATE THE SIZE OF THE RECORD TO BE WRITTEN TO THE ; SIZE OF THE DEVICE'S BUFFER. ; MOVZWL FTCB_W_OUT_BUF(R10),FTCB_L_ACT_OUTBLK(R10) BBCC #DEFS_V_BUFMSG,FTCB_W_DEFS(R10),30$ ; CHECK TO SEE IF ; SHOULD BE WRITTEN - ONLY WRITE IT ; ONCE PER EXECUTION. ; CALL_MSG PUT_SYS,#FTC_BIGRECS,#0,#FTC_TRUNC,#1,- FTCB_L_ACT_OUTBLK(R10) ; WRITE TRUNC. MESSAGE ; 30$: MOVW FTCB_L_ACT_OUTBLK(R10),RAB$W_RSZ(R1) ; SET "RECORD" SIZE. ; $PUT RAB=R1 ; PUT THE RECORD. ; BLBS R0,RESET ; IF OK, RETURN. ; ; EXIT WITH RMS STUFF. MOVAL OUT_NAM,R1 ; GET OUT NAM BLOCK MOVZBL NAM$B_ESL(R1),TMP_LONG ; GET EXPANDED STRING LENGTH. CALL_MSG EXIT_SYS,#FTC_RMSERROR,#4,MSG_13,MSG_13+4,- TMP_LONG,NAM$L_ESA(R1),R0,RAB$L_STV(R1) ; .PAGE .SUBTITLE HANDLE THE FT_ERRORS ; FT_ERRORS: CMPL #SS$_NORMAL,FTCB_Q_ISTAT(R10) ; CHECK FOR NORMAL. BNEQ 5$ ; NON-NORMAL RETURN. ; BRW RESET ; EVERYTHING OK!! ; ; AN ERROR TO HANDLE. ; 5$: CMPL #10,FTCB_Q_ISTAT(R10) ; CHECK ON SYSTEM AND NON- ; HANDLED ERRORS. BGTR 10$ ; BRANCH TO HANDLE LESSER ERRORS. ; ; EXIT WITH ERROR MESSAGE. 7$: CALL_MSG EXIT_SYS,#FTC_FTERROR,#2,MSG_13,MSG_13+4,- #FTC_ERRCODE,#1,FTCB_Q_ISTAT(R10),FTCB_Q_ISTAT(R10) ; ; LOOK FOR DATA CHECK AND E-O-T SPECIFICALLY. ; 10$: CMPB #5,FTCB_Q_ISTAT(R10) ; CHECK FOR DATA CHECK. BNEQ 30$ ; NOT DATA CHECK - LOOK FOR MORE. ; ; DATA CHECK. CALL_MSG EXIT_SYS,#FTC_FTERROR,#2,MSG_13,MSG_13+4,- #SS$_DATACHECK ; ; 30$: CMPB #3,FTCB_Q_ISTAT(R10) ; CHECK FOR END-OF-TAPE. BNEQ 7$ ; SOME THING ELSE. ; ; E-O-T FOUND CALL_MSG PUT_SYS,#FTC_FTEOT,#2,MSG_13,MSG_13+4,- #FTC_OPERTERM,#0 CALLS #0,G^FT_COP_MSG ; MESSAGE ABOUT THE COPY. CALLS #0,G^FT_STOP ; EXIT FROM PROGRAM. ; TMP_LONG: .LONG 0 .END