
PDP-9 ASSEMBLER PART III-A

/INPUT/OUT BASIC SUBROUTINES FOR INTERRUPT.

INTER,


	DAC A#C
	RSF	SKP	JMP TAPIN
	PSF	SKP	JMP COPB
	TSF	SKP	JMP TYINT
	LSDF	SKP	JMP PRNINT
	LSEF	SKP	JMP SPCINT
	IORS
	HLT
	CAF
	LEAVE

COPB,	JMS OPB

LEAVE=JMP .
	LAC
	RAL
	LAC AC
	ION
	JMP I

/TAPE INTERRUPT ROUTINE

GCR,	0		/GET A CHARACTER FROM THE BUFFER
	LAC TAPO
	SAD (LAW TAPEND	/CHECK FOR END OF BUFFER
	LAW TAPBUF
	DAC TAPO
	LAC TAP#CNT
	ADD (20		/READING MUST BE 20 CHARS. AHEAD OF PROCESSING
	SMA
	JMP GCR0 2	/IF NOT, LET READING GET AHEAD

GCR0,	ISZ TAPCNT
	JMP GCC1		/READ IS > 20 CHARS AHEAD, SO PROCESS
	LAC R#ON
	SPA
	RSA		/READER "ON" AGAIN
	DZM RON
	LAC TAPCNT
	SMA
	JMP .-2
	JMP GCR0

GCC1,	LAC MEDIAT
	SZA
	JMP GCC3
	LAC I TAPO
GCC2,	NOP	/SKP IF FIODEC
	JMS ATF
GCC4,	DAC FC#HR
	JMP I GCR

GCC3,	DZM MEDIAT
	LAC TAPCNT
	TAD (-0
	DAC TAPCNT
	LAC ITEMB
	JMP GCC4

/COME HERE ON A TAPE INTERRUPT

TAPIN,	RRB
	JMS ENDTAP		/CHECK TAPE IN READER (ON PDP-9)
	RSA
	SNA
	LEAVE	/BLANK TAPE
	DAC I TAPI
	AND (100
TAPINH,	NOP	/OR CLA IF ASCII
	SZA
	JMP TAPI1		/FIODEC RUBOUT
	LAC TAPI
	SAD (LAW TAPEND		/CHECK FOR END OF BUFFER
	LAW TAPBUF
	DAC TAPI
	LAM -1		/DECREMENT COUNTER
	ADD TAPCNT
	DAC TAPCNT
	SAD (TAPBUF-TAPEND+2	/IF READING IS BUFFER LENGTH AHEAD
	JMP TAPINW		/OF PROCESSING, TURN READER "OFF"
	LEAVE

TAPINW,	LAC RON
	SPA
	LEAVE
	LAC (JMP .+3
	DAC TAPIN
	LEAVE
	LAC . 4		/COME HERE ON NEXT INTERRUPT,
	DAC TAPIN		/DO NOT SELECT READER
	CLC		/SET FLAG TO TURN READER ON
	DAC RON		/AGAIN, AFTER PROCESSING CATCHES UP
	RRB
	JMS ENDTAP

	JMP TAPIN 3

TAPI1,	LAM -1		/THROW AWAY RUBOUT
	ADD TAPI
	DAC TAPI
	LEAVE

ENDTAP,	0
	DAC RRRB#
	IORS
	AND (1000		/BIT 8, PTR EMPTY FLAG
	SZA
	JMP .+3
	LAC RRRB		/OK, SO RETURN
	JMP I ENDTAP
	DZM RON		/PTR EMPTY, DO NOT TURN
	LEAVE		/READER ON AGAIN

ATF,	0
	DAC IT#EMA
	TAD (-237
	SPA
	JMP ATFL	/NOT IN TABLE - LOW
	TAD (-77
	SMA
	JMP ATF4	/NOT IN TABLE - HIGH, EXIT
	TAD (400100
	RCR
	ADD (IASC
	DAC .+1
	XX
	SNL
	JMS RR9
	DAC ITEMA	/ODD CODES IN RIGHT HALF, EVEN CODES IN LEFT HALF
	AND (77
	DAC IT#EMB
	LAC (400
	AND ITEMA
	RCR
	XOR ITEMB	/PUT PARITY BIT
	DAC ITEM#B
	LAC ITEMA
	AND (300
	XOR AFCASE
	SNA
	JMP ATFC
ATF1,	LAC ITEMB
	JMP ATF4 1
ATFL,	SAD (-26
	LAC (236
	SAD (-23
	LAC (13
	SAD (-22
	LAC (277
	SPA
ATF4,	JMP GCR 1
	AND (377
	JMP I ATF
ATFC,	LAC AFCASE
	CMA
	AND (300
	DAC AFCASE
	SAD (100
	CLA!SKP
	LAM -1
	TAD (274
	DAC ITEMA
	LAC ITEMA
	ISZ MEDIAT
	JMP ATF4 1
/TABLE FOR ASCII TO FIODEC CONVERSION
/CODE TRANSLATION CONVENTIONS ARE THOSE OF CANUTE
/WITH THE TWO EMENDATIONS, VIZ,
/(1) ASCII NUMBER SIGN SERVES AS FIODEC OVERBAR
/(2) ASCII DOLLAR SIGN SERVES AS FIODEC UNDERBAR
/COLON AND SEMICOLON ARE TRANSLATED AS SPACES
/NINE BIT CODES FOR EVEN ASCII MOD(240) IN LEFT HALF, ODD ASCII RIGHT HALF
/CASE CARRIED AS 100 FOR LC, 200 FOR UC, ALL LETTERS LC
/INITIAL BIT IS PARITY BIT IN NINE BIT EQUIVALENCE SCHEME
IASC,	500605
	201556
	240204
	606202
	157555
	273254
	533154
	173521
	120101
	102503
	104505
	506107
	110511
	500500
	207633
	210621
	220161
	162563
	164565
	566167
	170571
	541542
	143544
	145146
	547550
	151522
	123524
	125126
	527530
	131257
	656655
	611603
/PUNCH FOR INTERRUPT

IPB,	0		/PUT A [8 BIT] CHARACTER IN THE BUFFER
	DAC I PUNI
	LAC PUNI
	SAD (LAW PUNEND	/CHECK FOR END OF BUFFER
	LAW PUNBEG
	DAC PUNI

IPB0,	ISZ P#UNCNT
	JMP I IPB		/STILL ROOM IN BUFFER 80 RETURN
	LAC P#ON		/PUNCHING IS WHOLE BUFFER BEHIND
	SPA		/LOADING THE BUFFER
	JMS OPB		/LET PUNCHING CATCH UP A LITTLE
	LAC PUNCNT
	SMA
	JMP .-2
	JMP I IPB

/GET A CHARACTER FROM THE BUFFER AND PUNCH IT
OPB,	0
	LAC PUNO
	SAD (LAW PUNEND	/CHECK IF END OF BUFFER
	LAW PUNBEG
	DAC PUNO
	LAC PUNCNT
	SAD (PUNBEG-PUNEND+1
	JMP OPBF		/NO MORE CHARS IN BUFFER TO PUNCH
	TAD (-0		/DECREMENT COUNTER
	DAC PUNCNT
	IORS
	AND (400		/1 CHECK OF PTP EMPTY
	SNA
	JMP .+4
	CLC		/IF SO, SET AC TO ALL ONES
	HLT
	JMP .-6		/WAIT TIL PUNCH REFILLED
	LAC I PUNO
	PLS

	DZM PON
	JMP I OPB

OPBF,	PCF	/TURN OFF INTERRUPT TIL BUFFER FILLED
	CLC
	DAC PON		/SET FLAG TO RE-ENABLE INTERRUPT
	JMP I OPB


/TELETYPE AND ANELEX OUTPUT ROUTINES

TYINT,	ISZ 0
	TCF
	LEAVE

OTY,	0
	DAC S#UCHR
	LAT
	AND (100
	SZA
	JMP ANELX	/LINE PRINTER OUTPUT, BIT 11 ON
	LAC SUCHR
	TLS
	JMP .
	JMP I OTY

ANELX,	LAC SUCHR
	AND (37
	SAD (33
	JMP ANXU	/FIGURES
	SAD (37
	JMP ANXL	/LETTERS
	SAD (10
	JMP ANXLN	/LINE FEED
	SAD (2
	JMP ANXO	/CARRIAGE RETURN
	CLL
	ADD (LAC TANX
	ADD ANX#C	/ADD CASE CODE
	DAC .+2
	CLL
	XX
ANX2,	XCT ANXR
	ADD S#V3C
	DAC SV3C
	ISZ .-3
ANXO,	LAC SUCHR	/RETURN
	JMP I OTY
ANXR,	JMS RR7	/FIRST CHAR IN BITS 0-5
	JMS RL6	/SECOND IN BITS 6-11
	JMP .+1	/THIRD IN BITS 12-17
	ADD SV3C
	DAC SV3C
	LAC PNTF
	SZA
	JMP .-2	/WAIT FOR INTERRUPT FROM LAST IOT
	ISZ PNTF
	LAC SV3C
	ISZ ANXCNT
	LPLD	/LOAD THE THREE CHARS
ANX3,	LAC (XCT ANXR
	DAC ANX2	/REINITIALIZE FOR NEXT 3 CHARS
	DZM SV3C
	JMP ANXO
ANXU,	LAC (40
	DAC ANXC	/UPPER CASE=40
	JMP ANXO
ANXL,	DZM ANXC	/LOWER CASE = 0
	JMP ANXO

/INTERRUPTS FROM LINE PRINTER TYPE 647 COME HERE

SPCINT,	LAC (525252
	HLT
	LSEF
	LEAVE	/ERROR FLAG=0
	JMP SPCINT	/ERROR

PRNINT,	DZM PNTF
	LPCF	/CLEAR DONE FLAG
	LEAVE

ANXLN,	LAC SV3C
	SNA
	JMP ANXLNE
	AND (7777	/MUST FILL UP WITH SPACES
	SNA
	JMP .+3
	LAC (40	/1 SPACE
	SKP
	LAC (4040	/2 SPACES
	XOR SV3C
	DAC SV3C
	LAC PNTF
	SZA
	JMP .-2
	ISZ PNTF
	LAC SV3C
	LPLD
ANXLNE,	LAM -50
	DAC AN#XCNT	/RESET LINE LENGTH COUNTER
	LAC PNTF
	SZA
	JMP .-2
	ISZ PNTF
	LAC SPCIND
	LPPS	/PRINT AND SPACE
	DZM SPCIND
	ISZ MMS
	JMP ANX3
	JMS MRX
	JMP ANX3

TANX,	40	24	40	17
	40	10	16	15
	40	14	22	07
	11	20	03	26
	05	32	04	02
	23	31	06	30
	01	27	12	40
	25	21	13	40
	40	65	40	71
	40	43	54	56
	40	51	64	53
	70	60	72	73
	63	42	44	77
	40	66	41	57
	55	62	47	40
	67	61	50	40

START
