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

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

/IOFILE.SB, PAGE 1 OF 7.	(8/13/71 - C.M.MOORE, RICE U., HOUSTON)
/
/THIS FILE CONTAINS ENTRY POINTS: LFILE,RFILE,MFILE,WFILE,CFILE,LINK.
/
/SEE THE LISTING OF FILE 'XPLAIN.IO' FOR A DETAILED EXPLANATION
/OF HOW TO USE THESE ROUTINES.
/
/THE BINARY FILE OF THIS PACKAGE (IOFILE.RL) OCCUPIES 3 PAGES OF
/CORE, AND MUST BE LOADED INTO FIELD 0.  IF NOT, THE ROUTINES WILL
/TYPE A FATAL ERROR MESSAGE WHEN CALLED.
/
OPDEF RDF   6214
OPDEF CIF10 6212
OPDEF TADI  1400
OPDEF DCAI  3400
OPDEF JMSI  4400
OPDEF JMPI  5400
/
ABSYM TEM 7 /PAGE 0 POINTER
/
	LAP /DISABLE AUTOMATIC PAGING TO CONSERVE SPACE
/
/TO CONSERVE CORE SPACE, THE SAME PAGE IS ALLOCATED FOR BOTH INPUT AND
/OUTPUT DEVICE HANDLERS.  IF THE HANDLERS ARE NOT CO-RESIDENT ON THE
/SAME CORE PAGE, EACH CALL TO IFILE OR MFILE WILL OVERLAY THE PREVIOUS
/DEVICE HANDLER WITH THE NEW HANDLER.  TO AVOID THIS, THE INPUT AND
/OUTPUT HANDLERS CAN BE PUT ON SEPARATE PAGES BY USING THE FOLLOWING
/CODE:
/	OSTART,	BLOCK 177
/	ISTART,	BLOCK 177
/
/2-PAGE DEVICE HANDLERS CAN BE USED IF AN EXTRA PAGE OF CORE IS
/ALLOCATED.FOR EXAMPLE,TO ALLOCATE THE SAME 2 PAGES FOR BOTH INPUT
/AND OUTPUT DEVICES,USE THE FOLLOWING CODE:
/	DUMMY,	0 /FORCES OSTART & ISTART TO 2ND LOC ON CORE PAGE
/	OSTART,
/	ISTART,	BLOCK 177
/		BLOCK 200 /2ND PAGE
/
/WHEN ALLOCATING 2 PAGES FOR A DEVICE HANDLER, THE DEVICE ADDRESS IS
/PLACED AT THE 2ND LOCATION ON THE 1ST PAGE IN ORDER TO INDICATE TO
/THE USR THAT 2 PAGES ARE AVAILABLE.  ATTEMPTING TO LOAD A 2-PAGE
/HANDLER WHEN ONLY 1 PAGE IS AVAILABLE CAUSES THE USR TO INDICATE
/THAT THE DEVICE CANNOT BE FOUND. (MFILE AND LFILE WILL RETURN WITH
/THE STARTING BLOCK NUMBER = -1.)
/
/
/CORE ALLOCATION FOR DEVICE HANDLERS.
/
OSTART,		  /OUTPUT HANDLER ADDRESS: MUST BE 1ST LOC ON PAGE IF 1
		  /PAGE ALLOCATED, 2ND LOC ON PAGE IF 2 PAGES ALLOCATED.
ISTART,	BLOCK 177 /INPUT HANDLER ADDRESS: MUST BE 1ST LOC ON PAGE IF 1
		  /PAGE ALLOCATED, 2ND LOC ON PAGE IF 2 PAGES ALLOCATED.
/

/IOFILE.SB, PAGE 2 OF 7. / /START OF 1ST PAGE OF PROGRAM. CPAGE 200 P7700, 7700 /POINTS TO USR. ***MUST BE 1ST LOC ON PAGE*** INPNT, ISTART IFILEP, INFILE P77, 77 P40, 40 M4, -4 / /ADDRES LOADS ARG ADDRESS FROM LFILE TO TEM ADDRES, 0 CDF, HLT /CHANGE TO DF OF CALLING PROG TADI LFILE# DCA CDFARG INC LFILE# TADI LFILE# DCA TEM INC LFILE# JMP I ADDRES /CHANGE TO CURRENT DF / /FETCH LOADS NEXT ARG AS SPECIFIED BY TEM FETCH, 0 CDFARG, HLT /CHANGE TO DF OF ARG TADI TEM INC TEM JMP I FETCH /CHANGE PO CURRENT DF
/ENTRYP MOVES THE ENTRY POINT POINTERS TO LFILE, THEN FETCHES 1ST ARG. ENTRYP, 0 CLA CMA CLL RTL /SET AC=-3 TAD ENTRYP DCA FETCH TADI FETCH INC FETCH DCA CDF CLA CLL CML RTL /SET AC=2 TAD CDF DCA JBACK /SET UP FOR QUICK RETURN TADI FETCH DCA LFILE# JMS ADDRES RDF /GET CURRENT DF M40, SZA SMA CLA JMP BADDF /THIS PROG IS NOT LOADED INTO FIELD 0!!! JMS FETCH JMPI ENTRYP /
/IOFILE.SB, PAGE 3 OF 7. / /AMPS CONVERTS BLANKS(40) TO AMPERSANDS(00) IN BOTH CHARACTERS /OF THE WORD IN THE AC. AMPS, 0 DCA INBNUM TAD INBNUM AND P77 TAD M40 SZA TAD P40 DCA LENTH TAD INBNUM P200, AND P7700 CLL RAL SZA RAR TAD LENTH JMPI AMPS / /SUBROUTINE LINK(IBLK1) ENTRY LINK LINK, BLOCK 2 JMS ENTRYP SPA JMP BADDF /NEGATIVE STARTING BLOCK # FOR .SV FILE DCA LNKBLK CIF10 JMSI P7700 6 /REQUEST 6 LNKBLK, 0 /STARTING BLOCK # / /TYPE FATAL ERROR MESSAGE. (PROG IN WRONG FIELD, NEGATIVE IBLK1 FOR /LINK, HANDLER MISSING, I/O ERROR IN WFILE OR RFILE.) /MESSAGE WILL READ: 'FILE ERROR AT LOC NNNNN' BADDF, CALL 1,ERROR ARG FILEMS / /FUNCTION LFILE(NDEV,NAME,LENTH) ENTRY LFILE FILEMS, TEXT /FILE/ LFILE, BLOCK 2 JMS ENTRYP /GET 1ST WORD OF DEVICE NAME JMS AMPS /CONVERT BLANKS (40) TO AMPERSANDS (00) DCA INDEV JMS FETCH /GET 2ND WORD OF DEVICE NAME JMS AMPS DCA INDEV# JMS ADDRES /GET 2ND ARG ADDRESS TAD M4 DCA INHAND TAD IFILEP DCA ENTRYP INGF, JMS FETCH /LOOP TO GET 4-WORD FILE NAME JMS AMPS DCAI ENTRYP INC ENTRYP ISZ INHAND JMP INGF JMS ADDRES /GET 3RD ARG ADDRES
/IOFILE.SB, PAGE 4 OF 7. / /LOCK USR (USER SERVICE ROUTINE) IN CORE, SWAPPING OUT USER PROGRAM CIF10 JMSI P7700 10 /REQUEST 10 /FETCH DEVICE HANDLER TAD INPNT /PAGE ADDRESS FOR INPUT DEVICE HANDLER DCA INHAND CIF10 JMSI P200 1 /REQUEST 1 INDEV, 0 /2-WORD INPUT DEVICE NAME INNUM, 0 /WILL BE OVERLAID WITH INPUT DEVICE # INHAND, 0 /WILL BE OVERLAID WITH INPUT HANDLER ENTRY POINT JMP INERR /DEVICE NOT FOUND /LOOK UP PERMANENT FILE TAD IFILEP /POINTS TO INPUT FILE NAME DCA INBNUM CIF10 TAD INNUM /DEVICE # JMSI P200 2 /REQUEST 2 INBNUM, 0 /WILL BE OVERLAID WITH STARTING BLOCK # LENTH, 0 /NEGATIVE OF FILE LENGTH IN BLOCKS JMP INERR /FILE NOT FOUND SKP STORE, DCA INBNUM /USR DISMISS FROM CORE CIF10 JMSI P200 11 /REQUEST 11 TAD CDFARG DCA CDFAR2 TAD LENTH CIA CDFAR2, HLT /CHANGE TO DF OF ARG DCAI TEM /STORE LENGTH OF FILE IN BLOCKS TAD INBNUM /LOAD AC WITH STARTING BLOCK # JBACK, HLT /CHANGE TO DF&IF OF CALLING PROG JMPI LFILE# /QUICK RETURN / /ERROR. SET BLOCK # = -1. INERR, CLA CMA AAPAG1, JMP STORE / /END OF 1ST CORE PAGE OF PROGRAM. /
/IOFILE.SB, PAGE 5 OF 7. / CPAGE 200 /START OF 2ND CORE PAGE OF PROGRAMS. PP70, 70 /***MUST BE 1ST LOC ON PAGE*** PP7700, 7700 PP7646, 7646 /1 BEFORE DEVICE HANDLER RESIDENCY TABLE PP40, 40 PP37, 37 MM4, -4 MM40, -40 INERRP, INERR INNUMP, INNUM BADDFP, BADDF LENTHP, LENTH STOREP, STORE AMPSP, AMPS ENTP, ENTRYP FETCHP, FETCH ADRESP, ADDRES JBACKP, JBACK OUPNT, OSTART OFILEP, OUFILE CDFARP, CDFARG / /SUBROUTINE CFILE(LENTH) ENTRY CFILE CFILE, BLOCK 2 JMSI ENTP DCA CBLKS TAD OFILEP /POINTS TO OUTPUT FILE NAME DCA CNAME /CLOSE OUTPUT FILE TAD OUNUM /GET DEVICE # OF OUTPUT FILE CIF10 JMSI PP7700 4 /REQUEST 4 CNAME, 0 /POINTER TO FILE NAME CBLKS, 0 /LENGTH IN BLOCKS NOP /FILE NOT FOUND JMPI JBACKP /
/IOFILE.SB, PAGE 6 OF 7. / /FUNCTION MFILE(NDEV,NAME,LMAX) ENTRY MFILE OUFILE, BLOCK 2 /NEXT 4 LOCS HOLD OUTPUT FILE NAME MFILE, BLOCK 2 JMSI ENTP JMSI AMPSP DCA OUDEV JMSI FETCHP JMSI AMPSP DCA OUDEV# JMSI ADRESP TAD MM4 DCA OUHAND TAD OFILEP DCA LOC1 OUGF, JMSI FETCHP JMSI AMPSP DCAI LOC1 INC LOC1 ISZ OUHAND JMP OUGF JMSI ADRESP /LOCK USR INTO CORE. CIF10 JMSI PP7700 10 /REQUEST 10 /FETCH DEVICE HANDLER TAD OUPNT /GET OUTPUT HANDLER ADDRESS DCA OUHAND CIF10 JMSI PP200 1 /REQUEST 1 OUDEV, 0 /2-WORD OUTPUT DEVICE NAME OUNUM, 0 /WILL BE OVERLAID WITH OUTPUT DEVICE # OUHAND, 0 /WILL BE OVERLAID WITH OUTPUT HANDLER ENTRY POINT JMPI INERRP /DEVICE NOT FOUND /ENTER OUTPUT FILE TAD OFILEP /POINTS TO OUTPUT FILE NAME DCA OUBNUM TAD OUNUM /GET DEVICE # CIF10 JMSI PP200 3 /REQUEST 3 OUBNUM, 0 /WILL BE OVERLAID WITH STARTING BLOCK # LMAX, 0 /NEGATIVE OF MAX AVAILABLE # OF BLOCKS JMPI INERRP /TENTATIVE OUTPUT FILE ALREADY EXISTS. TAD LMAX DCAI LENTHP TAD OUBNUM JMPI STOREP /
/IOFILE.SB, PAGE 7 OF 7. / /SUBROUTINE RFILE(NUM,IBLK1,LOC1) ENTRY RFILE INFILE, BLOCK 2 /NEXT 4 LOCS HOLD INPUT FILE NAME RFILE, BLOCK 2 JMSI ENTP /GET # OF PAGES SPA /CHECK FOR NEGATIVE # OF PAGES TAD MM40 /SET UP TO WRITE INSTEAD OF READ SPA CIA DCA OUDEV TADI INNUMP /INPUT DEVICE # CHKDEV, TAD PP7646 DCA WFILE 6211 /CDF 10 TADI WFILE SNA JMPI BADDFP /HANDLER NOT RESIDENT DCA WFILE /HANDLER ENTRY POINT TAD OUDEV CLL RTL RTL RTL DCA OUDEV JMSI ADRESP /CHANGES TO CURRENT DF JMSI FETCHP /GET STARTING BLOCK # DCA IBLK1 JMSI ADRESP /GET ADDRESS OF LOC1 TADI CDFARP /GET FIELD OF LOC1 PP200, AND PP70 TAD OUDEV /SET UP TO READ/WRITE NUM PAGES DCA NBLKS TAD TEM /GET ADDRESS OF LOC1 DCA LOC1 DOIT, JMSI WFILE /JUMP TO HANDLER NBLKS, 0 /# OF PAGES LOC1, 0 /BUFFER ADDRESS IBLK1, 0 /STARTING BLOCK # JMPI BADDFP /FATAL I/O ERROR JMPI JBACKP / /SUBROUTINE WFILE(NUM,IBLK1,LOC1) ENTRY WFILE WFILE, BLOCK 2 JMSI ENTP AND PP37 TAD PP40 /SET UP TO WRITE DCA OUDEV TAD OUNUM /OUTPUT DEVICE # AAPAG2, JMP CHKDEV 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