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

⟦e072854d0⟧

    Length: 42584 (0xa658)
    Notes: pts_type(SC)
    Names: »DRGP03.SC«

Derivation

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

PTS(SC)

	IDENT DRGP03 	REL 11.0 81-06-01 870105041100 

			=1,STATUS DEL. 
			REL 11.0 81-01-26
* 
******************************************************* 
*                                                     * 
*   PHILIPS TERMINAL SYSTEM PTS                       * 
*                                                     * 
*   DRGP03 = DRIVER GENERAL PRINTER           * 
*                                                     * 
*                                                     * 
*                                                     * 
******************************************************* 
* 
*   THIS DRIVER HANDLES THE GENERAL PRINTER GP74, PTS 6374 & PTS 6375 
* 
*   THE DRIVER CONSISTS OF THE FOLLOWING PARTS :
* 
*   A C T P :	  ACTIVATION PART 
* 
*   R C T P :	  RECOVERY ROUTINE
* 
* 
	EJECT
* 
*   THE FOLLOWING ORDERS ARE TREATED: 
* 
*   ORDER 00 :      TEST STATUS 
*   ORDER 05 :      BASIC WRITE 
*   ORDER 06 :      STANDARD WRITE
*   ORDER 0B :      POSITION DOCUMENT 
*   ORDER 24 :      SET PRINTER PARAMETERS
*   ORDER 27 :      SET FORM PARAMETERS 
*   ORDER 38 :      RELEASE DOCUMENT
* 
*   THE FOLLOWING RETURN CODES ARE USED:
* 
*   BIT  0 :        REQUEST ERROR 
*   BIT  2 :        END OF JOURNAL TAPE  	
*   BIT  7 :        RECOVERY EXECUTED 
*   BIT 13 :        CODE CHECK ERROR
*   BIT 15 :        NOT OPERABLE
* 
* 
*   NORMAL REGISTER USAGE:
* 
*   REGISTER A1:	WORK REGISTER
*            A2:	INPUT/OUTPUT 
*            A3:	BUFFER POINTER 
*            A4:	WORK REGISTER
*            A5:	STACK POINTER
*            A6:	DWT-ADDRESS
*            A7:	ORDER
*            A8:	ECB-ADDRESS
* 
* 
	EJECT
* 
* 
******************************************* 
* 
*	ENTRIES 
* 
******************************************* 
* 
* 
	ENTRY	GPAD3	ADDRESS BLOCK
* 
* 
* 
******************************************* 
* 
*	EXTERNALS 
* 
******************************************* 
* 
* 
	EXTRN	LDISP	DISPATCHING FROM INTERRUPT 
	EXTRN	LENDER	DISPATCH I/O ERROR
	EXTRN	LENDIS	END I/O AND DISPATCH
	EXTRN	OUTPUT	OUTPUT ONE CHARACTER
	EXTRN	GETCHR	GET CHARACTER FROM ECB BUFFER 
	EXTRN	SETIMP	SET TIMER 
	EXTRN	DWTST	DWT STATUS DISPLACEMENT
	EXTRN	DWTECB	DWT ECB DISPLACEMENT
	EXTRN	DWTOR	DWT ORDER DISPLACEMENT 
	EXTRN	DWTSB2	STACK BASE
	EXTRN	INPUT	STORE REG = GET STATUS INPUT CHAR
	EXTRN	STABLK	DEF START OF BLOCK
	EXTRN	ENDBLK	DEF END OF BLOCK
	EXTRN	DWTDEV	DEVICE STATUS 
	EJECT			 
* 
******************************************
* 
*	CONSTANTS 
* 
******************************************
* 
* 
SPEC	EQU	/2E	SPECIAL CHARACTER
LF	EQU	/0A	LINE FEED
RLF	EQU	/40	REVERSE LINE FEED 
FF	EQU	/0C	FORM FEED
CR	EQU	/0D	CARRIAGE RETURN
SO	EQU	/0E	SHIFT OUT
SI	EQU	/0F	SHIFT IN 
ESC	EQU	/1B	ESCAPE
CSI	EQU	/5B	CONTROL SEQUENCE INTRODUCER 
REP	EQU	/62	REPEAT
VPR	EQU	/65	VERTICAL POSITION RELATIVE
VPA	EQU	/64	VERTICAL POSITION ABSOLUTE
SNV	EQU	/77	SELECT NATIONAL VERSION 
SLPL	EQU	/76	SELECT PAGE LENGTH 
RIS	EQU	/63	RESET TO INITIAL STATE
DSR	EQU	/6E	DEVICE STATUS REPORT
DS	EQU	/35	DEVICE STATUS
DCS	EQU	/50	DEVICE CONTROL STRING 
ST	EQU	/5C	STRING TERMINATOR
DEL	EQU	/7F	DELETE
ZERO	EQU	/30	ZERO 
NEG	EQU	/FF 
CPL	EQU	/78	CHARACTER PITCH LOAD
HPA	EQU	/60	HORIZONTAL POSITIONING ABSOLUTE 
HTS	EQU	/48	HORIZONTAL TABULATION SET 
TBC	EQU	/67	HORIZONTAL TABULATION CLEAR 
LSL	EQU	/7B	LINE SPACE LOAD 
SM	EQU	/68	SET MODE 
RM	EQU	/6C	RESET MODE 
SGR	EQU	/6D	SELECT GRAPHICAL RENDITION
SEP	EQU	/3B 
FR	EQU	/32
UL	EQU	/34	START UNDERLINE
TIME	EQU	/FF	25 SEC. TIMER
	EJECT			 
* 
* 
********************************************************* 
* 
*	CONTROL SEQUENCES 
* 
********************************************************* 
* 
* 
BYTE	FORM	8,8 
* 
* 
CSREP	EQU	*	REPEAT
	BYTE	ESC,CSI 
	BYTE	ZERO,ZERO 
	BYTE	ZERO,REP
	BYTE	NEG,NEG 
CSSNV	EQU	* 
			SELECT NATIONAL VERSION
	BYTE	ESC,CSI 
	BYTE	ZERO,ZERO 
	BYTE	SNV,NEG 
CSSLPL	EQU	*	SELECT PAGELENGTH
	BYTE	ESC,CSI 
	BYTE	ZERO,ZERO 
	BYTE	SLPL,NEG	 	 
	BYTE	NEG,NEG 
CSRIS	EQU	*	RESET TO INITIAL STATE
	BYTE	ESC,RIS 
	BYTE	NEG,NEG 
CSDSR	EQU	*	DEVICE STATUS REPORT
	BYTE	ESC,CSI 
	BYTE	DS,DSR
	BYTE	NEG,NEG 
CSCPL	EQU	*	CHARACTER PITCH LOAD
	BYTE	ESC,CSI 
	BYTE	ZERO,SEP
	BYTE	ZERO,CPL
	BYTE	NEG,NEG 
CSHPA	EQU	*	HORIZONTAL POSITIONING ABSOLUTE 
	BYTE	ESC,CSI 
	BYTE	ZERO,ZERO 
	BYTE	ZERO,HPA
	BYTE	NEG,NEG 
CSTBC	EQU	*	HORIZONTAL TABULATION CLEAR 
	BYTE	ESC,CSI 
	BYTE	ZERO,TBC
	BYTE	NEG,NEG 
CSHTS	EQU	*	HORIZONTAL TABULATION SET 
	BYTE	ESC,HTS 
	BYTE	NEG,NEG 
CSVPA	EQU	*	VERTICAL POSITIONING ABSOLUTE 
	BYTE	ESC,CSI 
	BYTE	ZERO,ZERO 
	BYTE	VPA,NEG 
CSLSL	EQU	*	LINE SPACE LOAD 
	BYTE	ESC,CSI 
	BYTE	ZERO,ZERO 
	BYTE	LSL,NEG 
CSSM	EQU	*	SET MODE 
	BYTE	ESC,CSI 
	BYTE	FR,ZERO 
	BYTE	SM,NEG
CSRM	EQU	*	RESET MODE 
	BYTE	ESC,CSI 
	BYTE	FR,ZERO 
	BYTE	RM,NEG
CSSUL	EQU	*	START UNDERLINE 
	BYTE	ESC,CSI 
	BYTE	UL,SGR
	BYTE	NEG,NEG 
CSEUL	EQU	*	STOP UNDERLINE
	BYTE	ESC,CSI 
	BYTE	ZERO,SGR
	BYTE	NEG,NEG 
	EJECT
* 
* 
******************************************************* 
* 
*	CONDITIONAL ASSEMBLY
* 
******************************************************* 
* 
* 
* 
*	THE STANDARD NATIONAL CHARACTER SET IS CHOOSEN
*	BY SETTING X:A TO 1-15 ACCORDING TO THE LIST BELOW
* 
* 
*		NCV=1 GERMANY,AUSTRIA,LUXEMBOURG,SWITZERLAND 
	   =2 GREAT BRITAIN,NETHERLANDS,BELGIUM,NEW ZEELAND,SOUTH AFRICA 
	   =3 FRANCE,SWITZERLAND,BELGIUM,LUXEMBOURG
	   =4 SPAIN,MEXICO,ARGENTINA,VENEZUELA 
	   =5 ITALY,SWITZERLAND
	   =6 SWEDEN,FINLAND 
	   =7 DENMARK,NORWAY 
	   =8 PORTUGAL,BRAZIL
	   =9 YUGOSLAVIA 
	   =10 USA,CANADA,AUSTRALIA
	   =11 SWEDEN (SPECIAL VERSION)
	   =13 GREEK 
	   =14 JAPAN (KATAKANA VERSION)
	   =15 ISRAEL (HEBREW  VERSION)
* 
* 
X:A	EQU	02	GREAT BRITAIN AS STANDARD
STDNCV	EQU	X:A
	EJECT
* 
* 
*	FRICTION FEED CAN BE SELECTED BY
*	SETTING X:B=1 
X:B	EQU	0 
SINHAN	EQU	X:B
* 
* 
*	THE FRONT FEED DEVICE CAN BE EXCLUDED 
*	BY SETTING X:C = 0
* 
* 
X:C	EQU	1	
FFDEV	EQU	X:C	FRONT FEED DEVICE 
* 
* 
* 
*	THE STANDARD PAGELENGTH IS DEFINED
*	BY SETTING X:D = NUMBER OF LINES
* 
* 
X:D	EQU	48
PAGLEN	EQU	X:D
* 
* 
*	THE STANDARD NUMBER OF LINES IS DEFINED 
*	BY SETTING X:E = NUMBER OF LINES
* 
* 
X:E	EQU	64	 	 
DOCLEN	EQU	X:E
* 
* 
* 
*	MMU BUFFER SIZE 
* 
* 
X:F	EQU	132 
DVBLEN	EQU	X:F
* 
	EJECT
* 
* 
*	THE STANDARD MATRIX IS SELECTED BY SETTING
*	X:G=MATRIX NUMBER (1-9).
* 
* 
X:G	EQU	1 
MATRIX	EQU	X:G
* 
* 
*	THE STANDARD CHARACTER DENSITY (PITCH) IS SELECTED BY 
*	SETTING X:H=(1-4). 1=10 CH/INCH,2=12 CH/INCH,3=15 CH/INCH 
*	4= PROPORTIONAL PITCH 
* 
* 
X:H	EQU	1 
DENSIT	EQU	X:H
* 
* 
*	HIGH SPEED PRINTING CAN BE PERFORMED BY SETTING X:I=1 
* 
* 
X:I	EQU	0 
SPEEDY	EQU	X:I
* 
* 
*	END OF REQUEST AT POWER FAILURE,NOT OP., LRC-, LINK-
*	ERROR OR SOFTW. TIME OUT IF X:J=1 
* 
* 
X:J	EQU	0 
REQEND	EQU	X:J
* 
* 
*	ORDER /27, SET FORM PARAMETERS CAN BE EXCLUDED BY 
*	SETTING X:K=0 
* 
* 
X:K	EQU	1 
FORMPA	EQU	X:K
* 
* 
*	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 
* 
******************************************* 
* 
DWTTP	EQU	/2	TIMER POINTER
DWTDCS	EQU	/4	DOCUMENT CHARACTER SET
DWTPCS	EQU	/6	PRINTER CHARACTER SET 
DWTPL	EQU	/8	PRINTER PAPER LENGTH 
DWTDL	EQU	/A	DOCUMENT PAPER LENGTH
DWTALN	EQU	/C	ACTUAL LINE ON DOCUMENT 
DWTRLN	EQU	/E	REQUESTED LINE ON DOCUMENT
DWTRC	EQU	/11	RETURN CODE (ACKUMULATED) 
DWTSTR	EQU	/12	CONTROL SEQUENCE ADRESS
DWTDISP	EQU	/14	DWT-DISPLACEMENT TO LINE NO,CHAR.SET,ETC. 
DWTACP	EQU	/16	ACTUAL COLUMN PAPER
DWTCO1	EQU	/1A	COLUMN COUNTER 1 
DWTSYST	EQU	/1C	SYSTEM START IND.	
DWTLFD	EQU	/1E	LINE/FORM FEED INDICATOR	
DWTCMF	EQU	/20	CHAR MATRIX & PITCH, TRACTOR FEED
DWTCMT	EQU	/22	CHAR MATRIX & PITCH, FRONT/FRI FEED
DWTLS	EQU	/24	LINE SPACE
DWTHSP	EQU	/26	HIGH SPEED 
DWTHOP	EQU	/28	HOPPER 1 OR 2
DWTTAB	EQU	/2A	LAST TAB POS SET 
DWTSER	EQU	/2E	CONTR. SEQ. SEPARATOR IND. 
	EJECT
* 
* 
******************************************* 
* 
*	ECB - DISPLACEMENTS 
* 
******************************************* 
* 
ECBBA	EQU	2	BUFFER ADDRESS IN ECB 
ECBRL	EQU	4	REQUESTED LENGTH IN ECB 
ECBEL	EQU	6	EFFECTIVE LENGTH IN ECB 
ECBRC	EQU	8	RETURN CODE IN ECB
ECBCW	EQU	10	CONTROL WORD IN ECB
	EJECT
* 
******************************************* 
* 
*	TABLES
* 
******************************************* 
* 
* 
	DATA	DVBLEN	MMU BUFFER SIZE
	DATA	2	DEVICE INDEX
GPAD3	EQU	*	ADDRESS BLOCK 
	DATA	ACTP	ACTIVATION DRIVER
	DATA	0	ABORT ROUTINE ADDRESS 
	DATA	0	INTERRUPT HANDLER 
	DATA	RCTP	RECOVERY ROUTINE 
TPTAB	EQU	* 
	IFT	SINHAN+FFDEV=1 
	DATA	/0107,/0C25,/2839 
	XIF
	DATA	/0006,/2427,/0505 
TPLEN	EQU	*-TPTAB 


	EJECT
************************************************************
* 
*   A C T P 
* 
*   THIS IS THE ACTIVATION PART OF THE DRIVER 
*   CHECKS VALIDITY OF ORDERS AND JUMPS TO ORDER PROCESSOR
* 
************************************************************
* 
ACTP	EQU	*	ACTIVATION ENTRY 
* 
* 
*   GET DWT INDEX: 0=TRACTOR FEED, 1=FRONT FEED/FRICTION FEED 
* 
	LC	A2,DWTOR,A6	GET DWT INDEX 
	ANK	A2,1	MASK
	SC	A2,DWTDEV,A6	STORE NEW DEVICE INDEX 
	CWK	A7,/24 
	RF(E)	ACT010 
	LC	A3,DWTDEV+1,A6	GET OLD DEVICE INDEX 
	ANK	A3,1 
	CWR	A2,A3
	RF(E)	ACT010 
ACT005	LDR	A4,P	GET PROGRAM COUNTER 
	ADK	A4,6	MAKE RETURN ADDRESS BEFORE ABL
	ABL	SENPAR	SEND PARAM. TO PRINTER
	LC	A2,DWTDEV,A6
	ANK	A2,1 
ACT010	LC	A3,DWTDEV+1,A6
	ANK	A3,/FE 
	ORR	A3,A2
	SC	A3,DWTDEV+1,A6	STORE INDEX
	CWK	A7,/05	ORDER /05 ? 
	RF(E)	ACT015	YES 
	ADR	A7,A2	ADD DWT INDEX TO ORDER 
ACT015	SC	A7,DWTOR+1,A6	STORE MODIFIED ORDER
ACT020	LDK	A3,TPLEN-1 
ACT030	CC	A7,TPTAB,A3	CHECK IF LEGAL ORDER
	RF(E)	ACT040	VALID ORDER 
	SUK	A3,1 
	RB(NN)	ACT030	TRY NEXT 
* 
	ABL	LENDER	ILLEGAL ORDER 
* 
* 
ACT040	EQU	*
	ADR	A3,A3	GET INDEX
	ABI	TPFUC,A3	EXECUTE ORDER 
TPFUC	EQU	* 
	IFT	SINHAN+FFDEV=1 
	DATA	TSTSTA,WRTCON,POSDOC,PRIPAR,FORPAR,RELDOC 
	XIF
	DATA	TSTSTA,WRTCON,PRIPAR,FORPAR,BASWRT,BASWRT 
	EJECT
******************************
* 
*   ORDER 00 : TEST STATUS
* 
******************************
TSTSTA	EQU	*	TEST STATUS
	CF	A5,GTSTAT	GET STATUS FROM PRINTER 
TSTEND	LDR	A2,A1	GET RETURN CODE
	ANKL	A2,/100	PRINTER RESET ? 
	ABL(NZ)	RCTP	YES 
	CF	A5,RESREC	RESET RECOVERY BIT
	ABL	LENDIS	END REQUEST 
	EJECT
************************* 
* 
*   ORDER 06: WRITE 
* 
************************* 
WRTCON	EQU	*
*			*	=1
*			*	=1
*			*	=1
	LD	A2,ECBRL,A8	GET REQ. LENGTH 
	ADK	A2,/8	BLOCK LENGTH 
	CF	A5,STABLK	START OF BLOCK
	RF(NZ)	ERGP01	JMP IF ERROR 
* 
*   EXAMINE CONTROL CHARACTER 
* 
	LDK	A3,1	SET UP ECB BUFFER POINTER 
	CF	A15,GETCHR	GET CONTROL CHARACTER
	LD	A1,DWTDEV,A6	GET DEVICE STATUS
	ANK	A1,/20	HAS POWER OFF OCCURED ? 
	RF(NZ)	REP2	YES
	SUK	A2,/2B	PRINT ON SAME LINE =/2B?
	RF(Z)	WRC20	YES
WRC04	CM	DWTDEV+DWTCO1,A6	CLEAR COLUMN COUNTER
	SUK	A2,5	PRINT AFTER TWO LF =/30 
	RF(Z)	TWOLF	YES
* 
	SUK	A2,1	PRINT AFTER FORM FEED =/31 ?
	RF(NZ)	ONELF	NO,ONE LF 
* 
	LDK	A2,FF
	RF	FORMF	FORM FEED 
* 
*    EXECUTE CONTROL CHARACTER
* 
WRC20	EQU	* 
	LDK	A2,CR	CARRIDGE RETURN
	CF	A5,OUTPUT 
	RF(NZ)	ERGP01
WRC03	LD	A4,DWTDEV+DWTCO1,A6	GET ACTUAL COLUMN
	RF(Z)	WRC05	FOR CORRECT NO OF SPACES 
	SUK	A4,1 
WRC05	CF	A5,KONVER	CONVERT BINARY TO ASCII
	ST	A2,DWTDEV+DWTACP,A6	STORE THE VALUE IN ACTUAL COL.
	ST	A4,DWTDEV+DWTACP+2,A6	STORE THE VALUE IN ACT. COL.
* 
WRC07	LD	A4,DWTDEV+DWTCO1,A6	GET ACTUAL COLUMN
	RF(Z)	WRT15	JMP IF NO PRECEIDING SPACES
	LDK	A2,/20	SEND SPACE
	CF	A5,OUTPUT 
	RF(NZ)	ERGP01	JMP IF ERROR 
	LDKL	A2,CSREP	REPEAT 
	LDKL	A3,DWTDEV+DWTACP+1	ACTUAL COLUMN PAPER DISPLACEMENT 
	CF	A5,SEND	SEND REPEAT 
	RF	WRT15 
* 
TWOLF	LDK	A2,LF	LINE FEED 
	CF	A5,OUTPUT 
	RF(NZ)	ERGP01	JMP IF ERROR 
ONELF	LDK	A2,LF	LINE FEED 
FORMF	CF	A5,OUTPUT
	RF(NZ)	ERGP01	JMP IF ERROR 
	LDK	A2,CR	CARRIDGE RETURN
	CF	A5,OUTPUT 
	RF(NZ)	ERGP01	JMP IF ERROR 
	IM	DWTDEV+DWTLFD,A6	SET LF/FF INDICATOR
	RF	WRT15 
* 
*    REPEAT WRITE REQUEST 
* 
REP2	EQU	*
	LDR	A3,A2	SAVE CONTROL CHAR. 
	LDK	A2,CR	SEND CARRIDGE RETURN 
	CF	A5,OUTPUT 
	RF(NZ)	ERGP01	JMP IF ERROR 
	LDR	A2,A3
	SUK	A2,/2B	PRINT WITHOUT LINE FEED ? 
	RF(NZ)	REP3	NO 
	RB	WRC07	
REP3	LD	A1,DWTDEV+DWTLFD,A6	GET INDICATOR 
	RF(NZ)	WRT15	JMP IF LF/FF DONE 
	RB WRC04 
	EJECT
* 
*    ORDER 06 : THIS PART SENDS THE CHARACTERS
*    TO DOCUMENT OR CONTINUOUS STATIONARY.
* 
* 
WRT15	LDK	A3,2	SET ECB BUFFER POINTER 
WRT020	CWK	A3,/90 
	RF(NZ)	WRT030	NEW BLOCK NECESSARY ?
	CF	A5,ENDBLK	YES 
ERGP01	RF(NZ)	ERGP04	JMP IF ERROR 
	LDK	A2,/90	NEW BLOCK LENGTH
	CF	A5,STABLK	START OF BLOCK
	RF(NZ)	ERGP04	JMP IF ERROR 
WRT030	CF	A15,GETCHR	GET CHARACTER
	LDR	A4,A1	BUFFER FINISHED ?
	RF(P)	WRT050	NO
	LD	A4,DWTDEV,A6	GET DEVICE STATUS
	ANK	A4,/80	SHIFT OUT PERFORMED ? 
	RF(Z)	WRT040	NO
	LDK	A2,SI	SEND SHIFT IN
	CF	A5,OUTPUT 
	RF(NZ)	ERGP04	JMP IF ERROR 
	XRS	A4,DWTDEV,A6	RESET SHIFT INDIC.
WRT040	CF	A5,ENDBLK	END OF BLOCK
	RF(NZ)	ERGP04	JMP IF ERROR 
	CF	A5,GTSTAT	GET STATUS
	RF	ENDIO	END REQUEST 
* 
WRT050	EQU	*
	LDR	A4,A2
* 
*	EXAMINE CHARACTER AND SEND DEPENDING ON TYPE OF CHARACTER 
* 

	CWK	A4,/20	CHAR =<20 ? 
	RF(NL)	WRT100	NO 
*   CHECK IF SPECIAL CHARACTER
	SUK	A4,/9	TABULATION ? 
	RF(Z)	WRT170	YES 
	SUK	A4,/9	START UNDERLINE ?
	RF(NZ)	WRT060	NO 
	LDR	A4,A3	SAVE ECB BUFFER POINTER
	LDKL	A3,CSSUL	SEND START UNDERLINE 
	RF	WRT070
WRT060	SUK	A4,1	STOP UNDERLINE ?
	RF(NZ)	WRT080	NO 
	LDR	A4,A3	SAVE ECB BUFFER POINTER
	LDKL	A3,CSEUL	SEND STOP UNDERLINE
WRT070	CF	A5,SEN40	GO & SEND
	LDR	A3,A4	RESTORE ECB BUFFER POINTER 
	RB	WRT020	GET NEXT CHARACTER 
WRT080	SUK	A4,/8	/1B, PARTIAL LINE UP DOWN ?
	RB(NZ)	WRT020	NO, GET NEXT CHARACTER 
	CF	A15,GETCHR	YES, CHECK NEXT CHARACTER
	RB(NP)	WRT040	END OF BUFFER ?
	LDR	A4,A2	SAVE CHAR IN A4
	SUK	A2,/4B	PARTIAL LINE DOWN ? 
	RF(Z)	WRT090	YES 
	SUK	A2,1	PARTIAL LINE UP ? 
	RF(NZ)	WRT140	NO, INDICATE CODE CHECK ERROR
WRT090	LDK	A2,ESC	SEND PARTIAL LINE UP/DOWN 
	CF	A5,OUTPUT 
	RF(NZ)	ERGP04	JMP IF ERROR 
	LDR	A2,A4	RESTORE CHAR.
	CF	A5,OUTPUT 
	RF(NZ)	ERGP04	JMP IF ERROR 
	RB	WRT020	GET NEXT CHARACTER 
* 
WRT100	SUK	A4,/7E	CHAR =</7E ?
	RF(NP)	WRT110	YES, LEGAL CHARACTER 
	CWK	A2,/AE	ROOMLESS POINT ?
	RF(E)	WRT160	YES 
	SUK	A4,/23	CHAR >=/A1 ?
	RF(N)	WRT150	NO,INDICATE CODE CHECK ERROR !
	SUK	A4,/5D	CHAR =</FE ?
	RF(NP)	WRT120	YES, LEGAL CHARACTER 
	RF	WRT150	NO, INDICATE CODE CHECK ERROR
*   AUTOMATIC SHIFT OUT/IN FUNCTION   * 
* 
WRT110	LD	A4,DWTDEV,A6	7-BIT CODE /20-/7E 
	ANK	A4,/80	SHIFT OUT PERFORMED EARLIER ? 
	RF(Z)	WRT170	NO, SEND CHARACTER
	LDK	A4,/80 
	XRS	A4,DWTDEV,A6	RESET SHIFT INDICATOR 
	LDR	A4,A2	STORE CHAR.
	LDK	A2,SI	SEND SHIFT IN
	RF	WRT130
* 
WRT120	LD	A4,DWTDEV,A6	8-BIT CODE /A1-/FE 
	ANK	A4,/80	SHIFT OUT PERFORMED EARLIER ? 
	RF(NZ)	WRT170	YES, SEND CHARACTER
	LDK	A4,/80 
	ORS	A4,DWTDEV,A6	INDICATE SHIFT OUT
	LDR	A4,A2	STORE CHAR.
	LDK	A2,SO	SEND SHIFT OUT 
WRT130	CF	A5,OUTPUT	SEND SHIFT CONTROL
	RF(NZ)	ERGP04	JMP IF ERROR 
	LDR	A2,A4	RESTORE CHAR.
	RF	WRT170	SEND CHARACTER 
WRT140	SUK	A3,1	DECREMENT ECB BUFFER POINTER
WRT150	LDK	A4,/04	ILLEGAL CHARACTER SET BIT 13 IN R.C.
	ORS	A4,ECBRC,A8
	RB	WRT020
WRT160	LDK	A2,/2E 
WRT170	LDR	A4,A1
	ANK	A2,/7F	MASK,JUST 7 BIT CHAR. 
	CF	A5,OUTPUT	SEND CHARACTER
ERGP04	RF(NZ)	ERGP06	JMP IF ERROR 
	IM	DWTDEV+DWTCO1,A6	INC COLUMN COUNTER 1 
	RB	WRT020
ENDIO	EQU	* 
	LDR	A2,A1	GET RETURN CODE
	ANKL	A2,/100	PRINTER RESET ? 
	ABL(NZ)	RCTP	YES 
	CF	A5,RESREC	RESET RECOVERY BIT
	CM	DWTDEV+DWTLFD,A6	CLEAR LF/FF INDICATOR
	ABL	LENDIS	END REQUEST 
	EJECT
******************************
* 
*   ORDER 05 : BASIC WRITE
* 
******************************
BASWRT	EQU	*
*			*	=1
*			*	=1
*			*	=1
	LDK	A3,0 
BAS10	LDK	A4,/90	TEST END OF BLOCK
	LDR	A2,A4	BLOCK LENGTH IN A2=144 
	CF	A5,STABLK	START OF BLOCK
	RF(NZ)	ERGP06	JMP IF ERROR 
BAS15	CF	A15,GETCHR	GET CHARACTER 
	LDR	A1,A1	BUFFER FINISHED ?
	RF(Z)	BAS25	YES
	CF	A5,OUTPUT 
	RF(NZ)	ERGP06	JMP IF ERROR 
	SUK	A4,1	END OF BLOCK ?
	RF(Z)	BAS20	YES
	RB	BAS15	GET NEXT CHARACTER
BAS20	CF	A5,ENDBLK	END OF BLOCK 
	RF(NZ)	ERGP06	JMP IF ERROR 
	RB	BAS10	START NEXT BLOCK
BAS25	CF	A5,ENDBLK	END OF BLOCK 
ERGP06	ABL(NZ)	ERGP15	JMP IF ERROR
	ABL	TSTSTA	CHECK STATUS & END REQ. 
	EJECT
	IFT	SINHAN+FFDEV=1 
********************************************* 
* 
*   ORDER 0B : POSITION DOCUMENT
*   CONTROL WORD CONTAINS REQUESTED LINE NO 
* 
********************************************* 
POSDOC	EQU	*	POSITION DOCUMENT
	CF	A5,GTSTAT	GET DEVICE STATUS	
	LDR	A1,A1	ERROR ?
	RF(NZ)	POS040	ERROR INDICATION 
	LD	A4,ECBCW,A8	GET REQUESTED LINE
	ANK	A4,/FF 
	RF(Z)	POSERR	ILLEGAL LINE NUMBER 
	LD	A1,DWTDEV+DWTDL,A6	MAX. LINE
	CF	A5,BINARY	CONVERT ASCII TO BINARY 
	CWR	A4,A3	REQ. LINE>MAX. LINE
	RF(G)	POSERR	YES 
	CF	A5,KONVER	CONVERT BINARY TO ASCII 
	ST	A4,DWTDEV+DWTRLN,A6	SET REQUESTED LINE
POS005	EQU	*
	LDK	A2,/15	BLOCK LENGTH
	CF	A5,STABLK	START OF BLOCK
	RF(NZ)	ERGP08	JMP IF ERROR 
	LD	A3,DWTDEV+DWTALN,A6 
	RF(NZ)	POS020
	LDK	A2,FF
	CF	A5,OUTPUT 
	RF(NZ)	ERGP08	JMP IF ERROR 
POS020	LDKL	A2,CSVPA
	LDKL	A3,DWTDEV+DWTRLN
	CF	A5,SEND 
POS030	CF	A5,ENDBLK	END OF BLOCK
ERGP08	ABL(NZ)	ERGP15	JMP IF ERROR
	CF	A5,GTSTAT	GET STATUS
	RF(NZ)	POS040	ERROR ?
	LD	A2,DWTDEV+DWTRLN,A6	GET REQ. LINE NO. 
	ST	A2,DWTDEV+DWTALN,A6	ACTUAL LINE = REQ. LINE 
	CM	DWTDEV+DWTCO1,A6	CLEAR COLUMN COUNTER 
POS040	EQU	*
	LDR	A2,A1	GET RETURN CODE
	ANKL	A2,/100	PRINTER RESET ? 
	ABL(NZ)	RCTP	YES 
	CF	A5,RESREC	RESET RECOVERY BIT
	ABL	LENDIS	END REQUEST 
POSERR	ABL	LENDER 
	XIF
	EJECT
********************************************
* 
*	ORDER 24 : SET PRINTER PARAMETERS 
* 
********************************************
PRIPAR	EQU	*	 
PRI07	LDK	A3,/6	SET UP BRANCH POINTER 
	LD	A1,ECBCW,A8	GET CONTROL WORD
PRI10	LDR	A4,A1 
	IFT	SINHAN+FFDEV=1 
	LC	A2,DWTOR+1,A6	GET DWT INDEX 
	ANK	A2,1 
	RF(Z)	PRI14
	ANK	A4,/F	CHECK IF NEW PARAM. VALUE WANTED 
	ABI(NZ)	FROTAB,A3	FRONT FEED 
	RF	PRI15 
	XIF
PRI14	ANK	A4,/F	CHECK IF NEW PARAM. VALUE WANTED
	ABI(NZ)	PRITAB,A3	FRICTION/TRACTOR FEED
PRI15	SRL	A1,4	GET NEXT PARAMETER 
PRI16	CWK	A3,0	FRI/TRA, ANY MORE PARAM. TO CHECK
	RF(E)	PRI17	NO, GO AND SEND
PRI18	SUK	A3,2	TEST NEXT PARAMETER
	RB	PRI10 
PRI17	LDR	A4,P	GET PROGRAM COUNTER
	ADK	A4,6	MAKE RETURN ADDRESS BEFORE ABL
	ABL	SENPAR	SEND PARAMETERS TO PRINTER
	CF	A5,GTSTAT	GET STATUS
	LDR	A2,A1	GET RETURN CODE
	ANKL	A2,/100	PRINTER RESET ? 
	ABL(NZ)	RCTP	YES 
	CF	A5,RESREC	RESET RECOVERY BIT
	ABL	LENDIS	END REQUEST 
*   STORE PARAMETERS, TRACTOR FEED
PRI20	EQU	*	NCV= NATIONAL CHARACTER VARIATION 
	ADR	A4,A4	ADJUST TABLE 
	LD	A4,NCVTAB,A4	GET NAT. CHAR. SET ACCORDING TO INDEX
	ST	A4,DWTDEV+DWTPCS,A6	STORE IN DWT
	RB	PRI15 
PRI30	EQU	*	SCM= SELECT CHARACTER MATRIX
	CWK	A4,/9
	RF(G)	PRI60	INDEX TOO HIGH 
	ORK	A4,/30	ASCII 
	SC	A4,DWTDEV+DWTCMF,A6	STORE IN DWT
	RB	PRI15 
PRI40	EQU	*	PL= PAGE LENGTH 
	ADR	A4,A4	ADJUST TABLE 
	LD	A4,LINNUM,A4	GET LINE ACCORDING TO INDEX
	ST	A4,DWTDEV+DWTPL,A6	STORE IN DWT 
	RB	PRI15 
PRI50	EQU	*	CD= CHARACTER PITCH 
	CWK	A4,/4
	RF(G)	PRI60	INDEX TOO HIGH 
	ORK	A4,/30	ASCII 
	SC	A4,DWTDEV+DWTCMF+1,A6	STORE IN DWT
	RB	PRI17 
*   STORE PARAMETERS, FRONT FEED/FRICTION FEED
	IFT	SINHAN+FFDEV=1 
FRO20	EQU	*	NCV= NATIONAL CHARACTER VARIATION 
	ADR	A4,A4	ADJUST TABLE 
	LD	A4,NCVTAB,A4	GET NAT. CHAR. VAR. ACCORDING TO INDEX 
	ST A4,DWTDEV+DWTDCS,A6	STORE IN DWT
	RB	PRI15 
FRO30	EQU	*	SCM=SELECT CHARACTER MATRIX 
	CWK	A4,/9
	RF(G)	PRI60	INDEX TOO HIGH 
	ORK	A4,/30	ASCII 
	SC	A4,DWTDEV+DWTCMT,A6	STORE IN DWT
	RB	PRI15 
FRO40	EQU	*	PL= PAGE LENGTH 
	ADR	A4,A4	ADJUST TABLE 
	LD	A4,LINNUM,A4	GET LINE ACCORDING TO INDEX
	ST	A4,DWTDEV+DWTDL,A6	STORE IN DWT 
	RB	PRI15 
FRO50	EQU	*	CD= CHARACTER PITCH 
	CWK	A4,/4
	RF(G)	PRI60	INDEX TOO HIGH 
	ORK	A4,/30	ASCII 
	SC	A4,DWTDEV+DWTCMT+1,A6	STORE IN DWT
	RB	PRI17 
	XIF
PRI60	ABL	LENDER	REQUEST ERROR
	EJECT
********************************************
* 
*	ORDER /27 : SET FORM PARAMETERS 
* 
********************************************
FORPAR	EQU	*
	IFT	FORMPA=1 
	LD	A2,ECBCW,A8	GET CONTROL WORD, INDEX 
	ANK	A2,/F	MASK 
	SUK	A2,1 
	RF(Z)	FOR020	HOPPER,HIGH SPEED OR LINE SPACE PARAM.
	SUK	A2,1 
	ABL(Z)	BASWRT	LOAD CHARACTER MATRIX
	SUK	A2,1 
	RF(Z)	TAB010	TABULATIONS 
	XIF
FOR010	ABL	LENDER	REQUEST ERROR,END OF REQ. 
	IFT	FORMPA=1 
*   HOPPER, HIGH SPEED & LINE SPACE PARAMETERS
* 
FOR020	LDK	A2,/E	BLOCK LENGTH 
	CF	A5,STABLK	START OF BLOCK
	ABL(NZ)	ERGP15	JMP IF ERROR
	LD	A4,ECBCW,A8	GET CONTROL WORD
	LDR	A1,A4	ALSO IN A4 
	SRL	A1,4	SHIFT 
	ANK	A1,/F	MASK LINE SPACE INDEX
	RF(Z)	FOR030	NO CHANGE WANTED
	CWK	A1,/8
	RB(G)	FOR010	REQUEST ERROR, INDEX TOO BIG
	ADR	A1,A1	ADJUST TABLE 
	LD	A1,LINTAB,A1	GET LINE SPACE ACCORDING TO TABLE
	ST	A1,DWTDEV+DWTLS,A6	STORE IN DWT 
	LDKL	A2,CSLSL
	LDKL	A3,DWTDEV+DWTLS 
	CF	A5,SEND	SEND LINE SPACE LOAD
FOR030	LDR	A1,A4	GET CONTROL WORD 
	SRL	A1,8 
	ANK	A1,/F	MASK HIGH SPEED PARAMETER
	RF(Z)	FOR060	NO CHANGE WANTED
	SUK	A1,1 
	RF(NZ)	FOR040
	LDK	A2,SM	HIGH SPEED SELECTED
	SC	A2,DWTDEV+DWTHSP+1,A6	STORE IN DWT
	LDKL	A2,CSSM 
	RF	FOR050	SEND SELECT HIGH SPEED MODE
FOR040	SUK	A1,1 
	RB(NZ)	FOR010	REQUEST ERROR
	LDK	A2,RM
	SC	A2,DWTDEV+DWTHSP+1,A6	STORE IN DWT
	LDKL	A2,CSRM	SEND SELECT NORMAL SPEED
FOR050	LDKL	A3,DWTDEV+DWTHSP
	CF	A5,SEND 
FOR060	EQU	*
	IFT	SINHAN=1 
	LDR	A1,A4	GET CONTROL WORD 
	SRL	A1,/C
	ANK	A1,/F	MASK HOPPER PARAMETER
	RF(Z)	FOR120	NO CHANGE WANTED
	SUK	A1,1 
	RF(NZ)	FOR070
	LDKL	A2,/3168	SELECT HOPPER 1
	RF	FOR075
FOR070	SUK	A1,1 
	RF(NZ)	FOR080
	LDKL	A2,/3268	SELECT HOPPER 2
FOR075	ST	A2,DWTDEV+DWTHOP,A6	STORE IN DWT
	LDKL	A2,CSSM 
	RF	FOR110
FOR080	SUK	A1,1 
	RF(NZ)	FOR090
	LDKL	A2,/316C	DESELECT HOPPER 1
	RF	FOR095
FOR090	SUK	A1,1 
	RB(NZ)	FOR010	REQUEST ERROR
	LDKL	A2,/326C	DESELECT HOPPER 2
FOR095	ST	A2,DWTDEV+DWTHOP,A6	STORE IN DWT
	LDKL	A2,CSRM 
FOR110	LDKL	A3,DWTDEV+DWTHOP
	CF	A5,SEND	SEND HOPPER MODE
	XIF
	IFT	FORMPA=1 
	RF	FOR120	END OF REQ.
* 
*   TABULATION PART 
* 
TAB010	EQU	*
	LDK	A3,0	SET UP BUFFER POINTER 
TAB020	CF	A15,GETCHR	GET CHARACTER
	LDR	A1,A1	END OF BUFFER ?
	RB(Z)	FOR010	REQUEST ERROR 
	LDR	A4,A2	KEEP CHAR. IN A4 
	LDK	A2,/80	BLOCK LENGTH
	CF	A5,STABLK	START OF BLOCK
	RF(NZ)	ERGP10	JMP IF ERROR 
	ANK	A4,1	SET OR CLEAR TABS. ?
	RF(Z)	TAB050	CLEAR ALL TABULATIONS 
TAB030	CF	A15,GETCHR	GET TABULATION POSITION
	LDR	A1,A1
	RF(Z)	FOR120	END OF REQUEST
	LDR	A4,A2	TAB. POS. IN A4
	CF	A5,KONVER	KONVERT TO ASCII
	SC	A2,DWTDEV+DWTTAB,A6 
	SC	A4,DWTDEV+DWTTAB+2,A6	STORE TAB POS IN DWT
	SRL	A4,8	SHIFT RIGHT 
	SC	A4,DWTDEV+DWTTAB+1,A6	STORE TAB POS IN DWT
	LDR	A4,A3	KEEP COUNTER IN A4 
	LDKL	A2,CSHPA
	LDKL	A3,DWTDEV+DWTTAB
	CF	A5,SEND	SEND HORIZONTAL POS ABS.
	LDKL	A2,CSHTS
	CF	A5,SEND	SET TAB POS AT ACTIVE POS 
	LDR	A3,A4	RESTORE COUNTER
	RB	TAB030	GET NEXT POS 
TAB050	EQU	*
	LDK	A3,/33	CLEAR ALL TABS
	SC	A3,DWTDEV+DWTTAB,A6	STORE IN DWT
	LDKL	A2,CSTBC
	LDKL	A3,DWTDEV+DWTTAB
	CF	A5,SEND	CLEAR ALL TABULATION POS. 
FOR120	CF	A5,ENDBLK	END OF BLOCK
ERGP10	ABL(NZ)	ERGP15	JMP IF ERROR
	ABL	TSTSTA	CHECK STATUS & END REQ. 
	XIF
	EJECT
***************************************** 
* 
*	ORDER 38 : RELEASE DOCUMENT 
* 
***************************************** 
	IFT	SINHAN+FFDEV=1 
RELDOC	EQU	*
	CF	A5,GTSTAT	GET STATUS
	LDR	A2,A1
	RF(NZ)	REL20	ERROR ? 
	LDK	A2,/F	BLOCK LENGTH 
	CF	A5,STABLK	START OF BLOCK
	RF(NZ)	ERGP14	JMP IF ERROR 
	LDKL	A2,CSVPA
	LDKL	A3,DWTDEV+DWTDL	SEND LF TO END OF PAGE
	CF	A5,SEND 
	LDK	A3,/F	SET UP LINE FEED COUNTER 
REL10	LDK	A2,LF	LINE FEED 
	CF	A5,OUTPUT 
	RF(NZ)	ERGP14	JMP IF ERROR 
	SUK	A3,1	DECREMENT LINE FEED COUNTER 
	RB(NZ)	REL10	ANY MORE LF ? 
	CF	A5,ENDBLK	END OF BLOCK
	RF(NZ)	ERGP14	JMP IF ERROR 
	CF	A5,GTSTAT	GET STATUS FROM PRINTER 
	CM	DWTDEV+DWTALN,A6	RESET ACTUAL LINE
	CM	DWTDEV+DWTRLN,A6	RESET REQUESTED LINE 
	CM	DWTDEV+DWTCO1,A6	CLEAR COLUMN COUNTER 
	LDR	A2,A1	GET RETURN CODE
REL20	ANKL	A2,/100	PRINTER RESET ?
	ABL(NZ)	RCTP	YES 
	CF	A5,RESREC	RESET RECOVERY BIT
	ABL	LENDIS	END REQUEST 
	XIF
	EJECT
*********************************************************** 
* 
*	 R C T P
* 
*	RECOVERY ROUTINE REPEATS RUNNING REQUEST AT POWER ON
* 
************************************************************
RCTP	EQU	*
RCTP07	LDKL	A1,/7FFF	SET DEVICE BUSY	 
	ANS	A1,DWTST,A6	BUSY 
	LDKL	A5,DWTSB2	STACK BASE
	ADR	A5,A6
	LD	A1,DWTDEV+DWTSYST,A6	INTERN. SYSTEM START IND.	 
	RF(Z)	RCTP10	NO SYSTEM START	
			*	 
	CM	DWTDEV+DWTSYST,A6	SET SYSTEM START INDICATOR	 
	LDKL	A4,STDNCV	GET STANDARD NAT. CHAR. SET 
	CF	A5,KONVER	CONVERT BIANARY TO ASCII
	ST	A4,DWTDEV+DWTDCS,A6	SET CHAR. SET DOCUMENT
	ST	A4,DWTDEV+DWTPCS,A6	SET CHAR. SET CONT.STAT.
	LDKL	A4,PAGLEN	STANDARD PAGE LENGTH
	CF	A5,KONVER	CONVERT BINARY TO ASCII 
	ST	A4,DWTDEV+DWTPL,A6	SET PAGE LENGTH CONT.STAT. 
	LDKL	A4,DOCLEN	GET STANDARD PAGE LENGTH DOCUMENT 
	CF	A5,KONVER	CONVERT BINARY TO ASCII 
	ST	A4,DWTDEV+DWTDL,A6	SET PAGE LENGTH DOCUMENT 
	LDKL	A4,MATRIX	GET STANDARD CHAR MATRIX FONT 
	ORK	A4,ZERO	MAKE ASCII 
	SC	A4,DWTDEV+DWTCMT,A6	STORE IN DWT (TRACTOR)
	SC	A4,DWTDEV+DWTCMF,A6	STORE IN DWT (FRONT/FRI)
	LDKL	A4,DENSIT	GET STANDARD CHAR DENSITY/PITCH 
	ORK	A4,ZERO	MAKE ASCII 
	SC	A4,DWTDEV+DWTCMT+1,A6	STORE IN DWT (TRACTOR)
	SC	A4,DWTDEV+DWTCMF+1,A6	STORE IN DWT (FRONT/FRI)
	CF	A5,GTSTAT	DUMMY ST., CLEAR RESET BIT
RCTP10	EQU	*
	LDR	A4,P	GET PROGRAM COUNTER 
	ADK	A4,6	MAKE RETURN ADDRESS 
	ABL	SENPAR	SEND PARAMETERS 
	CM	DWTDEV+DWTALN,A6	CLEAR ACTUAL LINE (FRONT/FRI)
	LDKL	A1,/20	INDICATE POWER OFF OCCURED 
	ORS	A1,DWTDEV,A6	
	LD	A1,DWTECB,A6	RUNNING REQUEST
	ABL(NZ)	ACT020	YES , REPEAT THE REQUEST
RCTP20	ABL	LENDIS	DISPATCH
	EJECT
************************************************************
* 
*	GTSTAT
* 
* 
*	THIS ROUTINE SENDS 'DEVICE STATUS REPORT TO THE PRINTER 
* 
*	AND ANALYZES THE DEVICE STATUS SENT FROM THE PRINTER
* 
*	AT EXIT A1 = RETURN CODE
* 
************************************************************
GTSTAT	EQU	*
	CM	DWTDEV+DWTRC,A6	RESET RETURN CODE 
	LDK	A2,/5	BLOCK LENGTH 
	CF	A5,STABLK	START OF BLOCK
	RF(NZ)	ERGP14	JMP IF ERROR 
	LDKL	A3,CSDSR	DEVICE STATUS REPORT 
GTST02	LCR	A2,A3	GET CHARACTER
	ANK	A2,/FF	MASK
	SLL	A2,8	SHIFT LEFT
	RF(N)	GTST04	END OF CONTROL SEQUENSE 
	SRL	A2,8	SHIFT RIGHT 
	CF	A5,OUTPUT 
	RF(NZ)	ERGP14	JMP IF ERROR 
	ADK	A3,1	INCR. ADDRESS 
	RB	GTST02	GET NEXT CHARACTER 
GTST04	CF	A5,ENDBLK	END OF BLOCK
ERGP14	RF(NZ)	ERGP15	JMP IF ERROR 
	LDR	A1,A6	SAVE DWTADDRESS
	LDKL	A4,DWTDEV+DWTTP 
	ADR	A4,A6	TIMER
	CF	A15,SETIMP	SET TIMER, 10 SEC. 
	DATA	ERGP00,TIME	RETURN ADDRESS,TIME 
GTST05	LDKL	A4,TAB	GET TABLE ADDRESS
GTST10	EQU	*
	LDK	A3,0	RESET INDEX 
	CF	A5,INPUT	READ STATUS FROM PRINTER 
	ANK	A2,/FF	GET CHARACTER 
	CCK	A2,/5C5C	STRING TERMINATOR 
	RF(E)	GTSEND	YES 
	LDR	A7,A7	ORDER /00 ?
	RF(NZ)	GTST15	NO 
	CCK	A2,/3B	STRING SEPARATOR ?
	RF(NE)	GTST15	NO 
	IM	DWTDEV+DWTSER,A6	IND. STRING SEP. 
	LD	A2,DWTDEV+DWTSER,A6 
	SUK	A2,2	TWO SEPARATORS RECEIVED ? 
	RF(NZ)	GTST30	NO, READ NEXT CHAR.
	CF	A5,INPUT	CHECK IF SERVICE STATUS PRESENT
	ANK	A2,/F	MASK 
	CCK	A2,/A
	RB(NL)	GTST10	NO SERVICE STATUS
	LDKL	A4,TAB+20	INCR. ADDR. TO SERV. STAT.
GTST15	LCR	A3,A4	GET MASK RETURN CODE 
	ANR	A2,A3
	LDKL	A3,/3AC0	SHIFT LEFT CIRCULAR A2 
	LC	A3,1,A4	A3 TIMES
	EXR	A3	EXECUT SHIFT INSTRUCTION
	LDR	A7,A7	ORDER /00 ?
	RF(NZ)	GTST20	NO 
	CW	A4,TAB+20	SERVICE STATUS ?
	RF(L)	GTST20	NO
	ORS	A2,ECBCW,A8	SERVICE STAT. IN CONTR. WORD 
	RF	GTST30
GTST20	ORS	A2,DWTDEV+DWTRC,A6	SAVE RETURN CODE TEMPORARILY
GTST30	ADK	A4,2	INCREMENT ADRESS
	RB	GTST10	GET NEXT STATUS CHARACTER
GTSEND	EQU	*
	LD	A1,DWTDEV+DWTRC,A6	GET RETURN CODE
	CM	DWTDEV+DWTSER,A6	CLEAR STRING SEP. IND. 
	LD	A2,DWTDEV+DWTTP,A6
	RF(Z)	GTST40	CHECK IF ALLREADY ZERO
	CM*	DWTDEV+DWTTP,A6	RESET TIMER
GTST40	CM	DWTDEV+DWTTP,A6	RESET TIMER POINTER 
GTST50	EQU	*
	RTN	A5 
	EJECT
************************************************************
* 
*   THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII CODE
* 
*	REGISTERS : 
*   A1= WORK REGISTER 
*   A4= BINARY INPUT
*   A2,A4= ASCII OUTPUT 
* 
* 
KONVER	EQU	*
*	BINARY TO DEC.
	LDK	A2,0	CLEAR A2
	CWK	A4,100	VALUE > 100 ? 
	RF(L)	KONV05	NO
	SUKL	A4,100
	LDKL	A2,/100	LEFT BYTE OF A2=X=1 
KONV05	CWK	A4,10	ARE THERE ANY TENS ? 
	RF(L)	KONV04	NO
	SUK	A4,10
	ADK	A2,/1	NUMBER OF TENS IN RIGHT B. OF A2=Y 
	RB	KONV05	NEXT 
KONV04	ORKL	A2,/3030	XY IN A2 
	ORK	A4,/30	Z IN A4 
	SRC	A2,8	YX IN A2
	LDR	A1,A2
	ANKL	A1,/FF00	KEEP Y IN A1 
	ANK	A2,/FF	KEEP X IN R. BYTE OF A2. ASCII
	ORR	A4,A1	YZ IN A1. ASCII
	RTN	A5 
	EJECT
************************* 
*	RESET RECORVERY 
* 
RESREC	EQU	*
	LD	A4,DWTDEV,A6	DEVICE STATUS
	ANKL	A4,/20	RECOVERY?
	RF(E)	RESRTN	NO. 
	XRS	A4,DWTDEV,A6	YES. RESET RECOVERY BIT 
	ORKL	A1,/100	INDIC. RECOV. IN RET. CODE BIT7 
RESRTN	RTN	A5	RETURN
* 
* 
**************************************************
* 
*	ERROR ROUTINE FOR STABLK,OUTPUT, ENDBLK 
*	AND TIMER.
* 
ERGP00	EQU	*
	LDR	A6,A1	RESTORE DWTADDRESS 
	CM	DWTDEV+DWTTP,A6	RESET TIMER POINTER 
	RF	ERGP20
ERGP15	EQU	*
	ANK	A1,/1A	OUTP. ERR, SOFTW. T-OUT,LRC-ERR 
	ABL(NZ)	RCTP	YES, RECOVERY 
ERGP17	EQU	*
	IFF	REQEND=1 
	ABL	LDISP	DISPATCH 
	XIF
ERGP20	LDK	A1,1	SET NOT OPERABLE
ERGP30	ABL	LENDIS	END OF REQUEST
	EJECT
******************************************************* 
* 
*	S E N D 
* 
*	THIS ROUTINE SENDS AN CONTROL SEQUENCE
*	TO THE PRINTER
* 
* 
*	AT ENTRY :
*	A2 = CONTROL SEQUENCE ADRESS
*	A3 = DWT-DISPLACEMENT TO LINE NO,CHAR.SET,ETC 
* 
* 
*	AT EXIT : 
*	A1,A2,A3 IS DESTROYED 
* 
* 
* 
SEND	EQU	*	SEND CONTROL SEQUENCE
	ST	A3,DWTDEV+DWTDISP,A6	SAVE DWT-DISPLACEMENT
	ST	A2,DWTDEV+DWTSTR,A6	CONTROL SEQUENCE ADRESS 
SEND10	EQU	*
	LD	A3,DWTDEV+DWTSTR,A6	GET CONTROL SEQUENCE ADRESS 
	LCR	A2,A3	GET CHARACTER
	ANK	A2,/FF	MAKE CHARACTER
	SLL	A2,8	END OF CONTROL SEQUENCE 
	RF(N)	SENDEND	YES,RETURN 
	CWK	A2,/3000	LINE NO,CHAR.SET,ETC
	RF(E)	SEND30	YES 
	SRL	A2,8	PREPARE TO SEND CHARACTER 
	CF	A5,OUTPUT	SEND CHARACTER
	RB(NZ)	ERGP15	JMP IF ERROR 
SEND20	EQU	*
	IM	DWTDEV+DWTSTR,A6	INC. CONTROLSEQUENCE ADRESS
	RB	SEND10	GET NEXT 
SEND30	EQU	*
	LD	A3,DWTDEV+DWTDISP,A6	GET DWT-DISPLACEMENT 
	ADR	A3,A6	GET PROPER VALUE 
	LCR	A2,A3	GET CHARACTER
	CF	A5,OUTPUT	SEND CHARACTER
	RB(NZ)	ERGP15	JMP IF ERROR 
	IM	DWTDEV+DWTDISP,A6	INC. DISPLACEMENT ADRESS
	RB	SEND20	GET NEXT 
SENDEND	EQU	* 
	RTN	A5 
	EJECT
************************************************************
* 
*	SENPAR
* 
*   THIS ROUTINE SENDS THE PRINTER PARAMETERS TO THE SUBDEVICE
* 
SENPAR	EQU	*
	LDK	A2,/1A 
	CF	A5,STABLK 
ERGP16	RB(NZ)	ERGP15	JMP IF ERROR 
	IFT	SPEEDY=1 
	LDKL	A2,CSSM	
	LDKL	A3,DWTDEV+DWTHSP
	CF	A5,SEND	SEND SELECT HIGH SPEED
	XIF
	IFT	SINHAN+FFDEV=1 
	LC	A2,DWTDEV,A6	GET DWTINDEX 
	ANK	A2,1 
	RF(NZ)	SEN10 
	XIF
	LDKL	A3,CSRM	SET TRACTOR MODE
	CF	A5,SEN40
	LDKL	A2,CSSLPL 
	LDKL	A3,DWTDEV+DWTPL 
	CF	A5,SEND	SEND SELECTED PAGE LENGTH 
	LDKL	A2,CSSNV
	LDKL	A3,DWTDEV+DWTPCS
	CF	A5,SEND	SEND NATIONAL CHAR VARIATION
	LDKL	A2,CSCPL
	LDKL	A3,DWTDEV+DWTCMF
	CF	A5,SEND	SEND CHAR. MATRIX & PITCH 
	RF	SEN20 
* 
	IFT	SINHAN+FFDEV=1 
SEN10	EQU	* 
	IFT	SINHAN=0 
	LDKL	A3,CSSM	SET FRONT FEED MODE 
	CF	A5,SEN40
	XIF
	IFT	SINHAN+FFDEV=1 
	LDKL	A2,CSSLPL 
	LDKL	A3,DWTDEV+DWTDL 
	CF	A5,SEND	SEND SELECTED PAGE LENGTH 
	LDKL	A2,CSSNV
	LDKL	A3,DWTDEV+DWTDCS
	CF	A5,SEND	SEND NATIONAL CHAR VARIATION
	LDKL	A2,CSCPL
	LDKL	A3,DWTDEV+DWTCMT
	CF	A5,SEND	SEND CHAR. MATRIX & PITCH 
	XIF
SEN20	CF	A5,ENDBLK	END OF BLOCK 
	RB(NZ)	ERGP16	JMP IF ERROR 
	ABR	A4	RETURN
* 
	EJECT
**********************************************
* 
*   THIS ROUTINE SENDS A CONTR. SEQ. WITHOUT DWT REFERENCE
*   AT ENTRY : A3= CONTROL SEQ, ADDRESS 
* 
SEN40	LCR	A2,A3	
	ANK	A2,/FF	MASK
	SLL	A2,8	SHIFT LEFT
	RF(N)	SEN50	END OF SEQUENSE
	SRL	A2,8	SHIFT RIGHT 
	CF	A5,OUTPUT 
	RB(NZ)	ERGP16	JMP IF ERROR 
	ADK	A3,1	INCR. ADDRESS 
	RB	SEN40	GET NEXT CHAR.
SEN50	RTN	A5	RETURN & SEND PARAMETERS 
	EJECT
************************************************************
* 
*	BINARY
* 
*	THIS ROUTINE CONVERTS ASCII CODE TO A BINARY VALUE
* 
*	REGISTERS:
*	A1= ASCII INPUT 
*	A2= WORK REGISTER 
*	A3= BINARY OUTPUT 
* 
* 
* 
BINARY	SUR	A3,A3	CLEAR A3 
	LDR	A2,A1	MAX. LINE ASCII
	SRL	A2,8 
	SUK	A2,/30 
	ADR	A3,A2
	ADR	A3,A2
	SLL	A2,3 
	ADR	A3,A2
	ANK	A1,/F
	ADR	A3,A1	MAX. LINE BINARY 
	RTN A5 
	EJECT
LINNUM	EQU	*-2	NUMBER OF LINES
	DATA	/3135,/3138,/3234 
	DATA	/3235,/3330,/3333,/3335 
	DATA	/3336,/3438,/3530,/3531 
	DATA	/3630,/3636,/3730,/3732 
* 
* 
* 
* 
NCVTAB	EQU	*-2	NATIONAL CHARACTER VARIATION YABLE 
	DATA	/3031,/3032,/3033,/3034 
	DATA	/3035,/3036,/3037,/3038 
	DATA	/3039,/3130,/3131,/3131 
	DATA	/3133,/3134,/3135 
TAB	EQU	*	MASK TABLE FOR STATUS REPORT FROM PRINTER 
	DATA	/C0,/C0,/C0,/2CC	*	 
	DATA	/2CF,/1C8,/C0,/C0	*	
	DATA	/C0,/C0,/FC8,/FC0 
	DATA	/C0,/C0 
PRITAB	EQU	*	BRANCH ADDRESSES ORDER /24 
	DATA	PRI50 
	DATA	PRI40 
	DATA	PRI30 
	DATA	PRI20 
FROTAB	EQU	*	BRANCH ADDRESSES ORDER /24 
	IFT	SINHAN+FFDEV=1 
	DATA	FRO50 
	DATA	FRO40 
	DATA	FRO30 
	DATA	FRO20 
	XIF
LINTAB	EQU	*-2	LINE SPACE TABLE 
	DATA	/3033,/3034,/3036,/3038,/3132 
	DATA	/3136,/3234,/3438 
	END

Full view