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

⟦af80ffa9f⟧

    Length: 17372 (0x43dc)
    Notes: pts_type(SC)
    Names: »DROD01.SC«

Derivation

└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
    └─⟦this⟧ »TOSSWORK/DROD01.SC« 

PTS(SC)

	IDENT DROD01 	REL 11.0 81-01-26 870105041100 

			=1,NO SPECIAL ORDER CODES FOR CREDIT APPLICATIONS
			PRR 11.1 80-01-23$$
* 
******************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DROR01 = DRIVER OPTICAL CHARACTER READER
* 
* 
* 
* 
* 
* 
******************************************* 
* 
* 
*    THIS DRIVER HANDLES INPUT FROM OCR 
*    CONNECTED TO CPU VIA CHLT OR CHRT. 
* 
*    ONLY INPUT DATA FROM OCR 
*    ARE HANDLED BY THE DRIVER. 
* 
* 
*    THE DRIVER CONSISTS OF FOLLOWING PARTS:
* 
*    A C O D : ACTIVATION PART
* 
*    I H O D : INTERRUPT HANDLER
* 
*    R C O D : RECOVERY ROUTINE 
* 
	EJECT		DROD01
* 
* 
*    THE FOLLOWING ORDERS ARE THREATED: 
* 
*    ORDER 02: READ DOCUMENT
*    ORDER 04: RESET INPUT BUFFER 
* 
* 
*    NORMAL REGISTER USAGE :
* 
*    REGISTER A1 : RETURN CODE
*             A2 : INPUT CHARACTER
*             A3 : BUFFER INDEX 
*             A4 : WORK REGISTER
*             A5 : STACK BASE 
*             A6 : DWT-ADDRESS
*             A7 : ORDER
*             A8 : ECB-ADDRESS
* 
* 
* 
*    SYSTEM ADAPTATION
* 
*    THE LENGTH OF THE CIRCULAR INPUT BUFFER IS 
*    DEFINED IN DWT. STANDARD VALUE IS 80 CHARACTERS
*    NOTE !!!  THAT LENGTH MUST BE THE SAME FOR ALL 
*    DWT:S IN SYSTEM
* 
*    IF TIMING IS WANTED, TIMER POINTER 
*    IN DWT MUST BE SET UNEQUAL TO ZERO.
*    STANDARD VALUE FOR TIME-OUT IS 30 SECONDS
*    SINCE LAST CHARACTER. IF ANOTHER VALUE 
*    IS WANTED FOR A SYSTEM, INDICATOR
*    IN DRIVER MUST BE CHANGED. 
* 
	EJECT		DROD01
* 
*    BY MEANS OF CONDITIONAL ASSEMBLY IT IS POSSIBLE
*    TO EXCLUDE FROM THE DRIVER FOLLOWING FUNCTIONS:
* 
*    -----POWER ON INDICATION 
*    -----TIME-OUT-FUNCTION 
* 
*   ENTRIES 
* 
* 
	ENTRY	ODAD	ADDRESS-BLOCK 
* 
* 
* 
*    EXTERNAL TOSS MODULE ENTRIES 
* 
* 
* 
	EXTRN	LENDER	END REQUEST AND DISPATCH
	EXTRN	INPUT	READ A CHARACTER 
	EXTRN	TENDIO	END I/O 
	EXTRN	LDISP	DISPATCHER ENTRY 
	EXTRN	SETIME	SET TIME
	EXTRN	NDGET8	LOAD REGISTERS
* 
* 
	EXTRN	DWTCHP	CHANEL PARAMETER
	EXTRN	DWTST	STATUS 
	EXTRN	DWTBC	BYTE COUNTER 
	EXTRN	DWTADR	DRIVER ADDRESS BLOCK
	EXTRN	DWTA3	SAVE AREA A3 
	EXTRN	DWTA4	SAVE AREA A4 
	EXTRN	DWTA5	SAVE AREA A5 
	EXTRN	DWTSB2	STACK BASE 2 IN DWT 
	EXTRN	DWTWAT	SAVE INPUT DWT
	EXTRN	DWTDEV	DEVICE STATUS 
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUESTED LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE LENGTH 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	ECBCW	ECB CONTROL WORD 
	EJECT		DROD01
* 
* 
* 
*     CONSTANTS 
* 
* 
* 
OVMASK	EQU	/2	OVERFLOW IN INPUT BUFFER
* 
X:B	EQU	80	LENGTH OF CIRCULAR INPUT BUFFER
DWTLNG	EQU	X:B	NUMBER OF BYTES IN DECIMAL FORM
ETX	EQU	/03	END CHARACTER 
* 
*    TIME BEFORE TIME-OUT 
* 
TIME	EQU	300	TIME OUT CONSTANT
* 
* 
* 
* 
	EJECT		DROD01
* 
* 
****************************************
*    CONDITIONAL ASSEMBLY              *
****************************************
* 
* 
*      BY SETTING X:A = 1 THE FOLOWING POWER OFF FUNCTION 
*      IS INCLUDED IN THE DRIVER. 
*      IF THERE IS A READ REQUEST THIS IS COMPLETED WITH
*      -2 IN THE CONTROL WORD OF ECB. 
*      IF THERE IS NO READ REQUEST , THE FIRST READ REQUEST 
*      AFTER POWER ON IS COMPLETED WITH -2 IN CONTROL WORD
*      OF ECB 
* 
* 
X:A	EQU	0 
POWOFF	EQU	1
* 
* 
*    TIME OUT FUNCTION MAY BE EXCLUDED BY 
*    SETTING X:A = 0. 
* 
X:F	EQU	1 
CTIMUT	EQU	X:F
* 
* 
*   MMU BUFFER SIZE 
* 
X:C	EQU	80
DVBLEN	EQU	X:C
* 
* 
*   MMU KEY TABLE SIZE
* 
X:D	EQU	10
DVBKTB	EQU	X:D
* 
* 
*	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		DROD01
* 
* 
********************* 
* 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
* 
DWTCON	EQU	/8	CONVERSION TABLE
DWTTP	EQU	/A	TIMER POINTER
DWTLRC	EQU	/E	LRC - ACKUMULATOR 
DWTINQ	EQU	/10	POINTER TO FIRST PLACE IN QUEUE
DWTUTQ	EQU	/12	POINTER TO LAST PLACE IN QUEUE 
DWTSQ	EQU	/14	END OF QUEUE
DWTEQ	EQU	DWTSQ+DWTLNG	END OF QUEUE 
* 
	EJECT		DROD01
* 
* 
**************
* TABLES     *
**************
* 
* 
	DATA	DVBKTB	MMU KEY TABLE SIZE 
	DATA	DVBLEN	MMU BUFFER SIZE
	DATA	6	DEVICE INDEX
ODAD	EQU	*
	DATA	ACOD	ACTIVATION DRIVER
	DATA	0	ABORT ROUTINE ADDRESS 
	DATA	IHOD	INTERRUPT HANDLER
* 
	IFF	POWOFF=1 
	DATA	0	NO RECOVERY 
	XIF
* 
	IFT	POWOFF=1 
* 
	DATA	RCOD	RECOVERY ROUTINE 
	EJECT		DROD01
* 
* 
*    R C O D
* 
*    THIS IS THE RECOVERY ROUTINE FOR OCR 
*    ENTERED FROM CHLT/CHRT DRIVER
* 
RCOD	EQU	*
	INH
* 
	IFT	POWOFF=1 
	LDKL	A1,/800 
	ORS	A1,DWTDEV,A6	INDICATE POWER OFF OCCURED
	LD	A3,DWTST,A6	I/O-REQUEST 
	RF(N)	RCOD05	NO
	LD	A4,DWTDEV+DWTTP,A6	TIME EQUAL 0 
	RF(Z)	RCOD05	YES 
	CM*	DWTDEV+DWTTP,A6	RESET TIME 
	CM	DWTDEV+DWTTP,A6	RESET TIMER 
RCOD05	EQU	*
	LDK	A1,1 
	ORS	A1,DWTST,A6	RECOVERY FLAG
RCOD10	EQU	*
	LDR	A1,A6	GET DWT - ADRESS 
	CF	A15,SETIME	SET TIME 
	DATA	RCTUT,/A
	ST	A4,DWTDEV+DWTTP,A6
	RF	RCTDIS	DISPATCH 
RCTUT	EQU	* 
	INH
	IFT	POWOFF=1 
	LDR	A6,A1
RCTUT5	EQU	*
	CM	DWTDEV+DWTTP,A6 
			GET DWT-ADDRESS
	LD	A8,4,A6	GET ECB-ADDRESS 
	RF(Z)	RCTUT6	SYSTEM START SKIP BUFFER
	INH
	XIF
	CM	10,A8	INDICATE POWER ON 
	IFT	POWOFF=1 
RCTUT6	EQU	*
	ENB
	ENB
	LDKL	A1,/FFFE	RESET RECOVERY 
	ANS	A1,DWTST,A6
	LDK	A1,0 
	LD	A2,DWTDEV+DWTINQ,A6 
	SCR	A1,A2
	ST	A2,DWTDEV+DWTUTQ,A6 
	LD	A3,DWTST,A6 
	RF(NN)	RCEND 
RCTDIS	EQU	*
	ABL	LDISP	DISPATCH 
RCEND	EQU	* 
	LDKL	A4,/FDFF
	ANS	A4,DWTST,A6	RESET POWER OFF
	ABL	LDISP	DISPATCH 
	XIF
* 
	EJECT		DROD01
* 
* 
*    A C O D
* 
*    ACTIVATION PART: 
* 
*    CHECKS VALIDITY OF ORDERS AND EXAMINES 
*    INPUT BUFFER TO SEE IF SOME QUEUED 
*    TO THREAT. 
* 
* 
ACOD	EQU	*
	LDK	A1,0 
	LDK	A3,0	START BUFFER INDEX
	ST	A3,DWTDEV+DWTLRC,A6	CLEAR LRC-ACKUMULATOR 
	LDR	A4,A7

	SUK	A4,4 

	SUK	A4,/2D 
	RF(Z)	CRE:10	SKIP INPUT BUFFER 
	ADK	A4,/2D 
CRE:10	EQU	*
	RF(N)	AOD200	ORDER 2 
AOD100	ORKL	A1,/8000	I/O REQUEST ERROR
AOD105	EQU	*
	ABL	LENDER	COMPLETE REQUEST
	EJECT		DROD01
* 
* 
*    ORDER 4 RESET INPUT BUFFER 
* 
AOD110	LD	A2,DWTDEV+DWTINQ,A6	ORDER 4 
	SCR	A1,A2	RESET OVERFLOW IF OCCURED
	ST	A2,DWTDEV+DWTUTQ,A6	RESET OUTPUT QUEUE
	ABL	ENDIO	END I/O
	EJECT		DROD01
* 
* 
* 
* 
AOD200	EQU	*
* 
	IFT	POWOFF=1 
* 
	LD	A2,DWTDEV,A6
	ANKL	A2,/800	POWER OFF ? 
	RF(E)	AOD205 
	XRS	A2,DWTDEV,A6	RESET BIT 
	XIF
AOD202	EQU	*
	CM	10,A8	INDICATE POWER ON 
	IFT	POWOFF=1 
	ABL	AOD380 
* 
	XIF
* 
AOD205	EQU	*
* 
	IFT	CTIMUT=1 
* 
	LD	A1,DWTDEV,A6	TIMING ON THIS DEVICE
	RF(NN)	AOD210	NO TIMING ON THIS DEVICE 
	RF(E)	AOD210	NO TIMING FOR THIS DEVICE 
	LD	A4,DWTDEV+DWTTP,A6
	RF(E)	AODTIM 
	RF	AOD210
AODTIM	EQU	*
	LDR	A1,A6	GET DWT ADRESS 
	CF	A15,SETIME	SET TIME 
	DATA	AODTUT,TIME	TIME OUT ROUTINE AND TIME 
	ST	A4,DWTDEV+DWTTP,A6	STORE TIMER ADDRESS IN DWT 
* 
	XIF
* 
	EJECT		DROD01
* 
* 
AOD210	EQU	*
	LD	A2,ECBRL,A8	REQUESTED LENGTH=0
AOD220	RF(E)	AOD380 
	LDR	A3,A3	FIRST TIME?
	RF(NE)	AOD240	N0!
	LD	A1,ECBBA,A8	BUFFER ADDRESS
	SUK	A1,1 
	ADR	A1,A2
AOD230	SCR	A3,A1	CLEAR ECB BUFFER 
	SUK	A1,1 
	SUK	A2,1 
	RB(NE)	AOD230
AOD240	EQU	*
	LD	A1,DWTDEV+DWTUTQ,A6 
	LCR	A2,A1
	LDR	A4,A2
	XRK	A4,/FF	OVERFLOW? 
	RF(NE)	AOD250	N0!
	SCR	A4,A1	YES !!!! 
	LDK	A1,OVMASK	OVERFLOW SET 
	RF	ENDIO	END I/O 
AOD250	CW	A1,DWTDEV+DWTINQ,A6	SOMETHING IN QUEUE? 
	RF(NE)	AOD260	 
	CF	A5,INPUT	READ A CHARACTER 
	IFT	CTIMUT=1 
	LDR	A1,A1	CHECK TIME OUT RETURN CODE 
	RF(Z)	AOD270	NO TIME-OUT 
	RF	ENDI05	END I/O AT TIME OUT
	XIF
	IFT	CTIMUT=0 
	RF	AOD270
	XIF
AOD260	CF	A15,EOQUEU	NEXT OUT POINTER 
	ST	A1,DWTDEV+DWTUTQ,A6	STORE NEW POINTER 
AOD270	EQU	*
	LDR	A4,A7
	SUK	A4,2 
	RF(NN)	AOD310	ORDER 2
	RB	AOD100	I/O REQUEST ERROR
	EJECT		DROD01
* 
* 
* 
*    ORDER 2  READ DOCUMENT 
* 
* 
* 
* 
* 
AOD310	EQU	*
	LDR	A3,A3	FIRST CHARACTER
	RF(N)	AOD400	NO:LRC-CHARACTER
AOD320	EQU	*
	LDK	A4,/40 
	TM	A4,A2	CHECK IF END CHARACTER
	RF(Z)	AOD330	NO
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH IN ECB 
	NGR	A3,A3	NEGATE REGISTER
	RF	AOD340
AOD330	EQU	*
	CWK	A2,/3F	REJECTED CHARACTER
	RF(NE)	AOD331	NO 
	LDKL	A1,/1000	INDICATE REJECTED CHARACTER
	ORS	A1,ECBRC,A8	STORE IN ECB-RETURN CODE 
AOD331	EQU	*
	CWK	A2,/21	DIRECTION REJECTED
	RF(NE)	AOD332	NO 
	LDK	A1,/10	INDICATE DIRECTION ERROR
	RF	ENDIO 
AOD332	EQU	*
	CWK	A2,/1C	QUADRATURE REJECTED?
	RF(NE)	AOD333	NO 
	LDKL	A1,/800	INDICATE QUADRATURE ERROR 
	RF	ENDIO 
AOD333	EQU	*
	CW	A3,ECBRL,A8	REQ.LENGTH=EFF.LENGTH 
	RF(NL)	AOD360	YES
	LD	A1,ECBCW,A8	KEY TABLE ADDRESS 
	RF(Z)	AOD340	NO KEYTABLE 
	LCR	A4,A1	TABLE LENGTH IN A4 
	ANK	A4,/FF 
	ADR	A1,A4	LAST PLACE IN KEY TABLE
	ADK	A1,1 
AOD335	EQU	*
	SUK	A4,1 
	RF(N)	AOD340	KEY NOT FOUND 
	SUK	A1,1	NEXT KEY
	CCR	A2,A1	FOUND? 
	RB(NE)	AOD335
	XRS	A2,DWTDEV+DWTLRC,A6	UPDATE LRC ACKUMULATOR 
	RB	AOD240
AOD340	EQU	*
	XRS	A2,DWTDEV+DWTLRC,A6	UPDATE LRC-ACKUMULATOR 
	CF	A15,CDCHK	CODE CHECK IF LESS /1F SET BIT 7
	LDR	A3,A3
	RF(N)	AOD345 
	CF	A15,STORE	STORE IN ECB-BUFFER 
AOD345	EQU	*
	RB	AOD240
AOD400	EQU	*
	ANK	A2,/3F	DELETE LRC-BIT
	XR	A2,DWTDEV+DWTLRC,A6	CHECK LRC-SUM 
	ANK	A2,/F
	RF(E)	AOD380	CORRECT   END I/O 
	LDK	A1,4	INDICATE LRC RERROR 
	RF	ENDIO 
AOD360	EQU	*
	CF	A15,CDCHK	CODE CHECK
	LDK	A1,8	LENGTH OVERFLOW 
	RF	ENDIO 
AOD380	LDK	A1,0	RETURN CODE 
	EJECT		DROD01
* 
* 
*    THIS IS A COMMON END OF THE DRIVER 
* 
*    SET EFFECTIVE LENGTH AND PERFORM END I/O 
* 
* 
ENDIO	EQU	* 
	IFT	CTIMUT=1 
	INH
	LD	A4,DWTDEV+DWTTP,A6
	RF(E)	ENDI05	NO TIMING ON THIS DEVICE
	CM*	DWTDEV+DWTTP,A6	RESET TIMER
	CM	DWTDEV+DWTTP,A6 
	XIF
* 
*** 
* 
ENDI05	EQU	*
	LDR	A3,A3
	RF(N)	ENDI10 
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
ENDI10	EQU	*
* 
	CF	A15,TENDIO	END REQUEST
	ABL	LDISP	DISPATCH 
* 
	EJECT		DROD01
* 
* 
* 
*     IHOD
* 
* 
*     THIS IS THE INTERRUPT HANDLER ENTERED FROM CHLT/CHRT DRIVER 
* 
* 
* 
IHOD	EQU	*
* 
	IFT	CTIMUT=1 
* 
	LD	A3,DWTDEV+DWTTP,A6
	RF(E)	IHOD05	NO TIMING ON THIS DEVICE
	LDKL	A3,-TIME	RESTART TIME 
	ST*	A3,DWTDEV+DWTTP,A6 
* 
	XIF
* 
IHOD05	EQU	*
IHOD10	EQU	*
	LD	A1,DWTDEV+DWTINQ,A6 
	LCR	A4,A1
	XRK	A4,/FF	ALREADY OVERFLOW? 
	RF(E)	EXIT	YES 
	LDR	A3,A1
	CF	A15,EOQUEU	GET NEXT OUTQUEUE POINTER ADDRESS
	CW	A1,DWTDEV+DWTUTQ,A6	OVERFLOW? 
	RF(NE)	IHOD20
	ORK	A2,/FF	SET OVERFLOWBIT IN INPUT BUFFER 
	RF	IHOD30
IHOD20	ST	A1,DWTDEV+DWTINQ,A6	STORE INQUEUE POINTER 
IHOD30	SCR	A2,A3
EXIT	EQU	*
	ABL	LDISP	DISPATCH 
	EJECT		DROD01
	IFT	POWOFF=1 
EXIT2	EQU	* 
	LD	A3,DWTA3,A6 
	RF(N)	EXIT4
	LD	A4,DWTDEV+DWTTP,A6	TIMER CLEARED
	RF(Z)	EXIT3	YES
	LDKL	A3,-100 
	ST*	A3,DWTDEV+DWTTP,A6	RESTART TIMER 
	LDK	A3,1 
EXIT3	EQU	* 
	ADK	A3,1 
	LDK	A4,/40 
	TM	A4,A2	ETX CHARACTER 
	RF(Z)	EXIT5	NO 
	NGR	A3,A3
EXIT5	EQU	* 
	ST	A3,DWTA3,A6 
	RB	EXIT	DISPATCH 
EXIT4	EQU	* 
	CM*	DWTDEV+DWTTP,A6	CLEAR TIMER
	LDK	A3,0 
	ABL	RCTUT5 
	XIF
	EJECT		DROD01
* 
* 
*    A O D T U T
* 
*    THIS IS THE TIME-OUT ROUTINE 
* 
* 
	IFT	CTIMUT=1 
* 
AODTUT	EQU	*
	LDR	A6,A1	GET DWT-ADDRESS
	LD	A1,DWTST,A6 
	RB(N)	EXIT 
	LDK	A1,/40	SET RETURN CODE 
	CM	DWTDEV+DWTTP,A6 
	RB	IHOD05	RESTORE REGISTERS AND END I/O
* 
	XIF
* 
	EJECT		DROD01
* 
*    STORE = SUBROUTINE TO STORE A CHARACTER IN 
*            ECB-BUFFER AND INCREMENT BUFFER INDEX
* 
*    ON ENTRY:
* 
*    A2 = CHARACTER TO STORE
*    A3 = BUFFER INDEX
* 
* 
STORE	EQU	* 
	LD	A4,ECBBA,A8	BUFFER ADDRESS
	ADR	A4,A3	ADD BUFFER INDEX 
	SCR	A2,A4	STORE CHARACTER IN BUFFER
	ADK	A3,1	INCREMENT BUFFER INDEX
	ANK	A2,/7F 
STORTN	ADKL	A15,2 
	LDR*	P,A15 
	EJECT		DROD01
* 
* 
*    EOQUEU = SUBROUTINE TO GET NEXT QUEUE POINTER
* 
*    ON ENTRY:
* 
*    A1 = QUEUE POINTER 
*    A6 = DWT-ADDRESS 
* 
*    ON EXIT: 
* 
*    A1 = NEW QUEUE POINTER 
EOQUEU	EQU	*
	ADK	A1,1 
	SUR	A1,A6
	CWK	A1,DWTEQ	END OF QUEUE? 
	RF(NE)	EOQU10
	LDKL	A1,DWTSQ	SET QUEUE START ADRESS 
EOQU10	ADR	A1,A6
	RB	STORTN
	EJECT		DROD01
* 
* 
*         CODE CHECK
* 
* 
*           AT ENTRY   A2= 6-BIT OCTAL CHARACTER
* 
*            AT EXIT   A2= 7-BIT ASCII CHARACTER
CDCHK	EQU	* 
	LDR	A4,A2	SAVE REGISTER
	SUK	A4,/1F	LESS THEN /1F CONVERT TO ASCII
	RF(NN)	CDC05	NO
	ORK	A2,/40	SET BIT 7 
CDC05	EQU	* 
	RB	STORTN
	END

Full view