// BINARY I/O ROUTINES FOR FORT II / / CALL BFLAG(IFLAG) /DEFINE ERROR FLAG WORD. / / CALL BDEV(DEV) /LOAD DEVICE HANDLER. / / CALL RBIN(0,ARRAY) /OPEN EXISTING FILE FOR READ. / / CALL RBIN(LEN,ARRAY) /READ DATA FROM FILE. / / CALL WBIN(0,ARRAY) /OPEN TENTATIVE FILE FOR WRITE. / / S CMA /AC=-1 /AC=1 ALLOWS REWRITING A FILE. / CALL WBIN(0,ARRAY) /OPEN EXISTING FILE FOR WRITE. / / CALL WBIN(LEN,ARRAY) /WRITE DATA TO FILE. / / CALL BCLOS /FLUSH BUFFER AND CLOSE FILE. / / S CMA /AC=-1 /(ALLOWS PARTIAL BLOCK RE-WRITE) / CALL BCLOS /FLUSH BUFFER AND CLOSE FILE. / /---------------- / / BFLAG - DESIGNATES WORD TO BE SET WHEN ERRORS OCCUR / IN BINARY I/O ROUTINES. IF 'BFLAG' IS NOT / CALLED, AND AN ERROR OCCURS, THE PROGRAM IS / ABORTED. POSSIBLE ERRORS ARE LISTED BELOW. / 'BFLAG' NEEDS ONLY TO BE CALLED ONCE TO REMAIN / IN EFFECT FOR THE ENTIRE RUN!!! / / BDEV - LOADS DEVICE HANDLER FOR BINARY I/O. ONLY / 1 PAGE DEVICE HANDLERS ARE ACCEPTED. NON- / FILE-STRUCTURED HANDLERS PRODUCE 'WFUL' AND / 'BEOF' ERRORS WHEN USED. IF 'BDEV' FAILS, / AND A HANDLER ISN'T LOADED, ANY CALL TO / RBIN, WBIN, OR BCLOS WILL BE FATAL! THE / DEVICE IS INITIALLY SET TO SYS:. THE / BDEV ROUTINE NEED ONLY BE CALLED WHEN A / DIFFERENT DEVICE OTHER THAN THE ONE CURRENTLY / IN USE IS DESIRED. THIS DEVICE IS USED FOR / BOTH RBIN AND WBIN OPERATIONS. WHEN BDEV IS / CALLED, RBIN AND WBIN ARE SET TO LOOK EMPTY. / / RBIN - READ BINARY DATA FROM A FILE. / / WBIN - WRITE BINARY DATA TO A FILE. / / BCLOS - IF A PARTIAL BUFFER IS TO BE WRITTEN, IT IS / PADDED WITH THE CORRESPONDING WORDS FROM THE / CURRENT 'RBIN' BUFFER, USING THE INPUT CONTENTS / OF THE ACCUMULATOR AS A MASK. IF THE AC WAS / ZERO, THE BUFFER IS ZERO FILLED. / IF THE FILE IS A TENTATIVE OUTPUT FILE, / IT WILL NOW BECOME PERMANENT IN THE DIRECTORY. / /---------------- / / PARA (TYPE) DESCRIPTION / ---- ------ ----------- / IFLAG (INT) THIS VARIABLE WILL BECOME NON-ZERO WHEN AN / ERROR OCCURS. / DEV (????) 2 WORD VECTOR CONTAINING 4-CHAR DEVICE NAME, / ZERO FILLED, WITHOUT THE COLON. / LEN (INT) SPECIFIES LENGTH OF INFORMATION VECTOR 'ARRAY'. / IF LEN IS ZERO, THEN 'ARRAY' CONTAINS THE NAME / OF THE FILE THAT IS TO BE OPENED FOR THAT I/O / OPERATION. / ARRAY (????) 'ARRAY' CAN BE EITHER REAL OR INTEGER, JUST BE / SURE THAT 'LEN' IS THE CORRECT NUMBER OF WORDS / IN 'ARRAY'. / IF 'LEN' IS ZERO, 'ARRAY' IS THE PACKED 6-BIT / 8 CHARACTER NAME OF THE FILE TO BE OPENED FOR / THE I/O OPERATION BEING CALLED. **ONLY THE / FIRST 8 CHARS ARE USED** 1-6 FOR THE NAME, / AND THE LAST TWO FOR THE EXTENSION. THERE / SHOULD NOT BE A PERIOD SEPARATING THE EXTEN- / SION FROM THE FILE NAME!!! / /---------------- / / ERRORS THAT CAN OCCUR ARE OF TWO TYPES: / / 1. ERRORS RESULTING FROM DEVICE MALFUNCTIONS (I/0 ERROR / ON DEVICE) / 2. USER ERRORS. / / (SEE BFLAG DECRIPTION FOR NON-FATAL MESSAGE HANDLING) / / CODE TYPE MEANING / ---- ---- ------- / 'RDER' (1) I/O ERROR DURING READ ON DEVICE. / 'WRER' (1) I/O ERROR DURING WRITE ON DEVICE. / 'BDEV' (2) REQUESTED DEVICE NOT AVAILABLE. / 'FLD0' FATAL BDEV WASN'T LOADED INTO FIELD 0. / 'DEV?' FATAL NO HANDLER FOR RBIN, WBIN, OR BCLOS. / 'ROPN' (2) FILE NOT FOUND OR WRITE ONLY DEVICE. / 'WOPN' (2) BAD FILE NAME, OR READ-ONLY DEVICE. / 'BEOF' (2) BINARY END-OF-FILE OCCURED DURING LAST / TRANSFER IN RBIN CALL. / 'WFUL' (2) NO ROOM LEFT IN BINARY OUTPUT FILE, OR / NO TENTATIVE BINARY OUTPUT FILE HAD / BEEN OPENED. / 'BCLO' (2) 'BCLOS' WAS CALLED WHEN AN OUTPUT / FILE HAD NOT BEEN PREVIOUSLY OPENED. / / / IF 'BFLAG' HAS BEEN CALLED, MOST ERRORS ARE NOT FATAL. / INSTEAD, 'IFLAG' IS SET TO A NON-ZERO VALUE. 'IFLAG' MUST BE / SET BACK TO ZERO BY THE USER IF HE EXPECTS TO PROPERLY PRO- / CESS FUTURE ERRORS, BECAUSE A SUCCESSFUL OPERATION DOES *NOT* / SET THE FLAG TO ZERO!! / / IF THE ERROR IS A TYPE 1 ERROR, IFLAG IS SET TO -1. / IF THE ERROR IS A TYPE 2 ERROR, IFLAG IS SET TO 1. / / ** NOTE!! ** IF BDEV IS CALLED, THESE ROUTINES / MUST RESIDE IN FIELD 0!! THIS CAN BE DONE / BY USING THE /1 OPTION WHEN LOADING THE MAIN / PROGRAM, WHICH FORCES LOADING INTO FIELD 1 OR / HIGHER, LEAVING FIELD 0 AVAILABLE FOR THE / BINARY I/O ROUTINES WHEN LAB8 IS LOADED. / /-------------- / / ***** SAMPLE PROGRAM ****** / /C I/O DEVICE IS SYS BY DEFAULT. /C / DIMENSION FNAM(2),ARRAY(100) / FNAM(1)='FILE@@' / FNAM(2)='EX????' /C COULD HAVE CALL BDEV('FLIP') HERE, FOR EXAMPLE... / CALL RBIN(0,FNAM) / CALL RBIN(1,ISIZE) / CALL RBIN(3*ISIZE,ARRAY) / (----TWIDDLE WITH DATA----) / CALL WBIN(0,FNAM) / CALL WBIN(1,ISIZE) / CALL WBIN(3*ISIZE,ARRAY) / CALL BCLOS / END / / ((( ASSUMING 'ISIZE' WILL ALWAYS BE <=100 ))) / / ** FILE NAME MUST BE '@' FILLED, NOT SPACE FILLED!!!! / ** REAL NUMBERS OCCUPY 3 WORDS PER ARRAY ELEMENT. / ** WHEN A TENTATIVE FILE IS CLOSED, A PREVIOUSLY / EXISTING FILE OF THE SAME NAME WILL BE DELETED. / ** NOTE THAT SCALARS CAN ALSO BE USED (ARRAY OF 1). / ** OPENING A FILE FOR WRITING, AND IMMEDIATELY CLOSING / THE FILE WITHOUT WRITING ON IT WILL DELETE ANY FILE / WITH THAT NAME. // LAP /WE'LL HANDLE OUR OWN PAGES. ENTRY BCLOS ENTRY BDEV ENTRY BFLAG ENTRY RBIN ENTRY WBIN ABSYM MINUS3 7346 /CLA CLL CMA RTL ABSYM N0001 7301 /CLA CLL IAC ABSYM N0002 7305 /CLA CLL IAC RAL ABSYM N2000 7332 /CLA CLL CML RTR ABSYM N7777 7340 /CLA CLL CMA ABSYM CIF0 6202 ABSYM CIF1 6212 ABSYM RIF 6224 OPDEF TADI 1400 OPDEF DCAI 3400 OPDEF JMSI 4400 OPDEF JMPI 5400 / ****** PAGE 0 STORAGE ****** ABSYM ULEN 130 /-(SIZE OF USER BUFFER) ABSYM TEMP 131 /PAGE ZERO TEMPORARY STORAGE. ABSYM ACPARA 132 /STORAGE FOR AC CONTENTS ON WBIN ENTRY. / ****** BUFFER DEFINITIONS ****** / ****** 'WBUF' MUST BE FIRST ****** WBUF, 0;PAGE /400 WORDS = 1 DISK BLOCK FOR OUTPUT BUFFER. 0;PAGE RBUF, 0;PAGE /400 WORDS = 1 DISK BLOCK FOR INPUT BUFFER. 0;PAGE HANBUF, 0;PAGE /200 WORDS = 1 PAGE FOR HANDLER. RBIN, BLOCK 2 /<<<< CALL RBIN(LEN,ARRAY) >>>> JMS XFERB /XFER BLOCK AND CHECK DEVNUM. JMS INITB RBIN0 /IF LEN NOT ZERO, GO TO THIS ADDR. RFNAM, 0;0;0;0 /LEN =0! PUT FILE NAME HERE. DCA RFN /INITB RETURNS 'RFNAM'. DCAI ^RSIZ TADI ^DEVN /AC = DEVICE NUMBER. CIF1 JMS 7700 /CALL USR 2 /FUNCTION CODE = 'LOOKUP' RFN, 0 /BECOMES FNAM PTR, THEN START BLOCK. 0 /-FILE SIZE IS RETURNED. JMP NOFIL /ERROR. MUST NOT BE THERE. TAD RFN DCAI ^RDEVB TAD RFN# DCAI ^RSIZ JMS BREAD /BUFFER AHEAD. READ FIRST ONE. JMP XIT NOFIL, N0001 /USER ERROR. JMS ERR# 2217 / 'ROPN' ERROR. CAN'T FIND FILE. 2016 ^RSIZ, RSIZ ^RDEVB, RDEVB ^WSIZ, WSIZ ^WDEVB, WDEVB ^DEVN, DEVNUM WBIN, BLOCK 2 /<<<< CALL WBIN(LEN,ARRAY) >>>> JMS XFERB /XFER BLOCK AND CHECK DEVNUM. JMS INITB WBIN1 /IF LEN NOT ZERO, GO TO THIS ADDR. WFNAM, 0;0;0;0 /LEN = 0! PUT FILE NAME HERE. DCA WFN /PUT IN POINTER TO WFNAM. DCAI ^WSIZ /NO SIZE, IN CASE OF ERROR. DCA FLEN N0002 ISZ ACPARA /LEAVE AT LOOKUP IF ENTRY AC = -1. IAC /ELSE, CHANGE TO ENTER. DCA WUSRF TADI ^DEVN /AC = DEVICE NUMBER. CIF1 JMS 7700 /CALL USR WUSRF, 0 /FUNCTION CODE = 'LOOKUP' OR 'ENTER' WFN, 0 /BECOMES POINTER, THEN STARTING BLOCK. 0 /FILE SIZE RETURNED HERE. JMP NOOPN TAD WFN DCAI ^WDEVB TAD WFN# DCAI ^WSIZ JMS RESETW JMP XIT NOOPN, N0001 /USER ERROR. JMS ERR# 2717 / 'WOPN' ERROR. READ ONLY DEVICE? 2016 BCLOS, BLOCK 2 /<<<< CALL BCLOS >>>> JMS XFERB /XFER BLOCK AND CHECK DEVNUM. TADI ^WSIZ SZA CLA /WSIZ = 0? JMP CLOS1 /NO. OUTPUT WAS OPENED. TAD FLEN /WSIZ=0 MEANS FULL, OR NOT OPENED. SZA CLA /ANYTHING WRITTEN? JMP CLOS2 /YES. WAS FULL FILE. CLOSE IT. CLERR, DCA FLEN /DEACTIVATE WRITES. DCAI ^WSIZ N0001 /USER ERROR. JMS ERR# 0203 / 'BCLO' ERROR. CLOSING GHOST FILE.. 1417 CLOS1, TAD WCNT /CHECK FOR PARTIAL BUFFER. TAD (400 SNA CLA /WELL? JMP CLOS2 /ON THE NOSE. DON'T HAVE TO FLUSH. CMA TAD WWRD DCA 10 TAD 10 TAD (400 DCA 11 /POINT INTO RBUF. ZFILL, TADI 11 AND ACPARA DCAI 10 ISZ WCNT /DONE? JMP ZFILL /NO. JMS BWRTE /WRITE LAST BLOCK OUT. CLOS2, MINUS3 TAD WUSRF SZA CLA JMP CLOS3 /IF LAST OPEN WAS NOT 'ENTER'. TADI ^DEVN /AC=DEVICE NUMBER. CIF1 JMS 7700 /CALL USR 4 /FUNCTION CODE = 'CLOSE' WFNAM /POINTER TO FILE NAME. FLEN, 0 /FILE LENGTH TO USE WHEN CLOSING. JMP CLERR CLOS3, DCAI ^WSIZ /NO MORE OUTPUT!! DCA FLEN JMP XIT PAGE BFLAG, BLOCK 2 /<<<< CALL BFLAG(IFLAG) >>>> TAD BFLAG DCA BCDF FLADR, BCDF, HLT TADI BFLAG# /GET CDF TO FLAG'S FIELD. DCA FLCDF INC BFLAG# TADI BFLAG# /ADDRESS OF FLAG. DCA FLADR INC BFLAG# RETRN BFLAG / ERROR ROUTINE KLUDGE!!!! / / JMS ERR# /*** NOTICE THE # !!!!! *** / XXXX;YYYY /ERROR MESSAGE TEXT. / /IF AC=0, THEN ERROR IS FATAL, PERIOD. / /IF AC<>0, THEN BFLAG TAKES EFFECT. CALLE, CALL 1,ERROR ERR, ARG ERR SNA /FATAL? JMP CALLE /YES. BYE-BYE. FLCDF, JMP CALLE /OR CDF TO ERROR FLAG FIELD. DCAI FLADR XIT, RETRN BDEV HANDLR, 7607 /HANDLER ENTRY. (DEFAULT = SYS) RBIN0, N2000 /CHANGE PARAMETER OPERATION TO TAD PAROP / 'DCAI' INSTEAD OF 'TADI'. DCA PAROP RBIN1, TAD RSIZ SNA CLA /ANY DATA LEFT? JMP BEOF /NOPE. EOF. TAD I RWRD /GET DATA FROM DISK BLOCK. JMS PARWRD /PUT INTO USERS ARRAY. INC RWRD ISZ RCNT /DATA LEFT IN BUFFER? JMP RNEXT /YES. ISZ RSIZ /NO. BUFFER AHEAD. THRU WITH DISK? JMS BREAD /NO. READ ANOTHER BLOCK OF DATA. RNEXT, ISZ ULEN /WANTS MORE DATA? JMP RBIN1 /YES. JMP XIT RCNT, 0 /-(WORDS LEFT IN DISK BUFFER) RWRD, 0 /POINTER TO NEXT DATA WORD IN RBUF. RSIZ, 0 /-(BLOCKS REMAINING ON FILE) BEOF, N0001 /USER ERROR. JMS ERR# 0205 / 'BEOF' ERROR. BINARY END-OF-FILE. 1706 BREAD, 0 /BINARY READ FROM DISK... TAD C200 RIF /CONSTRUCT HANDLER PARAMETER. DCA RDEVP CIF0 JMS I HANDLR /CALL DEVICE HANDLER. RDEVP, 0 / 02F0 GETS PUT HERE. RBUFP, RBUF RDEVB, 0 /BLOCK TO READ. SET BY LOOKUP. JMP RERR INC RDEVB /POINT TO NEXT BLOCK FOR NEXT READ. TAD (-400 DCA RCNT TAD RBUFP DCA RWRD JMP I BREAD RERR, DCA RSIZ /DEACTIVATE RBIN. N7777 /DEVICE ERROR. JMS ERR# 2204 / 'RDER' DEVICE ERROR DURING READ. 0522 WBIN1, TAD WSIZ SNA CLA /STILL FILLING UP FILE? JMP WFULL /NO. ERROR. JMS PARWRD /GET USERS DATA DCA I WWRD /AND WRITE INTO BUFFER. INC WWRD ISZ WCNT /ROOM IN BUFFER FOR MORE DATA? JMP WNEXT /YES. JMS BWRTE /NO. FLUSH IT. WNEXT, ISZ ULEN /MORE DATA TO WRITE OUT? JMP WBIN1 /YES. JMP XIT WCNT, 0 /-(WORDS LEFT IN DISK BUFFER). WWRD, 0 /POINTER TO NEXT DATA WORD IN WBUF. WSIZ, 0 /-(BLOCKS REMAINING ON FILE) WFULL, N0001 /USER ERROR. JMS ERR# 2706 / 'WFUL' ERROR. OUTPUT FILE FULL. 2514 BWRTE, 0 /BINARY WRITE ONTO DISK. INC WSIZ /BUMP SIZE COUNTDOWN. C200, 200 /PROTECT POSSIBLE SKIP.. TAD (4200 RIF /FORM PARAMETER FOR HANDLER. DCA WDEVP CIF0 JMS I HANDLR /CALL DEVICE HANDLER. WDEVP, 0 / 42F0 GETS PUT HERE. WBUFP, WBUF WDEVB, 0 /BLOCK NUMBER TO WRITE ON. JMP WERR INC FLEN INC WDEVB /FOR NEXT WRITE... JMS RESETW JMP I BWRTE RESETW, 0 /RESET WRITE BUFFER POINTER/COUNTER. TAD (-400 DCA WCNT TAD WBUFP DCA WWRD JMP I RESETW WERR, DCA WSIZ /DEACTIVATE WBIN. DCA FLEN N7777 /DEVICE ERROR. JMS ERR# 2722 / 'WRER' DEVICE ERROR DURING WRITE. 0522 PAGE FLD0X, JMS ERR# /FATAL ERROR! 0614;0460 / 'FLD0' NOT LOADED INTO FIELD ZERO! BDEV, BLOCK 2 /<<<< CALL BDEV(DEVNM) >>>> RIF SZA CLA /LOADED INTO FIELD ZERO? JMP FLD0X /NO! FATAL ERROR! DCA RSIZ /DEACTIVATE RBIN/WBIN. DCA WSIZ DCA FLEN DCA DEVNUM /'NO DEVICE' IN CASE OF ERROR. JMS SETPAR JMS PARWRD /DEVICE DCA DEVNAM JMS PARWRD /NAME DCA DEVNAM# CIF1 JMS 7700 /CALL USR 10 /LOCK USR IN. CIF1 JMS I USR 13 /"RESET" 0000 /PRESERVE TENT. FILES. TAD FETCHP DCA BDARG CIF1 JMS I USR 1 /"FETCH" DEVNAM, 0 /DEVICE NAME. 0 /THIS GETS SET TO DEVICE NUMBER. BDARG, 0 /SET TO ENTRY POINT. JMP BDVERR TAD BDARG DCA HANDLR TAD DEVNAM# DCA DEVNUM JMS USROUT JMP XIT USROUT, 0 CIF1 JMS I USR 11 /"USROUT" JMP I USROUT BDVERR, JMS USROUT N0001 /USER ERROR. JMS ERR# 0204;0526 / 'BDEV' ERROR. DEVNAM NOT IN SYSTEM. NODEV, JMS ERR# /FATAL ERROR! 0405;2677 / 'DEV?' NO DEVICE HANDLER. FETCHP, HANBUF /'FETCH' PARAMETER. DEVNUM, 1 /DEVICE NUMBER (DEFAULT = SYS) USR, 200 /USR ENTRY POINT WHEN LOCKED IN. SETPAR, 0 /SET UP PARAMETER FOR PARWRD CALLS. TAD TADOP /INIT TO 'TADI PADDR' DCA PAROP TAD BDEV DCA SETCDF PADDR, SETCDF, HLT /CDF TO CALLING FIELD. TADI BDEV# DCA PARCDF INC BDEV# TADI BDEV# DCA PADDR /USE SCRATCH POINTER. INC BDEV# JMP I SETPAR PARWRD, 0 /GET NEXT WORD OF CURRENT PARAMETER. PARCDF, HLT /SET TO CDF BY 'SETPAR'. PAROP, HLT /SET TO 'TADI PADDR' BY SETPAR. /CHANGED TO 'DCAI SETCDF' BY RBIN. INC PADDR JMP I PARWRD TADOP, TADI PADDR /+2000 MAKES IT DCAI PADDR... XFERB, 0 /XFER CALL BLOCK AND CHECK DEVNUM. DCA ACPARA /SAVE AC FROM ENTRY. TAD DEVNUM /FIRST, DO WE HAVE DEVICE? SNA CLA JMP NODEV /NO! POOR GUY... MINUS3 /TRANSFER CDF/ADDR OF CALL BLOCK. TAD XFERB DCA TEMP TAD I TEMP DCA BDEV INC TEMP TAD I TEMP DCA BDEV# JMP I XFERB INITB, 0 /SET UP PARAS FOR RBIN / WBIN. JMS SETPAR /SET UP FOR LENGTH. JMS PARWRD CMA /STORE -(USER BUFFER LENGTH) - 1. DCA ULEN JMS SETPAR /SET UP FOR ARRAY. TAD I INITB DCA 7 /ALTERNATE RETURN ADDRESS. ISZ ULEN /ADD 1 AND CHECK LEN PARA. JMP I 7 /LEN NON-ZERO. DO OPERATION. TAD INITB /LEN = 0! GET FNAM ADDR -1. DCA 10 JMS PARWRD /FILE DCAI 10 JMS PARWRD /NAME DCAI 10 JMS PARWRD /AND DCAI 10 JMS PARWRD /EXTENSION. DCAI 10 TAD INITB IAC /POINTER TO FILE NAME IN AC. JMP I 10 /RETURN PAST FILENAME. /JMP I ON AUTO-INCREMENT WORKS! END