File F1097.PA (PAL assembler source file)

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

/DASM -- OS/8 DISSASSEMBLER

/********************************************************
/*							*
/*		D	A	S	M		*
/*							*
/*		-------------------------		*
/*							*
/*	OS/8 DISASSEMBLER				*
/*	.R DASM 					*
/*	*ASCII<BINARY					*
/*							*
/*	SWITCHES					*
/*							*
/*	E	DECODE 2-WORD EAE INSTRUCTIONS		*
/*	F	DECODE FPNT INSTRUCTIONS		*
/*	N	DO NOT ADD SYMBOLS			*
/*	S	SYMBOL TABLE				*
/*							*
/********************************************************
	FIELD	0
	*10
AX,	ZBLOCK	10		/AUTO INDEX
	*20
CT,	ZBLOCK	10		/COUNTERS
	*30
TM,	ZBLOCK	10		/TEMPORARIES
	*40
PASS,	0-0			/PASS SWITCH INDICATOR
EAEFLG, 0-0			/EAE
FPTFLG, 0-0			/FPNT
SYMFLG, 0-0			/NO ADD SYMBOL FLAG
EA,	0-0			/2-WORD EAE IN PROGRESS
FP,	0-0			/FPNT IN PROGRESS
FL,	0-0			/MEMORY FIELD
FT,	0-0			/TEMPORARY FIELD
PC,	0-0			/LOCATION INDICATOR
ME,	0-0			/CONTENTS OF LOC
CK,	0-0			/CHECK SUM
W1,	0-0			/WORD 1 OF PAIR
W2,	0-0			/WORD 2 OF PAIR
CHAR,	0-0			/CHARACTER TEMP
NS,	0-0			/NUMBER OF SYMBOLS
LS,	0-0			/LAST SYMBOL POINTER
TP,	0-0			/INSTRUCTION TYPE
OF,	0-0			/OFFSET FROM PAGE BDRY
OF1,	0-0			/OF-PC
OF2,	0-0			/ABS(OF1)
MR,	0-0			/MEMORY REFERENCE ADDRESS
PI,	0-0			/INDIRECT BIT
PZ,	0-0			/PAGE 0 BIT
	PAGE
START,	JMP I	.+1
	BEGIN			/BEGIN PROGRAM
	ZBLOCK	4		/TEMPORARIES FOR MESG
MESG,	.-.
	CLA CMA
	TAD I	MESG		/SAVE POINTER
	DCA	MESG-1
	ISZ	MESG		/FOR RETURN
	TAD	 377
	DCA	MESG-4
MES1,	CLA CMA
	DCA	MESG-2		/UNPACK SWITCH
	ISZ	MESG-1		/NEXT WORD
	TAD I	MESG-1		/FETCH WORD
	RTR
	RTR
	RTR
MES2,	AND	 77		/MASK 6 BITS
	SNA
	JMP I	MESG		/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	 PUT
	TAD	 377		/RESET MASK
	DCA	MESG-4
MES4,	ISZ	MESG-2		/TEST L-R SWITCH
	JMP	MES1		/LEFT
	TAD I	MESG-1		/RIGHT
	JMP	MES2

	0-0			/TEMPORARY
PUT,	.-.
	DCA	PUT-1		/SAVE CHAR
	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
	JMP I	PUT		/DONE, EXIT
PUT10,	CIF	10		/CLOSE THE FILE
	JMS I	 OCLOSE
	JMP	PUT30		/CLOSE ERROR
	JMP I	PUT
PUT20,	JMS I	 ERROR
	1
	JMP	PUT10
PUT30,	JMS I	 ERROR
	2
	JMP	BEGIN		/OOPS

GET,	.-.
	CIF	10
	JMS I	 ICHAR		/GET A CHAR
	SKP			/SKIP IF ERROR
	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
	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
	CDF	00
	SZA CLA
	ISZ	OPTION
	JMP I	OPTION
	PAGE
BEGIN,	CDF	00		/THIS FIELD
	CIF	10		/POINT TO USR
	JMS I	 7700		/LOCK USR INTO CORE
	10
	CIF	10
	JMS I	 200		/CALL COMMAND DECODER
	5
	0
	CIF	10
	JMS I	 IOPEN		/OPEN INPUT FILES
	CIF	10
	JMS I	 OOPEN		/AND OUTPUT FILES
	SMA CLA 		/ERROR. IF AC<0, IT WAS FATAL
	JMP	BEG10		/NON-FILE STRUCTURED OUTPUT
	JMS I	 ERROR		/SIGNAL USER ERROR
	3
BEG10,	TAD	 "E-300 	/CHECK 2-PAGE EAE
	JMS I	 OPTION
	IAC
	DCA	EAEFLG
	TAD	 "F-300 	/CHECK FPNT
	JMS I	 OPTION
	IAC
	DCA	FPTFLG
	TAD	 "N-300
	JMS I	 OPTION
	IAC
	DCA	SYMFLG		/=1, NO ADDED SYMBOLS
	JMS I	 SYMBOL 	/YES, READ SYMBOLS
	DCA	PASS		/SET PASS=1
	JMS I	 MESG
	 MSG00
	JMS	BIN		/PASS THROUGH BINARY
	IAC			/SET PASS=2
	DCA	PASS
	CIF	10
	JMS I	 IOPEN		/RE-OPEN INPUT
	JMS	BIN		/AND PASS THROUGH BINARY AGAIN
	JMS I	 MESG
	 MSG001
	JMP	START		/AND GO AGAIN
BIN,	.-.
	CLA CLL
	DCA	BIN70
	JMS	BIN60		/GET A CHARACTER
	SKP CLA
	JMP	.-2		/WAIT FOR LEADER
	JMS	BIN60		/AND IGNORE IT
	JMP	.-1
BIN10,	DCA	CK
	TAD	FT		/GET THIS FIELD
	CIA			/CHECK AGAINST LAST FIELD
	TAD	FL		/IS IT SAME
	SNA CLA
	JMP	.+10		/YES, NO FIELD MESSAGE
	TAD	FT		/GET FIELD
	TAD	 1160		/I0 FOR %I0 IN MESSAGE
	DCA	MSG10A		/SAVE IN MESSAGE
	JMS I	 MESGA
	 MSG10			/PUT OUT FIELD MESSAGE
	TAD	FT		/LAST FIELD
	DCA	FL		/IS THIS FIELD
	TAD	CHAR		/GET CHARACTER
	DCA	W1		/AND SAVE IT
	JMS I	 GETA
	DCA	W2
	JMS	BIN60		/LOOK AHEAD
	JMP	BIN40		/TRAILER, END
	JMS	BIN50
	SNL
	JMP	BIN30
	DCA	PC		/ORIGIN
	JMS I	 CPA
	SKP
	JMS I	 PRTORG
BIN20,	TAD	W1
	TAD	W2
	TAD	CK
	JMP	BIN10
BIN30,	DCA	ME		/SAVE CONTENTS OF THIS LOC
	JMS I	 PROC		/PROCESS IT
	ISZ	PC		/BUMP THE PC
	NOP
	JMP	BIN20		/AND FIX THE CHECKSUM
BIN40,	JMS	BIN50
	CIA
	TAD	CK
	SNA CLA
	JMP I	BIN
	JMS I	 ERROR
	4
BIN50,	.-.
	TAD	W1
	CLL RTL
	RTL
	RTL
	TAD	W2
	JMP I	BIN50
BIN60,	.-.
	DCA	BIN50
	JMS I	 GETA
	TAD	 -376
	SPA SNA CLA
	JMP	.+4
	ISZ	BIN70
	CMA
	JMP	BIN60+1
	TAD	BIN70
	SZA CLA
	JMP	BIN60+2
	TAD	CHAR
	AND	 300
	TAD	 -200
	SPA
	ISZ	BIN60
	SPA SNA CLA
	JMP I	BIN60
	TAD	CHAR
	AND	 70
	CLL RTR
	RAR
	DCA	FT
	JMP	BIN60+2
BIN70,	0-0
	PAGE
	JMP I	.+1		/COMMON EXIT
PROC,	.-.			/PROCESS THE CONTENTS OF A WORD
	JMS I	 CPA		/CHECK PASS NUMBER
	SKP
	JMS I	 PRTLBL 	/PRINT LABEL
	TAD	ME		/GET THE CONTENTS OF THE WORD
	SNA
	JMP I	 PROCZ		/PROCESS A ZERO
	CLL RTL
	RTL
	AND	 7		/GET INSTRUCTION TYPE
	DCA	TP		/INSTRUCTION TYPE
	TAD	TP
	TAD	 JMP	PROC10	/BUILD JMP
	DCA	.+1		/AND EXECUTE IT
	0-0
PROC10, JMP	PROC20		/AND
	JMP	PROC20		/TAD
	JMP	PROC20		/ISZ
	JMP	PROC20		/DCA
	JMP	PROC20		/JMS
	JMP	PROC20		/JMP
	JMP	PROI10		/IOT
	JMP	PROO10		/OPR
PROC20, TAD	ME		/GET CONTENTS
	AND	 400		/CHECK INDIRECT
	DCA	PI
	TAD	ME
	AND	 200		/CHECK PAGE 0
	DCA	PZ
	TAD	ME
	AND	 177		/GET PAGE OFFSET
	DCA	OF		/AND SAVE IT
	TAD	PZ		/PAGE ZERO?
	SZA CLA 		/SKIP IF YES
	TAD	PC		/GET PC
	AND	 7600		/FORM PAGE BOUNDARY
	TAD	OF		/AND NOW ACTUAL ADDRESS
	DCA	MR		/STORE MR ADDRESS
	TAD	PZ
	SNA CLA
	JMP	PROC30		/TREAT PAGE 0 AS FORCED REFERENCE
	TAD	PI
	SZA CLA
	JMP	PROC30		/TREAT INDIRECT AS FORCED REFERENCE
	TAD	PC		/GET PRESENT ADDRESS
	CIA
	TAD	MR		/-REFERENCE ADDRESS
	DCA	OF1
	TAD	OF1
	SPA
	CIA
	DCA	OF2
	TAD	OF2
	AND	 7770
	SZA CLA
	JMP	PROC30		/FORCE LIKE INDIRECT
	JMS I	 CPA
	JMP I	 PROC-1 	/IF PASS1, THIS IS IT
	TAD	MR		/GET THE ADDRESS
	JMS I	 SRCSYM 	/TRY FOR A SYMBOL
	SKP			/NO, THEN .+X OR .-X
	JMP	PROC40-1	/GOT ONE
	TAD	 PRTOFF 	/FORCE WHERE TO GO
	JMP	PROC40		/AND GO AROUND STUFF
PROC30, TAD	MR		/TRY FOR A SYMBOL
	JMS I	 SRCSYM
	SKP
	JMP	PROC40-1	/YES, SET PRINT UP
	JMS I	 CPA
	JMP	PROC70		/ADD ON PASS 1
	TAD	 POCTL-PRTSYM	/NO SYMBOL, THEN OCTAL
	TAD	 PRTSYM 	/GOT ONE
PROC40, DCA	PRO110		/SAVE WHERE TO GO
	JMS I	 CPA
	JMP I	 PROC-1 	/DONE
	TAD	MR		/CHECK REFERENCE LOC 0
	SNA CLA
	JMP	PROC80		/REFERENCE LOC 0, PROBABLY CONST
	TAD	 PRO100 	/GET POINTER
	TAD	TP		/ADD IN INSTRUCTION TYPE
	DCA	PROC50
	TAD I	PROC50
	DCA	PROC50
	JMS I	 MESGA
PROC50,  0-0			/INSTRUCTION
	TAD	PI		/CHECK INDIRECT
	SNA CLA
	IAC
	TAD	 MSG50		/INDIRECT TAB OR JUST TAB
	DCA	.+2
	JMS I	 MESGA
	 0-0
	TAD	MR		/GET MEMORY REF ADDRESS
PROC60, JMS I	PRO110		/SYMBOL OR OCTAL OR OFFSET
	JMP I	 PROC-1 	/DONE
PROC80, TAD	 POCTL
	DCA	PRO110
	TAD	ME
	JMP	PROC60
PROC70, TAD	SYMFLG		/GET SYMBOL FLAG
	SNA CLA
	JMP I	 PROC-1 	/DO NOT ADD SYMBOLS
	TAD	 SYMBOL-13	/POINTER TO START OF SYMBOL
	DCA	AX
	TAD	 "Z
	DCA I	AX
	TAD	 "Z
	DCA I	AX
	TAD	MR		/GET ADDRESS
	JMS I	 MOCTL		/MOVE IN THE OCTAL STUFF
	JMS I	 ADDSYM 	/ADD THE SYMBOL
	JMP I	 PROC-1 	/AND EXIT
PRO110, 0-0
	PAGE
PROI10, JMS I	 CPA
	JMP I	 PROC-1
	TAD	ME
	AND	 7707		/CHECK FOR CDF OR CIF COMBO
	CIA
	TAD	 CDF
	SZA
	JMP	.+4
	JMS I	 MESGA
	 MSG200
	JMP	PROI20
	TAD	 CIF-CDF
	SZA
	JMP	.+4
	JMS I	 MESGA
	 MSG210
	JMP	PROI20
	TAD	 CDF!CIF-CIF
	SZA
	JMP	PROO10
	JMS I	 MESGA
	 MSG220
PROI20, TAD	ME
	AND	 70
	JMS I	 POCTL
	JMP I	 PROC-1
PROO10, JMS I	 CPA		/CHECK PASS
	JMP I	 PROC-1
	TAD	ME		/GET CONTENTS
	JMS I	 SRCSYM 	/CHECK SYMBOL
	JMP	.+3		/NO SYMBOL
	JMS I	 PRTSYM 	/PRINT IT
	JMP I	 PROC-1
	TAD	ME
	CIA
	DCA	TM
	TAD	 PROTBL-1
	DCA	AX
PROO20, TAD I	AX
	SNA
	JMP	PROO30
	TAD	TM
	SNA CLA
	JMP	.+3
	ISZ	AX
	JMP	PROO20
	TAD I	AX
	DCA	.+2
	JMS I	 MESGA
	 0-0
	JMP I	 PROC-1
PROO30, TAD	ME		/GET CONTENTS
	JMS I	 POCTL		/PRINT IT
	JMP I	 PROC-1 	/COMMON EXIT
MESGA,	.-.
	CLA CLL
	TAD I	MESGA
	ISZ	MESGA
	DCA	.+4
	JMS I	 CPA		/CHECK PASS
	JMP I	MESGA		/NOTHING ON PASS 1
	JMS I	 MESG		/EVERYTHING ON PASS 2
	 0-0
	JMP I	MESGA

GETA,	.-.
	JMS I	 GET
	DCA	CHAR
	TAD	CHAR
	JMP I	GETA

CPA,	.-.
	CLA CLL
	TAD	PASS		/CHECK PASS
	SZA CLA
	ISZ	CPA
	JMP I	CPA

MOCTL,	.-.
	CLL RAL
	DCA	CPA		/SAVE THE VALUE
	TAD	 -4
	DCA	GETA
	TAD	CPA
	RAL
	RTL
	DCA	CPA
	TAD	CPA
	AND	 7
	TAD	 "0
	DCA I	AX
	ISZ	GETA
	JMP	MOCTL+5
	JMP I	MOCTL

	ZBLOCK	4		/4 OCTAL DIGITS
POCTL,	.-.
	DCA	MOCTL
	TAD	 POCTL-5
	DCA	AX
	TAD	MOCTL
	JMS	MOCTL
	TAD	 POCTL-5
	DCA	AX
	TAD	 -4
	DCA	GETA
	TAD I	AX
	JMS I	 PUT
	ISZ	GETA
	JMP	.-3
	JMP I	POCTL

PROCZ,	JMS I	 MESGA
	 MSG02
	JMP I	 PROC-1
	PAGE
	ZBLOCK	12
SYMBOL, .-.
	CLA CLL
	DCA	NS		/NO SYMBOLS
	TAD	 OUDEVH 	/LAST SYMBOL POINTER
	DCA	LS
	TAD	 "S-300
	JMS I	 OPTION
	JMP I	SYMBOL
SYM10,	TAD	 -6
	DCA	CT		/ONLY 6 CHARS
	TAD	 SYMBOL-13
	DCA	AX		/INTO SYMBOL BUFFER
	DCA I	AX
	ISZ	CT
	JMP	.-2
	TAD	 SYMBOL-13
	DCA	AX
	TAD	 -6
	DCA	CT
	JMS	SYM40		/GET ALPHA OR NUMERIC
	JMP	.-1		/NON ALPHAMERIC
	JMP	.+3
	JMS	SYM40		/GET ANOTHER
	JMP	.+4		/TERMINATOR
	DCA I	AX		/AND SAVE IT
	ISZ	CT
	JMP	.-4
	JMS	SYM40		/GET A TERMINATOR
	SKP CLA
	JMP	.-2
	TAD	 -5
	DCA	CT		/4 CHARACTERS
	DCA	SYMBOL-4	/CLEAR VALUE
	JMS	SYM50		/WAIT FOR
	JMP	.-1		/NUMERIC
	JMP	SYM20+3
SYM20,	DCA	SYMBOL-4	/SAVE VALUE
	JMS	SYM50		/GET A NUMBER
	JMP	SYM30
	DCA	CT+1		/SAVE IT
	TAD	SYMBOL-4
	CLL RTL
	RAL
	TAD	CT+1
	ISZ	CT
	JMP	SYM20
SYM30,	JMS	ADDSYM		/ADD SYMBOL
	JMP	SYM10		/AND GET ANOTHER

SYM40,	.-.			/GET A CHARACTER ALPHANUMERIC
	JMS I	 GETA
	TAD	 -200
	SNA
	JMP I	SYMBOL		/TRAILER, ALL DONE
	TAD	 -"0+200
	SMA CLA
	ISZ	SYM40
	TAD	CHAR		/GET SYMBOL BACK
	JMP I	SYM40

SYM50,	.-.			/GET A NUMBER
	JMS	SYM40
	JMP I	SYM50		/LEAVE WITH TERMINATOR
	TAD	 -"8
	SPA SNA CLA
	JMP	.+3
	TAD	CHAR
	JMP I	SYM50
	ISZ	SYM50
	TAD	CHAR
	AND	 7
	JMP I	SYM50
	PAGE
ADDSYM, .-.			/ADD SYMBOL TO TABLE
	CLA CLL
	TAD	 -4
	TAD	LS
	DCA	AX
	TAD	AX
	TAD	 -LLOC
	SNA CLA
	JMP I	ADDSYM		/CANT ADD
	TAD	AX
	DCA	LS
	TAD I	 SYMBOL-4
	DCA I	LS		/SAVE THE VALUE
	TAD	 SYMBOL-13
	DCA	AX+1
	TAD	 -3
	DCA	CT
ADD10,	TAD I	AX+1
	CLL RTL
	RTL
	RTL
	AND	 7700
	DCA	TM
	TAD I	AX+1
	AND	 77
	TAD	TM
	DCA I	AX
	ISZ	CT
	JMP	ADD10
	JMP I	ADDSYM

SRCSYM, .-.
	DCA	SYMBOL-4	/SAVE VALUE FOR SCAN
	STA
	TAD	LS
SRC10,	DCA	AX
	TAD I	AX
	CIA
	DCA	TM
	TAD	AX
	TAD	 -OUDEVH	/DONE
	SNA CLA
	JMP I	SRCSYM		/YES, EXIT
	TAD	TM
	TAD	SYMBOL-4
	SNA CLA
	JMP	.+4
	CLA CLL CML IAC RAL	/AC=3
	TAD	AX
	JMP	SRC10
	DCA	SYMBOL
	TAD I	AX
	DCA	SYMBOL-3
	TAD I	AX
	DCA	SYMBOL-2
	TAD I	AX
	DCA	SYMBOL-1
	ISZ	SRCSYM
	JMP I	SRCSYM
PRTSYM, .-.
	CLA CLL
	DCA I	 SYMBOL
	JMS I	 MESGA
	 SYMBOL-3
	JMP I	PRTSYM

PRTLBL, .-.
	JMS I	 MESGA
	 MSG01
	TAD	PC
	JMS I	 SRCSYM
	JMP	.+4
	JMS	PRTSYM
	JMS I	 MESGA
	 MSG20
	JMS I	 MESGA
	 MSG30
	JMP I	PRTLBL

PRTORG, .-.
	JMS I	 MESGA
	 MSG40
	TAD	PC
	JMS I	 POCTL
	JMP I	PRTORG

	MSG60;MSG70		/.+, .-
PRTOFF, .-.
	CLA CLL
	TAD	OF1		/CHECK + OR -
	SPA CLA
	IAC
	TAD	 PRTOFF-2
	DCA	.+4
	TAD I	.+3
	DCA	.+2
	JMS I	 MESGA
	 0-0
	TAD	OF2
	TAD	 "0
	JMS I	 PUT
	JMP I	PRTOFF
	PAGE
MSG00,	TEXT	@/DASM V 1.01 MRM 1/20/74%M%J@
MSG001, TEXT	@%M%J%I$END$%M%J%Z@
MSG01,	TEXT	@%M%J@
MSG02,	TEXT	@0@
MSG10,	TEXT	@%M%J%IFIELD%I0@
MSG10A=.-2
MSG20,	TEXT	@,@
MSG30,	TEXT	@%I@
MSG40,	TEXT	@%M%J%I*@
MSG50,	TEXT	@ I%I@
MSG60,	TEXT	@.+@
MSG70,	TEXT	@.-@
MSG100, TEXT	@AND@
MSG110, TEXT	@TAD@
MSG120, TEXT	@ISZ@
MSG130, TEXT	@DCA@
MSG140, TEXT	@JMS@
MSG150, TEXT	@JMP@
MSG200, TEXT	@CDF%I@
MSG210, TEXT	@CIF%I@
MSG220, TEXT	@CDF CIF%I@

PRO100, MSG100;MSG110;MSG120;MSG130;MSG140;MSG150
PROTBL, NOP;M1
	XLIST
	CLA;M2
	CLL;M3
	CMA;M4
	CML;M5
	RAR;M6
	RAL;M7
	RTR;M10
	RTL;M11
	IAC;M12
	SMA;M14
	SZA;M15
	SPA;M16
	SNA;M17
	SNL;M20
	SZL;M21
	SKP;M22
	OSR;M23
	HLT;M24
	CLA+400;M2
	CIA;M25
	LAS;M26
	STL;M27
	GLK;M30
	CLA CLL;M31
	CLA IAC;M32
	CLA CMA;M33
	CLL RAR;M34
	CLL RAL;M35
	CLL RTL;M36
	CLL RTR;M37
	SZA CLA;M40
	SZA SNL;M41
	SNA CLA;M42
	SMA CLA;M43
	SMA SNL;M44
	SPA SNA;M45
	SPA SZL;M46
	SPA CLA;M47
	SNA SZL;M50
	7401;M1
	7601;M2
	6001;M60
	6002;M61
	6214;M70
	6224;M71
	6234;M72
	6244;M73
	KSF;M100
	KCC;M101
	KRS;M102
	KRB;M104
	TSF;M106
	TCF;M107
	TPC;M110
	TLS;M112
	RSF;M114
	RRB;M115
	RFC;M116
	RRB RFC;M117
	PSF;M121
	PCF;M122
	PPC;M123
	PLS;M124
	0			/LIST TERMINATION

M1,	TEXT	@NOP@
M2,	TEXT	@CLA@
M3,	TEXT	@CLL@
M4,	TEXT	@CMA@
M5,	TEXT	@CML@
M6,	TEXT	@RAR@
M7,	TEXT	@RAL@
M10,	TEXT	@RTR@
M11,	TEXT	@RTL@
M12,	TEXT	@IAC@
M14,	TEXT	@SMA@
M15,	TEXT	@SZA@
M16,	TEXT	@SPA@
M17,	TEXT	@SNA@
M20,	TEXT	@SNL@
M21,	TEXT	@SZL@
M22,	TEXT	@SKP@
M23,	TEXT	@OSR@
M24,	TEXT	@HLT@
M25,	TEXT	@CIA@
M26,	TEXT	@LAS@
M27,	TEXT	@STL@
M30,	TEXT	@GLK@
M31,	TEXT	@CLA CLL@
M32,	TEXT	@CLA IAC@
M33,	TEXT	@STA@
M34,	TEXT	@CLL RAR@
M35,	TEXT	@CLL RAL@
M36,	TEXT	@CLL RTL@
M37,	TEXT	@CLL RTR@
M40,	TEXT	@SZA CLA@
M41,	TEXT	@SZA SNL@
M42,	TEXT	@SNA CLA@
M43,	TEXT	@SMA CLA@
M44,	TEXT	@SMA SNL@
M45,	TEXT	@SPA SNA@
M46,	TEXT	@SPA SZL@
M47,	TEXT	@SPA CLA@
M50,	TEXT	@SNA SZL@
M60,	TEXT	@ION@
M61,	TEXT	@IOF@
M70,	TEXT	@RDF@
M71,	TEXT	@RIF@
M72,	TEXT	@RIB@
M73,	TEXT	@RMF@
M100,	TEXT	@KSF@
M101,	TEXT	@KCC@
M102,	TEXT	@KRS@
M104,	TEXT	@KRB@
M106,	TEXT	@TSF@
M107,	TEXT	@TCF@
M110,	TEXT	@TPC@
M112,	TEXT	@TLS@
M114,	TEXT	@RSF@
M115,	TEXT	@RRB@
M116,	TEXT	@RFC@
M117,	TEXT	@RRB RFC@
M121,	TEXT	@PSF@
M122,	TEXT	@PCF@
M123,	TEXT	@PPC@
M124,	TEXT	@PLS@
	XLIST
	PAGE
LLOC=.
	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



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