.TITLE TWT - RJE TAPE WRITE UTILITY ;----------------------------------------------------------------------; ; MODULE: TWT ; ; LANGUAGE: DEC PDP-11 MACRO ASSEMBLY LANGUAGE (V3.2) ; ; SYSTEM: DEC PDP-11 RUNNING UNDER RSX-11M V3.2 ; ; MOSTEK CORPORATION ; ; COMPUTER AIDS TO DESIGN DIVISION ; ; 1215 WEST CROSBY ROAD ; ; CARROLLTON, TEXAS 75006 ; ; (214) 323-8813 ; ;----------------------------------------------------------------------; ; PROGRAMMER: KEVIN KLUGHART ; ;----------------------------------------------------------------------; ; DATE: 04-08-82 @ 06:00 CDST ; ;----------------------------------------------------------------------; ; PURPOSE: THIS UTILITY PROGRAM ALLOWS A USER TO WRITE ; ; A MAGNETIC TAPE USING AN 80-COLUMN DISK FILE ; ; AS INPUT DATA AND INTERPRETING THIS INPUT DATA ; ; BASED ON MOSTEK UNITECH WORKSTATION COMMANDS. ; ; THIS IS DONE AFTER A PUNCH FILE HAS BEEN ; ; RECEIVED FROM A REMOTE HOST VIA THE RJE/HASP ; ; SUBSYSTEM. THIS PROGRAM IS THE COUNTERPART ; ; OF TRD, THE RJE/HASP TAPE READ UTILITY. THE ; ; FORMAT FOR THIS COMMAND IS AS FOLLOWS: ; ; ; ; >TWT [infile][/switches] ; ; ; ; WHERE infile IS THE INPUT DISK FILE TO BE ; ; COPIED TO MAGNETIC TAPE. ; ;----------------------------------------------------------------------; ; SWITCHES: /M, /MA, /MAN, /MANN ; ; ; ; SPECIFIES THAT THE TAPE TO BE CREATED IS A ; ; MANN TAPE AND THAT SPECIAL BYTE CONVERSION ; ; IS TO TAKE PLACE ON OUTPUT. ; ; ; ; ; ; /L, /LO, /LOG ; ; ; ; SPECIFIES THAT OUTPUT MESSAGES ARE TO BE ; ; LOGGED TO THE SYSTEM CONSOLE AS WELL AS THE ; ; USER TERMINAL. ; ; ; ; ; ; /R, /RE, /RW, /REW, /REWI, /REWIN, /REWIND ; ; ; ; SPECIFIES THAT THE MAGNETIC TAPE IS TO BE ; ; REWOUND AND PLACED OFF-LINE AFTER THE COPY ; ; OPERATION IS COMPLETE. ; ;----------------------------------------------------------------------; ; REVISION LIST: V01.00 - INITIAL RELEASE ; ; V01.01 - INCORPORATE OVERLAPPED TAPE WRITE CODE; ; V01.02 - IMPLEMENT UNITECH MAG TAPE COMMANDS ; ; TO ADVANCE FILE, BACKSPACE FILE, FIND ; ; FILE, AND WRITE END-OF-FILE. ADD CODE; ; TO DETECT WRITE-PROTECTED TAPE REELS. ; ; ADD /REWIND SWITCH TO REWIND TAPE. ; ; V01.03 - FIX BUG IN DYNAMIC TAPE BLOCK SIZING ; ; ADD ZERO BUFFER FILL FOR LAST BLOCK. ; ; ADD WARNING FOR ODD BLOCK SIZE. ; ; ADD EBCDIC-TO-ASCII FLAG FOR MAG TAPE.; ; V01.04 - ADD HEX CONVERSION ERROR MESSAGE. ; ; V01.05 - ADD MT: SELECT ERROR PROCESSING ; ; V01.06 - ADD INITIALIZATION MESSAGE ; ; V01.07 - ADD "EXACT" QUALIFIER FOR CSI PARSE ; ;----------------------------------------------------------------------; .IDENT /V01.07/ ; CURRENT RELEASE .PSECT $DATA .ENABLE LC .SBTTL PROGRAM PARAMETERS ;----------------------------------------------------------------------; ; ; ; ; ; PROGRAM PARAMETERS ; ; ; ; ; ;----------------------------------------------------------------------; ; LOGICAL UNIT ASSIGNMENTS (LUN) ; ;----------------------------------------------------------------------; TILUN = 1 ; LOGICAL UNIT FOR TERMINAL I/O TTLUN = TILUN+1 ; LOGICAL UNIT FOR LOG TERMINAL I/O MTLUN = TTLUN+1 ; LOGICAL UNIT FOR MAG TAPE INPUT RDLUN = MTLUN+1 ; LOGICAL UNIT FOR INPUT FILE(S) WTLUN = RDLUN+1 ; LOGICAL UNIT FOR OUTPUT FILE ;----------------------------------------------------------------------; ; EVENT FLAG ASSIGNMENTS ; ;----------------------------------------------------------------------; TIFLAG= TILUN ; EVENT FLAG FOR TERMINAL I/O TTFLAG= TTLUN ; EVENT FLAG FOR LOG TERMINAL I/O MTFLAG= MTLUN ; EVENT FLAG FOR MAG TAPE I/O ;----------------------------------------------------------------------; ; BUFFER DEFINITION PARAMETERS ; ;----------------------------------------------------------------------; CRDSIZ= 80. ; MAXIMUM RECORD SIZE - INPUT RECORD CRDMAX= CRDSIZ+1 ; MAXIMUM RECORD SIZE - GET$ RECORD RECSIZ= 4096. ; MAXIMUM RECORD SIZE - OUTPUT RECORD ;----------------------------------------------------------------------; ; INITIAL LOGICAL BUFFER LENGTH DEFINITIONS ; ;----------------------------------------------------------------------; CRDINI= CRDSIZ ; INITIAL MAXIMUM INPUT RECORD SIZE RECINI= 512. ; INITIAL MAXIMUM OUTPUT RECORD SIZE ;----------------------------------------------------------------------; ; CHARACTER PARAMETERS ; ;----------------------------------------------------------------------; ASCPAD= 040 ; ASCII PAD CHARACTER BEL = 007 ; ASCII BELL CHARACTER BINPAD= 100 ; EBCDIC PAD CHARACTER CR = 015 ; ASCII CARRIAGE RETURN LF = 012 ; ASCII LINEFEED MAN.BS= 340 ; EBCDIC BACKSLASH - SPECIAL MANN BYTE MAN.NL= 025 ; EBCDIC NEW LINE - SPECIAL MANN BYTE ;----------------------------------------------------------------------; ; UNITECH EMULATION COMMAND PARAMETERS ; ;----------------------------------------------------------------------; UT.KEY= 046535 ; COMMAND KEY - EBCDIC ')(' UT.DLM= ', ; COMMAND DELIMITER UT.MSG= 'M ; OPERATOR MESSAGE UT.WRT= 'P ; WRITE TAPE, SPECIFYING BLOCK & RECORD PARMS UT.CMD= 'C ; MID-TAPE NEW BLOCK & RECORD SIZE COMMAND UT.END= 'E ; TERMINATE TAPE WRITE, GENERATE TAPE EOF UT.XEQ= 'X ; UNITECH CONSOLE COMMAND ;----------------------------------------------------------------------; ; UNITECH SUBCOMMAND IDENTIFIERS ; ;----------------------------------------------------------------------; UT.ASC= 'A ; EBCDIC TO ASCII DATA CONVERSION UT.BIN= 'B ; BINARY DATA STREAM (NO CONVERSION) UT.HEX= 'H ; HEXADECIMAL DATA STREAM CONVERSION UT.BLK= 'R ; SPECIFY OUTPUT BLOCK SIZE UT.REC= 'W ; SPECIFY INPUT RECORD SIZE UT.EOF= 'W ; WRITE END-OF-FILE TO TAPE UT.SUM= 'S ; CHECKSUM DATA TO END-OF-FILE MARK ;----------------------------------------------------------------------; ; UNITECH USER CONSOLE COMMANDS WHICH ARE IGNORED ; ;----------------------------------------------------------------------; UX.ARM= 'A ; ARM TAPE DRIVE - IGNORED UX.DRM= 'D ; DEARM TAPE DRIVE - IGNORED ;----------------------------------------------------------------------; ; UNITECH MAGNETIC TAPE CONSOLE USER COMMANDS ; ;----------------------------------------------------------------------; UX.ID0= '. ; MAG TAPE COMMANDS ARE OF FORM 'X,.MAG0,****' UX.ID1= 'M ; UX.ID2= 'A ; UX.ID3= 'G ; UX.ADV= 'A ; ADVANCE TAPE SPECIFIED NUMBER OF FILES UX.BSP= 'B ; BACKSPACE TAPE SPECIFIED NUMBER OF FILES UX.FIL= 'F ; POSITION TAPE TO SPECIFIED FILE NUMBER UX.RWD= 'R ; REWIND TAPE DRIVE UX.EOF= 'W ; WRITE END OF FILE TO TAPE ;----------------------------------------------------------------------; ; MAGNETIC TAPE SENSE CHARACTERISTICS BIT FIELD DEFINITIONS ; ;----------------------------------------------------------------------; MC.556= 000001 ; TU10 556BPI (7-TRACK) MC.200= 000002 ; TU10 200BPI (7-TRACK) MC.DMP= 000004 ; TU10 CORE DUMP MODE (7-TRACK) MC.EVN= 000010 ; EVEN PARITY (DEFAULT IS ODD) MC.EOT= 000020 ; TAPE IS PAST EOT MC.EOF= 000040 ; LAST TAPE COMMAND ENCOUNTERED EOF MC.WRL= 000100 ; WRITING IS PROHIBITED MC.GAP= 000200 ; WRITING WITH EXTENDED IRG PROHIBITED MC.SER= 000400 ; SELECT ERROR ON UNIT MC.REW= 001000 ; UNIT IS REWINDING MC.RNG= 002000 ; UNIT IS PHYSICALLY WRITE-LOCKED MC.160= 004000 ; TE16, TU16, TU45, TU77, TS04 1600BPI MC.7TR= 010000 ; TU10 7-TRACK MC.BOT= 020000 ; TAPE IS AT LOAD POINT (BOT) MC.EOV= 040000 ; TAPE IS AT END-OF-VOLUME (EOV) MC.POV= 100000 ; TAPE IS PAST EOV (RESERVED) .SBTTL EXTERNAL MACROS ;----------------------------------------------------------------------; ; ; ; ; ; EXTERNAL MACROS ; ; ; ; ; ;----------------------------------------------------------------------; ; EXECUTIVE DIRECTIVE MACROS ; ;----------------------------------------------------------------------; .MCALL ALUN$ ; ASSIGN LUN .MCALL CALL ; CALL SUBROUTINE .MCALL DIR$ ; EXECUTE EXECUTIVE DIRECTIVE .MCALL EXIT$S ; EXIT TASK .MCALL GTIM$S ; GET TIME PARAMETERS .MCALL MRKT$S ; MARK TIME (IDLE MODE DELAY) .MCALL QIO$S ; QUEUE I/O REQUEST .MCALL QIOW$S ; QUEUE I/O REQUEST AND WAIT .MCALL RETURN ; RETURN FROM SUBROUTINE .MCALL SETF$S ; SET SINGLE EVENT FLAG .MCALL WTSE$S ; WAIT ON SINGLE EVENT FLAG ;----------------------------------------------------------------------; ; FILE PROCESSING MACROS ; ;----------------------------------------------------------------------; .MCALL CLOSE$ ; CLOSE FILE .MCALL FDAT$R ; INITIALIZE FILE ATTRIBUTES SECTION OF FDB .MCALL FDBDF$ ; DEFINE FDB .MCALL FINIT$ ; INITIALIZE FILE PROCESSING .MCALL FSRSZ$ ; ALLOCATE FSR REGION .MCALL GET$ ; GET (READ) A RECORD .MCALL OPEN$R ; OPEN A FILE FOR READ-ONLY ACCESS .MCALL OPEN$W ; OPEN A FILE FOR WRITE-ONLY ACCESS .MCALL PUT$ ; PUT (WRITE) A SINGLE RECORD ;----------------------------------------------------------------------; ; COMMAND LINE PROCESSING MACROS ; ;----------------------------------------------------------------------; .MCALL CSI$ ; COMMAND STRING INTERPRETER .MCALL CSI$1 ; COMMAND SYNTAX ANALYZER .MCALL CSI$2 ; COMMAND SYNTAX PARSER .MCALL CSI$SW ; CREATE SWITCH DESCRIPTOR TABLE ENTRY .MCALL CSI$SV ; CREATE SWITCH-VALUE DESCRIPTOR TABLE ENTRY .MCALL CSI$ND ; DEFINE END OF DESCRIPTOR TABLE .MCALL GCML$ ; GET MCR COMMAND LINE .MCALL GCMLB$ ; GET MCR COMMAND LINE BUFFER DEFINITION .MCALL GCMLD$ ; DEFINE OFFSETS FOR GCMLB$ .SBTTL LOCAL MACRO DEFINITIONS ;----------------------------------------------------------------------; ; ; ; ; ; LOCAL MACRO DEFINITIONS ; ; ; ; ; ;----------------------------------------------------------------------; ; ERROR REPORTING MACRO ; ;----------------------------------------------------------------------; ; THIS MACRO ALLOWS THE PROGRAMMER TO SPECIFY AN ERROR VALUE OR ; ; ALLOW THE ERROR MACRO TO SPECIFY AN ERROR INDEX WHICH IS PUT ; ; IN REGISTER R5 PRIOR TO TRAPPING BY AN ODD ADDRESS TRAP. ; ;----------------------------------------------------------------------; .MACRO ERROR ERR,ERRBYT .IF NDF $$$ERR ; DEFINE ERROR COUNT IF FIRST INVOCATION $$$ERR= 0 ; INITIALIZE ERROR COUNT .ENDC .NARG $$$ERC ; COMPUTE NUMBER OF ERROR ARGUMENTS $$$ERR= $$$ERR+1 ; *********** ERROR INDEX *********** .PRINT $$$ERR ; *********** ERROR INDEX *********** MOVB #$$$ERR,R5 ; GET ERROR INDEX POINTER ASL R5 ; SHIFT ERROR TO UPPER 3 OCTAL DIGITS (XXX.000) ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; RESULT IS CNT.ERR (000.000) .IF NE $$$ERC ; IF NUMBER OF ARGUMENTS IS NOT ZERO, SHOW ERROR BISB ERR,R5 ; GET ERROR NUMBER .ENDC .IF EQ $$$ERC-2 ; IF 2 ARGUMENTS, LOAD R4 WITH ERROR BYTE MOVB ERRBYT,R4 ; GET ERROR BYTE .ENDC TST .+1 ; EXIT WITH FATAL ODD ADDRESS TRAP .ENDM ;----------------------------------------------------------------------; ; ; ; PRINT MESSAGE TO CONSOLE MACRO ; ; ; ;----------------------------------------------------------------------; ; THIS MACRO ALLOWS THE USER TO QUEUE A MESSAGE TO THE USER ; ; TERMINAL, AND LOGS THE MESSAGE TO THE OPERATOR CONSOLE ; ;----------------------------------------------------------------------; .MACRO PRINT MSG,LEN,SPC .NARG $$$CNT ; GET NUMBER OF ARGUMENTS MOV MSG,MS.PTR ; GET ADDRESS OF MESSAGE TO PRINT MOV LEN,MS.LEN ; GET LENGTH OF MESSAGE .IF EQ $$$CNT-2 ; FOR 2 ARGUMENTS MOV #40,MS.SPC ; SINGLE SPACE OUTPUT .ENDC .IF EQ $$$CNT-3 ; FOR 3 ARGUMENTS MOV SPC,MS.SPC ; SELECT CARRIAGE CONTROL .ENDC CALL $MSG ; PRINT THE MESSAGE .ENDM ; END OF PRINT MACRO .SBTTL DOUBLE PRECISION INTEGER MACROS ;----------------------------------------------------------------------; ; ; ; ; ; DOUBLE PRECISION INTEGER MACROS ; ; ; ; ; ;----------------------------------------------------------------------; ; ; ; ADDL - ADD TO DOUBLE PRECISION LONGWORD ; ; ; ;----------------------------------------------------------------------; .MACRO ADDL VAL,LOC ADD VAL,LOC+2 ; ADD WORD QUANTITY TO SECOND WORD ADC LOC ; ADD CARRY BIT TO FIRST WORD .ENDM ; END OF ADDL MACRO ;----------------------------------------------------------------------; ; ; ; CLRL - CLEAR DOUBLE PRECISION LONGWORD ; ; ; ;----------------------------------------------------------------------; .MACRO CLRL LOC ; CLEAR LONGWORD QUANTITY CLR LOC ; CLEAR FIRST WORD CLR LOC+2 ; CLEAR SECOND WORD .ENDM ; END OF CLRL MACRO ;----------------------------------------------------------------------; ; ; ; INCL - INCREMENT DOUBLE PRECISION LONGWORD ; ; ; ;----------------------------------------------------------------------; .MACRO INCL LOC,?SKIP ; INCREMENT LONGWORD QUANTITY INC LOC+2 ; INCREMENT SECOND WORD BVC SKIP ; IF NO OVERFLOW, THEN SKIP SECOND INCREMENT INC LOC ; OVERFLOW - INCREMENT FIRST WORD SKIP: ; SKIP PAST SECOND INCREMENT .ENDM ; END OF INCL MACRO ;----------------------------------------------------------------------; ; ; ; CBDMG - CONVERT BINARY WORD TO ASCII DECIMAL ; ; ; ;----------------------------------------------------------------------; .MACRO CBDMG OUTPUT,INPUT,ZERO,?CLR MOV OUTPUT,R0 ; GET OUTPUT ADDRESS MOV #5,R1 ; ZERO OUT 5 DECIMAL DIGITS CLR: CLRB (R0)+ ; CLEAR OUT OUTPUT AREA BYTE DEC R1 ; DECREMENT BYTE COUNTER BNE CLR ; CLEAR AGAIN IF NECESSARY MOV OUTPUT,R0 ; R0 - STARTING ADDRESS OF OUTPUT AREA MOV INPUT,R1 ; R1 - WORD VALUE TO BE CONVERTED MOV ZERO,R2 ; R2 - 0 FOR ZERO SUPPRESSION, ? FOR LEAD ZEROS CALL $CBDMG ; CONVERT WORD TO ASCII DECIMAL .ENDM ; END OF CBDMG MACRO ;----------------------------------------------------------------------; ; ; ; CBOMG - CONVERT BINARY WORD TO ASCII OCTAL ; ; ; ;----------------------------------------------------------------------; .MACRO CBOMG OUTPUT,INPUT,ZERO,?CLR MOV OUTPUT,R0 ; GET OUTPUT ADDRESS MOV #6,R1 ; ZERO OUT 6 OCTAL DIGITS CLR: CLRB (R0)+ ; CLEAR OUT OUTPUT AREA BYTE DEC R1 ; DECREMENT BYTE COUNTER BNE CLR ; CLEAR AGAIN IF NECESSARY MOV OUTPUT,R0 ; R0 - STARTING ADDRESS OF OUTPUT AREA MOV INPUT,R1 ; R1 - WORD VALUE TO BE CONVERTED MOV ZERO,R2 ; R2 - 0 FOR ZERO SUPPRESSION, ? FOR LEAD ZEROS CALL $CBOMG ; CONVERT WORD TO ASCII OCTAL .ENDM ; END OF CBOMG MACRO ;----------------------------------------------------------------------; ; ; ; CDDMG - CONVERT DOUBLE PRECISION INTEGER TO ASCII DECIMAL ; ; ; ;----------------------------------------------------------------------; .MACRO CDDMG OUTPUT,INPUT,ZERO,?CLR MOV OUTPUT,R0 ; GET OUTPUT ADDRESS MOV #9.,R1 ; ZERO OUT 9 DECIMAL DIGITS CLR: CLRB (R0)+ ; CLEAR OUT OUTPUT AREA BYTE DEC R1 ; DECREMENT BYTE COUNTER BNE CLR ; CLEAR AGAIN IF NECESSARY MOV OUTPUT,R0 ; R0 - STARTING ADDRESS OF OUTPUT AREA MOV INPUT,R1 ; R1 - ADDRESS OF LONGWORD TO BE CONVERTED MOV ZERO,R2 ; R2 - 0 FOR ZERO SUPPRESSION, ? FOR LEAD ZEROS CALL $CDDMG ; CONVERT LONGWORD TO ASCII DECIMAL .ENDM ; END OF CDDMG MACRO .SBTTL DIRECTIVE PARAMETER BLOCKS (DPB'S) ;----------------------------------------------------------------------; ; ; ; ; ; DIRECTIVE PARAMETER BLOCKS ; ; ; ; ; ;----------------------------------------------------------------------; ; SET UP GET COMMAND LINE BUFFERS FOR USER INPUT ; ;----------------------------------------------------------------------; ; FORMAT FOR GCML MACRO: GCMLB$ MAXD,PRMPT,UBUF,LUN,PDL,SIZE ; ;----------------------------------------------------------------------; .EVEN GETMCR: GCMLB$ 1,TWT ;----------------------------------------------------------------------; ; DEFINE MESSAGE BUFFER FOR QIO USER INPUTS ; ;----------------------------------------------------------------------; MSGBUF: .BLKB 82. MSGLEN= .-MSGBUF ;----------------------------------------------------------------------; ; ALLOCATE SPACE FOR CSI PARSING ; ;----------------------------------------------------------------------; CSI$ CSIBLK: .BLKB C.SIZE ; ALLOCATE CSI SPACE CSIMKW: .BLKW 1 ; CSI MASK WORD ;----------------------------------------------------------------------; ; ; ; CSI SWITCH DESCRIPTOR TABLE DEFINITION ; ; ; ;----------------------------------------------------------------------; ; DEFINE SWITCH MASKS ; ;----------------------------------------------------------------------; ASCFLG= 000001 ; ASCII TO EBCDIC CONVERSION BINFLG= 000002 ; BINARY DATA TRANSFER - NO CONVERSION HEXFLG= 000004 ; EBCDIC HEXADECIMAL TO BINARY CONVERSION LOGFLG= 000010 ; LOG STATISTICS ON CONSOLE MANFLG= 000020 ; SPECIAL MANN TAPE PROCESSING (CONVERSION) REWFLG= 000040 ; REWIND TAPE AND UNLOAD AFTER COMPLETION NBLFLG= 040000 ; LOW NIBBLE FLAG - RESET TO LOAD HIGH HEX NIBBLE WRTFLG= 100000 ; ENABLE WRITING TO OUTPUT DEVICE ;----------------------------------------------------------------------; ; DEFINE SWITCH DESCRIPTOR TABLE ; ;----------------------------------------------------------------------; CSISWD: CSI$SW L,LOGFLG,CSIMKW,SET,NEG,,EXACT CSI$SW LO,LOGFLG,CSIMKW,SET,NEG,,EXACT CSI$SW LOG,LOGFLG,CSIMKW,SET,NEG,,EXACT CSI$SW M,MANFLG,CSIMKW,SET,NEG,,EXACT CSI$SW MA,MANFLG,CSIMKW,SET,NEG,,EXACT CSI$SW MAN,MANFLG,CSIMKW,SET,NEG,,EXACT CSI$SW MANN,MANFLG,CSIMKW,SET,NEG,,EXACT CSI$SW R,REWFLG,CSIMKW,SET,NEG,,EXACT CSI$SW RE,REWFLG,CSIMKW,SET,NEG,,EXACT CSI$SW RW,REWFLG,CSIMKW,SET,NEG,,EXACT CSI$SW REW,REWFLG,CSIMKW,SET,NEG,,EXACT CSI$SW REWI,REWFLG,CSIMKW,SET,NEG,,EXACT CSI$SW REWIN,REWFLG,CSIMKW,SET,NEG,,EXACT CSI$SW REWIND,REWFLG,CSIMKW,SET,NEG,,EXACT CSI$ND ; END OF SWITCH DESCRIPTOR TABLE ;----------------------------------------------------------------------; ; ALLOCATE PARAMETER BLOCKS FOR TAPE QIO SENSE CHARACTERISTICS ; ;----------------------------------------------------------------------; MTSKIP: .BLKW 1 ; TAPE FILE SKIP COUNT ([+]=FWD, [-]=REV) ;----------------------------------------------------------------------; ; ALLOCATE QIO STATUS BLOCK FOR I/O RETURN STATUS ; ;----------------------------------------------------------------------; IOSTAT: .BLKW 1 ; I/O STATUS & DEVICE DATA MTCHAR: ; TAPE CHARACTERISTICS WORD BYTCNT: .BLKW 1 ; TRANSFER COUNT IN BYTES ;----------------------------------------------------------------------; ; ALLOCATE DPB FOR ASSIGN LUN DIRECTIVE ; ;----------------------------------------------------------------------; ALUN: ALUN$ MTLUN,MT,0 ; ASSIGN LUN FOR MAG TAPE (OR OTHER) .SBTTL DATA BUFFERS ;----------------------------------------------------------------------; ; ; ; ; ; DATA BUFFERS ; ; ; ; ; ;----------------------------------------------------------------------; ; FILE STORAGE REGION ; ;----------------------------------------------------------------------; .EVEN FSRSZ$ 2,,$DATA ; ONLY TWO FILES HERE: INPUT/MCR ;----------------------------------------------------------------------; ; EBCDIC HEXADECIMAL CONVERSION DATA TABLE ; ;----------------------------------------------------------------------; HEX: .BYTE 360,361,362,363,364,365,366,367 ; "01234567" .BYTE 370,371,301,302,303,304,305,306 ; "89ABCDEF" HEXLEN= .-HEX-1 ;----------------------------------------------------------------------; ; INPUT BUFFER DEFINITIONS ; ;----------------------------------------------------------------------; .EVEN CRDLEN: .BLKW 1 ; LOGICAL INPUT RECORD LENGTH CRDEND: .BLKW 1 ; LOGICAL END OF INPUT BUFFER + 1 CRDBUF: .BLKB CRDMAX ; INPUT RECORD SINGLE BUFFER CRDEOB= .-1 ; POINT TO END OF CARD BUFFER ;----------------------------------------------------------------------; ; OUTPUT BUFFER DEFINITIONS ; ;----------------------------------------------------------------------; .EVEN RECADR: .BLKW 1 ; ADDRESS OF OUTPUT BUFFER START RECLEN: .BLKW 1 ; LOGICAL OUTPUT RECORD LENGTH RECEND: .BLKW 1 ; LOGICAL END OF OUTPUT BUFFER + 1 RECBF0: .BLKB RECSIZ ; OUTPUT SINGLE RECORD BUFFER - PRIMARY RECBF1: .BLKB RECSIZ ; OUTPUT SINGLE RECORD BUFFER - SECONDARY .SBTTL EBCDIC TO ASCII TRANSLATE TABLE ;----------------------------------------------------------------------; ; ; ; ; ; EBCDIC TO ASCII TRANSLATE TABLE ; ; ; ; ; ;----------------------------------------------------------------------; ASCII: .BYTE 000,001,002,003,040,011,040,177,040,040 .BYTE 040,013,014,015,016,017,020,021,022,023 .BYTE 040,040,010,040,030,031,040,040,034,035 .BYTE 036,037,040,040,040,040,040,012,027,033 .BYTE 040,040,040,040,040,005,006,007,040,040 .BYTE 026,040,040,040,040,004,040,040,040,040 ; 50. .BYTE 024,025,040,032,040,040,040,040,040,040 .BYTE 040,040,040,040,133,056,074,050,053,041 .BYTE 046,040,040,040,040,040,040,040,040,040 .BYTE 135,044,052,051,073,136,055,057,040,040 .BYTE 040,040,040,040,040,040,174,054,045,137 ; 100. .BYTE 076,077,137,040,040,040,040,040,040,040 .BYTE 040,140,072,043,100,047,075,042,040,141 .BYTE 142,143,144,145,146,147,150,151,040,040 .BYTE 040,040,040,040,040,152,153,154,155,156 .BYTE 157,160,161,162,040,040,040,040,040,040 ; 150. .BYTE 040,176,163,164,165,166,167,170,171,172 .BYTE 040,040,040,040,040,040,040,040,040,040 .BYTE 040,040,040,040,040,040,040,040,040,040 .BYTE 040,040,173,101,102,103,104,105,106,107 .BYTE 110,111,040,040,040,040,040,040,175,112 ; 200. .BYTE 113,114,115,116,117,120,121,122,040,040 .BYTE 040,040,040,040,134,040,123,124,125,126 .BYTE 127,130,131,132,040,040,040,040,040,040 .BYTE 060,061,062,063,064,065,066,067,070,071 .BYTE 040,040,040,040,040,040 ; 250. .SBTTL ASCII TO EBCDIC TRANSLATE TABLE ;----------------------------------------------------------------------; ; ; ; ; ; ASCII TO EBCDIC TRANSLATE TABLE ; ; ; ; ; ;----------------------------------------------------------------------; EBCDIC: .BYTE 000,001,002,003,004,005,006,007 .BYTE 010,011,012,013,014,015,016,017 .BYTE 020,021,022,023,024,025,026,027 .BYTE 030,031,032,033,034,035,036,037 .BYTE 100,117,177,173,133,154,120,175 ; 40 .BYTE 115,135,134,116,153,140,113,141 .BYTE 360,361,362,363,364,365,366,367 .BYTE 370,371,172,136,114,176,156,157 .BYTE 174,301,302,303,304,305,306,307 ; 100 .BYTE 310,311,321,322,323,324,325,326 .BYTE 327,330,331,342,343,344,345,346 .BYTE 347,350,351,112,340,132,137,155 .BYTE 171,201,202,203,204,205,206,207 ; 140 .BYTE 210,211,221,222,223,224,225,226 .BYTE 227,230,231,242,243,244,245,246 .BYTE 247,250,251,300,152,320,241,377 .SBTTL STATISTICS COUNTERS ;----------------------------------------------------------------------; ; ; ; ; ; STATISTICS COUNTERS ; ; ; ; ; ;----------------------------------------------------------------------; ; THE FOLLOWING COUNTERS MAINTAIN STATISTICS ON THE NUMBER OF ; ; DATA BLOCKS READ FROM TAPE OR DISK, THE NUMBER OF BYTES ; ; TRANSFERRED TO DISK, AND THE NUMBER OF CARD IMAGES CREATED. ; ;----------------------------------------------------------------------; .EVEN FT.NUM: .BLKW 2 ; INPUT FILE COUNTER FT.SUM: .BLKW 2 ; OUTPUT TRANSFER CHECKSUM (TOTAL) FT.BLK: .BLKW 2 ; NUMBER OF BLOCKS WRITTEN (TOTAL) FT.BYT: .BLKW 2 ; NUMBER OF BYTES WRITTEN (TOTAL) FT.REC: .BLKW 2 ; NUMBER OF RECORD IMAGES READ (TOTAL) FI.EOF: .BLKW 2 ; OUTPUT FILE COUNTER FI.SUM: .BLKW 2 ; OUTPUT TRANSFER CHECKSUM (PER EOF WRITTEN) FI.BLK: .BLKW 2 ; NUMBER OF BLOCKS WRITTEN FI.BYT: .BLKW 2 ; NUMBER OF BYTES WRITTEN FI.REC: .BLKW 2 ; NUMBER OF RECORD IMAGES READ .SBTTL OPERATOR MESSAGES ;----------------------------------------------------------------------; ; ; ; ; ; OPERATOR MESSAGES ; ; ; ; ; ;----------------------------------------------------------------------; ; DEFINE DESCRIPTOR BLOCK FOR ALL OPERATOR MESSAGES ; ;----------------------------------------------------------------------; .EVEN MS.PTR: .BLKW 1 ; DEFINE MESSAGE ADDRESS MS.LEN: .BLKW 1 ; DEFINE MESSAGE LENGTH MS.SPC: .BLKW 1 ; DEFINE CARRIAGE CONTROL ;----------------------------------------------------------------------; ; OPERATOR MESSAGE TEXT ; ;----------------------------------------------------------------------; ; INITIALIZATION AND VERSION INFORMATION MESSAGE ; ;----------------------------------------------------------------------; ID.MSG: .ASCII / *** RJE Tape Write Utility - / .ASCII /V01.07 (08-APR-82) ***/ .BYTE CR,LF,LF ID.LEN= .-ID.MSG ;----------------------------------------------------------------------; ; INPUT FILE STATISTICS ; ;----------------------------------------------------------------------; MI.MSG: .ASCII /*** File / MI.NUM: .ASCII \XXXXX/\ MI.EOF: .ASCII /XXXXX has / MI.REC: .ASCII /XXXXXXXXX records, / MI.BLK: .ASCII /XXXXXXXXX blocks, / MI.BYT: .ASCII /XXXXXXXXX bytes, checksum = / MI.SUM: .ASCII /XXXXXX ***/ MI.LEN= .-MI.MSG ;----------------------------------------------------------------------; ; TOTAL FILE STATISTICS ; ;----------------------------------------------------------------------; MT.MSG: .ASCII /*** Copy Totals: / MT.REC: .ASCII /XXXXXXXXX records, / MT.BLK: .ASCII /XXXXXXXXX blocks, / MT.BYT: .ASCII /XXXXXXXXX bytes, checksum = / MT.SUM: .ASCII /XXXXXX ***/ MT.LEN= .-MT.MSG ;----------------------------------------------------------------------; ; PROMPT STRING MESSAGES ; ;----------------------------------------------------------------------; UT.RDM: .BYTE CR,LF,BEL,BEL .ASCII /*** Please mount tape and hit RETURN when ready.../ UT.RDL= .-UT.RDM UT.WRM: .BYTE CR,LF,BEL,BEL .ASCII /*** Magnetic tape reel is write-protected ***/ .BYTE CR,LF .ASCII /*** Please insert write ring in tape reel ***/ UT.WRL= .-UT.WRM ;----------------------------------------------------------------------; ; ERROR MESSAGES ; ;----------------------------------------------------------------------; ; REPORT UNITECH SYNTAX ERRORS ; ;----------------------------------------------------------------------; UT.ERR: .ASCII /*** UNITECH COMMAND SYNTAX ERROR - ABORTING ***/ .BYTE BEL,BEL,BEL,BEL UT.ERL= .-UT.ERR ;----------------------------------------------------------------------; ; REPORT UNITECH MAG TAPE SYNTAX ERRORS ; ;----------------------------------------------------------------------; UX.ERR: .ASCII /*** INVALID MAG TAPE COMMAND OR PARAMETER - ABORTING ***/ .BYTE BEL,BEL,BEL,BEL UX.ERL= .-UX.ERR ;----------------------------------------------------------------------; ; INFORM USER OF MAG TAPE SELECT ERROR (WAIT FOR READY TAPE) ; ;----------------------------------------------------------------------; UX.SER: .ASCII /*** Tape drive is not ready - waiting ***/ UX.SEL= .-UX.SER ;----------------------------------------------------------------------; ; REPORT ODD BLOCK LENGTH ERRORS ; ;----------------------------------------------------------------------; UT.BER: .ASCII /*** WARNING - OUTPUT BLOCK SIZE MUST BE EVEN ***/ .BYTE BEL,BEL,BEL,BEL UT.BEL= .-UT.BER ;----------------------------------------------------------------------; ; REPORT FILE CHECKSUM ERRORS ; ;----------------------------------------------------------------------; UT.SER: .ASCII /*** EOF CHECKSUM VERIFICATION REJECT - ABORTING ***/ .BYTE BEL,BEL,BEL,BEL UT.SEL= .-UT.SER ;----------------------------------------------------------------------; ; REPORT TASK ABORT DUE TO ESCAPE KEY ENTRY ; ;----------------------------------------------------------------------; UT.EXM: .BYTE CR,LF .ASCII /*** ESCAPE key detected - aborting execution ***/ .BYTE BEL,BEL,BEL,BEL UT.EXL= .-UT.EXM ;----------------------------------------------------------------------; ; REPORT HEXADECIMAL CONVERSION ERRORS ; ;----------------------------------------------------------------------; UT.HCM: .ASCII /*** FATAL HEX CONVERSION ERROR - ABORTING ***/ .BYTE BEL,BEL,BEL,BEL UT.HCL= .-UT.HCM ;----------------------------------------------------------------------; ; REPORT MISSING HEXADECIMAL DATA - UNPROCESSED NIBBLE ; ;----------------------------------------------------------------------; UT.HXE: .ASCII /*** WARNING - UNPROCESSED HEXADECIMAL DATA ***/ .BYTE BEL,BEL,BEL,BEL UT.HXL= .-UT.HXE .SBTTL FCS INPUT FILE SPECIFICATIONS ;----------------------------------------------------------------------; ; ; ; ; ; FCS INPUT FILE SPECIFICATIONS ; ; ; ; ; ;----------------------------------------------------------------------; ; DEFINE DATA STRUCTURES NECESSARY FOR INPUT FILE(S) ; ;----------------------------------------------------------------------; .EVEN FDBRD: FDBDF$ ; DEFINE FILE DESCRIPTOR BLOCK .SBTTL TWT - MAIN PROGRAM INITIALIZATION ;----------------------------------------------------------------------; ; ; ; ; ; ; ; TWT - MAIN PROGRAM INITIALIZATION ; ; ; ; ; ; ; ;----------------------------------------------------------------------; ; INITIALIZE FILE SYSTEM PROCESSING ; ;----------------------------------------------------------------------; .PSECT TWT .EVEN START: FINIT$ ; INITIALIZE FILE SYSTEM PROCESSING PRINT #ID.MSG,#ID.LEN,#60 ; PRINT INITIALIZATION MESSAGE .SBTTL GET A COMMAND LINE FROM THE USER ;----------------------------------------------------------------------; ; ; ; ; ; GET A COMMAND LINE FROM THE USER ; ; ; ; ; ;----------------------------------------------------------------------; ; ZERO OUT STATISTICS COUNTERS (TOTALS) ; ;----------------------------------------------------------------------; GETCMD: CLRL FT.NUM ; ZERO TOTAL INPUT FILE COUNT CLRL FT.SUM ; ZERO TOTAL OUTPUT FILE CHECKSUM CLRL FT.BLK ; ZERO NUMBER OF BLOCKS READ CLRL FT.BYT ; ZERO NUMBER OF BYTES READ/WRITTEN CLRL FT.REC ; ZERO NUMBER OF RECORDS WRITTEN CLRL FI.EOF ; ZERO TOTAL OUTPUT FILE COUNT ;----------------------------------------------------------------------; ; INITIALIZE LOGICAL INPUT AND OUTPUT RECORD LENGTHS ; ;----------------------------------------------------------------------; MOV #CRDINI,CRDLEN ; INITIALIZE MAXIMUM INPUT RECORD LENGTH MOV #RECINI,RECLEN ; INITIALIZE MAXIMUM OUTPUT RECORD LENGTH ;----------------------------------------------------------------------; ; USE MCR INTERFACE TO GET USER COMMAND ; ;----------------------------------------------------------------------; GCML$ #GETMCR ; GET MCR COMMAND LINE TSTB GETMCR+G.ERR ; ANY ERROR? BEQ PARSE ; NO, PARSE COMMAND LINE ;----------------------------------------------------------------------; ; ERROR IN GETTING COMMAND: EITHER EOF OR SOME FATAL ERROR ; ;----------------------------------------------------------------------; CMPB GETMCR+G.ERR,#GE.EOF ; END-OF-FILE IN INPUT? BNE 10$ ; NO, SOME FATAL GCML ERROR JMP EXIT ; YES, EXIT TASK 10$: ERROR GETMCR+G.ERR ; INFORM USER OF FATAL ERROR .SBTTL PARSE USER COMMAND STRING ;----------------------------------------------------------------------; ; ; ; ; ; PARSE USER COMMAND STRING ; ; ; ; ; ;----------------------------------------------------------------------; ; USE COMMAND SYNTAX ANALYZER TO ANALYZE USER COMMAND STRING ; ;----------------------------------------------------------------------; PARSE: CSI$1 #CSIBLK,GETMCR+G.CMLD+2,GETMCR+G.CMLD BCC NXTFIL ; IF NO ERROR, THEN OPEN INPUT FILE ERROR ; INFORM USER OF ERROR .SBTTL PARSE AND OPEN INPUT FILE ;----------------------------------------------------------------------; ; ; ; ; ; PARSE AND OPEN INPUT FILE ; ; ; ; ; ;----------------------------------------------------------------------; ; INCREMENT FILE COUNTER AND ZERO INPUT FILE STATISTICS COUNTERS ; ;----------------------------------------------------------------------; NXTFIL: INC FT.NUM ; INCREMENT FILE COUNTER (TOTAL) CLRL FI.SUM ; INITIALIZE OUTPUT FILE CHECKSUM CLRL FI.BLK ; ZERO OUTPUT FILE BLOCK COUNTER CLRL FI.BYT ; ZERO OUTPUT FILE BYTE COUNTER CLRL FI.REC ; ZERO INPUT FILE RECORD (CARD) COUNTER ;----------------------------------------------------------------------; ; RESET OUTPUT BUFFER POINTERS AND I/O EVENT FLAGS ; ;----------------------------------------------------------------------; MOV #RECBF0,R4 ; RESET OUTPUT BUFFER POINTER MOV R4,RECADR ; RESET OUTPUT BUFFER ADDRESS SETF$S #MTFLAG ; RESET OUTPUT EVENT FLAG ;----------------------------------------------------------------------; ; PARSE NEXT INPUT FILE SPECIFICATION ; ;----------------------------------------------------------------------; CSI$2 #CSIBLK,OUTPUT,#CSISWD ; GET NAME OF NEXT INPUT FILE BCC 10$ ; IF NO ERROR THEN OPEN FILE ERROR ; INFORM USER OF PARSE ERROR ;----------------------------------------------------------------------; ; CHECK TO INSURE THAT AN INPUT FILENAME IS PRESENT ; ;----------------------------------------------------------------------; 10$: BITB #CS.NMF,CSIBLK+C.STAT ; IS FILENAME PRESENT? BNE 20$ ; YES, PROCESS IT CALL RPTALL ; NO, PERFORM STATISTICS REPORTING JMP GETCMD ; GET ANOTHER USER COMMAND ;----------------------------------------------------------------------; ; OPEN INPUT FILE FOR READ-ONLY ACCESS ; ;----------------------------------------------------------------------; 20$: OPEN$R #FDBRD,#RDLUN,#CSIBLK+C.DSDS,,#CRDBUF,#CRDMAX BCC OPNTAP ; IF NO ERROR, THEN OPEN OUTPUT FILE ERROR F.ERR(R0),F.ERR+1(R0) ; INFORM USER OF INPUT FILE OPEN ERROR .SBTTL OPEN OUTPUT TAPE FILE (QIO) ;----------------------------------------------------------------------; ; ; ; ; ; OPEN OUTPUT TAPE FILE (QIO) ; ; ; ; ; ;----------------------------------------------------------------------; ; QIO PROCESSING: ASSIGN LUN AND ATTACH DEVICE ; ;----------------------------------------------------------------------; ; ASSIGN LUN FOR MAG TAPE OUTPUT DEVICE ; ;----------------------------------------------------------------------; OPNTAP: DIR$ #ALUN ; ASSIGN LUN BCC 10$ ; BRANCH ON NO ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; ATTACH DEVICE FOR EXCLUSIVE USE ; ;----------------------------------------------------------------------; 10$: QIOW$S #IO.ATT,#MTLUN,#MTFLAG,,#IOSTAT ; ATTACH DEVICE BCC 20$ ; CHECK I/O COMPLETION IF NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL COMPLETION OF DEVICE ATTACH ; ;----------------------------------------------------------------------; 20$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ GETREC ; YES, COPY INPUT FILE TO OUTPUT FILE ERROR IOSTAT ; NO, SIGNAL QIO ERROR TO USER .SBTTL READ AN INPUT RECORD USING FCS INTERFACE ;----------------------------------------------------------------------; ; ; ; ; ; READ AN INPUT RECORD USING FCS INTERFACE ; ; ; ; ; ;----------------------------------------------------------------------; ; NOTE THE FOLLOWING REGISTER CONVENTIONS: ; ; ; ; R2 = NUMBER OF BYTES READ IN INPUT BUFFER ; ; R3 = POINTER INTO THE INPUT BUFFER (CRDBUF) ; ; R4 = POINTER INTO THE OUTPUT BUFFER (RECBUF) ; ; R5 = STORAGE FOR HEXADECIMAL CONVERTED BYTE ; ; R5 = ERROR INDEX + RETURN STATUS PRIOR TO TRAP 4 ABORT ; ;----------------------------------------------------------------------; ; INITIALIZE LOGICAL BUFFER POINTERS AND THEIR UPPER LIMITS ; ;----------------------------------------------------------------------; GETREC: MOV RECLEN,R0 ; GET LOGICAL LENGTH OF OUTPUT RECORD ADD RECADR,R0 ; POINT TO END OF OUTPUT BUFFER + 1 MOV R0,RECEND ; SAVE ENDING ADDRESS OF OUTPUT BUFFER MOV #CRDBUF,R3 ; RESET POINTER TO FIRST OF INPUT BUFFER MOV CRDLEN,R0 ; GET LOGICAL LENGTH OF INPUT BUFFER ADD R3,R0 ; POINT TO END OF INPUT BUFFER + 1 MOV R0,CRDEND ; SAVE ENDING ADDRESS OF INPUT BUFFER ;----------------------------------------------------------------------; ; READ ONE INPUT RECORD FROM INPUT DISK FILE ; ;----------------------------------------------------------------------; GET$ #FDBRD,#CRDBUF,#CRDMAX ; READ A SINGLE RECORD MOV F.NRBD(R0),R2 ; GET NUMBER OF BYTES READ FROM INPUT BCS 20$ ; IF ERROR, THEN CHECK FOR END-OF-FILE BEQ GETREC ; SKIP RECORD AND ASSUME NODATA IF IT HAS ZERO LENGTH ;----------------------------------------------------------------------; ; INCREMENT INPUT RECORD COUNTERS AND CHECK LENGTH OF INPUT ; ;----------------------------------------------------------------------; INCL FT.REC ; INCREMENT INPUT RECORD COUNTER (TOTAL) INCL FI.REC ; INCREMENT INPUT RECORD COUNTER CMP #CRDSIZ,R2 ; IS THIS A FULL INPUT BUFFER? BLE CHKREC ; YES, CHECK INPUT BUFFER CONTENTS ;----------------------------------------------------------------------; ; INPUT BUFFER IS NOT COMPLETE - PAD REMAINDER WITH BLANKS ; ;----------------------------------------------------------------------; MOV R2,R0 ; GET NUMBER OF BYTES IN INPUT BUFFER ADD #CRDBUF,R0 ; POINT TO END OF INPUT DATA IN BUFFER 10$: MOVB #BINPAD,(R0)+ ; PAD A SINGLE BYTE CMP #CRDEOB,R0 ; END OF INPUT BUFFER? BGT 10$ ; NO, PAD ANOTHER BLANK BR CHKREC ; YES, CHECK INPUT BUFFER CONTENTS ;----------------------------------------------------------------------; ; A READ ERROR HAS OCCURRED - CHECK FOR END-OF-FILE ; ;----------------------------------------------------------------------; 20$: CMPB #IE.EOF,F.ERR(R0) ; END-OF-FILE? BEQ 30$ ; YES, PROCESS NEXT FILE ERROR F.ERR(R0),F.ERR+1(R0) ; NO, INFORM USER OF INPUT READ ERROR ;----------------------------------------------------------------------; ; END-OF-FILE FOR FCS PROCESSING: CLOSE INPUT FILE ; ;----------------------------------------------------------------------; 30$: CALL LSTREC ; PERFORM LAST RECORD PROCESSING CALL SHUTDN ; SHUTDOWN I/O PROCESSING JMP NXTFIL ; SELECT NEXT INPUT FILE .SBTTL CHECK INPUT RECORD FOR SPECIAL UNITECH COMMANDS ;----------------------------------------------------------------------; ; ; ; ; ; CHECK INPUT RECORD FOR SPECIAL UNITECH COMMANDS ; ; ; ; ; ;----------------------------------------------------------------------; ; UNITECH COMMANDS ARE PRECEEDED BY EBCDIC ')(' ; ;----------------------------------------------------------------------; CHKREC: CMP #UT.KEY,CRDBUF ; UNITECH COMMAND? BEQ 10$ ; YES, PROCESS COMMAND ;----------------------------------------------------------------------; ; NOT A UNITECH COMMAND - CHECK TO SEE IF FILE WRITING ENABLED ; ;----------------------------------------------------------------------; BIT #WRTFLG,CSIMKW ; FILE WRITING ENABLED? BEQ GETREC ; NO, IGNORE RECORD - FLUSH INPUT BUFFER JMP CPYREC ; YES, COPY CURRENT INPUT BUFFER ;----------------------------------------------------------------------; ; CONVERT THE UNITECH COMMAND TO ASCII ; ;----------------------------------------------------------------------; 10$: MOV R2,R1 ; GET UNITECH COMMAND LENGTH MOV #CRDBUF,R3 ; GET ADDRESS OF INPUT BUFFER 20$: MOVB (R3),R0 ; GET A BYTE FROM UNITECH COMMAND BIC #177400,R0 ; CLEAR UPPER BYTE MOVB ASCII(R0),(R3)+ ; CONVERT BYTE TO ASCII DEC R1 ; DECREMENT BYTE COUNTER BNE 20$ ; IF NONZERO, THEN CONTINUE TRANSFER CLRB (R3) ; CLEAR LAST BYTE TO SIGNAL COMMAND END ;----------------------------------------------------------------------; ; TRUNCATE MESSAGE BY REMOVING TRAILING BLANKS ; ;----------------------------------------------------------------------; 30$: CMP #CRDBUF,R3 ; BEGINNING OF INPUT BUFFER? BEQ 40$ ; YES, OUTPUT A SINGLE CHARACTER CMPB #ASCPAD,-(R3) ; IS THIS CHARACTER A BLANK? BEQ 30$ ; YES, IGNORE IT ;----------------------------------------------------------------------; ; TERMINATE MESSAGE AND COMPUTE NEW BUFFER LENGTH ; ;----------------------------------------------------------------------; 40$: INC R3 ; SKIP PAST USER DATA CLRB (R3) ; INDICATE END-OF-MESSAGE SUB #CRDBUF,R3 ; COMPUTE MESSAGE LENGTH ;----------------------------------------------------------------------; ; PRINT UNITECH COMMAND TO USER ; ;----------------------------------------------------------------------; PRINT #CRDBUF,R3 ; PRINT UNITECH COMMAND TO USER .SBTTL UNITECH COMMAND: OPERATOR MESSAGE ;----------------------------------------------------------------------; ; ; ; ; ; UNITECH COMMAND: OPERATOR MESSAGE ; ; ; ; ; ;----------------------------------------------------------------------; ; OPERATOR MESSAGE: )(M,message text ; ;----------------------------------------------------------------------; ; START OF UNITECH COMMAND INTERPRETER ; ;----------------------------------------------------------------------; CC.MSG: MOV #CRDBUF+2,R3 ; POINT TO COMMAND BYTE CMPB #UT.MSG,(R3) ; OPERATOR MESSAGE? BNE CC.WRT ; NO, CHECK FOR TAPE WRITE JMP GETREC ; IGNORE MESSAGE - READ ANOTHER INPUT RECORD .SBTTL UNITECH COMMAND: PUNCH (WRITE) MAGNETIC TAPE ;----------------------------------------------------------------------; ; ; ; ; ; UNITECH COMMAND: PUNCH (WRITE) MAGNETIC TAPE ; ; ; ; ; ;----------------------------------------------------------------------; ; WRITE MAGNETIC TAPE: )(P,MAG0,A,B,H,RNNNN,WNN ; ; ; ; A - EBCDIC TO ASCII DATA CONVERSION ; ; B - BINARY DATA TRANSFER ; ; H - BINARY TO ASCII HEX TRANSFER ; ; (DEFAULT IS EBCDIC TO ASCII) ; ; ; ; R - OUTPUT BLOCKSIZE (DECIMAL) ; ; W - LOGICAL INPUT SIZE (DECIMAL) ; ; BYTES AFTER "W" ARE IGNORED ; ;----------------------------------------------------------------------; CC.WRT: CMPB #UT.WRT,(R3) ; WRITE MAGNETIC TAPE? BEQ 10$ ; YES, PROMPT USER FOR READY TAPE DRIVE JMP CC.CMD ; NO, CHECK FOR TAPE COMMAND ;----------------------------------------------------------------------; ; PROMPT USER TO MOUNT AND READY OUTPUT DEVICE (MAG TAPE) ; ;----------------------------------------------------------------------; 10$: QIOW$S #IO.RPR,#TILUN,#TIFLAG,,#IOSTAT,,<#MSGBUF,#MSGLEN,,#UT.RDM,#UT.RDL,#44> BCC 20$ ; BRANCH IF NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR TO USER ;----------------------------------------------------------------------; ; CHECK I/O COMPLETION STATUS FOR TERMINAL READ WITH PROMPT ; ;----------------------------------------------------------------------; 20$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 30$ ; YES, PROCESS REMAINDER OF COMMAND LINE ERROR IOSTAT ; NO, SIGNAL QIO ERROR TO USER ;----------------------------------------------------------------------; ; IF ESCAPE KEY WAS HIT, TERMINATE EXECUTION ; ;----------------------------------------------------------------------; 30$: CMP #IS.ESC,IOSTAT ; ESCAPE KEY TERMINATED LINE? BNE 40$ ; NO, CONTINUE PROCESSING PRINT #UT.EXM,#UT.EXL,#60 ; PRINT ABORT MESSAGE CALL SHUTDN ; SHUTDOWN I/O PROCESSING JMP EXIT ; TERMINATE EXECUTION ;----------------------------------------------------------------------; ; INSURE THAT TAPE IS WRITE ENABLED (WRITE RING INSERTED) ; ;----------------------------------------------------------------------; 40$: QIOW$S #IO.SEC,#MTLUN,#MTFLAG,,#IOSTAT BCC 50$ ; BRANCH IF NO ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; CHECK I/O COMPLETION STATUS TO INSURE THAT QIO SUCCESSFUL ; ;----------------------------------------------------------------------; 50$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 60$ ; YES, CONTINUE PROCESSING ERROR IOSTAT ; NO, SIGNAL FATAL QIO ERROR TO USER ;----------------------------------------------------------------------; ; INSURE THAT TAPE IS WRITE ENABLED (WRITE RING INSERTED) ; ;----------------------------------------------------------------------; 60$: BIT #MC.RNG,MTCHAR ; IS UNIT WRITE LOCKED? BEQ 70$ ; NO, CONTINUE PROCESSING UNITECH COMMAND PRINT #UT.WRM,#UT.WRL,#60 ; TELL USER TO INSERT WRITE RING JMP 10$ ; AND REPROMPT FOR READY DEVICE ;----------------------------------------------------------------------; ; SKIP PAST DEVICE NAME SPECIFICATION (SECOND FIELD) ; ;----------------------------------------------------------------------; 70$: CALL CC.SKP ; SKIP TO DEVICE NAME SPECIFICATION BCS 100$ ; IF END OF COMMAND, SIGNAL ERROR CALL CC.SKP ; SKIP TO FIRST SUBCOMMAND BCS 100$ ; IF END OF COMMAND, SIGNAL ERROR ;----------------------------------------------------------------------; ; CLEAR DATA CONVERSION FLAGS ; ;----------------------------------------------------------------------; BIC #BINFLG!HEXFLG,CSIMKW ; DEFAULT IS EBCDIC TO ASCII CONVERSION BR CC.PUN ; PROCESS REMAINDER OF COMMAND LINE ;----------------------------------------------------------------------; ; TAPE WRITE COMMAND SYNTAX ERROR - INFORM USER AND ABORT ; ;----------------------------------------------------------------------; 100$: JMP CC.ERR ; INFORM USER OF SYNTAX ERROR .SBTTL UNITECH COMMAND: TAPE COMMANDS ;----------------------------------------------------------------------; ; ; ; ; ; UNITECH COMMAND: TAPE COMMAND ; ; ; ; ; ;----------------------------------------------------------------------; ; TAPE COMMAND: )(C,MAG0,W (EOF) ; ; )(C,MAG0,W,SXXXXXX (CHECKSUM + EOF) ; ; )(C,MAG0,RNNNN,WNN,A,B,H ; ;----------------------------------------------------------------------; CC.CMD: CMPB #UT.CMD,(R3) ; TAPE COMMAND? BEQ 10$ ; YES, PROCESS TAPE COMMAND JMP CC.END ; NO, CHECK FOR END-OF-WRITE ;----------------------------------------------------------------------; ; SKIP PAST DEVICE NAME SPECIFICATION (SECOND FIELD) ; ;----------------------------------------------------------------------; 10$: CALL CC.SKP ; SKIP TO DEVICE NAME SPECIFICATION BCS 40$ ; IF END OF COMMAND, ERROR CALL CC.SKP ; SKIP TO FIRST SUBCOMMAND BCS 40$ ; IF END OF COMMAND, ERROR ;----------------------------------------------------------------------; ; CHECK FOR END-OF-FILE WRITE COMMAND ; ;----------------------------------------------------------------------; CMPB #UT.EOF,(R3) ; WRITE END-OF-FILE? BNE CC.PUN ; NO, INTERPRET CARD AS ANOTHER PUNCH COMMAND ;----------------------------------------------------------------------; ; NEXT CHARACTER AFTER SUBCOMMAND MUST BE DELIMITER OR BLANK ; ;----------------------------------------------------------------------; CMPB #UT.DLM,1(R3) ; SINGLE CHARACTER SUBCOMMAND? BEQ 20$ ; YES, PROCESS REMAINDER OF COMMAND CMPB #ASCPAD,1(R3) ; LOGICAL END-OF-COMMAND? BEQ 30$ ; YES, SKIP CHECKSUM PROCESSING TSTB 1(R3) ; PHYSICAL END-OF-COMMAND? BEQ 30$ ; YES, SKIP CHECKSUM PROCESSING BR CC.PUN ; INTERPRET CARD AS ANOTHER PUNCH COMMAND ;----------------------------------------------------------------------; ; ; ; PROCESS DATA CHECKSUM VERIFICATION SUBCOMMAND ; ; ; ;----------------------------------------------------------------------; 20$: CALL CC.SKP ; SKIP PAST END-OF-FILE WRITE COMMAND BCS 30$ ; IF END OF COMMAND, WRITE END-OF-FILE CMPB #UT.SUM,(R3) ; PERFORM CHECKSUM VERIFICATION? BNE CC.PUN ; NO, INTERPRET CARD AS ANOTHER PUNCH COMMAND ;----------------------------------------------------------------------; ; CONVERT ASCII OCTAL CHECKSUM TO BINARY ; ;----------------------------------------------------------------------; INC R3 ; POINT TO FIRST BYTE OF ASCII OCTAL DATA MOV R3,R0 ; LOAD ADDRESS OF OCTAL DATA CALL $COTB ; CONVERT ASCII OCTAL TO BINARY CMP R1,FI.SUM ; DO CHECKSUMS MATCH? BEQ 30$ ; YES, WRITE END-OF-FILE TO OUTPUT DEVICE ;----------------------------------------------------------------------; ; FILE CHECKSUM ERROR: INFORM USER AND TERMINATE EXECUTION ; ;----------------------------------------------------------------------; CALL RPTFIL ; REPORT OUTPUT FILE CHECKSUM INFORMATION PRINT #UT.SER,#UT.SEL,#60 ; INFORM USER OF CHECKSUM ERROR CALL SHUTDN ; SHUTDOWN I/O PROCESSING JMP EXIT ; TERMINATE EXECUTION ;----------------------------------------------------------------------; ; WRITE AN END-OF-FILE TO OUTPUT DEVICE ; ;----------------------------------------------------------------------; 30$: CALL LSTREC ; PERFORM LAST RECORD PROCESSING CALL PUTEOF ; WRITE AN END-OF-FILE TO OUTPUT INC FI.EOF ; INCREMENT OUTPUT FILE COUNTER ;----------------------------------------------------------------------; ; ; ; REPORT STATISTICS COUNTERS ; ; ; ;----------------------------------------------------------------------; CALL RPTFIL ; REPORT FILE STATISTICS CLRL FI.SUM ; ZERO OUTPUT FILE CHECKSUM CLRL FI.BLK ; ZERO OUTPUT BLOCK COUNTER CLRL FI.BYT ; ZERO OUTPUT BYTE COUNTER CLRL FI.REC ; ZERO INPUT RECORD COUNTER JMP GETREC ; CONTINUE PROCESSING INPUT RECORDS ;----------------------------------------------------------------------; ; TAPE WRITE SYNTAX ERROR - REPORT TO USER AND ABORT ; ;----------------------------------------------------------------------; 40$: JMP CC.ERR ; SIGNAL SYNTAX ERROR TO USER .SBTTL UNITECH COMMAND: PARSE TAPE COMMANDS ;----------------------------------------------------------------------; ; ; ; ; ; PARSE DATA CONVERSION, OUTPUT BLOCKING, INPUT RECORD LENGTH ; ; ; ; ; ;----------------------------------------------------------------------; ; CHECK FOR EBCDIC TO ASCII DATA CONVERSION ; ;----------------------------------------------------------------------; CC.PUN: CMPB #UT.ASC,(R3) ; EBCDIC TO ASCII DATA CONVERSION? BNE 10$ ; NO, CHECK NEXT SUBCOMMAND BIC #BINFLG,CSIMKW ; RESET BINARY DATA CONVERSION BIC #HEXFLG,CSIMKW ; RESET HEX DATA CONVERSION BR 60$ ; PARSE NEXT SUBCOMMAND ;----------------------------------------------------------------------; ; CHECK FOR BINARY DATA CONVERSION ; ;----------------------------------------------------------------------; 10$: CMPB #UT.BIN,(R3) ; BINARY DATA CONVERSION? BNE 20$ ; NO, CHECK NEXT SUBCOMMAND BIS #BINFLG,CSIMKW ; YES, SPECIFY BINARY DATA CONVERSION BIC #HEXFLG,CSIMKW ; AND CLEAR HEX DATA CONVERSION BR 60$ ; PARSE NEXT SUBCOMMAND ;----------------------------------------------------------------------; ; CHECK FOR HEXADECIMAL DATA CONVERSION ; ;----------------------------------------------------------------------; 20$: CMPB #UT.HEX,(R3) ; HEXADECIMAL DATA CONVERSION? BNE 30$ ; NO, CHECK NEXT SUBCOMMAND BIS #HEXFLG,CSIMKW ; YES, SPECIFY HEXADECIMAL DATA CONVERSION BIC #BINFLG,CSIMKW ; AND CLEAR BINARY DATA CONVERSION BR 60$ ; PARSE NEXT SUBCOMMAND ;----------------------------------------------------------------------; ; CHECK FOR OUTPUT RECORD BLOCK SIZE ; ;----------------------------------------------------------------------; 30$: CMPB #UT.BLK,(R3) ; OUTPUT BLOCK SIZE SUBCOMMAND? BNE 40$ ; NO, CHECK NEXT SUBCOMMAND CALL LSTREC ; PERFORM LAST RECORD PROCESSING (DUMP BUFFER) MOV R3,R0 ; GET ADDRESS OF SUBCOMMAND INC R0 ; POINT TO ASCII RECORD SIZE VALUE CALL $CDTB ; CONVERT ASCII DECIMAL TO BINARY (R1) MOV R1,RECLEN ; LOAD NEW OUTPUT RECORD LENGTH ;----------------------------------------------------------------------; ; ISSUE WARNING IF BLOCK SIZE IS ODD - FORCE IT TO BE EVEN ; ;----------------------------------------------------------------------; BIT #1,RECLEN ; IS OUTPUT BLOCK SIZE ODD? BEQ 50$ ; NO, SKIP WARNING MESSAGE INC RECLEN ; YES, FORCE BLOCKSIZE TO BE EVEN PRINT #UT.BER,#UT.BEL,#60 ; AND ISSUE WARNING MESSAGE BR 50$ ; CHECK FOR DATA CONVERSION ERRORS ;----------------------------------------------------------------------; ; CHECK FOR INPUT LOGICAL RECORD SIZE ; ;----------------------------------------------------------------------; 40$: CMPB #UT.REC,(R3) ; INPUT LOGICAL RECORD SIZE SUBCOMMAND? BNE CC.ERR ; NO, COMMAND SYNTAX ERROR MOV R3,R0 ; GET ADDRESS OF SUBCOMMAND INC R0 ; POINT TO ASCII RECORD SIZE VALUE CALL $CDTB ; CONVERT ASCII DECIMAL TO BINARY (R1) MOV R1,CRDLEN ; LOAD NEW INPUT LOGICAL RECORD SIZE ;----------------------------------------------------------------------; ; CHECK FOR ERRORS IN CONVERSION OF ASCII DECIMAL VALUES ; ;----------------------------------------------------------------------; 50$: CMPB #UT.DLM,R2 ; IS ENDING DELIMITER CORRECT? BEQ 60$ ; YES, PARSE NEXT SUBCOMMAND CMPB #ASCPAD,R2 ; IS THIS END OF COMMAND LINE? BEQ 60$ ; YES, PARSE NEXT SUBCOMMAND TSTB R2 ; END-OF-MESSAGE? BNE CC.ERR ; NO, SIGNAL COMMAND SYNTAX ERROR ;----------------------------------------------------------------------; ; SKIP TO NEXT SUBCOMMAND IN THE COMMAND LINE ; ;----------------------------------------------------------------------; 60$: CALL CC.SKP ; SKIP TO NEXT COMMAND FIELD BCC CC.PUN ; CONTINUE PROCESSING IF NOT END-OF-COMMAND BIS #WRTFLG,CSIMKW ; ENABLE FILE WRITING JMP GETREC ; PROCESS NEXT INPUT RECORD .SBTTL UNITECH COMMAND: TERMINATE (END) TAPE WRITE ;----------------------------------------------------------------------; ; ; ; ; ; UNITECH COMMAND: TERMINATE (END) TAPE WRITE ; ; ; ; ; ;----------------------------------------------------------------------; ; END TAPE WRITE: )(E message text ; ;----------------------------------------------------------------------; CC.END: CMPB #UT.END,(R3) ; TERMINATE (END) TAPE WRITE? BNE CC.XEQ ; NO, CHECK FOR UNITECH CONSOLE COMMAND CALL LSTREC ; PERFORM LAST RECORD PROCESSING CALL PUTEOF ; WRITE AN END-OF-FILE BIC #BINFLG!HEXFLG,CSIMKW ; DISABLE DATA CONVERSION BIC #WRTFLG,CSIMKW ; DISABLE FILE WRITING JMP GETREC ; PROCESS NEXT INPUT RECORD .SBTTL UNITECH COMMAND: EXECUTE UNITECH COMMAND ;----------------------------------------------------------------------; ; ; ; ; ; UNITECH COMMAND: EXECUTE UNITECH COMMAND ; ; ; ; ; ;----------------------------------------------------------------------; ; UNITECH COMMAND: )(X,console command ; ; ; ; )(X,.ARM - ARM DRIVE (IGNORED) ; ; )(X,.DARM - DEARM DRIVE (IGNORED) ; ; )(X,.MAG0,Annn - ADVANCE nnn FILES ; ; )(X,.MAG0,Bnnn - BACKSPACE nnn FILES ; ; )(X,.MAG0,Fnnn - REWIND+FIND FILE nnn ; ; )(X,.MAG0,R - REWIND TAPE ; ; )(X,.MAG0,W - WRITE END-OF-FILE ; ;----------------------------------------------------------------------; CC.XEQ: CMPB #UT.XEQ,(R3) ; CONSOLE COMMAND? BNE CC.ERR ; NO, ISSUE ERROR MESSAGE CALL CC.SKP ; SKIP TO SECOND FIELD IN UNITECH COMMAND BCS CC.XER ; SIGNAL ERROR ON END-OF-COMMAND ;----------------------------------------------------------------------; ; CHECK FOR MAGNETIC TAPE CONSOLE USER COMMANDS ; ;----------------------------------------------------------------------; CMPB #UX.ID0,0(R3) ; MAGNETIC TAPE COMMAND? BNE CC.XER ; NO MATCH, ISSUE ERROR MESSAGE ;----------------------------------------------------------------------; ; IGNORE THE 'ARM' AND 'DEARM' MAG TAPE COMMANDS ; ;----------------------------------------------------------------------; CMPB #UX.ARM,1(R3) ; ARM TAPE DRIVE? BEQ 50$ ; YES, IGNORE THIS COMMAND LINE CMPB #UX.DRM,1(R3) ; DEARM TAPE DRIVE? BEQ 50$ ; YES, IGNORE THIS COMMAND LINE ;----------------------------------------------------------------------; ; PARSE MAGNETIC TAPE UNIT AND SUBSEQUENT TAPE COMMAND ; ;----------------------------------------------------------------------; CMPB #UX.ID1,1(R3) ; CHECK SECOND BYTE BNE CC.XER ; NO MATCH, ISSUE ERROR MESSAGE CMPB #UX.ID2,2(R3) ; CHECK THIRD BYTE BNE CC.XER ; NO MATCH, ISSUE ERROR MESSAGE CMPB #UX.ID3,3(R3) ; CHECK FOURTH BYTE BNE CC.XER ; NO MATCH, ISSUE ERROR MESSAGE ;----------------------------------------------------------------------; ; THE UNITECH CONSOLE USER COMMAND IS DIRECTED TO THE MAG TAPE ; ; DETERMINE WHICH ACTION IS REQUIRED AND DECODE PARAMETER FIELD ; ;----------------------------------------------------------------------; CALL CC.SKP ; SKIP TO NEXT PARAMETER FIELD BCS CC.XER ; SIGNAL ERROR ON END-OF-COMMAND MOV R3,R0 ; GET ADDRESS OF PARAMETER FIELD INC R0 ; POINT TO MAG TAPE ASCII NUMBERIC FIELD CALL $CDTB ; CONVERT ASCII DECIMAL TO BINARY (R1) MOV R1,MTSKIP ; SAVE PARAMETER FIELD (TAPE SKIP VALUE) CLR R0 ; CLEAR R0 TO INDICATE NO REWIND FOR TAPE MOVE ;----------------------------------------------------------------------; ; IF MAG TAPE FUNCTION IS ADVANCE, THEN SPACE FORWARD NNN FILES ; ;----------------------------------------------------------------------; CMPB #UX.ADV,(R3) ; ADVANCE TAPE? BNE 10$ ; NO, CHECK NEXT COMMAND CALL CC.XMP ; ADVANCE MAG TAPE BASED ON PARAMETER VALUE BR 50$ ; CONTINUE PROCESSING INPUT RECORDS ;----------------------------------------------------------------------; ; BACKSPACE FUNCTION - BACKSPACE NNN EOF'S AND THEN ADVANCE 1 EOF; ;----------------------------------------------------------------------; 10$: CMPB #UX.BSP,(R3) ; BACKSPACE TAPE? BNE 20$ ; NO, CHECK NEXT SUBCOMMAND NEG MTSKIP ; NEGATE SKIP COUNT TO SKIP REVERSE CALL CC.XMP ; BACKSPACE MAG TAPE BASED ON PARAMETER VALUE BIT #MC.BOT,MTCHAR ; IS MAG TAPE AT LOAD POINT? BNE 50$ ; YES, DO NOT SKIP FORWARD ANY FILES MOV #1,MTSKIP ; SET FORWARD SKIP COUNT - SKIP ONE TAPE MARK CALL CC.XMP ; SKIP FORWARD MAG TAPE ONE END-OF-FILE BR 50$ ; CONTINUE PROCESSING INPUT RECORDS ;----------------------------------------------------------------------; ; FILE SEARCH FUNCTION - REWIND TAPE AND POSITION TO FILE NNN ; ;----------------------------------------------------------------------; 20$: CMPB #UX.FIL,(R3) ; FILE SEARCH AND POSITION? BNE 30$ ; NO, CHECK NEXT SUBCOMMAND COM R0 ; SET REWIND FLAG FOR TAPE POSITION CALL DEC MTSKIP ; DECREMENT FILE COUNTER CALL CC.XMP ; REWIND MAG TAPE AND FIND FILE NNN BR 50$ ; CONTINUE PROCESSING INPUT RECORDS ;----------------------------------------------------------------------; ; REWIND FUNCTION - REWIND TAPE AND DO NOT SKIP ANY FILES ; ;----------------------------------------------------------------------; 30$: CMPB #UX.RWD,(R3) ; REWIND TAPE? BNE 40$ ; NO, CHECK NEXT SUBCOMMAND COM R0 ; SET REWIND FLAG FOR TAPE POSITION CALL CLR MTSKIP ; CLEAR FILE SKIP COUNTER CALL CC.XMP ; REWIND MAG TAPE AND SKIP 0 FILES BR 50$ ; CONTINUE PROCESSING INPUT RECORDS ;----------------------------------------------------------------------; ; WRITE END-OF-FILE FUNCTION - WRITE A SINGLE END-OF-FILE TO TAPE; ;----------------------------------------------------------------------; 40$: CMPB #UX.EOF,(R3) ; WRITE TAPE END-OF-FILE? BNE CC.XER ; SIGNAL SUBCOMMAND SYNTAX ERROR CALL PUTEOF ; WRITE AN EOF TO THE TAPE DRIVE ;----------------------------------------------------------------------; ; NOW THAT TAPE IS CORRECTLY POSITIONED, CONTINUE PROCESSING ; ;----------------------------------------------------------------------; 50$: JMP GETREC ; CONTINUE PROCESSING INPUT RECORDS .SBTTL UNITECH COMMAND ERRORS ;----------------------------------------------------------------------; ; ; ; ; ; UNITECH COMMAND ERRORS ; ; ; ; ; ;----------------------------------------------------------------------; ; UNITECH COMMAND SYNTAX ERROR OR UNRECOGNIZED COMMAND ; ;----------------------------------------------------------------------; CC.ERR: PRINT #UT.ERR,#UT.ERL,#60 ; INFORM USER OF SYNTAX ERROR CALL SHUTDN ; SHUTDOWN PROCESSING JMP EXIT ; TERMINATE EXECUTION ;----------------------------------------------------------------------; ; UNITECH MAG TAPE SYNTAX ERROR OR INVALID PARAMETER ; ;----------------------------------------------------------------------; CC.XER: PRINT #UX.ERR,#UX.ERL,#60 ; INFORM USER OF SYNTAX ERROR CALL SHUTDN ; SHUTDOWN PROCESSING JMP EXIT ; TERMINATE EXECUTION .SBTTL TAPE POSITONING SUBROUTINE ;----------------------------------------------------------------------; ; ; ; ; ; TAPE POSITIONING SUBROUTINE ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS SUBROUTINE POSITIONS THE MAG TAPE FORWARD OR BACKWARD A ; ; SPECIFIED NUMBER OF FILES, AS DETERMINED BY THE PASSED VALUE ; ; IN LOCATION MTSKIP. A POSITIVE VALUE SKIPS FILES FORWARD, A ; ; NEGATIVE VALUE SKIPS FILES IN THE REVERSE DIRECTION. ; ;----------------------------------------------------------------------; ; ; ; INSURE THAT THE TAPE IS LOADED AND READY PRIOR TO POSITONING ; ; ; ;----------------------------------------------------------------------; CC.XMP: QIOW$S #IO.SEC,#MTLUN,#MTFLAG,,#IOSTAT ; SENSE TAPE CHARACTERISTICS BCC 10$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR TO USER ;----------------------------------------------------------------------; ; INSURE THAT THE I/O COMPLETION STATUS WAS NORMAL FOR QIO SENSE ; ;----------------------------------------------------------------------; 10$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 20$ ; YES, CONTINUE PROCESSING ERROR IOSTAT ; NO, INFORM USER OF FATAL QIO SENSE ERROR ;----------------------------------------------------------------------; ; IF THE DRIVE IS NOT READY (SELECT ERROR) ISSUE MESSAGE + WAIT ; ;----------------------------------------------------------------------; 20$: BIT #MC.SER,MTCHAR ; TAPE SELECT ERROR? BEQ 30$ ; NO, CONTINUE TAPE POSITIONING PROCESSING PRINT #UX.SER,#UX.SEL,#60 ; INFORM USER OF TAPE CONDITION MRKT$S #MTFLAG,#10,#2 ; QUEUE DELAY BEFORE CHECKING STATUS AGAIN BCS 30$ ; IGNORE DELAY IF MARK TIME UNSUCCESSFUL WTSE$S #MTFLAG ; WAIT FOR MARK TIME WAKEUP BCC CC.XMP ; CHECK TAPE STATUS AGAIN IF MARK TIME WORKED ;----------------------------------------------------------------------; ; ; ; CHECK TO SEE IF A REWIND IS REQUIRED PRIOR TO FILE SEARCH ; ; ; ;----------------------------------------------------------------------; 30$: TST R0 ; IS REWIND FLAG SET? BEQ 50$ ; NO, SKIP REWIND CODE AND POSITION TAPE QIOW$S #IO.RWD,#MTLUN,#MTFLAG,,#IOSTAT BCC 40$ ; BRANCH IF NO ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; INSURE THAT REWIND I/O STATUS SHOWS SUCCESSFUL COMPLETION ; ;----------------------------------------------------------------------; 40$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 50$ ; YES, CONTINUE WITH TAPE POSITONING COMMAND ERROR IOSTAT ; NO, INFORM USER OF FATAL TAPE REWIND ERROR ;----------------------------------------------------------------------; ; ; ; ISSUE THE SPACE TAPE FILE COMMAND BASED ON USER VALUE FOR SKIP ; ; ; ;----------------------------------------------------------------------; 50$: QIOW$S #IO.SPF,#MTLUN,#MTFLAG,,#IOSTAT,, BCC 60$ ; BRANCH IF NO ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL COMPLETION OF THE TAPE POSITION COMMAND ; ;----------------------------------------------------------------------; 60$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 70$ ; YES, CONTINUE PROCESSING ERROR IOSTAT ; NO, INFORM USER OF FATAL POSITIONING STATUS ;----------------------------------------------------------------------; ; ; ; SENSE TAPE CHARACTERISTICS BEFORE RETURNING TO USER ; ; ; ;----------------------------------------------------------------------; 70$: QIOW$S #IO.SEC,#MTLUN,#MTFLAG,,#IOSTAT BCC 80$ ; BRANCH ON NO ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; INSURE THAT I/O COMPLETION STATUS WAS NORMAL FOR QIO SENSE ; ;----------------------------------------------------------------------; 80$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 90$ ; YES, RETURN TO CALLER ERROR IOSTAT ; NO, INFORM USER OF FATAL QIO SENSE MODE ERROR 90$: RETURN ; RETURN TO CALLER .SBTTL UNITECH SKIP COMMAND FIELD ;----------------------------------------------------------------------; ; ; ; ; ; UNITECH SKIP COMMAND FIELD ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS SUBROUTINE SKIPS TO THE NEXT UNITECH COMMAND FIELD. ; ; CARRY BIT IS SET ON END-OF-COMMAND AND CLEARED OTHERWISE. ; ;----------------------------------------------------------------------; CC.SKP: TSTB (R3) ; END OF COMMAND BUFFER? SEC ; SET ERROR FLAG BEQ 10$ ; YES, RETURN TO CALLER CMPB #UT.DLM,(R3)+ ; START OF NEXT FIELD? BNE CC.SKP ; NO, CHECK NEXT CHARACTER ;----------------------------------------------------------------------; ; CLEAR CARRY IF DELIMITER IS FOUND AND RETURN TO CALLER ; ;----------------------------------------------------------------------; CLC ; RESET ERROR FLAG 10$: RETURN ; RETURN TO CALLER .SBTTL COPY INPUT RECORD TO OUTPUT BUFFER ;----------------------------------------------------------------------; ; ; ; ; ; COPY INPUT RECORD TO OUTPUT BUFFER ; ; ; ; ; ;----------------------------------------------------------------------; ; CHECK FOR END OF INPUT RECORD - GET ANOTHER RECORD IF EOB ; ;----------------------------------------------------------------------; CPYREC: CMP CRDEND,R3 ; END OF INPUT BUFFER? BNE 10$ ; NO, COPY 1 BYTE FROM INPUT TO OUTPUT JMP GETREC ; YES, GET ANOTHER INPUT BUFFER ;----------------------------------------------------------------------; ; CHECK FOR DATA CONVERSION SWITCHES BEFORE TRANSFERRING BYTE ; ;----------------------------------------------------------------------; ; TRANSFORM DATA TO HEXADECIMAL FORMAT IF HEX SWITCH SPECIFIED ; ;----------------------------------------------------------------------; 10$: BIT #HEXFLG,CSIMKW ; HEX CONVERSION SPECIFIED? BEQ 50$ ; NO, CHECK FOR BINARY CONVERSION ;----------------------------------------------------------------------; ; CONVERT EBCDIC BYTE TO NIBBLE OF OUTPUT BYTE ; ;----------------------------------------------------------------------; CLR R0 ; CLEAR BINARY NIBBLE RESULT CMPB #BINPAD,(R3) ; IS INPUT BYTE BLANK? BEQ 30$ ; YES, ASSUME USER MEANT ZERO ;----------------------------------------------------------------------; ; SEARCH HEXADECIMAL CONVERSION TABLE AND CONVERT EBCDIC > BINARY; ;----------------------------------------------------------------------; MOV #HEXLEN,R0 ; INITIALIZE HEX TABLE SEARCH POINTER 20$: CMPB HEX(R0),(R3) ; IS THIS HEX DIGIT IN THE CONVERSION TABLE? BEQ 30$ ; YES, CONVERT THIS NIBBLE VALUE DEC R0 ; DECREMENT HEX TABLE SEARCH POINTER BGE 20$ ; AND CONTINUE PROCESSING IF POINTER >= 0 ;----------------------------------------------------------------------; ; A HEXADECIMAL CONVERSION ERROR HAS OCCURRED - NOTIFY USER ; ;----------------------------------------------------------------------; PRINT #UT.HCM,#UT.HCL,#60 ; INFORM USER OF CONVERSION ERROR CALL SHUTDN ; SHUTDOWN I/O PROCESSING JMP EXIT ; AND TERMINATE TASK EXECUTION ;----------------------------------------------------------------------; ; PROCESS CASES FOR WHICH WE LOAD UPPER NIBBLE OF BYTE VALUE ; ;----------------------------------------------------------------------; 30$: INC R3 ; ADJUST INPUT BYTE POINTER BIT #NBLFLG,CSIMKW ; DO WE LOAD LOWER NIBBLE? BNE 40$ ; YES, LOAD NIBBLE AND OUTPUT RESULT BIS #NBLFLG,CSIMKW ; SET LOWER NIBBLE FLAG FOR NEXT INPUT BYTE MOV R0,R5 ; LOAD NIBBLE VALUE ASL R5 ; MOVE TO HIGH NIBBLE ASL R5 ; ASL R5 ; ASL R5 ; BR CPYREC ; GET ANOTHER INPUT BYTE ;----------------------------------------------------------------------; ; PROCESS CASES FOR WHICH WE LOAD LOWER NIBBLE AND OUTPUT RESULT ; ;----------------------------------------------------------------------; 40$: BIC #NBLFLG,CSIMKW ; RESET LOWER NIBBLE FLAG FOR NEXT INPUT BYTE BIS R5,R0 ; SET UPPER NIBBLE IN OUTPUT BYTE BR 70$ ; STORE RESULT IN OUTPUT BUFFER ;----------------------------------------------------------------------; ; CHECK FOR BINARY DATA CONVERSION - DO NO CONVERSION IF SO ; ;----------------------------------------------------------------------; 50$: MOVB (R3)+,R0 ; GET 1 BYTE FROM INPUT BUFFER BIC #177400,R0 ; CLEAR UPPER BYTE BIT #BINFLG,CSIMKW ; BINARY DATA TRANSFER? BEQ 60$ ; NO, CONVERT EBCDIC TO ASCII ;----------------------------------------------------------------------; ; CONVERT SPECIAL MANN CHARACTERS IF MANN TAPE PROCESSING ENABLED; ;----------------------------------------------------------------------; BIT #MANFLG,CSIMKW ; MANN PROCESSING ENABLED? BEQ 70$ ; NO, BYPASS CHARACTER CONVERSION CMPB #MAN.BS,R0 ; IS THIS A SPECIAL MANN CHARACTER? BNE 70$ ; NO, DO NOT CONVERT CHARACTER MOV #MAN.NL,R0 ; YES, CONVERT MANN CHARACTER BR 70$ ; AND STORE RESULT ;----------------------------------------------------------------------; ; NO SWITCHES SPECIFIED - DEFAULT IS EBCDIC TO ASCII CONVERSION ; ;----------------------------------------------------------------------; 60$: MOVB ASCII(R0),R0 ; CONVERT EBCDIC TO ASCII 70$: MOVB R0,(R4)+ ; STORE RESULT ;----------------------------------------------------------------------; ; ADJUST FILE TOTAL AND INDIVIDUAL OUTPUT FILE CHECKSUMS ; ;----------------------------------------------------------------------; BIC #177400,R0 ; CLEAR UPPER BYTE ADD R0,FT.SUM ; ADJUST FILE TOTALS CHECKSUM ADD R0,FI.SUM ; ADJUST OUTPUT FILE CHECKSUM ;----------------------------------------------------------------------; ; CHECK TO SEE IF LOGICAL END OF OUTPUT BUFFER HAS BEEN REACHED ; ;----------------------------------------------------------------------; CMP RECEND,R4 ; END OF OUTPUT BUFFER? BNE CPYREC ; NO, COPY ANOTHER BYTE FROM INPUT TO OUTPUT .SBTTL WRITE A TAPE RECORD USING QIO INTERFACE ;----------------------------------------------------------------------; ; ; ; ; ; WRITE A TAPE RECORD USING QIO INTERFACE ; ; ; ; ; ;----------------------------------------------------------------------; ; INCREMENT THE OUTPUT BLOCK AND BYTE COUNTERS ; ;----------------------------------------------------------------------; PUTREC: WTSE$S #MTFLAG ; WAIT FOR LAST I/O OPERATION TO COMPLETE INCL FT.BLK ; INCREMENT OUTPUT BLOCK COUNTER (TOTAL) INCL FI.BLK ; INCREMENT OUTPUT BLOCK COUNTER (FILE) ADDL RECLEN,FT.BYT ; ADJUST OUTPUT BYTE COUNTER (TOTAL) ADDL RECLEN,FI.BYT ; ADJUST OUTPUT BYTE COUNTER (FILE) ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL COMPLETION OF LAST BUFFER WRITE ; ;----------------------------------------------------------------------; CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 10$ ; YES, CONTINUE COPY OF INPUT RECORD ERROR IOSTAT ; NO, INFORM USER OF FATAL WRITE ERROR ;----------------------------------------------------------------------; ; WRITE A RECORD AND CHECK FOR SUCCESSFUL DIRECTIVE COMPLETION ; ;----------------------------------------------------------------------; 10$: QIO$S #IO.WLB,#MTLUN,#MTFLAG,,#IOSTAT,, BCC 20$ ; BRANCH IF NO ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; RESET OUTPUT BUFFER POINTER AND CONTINUE INPUT PROCESSING ; ;----------------------------------------------------------------------; 20$: MOV #RECBF0,R4 ; RESET OUTPUT BUFFER ADDRESS CMP R4,RECADR ; IS THIS THE CURRENT OUTPUT BUFFER? BNE 30$ ; NO, BUFFER POINTER SWITCH COMPLETE MOV #RECBF1,R4 ; YES, USE ALTERNATE OUTPUT BUFFER 30$: MOV R4,RECADR ; SAVE OUTPUT BUFFER ADDRESS JMP CPYREC ; CONTINUE COPY OF INPUT RECORD .SBTTL WRITE AN EOF TO THE TAPE DRIVE ;----------------------------------------------------------------------; ; ; ; ; ; WRITE AN EOF TO THE TAPE DRIVE ; ; ; ; ; ;----------------------------------------------------------------------; ; WAIT ON PREVIOUS I/O OPERATION TO COMPLETE AND CHECK STATUS ; ;----------------------------------------------------------------------; PUTEOF: WTSE$S #MTFLAG ; WAIT FOR LAST I/O OPERATION TO COMPLETE CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 10$ ; YES, WRITE EOF TO TAPE ERROR IOSTAT ; NO, SIGNAL QIO ERROR TO USER ;----------------------------------------------------------------------; ; ISSUE EOF DIRECTIVE AND CHECK FOR DIRECTIVE COMPLETION ; ;----------------------------------------------------------------------; 10$: QIOW$S #IO.EOF,#MTLUN,#MTFLAG,,#IOSTAT BCC 20$ ; BRANCH IF NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL COMPLETION OF THE EOF WRITE ; ;----------------------------------------------------------------------; 20$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 30$ ; YES, RETURN TO MAINLINE CODE ERROR IOSTAT ; NO, SIGNAL QIO ERROR TO USER 30$: RETURN ; RETURN TO MAINLINE CODE .SBTTL LAST RECORD (SHORT RECORD) PROCESSING ;----------------------------------------------------------------------; ; ; ; ; ; LAST RECORD (SHORT RECORD) PROCESSING ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS SUBROUTINE PROCESSES THE LAST RECORD OR SHORT RECORDS ; ; FROM THE INPUT STREAM. ; ;----------------------------------------------------------------------; ; WAIT FOR LAST I/O OPERATION TO COMPLETE AND CHECK STATUS ; ;----------------------------------------------------------------------; LSTREC: WTSE$S #MTFLAG ; WAIT FOR LAST I/O OPERATION TO COMPLETE CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 10$ ; YES, CONTINUE LAST RECORD PROCESSING ERROR IOSTAT ; NO, SIGNAL QIO ERROR TO USER ;----------------------------------------------------------------------; ; CHECK TO INSURE THAT NUMBER OF HEX DIGITS READ IS EVEN ; ;----------------------------------------------------------------------; 10$: BIT #NBLFLG,CSIMKW ; ANY HEX PROCESSING TO DO? BEQ 20$ ; NO, THIS IS THE NORMAL CONDITION BIC #NBLFLG,CSIMKW ; RESET NIBBLE POINTER (UPPER NIBBLE) BIC #177400,R5 ; CLEAR UPPER BYTE MOVB R5,(R4)+ ; LOAD LAST BYTE INTO OUTPUT BUFFER ADD R5,FT.SUM ; ADJUST FILE TOTAL CHECKSUM ADD R5,FI.SUM ; ADJUST INDIVIDUAL FILE CHECKSUM PRINT #UT.HXE,#UT.HXL,#60 ; WARN USER OF POSSIBLE DATA ERROR ;----------------------------------------------------------------------; ; DO NOT WRITE A RECORD IF THE OUTPUT BUFFER IS EMPTY ; ;----------------------------------------------------------------------; 20$: CMP RECADR,R4 ; IS OUTPUT POINTER AT BEGINNING OF RECORD? BEQ 60$ ; YES, DO NO PROCESSING ;----------------------------------------------------------------------; ; INCREMENT RECORD COUNTERS AND ADJUST BYTE COUNTERS ; ;----------------------------------------------------------------------; MOV R4,R0 ; GET CURRENT POINTER INTO OUTPUT BUFFER SUB RECADR,R0 ; REMOVE OFFSET FROM OUTPUT TO GET BYTE COUNT INCL FT.BLK ; INCREMENT OUTPUT RECORD COUNTER (TOTAL) INCL FI.BLK ; INCREMENT OUTPUT RECORD COUNTER (FILE) ADDL R0,FT.BYT ; INCREMENT BYTE COUNTER (TOTAL) ADDL R0,FI.BYT ; INCREMENT BYTE COUNTER (FILE) ;----------------------------------------------------------------------; ; PAD REMAINDER OF THE OUTPUT BUFFER WITH ZERO BYTES ; ;----------------------------------------------------------------------; 30$: CMP RECEND,R4 ; END OF OUTPUT BUFFER? BLE 40$ ; YES, OUTPUT BUFFER TO TAPE DRIVE CLRB (R4)+ ; NO, ZERO NEXT BYTE IN OUTPUT BUFFER BR 30$ ; AND CHECK FOR END-OF-BUFFER ;----------------------------------------------------------------------; ; WRITE PADDED TAPE RECORD TO OUTPUT DEVICE ; ;----------------------------------------------------------------------; 40$: QIOW$S #IO.WLB,#MTLUN,#MTFLAG,,#IOSTAT,, BCC 50$ ; BRANCH IF NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL COMPLETION OF WRITE ; ;----------------------------------------------------------------------; 50$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 60$ ; YES, RETURN TO MAINLINE CODE ERROR IOSTAT ; NO, INFORM USER OF FATAL WRITE ERROR ;----------------------------------------------------------------------; ; RESET OUTPUT BUFFER POINTER AND RETURN TO CALLER ; ;----------------------------------------------------------------------; 60$: MOV #RECBF0,R4 ; RESET OUTPUT BUFFER POINTER MOV R4,RECADR ; RESET OUTPUT BUFFER ADDRESS RETURN ; RETURN TO MAINLINE CODE .SBTTL REPORT ON INPUT FILE TRANSFER AFTER EOF ;----------------------------------------------------------------------; ; ; ; ; ; REPORT ON INPUT FILE TRANSFER AFTER EOF ; ; ; ; ; ;----------------------------------------------------------------------; ; SET FILE, BLOCK, BYTE, AND INPUT RECORD COUNTER ASCII FIELDS ; ;----------------------------------------------------------------------; RPTFIL: CBDMG #MI.NUM,FT.NUM,#0 ; SET FILE NUMBER CBDMG #MI.EOF,FI.EOF,#0 ; SET OUTPUT FILE NUMBER CDDMG #MI.REC,#FI.REC,#0 ; SET RECORD COUNTER CDDMG #MI.BLK,#FI.BLK,#0 ; SET BLOCK COUNTER CDDMG #MI.BYT,#FI.BYT,#0 ; SET BYTE COUNTER CBOMG #MI.SUM,FI.SUM,#1 ; SET OUTPUT FILE CHECKSUM ;----------------------------------------------------------------------; ; TRANSFER STATISTICS MESSAGE TO USER TERMINAL ; ;----------------------------------------------------------------------; PRINT #MI.MSG,#MI.LEN ; PRINT MESSAGE RETURN ; RETURN TO MAINLINE PROGRAM .SBTTL REPORT ON OUTPUT FILE TRANSFER TOTALS ;----------------------------------------------------------------------; ; ; ; ; ; REPORT ON OUTPUT FILE TRANSFER TOTALS ; ; ; ; ; ;----------------------------------------------------------------------; ; DO NO FILE TOTALS REPORTING IF ONLY 1 FILE SELECTED ; ;----------------------------------------------------------------------; RPTALL: CMP #1,FI.EOF ; ONLY 1 OUTPUT FILE WRITTEN? BEQ 10$ ; YES, DO NOT REPORT FILE TOTALS ;----------------------------------------------------------------------; ; SET BLOCK, BYTE, AND INPUT RECORD COUNTER ASCII FIELDS ; ;----------------------------------------------------------------------; CDDMG #MT.BLK,#FT.BLK,#0 ; SET BLOCK COUNTER TOTALS CDDMG #MT.BYT,#FT.BYT,#0 ; SET BYTE COUNTER TOTALS CDDMG #MT.REC,#FT.REC,#0 ; SET RECORD COUNTER TOTALS CBOMG #MT.SUM,FT.SUM,#1 ; SET FILE TOTAL CHECKSUM ;----------------------------------------------------------------------; ; TRANSFER STATISTICS MESSAGE TO USER TERMINAL ; ;----------------------------------------------------------------------; PRINT #MT.MSG,#MT.LEN,#60 ; PRINT MESSAGE (DOUBLE SPACE) 10$: RETURN ; RETURN TO MAINLINE PROGRAM .SBTTL PRINT MESSAGE TO USER TERMINAL ;----------------------------------------------------------------------; ; ; ; ; ; PRINT MESSAGE TO USER TERMINAL ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS SUBROUTINE PRINTS A MESSAGE TO THE USER TERMINAL ; ;----------------------------------------------------------------------; ; REGISTER USEAGE: MS.PTR - ADDRESS OF USER MESSAGE ; ; MS.LEN - LENGTH OF USER MESSAGE ; ; MS.SPC - PRINT CARRIAGE CONTROL ; ;----------------------------------------------------------------------; ; QUEUE MESSAGE TO OPERATOR ; ;----------------------------------------------------------------------; $MSG:: QIOW$S #IO.WVB,#TILUN,#TIFLAG,,#IOSTAT,, BCC 10$ ; CHECK FOR ERRORS ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL I/O COMPLETION ; ;----------------------------------------------------------------------; 10$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 20$ ; YES, OUTPUT TO SYSTEM CONSOLE ERROR IOSTAT ; NO, SIGNAL QIO ERROR TO USER ;----------------------------------------------------------------------; ; QUEUE MESSAGE TO SYSTEM CONSOLE IF LOGGING SWITCH ENABLED ; ;----------------------------------------------------------------------; 20$: BIT #LOGFLG,CSIMKW ; LOG TO SYSTEM CONSOLE? BEQ 30$ ; NO, SKIP CONSOLE LOGGING QIOW$S #IO.WBT,#TTLUN,#TTFLAG,,#IOSTAT,, BCC 30$ ; CHECK FOR ERRORS ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; RETURN TO USER - BREAK THROUGH WRITE DO NOT CHECK STATUS CODE ; ;----------------------------------------------------------------------; 30$: RETURN ; RETURN TO MAINLINE CODE .SBTTL SHUTDOWN I/O PROCESSING ;----------------------------------------------------------------------; ; ; ; ; ; SHUTDOWN I/O PROCESSING ; ; ; ; ; ;----------------------------------------------------------------------; ; CLOSE INPUT FILE AND DETACH OUTPUT DEVICE ; ;----------------------------------------------------------------------; SHUTDN: CLOSE$ #FDBRD ; CLOSE INPUT FILE BCC 10$ ; BRANCH IF FILE CLOSE SUCCESSFUL ERROR F.ERR(R0),F.ERR+1(R0) ; INFORM USER OF FILE CLOSE ERROR ;----------------------------------------------------------------------; ; REWIND MAG TAPE AND UNLOAD IF USER HAS REQUESTED REWIND ; ;----------------------------------------------------------------------; 10$: BIT #REWFLG,CSIMKW ; HAS USER REQUESTED TAPE REWIND? BEQ 20$ ; NO, SKIP TAPE REWIND OPERATION QIO$S #IO.RWU,#MTLUN,#MTFLAG,,#IOSTAT ; REWIND TAPE - DO NOT WAIT BCC 20$ ; BRANCH IF NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR TO USER ;----------------------------------------------------------------------; ; DETACH OUTPUT DEVICE ; ;----------------------------------------------------------------------; 20$: QIOW$S #IO.DET,#MTLUN,#MTFLAG,,#IOSTAT BCC 30$ ; BRANCH IF NO ERROR IN DIRECTIVE ERROR $DSW ; SIGNAL DIRECTIVE ERROR TO USER ;----------------------------------------------------------------------; ; INSURE DEVICE IS DETACHED BY CHECKING I/O COMPLETION STATUS ; ;----------------------------------------------------------------------; 30$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 40$ ; YES, RETURN TO CALLER ERROR IOSTAT ; NO, INFORM USER OF QIO DETACH ERROR ;----------------------------------------------------------------------; ; PERFORM FILE TOTAL STATISTICS REPORTING AND RETURN TO CALLER ; ;----------------------------------------------------------------------; 40$: RETURN ; RETURN TO MAINLINE PROGRAM .SBTTL TASK TERMINATION ;----------------------------------------------------------------------; ; ; ; TASK TERMINATION ; ; ; ;----------------------------------------------------------------------; EXIT: EXIT$S ; EXIT TASK .END START ; END OF MAIN PROGRAM