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

⟦bcbe08c39⟧

    Length: 36724 (0x8f74)
    Notes: pts_type(SC)
    Names: »DRDY01.SC«

Derivation

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

PTS(SC)

	IDENT DRDY01 	REL 10.0 80-03-14 870105041000 

			=7,CUR.POS FOR ALL ORDERS EXCEPT ERASE 
			PRR 10.0 79-12-07
			=6,CORRECTION OF SPECIAL CHARTACTER HANDLING 
			REL 10.1 79-10-19
			=5,ABORT ROUTINE 
			REL 10.1 79-10-15
			=4,CORRECTION OF ERASE 
			REL 9.1 79-05-23 
			=3,STEADY CURSOR PROBLEM CORRECTED 
			PRR 9.1 79-04-06 
			=2,ERASE ONLY TO LAST POS. OF SCREEN 
			PRR 9.1 79-01-31 
			=1   DRIVER ADAPTAD TO HANDLE PTS 6385 
			PRR 9.1 79-01-12 

* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRDY01 = DRIVER VIDEO AND GRAPHIC DISPLAY 
* 
* 
* 
* 
* 
* 
**************************************************
* 
* 
*    THIS DRIVER HANDLES OUTPUT TO THE VIDEO DISPLAYS 
*    PTS 6344, PTS 6342 AND TO THE PLASMA DISPLAYS PTS 6351 
*    AND PTS 6386 
*    THE DISPLAYS MUST BE CONNECTED TO THE SYSTEM 
*    VIA CHLT OR CHRT.
* 
*    THE DRIVER INCLUDES DEVICE DEPENDENT ECHO-FUNCTIONS
*    WHICH MAKES IT POSSIBLE TO USE THE DISPLAY AS AN 
*    ECHO-DEVICE TO ANY KEYBOARD, THAT RUNS UNDER THE 
*    GENERAL KEYBOARD DRIVER DRKB01.
* 
* 
*    THE DRIVER CONSISTS OF FOLLOWING PARTS:
* 
*    A C D Y       ACTIVATION PART
* 
*    I H D Y       INTERRUPT HANDLER
* 
*    R C D Y       RECOVERY ROUTINE 
* 
*    E C H O D Y   ECHO FUNCTIONS 
* 



* 
*    THE FOLLOWING ORDERS ARE TREATED:
* 
*    ORDER 00: TEST STATUS
*          05: BASIC WRITE
*          06: STANDARD WRITE 
*          07: WRITE GRAPHIC DISPLAY
*          0B: CURSOR POSITIONING 
*          31: ERASE
* 
*    NORMAL REGISTER USAGE
* 
*    REGISTER A1 = RETURN CODE
*             A2 = OUTPUT CHARACTER 
*             A3 = BUFFER INDEX 
*             A4 = WORK REGISTER
*             A5 = STACK BASE 
*             A6 = DWT-ADDRESS
*             A7 = ORDER
*             A8 = ECB-ADDRESS
* 
	EJECT
* 
* 
*    SYSTEM ADAPTATION
* 
*    DISPLAY TYPE MUST BE DEFINED IN FIRST WORD IN DWT. 
* 
*   --------------------------------- 
*   BIT:   10   11
*   --------------
*           0    0    PTS 6344
*           0    1    PTS 6351 & 6342 
*           1    0    PTS 6386 & 6385 
*   --------------------------------- 
* 
*    BY MEANS OF CONDITIONAL ASSEMBLY THE DRIVER: 
*   -CAN HANDLE GRAFIC MODE FOR PTS 6351 OR NOT 
*   -IS ADAPTED TO CONTROL ONLY PTS 6344
*   -CAN USE LOWER CASE CHAR. GENERATOR COLUMN 6 AND 7
*   -CAN SUPPRESS ECHOING OF END OF RECORD CHARACTER
*   -CAN SUPPRESS TRAILING BLANKS 
*    AND ALSO UNDERLINE START (/12), LOW INT (/1E), HIGH INT (/1F)
	EJECT
* 
* 
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
* 
	ENTRY	DYAD	ADDRESS TO ADDRESSBLOCK 
	ENTRY	ECHODY	DEVICE-DEPENDENT ECHO-ROUTINE 
* 
* 
* 
* 
***************************************** 
*    EXTERNAL TOSS MODULE ENTRIES       * 
***************************************** 
* 
* 
	EXTRN	DISIOE	I/O REQUEST ERROR 
	EXTRN	OUTPUT	SUBROUTINE TO SEND CHARACTER
	EXTRN	TDISP	DISPATCHER 
	EXTRN	LDREG	LOAD REGISTERS A4, A3, A5, A7, A8 AND RETURN 
	EXTRN	TENDIO	END I/O 
	EXTRN	SAVE8	SAVE 8 REGISTERS ON A15 STACK
	EXTRN	ECHRTN	RETURN TO KEYBOARD AFTER ECHO 
	EXTRN	GETCHR	GET CHARACTER FROM ECB-BUFFER 
	EJECT
* 
************************
*    DWT PARAMETERS    *
************************
* 
	EXTRN	DWTST	STATUS 
	EXTRN	DWTBC	BYTE COUNTER 
	EXTRN	DWTOR	ORDER
* 
	EJECT
************* 
* CONSTANTS * 
************* 
* 
FASTO	EQU	/14	FAST OUTPUT 
SCADD	EQU	/11	SET CURSOR ADDRESS
ULSTAR	EQU	/12	UNDERLINE START
ULSTOP	EQU	/13	UNDERLINE STOP 
LISTAR	EQU	/1E	LOW INTENSITY START
LISTOP	EQU	/1F	LOW INTENSITY STOP 
BACKSP	EQU	/08	BACKSPACE
LF	EQU	/0A	LINE FEED
HOME	EQU	/0B	CURSOR HOME
CLEHOM	EQU	/0C	CLEAR AND CURSOR HOME
CR	EQU	/0D	CARRIAGE RETURN
CURRIG	EQU	/10	CURSOR RIGHT 
SPACE	EQU	/20	SPACE 
STX	EQU	/82	START OF MESSAGE
ETB	EQU	/97	END OF MESSAGE
ETX	EQU	/03	LAST DUMMY
RETURN	EQU	/12	RETURN TO ALPHANUMERIC MODE
ESCAPE	EQU	/11	ESCAPE TO GRAPHIC MODE 
POINT	EQU	/2E	POINT CHARACTER 
EQU	EQU	6	THRESHOLD FOR AUTOMATIC FAST OUTPUT 
STILL	EQU	/18	CURSOR STEADY 
CTYCOD	EQU	/1B	SET COUNTRY CODE 
* 
********************
*    RETURN CODES  *
********************
* 
CCERR	EQU	/4	CODE CHECK ERROR 
OPERR	EQU	/1	NOT OPERABLE, POWER OFF
* 
	EJECT
* 
* 
***************************************** 
*    CONDITIONAL ASSEMBLY               * 
***************************************** 
* 
* 
*    BY SETTING X:A TO 1 DRIVER CAN HANDLE GRAFIC MODE FOR PTS 6351 
* 
X:A	EQU	0 
GRAFIC	EQU	X:A
* 
*    BY SETTING X:B = 1 THE DRIVER HANDLES ONLY PTS 6344
* 
X:B	EQU	1 
WHATDY	EQU	X:B
* 
* 
*    BY SETTING X:C TO 1 LOWER CASE CHAR. GENERATOR 
*    (COLUMNS 6 AND 7) CAN BE USED
X:C	EQU	0 
LOWCHA	EQU	X:C
* 
* 
*    BY MEANS OF CONDITIONAL ASSEMBLY IT IS POSSIBLE
*    TO SUPPRESS ECHOING OF END OF RECORD CHARACTER.
*    THIS IS ATTAINED BY SETTING THE CONSTANT X:G=0 
* 
X:D	EQU	0 
EORECH	EQU	X:D
* 
*   BY SETTING THE CONSTANT TRASPA = 1 IT IS
*   POSSIBLE TO SUPPRESS TRAILING BLANKS, /12, /1E AND /1F. 
* 
X:E	EQU	0 
TRASPA	EQU	X:E
	EJECT
* 
*   BY SETTING X:F = 1, CURSOR WILL BE STEADY 
*   INSTEAD OF BLINKING 
X:F	EQU	0 
STEADY	EQU	X:F
* 
*   THIS DRIVER CAN BE ADAPTED TO MEMORY MANAGEMENT UNIT
*   BY SETTING MMUPAG = 1 
* 
MMUPAG	EQU	0
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
*   BY MEANS OF CONDITIONAL ASSEMBLY IT IS POSSIBLE 
*   TO CHOOSE BETWEEN NINE (9) DIFFERENT CHARACTER SETS.


*	CODE	COUNTRY

*	0	GB/NL/B 
*	1	D/A/L/CH
*	2	F/CH/B/L
*	3	E 
*	4	I/CH
*	5	S/SF
*	6	DK/N
*	7	P 
*	8	YU
*	9	US
X:G	EQU	0 
COUNTRY	EQU	X:G 
* 
*   MEMORY MANAGEMENT BUFFER SIZE 
* 
* 
X:H	EQU	64
DVBLEN	EQU	X:H
* 
	EJECT
* 
* 
********************************
*    DWT-DISPLACEMENT          *
********************************
* 
* 
DWTDRD	EQU	/10	START OF DRIVER DEFINED PART 
* 
	IFT	MMUPAG=0 
START	EQU	DWTDRD
	XIF
* 
	IFT	MMUPAG=1 
START	EQU	DWTDRD+4
	XIF
* 
DWTAP	EQU	START+/12	HEAD POSITION POINTER 
DWTPOS	EQU	START+/15	POSITIONS
DWTLIN	EQU	START+/14	LINES
DWTBIN	EQU	START+/16	BUFFER INDEX 
* 
	EJECT
* 
* 
**********
* TABLES *
**********
* 
* 
	DATA	DVBLEN	BUFFER LENGTH
	DATA	2	DEVICE INDEX
DYAD	EQU	*	ADDRESS BLOCK
	DATA	ACDY	ACTIVATION DRIVER
	DATA	ABDY	ABORT ROUTINE ADDRESS
	DATA	IHDY	INTERRUPT HANDLER
	DATA	RCDY	RECOVERY ROUTINE 
	DATA	ECHODY	DEVICE-DEPENDENT ECHO-ROUTINE
* 
* 
TABSPE	EQU	*	TABLE OF SPECIAL CHARACTERS
	DATA	/0712,/131E,/1F14 
	EJECT
* 
*    A C D Y
* 
*    ACDY = ACTIVATION DRIVER DISPLAY 
* 
*    ORDER 00: TEST STATUS. DUMMY IS SENT TO DISPLAY AND RETURN CODE
*              IS SET IF DISPLAY NOT OPERABLE 
* 
* 
*    ORDER 05: BASIC WRITE. CHARACTER ARE SENT TO DISPLAY 
*              FROM ECB-BUFFER WITHOUT ANY CHECK. 
* 
*    ORDER 06: STANDARD WRITE. CHARACTERS ARE SENT TO DISPLAY FROM
*               ECB-BUFFER AFTER INDIVIDUAL CODE CHECK. 
* 
*              IF A PREDEFINED NUMBER OF CHARACTERS (SEE CONSTANT 'EQU')
*              ARE FOUND EQUAL, FAST OUTPUT IS EXECUTED FOR THE NUMBER
*              OF CHARACTERS FOUND EQUAL (> 'EQU') ON 6344 & 6386>
* 
	IFT	GRAFIC=1 
*    ORDER 07: WRITE GRAPHIC DISPLAY. THE DISPLAY IS SWITCHED 
*              TO GRAPHIC MODE AND INFORMATION IN ECB-BUFFER
*              IS SENT TO THE DISPLAY.
* 
	XIF
*    ORDER /B: CURSOR POSITIONING AND STANDARD WRITE. 
*              THE CURSOR IS SENT TO THE POSITION GIVEN 
*              IN CONTROL WORD. NO INFORMATION ON DISPLAY 
*              IS ERASED. THEN STANDARD WRITE (SEE ORDER 6) 
*              IS EXECUTED. 
* 
*    ORDER 31: ERASE. THE DISPLAY IS ERASED ON THE LINE 
*              WHERE THE CURSOR IS POSITIONED THE NUMBER
*              OF CHARACTERS THAT ARE DEFINED IN THE CONTROL
*              WORD OF ECB. 0-80 CHARACTERS. ERASING STARTS 
*              IN THE CURSOR POSITION. THE CURSOR RE- 
*              MAINS IN THAT POSITION.
ACDY	EQU	*
	LDK	A3,0	START BUFFER INDEX
	LDK	A4,0	COUNTER 
	LDR	A7,A7	ORDER 0 ?
	ABL(E)	ADY410	YES
	LDK	A2,STX	START OF MESSAGE
	CF	A5,OUTPUT	SEND
	IFT	WHATDY=0 
	LDR*	A1,A6	CHANNEL PARAMETER 
	ANK	A1,/10	GRAPHIC DISPLAY 
	RF(E)	ACDY02	NO
	IFT	GRAFIC=1 
	CWK	A7,7	ORDER ' ? 
	ABL(E)	ADY500
	XIF
	IFT	WHATDY=0 
	LDK	A2,/12	INDICATE SWITCH TO ALPHA MODE 
	CF	A5,OUTPUT 
* 
	XIF
* 
ACDY02	EQU	*
	CWK	A7,5	ORDER 5 
	RF(E)	ACDY90	YES 
	SUK	A7,6	ORDER 6 ? 
	RF(E)	ACDY20	YES 
	SUK	A7,5	ORDER /B ?
	ABL(E)	ADY200	YES
	SUK	A7,/26	ORDER ERASE ? 
	ABL(E)	ADY160	YES
* 
DYERR	ABL	DISIOE	I/O REQUEST ERROR
	EJECT
*    ACTIONS SPECIFIED BY USER IN RIGHT BYTE IN BUFFER
*    ARE CARRIED OUT. 
*    /2B            NO MOVING OF PRINT HEAD 
*    /30            CR, LF, LF
*    /31            ERASE DISPLAY AND WRITE FROM HOME POSITION
*    OTHER VALUE    CR, LF
* 
ACDY20	EQU	*
	LD	A2,4,A8	GET REQUESTED LENGTH
	RF(E)	ACDY25 
	LDK	A3,2	START BUFFER INDEX
	LD	A2,2,A8	GET BUFFER ADDRESS
	LC	A2,1,A2	GET CONTROL CHARACTER 
	ANK	A2,/FF 
ACDY25	EQU	*
	SUK	A2,/2B	POSITIONING BEFORE WRITE ?
	RF(E)	ACDY90 
	SUK	A2,6	/31 ? 
	RF(E)	ACDY65 
	LDK	A4,1	INDICATE LINE FEED
	ADK	A2,1	DOUBLE LINE FEEED ? 
	RF(NE)	ACDY30
	ADK	A4,1	INDICATE DOUBLE LINE FEED 


ACDY30	LDK	A2,CR	CARRIAGE RETURN
ACDY35	LDK	A1,1 
	SC	A1,DWTAP+1,A6	RESET HEAD POSITION COUNTER 
*    SEND CARRIAGE RETURN AND ONE OR TWO LINE FEEDS 
* 
ACDY50	EQU	*
	CF	A5,OUTPUT	SEND CHARACTER
ACDY52	SUK	A4,1 
	RF(N)	ACDY90	START SECTION ENDED?
	LC	A1,DWTLIN,A6	LINES
	CC	A1,DWTAP,A6	LAST LINE ? 
	RF(L)	ACDY55 
	LDKL	A2,/100	INCREMENT LINE COUNTER
	ADS	A2,DWTAP,A6
ACDY55	LDK	A2,LF	LINE FEED TO SEND
	RB	ACDY50
ACDY65	LDK	A2,CLEHOM	CLEAR AND HOME 
	LDK	A1,1 
	SC	A1,DWTAP,A6	RESET LINE COUNTER
	RB	ACDY35
	EJECT
* 
*    GET, CHECK AND SEND CHARACTER
*    (IF ORDER 5 NO CHECK)
* 
ACDY70	EQU	*
	IFT	WHATDY=0 
	LDR*	A4,A6	GET CHANNEL PARAMETER 
	ANK	A4,/10 
	RF(NZ)	ACDY75	NOT 6344 OR 6386 
	XIF
	LD	A4,2,A8 
	ADR	A4,A3	GET ADDRESS TO NEXT CHAR IN BUFFER 
	CCR	A2,A4	CHAR EQU TO CURRENT? 
	ABL(E)	CHECK	YES!
ACDY75	EQU	*
	CF	A5,OUTPUT 
ACDY80	CF	A15,POSUPD	POSITION COUNTER UPDATING
	IFT	TRASPA=1 
	LD	A1,2,A8	GET BUFFER ADDRESS (BA) 
	LD	A2,4,A8	GET REQUESTED LENGTH(RL)
	ADR	A1,A2	GET ADD END OF BUFFER
SKIP05	CWK	A2,2 
	RF(NG)	SKIP30	RL < 3 
	SUK	A1,1	DECR. BA
	LCR	A4,A1	GET CHAR 
	CCK	A4,/2020	SPACE ? 
	RF(NE)	SKIP20	NO 
SKIP07	SUK	A2,1	DECR RL 
	RB	SKIP05	GET NEXT 
SKIP20	CWK	A2,4 
	RF(NG)	SKIP30	RL < 5 
	LC	A4,-2,A1	GET CHAR 
	CCK	A4,/1111	TABULATION CHAR ? 
	RF(NE)	SKIP25	NO!
	SUK	A1,2	DECR BA 
	SUK	A2,2	DECR RL 
	RB	SKIP07	GET NEXT 
SKIP25	LCR	A4,A1	GET CHARACTER AGAIN
	ANK	A4,/FF 
	SUK	A4,/12	UNDER LINE START? 
	RB(Z)	SKIP07	YES! SKIP IT! 
	SUK	A4,/C	LOW INT. START?
	RB(Z)	SKIP07	YES!
	SUK	A4,1	LOW INT. STOP?
	RB(Z)	SKIP07	YES!
* 
SKIP30	ST	A2,4,A8	STORE NEW RL
	XIF
ACDY90	LDK	A4,0 
ADY100	CF	A15,GETCHR	GET CHARACTER FROM ECB-BUFFER
	LDR	A1,A1	LAST CHARACTER?
	ABL(NP)	ADY405 
	SUK	A7,5	ORDER 5?
	RB(E)	ACDY75 
	ANK	A2,/7F 
	LDK	A1,5	SET TABLE POINTER 
	CC	A2,TABSPE,A1	FAST	OUTPUT? 
	RF(E)	ADY125 
	SUK	A1,1	NO! 
	LDR*	A7,A6	CHANNEL PARAMETER 
	ANK	A7,/30	GRAFIC DISPLAY ?
	RF(E)	ADY110	NO
	LDK	A1,5	SET TABLE PONTER
ADY110	CC	A2,TABSPE,A1	CHARACTER FOUND
	RF(NE)	ADY128
	CCK	A2,/1E1E	LOW INTENSITY ? 
	RF(NE)	ADY122	NO 
	LDK	A4,/80 
ADY120	ORRS	A4,A6	SET LOW INTENSITY MODE
	LDK	A4,0 
	RB	ACDY50
ADY122	CCK	A2,/1212	UNDERLINE ? 
	RF(NE)	ADY125
	LDK	A4,/40	SET UNDERLINE MODE
	RB	ADY120
ADY125	CCK	A2,/1414	FAST OUTPUT ? 
	LDK	A4,0 
	RB(NE)	ACDY50	NO 
	LDR	A4,A2
	CF	A15,GETCHR	GET OUTPUT CHARACTER 
	LDR	A1,A2
	LDR	A2,A4
	LD	A4,4,A8	REQ LENGTH
	SUR	A4,A3	NUMBER OF CHARS
	RF(Z)	ADY127	NONE
* 
	IFT	WHATDY=0 
	LDR*	A7,A6	GET CHANNEL PARAMETER 
	ANK	A7,/10 
	RF(NZ)	OTHER	OTHER DISPLAY THAN 6344 OR 6386?
	XIF
	LDR	A3,A1	NO!
	CF	A5,FASTER 
ADY127	EQU	*
	LD	A3,4,A8	REQ LENGTH
	ST	A3,6,A8	EFF LENGTH
	ABL	ADY405 
ADY128	EQU	*
	SUK	A1,1	GET NEXT
	RB(NN)	ADY110	NOT AT END 
	LDR	A1,A2	MOVE CHARACTER 
	SUK	A1,/11	TAB CHAR?  (11) 
	RF(E)	ADY140 
	SUK	A1,/F	LESS THAN /20 ?
	RF(N)	ADY130	CODE CHECK ERROR
	SUK	A1,/3F	GREATER THAN /5F
	RB(NP)	ACDY70
	IFT	LOWCHA=0 
	SUK	A2,/20	TRANSFORM CHARACTER BETWEEN /60 TO /7F
			TO CHARACTER BETWEEN /40 TO /5F
	XIF
	RB	ACDY70
* 
* 
	IFT	WHATDY=0 
OTHER	EQU	* 
************************
* A3 = INDEX
* A1 = CHARACTER
* A4 = NUMBER 
************************
	LC	A2,DWTBC,A6 
	AD	A2,DWTAP,A6	GET POSITION
	ANK	A2,/FF 
	ADR	A2,A4	ADD LENGTH OF REQUEST
	LD	A3,DWTPOS,A6	GET MAX-POS AND
	ANK	A3,/FF 
	ST	A4,10,A8	SAVE LENGTH
	SUR	A3,A2	COMPARE
	RF(NN)	OT030	LENGTH OK 
	ADR	A4,A3
	ST	A4,10,A8	SAVE LENGTH
	ADK	A4,1	ADJUST NUMBER OF OUTPUT CHARACTERS
OT030	EQU	* 
	LDR	A3,A1	SAVE CHARACTER TO SEND 
OT010	LDR	A2,A3 
	CF	A5,OUTPUT	SENT CHAR (IN A2) 
	SUK	A4,1	DECREMENT COUNTER 
	RB(P)	OT010
	LD	A4,10,A8	GET ACT. LENGTH
OT040	LDK	A2,BACKSP 
	CF	A5,OUTPUT	SENDBACKSPACE 
	SUK	A4,1	DECREMENT LENGTH
	RB(P)	OT040
	RB	ADY127
	XIF
	EJECT
* 
*    CODE CHECK ERROR 
* 
ADY130	EQU	*
	LDK	A1,CCERR 
	ORS	A1,8,A8	RETURN CODE
	RB	ADY100
	EJECT
* 
*    TABULATION 
* 
ADY140	EQU	*
	CF	A15,GETCHR	GET FIRST ASCII CHARACTER
	LDR	A4,A2
	CF	A15,GETCHR	GET SECOND ASCII CHARACTER 
	ANK	A2,/F
	ANK	A4,/F
	RF(E)	ADY144 
ADY143	ADK	A2,/A	FROM DECIMAL TO HEXADECIMAL
	SUK	A4,1 
	RB(NE)	ADY143
ADY144	LC	A4,DWTAP+1,A6 
	SUR	A2,A4	SUBTRACT HEAD POSITION POINTER 
	LC	A4,DWTBC,A6 
	SUR	A2,A4	AND REQUESTS POSITION COUNTER
			TO GET NUMBER OF SPACES TO SEND
	RB(NP)	ADY100
	LDR	A4,A2
ADY145	LDK	A2,CURRIG	CURSOR RIGHT 
ADY146	CF	A5,OUTPUT 
	CF	A15,POSUPD	POSITION COUNTER UPDATING
	SUK	A4,1	READY ? 
	RB(NE)	ADY145	NO 
	ABL	ADY100 
	EJECT
* 
*    ERASE  ORDER /31 
* 
ADY160	LD	A4,10,A8	GET NUMBER OF CHAR TO ERASE
	IFT	WHATDY=0 
	LDR*	A1,A6	CHANNEL PARAMETER 
	ANK	A1,/10	GRAFIC DISPLAY? 
	RF(NE)	ADY166	YES	=2 
	XIF
	CF	A5,ERA	GET LENGTH TO ERASE	=2 
	LDK	A3,/20 
	CF	A5,FASTER	FAST OUTPUT 
ADY165	LDK	A2,ETB 
	CF	A5,OUTPUT 
	ABL	ADY410	END OF REQUEST
	IFT	WHATDY=0 
ADY166	EQU	*	YES	=2 
	CF	A5,ERA	GET LENGTH TO ERASE	=2 
* 
ADY170	SUK	A4,1	DECR NO OF CHAR 
	RF(N)	ADY180	ERASE READY 
	LDK	A2,/20	SPACE 
	CF	A5,OUTPUT	SEND IT 
	RB	ADY170
ADY180	LD	A4,10,A8
	CF	A5,ERA	GET LENGTH TO ERASE	=2 
	LDR	A3,A3	OVER EDGE	=4 
	RF(NN)	ADY186	NO	=4
	SUK	A4,1	ADJUST LENGTH	=4
ADY186	EQU	*
	SUK	A4,1	DECREMENT	=2
	RB(N)	ADY165	CURSOR IN ORIGIN POSITION 
	LDK	A2,BACKSP	CURSOR LEFT
	CF	A5,OUTPUT	SEND IT 
	RB	ADY186	AGAIN
	XIF
	EJECT
* 
*    ORDER /B CURSOR POSITIONING PART 
* 
ADY200	EQU	*
* 
	IFT	WHATDY=0 
	LDR*	A1,A6	CHANNEL PARAMETER 
	ANK	A1,/10	GRAFIC DISPLAY? 
	RF(NE)	ADY205	YES
*    IF VIDEO (6344) SET CURSOR ADDRESS DIRECT
	XIF
	LD	A4,10,A8	GET REQUESTED CURSOR POS 
	ST	A4,DWTAP,A6	UPDATE LINE & POS COUNTER 
	CF	A5,CURPOS	SET CURSOR
	RF	ADY380
	IFT	WHATDY=0 
*    GET LINE 
ADY205	LC	A4,10,A8	GET REQUESTED LINE 
	CC	A4,DWTLIN,A6	OUTSIDE SCREEN?
	RF(NG)	ADY207	NO!
	LC	A4,DWTLIN,A6	YES! SET CURSOR AT END OF LINE 
ADY207	EQU	*
	LC	A3,DWTAP,A6	GET ACTUAL LINE 
ADY210	CWR	A4,A3
	RF(N)	ADY250	REQUESTED LINE ABOVE ACTUAL 
	RF(E)	ADY300	SAME LINE 
	LDK	A2,LF	LINE FEED
	ADK	A3,1	INCREMENT ACTUAL LINE NUMBER
ADY230	CF	A5,OUTPUT	SEND
	LDR	A4,A4	REQUESTED LINE 
	RB(NZ)	ADY210	NOT EQUAL ZERO 
	LDK	A4,1 
	RF	ADY300
ADY250	LDK	A2,HOME	HOME 
	LDK	A3,1	RESET ACTUAL LINE NUMBER
	ST	A3,DWTAP,A6	RESET POSITION
	RB	ADY230
* 
*    GET POSITION 
* 
ADY300	SC	A4,DWTAP,A6	UPDATE HEAD LINE COUNTER
	LC	A4,11,A8	GET REQUESTED POSITION 
	CC	A4,DWTPOS,A6	OUTSIDE SCREEN?
	RF(NG)	ADY303	NO!
	LC	A4,DWTPOS,A6	SET LAST LINE
ADY303	EQU	*
	CWK	A4,1	FIRST POSITION ?
	RF(NE)	ADY305	NO 
	CWR	A4,A3	FIRST LINE ? 
	RF(NE)	ADY305	NO 
	LDK	A2,HOME	CURSOR GO HOME 
	RF	ADY330
ADY305	RF(NL)	ADY307	REQ. POS NOT ZERO
	LDK	A4,1 
ADY307	LC	A3,DWTAP+1,A6	GET ACTUAL POSITION 
	CC	A3,DWTPOS,A6	MAX-POS? 
	RF(NG)	ADY310	NO!
	SUK	A3,1 
ADY310	CWR	A4,A3	FORWARDS OR BACKWARDS
	RF(E)	ADY370	POSITION FOUND
	RF(N)	ADY340	BACK
	LDK	A2,CURRIG	CURSOR RIGHT 
	ADK	A3,1	UPDATE POSITION COUNTER 
ADY330	CF	A5,OUTPUT	SEND
	RB	ADY310
ADY340	SUR	A3,A4	ACTUAL POS. - WANTED POS.
	CWR	A3,A4	COMPARE BACKSTEPS WITH CR-WAY
	RF(L)	ADY345	BACKSPACE WAY 
	LDK	A2,CR	CARRIAGE RETURN
	LDK	A3,1	INDICATE FIRST POSITION 
	RB	ADY330
ADY345	LDK	A2,BACKSP	BACKSPACE
	CF	A5,OUTPUT	SEND
	SUK	A3,1	LAST BACKSPACE ?
	RB(NE)	ADY345
ADY370	SC	A4,DWTAP+1,A6	UPDATE HEAD POSITION POINTER
	XIF
ADY380	LDK	A3,2	START BUFFER INDEX
	ABL	ACDY90 
	IFT	WHATDY=0 
* 
ADY400	LDK	A2,/22	START CHARACTER 
	CF	A5,OUTPUT 
* 
	XIF
* 
	EJECT
* 
* 
*    SEND LAST DUMMY, SET CURSOR POSITION IN CONTROL
*    WORD, LOAD A1 WITH RETURN CODE AND END I/0.
* 
ADY405	EQU	*
	LDR*	A1,A6	GET CHANNEL PARAMETER 
	ANK	A1,/30	6344 ?
	RF(NE)	ADY407	NO 
	LDR*	A1,A6 
	LDR	A4,A1
	ANK	A1,/40	UNDERLINE MODE ?
	RF(E)	ADY406	NO
	LDK	A2,ULSTOP	UNDERLINE STOP 
	CF	A5,OUTPUT 
ADY406	ANK	A4,/80	LOW INTENSITY MODE ?
	RF(E)	ADY407 
	LDK	A2,LISTOP	LOW INTENSITY STOP 
	CF	A5,OUTPUT 
ADY407	EQU	*
	LDK	A2,ETB	END OF TEXT MESSAGE 
	CF	A5,OUTPUT	SEND CHARACTER
	CF	A15,UPDAPP	UPDATE HEAD POSITION COUNTER 
ADY410	LDK	A2,ETX	LAST DUMMY
	CF	A5,OUTPUT	SEND DUMMY
	SUK	A7,/31		=7 
	RF(Z)	ADY415	ORDER ERASE	=7
	LD	A4,DWTAP,A6	GET CURSOR POSITION	=4
	ST	A4,10,A8	SAVE CURSOR POS. IN ECB	=4 
ADY415	EQU	*
	ADK	A7,/31-5		=7 
	RF(NE)	ADY420	NOT ORDER BASIC WRITE
	LDKL	A4,/101	HOME POSITION 
	ST	A4,DWTAP,A6 
ADY420	EQU	*
ENDIO	CF	A15,TENDIO	END I/O 
EXIT	ABL	TDISP	GO TO DISPATCHER 
* 
	IFT	GRAFIC=1 
* 
	EJECT
* 
*    GRAPHIC PART 
* 
ADY500	EQU	*
	LDK	A2,/11 
	CF	A5,OUTPUT	SWITCH TO GRAFIC MODE 
ADY510	CF	A15,GETCHR	GET CHARACTER
	LDR	A1,A1	BUFFER EMPTY 
	RB(E)	ADY400 
	LDR	A4,A2
	CF	A15,GETCHR	GET NEXT CHARACTER 
	LDR	A1,A4
	ANK	A4,/80	ADDRESS OR DATA 
	RF(E)	ADY530	DATA MESSAGE
* 
*    ADDRESS MESSAGE
* 
*    SET FIRST OUT PUT IN A2
*    AND SECOND IN A4 
* 
	SLL	A1,4 
	LDR	A4,A2
	SRL	A4,4 
	ORR	A4,A1
	ANK	A2,/F
	ANK	A4,/7F 
	ORK	A2,/20 
ADY515	CF	A5,OUTPUT	SEND FIRST CHARACTER
	LDR	A2,A4	GET SECOND CHARACTER 
	CF	A5,OUTPUT	SEND SECOND CHARACTER 
	RB	ADY510
	EJECT
* 
*    DATA MESSAGE 
* 
*    FIRST OUTPUT IS SET IN A2
*    AND SECOND IN A4 
* 
ADY530	SLL	A1,13
	LDR	A4,A2
	SLL	A2,5 
	ORR	A1,A2
	LDK	A7,10
	LDK	A2,0 
ADY540	SLL	A1,1 
	RF(NN)	ADY550
	ORKL	A2,/200 
ADY550	SUK	A7,1 
	RF(E)	ADY560 
	SRL	A2,1 
	RB	ADY540
ADY560	LDR	A4,A2
	SRL	A4,4 
	ANK	A4,/3F 
	ANK	A2,/F
	ORK	A2,/60 
	RB	ADY515
* 
	XIF
* 
	EJECT
* 
*    UPDAPP = SUBROUTINE TO UPDATE HEAD 
*             POSITION POINTER WHEN END 
*             OF REQUEST IS REACHED 
UPDAPP	EQU	*
	LC	A3,DWTBC,A6	GET POSITION COUNTER
	ADS	A3,DWTAP,A6	UPDATE HEAD POSITION POINTER 
	LDK	A3,0 
	SC	A3,DWTBC,A6	RESET  POSITION COUNTER 
	RTN	A15
* 
*    POSUPD = SUBROUTINE TO UPDATE ACTUAL POSITION
*             POINTER WHEN REQUEST RUNNING. 
*             A CHECK THAT POINTER NOT EXCEEDS 80 IS DONE 
* 
POSUPD	EQU	*
	LC	A2,DWTBC,A6	GET POSITION POINTER
	ANK	A2,/FF 
	AD	A2,DWTAP,A6	INCLUDE HEAD POSITION POINTER 
	ANK	A2,/FF 
	CC	A2,DWTPOS,A6	END OF ROW ? 
	RF(P)	POSU10 
	IM	DWTST,A6	INCREMENT POSITION COUNTER 
POSU10	RTN	A15
	EJECT
* 
*    I H D Y
* 
*    INTERRUPT
* 
IHDY	EQU	*
	LD	A4,DWTST,A6	BUSY? 
	RB(N)	EXIT	NO
	SLL	A4,2	ECHO MODE ? 
	RF(N)	IHDY10 
	LDR	A1,A1	RETURN CODE FROM CHANNEL UNIT ?
	RB(NE)	ADY420	YES
IHDY10	ABL	LDREG	RELOAD A3-A5 AND RETURN VIA A5 
	EJECT
* 
*    R C D Y
* 
*    RCDY = RECOVERY ROUTINE DISPLAY
* 
* 
*    RECOVERY IS CARRIED OUT ONLY IF
*    ORDER 6 IS RUNNING 
* 
*    AT ENTRY:
* 
*    A6 = DWT-ADDRESS 
*    A7 = ORDER 
*    A8 = ECB-ADDRESS 
RCDY	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
* 
				=3
	LDKL	A2,/7FFF
	ANS	A2,DWTST,A6	SET BUSY 
				=1
				=1
				=1
				=1
				=1
				=1
				=1
				=1
* 
	IFT	WHATDY=0 
* 
	LDR*	A2,A6	CHANNEL PARAMETER 
	ANK	A2,/10	GRAPHIC DISPLAY ? 
	RF(E)	RCDY10	NO
	LDK	A2,RETURN	RETURN TO ALPHANUMERIC MODE
	CF	A5,OUTPUT 
* 
	XIF
* 
	EJECT
RCDY10	EQU	*
	LDK	A2,/00	DUMMY TO SEND 
	CF	A5,OUTPUT 
	LDR	A4,A4	LRC-ERROR IN BLOCK ? 
	RF(NE)	RCDY20
	IFT	WHATDY=0		=1 
	IFF	STEADY+COUNTRY=0		=1 
	LDR*	A2,A6	GET CHANNEL PARAMETERS	=1 
	ANK	A2,/20	PTS 6385/6386 ?	=1
	RF(Z)	RCDY14	NO	=3 
	LDK	A3,100	SET UP TRANSFER COUNTER	=3
RCDY12	LDK	A2,STILL-1	SET UP CURSOR BLINKING	=3 
	ADK	A2,STEADY	ADJUST TO STEADY IF SO	=3
	CF	A5,OUTPUT	SEND CURSOR INF	=3
	SUK	A3,1	DEC TRANSFER COUNTER	=3 
	RB(P)	RCDY12	NOT ENOUGH OF TRANSFERS	=3
	LDK	A2,CTYCOD	SEND 'SET COUNTRY CODE'	=1 
	CF	A5,OUTPUT		=1 
	LDK	A2,COUNTRY	SEND 'COUNTRY CODE'	=1
	ORK	A2,/30		=1 
	CF	A5,OUTPUT		=1 
				=3
				=3
RCDY14	EQU	*		=3
	XIF			=1 
	LD	A3,DWTST,A6	SAVE STATUS WORD	=3 
	LDK	A2,CLEHOM	CLEAR AND HOME 
	CF	A5,OUTPUT	SEND
	LDKL	A2,/101 
	ST	A2,DWTAP,A6	SET HEAD LINE-AND-POSITION COUNTER
	LDR	A3,A3	GET OLD STATUS 
	RB(N)	ENDIO	NOT BUSY 
	LDK	A1,OPERR	SET RETURN CODE 
RCDY15	ABL	ADY420 
	EJECT
* 
*    LRC-ERROR IN BLOCK SENT REMOTE 
* 
RCDY20	EQU	*
	SUK	A7,5	ORDER 5 ? 
	RF(NE)	RCDY25	NO 
	LDK	A1,2	INDICATE THROUGHPUT ERROR 
	RB	RCDY15
RCDY25	LDK	A2,STX	START OF MESSAGE
	CF	A5,OUTPUT 
	LC	A4,DWTBC,A6	GET NUMBER OF POSITIONS TO BACK 
	ANK	A4,/FF 
	RF(E)	RCDY30 
	CF	A5,BACCAN	SEND BACKSPACES AND RUB OUT 
	LDK	A3,2	START BUFFER INDEX
RCDY30	ABL	ACDY90 
	EJECT
* 
*    E C H O D Y
* 
*    ECHODY = DEVICE-DEPENDENT ECHO-ROUTINE 
* 
ECHODY	EQU	*
	LDR	A7,A7	EOR? 
	RF(N)	ECDY17	YES 
	LDR	A3,A2	SAVE CHARACTER 
* 
	IFT	EORECH=0 
* 
	SUK	A2,/80 
	RF(NN)	ECDY20	NOT TO BE ECHOED 
	ADK	A2,/80 
* 
	XIF
* 
	SUK	A3,/8
	RF(E)	ECDY40	BACKSPACE 
	SUK	A3,/10 
	RF(E)	ECDY50	CLEAR 
ECDY10	CF	A5,OUTPUT	SEND CHARACTER
	CF	A15,POSUPD	POSITION COUNTER UPDATING
	RF	ECDY20
ECDY17	CF	A15,UPDAPP	UPDATE HEAD CURSOR POINTER 
ECDY20	ABL	ECHRTN	RETURN TO KEYBOARD
* 
*    BACKSPACE
* 
ECDY40	EQU	*
	LC	A4,DWTBC,A6	GET POSITION COUNTER
	ANK	A4,/FF 
	RB(E)	ECDY20	FIRST POSITION
	LDK	A4,1	INDICATE ONE BACKSTEP 
	CF	A5,BACCAN	BACK
	RB	ECDY20
	EJECT
* 
*    CLEAR
* 
ECDY50	EQU	*
	LC	A4,DWTBC,A6	GET POSITION COUNTER
	ANK	A4,/FF 
	RB(E)	ECDY20	FIRST POSITION
	IFT	WHATDY=0 
	LDR*	A1,A6	GET CHANNEL PARAMETER 
	ANK	A1,/10	GRAFIC DISPLAY
	RF(E)	ECDY60	N 
	CF	A5,BACCAN	BACK
	RB	ECDY20
	XIF
ECDY60	LDR	A3,A4	SAVE POSITION COUNTER
	LD	A4,DWTAP,A6	GET HEAD LINE-AND-POSITION COUNTER
	CF	A5,CURPOS	SET CURSOR
	LDR	A4,A3	GET POS COUNTER
	ADK	A4,1	UPDATE POS COUNTER
	LDK	A3,/20 
	CF	A5,FASTER	FAST OUTPUT 
	LDK	A2,0 
	SC	A2,DWTBC,A6	RESET POSITION COUNTER
	RB	ECDY20
	EJECT
* 
* 
*    BACCAN = SUBROUTINE TO POSITION CURSOR 
*             AT THE PLACE BEFORE REQUEST IF
*             CLEAR OR BACKWARDS ONE STEP IF
*             BACKSPACE.
* 
BACCAN	EQU	*
	LDR	A3,A4
	LC	A2,DWTBC,A6	GET POSITION COUNTER
	ANK	A2,/FF 
	AD	A2,DWTAP,A6	ADD HEAD POSITION COUNTER 
	ANK	A2,/FF 
	CC	A2,DWTPOS,A6	LAST POSITION
	RF(NP)	BACA10	NO 
	LDK	A2,SPACE	DESTRUCTIVE SPACE 
	RF	BACA20
BACA10	LDK	A2,BACKSP	BACKSPACE
	CF	A5,OUTPUT	SEND
	LDK	A2,SPACE	DESTRUCTIVE SPACE 
	CF	A5,OUTPUT	SEND
	LDK	A2,BACKSP	BACKSPACE
BACA20	CF	A5,OUTPUT	SEND
	SUK	A4,1 
	RB(NE)	BACA10
	NGR	A3,A3	NEGATE REGISTER
	ADS	A3,DWTST,A6	UPDATE POSITION COUNTER
	RTN	A5 
	EJECT
*********************************************** 
*   CHECK = SUBROUTIN TO CHECK USER BUFFER IN * 
*           ORDER TO GET A REASON FOR USING   * 
*           'FAST OUTPUT FACILITY' ON 6344    * 
*            AND 6386                          *
*********************************************** 
CHECK	EQU	* 
* 
* 
	LD	A1,4,A8 
	SUR	A1,A3	END OF BUFFER? 
	ABL(NP)	ACDY75	YES!
	LDR	A7,A2	SAVE CHER TO SEND (AND CHECK)
	LDR	A2,A4	SAVE BUFFER ADDRESS+INDEX
	LDK	A4,1	RESET COUNTER 
NEXT	ADK	A4,1	INCREMENT COUNTER 
	SUK	A1,1	END OF BUFFER?
	RF(NP)	OUT	YES!
	ADK	A2,1	INCREMENT POINTER 
	CCR	A7,A2	CHAR EQU TO PREVIUS? 
	RB(E)	NEXT	YES!
OUT	EQU	* 
	CWK	A4,EQU	CONDITION FOR FAST OUTPUT FULLFILLED? 
	RF(L)	NOFAST	NO! 
**********************************
* UPDATE ACTUAL POSITION POINTER *
FASTOK	LC	A2,DWTBC,A6	GET HEAD POSITION 
	AD	A2,DWTAP,A6 
	ANK	A2,/FF 
	ADR	A3,A4	UPDATE BUFFER-INDEX
	ST	A3,DWTBIN,A6	SAVE INDEX 
	LC	A3,DWTPOS,A6	GET MAXNUMBER OF CHAR/LINE 
	SUR	A3,A2	AND COMPARE
	SUR	A3,A4
	RF(NN)	HIT 
	ADR	A4,A3
	ADK	A4,1 
HIT	ADS	A4,DWTST,A6	UPDATE POSITION 
*********************** 
* EXECUTE FAST OUTPUT * 
	LDR	A3,A7	GET CHAR TO SEND 
	CF	A5,FASTER 
**************
* SET CURSOR *
	LD	A4,DWTST,A6	GET ACTUAL POS
	ANK	A4,/FF 
	AD	A4,DWTAP,A6	INC HEAD POS POINTER
	CF	A5,CURPOS 
***************************** 
* RESTORE A3 (BUFFER INDEX) * 
	LD	A3,DWTBIN,A6	RESTORE BUFFER INDEX 
	SUK	A3,1 
	ABL	ACDY90	READ NEXT CHAR
* 
NOFAST	LDR	A2,A7	RESTORE OUTPUT CHARACTER 
	ABL	ACDY75 
	EJECT
* 
* 
*    FASTER = SUBROUTINE TO OUTPUT SPACE AT FAST OUTPUT 
*             AT ENTRY A4 = NUMBER OF CHARACTERS
* 
FASTER	EQU	*
	CWK	A4,/60 
	RF(L)	FAS010	NUMBER OF CHAR NOT TOO LONG 
	LDK	A4,/59 
FAS010	EQU	*
	ADK	A4,/20	ADD CONSTANT
	LDK	A2,FASTO	FAST OUTPUT 
	CF	A5,OUTPUT	SEND
	LDR	A2,A4	NO OF CHAR 
	CF	A5,OUTPUT	SEND
	LDR	A2,A3
	CF	A5,OUTPUT	SEND
	RTN	A5 
	EJECT
* 
* 
*    CURPOS = SUBROUTINE TO SET CURSOR
*             AT ENTRY A4 = CURSOR POS (POSITION AND LINE)
* 
CURPOS	EQU	*
	ADKL	A4,/1F1F	CONVERT
	LDK	A2,SCADD	SET CURSOR
	CF	A5,OUTPUT	SEND
	ECR	A2,A4	POS. X < /80?
	LDR	A2,A2
	RF(NN)	CURR05	YES! 
	LCK	A4,/7F00 
CURR05	EQU	*
	LDR	A2,A4
	CF	A5,OUTPUT	OUTPUT POSITION (X) 
	LDR	A2,A4
	RF(NN)	CURR10	Y < /80! 
	LDK	A2,/7F 
	RF	CURR15
CURR10	EQU	*
	SRL	A2,8	SHIFT RIGHT 
CURR15	EQU	*
	CF	A5,OUTPUT	OUTPUT LINE(Y)
	RTN	A5 
	EJECT
*			=2
*			=2
*			=2
*	  ERA - SUBROUTINE TO AVOID UNNECESSARY OUTPUT		=2
*			=2
*			=2
*	AT ENTRY A4 = CHAR TO ERASE FROM USER		=2 
*	AT EXIT  A4 = CHAR TO END OF SCREEN		=2 
*			=2
ERA	EQU	*		=2 
	LD	A2,DWTPOS,A6	MAX CHAR.	=2 
	ANK	A2,/FF	GET MAX CHAR.	=2
	LC	A3,DWTAP+1,A6	CURRENT POS. ON SCREEN	=2 
	ANK	A3,/FF		=2 
	SUR	A2,A3	NUMBER OF CHAR. TO END OF SCREEN	=2
	ADK	A2,1	ADJUST LENGTH 	=2 
	CWR	A4,A2	OUTSIDE SCREEN	=2
	RF(L)	ERAEND	NO	=2 
	LDR	A4,A2	OUTSIDE SCREEN MODIFY LENGTH	=2
	LDKL	A3,/FFFF	SET OVER	=4
ERAEND	EQU	*	END SUBROUTINE	=2
	RTN	A5	RETURN	=2 
ABDY	EQU	*
	CF	A15,UPDAPP	UPDATE CURSOR POSITION	=5
	RTN	A15	RETURN TO ABORT ROUTINE	=5 
	END

Full view