DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦b2589d262⟧

    Length: 17258 (0x436a)
    Notes: pts_type(SC)
    Names: »DRTW01.SC«

Derivation

└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
    └─⟦this⟧ »TOSSWORK/DRTW01.SC« 

PTS(SC)

	IDENT DRTW01 	REL 10.0 80-03-14 870105041000 




**************************************************
* 
*   PHILIPS TERMINAL SYSTE  PTS 
* 
*   DRTW01 = DRIVER TYPEWRITER PTS 6862 
* 
* 
* 
* 
* 
* 
**************************************************
* 
*   THIS DRIVER HANDLES INPUT AND OUTPUT TO TYPEWRITERS 
*   PTS 6862
* 
* 
	EJECT
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
	ENTRY	TWAD	ADDRESS BLOCK 
	ENTRY	IHTW 
	ENTRY	TWON 
	ENTRY	DWTW01 
* 
************* 
* EXTERNALS * 
************* 
* 
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	TDISP	DISPATCH 
	EXTRN	DISEND	DISPATCH AND ENDIO
	EXTRN	SETIME	SET TIME BEFORE TIME-OUT
	EXTRN	SAVE8	SAVE REGISTERS A1-A8 ON STACK
	EXTRN	DWTST	STATUS 
	EXTRN	DWTBC	BYTE COUNTER 
	EXTRN	DWTECB	ECB ADDRESS 
	EXTRN	DWTOR	DWT INDEX AND ORDER
	EXTRN	DWTA3	SAVE AREA A3 
	EXTRN	DWTA4	SAVE AREA A4 
	EXTRN	DWTA5	SAVE AREA A5 
	EXTRN	DWTSB1	STACK BASE 1 IN DWT 
	EXTRN	DWTSB2	STACK BASE 2 IN DWT 
	EXTRN	DWTTP	TIMER POINTER
	EXTRN	INTSAV	SAVE AREA LAST INTRRUPT 
	EXTRN	PFPOST	PWF POST PROCESSING FLAG
	EJECT
* 
* 
********************
* I/O-INSTRUCTIONS
********************
* 
* 
TWSTRT	EQU	/42C0	CIO-START
TWHLT	EQU	/4280	CIO-HALT
TWINR	EQU	/4A00	INPUT 
TWOTR	EQU	/4200	OUTPUT
TWSST	EQU	/4AC0	SENSE STATUS
* 
* 
	EJECT
* 
* 
************* 
* CONSTANTS * 
************* 
* 
* 
CR	EQU	/0D	CARRIAGE RETURN
LF	EQU	/0A	LINE FEED
LNGERR	EQU	/8	INCORRECT LENGTH
TPERR	EQU	/2	THROUGHPUT ERROR 
TIME	EQU	300	TIME BEFORE TIME-OUT 
* 
* 
************************
*  CONDITIONAL ASSEMBLY*
************************
* 
* 
X:A	EQU	0 
X:B	EQU	0 
X:C	EQU	60
X:D	EQU	10
X:E	EQU	6 

TIMOUT	EQU	X:A	 
POWUP	EQU	X:B 
DVBLEN	EQU	X:C
DVBKTB	EQU	X:D
DEVIND	EQU	X:E

CREDIT	EQU	0
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
	EJECT
* 
* 
********************* 
* DWT-DISPLACEMENTS * 
********************* 
* 
* 
DWTDRD	EQU	/10	START OF DRIVER DEFINED PART 
* 
	IFT	MMUPAG=0 
START	EQU	DWTDRD
	XIF
* 
	IFT	MMUPAG=1 
START	EQU	DWTDRD+4
	XIF
* 
DWTHP	EQU	START+/18 
TWCLR	EQU	START+/15 
TWEOF	EQU	START+/16 
TWBSP	EQU	START+/14 
DWTA2	EQU	START+/1A 
	DATA	DVBKTB+DVBKTB	MMU KEY TABLE SIZE
	DATA	DVBLEN+DVBLEN	MMU BUFFER SIZE 
	DATA	DEVIND	DEVICE INDEX 
TWAD	EQU	*
	DATA	TWA	ACTIVATION PART 
	DATA	0	ABORT ROUTINE ADDRESS 
	EJECT
* 
* 
*   ACTIVATION PART: CHECK VALIDITY OF ORDERS 
* 
* 
TWA	EQU	* 
	LDK	A3,0 
	LD	A2,4,A8	GET REQUESTED LENGTH
	ABL(Z)	IHTW50	REQUESTED LENGTH =0
* 
* 
	LDR	A2,A7	COPY ORDER 
	RF(NP)	TWAERR	REQUEST ERROR
	SUK	A2,4 
	RF(Z)	TWAERR	REQUEST ERROR 
	RF(N)	TWAIN	INPUT REQUEST
	SUK	A2,2 
	RF(NP)	TWAOUT	OUTPUT REQUEST 
* 
* 
TWAERR	ABL	DISIOE	REQUEST ERROR 
	EJECT
* 
* 
TWAIN	EQU	* 
	IFT	TIMOUT=1 
	LD	A2,DWTTP,A6	GET TIMER POINTER 
	RF(Z)	TWA010	NO TIMING ON THIS DEVICE
	LDR	A1,A6	SAVE DWT-ADDRESS 
	CF	A15,SETIME
	DATA	TWTUT,TIME
	ST	A4,DWTTP,A6	SAVE TIMER BLOCK-ADDRESS
	XIF
TWA010	EQU	*
	IFT	POWUP=1
	LD	A2,DWTST,A6	GET DWT-STATUS
	ANKL	A2,/200 
	RF(Z)	TWA020	NOT FIRST READ AFTER POEWR UP 
	XRS	A2,DWTST,A6	RESET POINTER
	LDKL	A2,-2 
	ST	A2,10,A8	INDICATE POWER UP
	ABL	IHTW35	PERFORM ENDIO 
	XIF
TWA020	LDK	A2,/21 
* 
* 
READ	CF	A5,STRTIO	EXECUTE CIO-START 
	RF	RED030
RED020	CF	A5,STREG	SAVE REGISTERS 
	EJECT
* 
*   RETURN AFTER INTERRUPT
* 
* 
RED030	EQU	*
	IFT	TIMOUT=1 
	LDR	A1,A1
	RF(NZ)	RED037
	XIF
	SUK	A7,1 
	RF(P)	RED050	ORDERS 02/03
* 
* 
RED035	CF	A5,STORE	STORE CHARACTER IN BUFFER
	CW	A3,4,A8	
	RB(L)	RED020	GET NEXT CHARACTER
	LDR	A7,A7
	RF(Z)	RED040	BASIC READ
* 
* 
	LDK	A1,LNGERR	OVERFLOW 
RED037	ORS	A1,8,A8	SET RETURN CODE
* 
* 
	EJECT

RED040	EQU	*

	IFT	TIMOUT=1 
	LD	A7,DWTOR,A6	GET ORDER 
	ANK	A7,/FF	MASK ORDER
	CWK	A7,4	
	RF(G)	RED045	WRITE ORDER 
	LD	A4,DWTTP,A6	TIMER POINTER 
	RF(Z)	RED045	NO TIMIMG ON THIS DEVICE
	CM*	DWTTP,A6	RESET TIMER 
	XIF

RED045	EQU	*
	CF	A5,HLTIO	EXECUTE CIO-HALT 
	ABL	IHTW40	PERFORM TENDIO
	EJECT
* 
* 
* 
*   ORDERS 02,03
* 
* 
RED050	EQU	*
	LD	A1,10,A8	GET CONTROL WORD 
	RF(Z)	RED080	NO KEYTABLE 
	LCR	A4,A1	GET NUMBER OF KEYS 
	ANK	A4,/FF 
	ADR	A1,A4	ADDRESS TO LAST KEY
	ADK	A1,1 
RED060	SUK	A4,1 
	RF(N)	RED080	KEY NOT IN KEYTABLE 
	SUK	A1,1	DECREMENT ADDRESS 
	CCR	A2,A1	CHECK IF IN KEYTABLE 
	RB(NE)	RED060	NOT IN KEYTABLE
	ADR	A4,A4	DOUBLE INDEX 
	ST	A4,10,A8	STORE INDEX IN CONTROL WORD
RED070	CF	A5,STORE	STORE KEY IN KEYTABLE
	RB	RED040	EXECUTE CIO-HALT 
RED080	CC	A2,TWEOF,A6	
	RB(E)	RED070	STANDARD EOR-KEY
	CC	A2,TWBSP,A6 
	RF(E)	RED110	BACKSPACE 
	CC	A2,TWCLR,A6 
	RF(E)	RED110	CLEAR 
	EJECT
* 
* 
*   CHARACTER NOT FOUND IN KEYTABLE 
* 
* 
* 
RED090	LDR	A4,A2	COPY CHARACTER 
	ANK	A4,/FF	MASK
	LDR	A1,A7
	SUK	A1,1 
	RF(Z)	RED100	ORDER 02
	SUK	A4,/30	ORDER 03
	RF(N)	CODERR	LESS THAN /30 
	SUK	A4,/9
	RF(P)	CODERR	GREATER THAN /39
	RF	RED110
* 
* 
RED100	SUK	A4,/20 
	RF(N)	CODERR	LESS THAN /20 
	SUK	A4,/3F 
	RF(NP)	RED110	CORRECT CHARACTER
* 
* 
CODERR	LDK	A1,4	CODE CHECK ERROR
	ORS	A1,8,A8
	CF	A5,STORE	STORE CHARACTER IN ECB-BUFFER
	RB	RED040	EXECUTE CIO-HALT 
* 
* 
	EJECT
* 
* 
* 
RED110	CC	A2,TWBSP,A6 
	RF(E)	RED120	BACKSPACE 
	CC	A2,TWCLR,A6 
	RB(NE)	RED035
* 
* 
	LDK	A3,0	CLEAR ECB-BUFFER
	RB	RED020	GET NEXT CHARACTER 
* 
* 
RED120	SUK	A3,1	BACKSPACE 
	RB(NN)	RED020	GET NEXT CHARACTER 
	ADK	A3,1 
	RB	RED020	GET NEXT CHARACTER 
* 
* 
* 
	EJECT
* 
* 
*   W R I T E 
* 
*   ORDERS 05 AND 06:  BASIC AND STANDARD WRITE 
* 
* 
WRITE	EQU	* 
TWAOUT	EQU	*
	INH
	LDK	A4,0 
	LDK	A2,0 
	CF	A5,STRTIO	EXECUTE CIO-START 
* 
* 
	CWK	A7,5 
	RF(Z)	WRT050	ORDER 05
* 
* 
	LD	A3,2,A8	GET BUFFER ADDRESS
	LC	A3,1,A3	CONTROL CHARACTER 
	ANK	A3,/FF 
	SUK	A3,/2B 
	RF(Z)	WRT030	NO CR OR LF 
* 
* 
	ST	A4,DWTHP,A6	HEAD POSITION INDICATOR 
	LDK	A4,2 
	LDK	A2,CR	SEND CARRIAGE RETURN 
	EJECT
* 
* 
* 
WRT010	CF	A5,OTR	SEND CHARACTER 
* 
* 
	SUK	A4,1 
	RF(NP)	WRT020
WRT015	LDK	A2,LF	SEND LF
	RB	WRT010
* 
WRT020	SUK	A3,5 
	RB(Z)	WRT015	SEND SECOND LF
	SUK	A3,1 
	RF(NZ)	WRT030	 
	LDK	A2,/0C	SEND FORM FEED
	RB	WRT010
WRT030	LDK	A3,2	BUFFER POINTER
	RF	WRT050	GET CHARACTER
* 
* 
* 
WRT040	EQU	*
	CF	A5,OTR	SEND CHARACTER 
	IM	DWTST,A6	INCREMENT BYTE COUNTER 
	EJECT
* 
* 
* 
WRT050	CF	A5,GETCHR	GET CHARACTER FROM ECB-BUFFER 
	LDR	A1,A1	 
	RB(Z)	RED040	LAST CHARACTER
	CWK	A7,5 
	RB(Z)	WRT040	BASIC WRITE 
* 
* 
	LDR	A1,A2	ORDER 06: STANDARD WRITE 
	ANK	A1,/FF 
	SUK	A1,/07 
	RB(Z)	WRT040	BELL
* 
	SUK	A1,/A
	RF(E)	WRTTAB	TABULATION
* 
	SUK	A1,/F
	RF(L)	ERRCOD	LESS THAN /20 
	SUK	A1,/3F	
	RB(NP)	WRT040	BETWEEN /20-/5F
	SUK	A1,/20 
	RF(NP)	WRT060	BETWEEN /60-/7F
* 
* 
ERRCOD	LDK	A1,4 
	ORS	A1,8,A8
	RB	WRT050	GET NEXT CHARACTER 
* 
* 
WRT060	SUK	A2,/20 
	RB	WRT040
* 
* 
	EJECT
* 
* 
*   T A B U L A T I O N 
* 
* 
WRTTAB	EQU	*
	CF	A5,GETCHR	GET FIRST TAB.POSITION CHARACTER
	LDR	A4,A2	COPY 
	CF	A5,GETCHR	GET SECOND TAB. POSITION CHARACTER
	ANK	A2,/F
	ANK	A4,/F
	RF(Z)	TAB020 
TAB010	ADK	A2,/A
	SUK	A4,1 
	RB(NZ)	TAB010
* 
TAB020	SU	A2,DWTHP,A6	
	LC	A4,DWTBC,A6	GET NUMBER OF OUTPUT CHARACTERS 
	SUR	A2,A4	NUMBER OF SPACES TO BE SENT
	RB(NP)	WRT050	NO SPACES SHOULD BE SENT 
	LDR	A4,A2
TAB030	LDK	A2,/20	SEND BALNKS 
TAB040	CF	A5,OTR	SEND CHARACTER 
	IM	DWTST,A6	INCREMENT BYTE COUNTER 
	SUK	A4,1 
	RB(NZ)	TAB030	SEND ANOTHER SPACE 
	LDR	A3,A3
	RB(NZ)	WRT050	NOT RECOVERY 
	SC	A4,DWTBC,A6	RESET BYTE COUNTER
	LDK	A3,2	PRESET BUFFER INDEX 
	RB	WRT050	GET NEXT CHARACTER 
	EJECT
* 
* 
*   RECOVERY ROUTINE
* 
* 
* 
TWON	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A6,DWTW01	GET DWT-ADDRESS 
	IFT	POWUP=1
	LDKL	A1,/200 
	ORS	A1,DWTST,A6	INDICATE POWER UP
	XIF
	LD	A1,DWTST,A6 
	RF(N)	EXIT	DEVICE NOT BUSY 
TWON10	LD	A3,DWTA3,A6 
	LD	A7,DWTOR,A6	GET ORDER 
	ANK	A7,/FF 
	LD	A8,DWTECB,A6	ECB-ADDRESS
	LDKL	A5,DWTSB2 
	ADR	A5,A6	GET STACK BASE 
	SUK	A7,4	
	ABL(N)	TWA010	ORDERS 01,02,03
	SUK	A7,1 
	RF(Z)	TWON20	ORDER 05
	INH
	LDK	A2,0 
	CF	A5,STRTIO	EXECUTE CIO-START 
	LDK	A2,CR
	LDK	A3,0 
	LD	A4,DWTHP,A6 
	ADK	A4,1 
	RB	TAB040	REPRINT LAST REQUEST 
* 
TWON20	LDK	A1,TPERR	ORDER 05
	ABL	DISEND 
* 
* 
	EJECT
* 
* 
*   I H T W 
* 
*   INTERRUPT HANDLER: PROCESS OF INTERRUPT 
* 
* 
IHTW	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A6,DWTW01 
LDREG	EQU	* 
	LD	A3,DWTST,A6 
	RF(N)	SKIP	DEVICE NOT BUSY 
IHTW10	LDR*	A2,A6	GET DEVICE ADDRESS
	ORKL	A2,TWSST
	EXR	A2	EXECUTE SST 
	RF(A)	IHTW30	ENDIO 
	LD	A7,DWTOR,A6	GET ORDER 
	ANK	A7,/FF 
	SUK	A7,4 
	RF(P)	IHTW30 
	LDR*	A2,A6	GET DEVICE ADDRESS
	ORKL	A2,TWINR	 
	EXR	A2	EXECUTE INR 
	ANK	A2,/7F	MASK INPUT-CHARACTER
	EJECT
* 
	IFT	TIMOUT=1 
	LD	A1,DWTTP,A6	GET TIMER POINTER 
	RF(Z)	IHTW30	NO TIMING ON THIS DEVICE
	LDKL	A1,-TIME
	ST*	A1,DWTTP,A6
	XIF
* 
* 
IHTW30	LDK	A1,0 
	RF	LDREGE	RESTORE REGISTERS


IHTW35	EQU	*
	IFT	POWUP+TIMOUT=2 

	LD	A1,DWTTP,A6	TIMER POINTER 
	RF(Z)	IHTW40	NO TIMING ON THIS DEVICE
	CM*	DWTTP,A6	RESET TIMER 
	XIF
	EJECT
* 
* 
IHTW40	EQU	*
* 
* 
IHTW50	ST	A3,6,A8	SAVE EFFECTIVE LENGTH 
IHTW55	SUK	A7,4	
	RF(NP)	IHTW60	READ ORDER 
* 
* 
	LC	A3,DWTBC,A6	GET BYTE COUNTER
	ADS	A3,DWTHP,A6	UPDATE HEAD POSITION 
	LDK	A3,0 
	SC	A3,DWTBC,A6	CLEAR BYTE COUNTER
* 
IHTW60	EQU	*
	IFT	CREDIT=1 
	LD	A1,10,A8	CONVERT INDEX
	ADK	A1,2 
	SRL	A1,1 
	ST	A1,10,A8
	XIF
	LDK	A1,0 
	ABL	DISEND	PERFORM TENDIO
* 
* 

SKIP	LDR*	A2,A6 
	ORKL	A2,TWSST
	EXR	A2	SST 
	RF(A)	EXIT 
	LDR*	A2,A6 
	ORKL	A2,TWHLT
	EXR	A2	CIO HALT
	RF	EXIT
	EJECT
* 
* 
* 
*   I/O COMMANDS
* 
* 
STRTIO	LDKL	A1,TWSTRT	EXECUTE CIO-START 
	RF	EXECIO
HLTIO	LDKL	A1,TWHLT	        CIO-HALT
	RF	EXECIO
OTR	LDKL	A1,TWOTR	        OTR 
* 
* 
EXECIO	LD	A7,PFPOST 
	RF(NZ)	STREG	PFINIT PENDING
	ORR*	A1,A6	GET I/O-COMMAND 
	EXR	A1	EXECUTE COMMAND 
	RF(NA)	HALT
STREG	EQU	* 
	LDKL	A1,/100 
	ORS	A1,DWTST,A6	INDICATE INTERRUPTS ALLOWED
	ST	A3,DWTA3,A6	SAVE REGISTER A3
	ST	A4,DWTA4,A6	              A4
	ST	A5,DWTA5,A6	              A5
EXIT	ABL	TDISP
HALT	ST	A2,DWTA2,A6 
	CF	A5,HLTIO	EXECUTE CIO-HALT 
	LD	A2,DWTA2,A6 
	RB	STRTIO	RESTART REQUEST
* 
* 
	EJECT
* 
* 
* 
*   STORE CHARACTER IN ECB-BUFFER 
* 
* 
STORE	LD	A4,2,A8	GET BUFFER ADDRESS 
	ADR	A4,A3	GET CHARACTER ADDRESS
	SCR	A2,A4	STORE CHARACTER
	ADK	A3,1	INCREMENT BUFFER INDEX
	RTN	A5 
* 
* 
* 
	IFT	TIMOUT=1 
* 
* 
*   TIMOUT ROUTINE
* 
* 
TWTUT	EQU	* 
	LDR	A6,A1	GET DWT-ADDRESS
	LDK	A1,/40	TIME OUT RETURN CODE
	XIF
* 
* 
	EJECT
* 
* 
*   L D R E G E 
* 
*   RESTORE A3-A5 FROM DWT AND RETURN TO USER VIA A5
* 
* 
LDREGE	EQU	*
	LD	A3,DWTA3,A6	RELOAD REGISTER A3
	LD	A4,DWTA4,A6	                A4
	LD	A5,DWTA5,A6	                A5
	LD	A7,DWTOR,A6 
	ANK	A7,/FF 
	LD	A8,DWTECB,A6
	RTN	A5	RETURN VIA A5-STACK 
	EJECT
* 
* 
*    G E T C H R
* 
*    SUBROUTINE TO GET ONE CHARACTER FROM ECB-BUFFER
* 
*    ON ENTRY:
* 
*    A3 = BUFFER INDEX
*    A8 = ECB-ADDRESS 
* 
*    ON EXIT: 
* 
*    A2 = CHARACTER 
*    A1 = 0 IF LAST CHARACTER ELSE # 0
* 
*    IF LAST CHARACTER IS REACHED A3 IS STORED IN ECB EFFECTIVE LENGTH
* 
* 
GETCHR	EQU	*
	LD	A1,4,A8	REQUESTED LENGTH
	SUR	A1,A3
	RF(NP)	GCH010	LAST CHARACTER REACHED 
	LD	A1,2,A8	GET BUFFER ADDRESS
	ADR	A1,A3
	LCR	A2,A1	CHAR. TO A2
	ANK	A2,/FF 
	ADK	A3,1	INCREMENT BUFFER INDEX
	RTN	A5 
GCH010	ST	A3,6,A8	STORE EFFECTIVE LENGTH
	RTN	A5 
	EJECT
* 
*   DEVICE WORK TABLE FOR TYPEWRITER
* 
* 
DWTW01	EQU	*	TABLE ENTRY
	DATA	/0010	CHANNEL PARAMETER 
	DATA	/8000	STATUS./8000 MEANS DEVICE READY 
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	TWAD	POINTER TO ADDRESS BLOCK 
	DATA	0	TTAB-ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TERMINAL QUEUE
	IFT	MMUPAG=1 
	DATA	0	SAVE AREA USER ECB ADDRESS
	DATA	DEVECB	MMU ECB ADDRESS
	XIF
	DATA	0	OUTPUT QUEUE LINK 
	DATA	0	SAVE AREA FOR A3
	DATA	0	SAVE AREA FOR A4
	DATA	0	SAVE AREA FOR A5
	RES	4	STACK BASE 
	DATA	1	TIMER POINTER 
	DATA	0	ECHO DEVICE 
	DATA	/5F5E	LEFT BYTE BACKSPACE KEY 
			RIGHT BYTE CANCEL KEY
	DATA	/0D00	LEFT BYTE STANDARD EOR
			RIGHT BYTE DOUBLE ZERO 
	DATA	0	HEAD POSITION POINETR 
	DATA	0	SAVE AREA FOR A2
* 
	EJECT			DRTW01 
* 
* 
	IFT	MMUPAG=1 
DEVECB	EQU	*
	DATA	0 
	DATA	TW:BUF
	DATA	0,0,0,0 
	RES	DVBKTB+1 
TW:BUF	RES	DVBLEN+1 
	XIF
* 
* 
* 
	END

Full view