File F1098.PA (PAL assembler source file)

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

	FIELD	0
	*200
START,	JMP I	.+1
	BEGIN			/BEGIN PROGRAM
/
/	MESG	GENERAL MESSAGE OUTPUT ROUTINE
/
/	CDF	N0		/CALLED FROM FIELD N
/	CIF	00		/MESG IS IN FIELD 0
/	JMS I	 MESG		/CALL
/	 ADDR;CDF M0;FUNC	/ADDR IS ADDRESS OF MESSAGE
/				/M=FIELD OF MESSAGE
/				/FUNC=0, USE CONSOLE FOR OUTPUT
/				/FUNC=1, USE OSIO PUT FOR OUTPUT
	ZBLOCK	5		/TEMPORARIES FOR MESG
MESG,	.-.
	CLA CMA
	TAD I	MESG		/SAVE POINTER
	DCA	MESG-1
	ISZ	MESG		/FOR RETURN
	TAD I	MESG		/GET CDF INSTRUCTION
	ISZ	MESG
	DCA	MES5+1		/SAVE FOR GET OF CHAR
	TAD I	MESG		/GET FUNCTION
	SNA CLA
	TAD	(MES6-PUT	/PUT TO CONSOLE
	TAD	(PUT
	DCA	MESG-5		/SAVE OUTPUT ADDRESS
	RDF			/GET CALLERS FIELD
	TAD	.+2		/+CDF CIF 00
	DCA	MES5-2		/SAVE FOR EXIT
	CDF CIF 00
	TAD	(377
	DCA	MESG-4
MES1,	CLA CMA
	DCA	MESG-2		/UNPACK SWITCH
	ISZ	MESG-1		/NEXT WORD
	JMS	MES5		/FETCH WORD
	RTR
	RTR
	RTR
MES2,	AND	(77		/MASK 6 BITS
	SNA
	JMP	MES5-2		/YES
	TAD	(240		/RECODE
	AND	(77		/CHARACTER TO
	TAD	(240		/BE PRINTED
	DCA	MESG-3
	TAD	MESG-3
	TAD	(-"%		/CTRL CHAR?
	SZA CLA
	JMP	MES3		/NO
	TAD	(277		/SET MASK
	DCA	MESG-4		/AND SAVE IT
	JMP	MES4
MES3,	TAD	MESG-3		/GET CHARACTER
	AND	MESG-4		/MASK IT
	JMS I	MESG-5		/PUT OUT THE CHARACTER
	TAD	(377		/RESET MASK
	DCA	MESG-4
MES4,	ISZ	MESG-2		/TEST L-R SWITCH
	JMP	MES1		/LEFT
	JMS	MES5		/RIGHT
	JMP	MES2
	0-0			/BECOMES CDF CIF N0
	JMP	MES5-2
MES5,	.-.
	0-0			/BECOMES CDF M0
	TAD I	MESG-1		/GET THE WORD
	CDF CIF 00
	JMP I	MES5
MES6,	.-.
	TLS
	TSF
	JMP	.-1
	CLA
	JMP I	MES6

	PAGE
	0-0			/TEMPORARY
PUT,	.-.
	DCA	PUT-1		/SAVE CHARACTER
	RDF			/GET CALLERS FIELD
	TAD	.+1
	CDF CIF 00
	DCA	PUT10-2 	/SAVE FOR EXIT
	TAD	PUT-1		/GET IT BACK
	TAD	(-"Z+100	/CTRLZ?
	SNA CLA
	JMP	PUT10		/YES, END IT
	TAD	PUT-1		/GET IT BACK
	CIF	10
	JMS I	(OCHAR		/PUT OUT THE CHAR
	JMP	PUT20		/OUTPUT ERROR
	0-0			/EXIT CDF CIF
	JMP I	PUT		/DONE, EXIT
PUT10,	CIF	10		/CLOSE THE FILE
	JMS I	(OCLOSE
	JMP	PUT30		/CLOSE ERROR
	JMP	PUT10-2 	/EXIT
PUT20,	JMS	ERROR
	 1			/OUTPUT ERROR
PUT30,	JMS	ERROR
	 2			/CLOSE ERROR

GET,	.-.
	CLA CLL
	RDF
	TAD	PUT+4
	DCA	GET10
	CIF	10
	JMS I	(ICHAR		/GET A CHAR
	SKP			/SKIP IF ERROR
	JMP	GET10
	SMA CLA
	JMP	GET10-1 	/EOF, RETURN CTRLZ
	JMS	ERROR
	 3			/INPUT ERROR
GET10,	0-0
	TAD	("Z-100
	JMP I	GET		/EXIT WITH IT
	SMA CLA 		/SKIP IF FATAL ERROR
	IAC
	TAD	(5
	JMP	ERROR+3

ERROR,	.-.
	CLA CLL
	TAD I	ERROR
	DCA	.+4
	CIF	10
	JMS I	(200
	7
	0-0			/ERROR CODE

	-1;-14;7642;0-0;0-0
OPTION, .-.
	DCA	OPTION-2
	RDF
	TAD	PUT+4
	DCA	OPTI10		/SAVE FOR EXIT
	TAD	OPTION-3
	DCA	OPTION-1
	TAD	OPTION-2
	TAD	OPTION-4
	ISZ	OPTION-1
	SMA SZA
	JMP	.-3
	TAD	OPTION-5
	DCA	OPTION-2
	CLL CML
	RAL
	ISZ	OPTION-2
	JMP	.-2
	CDF	10
	AND I	OPTION-1
OPTI10, 0-0			/BECOMES EXIT CDF CIF
	JMP I	OPTION		/AC=0, OPTION OFF, AC=1, OPTION ON
	PAGE
/OSIO.PA--OS8 I/O ROUTINE PARAMETER DEFINITIONS
OUBUF=6200;OUCTL=4210	/2 PAGE OUTPUT BUFFER STARTS AT 16200
OUDEVH=6600		/1 OR 2 PAGE OUTPUT HANDLER LOADED AT 06600
INBUF=5600;INCTL=0210	/2 PAGE INPUT BUFFER STARTS AT 15400
INDEVH=7200		/1 OR 2 PAGE INPUT HANDLER AT 7200.
ORIGIN=6600		/THE SUBROUTINES RESIDE AT 16600.
/
/	CORE MAP
/
/	00000-06577	USER AVAILABLE
/	06600-07177	OUTPUT DEVICE HANDLER
/	07200-07577	INPUT DEVICE HANDLER
/	10000-10777	USR RESERVED
/	12000-11577	USER AVAILABLE
/	15600-16177	INPUT BUFFER
/	16200-16577	OUTPUT BUFFER
/	16600-17577	OSIO SUBROUTINES
/
	EJECT
	XLIST
INRECS=1		/2 PAGES = 1 RECORD
DCB=7760		/DEVICE CONTROL TABLE
	FIELD 1
	*ORIGIN
INFLD=INCTL&70		/INPUT BUFFER FILED
OUFLD=OUCTL&70		/OUTPUT BUFFER FIELD
IN7400, 7400
IOPEN,	0		/INITIALIZE INPUT
	CLA CMA
	DCA INCHCT	/SET TO READ FROM NEW DEVICE.
	ISZ INEOF	/FORCE A NEW INPUT FILE.
	TAD (7617	/POINT TO CD INPUT LIST.
	DCA INFPTR
	TAD	IOPEN	/GET CALLERS ADDRESS
	JMP	IOPENE	/AND CONTINUE SOMEWHERE ELSE
INEOF,	0
INFPTR, 0
INPTR,	0
ICHAR,	0		/INPUT A CHARACTER.
IN7600, 7600
	RDF		/SAVE CALLING FIELD FOR RETURN
	TAD INCDIF
	DCA INRTRN
INCHAR, CDF INFLD	/DATA FIELD TO FIELD OF BUFFER
	ISZ INJMP	/3 - WAY UNPACKING SWITCH
	ISZ INCHCT	/INPUT BUFFER EXHAUSTED?
INJMPP, JMP INJMP	/NO..UNPACKTHE NEXT CHAR.
	TAD INEOF	/DID LAST READ GIVE EOF ON THIS DEVICE?
	SNA CLA
	JMP INGBUF	/NO. CONTINUE READING.
GETNEW, JMS INNEWF	/YES..GET NEXT INPUT IF IT EXISTS.
	JMP EOFERR	/TAKE EOF EXIT FROM ICHAR.
INGBUF, TAD INCTR	/INCTR HOLDS THE CURRENT LENGTH OF
			/THE INPUT FILE. WHEN THE AMOUNT REMAINING
			/TO READ IS LESS THAN THE SIZE OF THE
			/INPUT BUFFER, AN EOF IS SIGNALLED.
	CLL
	TAD (INRECS
	SNL
	DCA INCTR	/UPDATE REMAINING LENGTH
	SZL
	ISZ INEOF	/AND SIGNAL EOF FOR NEXT READ.
	CLL CML CMA RTR /CONSTRUCT A CONTROL WORD FOR THIS
	RTR		/READ FROM THE OVERFLOW, IF ANY,
	RTR		/AND THE STANDARD CONTROL WORD.
	TAD (INCTL+1
	DCA INCTLW
INCDIF, CIF CDF 0	/NOW DO A CALL TO THE INPUT HANDLER
	CDF 10		/WE ARE IN FIELD 1, HANDLER IN FIELD 0
	JMS I INHNDL
INCTLW, 0		/INPUT CONTROL WORD
INBUFP, INBUF		/INPUT BUFFER ADDRESS
INREC,	0		/POINTER TO INPUT RECORD
	JMP INERRX
INBREC, TAD INREC
	TAD (INRECS	/UPDATE POINTER INTO FILE
	DCA INREC
	TAD INCTLW	/NOW COMPUTE THE NUMBER OF CHARACTERS
	AND IN7600	/IN THIS INPUT BUFFER
	CLL RAL
	TAD INCTLW
	AND IN7600
	CMA
	DCA INCHCT	/NEW NUMBER OF CHARACTERS.
	TAD INJMPP	/RESET 3 WAY SWITCH
	DCA INJMP
	TAD INBUFP
	DCA INPTR	/AND BUFFER POINTER
	JMP INCHAR	/NOW READ THE BUFFER
INERRX, ISZ INEOF	/SET EOF JUST IN CASE
	SMA CLA 	/IF<0, A PHYSICAL ERROR
	JMP INBREC	/EOF ON INPUT
INERR,	CLA CLL CML RAR /FATAL
EOFERR, JMP INRTRN	/GET OUT
INJMP,	HLT		/3 WAY UNPACK SWITCH
	JMP ICHAR1	/GET 1ST OF 3
	JMP ICHAR2	/SECOND
ICHAR3, TAD INJMPP
	DCA INJMP	/SET FOR FIRST CHAR. NEXT
	TAD I INPTR	/THE THIRD WORD IS MADE OF THE HIGH
IN200,	AND IN7400	/ORDER FOUR BITS OF THE FIRST
	CLL RTR 	/TWO.
	RTR
	TAD INCTLW
	RTR
	RTR
	ISZ INPTR	/POINT TO NEXT WORD
	JMP INCOMN	/GET OUT  WITH CHAR IN AC
ICHAR2, TAD I INPTR
	AND IN7400	/SAVE HIGH ORDER FOR THIRD WORD
	DCA INCTLW
	ISZ INPTR
ICHAR1, TAD I INPTR
INCOMN, AND (377
	TAD (-232	/IS IT A  Z (EOF)?
	SNA
	JMP GETNEW	/YES..LOOK AT NEXT INPUT
	TAD (232
	ISZ ICHAR	/TAKE NORMAL RETURN
INRTRN, 0		/CIF CDF N.
	JMP I ICHAR
INNEWF, -1
INCHCT=INNEWF
	CDF 10
	TAD (INDEVH+1	/INITIALIZE IN CALSE WE NEED A NEW
	DCA INHNDL	/MORE INPUT?
	TAD I INFPTR
	SNA
	JMP I INNEWF	/NOPE
	JMS I IN200	/CALL MONITOR TO GET HANDLER
	1
INHNDL, 0
	HLT		/VERY BAD!
	TAD I INFPTR
	AND (7760	/GET INPUT FILE LENGTH
	SZA
	TAD (17
	CLL CML RTR
	RTR		/NEGATIVE OF FILE LENGTH
	DCA INCTR
	ISZ INFPTR	/POINT TO STARTING BLOCK
	TAD I INFPTR
	DCA INREC	/STORE IN HANDLER CALL
	ISZ INFPTR	/NEXT INPUT.
	DCA INEOF	/CLEAR EOF FLAG.
	ISZ INNEWF
	JMP I INNEWF
	INCTR=IOPEN
	PAGE
OOPEN,	0		/OPEN OUTPUT FILE
OU7600, 7600
	RDF
	TAD	(CDF CIF 00
	DCA	OORETN
	CDF CIF 10
	TAD OU7601	/POINT TO OUTPUT FILE NAME IN CD
	DCA OUBLK	/AREA
	TAD (OUDEVH+1
	DCA OUHNDL	/INITIALIZE OUTPUT DEVICE HANDLER
	TAD I OU7600	/PICK UP OUTPUT DEVICE NUMBER
	AND (17
	SNA		/IS THERE ONE?
	JMP ONOFIL	/NO..INHIBIT OUTPUT
	JMS I (200	/FETCH OUTPUT HANDLER
	1
OUHNDL, 0
	HLT		/BAD THING
OUENTR, TAD I OU7600
	JMS I (200	/ENTER THE OUTPUT FILE
	3
OUBLK,	7601		/GETS STARTING BLOCK OF HOLE
OUELEN, 0		/GETS SIZE OF HOLE AVAILABLE
	JMP OEFAIL	/FAILURE. SEE WHAT WE DID.
	DCA OUCCNT	/CLEAR CLOSING LENGTH
	DCA I  (OUTINH	/CLEAR OUTPUT INHIBIT
	JMS I (OUSETP	/SET UP POINTERS
	ISZ OOPEN
OORETN, CDF CIF 10
	JMP I OOPEN	/RETURN O.K.
OEFAIL, TAD I OU7600	/IFLENGTH=0, GIVE OPEN ERROR
	AND (7760	/IF NOT, MAKE IT 0 AND TRY AGAIN
	SNA CLA
	JMP ONTERR	/WAS 0, FAILED
	TAD I OU7600
	AND (17 	/MAKE IT 0
	DCA I OU7600
	JMP OUENTR	/AND TRY AGAIN
ONTERR, CLA CLL CML RAR
	JMP OORETN
ONOFIL, ISZ I (OUTINH	/INHIBIT OUTPUT
	JMP OORETN
OUTDMP, 0		/DUMP OUTPUT BUFFER
	DCA OUCTLW	/STORE CONTROL WORD
	CDF 10
	TAD I (OUTINH	/IS OUTPUT INHIBITED?
	SZA CLA
	JMP OUNOWR	/YEP.
	TAD OUCCNT	/IF THIS IS FIRST WRITE, START THE
	SNA		/SEARCH FORWARD ON DECTAPE
	ISZ OUCTLW
	TAD OUBLK	/GET STARTING BLOCK OF THIS
	DCA OUREC	/TRANSFER
	TAD OUCTLW
	CLL RTL
	RTL
	RTL		/COMPUTE # OF RECORDS TO OUTPUT
	AND (17
	TAD OUCCNT	/UPDATE CLOSING LENGTH
	DCA OUCCNT
	TAD OUCCNT	/SEE IF CLOSING LENGTH WILL BE
	CLL CML 	/BIGGER THAN OUTPUT HOLE
	TAD OUELEN
	SNL SZA CLA
	JMP I OUTDMP	/WILL BE TOO BIG
OUCDIF, CIF CDF 0
	CDF 10
	JMS I OUHNDL	/DO THE WRITE
OUCTLW, 0
	OUBUF
OUREC,	0
	SKP		/ERROR
OUNOWR, ISZ OUTDMP	/TAKE NORMAL RETURN
	JMP I OUTDMP
	PTP=0020
	PAGE
OCLOSE, 0		/CLOSE OUTPUT FILE
OC7600, 7600		/DON'T TRUST ANYONE
	RDF		/GET USERS FIELD
	TAD	(CDF CIF 00
	DCA	OCRET	/SAVE FOR EXIT
	CDF 10
	TAD I (OUTINH	/IF OUTPUT INHIBITED, CLOSE IS A NOP.
	SZA CLA
	JMP OCISZ	/A NOP
	JMS I (OTYPE	/DETERMINE IF OUTPUT IS TO PTP
	AND (770	/IF IT IS, DON'T OUTPUT A  Z.
	TAD (-PTP
	SZA CLA
	TAD (232	/NOT PTP. OUTPUT  Z AS EOF
	JMS I (OCHAR
	JMP OCRET	/ERROR RETURN
	JMS I (OCHAR	/FILL WITH 0 CHARACTERS
	JMP OCRET
FILLIP, JMS I (OCHAR	/FILL TO BOUNDARY WITH 0
	JMP OCRET
	JMS I (OTYPE	/IF OUTPUT IS DIRECTORY DEVICE, FILL
	SPA CLA 	/WHOLE RECORD, ELSE HALF RECORD
	TAD (100
	TAD (77
	AND I (OUDWCT	/ARE WE UP TO BOUNDARY YET?
	SZA CLA
	JMP FILLIP	/NO
	TAD I (OUDWCT
	TAD (OUCTL&3700 /IS THERE A FULL WRITE LEFT?
	SNA
	JMP NODUMP	/YES. BUT DON'T DO IT, AS  Z IS OUT.
	TAD (4000+OUFLD
	JMS OUTDMP	/DUMP LAST BUFFER
	JMP OCRET
NODUMP, TAD I OC7600	/GET DEVICE NUMBER
	JMS I (200	/CLOSE THE OUTPUT FILE
	4
OU7601, 7601		/POINTER TO FILE NAME
OUCCNT, 0		/CLOSING FILE LENGTH HERE
	SKP		/ERROR
OCISZ,	ISZ OCLOSE	/NORMAL RETURN
OCRET,	CDF CIF 10	/RESTORE CALLING FIELDS
	JMP I OCLOSE
	PAGE
OUSETP, 0	/INITIALIZE OUTPUT POINTERS
	TAD (OUCTL&3700
	CIA
	DCA OUDWCT	/DOUBLE WORD OUTPUT COUNT
	TAD (OUBUF	/INITIALIZE WORD POINTER
	DCA OUPTR
	TAD OUJMPE
	DCA OUJMP	/3 WAY UNPACK SWITCH
	JMP I OUSETP
OCHAR,	0		/OUTPUT CHARACTER ROUTINE
	AND (377	/ISOLATE EIGHT BITS
	DCA OUTEMP
	RDF		/GET FIELD WE WERE CALLED
	TAD (CIF CDF 0	/FROM
	DCA OUCRET
	TAD OUTINH	/OUTPUT INHIBITED?
	SZA CLA
	JMP OUCOMN	/YES. NOP.
OUCHAR, CDF OUFLD	/GO TO DATA FIELD OF BUFFER
	ISZ OUJMP	/BUMP CHARACTER SWITCH
OUJMP,	HLT		/GETS JMP.,JMP.+1,ETC.
	JMP OCHAR1
	JMP OCHAR2
OCHAR3, TAD OUTEMP	/THIRD CHAR
	CLL RTL 	/HIGH ORDER BITS GO INTO THE
	RTL		/HIGHORDER 4 BITS OF THE
	AND (7400	/FIRST OF TWO WORDS
	TAD I OUPOLD
	DCA I OUPOLD
	TAD OUTEMP	/THE SECOND DOUBLE WORD GETS
	CLL RTR 	/THE LOW ORDER BITS OF
	RTR		/THE THIRD CHAR
	RAR
	AND (7400
	TAD I OUPTR
	DCA I OUPTR
	TAD OUJMPE	/RESET CHARACTER SWITCH
	DCA OUJMP
	ISZ OUPTR	/POINT TO NEXT BUFFER WORD
	ISZ OUDWCT	/BUMP DOUBLE COUNT AFTER
	JMP OUCOMN	/GET OUT
	TAD (OUCTL	/READY TO OUTPUT A BUFFER
	JMS I (OUTDMP	/OUTPUT IT
	JMP OUCRET	/AN ERROR
	JMS OUSETP	/RESET OUTPUT POINTERS
	JMP OUCOMN
OCHAR2, TAD OUPTR	/POINT TO FIRST DOUBLE WORD
	DCA OUPOLD
	ISZ OUPTR	/POINT OUPTR TO SECOND
OCHAR1, TAD OUTEMP
	DCA I OUPTR
OUCOMN, ISZ OCHAR	/NORMAL EXIT
OUCRET, HLT
	JMP I OCHAR
OUTEMP, 0
OUPOLD, 0
OUPTR,	0
OUJMPE, JMP OUJMP
OUDWCT, 0
OUTINH, 0
OTYPE,	0		/OTYPE LOOKS AT THE OUTPUT DEVICE #,
	RDF
	TAD (CIF CDF 0
	DCA OTRTN
	CDF 10
	TAD I (7600	/AND LOOKS UP THE DCB WORD FOR
	AND (17 	/THAT DEVICE.
	TAD (DCB-1
	DCA OUTEMP
	TAD I OUTEMP	/GET DCB ENTRY
OTRTN,	HLT
	JMP I OTYPE
/CONTINUE IOPEN
IOPENE, DCA	OTYPE		/SAVE OPENS EXIT ADDRESS
	RDF			/GET CALLERS FIELD
	TAD	(CDF CIF 00
	DCA	OTRTN		/SAVE FOR EXIT
	JMP	OTRTN		/AND EXIT
	XLIST
	$END$

$UPTR,	0
OUJMPE, JMP OUJMP
OUDWCT, 0
OUTINH, 0
OTYPE,	0		/OTYPE LOOKS AT THE OUTPUT DEVICE #,
	RDF
	TAD (CIF CDF 0
	DCA OTRTN
	CDF 10
	TAD I (7600	/AND LOOKS UP THE DCB WORD FOR
	AND (17 	/THAT DEVICE.
	TAD (DCB-1
	DCA OUTEMP
	TAD I OUTEMP	/GET DCB ENTRY
OTRTN,	HLT
	JMP I OTYPE



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