File: OS8.PA of Tape: Sources/RTS/s3
(Source file text) 

/OS/8 SUPPORT TASK FOR RTS-8 WM

TASK=	OS8
CUR=	0	
INIWT=	0
PARTNO=	0
CPABLE=	1
WRITE=	1

TS8LOC=	200	/LOCATION IN RTS-8
CINT=	6204	/CLEAR USER INTERRUPT FF
SINT=	6254	/SKIP ON USER INTERRUPT
CUF=	6264	/CLEAR USER BUFFER FF.
SUF=	6274	/SET USER BUFF.FF.;NO INTS TILL JMPS;UBFF>USER FIELD FF.
DPSZ=	7451	/FOR EAE MODE TEST

KSFX=	OSKBDV^10+6001
KCCX=	OSKBDV^10+6002
KRSX=	OSKBDV^10+6004
KRBX=	OSKBDV^10+6006
TSFX=	OSTTDV^10+6001
TCFX=	OSTTDV^10+6002
TSKX=	OSTTDV^10+6005
TLSX=	OSTTDV^10+6006

PSKF=	6661		/LINE PRINTER IOT'S
PSKI=	6665		/FOR MODIFIED TTY INTERFACE
PSLS=	6666
PSSE=	6651		/SKIP ERROR
PSCE=	6652		/CLEAR ERROR
PSIE=	6655		/SET/CLEAR INTENA

/LINE PRINTER OUTPUT ROUTINE - USES RTS-8 LPT DRIVER

	IFDEF	LPT	<
XLLS,	TAD	AC
	DCA I	LPBUF	/STORE CHAR IN LPT MESSAGE BUFFER
	ISZ	LPBUF
	TAD	AC
	AND	(177
	TAD	(-15	/CHECK TO SEE IF THE CHARACTER
	CLL
	TAD	(3	/IS A FORMS MOVEMENT CHARACTER
	ISZ	LPBUFC	/(I.E. LF,VT,OR FF)
	SZL CLA		/OR IF THE MESSAGE BUFFER IS FULL
	SKP CLA
	JMP I	(XNOP	/NEITHER - RETURN TO OS/8 JOB
	DCA I	LPBUF	/ZERO IS THE BUFFER END CODE
	CAL
	SENDW		/MOVE THE BUFFER TO THE LINE PRINTER
	LPT
	LPMESG
	TAD	(LPTBUF
	DCA	LPBUF	/RE-INITIALIZE THE BUFFER PPOINTER
	TAD	(-LPTCNT
	DCA	LPBUFC	/AND COUNTER
	JMP I	(XNOP	/AND CONTINUE

LPBUF,	LPTBUF
LPBUFC,	-LPTCNT
/THIS MUST GO SOMEWHERE ELSE IN A RESIDENT PART
/LPTCNT=			/AS MUCH AS I CAN SPARE RIGHT NOW
/LPMESG,	ZBLOCK	3
/	6000		/UNPACKED ASCII, NO CRLF
/	0		/DUMMY INPUT BUFFER WORD
/LPTBUF,	ZBLOCK	LPTCNT+1	/ASSURE A ZERO AT THE END
	>

	FIELD 0
	*5200
/TABLE OF CORRESPONDENCES BETWEEN OS/8 CODE NUMBER AND TASK NUMBER

HNDTAB,	ZBLOCK	20	/FIRST WORD IS UNUSED - MUST BE 0
FLAGS,		/LIST OF ALL OS8 FLAGS
TSFEF,	0	/TTY OUTPUT FLAG
KSFEF,	1	/TTY INPUT FLAG
	NFLAGS=	.-FLAGS

CAFLGS,	0	/SUB EMULATING 'CAF'; CLEAR FLAGS ETC.
	DCA	AC
	DCA	IONSW	/IOF
	DCA	INTSW	/NO INTERRUPT REQUESTS
	TAD	(DEVSTA-1
	DCA	UTEMP
	TAD	(FLAGS-1
	DCA	OP
CAFLOP,	ISZ	UTEMP	/LOOP FOR SETTING INITIAL IONOFF
	TAD I	UTEMP
	SNA
	JMP I	CAFLGS	/0 IS END OF DEVSTA LIST
	AND	(3777	/KILL ION BIT
	CLL RAL
	SPA		/TEST INIT ION BIT
	STL		/SET ION
	RAR
	DCA I	UTEMP
	TAD I	UTEMP	/GET # OF FLAGS TO CLEAR
	AND	K7
	CIA
	DCA	CHKINT
	ISZ	OP
	CLA IAC
	DCA I	OP
	ISZ	CHKINT	/SET ALL FLAGS TO SLEEP
	JMP	.-4
	JMP	CAFLOP	/NEXT DEVICE

/FORMAT OF DEVSTA LIST: 2000 IF INIT ION + 000N
/N=NUMBER OF FLAGS PER DEVICE,BITS 3-8 FREE FOR FUTURE USE?

DEVSTA,	2000+2	/DEVICE # 1 = TTY
	0	/END OF LIST

XCAF,	JMS	CAFLGS	/USE ROUTINE ALSO USED BY OS8BOOT
	JMP I	(XNOP
/TASK ONE LEVEL HIGHER THAN OS8 TO RECOGNIZE INTERRUPTS

TASK2=	OS8I
CUR2=	0
INIWT2=	0

START2,	CAL
	WAITE
	OS8INT		/INITIALIZED TO 1
	ISZ	OS8INT
	TAD	IONSW	/INTERRUPT ON?
	SNA CLA
	JMP	START2	/NO IGNORE; FLAG ALREADY SET
	STA
	DCA	INTSW	/YES; SET INTERRUPT REQUEST
	TAD	USERSW	/ARE WE OUT OF CONTROL?
	SNA CLA		/NO; INTERPRETING : WILL CATCH INTSW ON EXIT
	JMP	START2
	DCA	USERSW	/YES; DERAIL OS8 INTO CONTROL
	TAD I	(OS8^4+TSTABL
	AND	(6000
	DCA	LNKGT
	DCA I	(OS8^4+TSTABL
	TAD I	(OS8^4+TSTABL+1
	DCA	PC
	TAD	(GOBACK
	DCA I	(OS8^4+TSTABL+1
	TAD I	(OS8^4+TSTABL+2
	DCA	AC
	DCA I	(OS8^4+TSTABL+2
	JMP	START2
/CALLED FROM GOBACK WHEN INTSW SET; TEST IF INTREQ PENDING
/IF SO, GENERATE SOFTWARE INTERRUPT

CHKINT,	0
	ION		/GIVE HIM ONE MORE CHANCE
	JMS I	(INTREQ
	IOF		/WATCH OUT NOW!
	SZA CLA
	JMP	GOTINT	/GOT ONE
			/ONE LAST CHANCE IF INTERRUPT
	ISZ	INTSW	/CAME UP DURING LIST TEST
	JMP I	CHKINT	/TOO BAD; ALL THIS FOR NOTHING
GOTINT,	DCA	IONSW	/CLEAR THESE FLAGS NOW
	DCA	INTSW
	ION
	TAD	UIF
	TAD	UDF
	DCA	SFR	/SET SOFT SAVE FIELD
	DCA	UDF
	DCA	UCDF	/SET DF = 0 ; 'HNDRET' WILL DO REST
	CDF	OS8F0
	DCA	WT
	TAD	PC	/'JMS 0'
	DCA I	WT
	CLA IAC
	DCA	PC
	JMP I	(HNDRET

INTSET,	TAD	(DEVSTA-1	/ION FOR SPECIFIED DEVICE IN AC
	DCA	UTEMP
	TAD I	UTEMP
	AND	(3777
	SZL		/LINK SAYS IF ION OR OFF
	TAD	(4000
	DCA I	UTEMP
	SNL
	JMP I	(XNOP	/IOF; DON'T CHECK FOR REQUEST
	SKP
XSKPI,	ISZ	PC	/SKIPPING POSSIBILITY FOR
	NOP
XNOPI,	TAD	IONSW	/INTERRUPT REQUEST
	SNA CLA		/NO ION : NO REQUEST
	JMP I	(XNOP
	STA
	DCA	INTSW	/LET'S HOPE FOR THE BEST
	JMP I	(XNOP

	PAGE
/TELETYPE OUTPUT HANDLER

XTLSUB,	0		/ROUTINE TO OUTPUT CHAR IN AC
	DCA	XTLTEM	/SAVE CHAR
	TAD	OWCNT
	TAD	(OWLEN
	SNA CLA		
	JMP	.-3	/WAIT FOR BUFFER TO HAVE SPACE
	TAD	XTLTEM
	DCA I	OWPUT
	TAD	OWPUT	/STORE CHAR IN BUFFER AND BUMP POINTER
	IAC
	AND	(-OWLEN-1
	DCA	OWPUT
	CIF 0		/DELICATE CODE AHEAD
	STA CLL
	TAD	OWCNT
	DCA	OWCNT	/BUMP BUFFER COUNT
	TAD	XTLTEM
	SNL
	TLSX		/PRINT IF FIRST CHAR IN BUFFER
	CLA
	TAD	OWCNT
	TAD	(OWLEN	/ANY SPACE LEFT?
	SNA CLA
	IAC		/NO SET FLAG
	DCA I	(TSFEF	/YES; CLEAR FLAG
	JMP I	XTLSUB
XTLTEM,	0
XTSF,	TAD I	(TSFEF
	SNA CLA		/BUFFER FULL?
	JMP I	(XSKP	/NO - SKIP RETURN
	TAD	(TSFEF
EFWAIT,	DCA	EF	/GENERAL IOT WAIT ROUTINE
	CLA IAC
	TAD	PC
	DCA	WT
	TAD	PC
	AND	(177	/CHECK IF NEXT LOCATION IS A "JMP .-1" -
	TAD	(5200
	CIA
	CCIF
	TAD I	WT	/IF IT IS WE SHOULD HANG
	SZA CLA		/OTHERWISE DO A NON-SKIP RETURN
	JMP I	(XNOPI
	CAL
	WAITE
EF,	0
	JMP I	(XSKPI	/DO A SKIP RETURN AFTER WAITING

XTCF,	CLA IAC
XTFL,	DCA I	(TSFEF
	JMP I	(XNOPI

XTLS,	CLA IAC
	DCA I	(TSFEF
XTPC,	TAD	AC
	JMS	XTLSUB	/CALL SUBROUTINE USED TO PRINT ERRORS
	JMP I	(XNOPI	/KEEP ON TRUCKING

XTSK,	AC0001		/DEV # 1
	JMS I	(INTREQ
	SZA CLA
	ISZ	PC
	JMP I	(XNOP
/TELETYPE OUTPUT INTERRUPT ROUTINE

TTINT,	ZBLOCK	2
	IFZERO	PDP8E	<TSFX>
	IFNZRO	PDP8E	<TSKX>
	JMP I	TTINT
	CDF CIF 0
	IFNZRO	PDP8E	<
	TSFX		/KEYBOARD OR PRINTER?
	JMP I	(KBINT	/KEYBOARD
	>
	TCFX		/CLEAR PRINTER FLAG
	TAD	OWCNT
	SMA CLA		/IGNORE UNSOLICITED INTERRUPTS (LA30)
	POSTDS
	TAD	OWGET
	IAC
	AND	(-OWLEN-1
	DCA	OWGET
	TAD I	OWGET
	ISZ	OWCNT
	TLSX		/PRINT NEXT CHAR FROM BUFFER
	STA
	TAD	OWCNT
	TAD	(OWLEN
	SNA CLA		/IF BUFFER JUST BECAME UNFULL,
	TAD	(TSFEF	/SET EVENT FLAG
POSTIO,	SNA		/GENERAL  IO INTERRUPT DISMISS
	POSTDS		/NO FLAG, JUST DISMISS
	DCA	EFTST	/STORE ADDRESS OF FLAG
	AC4000
	AND I	EFTST	/ARE WE WAITING ON FLAG?
	SNA CLA
	JMP	.+3	/NO
	TAD	EFTST	/YES;POST IT
	POSTDS
	DCA I	EFTST	/CLEAR FLAG
	TAD	(OS8INT	/AND SEE IF WE WANT INTERRUPT
	POSTDS

EFTST,	0
OWGET,	OWBASE
OWPUT,	OWBASE
OWCNT,	0
XLOOK,	CCIF		/GETS WORD FROM REAL FIELD
	ISZ	PC
	TAD I	PC
	AND	(70
	TAD	21	/DCDF LOCATION IN RTSMON
	DCA	.+1	/CHANGE TO SPECIFIED FIELD
	HLT
	TAD I	AC	/ADRESS IN AC
	JMP I	(XACSTO	/CONTENTS IN AC

INTSDV,	TAD	(INTSOP-RTSOP
RTSDV,	TAD	(RTSOP
	JMP I	(SPCIOT	/AND SO ON

	PAGE
/INITIALIZATION CODE - OVERWRITTEN BY RING BUFFERS

START,	CAL
	SKPINS
	TTINT		/LINK IN OS/8 TELETYPE
	IFZERO	PDP8E	<
	CAL
	SKPINS
	KBINT
	>

OWBASE=	START
OWLEN=	20

IRBASE=	OWBASE+OWLEN
IRLEN=	10
IREND=	IRBASE+IRLEN

	CDF CIF OS8F0	/OS/8 INITIALIZATION CODE LOADS
	JMS I	OSINIT	/INTO OS/8 FAKE FIELD 0
	DCA	WD	/TELL OSBOOT ABOUT START
	TAD	BOOTAD
	CAL
	POST
	CDF CUR
	HLT		/WE NEVER COME BACK HERE!
BOOTAD,	BOOTEF
OSINIT,	INITOS

	IFNZRO IRBASE&IRLEN	<IRBNDY,__ERROR__>
	IFNZRO	OWBASE&OWLEN	<OWBNDY,__ERROR__>
	IFNZRO	.-IREND&4000	<ZBLOCK IREND-.>

/THIS IS CALLED FROM OSBOOT TO RESTART OS8
HNDRET,	TAD	UDF
	CLL RTL
	RAL
	DCA	UIF
	TAD	UIF
	DCA	IBR	/FOR COMPLETE SIMULATION
	TAD	UIF
	TAD	(CDF OS8F0
	DCA	UCIF
	JMP I	(COMBAC
/KEYBOARD HANDLER
XKSF,	TAD I	(KSFEF
	SNA CLA		/INPUT BUFFER EMPTY?
	JMP I	(XSKP	/NO - SKIP
	TAD	(KSFEF
	JMP I	(EFWAIT	/YES - WAIT

XKRB,	STA
	DCA	REDFLG
	TAD I	IRGET
XKCC,	DCA	AC
XKCF,	ISZ	REDFLG	/IF CHAR WAS READ GET NEXT
	JMP I	(XNOP	/NO - IGNORE
	CIF 0
	TAD I	(KSFEF
	SZA CLA
	JMP I	(XNOP	/DON'T READ FROM EMPTY BUFFER
	ISZ	IRCNT
	SKP
	IAC
	DCA I	(KSFEF	/IF BUFFER NOT EMPTY, POST FLAG
	TAD	IRGET
	IAC
	AND	(-IRLEN-1
	DCA	IRGET
	JMP I	(XNOPI

XKRS,	STA
	DCA	REDFLG	/THIS CHAR WAS READ;
	TAD I	IRGET	/NEXT KCC WILL GET NEXT
	JMP I	(XOR	/OR CHAR INTO AC

XKIE,	TAD	AC	/SET OR CLEAR INTENA
	RAR
	CLA IAC		/DEV #1:STANDARD CALL FOR INTSET
	JMP I	(INTSET
KBINT,	IFZERO	PDP8E	<
	0;0		/LINKAGE INTO SKIP CHAIN
	KSFX
	JMP I	KBINT
	CDF CIF 0
	>
	KRBX
KBSTOR,	DCA I	IRPUT
	TAD I	IRPUT
	AND	(177
	CLL
	TAD	(-4	/IF ^A,^B,^C IS TYPED,
	SNL
	JMP	CHKCTA	/CHECK ON ^A BREAK
	TAD	(4-17	/17=^O
	CLL RAR		/ODD BIT IN LINK
	SNA
	JMP	CTLCHR	/^O AND ^P
	AND	(7774	/ALLOW 2 BITS=8 CHARS
	SZA CLA
	JMP	NOCTRC
	SZL		/THROW OUT ^R,^T,^V
	JMP	NOCTRC	/WE ARE LEFT WITH ^Q,^S AND ^U
CTLCHR,	TAD	IRPUT	/MAKE IT THE ONLY CHAR IN THE BUFFER
	DCA	IRGET
	DCA	IRCNT
NOCTRC,	TAD	IRPUT	/UPDATE PUT POINTER
	IAC
	AND	(-IRLEN-1
	DCA	IRPUT
	TAD	IRCNT
	CIA CLL
	AND	(-IRLEN-1	/BUMP CHAR COUNT MOD IRLEN
	CMA
	DCA	IRCNT
	SZL
	TAD	(KSFEF	/IF FIRST CHAR IN BUFFER SET EVENT FLAG
	JMP I	(POSTIO	/OTHERWISE JUST DISMISS

CHKCTA,	TAD	(3	/IS IT ^A?
	SZA CLA
	JMP	CTLCHR	/NO: ^B OR ^C
	DCA	WD	/SIGNAL RESTART
	TAD	(BOOTEF
	POSTDS		/START BOOT JOB OF HIGHER PRIORITY

REDFLG,	0
IRGET,	IRBASE
IRPUT,	IRBASE
IRCNT,	0

	PAGE
/ILLEGAL IOT HANDLER - PRINT MESSAGE AND RETURN TO KEYBOARD MONITOR

ILLIOT,	0		/SO WE KNOW WHERE THE ERROR CAME FROM
	CLA CLL
	CDF 0
	TAD	(BOOTEF	/START BOOT JOB
	CAL
	POST
	CDF CUR
	HLT		/IT DOES NOT RETURN HERE

CHNGDF,	TAD	UDF	/BUILD NEW UCDF
	CLL RTL
	RAL
	TAD	(CDF OS8F0
	DCA	UCDF
	JMP	UCDF
/MISCELLANEOUS ROUTINES
XEAE,	BSW		/COMES IN WITH EAE BITS
	CLL RAL		/HIGH ORDER EAE BIT IN LINK
	DCA	WT	/IF LOW ORDER EAE BITS ALL SET = 3400
	SWP
	DCA	OP	/SAVE MQ IN OP
	DPSZ		/NOW TEST MODE: AC & MQ = 0
	JMP	MODEA	/NO SKIP IS OLD EAE
MODEB,	TAD	WT	/IT SKIPPED, GET BACK EAE BITS
	SZL		/IF HIGH ORDER EAE BIT IS SET
	JMP	DBLPRC	/IT IS A NEW DOUBLE PREC. INST.
	RTL
	SNA
	JMP	SNGWRD	/NMI IS A SINGLE WORD INSTRUCTION
	RTL
DBLPRC,	SNA		/WE JUMP INTO TEST HERE WITH ALL BITS
	JMP	SNGWRD	/ASC AND (SCA IN DBLPRC MODE) ALSO
	CLL		/SNGPRC MODEB DROPS IN HERE WITH A SMALL NUMBER
	TAD	(-1400	/TEST IF .GE. SWBA
	SZL CLA
	JMP	SNGWRD	/YES: NEW DBLPRC SNGWRD INSTS.
DBLWRD,	CLA IAC		/OK; ALL THIS DOUBLE WORD INSTS.
	TAD	PC	/BUMP PC TO SECOND WORD
	DCA	WT	/STORE IN STANDARD LOC
	CCIF
	TAD I	WT	/FETCH SECOND WORD
	DCA	WD+1	/STORE IN EXEC; XINLIN WILL RESET TO 'SKP'
	CCDF		/SET USER DATA FIELD FOR EAE ACCES
SNGWRD,	TAD	OP	/FROM HERE ON ALSO SNGWRD INSTS.
	MQL		/RELOAD MQ
	JMP I	(XINLIN	/REJOIN MAIN LOOP IN EMULAT

MODEA,	AC6000		/TEST FOR MODE A DBLWRD INSTS.
	RTR		/GIVES 1400
	AND	WT	/ONLY NMI&SCA DO NOT HAVE THESE BITS
	SZA CLA		/SET AND ONLY NMI&SCA ARE SNGWRD
	JMP	DBLWRD
	JMP	SNGWRD

XSKON,	TAD	IONSW
	SZA CLA
	ISZ	PC
C200,	200
XIOF,	DCA	IONSW
	DCA	INTSW
	JMP I	(XNOP

XION,	TAD	C200
	DCA	IONSW
	STA
	DCA	INTSW
	CLA IAC
	TAD I	(EXECUT	/WE NEED ONE LEVEL OF RECURSIVENESS
	DCA	ILLIOT	/FOR THIS INST. (RMF,ION SEQUENCE)
	ISZ	PC
C77,	77
	JMS I	(EMULAT	/DELAY ION TURN ON BY ONE
	CDF 0		/CAREFUL! DF MAY BE SET
	TAD	(CIFHNG
	DCA I	(EMULAT
	JMP I	ILLIOT

XSRQ,	JMS I	(INTREQ
	SZA CLA
XSKP,	ISZ	PC
	JMP I	(XNOP

XGTF,	DCA	AC
	JMS I	(INTREQ
	TAD	LNKGT
	TAD	IONSW
XRIB,	TAD	SFR
	JMP I	(XOR

XRTF,	TAD	AC
	AND	(6000	
	DCA	LNKGT
	TAD	C200
	DCA	IONSW
	STA
	DCA	INTSW
	TAD	AC
	AND	C77
	DCA	SFR
XRMF,	TAD	SFR
	AND	K7
	JMS I	(FLDTST
	DCA	UDF
	DCA 	UCDF
	TAD	SFR
	CLL RTR
	RAR
	AND	K7
	JMP I	(FRMF

XRDF,	TAD	UDF
	CLL RTL
	RAL
	SKP
XRIF,	TAD	UIF
XOR,	DCA	WT	/GENERAL OR WITH AC
	TAD	AC
	CMA
	AND	WT
	TAD	AC
XACSTO,	DCA	AC
	JMP I	(XNOP

	PAGE
/ TSS/8 INTERRUPT HANDLER

TSINT,	DCA	AC
	DCA	USERSW	/RESET NO CONTROL FLAG
	DCA	INTSW
	GTF
	AND	(6000
	DCA	LNKGT
	STA
	TAD	0
	DCA	PC	/SAVE PC,AC,LINK,GT FROM INTERRUPT
	CINT		/CLEAR USER INTERRUPT FLAG
	ION		/RESTORE INTERRUPTS
	JMS	EXECUT	/EXECUTE ONE IOT
	OS8ERR		/ILLEGAL AT INTERRUPT LEVEL
GOBACK,	IOF
	ISZ	INTSW
	SKP
	JMS I	(CHKINT
	TAD	LNKGT	/GENERAL OS8 STARTUP
	/OR 'JMP EMUALL' FOR TOTAL EMULATION
	TAD	UIF
	TAD	UDF
	TAD	(OS8F0%10+OS8F0+100
	RTF
	DCA	USERSW	/SET NO CONTROL SWITCH
	TAD	AC
	JMP I	PC	/GO TO OS/8 IN USER MODE
EMUALL,	DCA	INTSW	/RESET IT NOW
	ION
	JMP I	.+1
	CIFHNG		/INTO EMULATE LOOP

JMPEMU=	JMP	EMUALL
TADLNK=	TAD	LNKGT
XSEM,	TAD	(JMPEMU-TADLNK
XCEM,	TAD	(TADLNK		/SET OR CLEAR EMULATION
	DCA	GOBACK+4
	JMP	XNOP
/EXECUTE A TRAPPED IOT OR OSR
/CALLED FROM TRAP ROUTINE AND FROM CIF INTERPRETER ("RECURSIVELY")
/FIRST RETURN NOT IOT OR OSR;SECOND RETURN IOT WAS EXECUTED

EXECUT,	0
UCIFX,	HLT		/CDF TO USERS INSTRUCTION FIELD
	TAD I	PC
	CDF 0
	DCA	WD	/ALWAYS STORE INST. IN 'WD'
	CLL
	TAD	WD	/GET TRAP INSTRUCTION
	AND	K7700
	TAD	(-6200	/CHECK FOR MEMORY GROUP
	SZA
	JMP	TSTMOR	/GO CHECK OTHER THINGS
	TAD	WD	/QUEER 20 DEVICE CODE
	CLL RTR
	RAR
	AND	K7	/THIS GIVES THE X OF THE 2X GROUP
	DCA	OP	/WE DECLARE THIS AS OPERATION CODE
	TAD	WD
	AND	K7	/AND CHANGE THE OPERATION CODE
	TAD	(JMP I	LIST20
	DCA	.+1
	HLT		/GO THERE QUICKLY
	/**__________________
TSTMOR,	TAD	(200
	SNL		/IF ITS NOT IOT OR OPR,THE PREVIUOS
	JMP	MBERR	/INST WAS SKP HLT - MAYBE ERROR
	CLL RTL
K7700,	SMA CLA		/TEST IOT OR OPR
	JMP	IOTS	/IOT'S
	TAD	WD	/OPERATES
	AND	(407
	TAD	(-404	/OSR ONLY LEGAL OPR
MBERR,	SZA CLA		/CLEARS AC FROM 'MBERR'
	JMP I	EXECUT	/ERROR RETURN (MAYBE)
SIMTST,	CLL RAR		/TEST IF ONE
	SZA CLA
	JMP	XNOP	/NO-VALUES OD 2-3777
SIMULA,	TAD	AC	/SIMULATE IOT WHICH CHANGES THE AC
	JMS	EXEC
	DCA	AC
	JMP	XERET
	/**--------------
XCDF,	TAD	OP
	TAD	(-OSFLDS
	SMA
	JMP	.-2	/REDUCE MODULO OSFLDS
	TAD	(OSFLDS
	DCA	UDF
	DCA 	UCDF	/TELL IT TO RECALCULATE NEXT TIME
XNOP,	ISZ	PC
K77,	77
XERET,	ISZ	EXECUT	/NO ERROR RETURN
	JMP I	EXECUT	/LEAVE EXECUT WITH PC BUMPED

IOTS,	TAD	WD	/IOT
	AND	K7	/OPERATION CODE
	DCA	OP
	TAD	WD
	CLL RTR
	RAR
	AND	K77	/DEVICE CODE
	TAD	(DEVLST
	DCA	WT	/POINTER TO DEVICE LIST
	TAD I	WT
	SNA
	OS8ERR		/NOT DEFINED IN LIST; ERROR
	SMA	/**K**  OPCODE LISTS MUST RESIDE ABOVE 4000
	JMP	SIMTST
SPCIOT,	TAD	OP	/OFFSET ADDED FOR OP CODE LIST
	DCA	WT
	TAD I	WT
	SNA
	OS8ERR		/OP CODE NOT DEFINED ERROR
	DCA	WT
	JMP I	WT	/GO THERE
	/**__________________
LIST20,	HCALL
	XCDF
	XCIF
	XCDI
	INTSDV
	RTSDV
	0
	0

	PAGE
/CODE TO HANDLE CDF'S AND CIF'S

XCDI,	TAD	OP
	JMS	FLDTST
	DCA	UDF
	DCA 	UCDF	/RESET CDF SUBR
XCIF,	TAD	OP
FRMF,	JMS	FLDTST
	CLL RTL
	RAL
	DCA	IBR	/SAVE IF BACKUP
	ISZ	PC
	JMS	EMULAT	/EMULATE TILL A JMP OR JMS ENCOUNTERED
CIFHNG,	JMP	.-1

EMULAT,	0
	JMS I	(EXECUT
SKPOPR,	SKP		/NOT IOT OR OSR;TREAT FURTHER
	JMP I	EMULAT
	CLL
	TAD	WD
	SPA
	JMP	NONSTD
	JMS	GEFADR	/GET EFFECTIVE ADDRESS
	TAD	WD
	AND	K7000	/ISOLATE OPCODE
	TAD	(AND I	WT	/FORM EQUIVALENT INSTRUCTION
	DCA	WD
	JMP	XINLIN	/AND EXECUTE IT IN LINE

FLDTST,	0
	TAD	(-OSFLDS
	SMA
	OS8ERR		/DOMAIN OVERFLOW
	TAD	(OSFLDS
	JMP I	FLDTST
/SUBROUTINE TO COMPUTE EFFECTIVE ADDRESSES;COME IN WITH 'WD'

GEFADR,	0
	AND	(177
	DCA	WT
	TAD	WD
	AND	(200
	CIA
	AND	PC
	TAD	WT
	DCA	WT	/ADD PAGE BITS TO DISPLACEMENT
	CCIF
	TAD	WD
	AND	(400
	SNA CLA		/IF NO INDIRECT ADDRESS,
	JMP I	GEFADR	/OPERAND FIELD = IF
	TAD	WT
	AND	(7770
	TAD	(7770
	SNA CLA		/TEST FOR AUTO-XRS
	ISZ I	WT
	TAD I	WT
	DCA	WT
	CCDF		/IF INDIRECT ADDRESSING,
	JMP I	GEFADR	/OPERAND FIELD = DF

NONSTD,	TAD	(1000
	SNL		/CHECK FOR JMP OR JMS
	JMP	JMPJMS	/YES - NOT LONG NOW
	AND	(401	/OPR BITS
	CLL RAR
	SNA CLA
	JMP	XINLIN	/GROUP 1: ROTATES ETC.
	SNL
	JMP	HLTTST
	TAD	WD
	AND	(56	/TEST FOR EAE BITS
	SZA
	JMP I	(XEAE
	JMP	XINLIN
HLTTST,	AC0002		/GROUP 2: SKIPS
	AND	WD
	SZA CLA
	OS8ERR		/HLT!
	/**FALL INTO NEXT PAGE
/EXECUTE INSTRUCTION WITH AC AND LINK

XINLIN,	AC4000
	AND	LNKGT
	CLL RAL
	TAD	AC
	JMS	EXEC	/EXECUTE IN PAGE 0
	DCA	AC
	TAD	(4000	/DO NOT DESTROY LINK
	SGT
	CLA	/RECALCULATE GT ; EAE MIGHT HAVE CHANGED IT
	RAR
	DCA	LNKGT
	TAD	SKPOPR
	DCA	WD+1	/WASTEFUL EAE RESET
	JMP I	EMULAT

/INTERPRET JMP OR JMS

JMPJMS,	JMS	GEFADR	/GET EFFECTIVE ADDRESS
	TAD	IBR
	TAD	(CDF OS8F0
	DCA	UCIF
	TAD	IBR
	DCA	UIF
	CCIF
	TAD	WD
	RTL		/CHECK FOR JMS
	SPA CLA
	JMP	XJMP	/NO
	CLA IAC
	TAD	PC
	DCA I	WT	/SAVE RETURN ADDRESS
	CLA IAC		/AND BUMP JUMP ADDRESS
XJMP,	TAD	WT
	DCA	PC
COMBAC,	CDF 0
	TAD	UCIF
	DCA I	(UCIFX
	JMP I	(GOBACK


	PAGE
/ROUTINE TO HANDLE SPECIAL OS/8 HANDLER IOT

/FORMAT OF SPECIAL IOT USAGE IS AS FOLLOWS:

/	TAD	(INTERNAL DEVICE CODE
/	6200	/DATA FIELD IS FIELD OF HANDLER ARGUMENTS
/	POINTER TO OS/8 HANDLER ENTRY POINT
/	RETURN IS TO THE ERROR OR NORMAL RETURN OF THE HANDLER

HCALL,	CCIF
	ISZ	PC	/GO TO NEXT WD
	TAD I	PC
	DCA	PC	/PC CONTAINS HANDLER ENTRY PT ADDR
	TAD I	PC
	DCA	PC	/PC CONTAINS ARGUMENT LIST ADDR
	IFDEF	OS8F	<
	STA
	TAD	UDF
	SNA CLA		/IF WE ARE CALLING THE
	TAD	PC	/KEYBOARD MONITOR,
	TAD	(-OSKBML
	SZA
	TAD	(OSKBML-OSUSRL	/USR,
	SZA
	TAD	(OSUSRL-OSCDLD	/OR COMMAND DECODER INTO CORE,
	SZA CLA		/RELEASE THE OS8F INTERLOCK
	JMP	NOPOST	/SINCE THE USR DIRECTORY BUFFER IS CLEAR.
	TAD	(INTLOK
	CAL
	POST		/OS8F INTERLOCK IS A STANDARD EVENT FLAG
	CDF CUR		/IN THE CURRENT FIELD
NOPOST,
	>
	TAD	AC
	AND	(7760	/CHECK UNIT NUMBER LT 16.
	SZA CLA
	OS8ERR		/IF NOT, ILLEGAL IOT
	TAD	(HNDTAB
	TAD	AC
	DCA	AC
	CCDF		/ARG LIST IN DATA FIELD
	TAD I	PC
	AND	(7707
	DCA	ARGS+1	/GET FIRST WORD EXCEPT FOR FIELD
	TAD I	PC
	AND	(70
	TAD	(-OSFLDS^10
	SMA
	OS8ERR
	TAD	(OSFLDS^10+OS8F0
	TAD	ARGS+1
	DCA	ARGS+1
	ISZ	PC
	TAD I	PC
	DCA	ARGS+2
	ISZ	PC
	TAD I	PC
	DCA	ARGS+3
	IFDEF	OS8F	<
	CLA IAC
	TAD	ARGS+3
	AND	(7770	/IF THE I/O IS TO A DIRECTORY BLOCK
	SNA		/WE MUST SET THE OS8F INTERLOCK
	TAD	INTLOK	/(IF IT WAS CLEAR) TO PREVENT
	SNA CLA		/SIMULTANEOUS UPDATE OF
	ISZ	INTLOK	/THE OS/8 DIRECTORY
	>
	ISZ	PC
	NOP		/PROTECT AGAINST WIERD OR MALICIOUS BACKGROUNDERS
	CDF CUR
	TAD I	AC	/GET HANDLER TASK NUMBER
	SNA
	OS8ERR		/ILLEGAL HANDLER IOT
	CLL RTR
	RAR
	AND	(177	/IN BITS 3-8 OF TABLE ENTRY
	DCA	HTASK
	TAD I	AC	/GET UNIT NUMBER
	AND	K7	/IN BITS 9-11
	DCA	ARGS
	CAL
	SENDW		/SEND THE I/O REQUEST TO THE APPROPRIATE TASK
HTASK,	0
	IOMESS		/AND WAIT FOR COMPLETION
	TAD	IOSTS	/USE RETURN STATUS TO DETERMINE
	SNA		/WHETHER WE FAKE A NORMAL OR ERROR RETURN
	ISZ	PC
	SZA CLA
	AC4000		/TRADITIONAL ERROR VALUE
	DCA	AC
	JMP I	(HNDRET

INTREQ,	0		/TEST INT.REQ. FOR ALL OR 1 DEVICE
	STL	/LINK TELLS IF 1 OR ALL
	SNA
	CLL IAC	/ONE DEVICE
	TAD	(DEVSTA-2
	DCA	UTEMP
	TAD	(FLAGS-1
	DCA	OP
FLGADD,	AND	K7	/GO TEST NEXT DEV.
	TAD	OP
	DCA	OP
	ISZ	UTEMP
	TAD I	UTEMP
	SNA
	JMP I	INTREQ	/0 IS END OF LIST
	SMA SNL
	JMP	FLGADD	/NO ION AND ALL
	SMA
	JMP	NINTEX	/NO ION AND ONE
	AND	K7
	CIA
	DCA	FLGCNT	/SET # OF FLAGS
FLGLOP,	ISZ	OP
	TAD I	OP
	SNA CLA
	JMP	INTEX	/INTERRUPT REQUEST
	ISZ	FLGCNT
	JMP	FLGLOP	/MORE
	SNL
	JMP	FLGADD	/FOR ALL; NEXT
NINTEX,	SKP CLA
INTEX,	TAD	(1000	/CORRECT STATUS BIT
	JMP I	INTREQ
FLGCNT,	0

	PAGE
/TABLES FOR OS/8 SUPPORT TASK

/TABLE OF LEGAL DEVICE CODE'S

DEVLST,	ZBLOCK	100
	*DEVLST+0
	PRCOP
	*DEVLST+1
	NOOP		/NO HSR
	*DEVLST+2
	NOOP		/NO HSP
	*DEVLST+14
	NOOP		/WE ARE NOT A PDP12 AND NO FLUX-METER
	*DEVLST+15
	NOOP		/NO SC/MAGNET
	*DEVLST+16
	NOOP		/NO TRIPLE DAC
	*DEVLST+17
	NOOP		/NO BRUKER MAGNET
	*DEVLST+OSKBDV
	OSKBOP
	*DEVLST+OSTTDV
	OSTTOP
	*DEVLST+5
	TV1OP	/SPECIAL LIST TO PREVENT ION FOR DISPLAY-PLOTTER
	*DEVLST+6
	SIMOP		/SIMULATE ALL
	*DEVLST+7
	SIMOP		/SIMULATE ALL
	*DEVLST+20	/THE NEXT 10 LOCS ARE NOT USED
			/WE USE THEM FOR RTS 62X5 IOT'S
RTSOP,	0		/RETURN CLOCK RATE=	6205 (RCR)
	0		/START CLOCK=		6215 (STM)
	0		/RETURN TIME=		6225 (USR)
	XSEM		/SET EMULATE=		6235 (SEM)
	XCEM		/CLEAR EMULATE=		6245 (CEM)
	XSKP		/SKIP ON RTS=		6255 (SRT)
	XLOOK		/LOOK INTO FOREGROUND=	6265 (LIF)
	0		/TIME OF DAY=		6275 (TOD)
	*DEVLST+30
	*DEVLST+31
	SIMOP
	SIMOP		/VENUS INTERFACE
	*DEVLST+33
	0
	0		/SYSTEM CONSOLE= ERROR
	*DEVLST+52
	NOOP		/NO I/O # 1
	*DEVLST+55
	NOOP		/WE HAVE NO FPP (FOR THE MOMENT)
	*DEVLST+56
	NOOP
	NOOP		/NO TIMER-COUNTER-DVM
	*DEVLST+65
	NOOP		/AND NO ANALEX PRINTER
	*DEVLST+66
	LPTROP
	*DEVLST+100
/SPACE FOR 8 OP CODE LISTS

PRCOP,	ZBLOCK 10
	*PRCOP
	XSKON
	XION
	XIOF
	XSRQ
	XGTF
	XRTF
	SIMULA		/SGT
	XCAF
	*PRCOP+10
OSKBOP,	ZBLOCK 10
	*OSKBOP
	XKCF
	XKSF
	XKCC
	*OSKBOP+4
	XKRS
	XKIE
	XKRB
	*OSKBOP+10
OSTTOP,	ZBLOCK 10
	*OSTTOP
	XTFL
	XTSF
	XTCF
	*OSTTOP+4
	XTPC
	XTSK
	XTLS
	*OSTTOP+10
INTSOP,	ZBLOCK 10
	*INTSOP
	XNOP		/CINT
	XRDF
	XRIF
	XRIB
	XRMF
	XNOP		/SINT
	XNOP		/CUF
	0		/SUF; ERROR
	*INTSOP+10
TV1OP,	ZBLOCK 10
	*TV1OP
	XNOP	/DIEN
	SIMULA	/DSPD
	SIMULA	/DSCD
	SIMULA	/DSLP
	SIMULA	/DSDF
	SIMULA	/DRIS
	SIMULA	/DSFF
	SIMULA	/DCFF
LPTROP,	ZBLOCK 10
	IFNDEF	LPT	<
	*LPTROP+1
	SIMULA		/XSKP
	*LPTROP+6
	SIMULA		/XLLS
	>
	IFDEF	LPT	<
	*LPTROP+1
	XSKP
	*LPTROP+6
	XLLS
	>
	*LPTROP+10

	PAGE
/ OS/8 INITIALIZATION CODE - CREATES FAKE SYSTEM HEAD
/AND ESTABLISHES RELATIONSHIP BETWEEN OS/8 DEVICE HANDLER NAMES
/AND RTS-8 DRIVERS

	FIELD OS8F0%10
	*4000		/A GOOD SAFE PLACE

INITOS,	0
	IOF		/ALL KINDZA HANKY-PANKY GOING ON!
	6077		/CLEAR STATUS&INTERRUPT DISPLAY
	CLA
	6315		/CLEAR VENUS INTERRUPT
	IFNDEF	LPT	<
	PSIE		/DISABLE INTERRUPTS
	>
	CDF 0
	TAD	(TSINT
	DCA I	(TS8LOC	/SET UP TSS/8 "TRAP VECTOR" IN RTS-8 EXEC
	DCA I	(JSBITS	/MAKE SURE CORE IS SAVED WHEN WE CALL THE USR
	TAD I	(BATLOC
	AND	(4777	/KILL BATCH IN PROGRESS FLAG
	DCA I	(BATLOC	/BECAUSE WE WILL SURELY DESTROY BMON.
IMOVLP,	CDF 0
	TAD I	P7600
	CDF OS8F0
	DCA I	P7600
	CDF 10
	TAD I	P7600	/MOVE BOTH SYSTEM HEAD PAGES
	CDF OS8F0	/INTO OS8F1 LOCS 7400-7577
	DCA I	P7400
	ISZ	P7400
	ISZ	P7600
	JMP	IMOVLP
	TAD I	(BATLOC	/CLEAR OUT THE OS/8
	AND	(4707	/BATCH IN PROGRESS FLAG
	TAD	(OSFLDS-1^10+1000
	/SET SOFT CORE SIZE AND BIT 2 TELLS OS/8 ABOUT RTS8
	DCA I	(BATLOC
IMOVHN,	TAD I	FKHND1
	DCA I	FKHND2	/MOVE THE RTS-8 FAKE SYSTEM HANDLER INTO PLACE
	ISZ	FKHND1
	ISZ	FKHND2
	ISZ	FKHNDC
	JMP	IMOVHN
	CIF 10
	JMS I	(7700	/LOAD THE OS/8 USR INTO CORE (REAL CORE!)
	10
	JMP I	(INIHNL

FKHND1,	FAKHND
FKHND2,	7607
FKHNDC,	FAKHND-FAKEND
P7600,	7600
P7400,	7400
FAKHND,	RELOC	7607	/FAKE OS/8 SYSTEM HANDLER
FAKSYS,	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM	/17(8) ENTRY POINTS

	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
	ISZ	DVNUM
F17,	17
	CLA		/JUST IN CASE
	TAD	DVNUM	/GET ENTRY POINT NUMBER
	CMA
	TAD	FAKTAD	/TRANSFORM INTO "TAD" ON ENTRY POINT
	DCA	.+1
	HLT		/GET CALLING ADDRESS
	DCA	FAKPTR
	AC2000
	TAD	.-3	/NOW FORM A "DCA ENTRY POINT"
	DCA	.+2
	TAD	FAKISZ
	HLT		/RESTORE ENTRY POINT
	TAD	DVNUM
	CIA
FAKTAD,	TAD	F17	/GET RTS-8 INTERNAL REFERENCE NUMBER
	DCA	FAKT
	DCA	DVNUM	/CLEAR DVNUM FOR NEXT CALL
	TAD	FAKT
	6200		/MAGIC IOT
	FAKPTR		/POINTER TO POINTER TO ARGLIST
DVNUM,	0
FAKT,	0
FAKPTR,	0
FAKISZ,	ISZ	DVNUM
	RELOC
FAKEND=	.
	PAGE
/LOOP WHICH RELATES OS/8 AND RTS HANDLERS

INIHNL,	ISZ	HPTR
	TAD I	HPTR	/GET NEXT HANDLER NAME
	SNA
	JMP	ASDONE	/NO MORE
	DCA	ASNAM1
	ISZ	HPTR
	TAD I	HPTR
	DCA	ASNAM2	/STORE HANDLER NAME IN "INQUIRE"
	ISZ	HPTR
	CIF 10
	JMS I	(200
	12		/IS HANDLER THERE?
ASNAM1,	0
ASNAM2,	0
	0
	JMP	INIHNL	/HANDLER NOT IN SYSTEM CONFIGURATION
	TAD	ASNAM2
	TAD	(OS8HND-201	/FLD 1 RELOCATED
	DCA	HNDPTR	/GET POINTER INTO RESIDENT HANDLER TABLE
	TAD	ASNAM2
	TAD	(HNDTAB
	DCA	HTBPTR	/AND EQUIVALENT PTR INTO RTS-8 TABLE
	TAD	(FAKSYS-1
	TAD	ASNAM2	/ASSIGN ONE OF THE 17 ENTRY POINTS IN THE
	DCA I	HNDPTR	/FAKE SYSTEM HANDLER TO THIS DEVICE
	TAD I	HPTR	/GET THE RTS-8 TASK AND UNIT NUMBER
	CDF 0
	DCA I	HTBPTR	/MAKE THE CORRESPONDING ENTRY IN THE
	CDF OS8F0	/OS8 SUPPORT TASK TABLE
	JMP	INIHNL	/GET THE NEXT HANDLER

HTBPTR,	HNDTAB+1
HNDPTR,	0
HPTR,	DECOTA-1

ASDONE,	CIF 10
	JMS I	(200
	11		/KICK OUT THE USR
	CDF OS8F0
	TAD I	(INITOS
	DCA	HPTR	/SAVE RETURN ADRESS
	ION		/INTERRUPTS CAN GO BACK ON NOW

			/** FALL INTO NEXT PAGE **
/STORE OS8 RESIDENT ON A STANDARD FILE

	CAL
	SENDW
	OS8F
	SAVEMS
	TAD	SAVEST
	SZA
	HLT		/ERROR; TRY AGAIN
	TAD	SAVEBL
	DCA	WRITBL	/FOUND EMPTY GO WRITE
	CAL
	SENDW
	OSSYSD
	WRITMS
	TAD	WRITST
	SZA
	HLT
	TAD	SAVEBL
	CDF 0
	DCA I	(BOOTBK	/ALL OK;STORE BLK# FOR RESTART
	CIF 0
	JMP I	HPTR

SAVEMS,	ZBLOCK 3
	OSSYSD^10+0+2000	/ENTER ON SYS:
	SAVEFN		/FILENAME
SAVEST,	0
SAVEBL,	0
SAVELN,	1		/1 BLK LONG

SAVEFN,	FILENAME	BOOT.RT

WRITMS,	ZBLOCK 3
	0		/UNIT 0
WRITFN,	2^100+OS8F0+4000
	7400
WRITBL,	0
WRITST,	0

	PAGE
/DEVICE CORRESPONDENCE TABLE

DECOTA,	DEVICE	SYS
	OSSYSD^10
	DEVICE	DSK
	OSSYSD^10+1

	IFDEF	DTA	<
	DEVICE	DTA0
	DTA^10+0
	DEVICE	DTA1
	DTA^10+1
	DEVICE	DTA2
	DTA^10+2
	DEVICE	DTA3
	DTA^10+3
	DEVICE	DTA4
	DTA^10+4
	DEVICE	DTA5
	DTA^10+5
	DEVICE	DTA6
	DTA^10+6
	DEVICE	DTA7
	DTA^10+7
	>
	IFDEF LTA <
	DEVICE LTA0
	LTA^10+0
	DEVICE LTA1
	LTA^10+1
	DEVICE LTA2
	LTA^10+2
	DEVICE LTA3
	LTA^10+3
	DEVICE LTA4
	LTA^10+4
	DEVICE LTA5
	LTA^10+5
	DEVICE LTA6
	LTA^10+6
	DEVICE LTA7
	LTA^10+7
	>
	IFDEF	RK8	<
	DEVICE	RKA0
	RK8^10+0
	DEVICE	RKB0
	RK8^10+4
	DEVICE	RKA1
	RK8^10+1
	DEVICE	RKB1
	RK8^10+5
	DEVICE	RKA2
	RK8^10+2
	DEVICE	RKB2
	RK8^10+6
	DEVICE	RKA3
	RK8^10+3
	DEVICE	RKB3
	RK8^10+7
	>
	IFDEF	SIDK	<
	DEVICE	DKA0
	SIDK^10+0
	DEVICE	DKB0
	SIDK^10+1
	DEVICE	DKA1
	SIDK^10+2
	DEVICE	DKB1
	SIDK^10+3
	>
	IFDEF	SDA	<
	DEVICE	SDA0
	SDA^10+0
	DEVICE	SDA1
	SDA^10+1
	>

	IFDEF RX8A <
	DEVICE RXA0
	RX8A^10+0
	DEVICE RXA1
	RX8A^10+1
	>

	IFDEF RX8B <
	DEVICE RXB0
	RX8B^10+0
	DEVICE RXB1
	RX8B^10+1
	>

	IFDEF RX8C <
	DEVICE RXC0
	RX8C^10+0
	DEVICE RXC1
	RX8C^10+1
	>

	IFDEF RX8D <
	DEVICE RXD0
	RX8D^10+0
	DEVICE RXD1
	RX8D^10+1
	>

	IFDEF OS8COM <
	DEVICE RTS8
	OS8COM^10+OS8F0
	>
	0
	PAGE
	XLIST	0