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

⟦84c52811d⟧

    Length: 36096 (0x8d00)
    Notes: pts_type(SC)
    Names: »DRTN01.SC«

Derivation

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

PTS(SC)

	IDENT DRTN01 	REL 11.0 81-03-18 870105041100 
*			=1 SUPPORT BOTH TND2.05 AND TND6.01 
			=2,NO MOVE OF USER BUF. WHEN OPN AND MMU 
			=2,REL 11.0 81-01-28 
*			REL 11.0  81-01-26

************************************************************
* 
*   PHILIPS TERMINAL SYSTEM   PTS 
* 
*   DRTN01 = DRIVER TELLER NOTE DISPENSER 
* 
************************************************************
* 
* 
*   THIS DRIVER HANDLES THE MICROCOMPUTER IN THE NOTE 
*   DISPENSER (ND). 
*   (VERSION 2.05 AND 6.01)	=1
*   THE ND IS INTENDED FOR USE IN PTS6000 BANKING SYSTEMS.
* 
*   THE INTENTION WITH THE NOTE DISPENSER IS TO DISPENSE
*   BANK NOTES FROM CASSETTES TO THE TERMINAL OPERATOR
*   OR THE CUSTOMER.UP TO 100 NOTES CAN BE ORDERED IN 
*   ONE COMMAND FROM A NUMBER OF CASSETTES CONTAINING 
*   VARIOUS DENOMINATIONS.
* 
* 
*   THE DRIVER CONSISTS OF FOLLOWING PARTS: 
* 
*   ACTN:   ACTIVATION PART,ORDER PROCESSOR 
*   RCTN:   RECOVERY ROUTINE
* 
* 
*   THE FOLLOWING ORDERS ARE TREATED: 
* 
*	/21   OPEN
*	/22   CLOSE 
*	/2C   READ DEVICE STATUS
*	/2A   READ CONTROL
*	/2D   READ DIAGNOSTIC 
*	(SPLIT=0) 
*	/2B   DISPENSE AND DELIVER
*	(SPLIT=1) 
*	/2B   DISPENSE
*	/38   DELIVER 
*	/31   DUMP
*   THE FOLLOWING RETURN CODES ARE USED:
* 
*   BIT   0  REQUEST ERROR                     =  8000
*         1  NO CASSETTE                       =  4000
*         2  NOTES IN DELIVERY UNIT            =  2000
*         3  BAD NOTES                         =  1000
*         4  REJECT CASSETTE FULL              =  0800
*         5  CASSETTE LOW                      =  0400
*         6  CASSETTE EMPTY                    =  0200
*         7  JAMMED NOTES                      =  0100
*         8  POWER FAILURE                     =  0080
*         9  TIME-OUT                          =  0040
*        10  REJECTED NOTES                    =  0020
*        11  SEQUENCE ERROR                    =  0010
*        12  COMMUNICATION ERROR               =  0008
*        13  FIRMWARE ERROR                    =  0004
*        14  HARDWARE ERROR                    =  0002
*        15  NOT OPERABLE                      =  0001
* 
*   NORMAL USE OF REGISTERS:
* 
*     A1    RETURN CODE 
*     A2    INPUT/OUTPUT CHARACTER
*     A3
*     A4    BUFFER INDEX OR BUFFER POINTER
*     A5    STACK BASE POINTER
*     A6    DWT ADDRESS 
*     A7    ORDER 
*     A8    ECB ADDRESS 
	EJECT
* 
*********** 
* ENTRIES * 
*********** 
* 
	ENTRY	TNAD	ADDRESS BLOCK 
	EJECT
* 
********************************
* EXTERNAL TOSS MODULE ENTRIES *
********************************
* 
	EXTRN	INPUT	INPUT ONE CHARACTER
	EXTRN	STABLK	START OF BLOCK
	EXTRN	OUTPUT	OUTPUT ONE CHARACTER
	EXTRN	ENDBLK	END OF BLOCK
	EXTRN	LENDER	DISPATCH, END I/0 ,REQUEST ERROR
	EXTRN	LENDIS	END I/O AND DISPATCH
	EXTRN	LDISP	DISPATCH 
	EXTRN	SETIME	SET TIME
	EJECT
* 
**************************************
*	DEVICE INDEX VALUES 
**************************************
* 
	EXTRN	PC:DIX	PROGRAMMED CHANNEL DEVICE INDEX 
* 
* 
* 
********************
* ECB-DISPLACEMENTS * 
********************
* 
	EXTRN	ECBBA	BUFFER ADDRESS 
	EXTRN	ECBRL	REQUESTED LENGTH 
	EXTRN	ECBEL	EFFECTIVE LENGTH 
	EXTRN	ECBRC	RETURN CODE
	EXTRN	ECBCW	CONTROL WORD 
* 
* 
***************************** 
*	DWT PARAMETERS
******************************
* 
* 
	EXTRN	DWTOR	ORDER
	EXTRN	DWTECB	ECB-ADDRESS 
	EXTRN	DWTSB2	STACK BASE
* 
	EXTRN	DWTDEV	DEVICE DRIVER DEPENDANT (FIRST FIELD) 
* 
* 
	EJECT
* 
*	FORM STATEMENTS 
* 
BYTE	FORM	8,8 
QUART	FORM	4,4,4,4
	EJECT
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
X:A	EQU	0	ORDER 'DIPENSE AND DELIVER' 
*			IS SPLIT (OR NOT) 
*			INTO ORDERS 'DISPENSE', 'DELIVER', 'DUMP'.
SPLIT	EQU	X:A 
* 
* 
X:B	EQU	40	MMU BUFFER SIZE (STANDARD) 
DVBLEN	EQU	X:B
* 
* 
	EJECT
* 
* 
**************************************
* DWT-DISPLACEMENTS RELATIVE DWTDEV  *
*************************************** 
* 
DWTTP	EQU	2	TIMER POINTER 
DWTLR	EQU	DWTTP+2	BITS 0-7: INDICATOR LEFT OR RIGHT TELLER
DWTLRC	EQU	DWTLR	BITS 8-15: LRC-ACKUMULATOR 
DWTBFR	EQU	DWTLRC+2	DELAY-BUFFER (LAST HW-MESSAGE FROM ND)
DWTSTA	EQU	DWTBFR+2	NOTE DISPENSER STATUS 
DWTTAB	EQU	DWTSTA+2	STORE-CHECK TABLE POINTER 
DWTNCR	EQU	DWTTAB+2	NUMBER OF CHARACTERS RECEIVED 
DWTCNB	EQU	DWTNCR+2	OLD CASSETTE NUMBER 
DWTTP1	EQU	DWTCNB+2	TIMER POINTER DEVICE BUSY 
DWTRDS	EQU	DWTTP1+2	LOGGAREA: OUTPUT HW-ORDER, RECIEVED STAT
DWTBUF	EQU	DWTRDS+4	INTERN BUFFER 
* 
	EJECT
* 
************* 
* CONSTANTS * 
************* 
* 
BIT0	EQU	/8000
BIT1	EQU	/4000
BIT2	EQU	/2000
BIT3	EQU	/1000
BIT4	EQU	/0800
BIT5	EQU	/0400
BIT6	EQU	/0200
BIT7	EQU	/0100
BIT8	EQU	/0080
BIT9	EQU	/0040
BIT10	EQU	/0020 
BIT11	EQU	/0010 
BIT12	EQU	/0008 
BIT13	EQU	/0004 
BIT14	EQU	/0002 
BIT15	EQU	/0001 
* 
* 
TIME2M	EQU	1200	TIME CONSTANT=2 MINUTES 
TIME1M	EQU	600	TIME CONSTANT=1 MINUTE 
TIME9S	EQU	90	TIME CONSTANT=9 SECONDS 
TIME1S	EQU	10	TIME CONSTANT=1 SECOND
BUFLEN	EQU	36	DWT BUFFER LENGTH 
BLKSIZ	EQU	30	BLOCK-SIZE OUTPUT TO LINE DRIVER
	EJECT
* 
****************
* RETURN CODES *
****************
* 
REQERR	EQU	BIT0	REQUEST ERROR 
NOCASS	EQU	BIT1	NO CASSETTE 
NOTDEL	EQU	BIT2	NOTES IN DELIVERY UNIT
BADNOT	EQU	BIT3	BAD NOTES 
REJFUL	EQU	BIT4	REJECT CASSETTE FULL
CASLOW	EQU	BIT5	CASSETTE LOW
CASEMP	EQU	BIT6	CASSETTE EMPTY
JAMNOT	EQU	BIT7	JAMMED NOTES
PWFAIL	EQU	BIT8	POWER FAILURE 
TIMOUT	EQU	BIT9	TIME-OUT
REJNOT	EQU	BIT10	REJECTED NOTES 
SEQERR	EQU	BIT11	SEQUENCE ERROR 
COMERR	EQU	BIT12	COMMUNICATION ERROR
FMERR	EQU	BIT13	FIRMWARE ERROR IN TND 
HWERR	EQU	BIT14	HARDWARE ERROR
NOTOPE	EQU	BIT15	NOT OPERABLE 
REJNF	EQU	REJNOT+REJFUL	REJECTED NOTES+REJECT CASSETTE FULL 
	EJECT
******************* 
* STATUS BITS IN DWTDEV * 
******************* 
* 
OPNBIT	EQU	BIT15	OPEN/CLOSE BIT (1/0) 
RESDON	EQU	BIT14	RESET DONE BIT (0) 
DISDON	EQU	BIT13	DISPENSE DONE (1)
	EJECT
* 
*************** 
* ORDER CODES * 
*************** 
* 
OPEN	EQU	/21	OPEN 
CLOSE	EQU	/22	CLOSE 
DISDEL	EQU	/2B	DISPENSE AND DELIVER 
READCO	EQU	/2A	READ CONTROL 
READDI	EQU	/2D	READ DIAGNOSTIC
READDS	EQU	/2C	READ DEVICE STATUS 
DUMP	EQU	/31	DUMP NOTES 
DELIVE	EQU	/38	DELIVER
	EJECT
* 
********************* 
* HARDWARE COMMANDS * 
********************* 
* 
RESET	EQU	/30	RESET 
DISDLV	EQU	/31	DISPENSE AND DELIVER 
DISPNS	EQU	/32	DISPENSE 
DELIVR	EQU	/33	DELIVER
REJECT	EQU	/34	REJECT NOTES 
CASNBR	EQU	/35	GET CASSETTE NUMBERS 
STADIS	EQU	/36	GET STATUS FROM LAST DISPENSE
LIFTDW	EQU	/37	LIFTS DOWN 
LIFTUP	EQU	/38	LIFTS UP 
RTRACE	EQU	/39	GET REJECT TRACE AREA
CHKDEL	EQU	/3A	CHECK DELIVER UNIT 
ENDCH	EQU	/0D	END OF MESSAGE
	EJECT
* 
**********
* TABLES *
**********
* 
* 
* 
	DATA	DVBLEN	MMU BUFFER LENGTH
	DATA	PC:DIX	PROGRAMMED CHANNEL DEVICE INDEX
TNAD	EQU	*
	DATA	ACTN	ACTIVATION DRIVER
	DATA	0	ABORT ROUTINE 
	DATA	0	INTERRUPT HANDLER 
	DATA	RCTN	RECOVERY ROUTINE 
* 
* 
TNTAB	EQU	*	ORDER TABLE 
	BYTE	OPEN,CLOSE
	BYTE	DISDEL,READCO 
	BYTE	READDI,READDS 
	IFT	SPLIT=1
	BYTE	DUMP,DELIVE 
	XIF
TNLEN	EQU	*-TNTAB-1 
* 
* 
TNFUN	EQU	*	NOTE DISPENSER FUNCTION 
	DATA	OPENTN,CLOSTN,DISPEN
	DATA	RDCONT,RDDIAG,RDDEVS
	IFT	SPLIT=1
	DATA	DUMPA,DELIV 
	XIF
	EJECT
* 
*	TABLE OF NO-STORE BYTE-NUMBERS OF MESSAGE AFTER HW-COMMAND /30 (RESET)
* 
	DATA	RESEND-RESTAB 
RESTAB	EQU	*
	BYTE	2,3	MESSAGEBYTES WITH NBR/STATUS OF HOPPER 0
	BYTE	7,8	DITO HOPPER 1 
	BYTE	14,15	DITO HOPPER 2 
	BYTE	21,22	DITO HOPPER 3 
	BYTE	28,29	DITO HOPPER 4 
	BYTE	35,36	DITO HOPPER 5 
	BYTE	42,43	DITO HOPPER 6 
RESEND	EQU	*-1
* 
* 
* 
*	TABLE OF NO-STORE BYTE-NUMBERS OF MESSAGE AFTER HW-COMMAND /35
*	(GET CASSETTE NUMBERS)
* 
	DATA	CTABEN-CNBTAB 
CNBTAB	EQU	*
	BYTE	2,3	MESSAGEBYTES WITH NBR/STATUS OF HOPPER 0
	BYTE	9,10	DITO HOPPER 1
	BYTE	16,17	DITO HOPPER 2 
	BYTE	23,24	DITO HOPPER 3 
	BYTE	30,31	DITO HOPPER 4 
	BYTE	37,38	DITO HOPPER 5 
	BYTE	44,45	DITO HOPPER 6 
CTABEN	EQU	*-1
	EJECT
* 
*	BIT IN RETURN CODE	HW-STATUS
* 
CASTAT	EQU	*
	QUART	5,6,15,10	31,32,33,34
	QUART	15,15,12,11	35,36,37,38
	QUART	7,1,7,3	39,3A,3B,3C
	QUART	7,15,15,15	3D,3E,3F,40 
	QUART	15,0,15,4	41,42,43,44
	QUART	15,14,14,14	45,46,47,49
	QUART	15,14,2,2	4A,4B,4C,4D
	QUART	12,14,15,15	4E,4F,50,51	=1 
	EJECT
* 
* 
*   ACTN
* 
* 
*   ACTIVATION PART: CHECKS VALIDITY OF ORDERS
*                    AND STARTS PROCESSING
* 
* 
* 
ACTN	EQU	*
	CF	A5,CLDATA	CLEAR DATA IN DWT 
	LDK	A3,TNLEN 
ACTN10	CC	A7,TNTAB,A3	FIND OUT IF LEGAL ORDER 
	RF(E)	ACTN20	VALID ORDER 
	SUK	A3,1	DECREMENT INDEX 
	RB(NN)	ACTN10	TRY NEXT 
* 
* 
	ABL	LENDER	DISPATCH, END I/O ,REQUEST ERROR
* 
* 
	EJECT
ACTN20	EQU	*
* 
* 
* 
	ADR	A3,A3	GET INDEX
	ABI	TNFUN,A3	BRANCH TO VALID FUNCTION MODULE 
	EJECT
* 
*   THIS IS THE TIME OUT ROUTINE
* 
ACTNTO	EQU	*
	LDR	A6,A1	GET DWT ADDRESS
	LDK	A1,TIMOUT	SET RETURN CODE
	CM	DWTDEV+DWTTP,A6	RESET TIMER POINTER 
	CM	DWTDEV+DWTSTA,A6
	RF	OPCLEN	END I/O
	EJECT
* 
*	THIS IS THE DEVICE-BUSY-TIMEOUT ROUTINE 
* 
BSYTUT	EQU	*
	LDR	A6,A1	DWT ADDRESS
	LDKL	A5,DWTSB2 
	ADR	A5,A6	STACK BASE 
	CM	DWTDEV+DWTTP1,A6	RESET TIMER POINTER DEVICE BUSY
	CM	DWTDEV+DWTSTA,A6	RESET RETURN CODE ACCUMULATOR
	LD	A8,DWTECB,A6	ECB ADDRESS
	LD	A7,DWTOR,A6 
	ANK	A7,/FF	ORDER CODE
	RB	ACTN	DEVICE FREE.  TRY ORDER AGAIN
	EJECT
* 
*	THIS IS THE ROUTINE TO OPEN AND CLOSE THE NOTE DISPENSER
* 


* 
*	LIFTS UP
* 
OPENTN	EQU	*
	LDKL	A7,TIME1M 
	CF	A15,TIMER 
	LDK	A2,LIFTUP	LIFTS UP COMMAND 
	CF	A5,SENCOM	SEND COMMAND
	CF	A5,RECMES	RECEIVE MESSAGE 
	RF(NZ)	OPCLEN	END BECAUSE OF ERROR IN MESSAGE
* 
*	DUMMY-COMMAND (SEND CASSETTE NUMBERS) ONLY TO CLEAR,
*	 IN TND-MICROPROCESSOR, THE FLAG INDICATING 'LIFTS HAVE BEEN DOWN'
* 
	LDK	A2,CASNBR	COMMAND: GET CASSETTE NUMBERS
	CF	A5,SENCOM	SEND COMMAND
OPE090	EQU	*
	CF	A5,RECMES	RECIEVE MESSAGE 
	RF(P)	OPCLEN	END BECAUSE OF ERROR IN MESSAGE 
	RB(NZ)	OPE090	NEXT CHAR
	CM	DWTDEV+DWTSTA,A6	CLEAR STATUS AFTER DUMMY COMMAND 
	EJECT
* 
*	RESET NOTE DISPENSER
* 
	LDKL	A2,RESTAB	TABLE TO KNOW WHICH MESSAGE BYTES 
*			NOT TO STORE INTO USER BUFFER 
	ST	A2,DWTDEV+DWTTAB,A6	
	LDK	A4,0	USER BUFFER DISPLACEMENT
	LDK	A3,/30 
	CF	A5,STORE	DUMMY IN USER BUFFER 
	CF	A5,STORE	DUMMY IN USER BUFFER 
	LDK	A2,RESET 
OPE100	EQU	*
	LDK	A3,'0' 
	ST	A3,DWTDEV+DWTCNB,A6	INDICATE OLD CASSETTE = 0 
	CF	A5,SENCOM	SEND COMMAND
OPE110	EQU	*
	CF	A5,RECMES	RECEIVE MESSAGE 
	RF(Z)	OPE120	END OF MESSAGE
	RF(P)	OPCLEN	END BECAUSE OF ERROR IN MESSAGE 
	CF	A5,STORE	BUILD USER BUFFER
	RB	OPE110
	EJECT
OPE120	EQU	*
	LD	A2,DWTDEV,A6
	ANK	A2,RESDON
	RF(Z)	OPE130	RESET DONE
	C1R	A2,A2
	ANS	A2,DWTDEV,A6	INDICATE RESET DONE 
	LDKL	A2,CNBTAB	TABLE TO KNOW WHICH MESSAGE BYTES 
*			NOT TO STORE INTO USER BUFFER 
	ST	A2,DWTDEV+DWTTAB,A6	STORE CONTROL TABLE 
	LDK	A2,2 
	ST	A2,DWTDEV+DWTNCR,A6	NUMBER OF CHARACTERS RECEIVED 
	LDK	A4,5	USER BUFFER DISPLACEMENT
	LDK	A2,CASNBR	GET CASSETTE NUMBER
	RB	OPE100
OPE130	EQU	*
	LDK	A7,OPNBIT+RESDON 
	ORS	A7,DWTDEV,A6	INDICATE ND OPEN AND RESET NOT DONE 
	LDK	A7,2	READ ORDER	=2 
	SC	A7,DWTOR+1,A6	INDICATE MOVE BUF. TO USER	=2 
	EJECT
* 
*	COMMON END
* 
ENDIOC	EQU	*
	CM	DWTDEV+DWTBUF+2,A6	RESET READ CONTROL BUFFER LENGTH 
ENDIOL	EQU	*
	LD	A8,DWTECB,A6	RESTORE (REAL) ECB-ADDRESS 
	ST	A4,ECBEL,A8	UPDATE EFFECTIVE LENGTH 

ENDIO	EQU	* 
	OR	A1,DWTDEV+DWTSTA,A6	SET RETURN CODE 
	LD	A4,DWTDEV+DWTTP,A6	LOAD TIMER POINTER 
	RF(Z)	ENDI10	NO TIMING 
	CMR	A4	RESET TIMER 
	CM	DWTDEV+DWTTP,A6	RESET TIMER POINTER 
ENDI10	EQU	*
	LD	A4,DWTDEV+DWTTP1,A6	TIMER POINTER DEVICE BUSY 
	RF(Z)	ENDI20	NO TIMER
	CMR	A4	RESET TIMER 
	CM	DWTDEV+DWTTP1,A6	RESET TIMER POINTER DEVICE BUSY
ENDI20	EQU	*
	ABL	LENDIS	END I/O AND DISPATCH
	EJECT
* 
*	CLOSE NOTE DISPENSER
* 


* 
*	LIFTS DOWN
* 
CLOSTN	EQU	*
	LDK	A7,TIME9S
	CF	A15,TIMER 
	LDK	A2,LIFTDW
	CF	A5,SENCOM	SEND COMMAND
	CF	A5,RECMES	RECEIVE MESSAGE 
	LDKL	A4,-OPNBIT-1
	ANS	A4,DWTDEV,A6	INDICATE NOTE DISPENSER CLOSED
OPCLEN	EQU	*
	LDK	A7,RESDON
	ORS	A7,DWTDEV,A6	INDICATE RESET NOT DONE 
ENDIOZ	EQU	*
	LDK	A4,0 
	RB	ENDIOC
	EJECT
* 
*   DISPENSE AND DELIVER   /2B
* 
DISPEN	EQU	*
	LDKL	A7,TIME2M 
	CF	A15,TIMER 
	LD	A2,DWTDEV,A6
	ANK	A2,OPNBIT
	RF(Z)	SEQER	ND NOT OPEN, INDICATE SEQUENCE ERROR 
	CF	A5,DSRQTS	TEST IF REQUEST ERROR 
	LDK	A2,BLKSIZ	BLOCK-SIZE 
	CF	A5,STABLK	DEFINE START OF BLOCK 
	ABL(NZ)	LINERR	LINE ERROR STATUS 
	IFT	SPLIT=0
	LDK	A2,DISDLV	DISPENSE AND DELIVER 
	XIF
	IFT	SPLIT=1
	LDK	A2,DISPNS	DISPENSE 
	XIF
	XRS	A2,DWTDEV+DWTLRC,A6	UPDATE LRC ACKUMULATOR 
	SC	A2,DWTDEV+DWTRDS,A6	SAVE HW-ORDER 
	CF	A5,OUTPUT	SEND COMMAND DISPENSE AND DELIVER 
	ABL(NZ)	LINERR	LINE ERROR STATUS 
	LC	A2,DWTDEV+DWTLR,A6	LEFT OR RIGHT TELLER 
	ADK	A2,/30	MAKE ASCII
	XRS	A2,DWTDEV+DWTLRC,A6	UPDATE LRC ACKUMULATOR 
	CF	A5,OUTPUT	SEND LEFT OR RIGHT TELLER 
	ABL(NZ)	LINERR	LINE ERROR STATUS 
	LD	A4,ECBBA,A8	USER BUFFER ADDRESS 
	LDK	A3,/31	CASSETTE 1
	EJECT
* 
*	SEND CASSETTE DATA
* 
DIS100	EQU	*
	CF	A5,SENCAS	SEND CASSETTE DATA
	RB(NZ)	DIS100	NOT LAST CASSETTE
	CF	A5,LRCEOM	SEND LRC AND END OF MESSAGE 
DIS110	EQU	*
	LDK	A4,0	BUFFER DISPLACEMENT 
	LDK	A2,BUFLEN	DWT BUFFER LENGTH
	ST	A2,DWTDEV+DWTBUF+2,A6 
	LDR	A2,A6
	ADKL	A2,DWTDEV+DWTBUF+4	A2:=DWT BUFFER POINTER 
	ST	A2,DWTDEV+DWTBUF,A6 
	EJECT
* 
*	RECEIVE MESSAGE 
* 
DIS120	EQU	*
	CF	A5,RECMES	RECEIVE MESSAGE 
	RB(P)	ENDIOZ	ERROR IN MESSAGE
	RF(Z)	DADEND	END OF MESSAGE
	LD	A8,DWTDEV+DWTBUF,A6 
	SUKL	A8,6	VIRTUAL ECB POINTER
	CF	A5,STORE	STORE CHARACTER INTO DWT-INTERN BUFFER 
	RB	DIS120
DADEND	EQU	*
	IFT	SPLIT=1
	LD	A7,DWTOR,A6	GET ORDER 
	ANK	A7,/FF	MASK
	CWK	A7,DISDEL
	RF(E)	DIS125	DISPENSE ORDER
	LDR	A1,A1	RETURN CODE WITHOUT WARNINGS 
	RF(NZ)	DIS130	COMMAND NOT OK 
	LDKL	A3,-DISDON-1
	ANS	A3,DWTDEV,A6	INDICATE DISPENSE NOT DONE
	RF	DIS130	 
DIS125	EQU	*
	LDR	A1,A1	RETURN CODE WITHOUT WARNINGS 
	RF(NZ)	DIS130	COMMAND NOT OK 
	LDK	A2,DISDON
	ORS	A2,DWTDEV,A6	INDICATE DISPENSE DONE
DIS130	EQU	*
	XIF
	ST	A4,DWTDEV+DWTBUF+2,A6	SAVE BUFFER LENGTH
	RB	ENDIO 
* 
*	SEQUENCE ERROR
* 
SEQER	EQU	* 
	LDK	A1,SEQERR
	RB	ENDIOZ
	EJECT
* 
*	READ CONTROL
* 
RDCONT	EQU	*
	LDK	A4,'0' 
	ST	A4,DWTDEV+DWTCNB,A6	INDICATE OLD CASSETTE = 0 
	LDK	A4,0	USER BUFFER DISPLACMENT 
	C2	DWTDEV+DWTBUF+2,A6	NEGATE DWT BUFFER LENGTH 
	RF(Z)	RDC120	NOTHING IN BUFFER 
RDC100	EQU	*
	LC*	A3,DWTDEV+DWTBUF,A6	GET CASSETTE NUMBER
	CF	A5,RESCAS	RESET CASSETTES NOT IN SEQUENCE 
	IM	DWTDEV+DWTBUF,A6	NEXT CHARCATER IN DWT BUFFER 
	IM	DWTDEV+DWTBUF+2,A6	NUMBER OF CHARACTERS 
	LDK	A3,/30 
	CF	A5,STORE
	LDK	A1,3	GET 4 BYTES FROM DWT BUFFER 
RDC110	EQU	*
	LC*	A3,DWTDEV+DWTBUF,A6	GET CHARACTER
	CF	A5,STORE
	IM	DWTDEV+DWTBUF,A6	UPDATE BUFFER POINTER
	IM	DWTDEV+DWTBUF+2,A6
	RF(Z)	RDC120	WHOLE BUFFER MOVED
	SUK	A1,1 
	RB(NN)	RDC110	NEXT FOR THIS CASSETTE 
	RB	RDC100
RDC120	EQU	*
	LDR	A1,A6
	ADKL	A1,DWTDEV+DWTBUF+4	A1:=DWT BUFFER POINTER 
	ST	A1,DWTDEV+DWTBUF,A6 
	LDK	A1,0	RETURN CODE 
ENIOL1	EQU	*
	ABL	ENDIOL 
	EJECT
* 
*	READ DIAGNOSTIC 
* 
RDDIAG	EQU	*
	LDK	A7,TIME1S
	CF	A15,TIMER 
	LDK	A2,RTRACE	GET REJECT TRACE AREA
	CF	A5,SENCOM	SEND COMMAND
	LDK	A4,0	USER BUFFER DISPLACEMENT
RDD100	EQU	*
	CF	A5,RECMES	RECEIVE MESSAGE 
	RF(NN)	RDD110	END OF MESSAGE OR ERROR IN MESSAGE 
	CF	A5,STORE	SAVE CHARACTER (A3) IN USER BUFFER 
	RB	RDD100	NEXT CHARACTER 
RDD110	EQU	*
	RB	ENIOL1
	EJECT
* 
*	READ DEVICE STATUS
* 
RDDEVS	EQU	*
	LDKL	A2,DWTDEV+DWTRDS
	ADR	A2,A6	DATA POINTER 
	LDK	A4,0	BUFFER INDEX
RDS100	EQU	*
	LCR	A3,A2
	ANK	A3,/FF 
	RF(Z)	RDS110	END OF BUFFER 
	CF	A5,STCHAR	STORE CHARACTER IN USER BUFFER
	ADK	A2,1	UPDATE POINTER
	CWK	A4,4 
	RB(L)	RDS100	NEXT CHARACTER
RDS110	EQU	*
	LDK	A1,0	RETURN CODE 
	RB	ENIOL1
	IFT	SPLIT=1
	EJECT
* 
*	DELIVER NOTES  /38
* 
DELIV	EQU	* 
* 
*	CHECK IF NOTES IN DELIVERY UNIT 
* 
	LDK	A7,TIME9S
	CF	A15,TIMER 
	LDK	A2,CHKDEL
	CF	A5,SENCOM	SEND COMMAND
DEL100	EQU	*
	CF	A5,RECMES	RECEIVE MESSAGE 
	ABL(P)	ENDIO	COMMUNICATION ERROR 
	LD	A1,DWTDEV+DWTSTA,A6	RETURN CODE 
	ABL(NZ)	ENDIO	NOTES IN DELIVERY UNIT 
	LD	A2,DWTDEV,A6
	ANK	A2,DISDON
	RB(Z)	SEQER	DISPENSE NOT DONE,SEQUENCE ERROR 
	LDK	A2,DELIVR
	RF	DUM100
	EJECT
* 
*	DUMP NOTES  /31 
* 
DUMPA	EQU	* 
	LDK	A7,TIME9S
	CF	A15,TIMER 
	LDK	A2,REJECT
DUM100	EQU	*
	CF	A5,SENCOM	SEND COMMAND
	ABL	DIS110	RECEIVE MESSAGE 
	XIF
	EJECT
* 
* 
*   RCTN
* 
*   RECOVERY AT POWER ON
* 
* 
RCTN	EQU	*
	LDKL	A1,-OPNBIT-1
	ANS	A1,DWTDEV,A6	INDICATE ND NOT OPEN
	LDK	A1,RESDON
	ORS	A1,DWTDEV,A6	INDICATE RESET NOT DONE 
	LDR	A8,A8	ANY ECB ADDRESS ?
	ABL(Z)	LDISP	NO. DEVICE NOT BUSY 
	LDK	A1,PWFAIL	SET POWER FAILURE BIT
	CWK	A7,READCO
	ABL(E)	ENDIO	READ CONTROL ORDER
	ABL	ENDIOZ	OTHER ORDERS THAN READ CONTROL
	EJECT
* 
* 
*   SUBROUTINES 
* 
* 
* 


* 
*	SET TIMER 
*	A7=TIME VALUE 
* 
TIMER	EQU	* 
	LD	A1,DWTDEV+DWTTP,A6	TIMER POINTER
	RF(NZ)	TIM100	TIMER ALREADY SET
	LDR	A1,A6	SAVE DWT ADDRESS IF TIMEOUT
	CF	A15,SETIME	SET TIME 
	DATA	ACTNTO,TIME1S	TIME1S OUT ROUTINE AND TIME1S 
	ST	A4,DWTDEV+DWTTP,A6	STORE TIMER ADDRESS IN DWT 
	NGR	A7,A7
	STR	A7,A4	NEW TIME VALUE 
TIM100	EQU	*
	RTN	A15
	EJECT
CLDATA	EQU	*
	CM	DWTDEV+DWTLRC,A6	RESET LRC BUFFER 
	LC	A1,DWTOR,A6	INDEX 
	ANK	A1,1 
	SC	A1,DWTDEV+DWTLR,A6	LEFT OR RIGHT TELLER 
	CM	DWTDEV+DWTBFR,A6	CLEAR DELAY BUFFER 
	CM	DWTDEV+DWTSTA,A6	CLEAR NOTE DISPENSER STATUS
	CM	DWTDEV+DWTTAB,A6	CLEAR STORE-TABLE POINTER
	CM	DWTDEV+DWTNCR,A6	CLEAR NUMBER OF CHARACTERS RECEIVED
	CWK	A7,READDS
	RF(E)	CLD100	ORDER READ DEVICE STATUS
	CM	DWTDEV+DWTRDS,A6
	CM	DWTDEV+DWTRDS+2,A6
CLD100	EQU	*
	RTN	A5 
	EJECT
* 
*	SUBROUTINE TO GET RETURN CODE FROM H.W. STATUS
* 
*	ENTRY:  A2 = H.W. STATUS
* 
*	EXIT: 
*	        A1,A2 = IRRELEVANT
*	        RETURN CODE IN DWTSTA 
* 
STATUS	EQU	*
	LDK	A1,0 
	CWK	A2,/33 
	RF(E)	STA150	DEVICE BUSY BECAUSE LIFTS ARE DOWN
	CWK	A2,/30 
	RF(E)	STA160	DEVICE OK 
	LC	A1,DWTDEV+DWTRDS+1,A6	OLD STATUS
	ANK	A1,/FF 
	RF(NZ)	STA080	BYTE ALREADY OCCUPIED
	SC	A2,DWTDEV+DWTRDS+1,A6	SAVE HW STATUS
	RF	STA090
STA080	EQU	*
	SC	A2,DWTDEV+DWTRDS+3,A6	SAVE HW STATUS
STA090	EQU	*
	SUK	A2,/30	CHECK LOWER LIMIT 
	RF(N)	STA180	WRONG HW-STATUS 
	SUK	A2,/21	 CHECK UPPER LIMIT	=1 
	RF(P)	STA180	WRONG HW-STATUS 
	ADK	A2,/20	ADJUST BACK, AND DECR WITH /31.	=1
	EJECT
	CWK	A2,/17 
	RF(E)	STA140	STATUS /48,HIGH PRESSURE = WARNING
	RF(L)	STA100	DON'T SKIP /48
	SUK	A2,1	SKIP /48
STA100	EQU	*
	SRC	A2,1 
	RF(N)	STA110	ODD QUART 
	LC	A2,CASTAT,A2
	SRL	A2,4	A2:=BIT NUMBER IN RETURN CODE 
	RF	STA120
STA110	EQU	*
	ANK	A2,/FF 
	LC	A2,CASTAT,A2
	ANK	A2,/F	A2:=BIT NUMBER IN RETURN CODE
STA120	EQU	*
	LDK	A1,1	SET BIT 15
STA130	EQU	*
	SRC	A1,1 
	SUK	A2,1 
	RB(NN)	STA130	BIT NOT IN CORRECT POSITION
STA140	EQU	*
	ORS	A1,DWTDEV+DWTSTA,A6	SET RETURN CODE
	LDK	A1,0 
	RTN	A5 
	EJECT
STA150	EQU	*
	SUK	A1,1	INDICATE DEVICE BUSY (LIFTS ARE DOWN) 
STA160	EQU	*
	LD	A2,DWTDEV+DWTRDS+2,A6	HW ORDER AND STATUS 2 
	RF(NZ)	STA170	BOTH STATUS WORDS OCCUPIED 
	CM	DWTDEV+DWTRDS,A6
STA170	EQU	*
	CM	DWTDEV+DWTRDS+2,A6
	RB	STA140
STA180	EQU	*
	LDK	A1,FMERR	FIRMWARE-ERROR IN TND 
	RB	STA140	 
	EJECT
* 
* 
* 
*	THIS SUBROUTINE IS ENTERED
*	WHEN LINE DRIVER ERROR STATUS IS DETECTED 
* 
* 
LINERR	EQU	*
	LDK	A1,NOTOPE	RETURN CODE FOR ECB: NOT OPERABLE
	ORS	A1,DWTDEV+DWTSTA,A6	SET RETURN CODE INTO ECB 
	ABL	OPCLEN	INDICATE RESET NOT DONE ETC.
	EJECT
* 
*	THIS SUBROUTINE SENDS A ONE BYTE LONG COMMAND 
*	AND CALCULATES LRC,SENDS IT AND SENDS END OF MESSAGE
* 
*	ENTRY: A2 = COMMAND TO SEND 
* 
*	EXIT:  A1,A2,A3 = IRRELEVANT
* 
SENCOM	EQU	*
	LDR	A3,A2	SAVE THE COMMAND 
	LDK	A2,BLKSIZ	GET BLOCKSIZE
	CF	A5,STABLK	DEFINE START OF BLOCK 
	RB(NZ)	LINERR	LINE ERROR STATUS
	LDR	A2,A3	RESTORE THE COMMAND
	SC	A2,DWTDEV+DWTLRC+1,A6	SAVE LRC SUM
	LD	A1,DWTDEV+DWTRDS,A6	FIRST WORD IN LOGG AREA 
	RF(NZ)	SEN100	ONE LOGG ALREADY DONE
	SC	A2,DWTDEV+DWTRDS,A6	SAVE HW ORDER 
	RF	SEN200
SEN100	EQU	*
	SC	A2,DWTDEV+DWTRDS+2,A6	SAVE HW ORDER 
SEN200	EQU	*
	CF	A5,OUTPUT	SEND BYTE 
	RB(NZ)	LINERR	LINE ERROR STATUS
* 
*	SEND LRC AND END OF MESSAGE 
* 
LRCEOM	EQU	*
	LC	A3,DWTDEV+DWTLRC+1,A6	GET LRC SUM 
	ANK	A3,/FF 
	LDR	A2,A3
	SRL	A2,4 
	ANK	A3,/F
	ADK	A2,/30	CMSD
	ADK	A3,/30	CLSD
	CF	A5,OUTPUT	SEND BYTE 
	RB(NZ)	LINERR	LINE ERROR STATUS
	LDR	A2,A3	CLSD 
	CF	A5,OUTPUT	SEND BYTE 
	RB(NZ)	LINERR	LINE ERROR STATUS
	LDK	A2,ENDCH	END CHARACTER 
	CF	A5,OUTPUT	SEND BYTE 
	RB(NZ)	LINERR	LINE ERROR STATUS
	LDK	A2,0 
	SC	A2,DWTDEV+DWTLRC+1,A6	RESET LRC ACKUMULATOR 
	CF	A5,ENDBLK	DEFINE END OF BLOCK 
	RB(NZ)	LINERR	LINE ERROR STATUS
	RTN	A5 
	EJECT
* 
*	SUBROUTINE TO SEND DATA TO EACH CASSETTE
* 
*	ENTRY:  A4 = USER BUFFER POINTER
*	        A3 = CASSETTE NUMBER
* 
*	EXIT:   A4 = A4 + 5 
*	        A3 = A3 + 1 
*	        A1,A2 = IRRELEVANT
* 
SENCAS	EQU	*
	ST	A3,DWTDEV+DWTBUF,A6	SAVE A3 
	XRS	A3,DWTDEV+DWTLRC,A6	UPDATE LRC 
	LDR	A2,A3
	CF	A5,OUTPUT 
	RB(NZ)	LINERR	LINE ERROR STATUS
	ADK	A4,2 
	LDK	A3,2 
SCA100	EQU	*
	LCR	A2,A4
	XRS	A2,DWTDEV+DWTLRC,A6	UPDATE LRC 
	CF	A5,OUTPUT 
	RB(NZ)	LINERR	LINE ERROR STATUS
	ADK	A4,1	UPDATE BUFFER POINTER 
	SUK	A3,1 
	RB(NN)	SCA100	DATA FOR THIS CASSETTE NOT FINISHED
	LD	A3,DWTDEV+DWTBUF,A6	SAVED REGISTER=CASSETTE NBR 
	ADK	A3,1	NEXT CASSETTE 
	ADK	A5,4	ADJUST STACK
	LD	A2,ECBBA,A8 
	AD	A2,ECBRL,A8 
	CWR	A4,A2	SET CR 
	ABR*	A5	RETURN 
	EJECT
*	THIS ROUTINE RECEIVES A MESSAGE FROM NOTE DISPENSER 
*	IF DWTBFR IS ZERO,IT RECEIVES STATUS+3 BYTES
*	IF THE LAST BYTE IS EOM,IT CHECKS LRC AND THEN RETURNS
*	IF DWTBFR IS NOT ZERO,IT RECEIVES ONE BYTE
* 
*	ENTRY: NOTHING
*	EXIT:  A3 = RECEIVED CHARACTER
*	       A2 = IRRELEVANT
*	       A1 = RETURN CODE 
*	       CR = O MEANS EOM AND LRC OK
*	            1 MEANS EOM AND LRC BAD 
*	            2 MEANS NOT EOM 
RECMES	EQU	*
	LD	A2,DWTDEV+DWTBFR,A6 
	RF(NZ)	REC100	NOT FIRST TIME 
	CF	A5,INPUT	GET STATUS 
	XRS	A2,DWTDEV+DWTLRC,A6	UPDATE LRC 
	CF	A5,STATUS	TEST STATUS AND SET RETURN CODE 
	CF	A5,INPUT	GET NEXT BYTE
	SC	A2,DWTDEV+DWTBFR,A6	SAVE CHARACTER
	CF	A5,INPUT	GET NEXT BYTE
	SC	A2,DWTDEV+DWTBFR+1,A6	SAVE CHARACTER
REC100	EQU	*
	CF	A5,INPUT	GET CHARACTER
	ADK	A5,4	UPDATE STACK POINTER
	CCK	A2,/0D0D 
	RF(E)	REC120	END OF MESSAGE
	LD	A3,DWTDEV+DWTBFR,A6	GET TWO LAST CHARACTERS 
	SC	A3,DWTDEV+DWTBFR,A6	UPDATE DELAY BUFFER 
	SRL	A3,8 
	XRS	A3,DWTDEV+DWTLRC,A6	UPDATE LRC ACK.
	SC	A2,DWTDEV+DWTBFR+1,A6	UPDATE DELAY BUFFER 
	LDKL	A1,-1	SET CR
REC110	EQU	*
	ABR*	A5
	EJECT
* 
*	CHECK LRC 
* 
REC120	EQU	*
	LD	A3,DWTDEV+DWTBFR,A6	DELAY BUFFER WITH CMSD,CLSD 
	LDR	A2,A3
	ANK	A2,/FF 
	SUK	A2,/30 
	SRL	A3,8 
	SUK	A3,/30 
	SLL	A3,4 
	ORR	A3,A2	LRC VALUE
	LC	A2,DWTDEV+DWTLRC+1,A6	DRIVER LRC VALUE
	CM	DWTDEV+DWTBFR,A6	RESET INTERN BUFFER
	LD	A1,DWTDEV+DWTSTA,A6	RETURN CODE 
	CWK	A1,-1
	RF(E)	REC130	HW DEVICE BUSY BECAUSE LIFTS ARE DOWN 
	ANKL	A1,-CASLOW-REJNF-1	MASK WARNINGS
	CWR	A3,A2
	RB(E)	REC110	EOM AND LRC OK
	LDKL	A1,COMERR	SET CR AND RETURN CODE
	RB	REC110
	EJECT
* 
*	HW DEVICE BUSY BECAUSE LIFTS ARE DOWN 
*	 (DELAY AND TRY ORDER AGAIN)
* 
REC130	EQU	*
	LDR	A1,A6	SAVE DWT ADDRESS 
	CF	A15,SETIME
	DATA	BSYTUT,TIME1S 
	ST	A4,DWTDEV+DWTTP1,A6	SAVE TIMER POINTER
	ABL	LDISP	DISPATCH 
	EJECT
* 
*   STORE = SUBROUTINE TO STORE CHARACTER 
*           IN ECB-BUFFER AND INCREMENT BUFFER-INDEX
* 
*	ENTRY :  DWTTAB = CONTROL TABLE  (=0 MEANS NO CONTROL ) 
*	         A3 = CHARACTER TO STORE
*	         A4 = USER BUFFER INDEX 
*	         DWTNCR = NUMBER OF CHARCTERS RECEIVED
*	         DWTCNB = OLD CASSETTE NUMBER 
* 
*	EXIT  :  DWTTAB = NOT CHANGED 
*	         A3 = CHANGED IF CASSETTE NUMBER TO '0' 
*	         A4 = A4 + 1  IF CHARACTER NOT FILTERED WITH CONTROL TABLE
*	         DWTNCR = DWTNCR + 1
*	         DWTCNB = NEW CASSETTE NUMBER 
* 
STORE	EQU	* 
	LD	A7,DWTDEV+DWTTAB,A6 
	RF(Z)	STO105	NO TABLE
	AD	A7,-2,A7	POINTER TO END OF TABLE
	LD	A2,DWTDEV+DWTNCR,A6	NUMBER OF CHARACTERS RECEIVED 
STO100	EQU	*
	CCR	A2,A7
	RF(E)	STO110	CHARACTER FOUND IN TABLE,DON'T STORE IT 
	SUK	A7,1	UPDATE TABLE POINTER
	CW	A7,DWTDEV+DWTTAB,A6 
	RB(NL)	STO100	NOT END OF TABLE 
* 
*	STORE IT IN USER BUFFER AND INCREMENT A4
* 
STO105	EQU	*
	CF	A5,STCHAR	STORE CHARACTER IN USER BUFFER
	RF	STO140
	EJECT
* 
*	CHECK IF SOME CASSETTE IS MISSING 
* 
STO110	EQU	*
	LC	A2,DWTOR+1,A6	ORDER CODE
	SUK	A2,OPEN
	RF(NZ)	STO140	NOT OPEN ORDER 
	ANK	A7,1	EVEN ADDRESS ? (=ADDRESS TO BYTE NUMBER 
*			OF MESSAGE BYTE CONTAINING CASS NBR)
	RF(NZ)	STO140	NO. NOT CASSETTE NUMBER BUT CASS STAT
* 
*	RESET CASSETTES NOT IN SEQUENCE 
*	CASSETTE NUMBER IN A3 
* 
RESCAS	EQU	*
	LD	A2,DWTDEV+DWTCNB,A6	OLD CASSETTE NUMBER 
	ST	A3,DWTDEV+DWTCNB,A6	NEW CASSETTE NUMBER 
	SUR	A3,A2
	LDK	A2,0 
	SUK	A3,1 
	RF(NP)	STO140	CASSETTES IN SEQUENCE
STO120	EQU	*
	ADK	A2,5 
	SUK	A3,1 
	RB(P)	STO120	MORE CASSETTES TO RESET 
	LDK	A3,'0' 
STO130	EQU	*
	CF	A5,STCHAR	STORE CHARACTER 
	SUK	A2,1 
	RB(P)	STO130	RESET NOT FINISHED
STO140	EQU	*
	IM	DWTDEV+DWTNCR,A6	NUMBER OF CHARACTERS RECEIVED
	RTN	A5 
	EJECT
* 
*STORE CHARACTER IN USER BUFFER 
* 
*	ENTRY :  A4 = INDEX IN USER BUFFER
*	         A3 = CHARACTER TO STORE
* 
*	EXIT  :  A4 = A4 + 1
*	         A3 = NOT CHANGED 
*	         A7 = IRRELEVANT
* 
STCHAR	EQU	*
	CW	A4,ECBRL,A8 
	RF(NL)	STC110	TOO SMALL USER BUFFER
	LD	A7,ECBBA,A8	BUFFER ADDRESS
	ADR	A7,A4	ADD BUFFER INDEX 
	SCR	A3,A7	STORE CHARACTER
STC100	EQU	*
	ADK	A4,1 
	RTN	A5 
* 
*	USER BUFFER TOO SMALL 
* 
STC110	EQU	*
	LDKL	A7,REQERR	REQUEST ERROR 
	ORS	A7,DWTDEV+DWTSTA,A6	SET RETURN CODE
	RB	STC100
	EJECT
* 
*	SUBROUTINE TO TEST DISPENSE REQUEST ERROR 
* 
*	ENTRY:  A8 = ECB-ADDRESS
* 
*	EXIT:   A1,A2,A3 = IRRELEVANT  IF REQUEST ERROR 
*	                               A1=/8000 AND JUMP TO ENDIO 
* 
DSRQTS	EQU	*
	LD	A7,ECBBA,A8	BUFFER ADDRES 
	LD	A3,ECBRL,A8	REQUESTED LENGTH
DSR100	EQU	*
	CF	A5,CASTST	TEST CASSETTE DATA
	SUK	A3,5 
	RB(P)	DSR100	NEXT CASSETTE 
	RF(N)	CST110	REQUEST ERROR 
	RTN	A5 
	EJECT
* 
*	SUBROUTINE TO TEST CASSETTE DATA
* 
*	ENTRY:  A7 = BUFFER POINTER 
* 
*	EXIT:   A7 = A7 + 5 
*	        A2 = IRRELEVANT 
*	        A1 = IRRELEVANT OR /8000 AND JUMP TO ENDIO
* 
CASTST	EQU	*
	ADK	A7,2 
	LDK	A1,2	INTERN INDEX
CST100	EQU	*
	LCR	A2,A7
	ANK	A2,/FF	CHARACTER TO TEST 
	SUK	A2,/30 
	RF(N)	CST110	REQUEST ERROR 
	SUK	A2,9 
	RF(P)	CST110	REQUEST ERROR 
	ADK	A7,1 
	SUK	A1,1 
	RB(NN)	CST100	NEXT CHARACTER 
	RTN	A5 
* 
*	REQUEST ERROR 
* 
CST110	EQU	*
	ABL	LENDER 
	END

Full view