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

⟦69c93db9c⟧

    Length: 13692 (0x357c)
    Notes: pts_type(SC)
    Names: »DRMS01.SC«

Derivation

└─⟦efe3a1cfc⟧ Bits:30009667 Philips computer tape "600113"
    └─⟦this⟧ »TOSSWORK/DRMS01.SC« 

PTS(SC)

	IDENT DRMS01 	REL 9.1 78-09-15  870106040912 

* 
************************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRMS01 = DRIVER MAGNETIC STRIPE 
* 
* 
* 
* 
* 
* 
* 
**************************************************
* 
* 
*   THIS DRIVER HANDLES INPUT/OUTPUT ON THE 
*   M A G N E T I C  S T R I P E  U N I T  (M S U)  PTS 6XXX. 
*   THE MSU MUST BE CONNECTED TO THE CPU VIA CHLT OR CHRT.
* 
*   TRACK 2 AND 3 ON STRIPES CAN BE READ AND TRACK 3 CAN BE 
*   WRITTEN.
* 
*   EACH TRACK CONSISTS OF START CHARACTER, 1-104 DATA CHARACTERS,
*   END CHARACTER AND LRC CHARACTER.
* 
*   THE DRIVER CONSISTS OF FOLLOWING PARTS: 
* 
*   A C M S :    ACTIVATION PART
*                ORDER PROCESSOR
*   I H M S :    INTERRUPT HANDLER
*   O N M S :    RECOVERY ROUTINE 
* 
* 
	EJECT			DRMS01 
* 
*  THE FOLLOWING ORDERS ARE TREATED:
* 
*   06   WRITE CARD 
*   0A   READ CARD
*   11   INSERT CARD
*   26   END OF OPERATION 
* 
*   THE FOLLOWING RETURN CODE IS USED:
* 
*   BIT  0   REQUEST ERROR
*        7   NO DATA
*       10   CARD MISSING 
*       12   INCORRECT LENGTH 
*       13   NEGATIVE ACKNOWLEDGEMENT 
*       14   THROUGHPUT ERROR 
*       15   NOT OPERABEL 
* 
* 
*   NORMAL USE OF REGISTERS:
* 
*   REGISTER  A1   RETURN CODE
*             A2   INPUT/OUTPUT CHARACTER 
*             A3   BUFFER INDEX 
*             A4
*             A5   STACK BASE POINTER 
*             A6   DWT ADDRESS
*             A7   ORDER
*             A8   ECB ADDRESS
	EJECT			DRMSO1 
* 
*********** 
* ENTRIES * 
*********** 
* 
	ENTRY	MSAD	ADDRESS BLOCK 
* 
************* 
* EXTERNALS * 
************* 
* 
	EXTRN	SAVE8	SAVE REGISTER A1-A8 ON A15 STACK 
	EXTRN	STREG	STORE REGISTERS AND GO TO DISPATCHER 
	EXTRN	LDREG	LOAD REGISTER AND RETURN TO USER VIA A5
	EXTRN	OUTPUT	SUBROUTINE TO SEND CHARACTER
	EXTRN	DISIOE	DISPATCH END I/O, REQUEST ERROR 
	EXTRN	GETCHR	GET NEXT CHARACTER IN ECB-BUFFER
	EXTRN	DISEND	END I/O AND DISPATCH
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	DWTST	DWT SOFTWARE STATUS
	EXTRN	DWTOR	ORDER
	EXTRN	DWTECB	ECB-ADDRESS 
	EJECT			DRMS01 
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
	EJECT			DRMS01 
* 
************* 
* CONSTANTS * 
************* 
* 
CRWSTX	EQU	/3B	CARD START CHARACTER 
CRWETX	EQU	/3F	CARD END CHARACTER 
RTRIES	EQU	2	NO OF RETRIES
* 
********************
* DWT-DISPLACEMENT *
********************
* 
DWTBC	EQU	/3	BYTE COUNTER 
DWTSB2	EQU	/1E	STACK BASE POINTER 
DWTA4	EQU	/14 
DWTLRC	EQU	/26	LRC-ACCUMULATOR
* 
********************
* ECB-DISPLACEMENT *
********************
* 
ECBBA	EQU	2	BUFFER ADDRESS
ECBRL	EQU	4	REQUESTED LENGTH
ECBEL	EQU	6	EFFECTIVE LENGTH
ECBRC	EQU	8	RETURN CODE 
ECBCW	EQU	10	CONTROL WORD 
	EJECT			DRMS01 
* 
**********
* TABLES *
**********
* 
MSAD	EQU	*
	DATA	ACMS	ACTIVATION DRIVER
	DATA	IHMS	INTERRUPT HANDLER
	DATA	RCMS	RECOVERY ROUTINE 
* 
* 
TAB	EQU	*	ORDER TABLE 
	DATA	/060A,/1126 
TABL	EQU	*-TAB
* 
MSFUN	EQU	*	MAGNETIC STRIPE FUNCTION
	DATA	WRITE,READ,INSERT 
	DATA	ENDOP 
	EJECT			DRMS01 
* 
* 
*   A C M S 
* 
*   ACTIVATION PART: CHECKS VALIDITY OF ORDERS
*                    AND STARTS PROCESSING. 
* 
* 
ACMS	EQU	*
	LDK	A4,TABL-1
ACMS10	CC	A7,TAB,A4	FIND OUT IF LEGAL ORDER 
	RF(E)	ACMS20	VALID ORDER 
	SUK	A4,1 
	RB(NN)	ACMS10	TRY NEXT 
* 
* 
MSERR	ABL	DISIOE	DISPATCH END I/O,REQUEST ERROR 
* 
ACMS20	EQU	*
	ADR	A4,A4	GET INDEX
	ABI	MSFUN,A4	BRANCH TO VALID FUNCTION MODULE 
	EJECT			DRMS01 
* 
*   INSERT CARD   /11 
* 
INSERT	EQU	*
	LDK	A4,/0C	CHAR DOC. INSERTED
INSE02	EQU	*
	LC	A2,DWTBC,A6	GET BYTE COUNTER
	ANK	A2,/FF 
	RF(NE)	INSE10
INSE05	EQU	*
	LDK	A2,/01	GENERAL RESET 
	CF	A5,OUTPUT	SEND IT 
	CF	A5,STREG	WAIT FOR MESSAGE FROM MSU
INSE10	CWR	A2,A4	DOCUMENT INSERTED/ESCAPED
	RB(NE)	INSE05	NO 
	SC	A4,DWTST+1,A6	YES 
	EJECT			DRMS01 
* 
*   END OF INPUT/OUTPUT REQUEST 
* 
ENDIO	EQU	* 
	ABL	DISEND 
	EJECT			DRMS01 
* 
*   READ CARD   /0A 
* 
READ	EQU	*
	LDK	A4,RTRIES	SET NO OF RETRIES
	LC	A2,DWTBC,A6	GET BYTE COUNTER
	ANK	A2,/FF 
	SUK	A2,/0C	DOCUMENT INSERTED 
	RF(NE)	WRIT02	NO 
READ02	EQU	*
	LDK	A3,0	RESET BUFFER INDEX
	LD	A2,ECBCW,A8	GET TRACK NUMBER
	SUK	A2,2 
	RB(N)	MSERR	TRACK < 2
	CWK	A2,1 
	RB(G)	MSERR	TRACK > 3
	ADK	A2,/A	COMPUTE TRACK TO SELECT
	CF	A5,OUTPUT	SEND READ TRACK COMMAND (/0A OR /0B)
	CM	DWTLRC,A6	CLEAR LRC-ACKUMULATOR 
READ05	EQU	*
	CF	A5,STREG	WAIT FOR DATA INPUTS 
	LDR	A7,A2
	SUK	A7,4	OPERATION INCORRECT 
	RF(NE)	READ07	NO 
	SUK	A4,1	COUNT NO OF RETRIES 
	RB(NZ)	READ02	TRY AGAIN
READ06	LDK	A1,4	NEGATIVE ACKNOWLEDGEMENT
ENDIO1	RB	ENDIO 
READ07	SUK	A7,2	OPERATION CORRECT?
	RB(E)	ENDIO	YES
	SUK	A7,2 
	RF(E)	READ60	NO DATA 
	LDR	A3,A3	FIRST CHARACTER
	RF(N)	READ40	NO; LRC-CHARACTER 
	RF(NE)	READ10	NO; DATA INPUT 
	ADK	A3,/80 
	CWK	A2,CRWSTX	START CHARACTER
	RF(E)	READ25	YES 
	LDK	A1,2	THROUGHPUT ERROR
	RB	ENDIO1	END I/O
READ10	ANK	A3,/7F	MASK BUFFER INDEX 
	CWK	A2,CRWETX	END CHARACTER
	RF(NE)	READ20	NO 
	ST	A3,ECBEL,A8	YES; STORE EFFECITVE LENGTH 
	NGR	A3,A3	NEGATE REGISTER
	RF	READ25
READ20	EQU	*
	CF	A15,STORE	STORE CHAR IN ECB-BUFFER
	CW	A3,ECBRL,A8	EFF.LENGTH = REQ.LENGTH 
	RF(G)	READ50	NO
READ25	XRS	A2,DWTLRC,A6	UPDATE LRC ACKUMULATOR
	CF	A15,CDCHK	CHECK IF CODE  CHECK ERROR
	RB	READ05
READ40	XR	A2,DWTLRC,A6	CHECK LRC
	ANK	A2,/F	MASK LRC-SUM 
	RB(E)	READ05	LRC CORRECT 
	RB	READ06
READ50	LDK	A1,8	INCORRECT LENGTH
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
	RB	ENDIO1
READ60	LDKL	A1,/100	NO DATA 
	RB	ENDIO1
	EJECT			DRMS01 
* 
*   WRITE CARD   /06
* 
WRITE	EQU	* 
	LDK	A4,RTRIES	SET NO OF RTRIES 
	LC	A2,DWTBC,A6	GET BYTE COUNTER
	ANK	A2,/FF 
	SUK	A2,/0C	DOCUMENT INSERTED 
	RF(E)	WRIT05	YES 
WRIT02	LDK	A1,/20	CARD MISSING
ENDIO2	RB	ENDIO 
WRIT05	EQU	*
	LDK	A3,0	RESET BUFFER INDEX
	CM	DWTLRC,A6	CLEAR LRC-ACKUMULATOR 
	LDK	A2,CRWSTX	CARD START CHARACTER 
WRIT10	EQU	*
	XRS	A2,DWTLRC,A6	UPDATE LRC-ACKUMULATOR
	CF	A5,OUTPUT	SEND CHARACTER
WRIT15	CF	A15,GETCHR	GET NEXT CHAR FROM ECB-BUFFER
	LDR	A1,A1	LAST CHARACTER 
	RF(E)	WRIT20	YES 
	CF	A15,CDCHK	VALID CODE? 
	LDR	A1,A1
	RB(Z)	WRIT10	YES 
	RB	WRIT15
WRIT20	EQU	*
	LDK	A2,CRWETX	CARD END CHARACTER 
	XRS	A2,DWTLRC,A6	UPDATE LRC
	CF	A5,OUTPUT	SEND CHARACTER
	XR	A2,DWTLRC,A6	LRC-CHARACTER
	ORK	A2,/30	SET ZONE
	CF	A5,OUTPUT	SEND LRC-CHARACTER
WRIT25	CF	A5,STREG	WAIT FOR STATUS MESSAGE
* 
	LDR	A7,A2
	SUK	A7,4	OPERATION INCORRECT ? 
	RF(NE)	WRIT30	NO 
	SUK	A4,1 
	RB(NZ)	WRIT05	TRY AGAIN
WRIT27	LDK	A1,4	NEGATIVE ACKNOWLEDGEMENT
	RB	ENDIO2
WRIT30	SUK	A7,2	OPERATION CORRECT ? 
	RB(Z)	ENDIO2	YES 
	SUK	A7,2 
	RB(E)	WRIT27	NO DATA AT READ CHECK 
	RB	WRIT25
	EJECT			DRMS01 
* 
*   END OF OPERATION   /26
* 
ENDOP	EQU	* 
	LDK	A2,/01	GENERAL RESET 
	CF	A5,OUTPUT	SEND CHARACTER
	LDK	A4,/0D	DOCUMENT ESCAPED
	LC	A2,DWTBC,A6	GET BYTE COUNTER
	ANK	A2,/FF 
	RF(NE)	END10 
END05	CF	A5,STREG	WAIT FOR MESSAGE FROM MSU 
END10	CWR	A2,A4	DOCUMENT ESCAPED? 
	RB(NE)	END05	NO
	SC	A4,DWTST+1,A6	CHAR TO BYTE COUNTER IN DWT 
ENDIO3	RB	ENDIO2
	EJECT			DRMS01 
* 
*   I H M S 
* 
*   INTERRUPT HANDLER 
* 
* 
IHMS	EQU	*
	ANK	A2,/FF 
	LD	A3,DWTST,A6	GET STATUS WORD 
	RF(NN)	IHM100	BUSY 
	LDR	A3,A2	SAVE CHAR
	SUK	A3,/0C	DOCUMENT INSERTED 
	RF(E)	IHMS10 
	SUK	A3,1	DOCUMENT ESCAPED
	RF(NE)	EXIT
IHMS10	EQU	*
	SC	A2,DWTST+1,A6	SET STATUS WORD 
EXIT	ABL	TDISP	GO TO DISPATCHER 
* 
*   DEVICE BUSY 
* 
IHM100	EQU	*
	LDR	A1,A1	RETURN CODE FROM CHLT/CHRT 
	RB(NE)	ENDIO3	YES; INDICATE NOT OPERABEL 
	LDR	A4,A4	OUTPUT ANSWER ?
	RF(Z)	IHRET	YES
	SUK	A7,/11	INSERT CARD 
	RF(E)	IHRET	YES
	SUK	A7,/15	END OF OPERATION? 
	RF(E)	IHRET
	LDR	A4,A2
	SUK	A4,/0D	DOCUMENT ESCAPED ?
	RF(E)	IHM140	YES 
IHRET	ABL	LDREG	LOAD REG. AND RETURN CALLING SEQ VIA A5 
* 
IHM140	LDK	A4,/0D 
	SC	A4,DWTST+1,A6	UPDATE STATUS WORD
	LDK	A1,/20	CARD MISSING
ENDIO4	RB	ENDIO3
	EJECT			DRMS01 
* 
* 
*   R C M S 
* 
*   RECOVERY ROUTINE
* 
* 
RCMS	EQU	*
	CF	A15,SAVE8	SAVE A1-A8 ON A15 STACK 
	LDK	A2,/0D 
	SC	A2,DWTST+1,A6	RESET STATUS WORD 
	LD	A7,DWTST,A6	BUSY? 
	RB(N)	EXIT	NO
	LDK	A1,2	THROUGPUT ERROR 
	RB	ENDIO4
	EJECT			DRMS01 
* 
*   STORE = SUBROUTINE TO STORE CHARACTER 
*           IN ECB-BUFFER AND INCREMENT BUFFER INDEX. 
* 
STORE	EQU	* 
	LD	A7,ECBBA,A8	BUFFER ADDRESS
	ADR	A7,A3	ADD BUFFER INDEX 
	SCR	A2,A7	STORE CHAR 
	ADK	A3,1	INCR. INDEX 
	RTN	A15
* 
* 
*   CDCHK = CHECK IF CODE CHECK ERROR 
* 
*   AT ENTRY: A2=CHARACTER
*   AT EXIT: A1=RERURN CODE 0,4 
CDCHK	EQU	* 
	LDR	A1,A2
	SUK	A1,/30	VALID CODE? 
	RF(N)	CDC05	NO 
	SUK	A1,/F	NUMERIC VALUE? 
	RF(P)	CDC05	NO 
	LDK	A1,0	SET R.C.
	RF	CDC10 
CDC05	LDK	A1,4	SET R.C. 
	ORS	A1,ECBRC,A8	INSERT IN ECB
CDC10	RTN	A15 
	END

Full view