|
DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC850 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RegneCentralen RC850 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 26240 (0x6680) Types: RcTekst Names: »43G12264.WP«
└─⟦975e936c7⟧ Bits:30005865 Manualer - tekstfiler 43-GL afdelingen └─⟦this⟧ »43G12264.WP«
╱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┆