DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC850

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC850

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦0d1fe5534⟧ RcTekst

    Length: 26240 (0x6680)
    Types: RcTekst
    Names: »43G12264.WP«

Derivation

└─⟦975e936c7⟧ Bits:30005865 Manualer - tekstfiler 43-GL afdelingen
    └─⟦this⟧ »43G12264.WP« 

RcTekst


╱04002d4e0a0005000000000201503100000000000000000000000000000000000000000000000000091119212931394149515961697179ff04╱

════════════════════════════════════════════════════════════════════════
↓
↲
┆14┆┆b3┆┆06┆PAGE ┆0b┆↲
↲
╞	.RDXO╞	16↲
↲
;╞	╞	╞	╞	RCSL: 43-GL12264↲
;╞	╞	╞	╞	AUTHOR: KNEH/KDH/FRS↲
;╞	╞	╞	╞	EDITED: 1984.04.04↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
;╞	PROGRAM LISTING↲
;╞	RC800-20 CONCENTRATOR FOR RC3600 SYSTEMS↲
;╞	REV3↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
↲
;KEYWORDS:╞	 RC800-20,PROGRAM LISTING,REV3.↲
;----------------------------------------------------------↲
;ABSTRACT:╞	 THIS PAPER CONTAINS THE LISTING↲
;╞	╞	 OF THE PROGRAM FOR THE MICROPROCESSOR↲
;╞	╞	 8085, IN RC800-20.↲
↲
↲
; SOURCE TAPE:   RCSL 43-GL12263↲
; PROM NO.: ROC 102↲
; OLD PROM ROB 271↲

════════════════════════════════════════════════════════════════════════
RDX╞	8╞	;↲
↲
ERR=33000╞	╞	; ERROR ADDRESS.↲
↲
╞	╞	╞	; ****╞	DEVICE ADDRESS MAP:↲
╞	╞	╞	;╞	+0):╞	READ/WRITE DATA;↲
╞	╞	╞	;╞	+1):╞	STATUS READ,SYNC(NOT USED) WRITE;↲
╞	╞	╞	;╞	+2):╞	READ/WRITE MODE REG 1,2;↲
╞	╞	╞	;╞	+3):╞	READ/WRITE COMMAND REG;↲
↲
HOST=33400╞	╞	; HOST UART ADDRESS.↲
TERM1=HOST+4╞	╞	; TERMINAL1 UART ADDRESS.↲
TERM2=TERM1+4╞	╞	; TERMINAL2 UART ADDRESS.↲
TERM3=TERM2+4╞	╞	; TERMINAL3 UART ADDRESS.↲
PRINT=TERM3+4╞	╞	; PRINTER UART ADDRESS.↲
↲
↲
╞	.LOC╞	30000╞	; *** RAM LAYOUT FOR RC800/20:↲
↲
B1XINP:╞	.BLK╞	2╞	; INPUT-OUTPUT POINTERS↲
B1XOUTP:.BLK 2╞	╞	; TERMINAL1 XMT.↲
B1RINP:╞	.BLK╞	2╞	; INPUT-OUTPUT POINTERS↲
B1ROUTP:.BLK╞	2╞	; TERMINAL1 RECEIVE.↲
B2XINP:╞	.BLK╞	2╞	; INPUT-OUTPUT POINTERS↲
B2XOUTP:.BLK╞	2╞	; TERMINAL2 XMT.↲
B2RINP:╞	.BLK╞	2╞	; INPUT-OUTPUT POINTERS↲
B2ROUTP:.BLK╞	2╞	; TERMINAL 2 RECEIVE.↲
B3XINP:╞	.BLK╞	2╞	; INPUT-OUTPUT POINTERS↲
B3XOUTP:.BLK╞	2╞	; TERMINAL3 XMT.↲
B3RINP:╞	.BLK╞	2╞	; INPUT-OUTPUT POINTERS↲
B3ROUTP:.BLK╞	2╞	; TERMINAL3 RECEIVE.↲
B4XINP:╞	.BLK╞	2╞	; INPUT-OUTPUT POINTERS↲
B4XOUTP:.BLK╞	2╞	; PRINTER FIFO.↲
B4RINP:╞	.BLK╞	2╞	; PRINTER TO HOST MESSAGE↲
B4ROUTP:.BLK╞	2↲
↲
STAB1:╞	0╞	╞	; STATUS BUFFERS:↲
STAB2:╞	0╞	╞	;╞	STATUS BYTES ACCORDING TO 'STATAB';↲
STAB3:╞	0↲
STABP:╞	0↲
STABH:╞	0╞	╞	;@@ UNUSED;↲
↲
STAF1:╞	0╞	╞	; STATUS REQUEST FLAGS:↲
STAF2:╞	0╞	╞	;  <>0:╞	STATUS REQUEST PENDING NOT YET↲
STAF3:╞	0╞	╞	;╞	TRANSFERRED INTO HOST ;╞	╞	↲
STAFP:╞	0↲
STAFH:╞	0╞	╞	;@@ UNUSED;↲

════════════════════════════════════════════════════════════════════════
↲
BUFEM:╞	.BLK╞	16↲
MODE1:╞	0╞	╞	; TERMINAL MODES:↲
MODE2:╞	0╞	╞	;╞	CONTROL = 0, SKIP = 1 AND DATA = 3;↲
MODE3:╞	0↲
↲
↲
MODEX:╞	0╞	╞	; HOST XMT STATE.↲
MODER:╞	0╞	╞	;@@ UNUSED HOST REC STATE.↲
;TEM1:╞	0╞	╞	; TEMPORARY SAVE.↲
;TEM2:╞	0↲
DEVNO:╞	0↲
TEMPS:╞	0╞	╞	; TEMP SAVE TERM UART STATUS READ↲
TEMPD:╞	0╞	╞	; TEMP SAVE TERM UART BYTE READ↲
;LASTAT:╞	0↲
CURSTAT:0↲
LXMT:╞	0↲
HOSTS:╞	0↲
LREC:╞	0↲
↲
PSUM:╞	0╞	╞	; PRINTER CHECKSUM↲
╞	╞	╞	; ACCUMULATOR.↲
GRDY:╞	0╞	╞	; =0 ENABLE AUTOMATIC↲
╞	╞	╞	; XMIT OF PRINT BUF BUSY.↲
╞	↲
B1XSTART:╞	.BLK╞	100↲
B1RSTART:╞	.BLK╞	40↲
B2XSTART:╞	.BLK╞	100↲
B2RSTART:╞	.BLK╞	40↲
B3XSTART:╞	.BLK╞	100↲
B3RSTART:╞	.BLK╞	40↲
B4XSTART:╞	.BLK╞	200↲
B4RSTART:╞	.BLK╞	40↲
B5XSTART:╞	.BLK╞	40╞	; PSEUDO-BUFFER;↲

════════════════════════════════════════════════════════════════════════
LOC╞	4000↲
↲
; TABLE FOR MODE AND COMMANDS TO COMMUNICATION UARTS. ↲
╞	╞	╞	; ****╞	DEVICE PARAM TABLE:↲
↲
MTAB:╞	172╞	╞	; MODE1 HOST.↲
╞	60╞	╞	; MODE2 HOST.↲
╞	47╞	╞	; COMMAND HOST.↲
╞	172╞	╞	; MODE1 TERMINAL1↲
╞	60╞	╞	; MODE2 TERMINAL1↲
╞	47╞	╞	; COMMAND TERMINAL1.↲
╞	172╞	╞	; MODE1 TERMINAL2.↲
╞	60╞	╞	; MODE2 TERMINAL2.↲
╞	47╞	╞	; COMMAND TERMINAL2.↲
╞	172╞	╞	; MODE1 TERMINAL3↲
╞	60╞	╞	; MODE2 TERMINAL3.↲
╞	47╞	╞	; COMMAND TERMINAL3.↲
╞	172╞	╞	; MODE1 PRINT.↲
╞	60╞	╞	; MODE2 PRINT.↲
╞	43╞	╞	; COMMAND PRINT.↲
↲
╞	╞	╞	; ****╞	NB: COMMAND SHOULD INCLUDE THE ERROR↲
╞	╞	╞	;╞	╞	RESET BIT SET (B4),AS THIS BIT↲
╞	╞	╞	;╞	╞	IS AUTOMATICALLY RESET BY UART AFTER↲
╞	╞	╞	;╞	╞	RESET OF ERROR FLAGS IS PERFORMED;↲
↲
; ****╞	DECOMPOSITION OF MODE1,2 AND COMMAND:↲
↲
;╞	MODE1 (172):╞	1 STOP BIT,EVEN PARITY,PARITY ENABLE,7 BITS,↲
;╞	╞	╞	ASYNCR,RATE*16;↲
;╞	VAR:╞	1 STOP BIT MAY BE CHANGED TO 2 STOP BITS BY SWITCH SELECT;↲
;╞	MODE2 (60):╞	EXT XMIT/REC CLOCK + BAUDRATE UNDEF(50);↲
;╞	VAR:╞	BAUD RATE IS OWERWRITTEN BY SWITCH SELECT;↲
;╞	COMMAND (47):╞	FORCE RTS HIGH, NO ERROR RESET, NO FORCE BREAK,↲
;╞	╞	╞	REC ENABLE, DTR HIGH,XMIT ENABLE;↲
;╞	VAR:╞	IF ERROR IS DETECTED ON TERM LINE THEN EROR RESET AND REC,↲
;╞	╞	XMIT DISABLE IS PERFORMED.HEREAFTER NORMAL INIT;(NEW)↲
;╞	╞	AFTER ERROR ON HOST LINE THE TERM LINES ARE GIVEN ERROR ↲
;╞	╞	RESET. WHILE HOST ERROR DTR OF TERM LINES IS FORCED LOW;↲
↲
↲
↲
↲
; JUMP TABLE TO INITIALIZATION AND INTERRUPT ROUTINES.↲
↲
XINIT:╞	JMP╞	STINIT↲
XIREC:╞	JMP╞	IREC↲
XIMIT:╞	JMP╞	IXMT↲

════════════════════════════════════════════════════════════════════════
↲
; TABLE CONTAINING START ADDRESSES FOR↲
; BUFFERS.↲
↲
BUFSTAB:╞	B1XSTART&(377)↲
╞	╞	B1XSTART&(177400)/400↲
╞	╞	B1RSTART&(377)↲
╞	╞	B1RSTART&(177400)/400↲
╞	╞	B2XSTART&(377)↲
╞	╞	B2XSTART&(177400)/400↲
╞	╞	B2RSTART&(377)↲
╞	╞	B2RSTART&(177400)/400↲
╞	╞	B3XSTART&(377)↲
╞	╞	B3XSTART&(177400)/400↲
╞	╞	B3RSTART&(377)↲
╞	╞	B3RSTART&(177400)/400↲
╞	╞	B4XSTART&(377)↲
╞	╞	B4XSTART&(177400)/400↲
╞	╞	B4RSTART&(377)↲
╞	╞	B4RSTART&(177400)/400↲
↲
; TABLE CONTAINING TOP ADDRESSES FOR↲
; BUFFERS.↲
↲
BUFTTAB:╞	(B1RSTART-1)&(377)↲
╞	╞	(B1RSTART-1)&(177400)/400↲
╞	╞	(B2XSTART-1)&(377)↲
╞	╞	(B2XSTART-1)&(177400)/400↲
╞	╞	(B2RSTART-1)&(377)↲
╞	╞	(B2RSTART-1)&(177400)/400↲
╞	╞	(B3XSTART-1)&(377)↲
╞	╞	(B3XSTART-1)&(177400)/400↲
╞	╞	(B3RSTART-1)&(377)↲
╞	╞	(B3RSTART-1)&(177400)/400↲
╞	╞	(B4XSTART-1)&(377)↲
╞	╞	(B4XSTART-1)&(177400)/400↲
╞	╞	(B4RSTART-1)&(377)↲
╞	╞	(B4RSTART-1)&(177400)/400↲
╞	╞	(B5XSTART-1)&(377)↲
╞	╞	(B5XSTART-1)&(177400)/400↲

════════════════════════════════════════════════════════════════════════
↲
↲
; CONVERSION TABLE FOR CHARACTERS <32.↲
; ADDRESSES CONTAINING 377<OCTAL> IS NOT↲
; USED AS TERMINAL ADDRESS OR AS STATUS MESSAGE.↲
↲
KEYTAB:╞	╞	377╞	╞	; 0""↲
╞	╞	3╞	╞	; 1"↲
╞	╞	0╞	╞	; 2"↲
╞	╞	1╞	╞	; 3"↲
╞	╞	2╞	╞	; 4"↲
╞	╞	377╞	╞	; 5"↲
╞	╞	377╞	╞	; 6"↲
╞	╞	377╞	╞	; 7"↲
╞	╞	377╞	╞	; 8"↲
╞	╞	377╞	╞	; 9"↲
╞	╞	377╞	╞	; 10"↲
╞	╞	377╞	╞	; 11"↲
╞	╞	377╞	╞	; 12"↲
╞	╞	377╞	╞	; 13"↲
╞	╞	377╞	╞	; 14"↲
╞	╞	377╞	╞	; 15"↲
╞	╞	6╞	╞	; 16"↲
╞	╞	377╞	╞	; 17"↲
╞	╞	377╞	╞	; 18"↲
╞	╞	377╞	╞	; 19"↲
╞	╞	377╞	╞	; 20"↲
╞	╞	7╞	╞	; 21"↲
╞	╞	377╞	╞	; 22"↲
╞	╞	7╞	╞	; 23"↲
╞	╞	377╞	╞	; 24"↲
╞	╞	377╞	╞	; 25"↲
╞	╞	377╞	╞	; 26"↲
╞	╞	377╞	╞	; 27"↲
╞	╞	377╞	╞	; 28"↲
╞	╞	377╞	╞	; 29"↲
╞	╞	377╞	╞	; 30"↲
╞	╞	377╞	╞	; 31"↲
↲

════════════════════════════════════════════════════════════════════════
↲
; TABLE TO CONVERT THE INTERNAL SYMBOLIC ↲
; ADDRESS (RANGE 0-7) INTO A CHARACTER <32.↲
↲
ADDTAB:╞	╞	2╞	╞	; 0" TERMINAL1.↲
╞	╞	3╞	╞	; 1" TERMINAL2.↲
╞	╞	4╞	╞	; 2" TERMINAL3.↲
╞	╞	1╞	╞	; 3" PRINTER.↲
╞	╞	0╞	╞	; 4" HOST.↲
╞	╞	0╞	╞	; 5" NOT USED.↲
╞	╞	0╞	╞	; 6" NOT USED.↲
╞	╞	0╞	╞	; 7" NOT USED.↲
↲
↲
; TABLE TO CONVERT THE INTERNAL STATUS↲
; INTO A CHARACTER <32.↲
↲
STATAB:╞	0╞	╞	╞	; 0"↲
╞	27╞	╞	╞	; 1",V24 ERROR.↲
╞	25╞	╞	╞	; 2",BUSY.↲
╞	25╞	╞	╞	; 3" @@ SHOULD BE V24 ERROR;↲
╞	20╞	╞	╞	; 4",READY.↲
╞	27╞	╞	╞	; 5",V24 ERROR.↲
╞	25╞	╞	╞	; 6",BUSY.↲
╞	25╞	╞	╞	; 7",BUSY.↲
↲

════════════════════════════════════════════════════════════════════════
; ROUTINE TO PERFORM A NUMBER OF LOGICAL↲
; SHIFT LEFT OF A".↲
; D= NUMBER OF SHIFTS <RANGE 0-7>.↲
↲
LOSH:╞	MOV╞	E,A╞	; SAVE A.↲
╞	MOV╞	A,D↲
╞	CPI╞	0↲
╞	MOV╞	A,E╞	; RESTORE A.↲
╞	RZ╞	╞	; RETURN IF D=0.↲
╞	RLC↲
╞	DCR╞	D↲
╞	JMP╞	LOSH↲
↲
; ROUTINE TO PERFORM A NUMBER OF LOGICAL↲
; SHIFT RIGHT OF A".↲
; D= NUMBER OF SHIFTS <RANGE 0-7>.↲
ROSH:╞	MOV╞	E,A╞	; SAVE A.↲
╞	MOV╞	A,D↲
╞	CPI╞	0↲
╞	MOV╞	A,E╞	; RESTORE A.↲
╞	RZ╞	╞	; RETURN IF D=0.↲
╞	RRC↲
╞	DCR╞	D↲
╞	JMP╞	ROSH↲
↲
↲
; ROUTINE TO SET THE ERROR↲
; INDICATOR.↲
↲
ERR1:╞	MVI╞	A,1↲
╞	STA╞	ERR↲
╞	RET↲
↲
↲
; ROUTINE TO RESET THE ERROR ↲
; INDICATOR.↲
↲
↲
ERR0:╞	XRA╞	A↲
╞	STA╞	ERR↲
╞	RET↲
↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO READ STATUS FROM A UART.↲
; WHEN CALLED: ↲
; A=╞	0╞	TERMINAL1↲
;╞	1╞	TERMINAL2↲
;╞	2╞	TERMINAL3↲
;╞	3╞	PRINTER↲
;╞	4╞	HOST↲
; HL,DE ARE DESTROYED.↲
RSTAT:╞	RLC↲
╞	RLC↲
╞	MOV╞	E,A↲
╞	XRA╞	A↲
╞	MOV╞	D,A↲
╞	LXI╞	HL,STAT1↲
╞	DAD╞	DE↲
╞	PCHL↲
↲
STAT1:╞	LDA╞	TERM1+1↲
╞	RET↲
╞	LDA╞	TERM2+1↲
╞	RET↲
╞	LDA╞	TERM3+1↲
╞	RET↲
╞	LDA╞	PRINT+1↲
╞	RET↲
╞	LDA╞	HOST+1↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO READ A BYTE FROM AN UART.↲
; WHEN CALLED:↲
; A=╞	0╞	TERMINAL1↲
;╞	1╞	TERMINAL2↲
;╞	2╞	TERMINAL3↲
;╞	3╞	PRINTER↲
;╞	4╞	HOST↲
↲
↲
↲
RDATA:╞	RLC↲
╞	RLC↲
╞	MOV╞	E,A↲
╞	XRA╞	A↲
╞	MOV╞	D,A↲
╞	LXI╞	HL,DIN1↲
╞	DAD╞	DE↲
╞	PCHL↲
↲
DIN1:╞	LDA╞	TERM1↲
╞	RET↲
╞	LDA╞	TERM2↲
╞	RET↲
╞	LDA╞	TERM3↲
╞	RET↲
╞	LDA╞	PRINT↲
╞	RET↲
╞	LDA╞	HOST↲
╞	RET↲
↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO OUTPUT A BYTE TO AN UART.↲
; WHEN CALLED:↲
; A=╞	0╞	TERMINAL1↲
;╞	1╞	TERMINAL2↲
;╞	2╞	TERMINAL3↲
;╞	3╞	PRINTER.↲
;╞	4╞	HOST↲
↲
;H= DATA↲
↲
↲
↲
WOUT:╞	RLC↲
╞	RLC↲
╞	MOV╞	E,A↲
╞	XRA╞	A↲
╞	MOV╞	D,A↲
╞	MOV╞	A,H↲
╞	LXI╞	HL,DOUT1↲
╞	DAD╞	DE↲
╞	PCHL↲
↲
DOUT1:╞	STA╞	TERM1↲
╞	RET↲
╞	STA╞	TERM2↲
╞	RET↲
╞	STA╞	TERM3↲
╞	RET↲
╞	STA╞	PRINT↲
╞	RET↲
╞	STA╞	HOST↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
ROUTINE TO EMPTY A BUFFER.↲
; INPUT-OUTPUT POINTERS  ARE SET TO BUFFERSTART↲
;╞	AND BUFEM (2*NO + BOOLEAN TYPE) := 0;↲
; A=╞	TERMINAL NO (0-3).↲
; L=╞	XMT/REC TYPE OF BUFER ( 0=XMT,1=REC).↲
↲
EMPT1:╞	PUSH╞	BC↲
╞	PUSH╞	DE↲
╞	PUSH╞	HL↲
╞	RLC↲
╞	ADD╞	L↲
╞	PUSHPSW↲
╞	RLC↲
╞	PUSHPSW↲
╞	LXI╞	BC,BUFSTAB↲
╞	CALL╞	BCADD↲
EMPT2:╞	POPPSW↲
╞	RLC↲
╞	LXI╞	DE,B1XINP↲
╞	CALL╞	DEADD↲
EMPT3:╞	LDAX╞	BC╞	; SET INPUT POINTER↲
╞	STAX╞	DE╞	; = BUFFER START.↲
╞	INX╞	BC↲
╞	INX╞	DE↲
╞	LDAX╞	BC↲
╞	STAX╞	DE↲
╞	INX╞	DE↲
╞	DCX╞	BC↲
╞	LDAX╞	BC╞	; SET OUTPUT POINTER↲
╞	STAX╞	DE╞	; = BUFFER START.↲
╞	INX╞	BC↲
╞	INX╞	DE↲
╞	LDAX╞	BC↲
╞	STAX╞	DE↲
╞	LXI╞	DE,BUFEM↲
╞	POPPSW↲
╞	ADD╞	E↲
╞	MOV╞	E,A↲
╞	JNC╞	EMPT4↲
╞	INR╞	D↲
EMPT4:╞	XRA╞	A↲
╞	STAX╞	DE↲
╞	POP╞	HL↲
╞	POP╞	DE↲
╞	POP╞	BC↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
; ROUTINE TO COMPARE TO BUFFER ELEMENT EACH OF 2 BYTES (POINTERS)↲
; WHEN CALLED: ↲
;╞	BC=╞	POINTER TO  BUF-ELEMENT1↲
;╞	DE=╞	POINTER TO BUF-ELEMENT 2↲
;RETURN: ZERO FLAG=1 IF EQUAL.↲
↲
EQUAL:╞	PUSH╞	HL↲
╞	LDAX╞	BC↲
╞	MOV╞	H,A↲
╞	LDAX╞	DE↲
╞	SUB╞	H↲
╞	JNZ╞	EQU1↲
╞	INX╞	BC↲
╞	INX╞	DE↲
╞	LDAX╞	BC↲
╞	MOV╞	H,A↲
╞	LDAX╞	DE↲
╞	DCX╞	BC↲
╞	DCX╞	DE↲
╞	SUB╞	H↲
EQU1:╞	POP╞	HL↲
╞	RET↲
↲
↲
; ROUTINE TO TEST A BUFFER FOR EMPTY STATE↲
; (INPUT POINTER=OUTPUT POINTER)↲
; WHEN CALLED:↲
; A=╞	TERMINAL NO (0-4)↲
; L=╞	XMT/REC TYPE BUFFER(0=XMT,1=REC).↲
; RETURN:↲
; ZERO-FLAG=1 IF BUFFER EMPTY.↲
↲
B4:╞	PUSH╞	DE↲
╞	LXI╞	DE,BUFEM↲
╞	RLC↲
╞	ADD╞	L↲
╞	ADD╞	E↲
╞	MOV╞	E,A↲
╞	JNC╞	B5↲
╞	INR╞	D↲
B5:╞	LDAX╞	DE↲
╞	CPI╞	0↲
╞	POP╞	DE↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO INPUT A BYTE TO A BUFFER.↲
; INCREMENT INPUT POINTER↲
; IF INPUT POINTER EQUALS TOP OF BUFFER THEN↲
; INPUT POINTER:= BUFFER START.↲
; WHEN CALLED:↲
;╞	A=╞	TERMINAL NO.(0-4)↲
;╞	L=╞	XMT/REC TYPE BUFFER(0=XMT,1=REC).↲
;╞	H=╞	INPUT CHARACTER.↲
↲
↲
B6:╞	PUSH╞	BC↲
╞	PUSH╞	DE↲
╞	PUSH╞	HL↲
╞	LXI╞	BC,B1XINP╞	; GET BUFFER POINTER.↲
╞	MOV╞	H,A↲
╞	RLC↲
╞	ADD╞	L↲
╞	RLC↲
╞	RLC↲
╞	ADD╞	C↲
╞	MOV╞	C,A↲
╞	JNC╞	B7↲
╞	INR╞	B↲
B7:╞	LDAX╞	BC↲
╞	MOV╞	E,A↲
╞	INX╞	BC↲
╞	LDAX╞	BC↲
╞	MOV╞	D,A╞	; DE=CURRENT BUF ADDRESS.↲
╞	XTHL↲
╞	MOV╞	A,H↲
╞	STAX╞	DE↲
╞	XTHL↲
╞	DCX╞	BC╞	; INCREMENT BUFFER POINTER.↲
╞	LDAX╞	BC↲
╞	INR╞	A↲
╞	STAX╞	BC↲
╞	JNZ╞	B8↲
↲
╞	INX╞	BC↲
╞	LDAX╞	BC↲
╞	INR╞	A↲
╞	STAX╞	BC↲
╞	DCX╞	BC╞	; BC=POINTER↲

════════════════════════════════════════════════════════════════════════
↲
B8:╞	MOV╞	A,H↲
╞	RLC↲
╞	ADD╞	L↲
╞	RLC↲
╞	LXI╞	DE,BUFTTAB↲
╞	CALL╞	DEADD╞	; DE= BUFFER MAX.↲
╞	CALL╞	EQUAL╞	; IF (BC)=(DE) THEN↲
╞	JNZ╞	B10╞	; (BC):= BUFFER START.↲
↲
╞	MOV╞	A,H↲
╞	RLC↲
╞	ADD╞	L↲
╞	RLC↲
╞	LXI╞	DE,BUFSTAB↲
╞	CALL╞	DEADD↲
╞	LDAX╞	DE↲
╞	STAX╞	BC↲
╞	INX╞	DE↲
╞	INX╞	BC↲
╞	LDAX╞	DE↲
╞	STAX╞	BC↲
B10:╞	MOV╞	A,H↲
╞	RLC↲
╞	ADD╞	L↲
╞	LXI╞	HL,BUFEM↲
╞	ADD╞	L↲
╞	MOV╞	L,A↲
╞	JNC╞	EB10↲
╞	INR╞	H↲
EB10:╞	INR╞	M↲
╞	POP╞	HL↲
╞	POP╞	DE↲
╞	POP╞	BC↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
; ROUTINE TO OUTPUT A BYTE FROM A BUFFER.↲
; INCREMENT THE OUTPUT POINTER↲
; IF OUTPUT POINTER=TOP OF BUFFER THEN↲
; OUTPUT POINTER:= BUFFER START.↲
; WHEN CALLED:↲
; ╞	A=╞	TERMINAL NO(0-4)↲
;╞	L=╞	XMT/REC BUFFER(0=XMT,1=REC).↲
;RETURN:↲
;╞	H=╞	CHARACTER.↲
↲
↲
B12:╞	PUSH╞	BC╞	; SAVE ACCUMULATORS.↲
╞	PUSH╞	DE↲
╞	PUSH╞	HL↲
╞	LXI╞	BC,B1XINP+2╞	; GET BUFFER POINTER.↲
╞	MOV╞	H,A↲
╞	RLC↲
╞	ADD╞	L↲
╞	RLC↲
╞	RLC↲
╞	ADD╞	C↲
╞	MOV╞	C,A↲
╞	JNC╞	B13↲
╞	INR╞	B↲
B13:╞	LDAX╞	BC↲
╞	MOV╞	E,A↲
╞	INX╞	BC↲
╞	LDAX╞	BC↲
╞	MOV╞	D,A╞	; DE=CURRENT BUFFER ADDRESS.↲
╞	LDAX╞	DE↲
╞	MOV╞	D,H↲
╞	MOV╞	H,A↲
╞	XTHL↲
╞	DCX╞	BC↲
╞	LDAX╞	BC╞	; INCR POINTER.↲
╞	INR╞	A↲
╞	STAX╞	BC↲
╞	JNZ╞	B14↲
↲
╞	INX╞	BC↲
╞	LDAX╞	BC↲
╞	INR╞	A↲
╞	STAX╞	BC↲
╞	DCX╞	BC↲

════════════════════════════════════════════════════════════════════════
↲
B14:╞	MOV╞	A,D╞	; TEST POINTER= BUFFER TOP.↲
╞	MOV╞	H,D↲
╞	RLC↲
╞	ADD╞	L↲
╞	RLC↲
╞	LXI╞	DE,BUFTTAB↲
╞	CALL╞	DEADD╞	; (DE)= BUFFER TOP.↲
╞	CALL╞	EQUAL↲
╞	JNZ╞	B16╞	; IF (BC)=(DE) THEN↲
↲
╞	MOV╞	A,H╞	; (BC):=BUFFER START.↲
╞	RLC↲
╞	ADD╞	L↲
╞	RLC↲
╞	LXI╞	DE,BUFSTAB↲
╞	CALL╞	DEADD↲
B17:╞	LDAX╞	DE↲
╞	STAX╞	BC↲
╞	INX╞	DE↲
╞	INX╞	BC↲
╞	LDAX╞	DE↲
╞	STAX╞	BC↲
B16:╞	MOV╞	A,H↲
╞	RLC↲
╞	ADD╞	L↲
╞	LXI╞	HL,BUFEM↲
╞	ADD╞	L↲
╞	MOV╞	L,A↲
╞	JNC╞	EB16↲
╞	INR╞	H↲
EB16:╞	DCR╞	M↲
╞	POP╞	HL↲
╞	POP╞	DE↲
╞	POP╞	BC↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO ADD THE CONTENTS OF↲
; A" TO THE REGISTER PAIR BC".↲
↲
BCADD:╞	ADD╞	C↲
╞	MOV╞	C,A↲
╞	JNC╞	K1↲
╞	INR╞	B↲
K1:╞	RET↲
↲
↲
; ROUTINE TO ADD THE CONTENTS OF↲
; A" TO THE REGISTER PAIR DE"↲
↲
DEADD:╞	ADD╞	E↲
╞	MOV╞	E,A↲
╞	JNC╞	K2↲
╞	INR╞	D↲
K2:╞	RET↲
↲
; ROUTINE TO ADD THE CONTENTS OF↲
; A" TO THE REGISTER PAIR HL".↲
↲
HLADD:╞	ADD╞	L↲
╞	MOV╞	L,A↲
╞	JNC╞	K3↲
╞	INR╞	H↲
K3:╞	RET↲

════════════════════════════════════════════════════════════════════════
ROUTINE TO WRITE THE CONTENTS OF H"↲
; INTO THE VARIABLE MODEX↲
; WHERE A= TERMINAL NO.↲
↲
WRMODE:╞	LXI╞	BC,MODE1↲
╞	CALL╞	BCADD↲
╞	MOV╞	A,H↲
╞	STAX╞	BC↲
╞	RET↲
↲
; ROUTINE TO READ THE CONTENTS OF THE↲
; VARIABLE MODEX INTO A.↲
; WHEN CALLED A= TERMINAL NO.↲
↲
RDMODE:╞	LXI╞	BC,MODE1↲
╞	CALL╞	BCADD↲
╞	LDAX╞	BC↲
╞	RET↲
↲
↲
; ROUTINE TO PUT LOGICAL 1" INTO THE VARIABLE STAFX↲
; WHEN CALLED A= TERMINAL NO.↲
↲
WRSF:╞	LXI╞	BC,STAF1↲
╞	CALL╞	BCADD↲
╞	MVI╞	A,1↲
╞	STAX╞	BC↲
╞	RET↲
↲
↲
; ROUTINE TO PUT LOGICAL "0" INTO THE VARIABLE "STAFX"↲
; WHEN CALLED A= TERMINAL NUMBER.↲
↲
WRSC:╞	LXI╞	BC,STAF1╞	;↲
╞	CALL╞	BCADD╞	;↲
╞	XRA╞	A╞	;↲
╞	STAX╞	BC╞	;↲
╞	RET╞	╞	;↲
↲
↲
; ROUTINE TO READ THE CONTENTS OF STAFX INTO "A".↲
; WHEN CALLED A= TERMINAL NO.↲
↲
RDSF:╞	LXI╞	BC,STAF1↲
╞	CALL╞	BCADD↲
╞	LDAX╞	BC↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
; ROUTINE TO WRITE THE CONTENTS OF H"↲
; INTO THE VARIABLE STABX.↲
; A= TERMINAL NO.↲
↲
WRSB:╞	LXI╞	BC,STAB1↲
╞	CALL╞	BCADD↲
╞	MOV╞	A,H↲
╞	STAX╞	BC↲
╞	RET↲
↲
; ROUTINE TO READ THE CONTENTS OF VARIABLE↲
; STABX INTO A".↲
; WHEN CALLED A= TERMINAL NO.↲
↲
RDSB:╞	LXI╞	BC,STAB1↲
╞	CALL╞	BCADD↲
╞	LDAX╞	BC↲
╞	RET↲
↲
↲
; ROUTINE TO TEST IF THE CHAR↲
; (<32) IN A" IS ONE OF THE SPECIAL ↲
; CHARACTERS.↲
; THE TABLE KEYTAB" IS USED.↲
; RETURN: ZERO-FLAG= 0 IF SPEC CHAR.↲
↲
SPECH:╞	LXI╞	BC,KEYTAB↲
╞	MOV╞	H,A↲
╞	ANI╞	37↲
╞	CALL╞	BCADD↲
╞	LDAX╞	BC↲
╞	CPI╞	377↲
╞	RET↲
;↲

════════════════════════════════════════════════════════════════════════
ROUTINE TO SERVICE A TERMINAL.↲
; V24 ERRORS ARE UPDATED IN STABX.↲
; TEST RXRDY.↲
; TEST TXRDY.BUFFER EMPTY.↲
; DEVNO= TERMINAL NO.↲
; TEMPS AND TEMPD ARE USED TO SAVE↲
; STATUS AND DATA.↲
↲
TSERV:╞	LDA╞	DEVNO↲
╞	CALL╞	RSTAT╞	╞	; INPUT STATUS.↲
╞	STA╞	TEMPS╞	╞	; FROM UART.↲
╞	LDA╞	DEVNO↲
╞	CALL╞	RDSF↲
╞	CPI╞	0↲
╞	JNZ╞	TSER1╞	; NOT READY TO ACCEPT CHANGE OF STATUS.↲
↲
╞	LDA╞	TEMPS↲
╞	ANI╞	370╞	;@@ CHANGED 81.11.09↲
╞	CPI╞	300↲
╞	JZ╞	CV24E╞	; CLEAR V24 ERROR.↲
↲
╞	DI↲
╞	LDA╞	DEVNO↲
╞	CALL╞	RDSB↲
╞	ANI╞	6↲
╞	MOV╞	H,A↲
╞	INR╞	H↲
╞	LDA╞	DEVNO↲
╞	CALL╞	WRSB╞	; SET V24 ERROR.↲
╞	LDA╞	DEVNO╞	;@@ CHANGED 81.11.09 INIT DEVNO↲
╞	CALL╞	TINIT╞	;@@↲
╞	LDA╞	DEVNO↲
╞	CALL╞	RDMODE↲
╞	CPI╞	1╞	; SKIP MODE.↲
╞	JNZ╞	NOSKIP↲
↲
╞	EI↲
╞	JMP╞	TSER1↲
↲
NOSKIP:╞	LDA╞	DEVNO↲
╞	CALL╞	WRSF╞	; SET XMT STATUS.↲
╞	MVI╞	H,1↲
╞	LDA╞	DEVNO↲
╞	CALL╞	WRMODE╞	; SET SKIP↲
╞	EI↲
╞	JMP╞	TSER1↲

════════════════════════════════════════════════════════════════════════
CV24E:╞	LDA╞	DEVNO↲
╞	CALL╞	RDSB↲
╞	ANI╞	6↲
╞	MOV╞	H,A↲
╞	LDA╞	DEVNO↲
╞	CALL╞	WRSB╞	; CLEAR V24 ERROR.↲
TSER1:↲
╞	LDA╞	TEMPS↲
╞	ANI╞	2╞	╞	; TEST FOR RXRDY=1.↲
╞	JZ╞	NORXR↲
↲
╞	LDA╞	DEVNO↲
╞	CALL╞	RDATA╞	╞	; A= DATA BYTE.↲
╞	STA╞	TEMPD↲
╞	DI↲
╞	LDA╞	DEVNO↲
╞	CALL╞	RDMODE╞	; GET MODE.↲
╞	ANI╞	3↲
╞	CPI╞	0↲
╞	JZ╞	CONMODE╞	╞	; 00= CONTROL MODE.↲
↲
╞	CPI╞	1↲
╞	JZ╞	NORXR╞	╞	; 01= SKIP MODE.↲
↲
╞	LDA╞	TEMPD╞	╞	; ELSE DATA MODE.↲
╞	MOV╞	H,A↲
╞	ANI╞	340╞	╞	; TEST CHAR <32.↲
╞	MOV╞	A,H↲
╞	JZ╞	LESS↲
↲
STCHR:╞	LDA╞	DEVNO╞	╞	; STORE CHAR.↲
╞	MVI╞	L,1╞	╞	; INTO REC BUFFER.↲
╞	DI↲
╞	CALL╞	B6↲
╞	EI↲
╞	JMP╞	NORXR↲
↲
LESS:╞	CALL╞	SPECH╞	╞	; TEST FOR SPEC CHAR.↲
╞	JNZ╞	NORXR↲
↲
SETSK:╞	MVI╞	H,1╞	╞	; SET SKIP MODE.↲
╞	LDA╞	DEVNO↲
╞	CALL╞	WRMODE↲
╞	LDA╞	TEMPD↲
╞	MOV╞	H,A↲
╞	JMP╞	STCHR↲

════════════════════════════════════════════════════════════════════════
↲
CONMODE:LDA╞	TEMPD╞	; CONTROL MODE:↲
╞	MOV╞	H,A╞	;  CHAR <32 AND NOT SPEC THEN↲
╞	ANI╞	340╞	;     STORE INTO REC BUF;↲
╞	JNZ╞	NORXR╞	;  CHAR >=32 THEN SKIP CHAR.↲
↲
╞	MOV╞	A,H↲
╞	CALL╞	SPECH↲
╞	JNZ╞	NORXR↲
↲
╞	JMP╞	SETSK↲
↲
NORXR:╞	EI↲
╞	LDA╞	DEVNO↲
╞	MVI╞	L,0↲
╞	DI↲
╞	CALL╞	B4╞	╞	; TEST XMT- BUFFER EMPTY;↲
╞	EI↲
╞	RZ↲
↲
╞	LDA╞	TEMPS↲
╞	ANI╞	1↲
╞	RZ╞	╞	╞	; TEST TXRDY=1.↲
↲
╞	LDA╞	DEVNO↲
╞	MVI╞	L,0↲
╞	DI↲
╞	CALL╞	B12╞	╞	; READ A CHAR FROM↲
╞	LDA╞	DEVNO╞	╞	; XMT BUF AND↲
╞	CALL╞	WOUT╞	╞	; OUTPUT TO UART.↲
╞	EI╞	╞	╞	;↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO TEST THAT THE 2 BYTES IN BUF1↲
; ARE GREATER THAN THE 2 BYTES IN BUF2.↲
; WHEN CALLED:↲
;╞	BC=POINTER TO BUF1↲
;╞	DE=POINTER TO BUF2↲
;RETURN: CY=1 IF BUF1>BUF2.↲
↲
GREAT:╞	PUSH╞	HL↲
╞	INX╞	BC╞	; MOST SIGNIFICANT↲
╞	INX╞	DE╞	; BYTES.↲
╞	LDAX╞	BC↲
╞	MOV╞	H,A↲
╞	LDAX╞	DE↲
╞	CMP╞	H↲
╞	JC╞	GR1╞	; JUMP IF BUF1(MSB)>↲
╞	JNZ╞	GR1╞	; BUF2(MSB)↲
↲
╞	DCX╞	BC↲
╞	DCX╞	DE↲
╞	LDAX╞	BC↲
╞	MOV╞	H,A↲
╞	LDAX╞	DE↲
╞	CMP╞	H↲
╞	POP╞	HL↲
╞	RET↲
GR1:╞	DCX╞	BC↲
╞	DCX╞	DE↲
╞	POP╞	HL↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
; ROUTINE TO TEST THAT THE PRINTER BUFFER IS↲
; MORE THAN HALF FULL;↲
; LENGTH OF BUFFER B5XSTART-B4XSTART↲
; RETURN: CY=1 IF MORE THAN HALF FULL.↲
↲
HFULL:╞	PUSH╞	DE↲
╞	PUSH╞	BC↲
╞	PUSH╞	HL↲
╞	LXI╞	DE,B4XINP↲
╞	LXI╞	BC,B4XOUTP↲
╞	CALL╞	GREAT╞	; OUTPUT POINTER >↲
╞	JC╞	OGREAT╞	; INPUT POINTER.↲
↲
╞	XRA╞	A╞	; CLEAR CARRY↲
╞	LDAX╞	BC↲
╞	MOV╞	H,A↲
╞	LDAX╞	DE↲
╞	SBB╞	H↲
╞	MOV╞	L,A↲
╞	INX╞	BC↲
╞	INX╞	DE↲
╞	LDAX╞	BC↲
╞	MOV╞	H,A↲
╞	LDAX╞	DE↲
╞	SBB╞	H↲
╞	MOV╞	H,A╞	; HL= RESULT↲
╞	PUSH╞	HL↲
╞	POP╞	BC╞	; BC= BUFFER CONTENTS.↲
╞	LXI╞	DE,(B4RSTART-B4XSTART)/2↲
╞	MOV╞	A,E↲
╞	CMP╞	C↲
╞	POP╞	HL╞	; HALF FULL↲
╞	POP╞	BC↲
╞	POP╞	DE↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
OGREAT:╞	XRA╞	A↲
╞	LDAX╞	DE↲
╞	MOV╞	H,A↲
╞	LDAX╞	BC↲
╞	SBB╞	H↲
╞	MOV╞	L,A↲
╞	INX╞	BC↲
╞	INX╞	DE↲
╞	LDAX╞	DE↲
╞	MOV╞	H,A↲
╞	LDAX╞	BC↲
╞	SBB╞	H↲
╞	MOV╞	H,A╞	; HL= RESULT↲
╞	XCHG↲
╞	LXI╞	BC,(B4RSTART-B4XSTART)/2↲
╞	MOV╞	A,E↲
╞	CMP╞	C↲
╞	POP╞	HL↲
╞	POP╞	BC↲
╞	POP╞	DE↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO SERVICE THE SERIAL PRINTER UART.↲
; V24 ERROR ARE UPDATED IN STABP.↲
; IF FIFO (B4XSTART) IS EMPTY THEN READY↲
; STATUS IS TRANSMITTED.↲
; CHAR FROM FIFO IS TRANSFERRED TO UART↲
; WHEN TXEMPTY.↲
↲
PDEV=╞	3╞	; PRINTER TERMINAL NO.↲
↲
PSERV:╞	LDA╞	PRINT+1↲
╞	ANI╞	200╞	;** TEST V24 ERROR.↲
╞	CPI╞	200╞	;** NOTICE: BYSY IS INPUT TO DATA CARRIER DETECT↲
╞	JZ╞	PNOV24↲
↲
╞	LDA╞	STABP↲
╞	ANI╞	6╞	; SET 1<0.↲
╞	INR╞	A↲
╞	STA╞	STABP↲
╞	JMP╞	PSER1↲
↲
PNOV24:╞	LDA╞	STABP↲
╞	ANI╞	6╞	; RESET V24 ERROR.↲
╞	STA╞	STABP↲
PSER1:╞	LDA╞	PRINT+1↲
╞	ANI╞	301↲
╞	CPI╞	301╞	;** TXEMPTY, NOTICE BYSY = DCD;↲
╞	RNZ↲
↲
╞	MVI╞	A,PDEV↲
╞	MVI╞	L,0↲
╞	DI╞	╞	;↲
╞	CALL╞	B4╞	; TEST FIFO FOR EMPTY.↲
╞	JNZ╞	PSER2╞	;↲
↲
╞	CALL╞	CLBUS╞	; CLEAR BUSY IF EMPTY↲
╞	EI↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
PSER2:╞	MVI╞	A,PDEV↲
╞	MVI╞	L,0↲
╞	DI↲
╞	CALL╞	B12╞	; OUTPUT A BYTE FROM↲
╞	EI↲
╞	MOV╞	A,H╞	; FIFO. MOVE CHAR↲
╞	STA╞	PRINT╞	; TO PRINT UART.↲
↲
╞	MVI╞	A,PDEV↲
╞	MVI╞	L,0↲
╞	DI╞	╞	;↲
╞	CALL╞	B4╞	; IF FIFO NOT EMPTY THEN RETURN↲
╞	JZ╞	PSER3╞	;↲
╞	EI╞	╞	;↲
╞	RET╞	╞	;↲
↲
PSER3:╞	CALL╞	CLBUS╞	;↲
╞	LDA╞	GRDY╞	; FIFO EMPTY:↲
╞	ANA╞	A↲
╞	EI╞	╞	;↲
╞	RZ╞	╞	;↲
↲
╞	DI↲
╞	LDA╞	STABP↲
╞	ANI╞	3↲
╞	ADI╞	4╞	; SET READY STATUS.↲
╞	STA╞	STABP↲
╞	MVI╞	A,1↲
╞	STA╞	STAFP↲
╞	XRA╞	A↲
╞	STA╞	GRDY↲
╞	EI↲
╞	RET↲
↲
CLBUS:╞	LDA╞	STAFP╞	; CLEAR BUSY STATUS.↲
╞	CPI╞	0↲
╞	RNZ╞	╞	;↲
╞	LDA╞	STABP↲
╞	ANI╞	5↲
╞	STA╞	STABP↲
╞	RET╞	╞	; END OF CLEAR BUSY↲
↲

════════════════════════════════════════════════════════════════════════
↲
; PROGRAM TO SCAN THE TERMINALS↲
; AND PRINTER FOR SERVICE.↲
↲
PRO1:╞	XRA╞	A╞	; START WITH TERMINAL1↲
╞	STA╞	DEVNO↲
╞	CALL╞	TSERV↲
╞	LDA╞	DEVNO↲
╞	INR╞	A↲
╞	CPI╞	PDEV↲
╞	JNZ╞	PRO1+1↲
╞	CALL╞	IXMT↲
PRO2:╞	XRA╞	A↲
╞	STA╞	DEVNO↲
╞	CALL╞	TSERV↲
╞	LDA╞	DEVNO↲
╞	INR╞	A↲
╞	CPI╞	PDEV↲
╞	JNZ╞	PRO2+1↲
╞	CALL╞	PSERV↲
↲
; V24 ERROR DETECTED ON THE HOST LINE SHOULD↲
; REMOVE DATA TERMINAL READY TO THE TERMINALS.↲
↲
╞	LDA╞	HOST+1╞	; READ HOST STATUS.↲
╞	ANI╞	300↲
╞	CPI╞	300↲
╞	JNZ╞	HV24E↲
╞	JMP╞	PRO1↲
HV24E:╞	MVI╞	A,45╞	; SET DTR=0.↲
╞	STA╞	TERM1+3↲
╞	STA╞	TERM2+3↲
╞	STA╞	TERM3+3↲
╞	LDA╞	HOST+1↲
HV24S:╞	LDA╞	HOST+1↲
╞	ANI╞	300↲
╞	CPI╞	300↲
╞	JZ╞	RETAX↲
╞	CALL╞	PSERV↲
╞	JMP╞	HV24S↲
RETAX:╞	MVI╞	A,67↲
╞	STA╞	TERM1+3↲
╞	STA╞	TERM2+3↲
╞	STA╞	TERM3+3↲
╞	JMP╞	PRO1↲
↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO SERVICE HOST RECEIVER↲
; INTERRUPTS.↲
; ALL RECEIVED CHARACTERS ARE TESTED FOR↲
; THE CLASS <32.↲
; IF CHAR<32 THEN THE CHAR IS TESTED BY ↲
; THE KEYTAB TO SEE IF IT IS AN <ADDR> OR↲
; <ENABLE>. ALL OTHER CHARACTERS ARE SEND↲
; TO THE TERMINAL ADDRESSED BY "LREC".↲
; IF <ADDR> IS DETECTED THEN THE CORRESPONDING↲
; TERMINAL IS SET TO CONTROL MODE - <TEGN> IS↲
; SEND TO RC3600.↲
; IF PRINTER FIFO IS MORE THAN HALF FULL THEN↲
; <BUSY> STATUS IS SEND.↲
↲
PERR=╞	50╞	╞	; PARITY ERROR.↲
ENA=╞	6╞	╞	; INTERNAL ENABLE VALUE.↲
TEGN=╞	20╞	╞	↲
PECHA=╞	100╞	╞	; PARITY ERROR SUBSTITUTE.↲
↲
IREC:╞	DI↲
╞	PUSHPSW↲
╞	PUSH╞	HL↲
╞	PUSH╞	BC↲
╞	PUSH╞	DE↲
╞	LDA╞	HOST+1↲
╞	ANI╞	PERR↲
╞	JZ╞	IR1↲
↲
╞	CALL╞	ERR1╞	; SET PARITY ERROR INDICATOR↲
╞	LDA╞	HOST╞	; READ CHAR AND SKIP CHAR (SUBSTITUTE)↲
╞	LDA╞	MTAB+2↲
╞	ADI╞	20╞	; CLEAR ERROR FLAGS.↲
╞	STA╞	HOST+3↲
╞	MVI╞	A,PECHA↲
╞	JMP╞	IR2↲
↲

════════════════════════════════════════════════════════════════════════
↲
IR1:╞	LDA╞	HOST↲
IR2:╞	MOV╞	H,A╞	; H=DATA BYTE.↲
╞	ANI╞	340╞	; TEST IF CHAR<32.↲
╞	JZ╞	IR4↲
↲
IR3:╞	LDA╞	LREC╞	; CHAR INTO XMT BUFFER↲
╞	MVI╞	L,0╞	; GIVEN BY "LREC".↲
╞	CALL╞	B6↲
╞	LDA╞	LREC↲
╞	CPI╞	PDEV╞	; IS IT PRINTER↲
╞	JZ╞	PFULL↲
↲
REND:╞	POP╞	DE↲
╞	POP╞	BC↲
╞	POP╞	HL↲
╞	POPPSW↲
╞	EI↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
4:╞	MOV╞	A,H╞	; IF NOT SPECIAL CHAR THEN RETURN↲
╞	CALL╞	SPECH╞	; ELSE↲
╞	JZ╞	IR3╞	; ↲
↲
╞	CPI╞	ENA╞	; BEGIN↲
╞	JNZ╞	IR5╞	;  IF <ENABLE> RECEIVED THEN↲
↲
ENABL:╞	LDA╞	LREC╞	;BEGIN↲
╞	CPI╞	PDEV╞	; IF DEVNO = PRINTER THEN EXIT TO SUM-ANSWER;↲
╞	JZ╞	SUMANS╞	;↲
╞	CALL╞	RDMODE╞	; IF DEV-MODE = CONTROL THEN RETURN;↲
╞	CPI╞	0╞	;↲
╞	JNZ╞	REND╞	;↲
╞	LDA╞	LREC╞	;↲
╞	MVI╞	H,3╞	; SET DEV-MODE := DATA-MODE AND RETURN;↲
╞	CALL╞	WRMODE╞	;↲
╞	JMP╞	REND╞	;END;↲
↲
IR5:╞	CPI╞	ENA+1↲
╞	JZ╞	REND↲
↲
╞	STA╞	LREC╞	; SET NEW <ADDR>↲
╞	CPI╞	PDEV╞	; IS IT PRINTER↲
╞	JZ╞	PANS╞	; <ADDR>= PRINTER↲
╞	LDA╞	LREC╞	; ELSE TERMINAL↲
╞	CALL╞	RDMODE↲
╞	ANI╞	2↲
╞	JNZ╞	DMODE↲
↲
╞	MVI╞	H,0↲
╞	LDA╞	LREC╞	; SET TERMINAL INTO CONTROL MODE;↲
╞	CALL╞	WRMODE↲
╞	LDA╞	LREC╞	; NOT DATA MODE.↲
╞	CALL╞	RDSB↲
╞	CPI╞	0╞	; ***** ERROR SHOULD BE " ANI 5" FIRST *****↲
╞	JZ╞	REND↲
╞	LDA╞	LREC↲
╞	CALL╞	WRSF╞	; SET STAFX↲
╞	JMP╞	REND↲
↲
DMODE:╞	MVI╞	H,TEGN↲
╞	LDA╞	LREC╞	; PUT <TEGN> INTO↲
╞	MVI╞	L,1╞	; REC BUFFER.↲
╞	CALL╞	B6↲
╞	MVI╞	H,0↲
╞	LDA╞	LREC╞	; SET TERMINAL↲
╞	CALL╞	WRMODE╞	; TO CONTROL MODE.↲
╞	JMP╞	REND↲

════════════════════════════════════════════════════════════════════════
PFULL:╞	LDA╞	PSUM↲
╞	ADD╞	H↲
╞	STA╞	PSUM↲
 ╞	CALL╞	HFULL╞	; PRINTER FIFO FULL ?↲
╞	JNC╞	REND↲
↲
╞	LDA╞	STABP╞	; ** PRINTER BUFFER > 1/2 FULL :↲
╞	ANI╞	5↲
╞	ADI╞	2╞	; SET BUSY STATUS.↲
╞	STA╞	STABP↲
╞	LDA╞	GRDY↲
╞	ANA╞	A↲
╞	JNZ╞	REND↲
↲
╞	MVI╞	A,1↲
╞	STA╞	STAFP↲
╞	STA╞	GRDY↲
╞	JMP╞	REND↲
↲
PANS:╞	LDA╞	STABP╞	; STATUS ANSWER↲
╞	ANI╞	3╞	;↲
╞	CPI╞	0↲
╞	JZ╞	REND╞	; IF <ENABLE> IS↲
╞	MVI╞	A,1╞	; SEND TO PRINTER.↲
╞	STA╞	STAFP↲
╞	JMP╞	REND↲
↲
SUMANS:╞	LDA╞	PSUM╞	; XMT PSUM TO HOST↲
╞	ANI╞	177╞	; AND PSUM:=0.↲
╞	MOV╞	H,A↲
╞	ANI╞	340↲
╞	JNZ╞	LCHEC↲
╞	MVI╞	A,40↲
╞	ADD╞	H↲
╞	MOV╞	H,A↲
LCHEC:╞	MVI╞	A,PDEV↲
╞	MVI╞	L,1↲
╞	CALL╞	B6↲
╞	XRA╞	A↲
╞	STA╞	PSUM↲
╞	JMP╞	REND↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO SERVICE HOST TRANSMITTER↲
; INTERRUPTS.↲
; XMT MODES (MODEX):↲
; 1=╞	NEXT SHOULD BE STATUS.↲
; 2=╞	TEST STATUS FLAGS.↲
; 5=╞	NEXT SHOULD BE DATA.↲
; 6=╞	TEST STATUS FLAGS.↲
↲
NSTAT=╞	1↲
TSTAT=╞	2╞	; USED INITIALLY ONLY (LXMT = OF !!!!!);↲
NDAT=╞	5↲
TSTAF=╞	6╞	; USED ELSEWHERE;↲
TXRDY=╞	1↲
↲
IXMT:╞	DI↲
╞	PUSHPSW↲
╞	PUSH╞	HL↲
╞	PUSH╞	BC↲
╞	PUSH╞	DE↲
╞	LDA╞	HOST+1╞	; TEST STATUS FOR TXRDY.↲
╞	ANI╞	TXRDY↲
╞	JZ╞	XEND↲
↲
╞	LDA╞	MODEX↲
╞	CPI╞	NSTAT╞	; NEXT STATUS↲
╞	JZ╞	XMTST↲

════════════════════════════════════════════════════════════════════════
↲
╞	CPI╞	NDAT╞	; NEXT DATA↲
╞	JZ╞	XMTD↲
╞	MVI╞	H,0↲
╞	LXI╞	BC,STAF1╞	; LOOP TO TEST↲
STALOO:╞	LDAX╞	BC╞	╞	; STATUS FLAGS↲
╞	INX╞	BC↲
╞	ORA╞	A↲
╞	JNZ╞	XADDS╞	; XMIT ADDRESS↲
╞	INR╞	H╞	; H= TERM ADDR.↲
╞	MOV╞	A,H↲
╞	CPI╞	PDEV+1↲
╞	JNZ╞	STALOO↲
╞	XRA╞	A╞	; TEST DATA BUFFERS.↲
DLOOP:╞	STA╞	CURSTAT↲
╞	MVI╞	L,1↲
╞	CALL╞	B4╞	; EMPTY?↲
╞	JNZ╞	XADDD↲
╞	LDA╞	CURSTAT↲
╞	INR╞	A↲
╞	CPI╞	PDEV+1↲
╞	JNZ╞	DLOOP↲
XEND:╞	POP╞	DE↲
╞	POP╞	BC↲
╞	POP╞	HL↲
╞	POPPSW↲
╞	EI↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
; TRANSMIT STATUS↲
; "LXMT"= TERMINAL NO.↲
XMTST:╞	LDA╞	LXMT↲
╞	CALL╞	RDSB↲
╞	LXI╞	DE,STATAB↲
╞	CALL╞	DEADD↲
╞	LDAX╞	DE╞	; CONVERT STATUS↲
╞	STA╞	HOST↲
╞	LDA╞	LXMT↲
╞	CALL╞	WRSC↲
╞	MVI╞	A,TSTAF↲
╞	STA╞	MODEX↲
╞	JMP╞	XEND↲
↲
↲
; TRANSMIT DATA↲
; LXMT= TERMINAL NO.↲
↲
XMTD:╞	LDA╞	LXMT↲
╞	MVI╞	L,1╞	; GET BYTE.↲
╞	CALL╞	B12╞	;  FROM REC BUFFER;↲
╞	MOV╞	A,H↲
╞	STA╞	HOST╞	; CHAR TO HOST UART↲
╞	ANI╞	340↲
╞	JZ╞	NREP↲
╞	LDA╞	LXMT↲
╞	CPI╞	PDEV↲
╞	JZ╞	NREP↲
╞	MOV╞	A,H╞	; REPEAT CHAR (XMIT CHAR)↲
╞	MVI╞	L,0╞	; TO TERMINAL↲
╞	LDA╞	LXMT↲
╞	CALL╞	B6╞	; BUF IN↲
NREP:╞	LDA╞	LXMT↲
╞	MVI╞	L,1↲
╞	CALL╞	B4╞	; EMPTY?↲
╞	JNZ╞	XEND↲
╞	MVI╞	A,TSTAF↲
╞	STA╞	MODEX↲
╞	JMP╞	XEND↲

════════════════════════════════════════════════════════════════════════
↲
; TRANSMIT <ADDR> IN STATUS SEQUENCE.↲
↲
↲
XADDS:╞	LDA╞	LXMT╞	; H= TERM NO.↲
╞	SUB╞	H↲
╞	JZ╞	XADDO↲
↲
╞	MOV╞	A,H↲
╞	STA╞	LXMT↲
╞	LXI╞	BC,ADDTAB↲
╞	CALL╞	BCADD↲
╞	LDAX╞	BC↲
╞	STA╞	HOST╞	; <ADDR> TO UART↲
XADDO:╞	MVI╞	A,NSTAT↲
╞	STA╞	MODEX↲
╞	JMP╞	XEND↲
↲
; TRANSMIT ADDRESS IN DATA SEQUENCE.↲
↲
XADDD:╞	LDA╞	CURSTAT╞	; SAVE TERM NO.↲
╞	MOV╞	H,A↲
╞	LDA╞	LXMT↲
╞	SUB╞	H↲
╞	JZ╞	XADDK↲
↲
╞	MOV╞	A,H↲
╞	STA╞	LXMT↲
╞	LXI╞	BC,ADDTAB↲
╞	CALL╞	BCADD↲
╞	LDAX╞	BC↲
╞	STA╞	HOST╞	; <ADDR> TO UART↲
XADDK:╞	MVI╞	A,NDAT↲
╞	STA╞	MODEX↲
╞	JMP╞	XEND↲

════════════════════════════════════════════════════════════════════════
↲
; ROUTINE TO INITIALIZE AN UART.↲
; WHEN CALLED:↲
; BC=╞	POINTER TO MODE TAB(MTAB)↲
; DE=╞	MODE REG DESTINATION↲
; A=╞	BAUD RATE↲
; L= NO. OF STOPBITS( 1<7 IF 2 STOPBITS, 0 IF 1 STOPBIT).↲
INITU:╞	MOV╞	H,A↲
╞	LDAX╞	BC↲
╞	ADD╞	L↲
╞	STAX╞	DE╞	; SET MODE1↲
╞	INX╞	BC↲
╞	LDAX╞	BC↲
╞	ADD╞	H↲
╞	STAX╞	DE╞	; SET MODE2↲
╞	INX╞	BC↲
╞	INX╞	DE↲
╞	LDAX╞	BC↲
╞	STAX╞	DE╞	; SET COMMAND↲
╞	RET↲

════════════════════════════════════════════════════════════════════════
↲
; INITIALIZATION OF UARTS.↲
STRP1=╞	32000╞	; STRAP FIELD1↲
STRP2=╞	32400╞	; STRAP FIELD2↲
↲
SPINIT=╞	31777╞	; STACK POINTER INIT VALUE.↲
↲
STINIT:╞	LXI╞	DE,HOST+2↲
╞	LXI╞	SP,SPINIT↲
╞	LXI╞	BC,MTAB↲
╞	LDA╞	STRP2↲
╞	ANI╞	200↲
╞	MOV╞	L,A↲
╞	LDA╞	STRP2↲
╞	ANI╞	17↲
╞	CALL╞	INITU╞	; INIT HOST.↲
╞	LXI╞	DE,TERM1+2↲
╞	LXI╞	BC,MTAB+3↲
╞	LDA╞	STRP2↲
╞	RLC↲
╞	ANI╞	200↲
╞	MOV╞	L,A↲
╞	LDA╞	STRP1↲
╞	ANI╞	17↲
╞	CALL╞	INITU╞	; INIT TERMINAL1↲
╞	LDA╞	STRP2↲
╞	RLC↲
╞	ANI╞	200↲
╞	MOV╞	L,A↲
╞	LDA╞	STRP1↲
╞	ANI╞	17↲
╞	LXI╞	DE,TERM2+2↲
╞	LXI╞	BC,MTAB+6↲
╞	CALL╞	INITU╞	; INIT TERMINAL2↲

════════════════════════════════════════════════════════════════════════
↲
╞	LDA╞	STRP2↲
╞	RLC↲
╞	ANI╞	200↲
╞	MOV╞	L,A↲
╞	LDA╞	STRP1↲
╞	ANI╞	17↲
╞	LXI╞	DE,TERM3+2↲
╞	LXI╞	BC,MTAB+11↲
╞	CALL╞	INITU↲
╞	LDA╞	STRP2↲
╞	RLC↲
╞	RLC↲
╞	ANI╞	200↲
╞	MOV╞	L,A↲
╞	LDA╞	STRP1↲
╞	MVI╞	D,4↲
╞	CALL╞	ROSH↲
╞	ANI╞	17↲
╞	LXI╞	DE,PRINT+2↲
╞	LXI╞	BC,MTAB+14↲
╞	CALL╞	INITU↲
↲
↲
; INIT BUFFERS.↲
↲
╞	MVI╞	H,0↲
╞	MVI╞	L,0↲
╞	MOV╞	A,H↲
INI1:╞	CALL╞	EMPT1╞	; EMPTY XMT BUFFERS.↲
╞	INR╞	H↲
╞	MOV╞	A,H↲
╞	CPI╞	PDEV+1↲
╞	JNZ╞	INI1↲
↲
╞	MVI╞	H,0↲
╞	MVI╞	L,1↲
╞	MOV╞	A,H↲
INI2:╞	CALL╞	EMPT1╞	; EMPTY REC BUFFERS.↲
╞	INR╞	H↲
╞	MOV╞	A,H↲
╞	CPI╞	PDEV+1↲
╞	JNZ╞	INI2↲

════════════════════════════════════════════════════════════════════════
↲
; RESET STABX-- STAFX VARIABLES.↲
↲
↲
╞	MVI╞	D,(GRDY-STAB1)+1↲
╞	LXI╞	BC╞	STAB1↲
SINI1:╞	XRA╞	A↲
╞	STAX╞	BC↲
╞	INX╞	BC↲
╞	DCR╞	D↲
╞	JNZ╞	SINI1↲
↲
╞	LXI╞	BC,STABP╞	; INIT READY: ** CHANGE TO 'STAB1': INCL TERM **↲
╞	MVI╞	D,1╞	╞	;   ** CHANGE TO 4: INCLUDE TERMINALS **↲
╞	MVI╞	A,4╞	╞	;↲
SINI2:╞	STAX╞	BC╞	╞	;↲
╞	INX╞	BC╞	╞	;↲
╞	DCR╞	D╞	╞	;↲
╞	JNZ╞	SINI2╞	╞	;↲
↲
↲
; SET TERMINALS TO SKIP MODE.↲
╞	LXI╞	BC,MODE1↲
╞	MVI╞	A,1↲
╞	STAX╞	BC↲
╞	INX╞	BC↲
╞	STAX╞	BC↲
╞	INX╞	BC↲
╞	STAX╞	BC↲
╞	INX╞	BC↲
╞	MVI╞	A,TSTAT╞	; SET MODEX↲
╞	STAX╞	BC↲
╞	MVI╞	A,17↲
╞	STA╞	LXMT↲
╞	XRA╞	A↲
╞	STA╞	LREC↲
╞	STA╞	PSUM↲
╞	CALL╞	ERR0↲
╞	XRA╞	A↲
╞	STA╞	GRDY↲
╞	MVI╞	A,11↲
╞	SIM↲
╞	EI↲
╞	JMP╞	PRO1↲

════════════════════════════════════════════════════════════════════════
; ****╞	ROUTINE TO INIT (REINITIALIZE) ONE TERMINAL↲
; ****↲
;╞	PARAM:╞	REG A = DEVNO (0..2);↲
↲
TINIT:╞	MOV╞	H,A╞	;BEGIN↲
╞	RLC╞	╞	; RESET UART:↲
╞	RLC╞	╞	;↲
╞	LXI╞	DE,TERM1+3╞	;↲
╞	CALL╞	DEADD╞	;   COMMAND := RESET ERROR,DISABLE REC,XMIT;↲
╞	MVI╞	A,20╞	; END RESET;↲
╞	STAX╞	DE╞	;↲
↲
╞	XRA╞	A╞	; REINITIALIZE UART:↲
╞	MOV╞	D,H╞	;↲
╞	ADD╞	D╞	;↲
╞	ADD╞	D╞	;↲
╞	ADD╞	D╞	;↲
╞	LXI╞	BC,MTAB+3╞	;↲
╞	CALL╞	BCADD╞	;   GET PARAM TABLE ADDRESS;↲
╞	MOV╞	A,H╞	;↲
╞	RLC╞	╞	;↲
╞	RLC╞	╞	;↲
╞	LXI╞	DE,TERM1+2╞	;↲
╞	CALL╞	DEADD╞	;    GET DEVICE ADDRESS TABLE ADDRESS;;↲
╞	PUSH╞	HL╞	;↲
╞	LDA╞	STRP2╞	;↲
╞	RLC╞	╞	;↲
╞	ANI╞	200╞	;    GET 'STOP BITS SELECT';↲
╞	MOV╞	L,A╞	;↲
╞	LDA╞	STRP1╞	;    GET 'BAUD RATE SELECT';↲
╞	ANI╞	17╞	;↲
╞	CALL╞	INITU╞	;    INIT UART (PARAM,DEVICE);↲
╞	POP╞	HL╞	; END REINITIALIZE;↲
;↲

════════════════════════════════════════════════════════════════════════
╞	MVI╞	L,0╞	;↲
╞	MOV╞	A,H╞	;↲
╞	CALL╞	EMPT1╞	; EMPTY XMIT BUF;↲
╞	MVI╞	L,1╞	;↲
╞	MOV╞	A,H╞	;↲
╞	CALL╞	EMPT1╞	; EMPTY REC BUF;↲
╞	RET╞	╞	;↲
↲
;╞	MOV╞	E,H╞	;↲
;╞	XRA╞	A╞	;↲
;╞	MOV╞	D,A╞	;↲
;╞	LXI╞	HL,MODE1╞	;↲
;╞	DAD╞	DE╞	;↲
;╞	MVI╞	A,1╞	;↲
;╞	MOV╞	M,A╞	; RESET TERMINAL MODE TO CONTROL MODE;↲
;╞	LXI╞	HL,STAB1╞	;↲
;╞	DAD╞	DE╞	;↲
;╞	MVI╞	A,1╞	;↲
;╞	MOV╞	M,A╞	; SET STATUS REM TO V24-ERROR STATUS;↲
;╞	LXI╞	HL,STAF1╞	;↲
;╞	DAD╞	DE╞	;↲
;╞	MOV╞	M,A╞	; SET STATUS FLAG 'STATUS NOT PROCESSED';↲
;╞	RET╞	╞	;END INIT;↲

════════════════════════════════════════════════════════════════════════
↲
╞	.LOC╞	0↲
↲
╞	JMP╞	XINIT╞	; POWER RESTART.↲
↲
╞	.LOC╞	70↲
╞	JMP╞	XIREC╞	; HOST REC INTERRUPT.↲
╞	RET↲
╞	JMP╞	XIMIT╞	; HOST XMT INTERRUPT.↲
╞	RET↲
↲
╞	.END↲
↲

════════════════════════════════════════════════════════════════════════
┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆00┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆┆1a┆

Full view