File SUBBIN.SB (8k SABR macro assembler source file)

Directory of image this file is from
This file as a plain text file

//	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



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search