|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 55674 (0xd97a)
Notes: pts_type(SC)
Names: »DRDC22.SC«
└─⟦efe3a1cfc⟧ Bits:30009667 Philips computer tape "600113"
└─⟦this⟧ »TOSSWORK/DRDC22.SC«
IDENT DRDC22 REL 9.1 78-09-15 870106540911 * ********************************************* * * PHILIPS TERMINAL SYSTEM PTS * * * DRDC22 : UNISCOPE 100 SYNCHRONOUS PROTOCOL * ON PTS 6810 * * ********************************************* * * EJECT * * * ENTRY POINTS * * ENTRY DC22AD ADDRESS BLOCK TERMINAL REQUESTS ENTRY IH2201 INPUT INTERRUPT ENTRY IH2202 OUTPUT INTERRUPT ENTRY DC22ON POWER ON ROUTINE ENTRY DCFC FILE CODE FOR DCTASK ENTRY DW2200 DWT FOR DC TASK * * * EXTERNAL REFERENCES * * EXTRN TDISP DISPATCHER ENTRY EXTRN SAVE8 SAVE A1-A8 ON A15 STACK EXTRN TENDIO COMPLETE I/O EVENT EXTRN DISIOE REQUEST ERROR EXTRN SETIME SET TIMER EXTRN DWTST DWT STATUS EXTRN DWTOR DWT ORDER EXTRN DWTECB DWT ECB EJECT * * * * * STANDARD INTERFACE PART FOR DATA COMMUNICATION * * * * * DWT CONTENTS * * DWTCHP TERMINAL ADDRESS AS GIVEN AT PARAMETER TRANSFER (BIT #08-#15) * DWTST BIT #00: NO REQUEST * DWTTP TIMERPOINTER, ORDER PROCESS * DWTWQ WRITE/GET BUFFER QUEUE * * * ECB PARAMETERS * * ECBBA EQU 2 BUFFER ADDRESS ECBRL EQU 4 REQUESTED LENGTH ECBEL EQU 6 EFFECTIVE LENGTH ECBRC EQU 8 RETURN CODE ECBCW EQU 10 CONTROL WORD EJECT * * DWT DISPLACEMENTS * DWTTP EQU /10 TIMER POINTER ORDER PROCESS DWTWQ EQU /12 WRITE/GET BUFFER QUEUE DWTBQ EQU /14 BUFFER QUEUE ANCHOR DWTBTP EQU /16 TIMER FOR BUFFER QUEUE AIDID EQU /18 LAST AI FOR THIS DWT SPRT1 EQU /1A PRINT MODE INDICATOR DIDLST EQU /1C DEVICES PRESENT * * * PARAMETERS FOR CONDITIONAL ASSEMBLY * * X:A EQU 128 RECEIVE BUFFER LENGTH RBUFL EQU X:A X:B EQU 128 TRANSMIT BUFFER LENGTH TBUFL EQU X:B X:C EQU /60 DCTASK FILE CODE DCFC EQU X:C X:D EQU 1 IF 1 INTERRUPT LOGGING LOGG EQU X:D X:E EQU 600 TIMPOL EQU X:E POLL TIME-OUT X:F EQU 4 RBUFNR EQU X:F NUMBER RECEIVE BUFFER X:G EQU 1 SUPPRESS NULL NULTST EQU X:G X:H EQU /02 CHLCIN EQU X:H CHLCUT EQU CHLCIN+/10 EJECT * * * REQUEST HANDLING * * * * PARAMETERS * * A7=ORDER * * /02: READ * /06: WRITE * /08: EXCHANGE * /22: RELEASE READ BUFFER * /31: GET WRITE BUFFER * /37: TRANSFER PARAMETERS * /38: SET STATUS * EJECT * * * CONSTANTS AND WORK AREAS * * DCONOF DATA 0 ON- / OFFLINESWITCH DCSTOL DATA 0 OLD DC EQUIPMENT STATUS DCSTCU DATA 0 CURRENT STATUS DCWRQ DATA 0 WRITE REQUEST QUEUE IFF TBUFL=0 DCGWQ DATA 0 GET BUFFER REQUEST QUEUE XIF DCSTQ DATA 0 THRU REQUEST QUEUE DCTPGP DATA 0 TIMER POINTER GENERAL POLL DC22DC DATA DCACTD ADDRESS BLOCK DC TASK DC22AD DATA DCACT ADDRESS BLOCK RES 15 SUBROUTINE STACK FOR INTERRUPTS STB RES 1 * BIT0 EQU /8000 STATUS AI NBIT0 EQU /7FFF STATUS AI EJECT * * * ACTIVATION FROM TERMINAL TASKS * DCACT EQU * LDK A1,0 PRESET RETURN CODE SUK A7,/02 RF(Z) DCRD READ SPECIFIC SUK A7,/06-/02 RF(Z) DCWR SUK A7,/08-/06 RF(Z) DCEX EXCHANGE SUK A7,/22-/08 RF(Z) DCRR RELEASE READ BUFFER SUK A7,/37-/22 RF(Z) DCTP TRANSFER PARAMETERS SUK A7,/38-/37 RF(Z) DCSST SET STATUS IFF TBUFL=0 ADK A7,/38-/31 RF(Z) DCGW GET WRITE BUFFER XIF RF DCA100 EJECT * * * ACTIVATION FROM DCTASK * * DCACTD EQU * SUK A7,/02 RF(E) DCRDDC READ SUK A7,/22-/02 RF(E) DCRR RELEASE READ BUFFER SUK A7,/37-/22 RF(E) DCTP TRANSFER PARAMETERS DCA100 EQU * REQUEST ERROR ABL DISIOE INVALID ORDER EJECT * * * READ FROM DCTASK * * * REQUEST FROM DC-TASK * COMPLETE WHEN: * STATUS CHANGE ON DC EQUIPMENT * SPONTANOUS MESSAGE RECEPTION * DCRDDC EQU * CF A15,CKMESS CHECK IF MESSAGE RECEIVED DCRTN EQU * ABL TDISP GO TO DISPATCHER EJECT * * * TRANSFER PARAMETERS * * * REQUEST FROM DC-TASK: TRANSFER TERMINAL COMPUTER ADDRESS * FROM TERMINALS: TRANSFER TERMINAL ADDRESSES * * DCTP LD A2,ECBCW,A8 GET PARAMETER LDR A1,A2 SUK A1,/70 SPECIFIC DID ? RF(L) DCTP20 NO LDK A3,DIDLST GET DEVICE LIST ADR A3,A6 DCTP05 EQU * LDR* A1,A3 RF(Z) DCTP10 FREE POSITION ? ADK A3,2 NO RB DCTP05 DCTP10 EQU * STR A2,A3 STORE DID IN LIST LDK A1,0 RF ENDIO DCTP20 EQU * STR A2,A6 SAVE IN FIRST WORD OF DWT EJECT * * HERE TO INTRODUCE DWT IN DC-TAB * IF DC-TASK NOT CONCERNED * CWK A6,DW2200 DC-TASK ? RF(E) ENDIO YES LD A1,DC:IN GET DC-TAB INPUT POINTER CWK A1,DC:END TABLE ALREADY FULL ? ABL(E) DISIOE YES REQUEST ERROR STR A6,A1 INSERT DWT IN DC-TAB LDK A1,2 ADS A1,DC:IN UPDATE DC-TAB INPUT POINTER ADS A1,DC:TAB INCREMENT DC-TAB LENGTH SUR A1,A1 RETURN CODE = 0 ENDIO EQU * CF A15,TENDIO COMPLETE REQUEST RB DCRTN EJECT * * * WRITE * * * COMPLETE WHEN: * SUCCESFUL TRANSMISSION * TIME OUT * * DCWR EQU * CF A15,TIMEWR SET TIMER CF A15,INSWQ QUEUE REQUEST RB DCRTN * EJECT * * * READ * * * COMPLETE WHEN: * MESSAGE RECEIVED * MESSAGE IN QUEUE * TIME OUT * * DCRD EQU * LD A1,DWTBQ,A6 CHECK BUFFER QUEUE RF(NZ) DCRD10 NOT EMPTY CF A15,TIMERE CHECK/SET TIMER RB DCRTN * * BUFFER WAITING IN QUEUE * DCRD10 EQU * LDR* A2,A1 GET NEXT ONE ST A2,DWTBQ,A6 STORE AS FIRST IN QUEUE ADK A1,6 ADJUST ADDRESS ST A1,ECBBA,A8 STORE IN ECB LD A4,-4,A1 GET LENGTH ST A4,ECBEL,A8 STORE IN ECB RF(NZ) DCRD11 * * BEL URGENCY ALARM * SUK A1,6 LDR A4,A1 RESTORE BUFFER ADDRESS CF A15,RRBUF RELEASE IT LDKL A1,/400 BEL INRETURN CODE CF A15,TENDIO RF DCRD12 DCRD11 EQU * LDK A1,0 CF A15,TENDIO COMPLETE READ REQUEST DCRD12 EQU * LD A1,DWTBQ,A6 RB(NZ) DCRTN LD A1,DWTBTP,A6 QUEUE EMPTY,STOP TIMING RB(Z) DCRTN CM* DWTBTP,A6 CM DWTBTP,A6 RB DCRTN DISPATCHER EJECT * * * GET WRITE BUFFER * * IFF TBUFL=0 * COMPLETE WHEN: * BUFFER BEEN ALOCATED * TIME OUT * * DCGW EQU * CF A15,GTBUF GET TRANSMIT BUFFER LDR A4,A4 RF(Z) DCGW10 NO FREE BUFFER ST A4,ECBBA,A8 LDK A1,0 RB ENDIO COMPLETE REQUEST DCGW10 EQU * CF A15,TIMERE START TIMER CF A15,INSGWQ QUEUE REQUEST RB DCRTN XIF EJECT * * * RELEASE READ BUFFER * * DCRR LD A4,ECBBA,A8 SUK A4,6 CF A15,RRBUF DCRR1 EQU * LDK A1,0 CF A15,TENDIO COMPLETE RRBUF REQUEST RB DCRTN EJECT * * * EXCHANGE * * * * COMPLETE WHEN: * MESSAGE PASSED TO TERMINAL * TIME OUT * DCEX EQU * RB DCWR SAME INITIALIZATION AS WRITE EJECT * * * SET STATUS * COMPLETE WHEN: * STATUS SET: DEVICE OPERATIONAL OR NOT * TERMINAL READY * * BIT1 IN CW:TRANSFER FUNCTION CODE * DCSST EQU * LD A8,DWTECB,A6 LD A1,ECBCW,A8 GET STATUS LDR A2,A1 ANKL A2,/FF00 FUNCTION CODE ? CWK A2,/4000 RF(E) DCSST4 YES LDR A1,A1 RF(NZ) DCSST1 BUSY RF(Z) DCSST0 OK DCSSTX EQU * ABL DISIOE DCSST0 EQU * LD A1,DWTST,A6 ANKL A1,BUSYFL RB(Z) DCRR1 STATUS ALREADY SET LDK A1,/FE ANS A1,DWTST,A6 SET DEVICE READY LDKL A2,DCSTQ GET THRU QUEUE ANCHOR CF A15,INSWQ1 INSERT DWT IN QUEUE LDK A2,6 ST A2,DWTOR,A6 REPLACE ORDER CM ECBRL,A8 ABL DCRTN DISPATCHER DCSST1 EQU * LD A1,ECBCW,A8 ANKL A1,NBIT0 IGNORE STATUS BIT LDK A3,DIDLST ADR A3,A6 DCSST2 EQU * LDR* A2,A3 GET AI RB(Z) DCSSTX END OF LIST ANKL A2,NBIT0 CWR A1,A2 COMPARE AI RF(E) DCSST3 OK,AI FOUND ADK A3,2 RB DCSST2 GO ON SEARCHING DCSST3 EQU * LD A1,ECBCW,A8 STR A1,A3 SET DEVICE STATUS RB DCRR1 * * FUNCTION KEY * DCSST4 EQU * CM ECBRL,A8 CLEAR REQUESTED LENGTH LDK A2,6 ST A2,DWTOR,A6 REPLACE ORDER RB DCWR EJECT * * * * TIMER HANDLING PART * * * * READ TIMER=TIMERR * TIMERE EQU * LDR A1,A6 LD A2,ECBCW,A8 GET TIMEOUT VALUE RF(Z) TIME10 NO TIMING ST A2,TIMERR CF A15,SETIME DATA TOUTRE TIMERR DATA 0 ST A4,DWTTP,A6 STORE TIMER POINTER TIME10 EQU * RF GBUF10 RETURN * * TIMEOUT READ TIMER * TOUTRE EQU * LDR A6,A1 FETCH DWT CM DWTTP,A6 IFF TBUFL=0 CF A15,REMOVG REMOVE FROM QUEUE XIF TOUTR1 EQU * LDK A1,/40 INDICATE TIME OUT LD A2,DWTOR,A6 CHECK IF EXCHANGE ORDER SUK A2,8 RF(NZ) TOUTR2 NOT EXCHANGE ORK A1,2 RETURN CODE /42 AT EXCHANGE TIME OUT TOUTR2 ABL ENDIO COMPLETE REQUEST * * WRITE TIMER=TIMWR * TIMEWR LDR A1,A6 LD A2,ECBCW,A8 GET TIMEOUT VALUE RB(Z) TIME10 NO TIMING ST A2,TIMWR CF A15,SETIME DATA TOUTWR TIMWR DATA 0 ST A4,DWTTP,A6 RB TIME10 * * TIMEOUT WRITE TIMER * TOUTWR EQU * LDR A6,A1 FETCH DWT CM DWTTP,A6 LD A1,DWTOR,A6 GET ORDER SUK A1,6 RF(Z) TOUT10 WRITE SUK A1,2 RB(NZ) TOUTR1 ORDER IS NOT EXCHANGE TOUT10 LD A2,DWTECB,A6 LD A4,ECBBA,A2 FETCH BUFFER IFF TBUFL=0 CF A15,RTBUF RELEASE TRANSMITBUFFER CF A15,CKGBQ CHECK GET BUFFER QUEUE CF A15,REMOVW REMOVE FROM WRITE QUEUE XIF RB TOUTR1 EJECT * * * STOP REQUEST TIMING * * REMAINING TIME IS RETURNED IN A2 * * CTIME EQU * LD A2,DWTTP,A6 GET TIMER POINTER RF(Z) CTIM10 NOT RUNNING LDR* A2,A2 NGR A2,A2 GET REMAINING TIME CM* DWTTP,A6 STOP TIMER CM DWTTP,A6 CTIM10 EQU * RTN A5 EJECT * * GET RECEIVE BUFFER * * CALLING SEQUENCE: CF A15,GRBUF * A4=0 IF NO BUFFER IS FREE * ELSE A4 CONTAINS BUFFER ADDRESS * A2 AND A3 ARE DESTROYED * * GRBUF LDKL A2,DCRBUF RECEIVE BUFFERS GBUF INH LDR* A4,A2 RF(Z) GBUF10 NO BUFFER FREE LDR* A3,A4 REMOVE BUFFER FROM FREE CHAIN STR A3,A2 GBUF10 ADKL A15,4 ADJUST STACK POINTER ABR* A15 RETURN TO CALLER * * * GET TRANSMIT BUFFER * IFF TBUFL=0 * CALLING SEQUENCE: CF A15,GTBUF * A4=0 IF NO BUFFER IS FREE * ELSE A4 CONTAINS BUFFER ADDRESS * A2 AND A3 ARE DESTROYED * * GTBUF LDKL A2,DCTBUF TRANSMIT BUFFERS RB GBUF EJECT * * * CHECK GET BUFFER QUEUE * * CKGBQ EQU * LDR A7,A6 SAVE A6 LD A6,DCGWQ GET QUEUE ANCHOR RF(Z) CKG110 NO ONE ON QUEUE SUK A6,DWTWQ LD A2,DWTST,A6 RF(N) CKG100 NO REQUEST LD A2,DWTOR,A6 SUK A2,/31 RF(NZ) CKG100 NO GET BUFFER REQUEST CF A15,GTBUF GET TRANSMIT BUFFER LDR A4,A4 RF(Z) CKG110 NO BUFFER FREE LD A3,DWTECB,A6 ST A4,ECBBA,A3 STORE BUFFER ADDRESS LDK A1,0 CF A15,TENDIO COMPLETE REQUEST CKG100 EQU * CF A15,REMOVG REMOVE FROM QUEUE CKG110 EQU * LDR A6,A7 RESTORE A6 RB GBUF10 RETURN XIF EJECT * * * RELEASE RECEIVE BUFFER * * A4 CONTAINS BUFFER ADDRESS * CALLING SEQUENCE: CF A15,RRBUF * A2 AND A3 ARE DESTROYED * * RRBUF LDKL A2,DCRBUF RECEIVE BUFFERS RBUF INH RBUF10 EQU * LDR* A3,A2 RF(Z) RBUF20 LDR A2,A3 RB RBUF10 RBUF20 EQU * STR A4,A2 CMR A4 RB GBUF10 RETURN TO CALLER * * * RELEASE TRANSMIT BUFFER * IFF TBUFL=0 * A4 CONTAINS BUFFER ADDRESS * CALLING SEQUENCE: CF A15,RTBUF * A2 AND A3 ARE DESTROYED * * RTBUF LDKL A2,DCTBUF TRANSMIT BUFFERS CWK A4,BUFT1 DRIVER BUFFER ? RB(E) RBUF YES CWK A4,BUFT2 DRIVER BUFFER ? RB(E) RBUF YES RB GBUF10 NO XIF EJECT * * * INSERT DWT IN WRITE REQUEST QUEUE * * A2,A3,A4 DESTROYED * A6=DWT * INSWQ LDKL A2,DCWRQ GET QUEUE ANCHOR INSWQ1 LDK A4,DWTWQ INSWQ2 LDR* A3,A2 RF(Z) INSWQ3 END OF QUEUE FOUND LDR A2,A3 RB INSWQ2 INSWQ3 ADR A4,A6 STR A4,A2 INSERT IN QUEUE CMR A4 INDICATE END OF QUEUE RB GBUF10 RETURN * * * REMOVE DWT FROM WRITE REQUEST QUEUE * * A2,A3,A4 DESTROYED * A6=DWT * REMOVW LDKL A2,DCWRQ GET QUEUE ANCHOR REM05 LDK A4,DWTWQ GET DWT-LINK TO BE REMOVED ADR A4,A6 REM10 LDR* A3,A2 RB(Z) GBUF10 NOT ON QUEUE: RETURN CWR A3,A4 RF(E) REM15 LDR A2,A3 GET NEXT RB REM10 REM15 LDR* A3,A4 REMOVE STR A3,A2 RB GBUF10 RETURN EJECT * * * * INSERT DWT IN GET WRITE BUFFER QUEUE * IFF TBUFL=0 * A2,A3,A4 DESTROYED * A6=DWT * INSGWQ LDKL A2,DCGWQ GET QUEUE ANCHOR RB INSWQ1 * * * REMOVE DWT FROM GET WRITE BUFFER QUEUE * * A2,A3,A4 DESTROYED * A6=DWT * REMOVG LDKL A2,DCGWQ GET QUEUE ANCHOR RB REM05 XIF EJECT * * * QUEUE ALLOCATED RECEIVE BUFFER * * A4=BUFFER ADDR * A2,A3 DESTROYED * QRBUF EQU * LDKL A2,DW2200+DWTWQ BEGINNING OF RECEIVE QUEUE QR100 EQU * LDR* A3,A2 RF(Z) QR200 END OF QUEUE FOUND LDR A2,A3 RB QR100 QR200 STR A4,A2 INSERT INTO QUEUE CMR A4 INDICATE END OF QUEUE RTN A5 EJECT * * * CHECK IF UNEXPECTED MESSAGE OR STATUS CHANGE * * REGISTERS A1,A2,A3,A4,A6 AND A8 ARE DESTROYED * CKMESS LDKL A6,DW2200 LD A1,DWTST,A6 RF(N) CKM110 NO REQUEST LDK A1,2 READ REQUEST ? CW A1,DWTOR,A6 RF(NE) CKM110 NO LD A8,DWTECB,A6 ECB ADDR TO A8 LD A3,DWTWQ,A6 A3=ADDR TO READ QUEUE RF(Z) CKM200 NO READ IN QUEUE LDR* A2,A3 A2=ADDR TO NEXT READ BUFFER ST A2,DWTWQ,A6 STORE THIS ADDR INTO QUEUE ADK A3,6 MOVE POINTER TO TEXT ST A3,ECBBA,A8 SAVE THIS ADDR IN ECB LD A4,-4,A3 ST A4,ECBEL,A8 STORE NUMBERS OF CHARACTERS LD A4,-2,A3 ST A4,ECBCW,A8 STORE LINE DEVICE ADDRESS LDK A1,0 PARAMETER=OK CKM100 CF A15,TENDIO COMPLETE READ GENERAL REQUEST CKM110 ADKL A15,4 ADJUST STACK POINTER ABR* A15 RETURN CKM200 LD A1,DCSTCU NO MESSAGE RECEIVED,CHECK STATUS OR A1,DCONOF TAKE CARE OF POLL TIME OUT CW A1,DCSTOL ST A1,DCSTOL RB(E) CKM110 NO CHANGE OF STATUS ORKL A1,/2000 INDICATE STATUS CHANGE RB CKM100 EJECT * * * STORE REGISTER A3-A8 * CALLING SEQUENSE: CF A15,STREG * * RESTORE * CALLING SEQUENCE: CF A15,LDREG * * STREG ST A3,LCA3 ST A4,LCA4 ST A5,LCA5 ST A6,LCA6 ST A7,LCA7 ST A8,LCA8 RF RTNA15 RETURN EJECT LDREG LDKL A3,0 LCA3 EQU *-2 LDKL A4,0 LCA4 EQU *-2 LDKL A5,0 LCA5 EQU *-2 LDKL A6,0 LCA6 EQU *-2 LDKL A7,0 LCA7 EQU *-2 LDKL A8,0 LCA8 EQU *-2 RTNA15 EQU * ADKL A15,4 ABR* A15 EJECT * * * * TIMER VALUES * * TIMBUF EQU 1800 180 S * * * CHARACTER EQUATES * * SYN EQU /16 SOH EQU /01 STX EQU /02 ETX EQU /03 SID EQU /50 DID EQU /70 GRID EQU /20 DLE EQU /10 ACK1 EQU /31 WABT EQU /3F DC2 EQU /12 CHDSL EQU /72 EJECT * * * PROCEDURE WORK AREAS * * FDWTIN DATA 0 CURRENT DWT FOR RECEPTION FDWTUT DATA 0 CURRENT DWT FOR TRANSMISSION XACK DATA 0 ACK EXPECTED TACK DATA 0 ACK TO BE TRANSMITTED WPOLL DATA 0 WAIT FOR POLL TWABT DATA 0 WABT TO BE TRANSMITTED HEADER DATA 0,0 HEADER STORAGE AREA * FECB RES 1 WRITING ECB FECBBA RES 1 WRITING BUFFER ADDRESS FECBRL RES 1 WRITING BUFFER LENGTH FSID RES 1 RESPONDING SID FDID RES 1 RESPONDING DID NAKCNT RES 1 NAK COUNTER * TSTENQ DATA 0 RECOVERY FLAG COUNT DATA 0 CHARACTERS TO BE SAVED * ZRECOV RES 6 SAVE TRANSMIT HEADER LSEND RES 1 LAST TRANSMIT ADDRESS * BUSYFL EQU 1 BUSY FLAG (BIT 15 IN DWT) * SPRINT DATA 0 PRINT STATEMENT DWTTXT DATA 0 LAST DWT FOR TEXT SREADY DATA 0 SELECTION+TEXT DIDREA DATA 0 SELECTED DID EJECT * * STRING EQU * FRAME STRINGS DATA 0,0 TRAFFIC POLL WITHOUT ACK DATA /1031,0 TRAFFIC POLL WITH ACK DATA /0500,0 STATUS POLL WITHOUT ACK DATA /1031,/0500 STATUS POLL WITH ACK DATA /1015,0 RETRANSMIT REQUEST STRINE EQU * END OF STRINGS * * FRAME EQU * BRANCH TABLE FOR FRAMES DATA TP TRAFFIC POLL WITHOUT ACK DATA TPA TRAFFIC POLL WITH ACK DATA SP SPECIFIC POLL WITHOUT ACK DATA SPA SPECIFIC POLL WITH ACK DATA RT RETRANSMIT REQUEST EJECT * * OUTPUT SOFTWARE MESSAGES * * DCSTR1 DATA 0 WORK AREA FOR NO TRAFFIC+ACK DCSTRX DATA 0 SAVE LAST SID TEXT DCSTR3 DATA /1030,0 TRAFFIC DCSTR4 DATA /1005,0 REPLY REQUEST DCSTR5 DATA /0404,0 NO TRAFFIC DCSTR6 DATA /103E,0 DEVICE READY DCSTR7 DATA /103B,0 THRU DCSTR8 DATA /103D,0 DEVICE NOT OPERABLE DCSTR9 DATA 0 REQUEST PROCESSOR MESSAGE EJECT * * * RECEIVE A FRAME AND DECODE IT * * BRM LDKL A5,STB LOAD STACK BASE FOR A5 LDKL A2,/100+SYN SPECIFY SYN PATTERN CIO A2,1,CHLCIN START RECEIVER BRM100 CF A5,READ READ CHARACTER SUK A2,SOH RF(E) BRM200 SOH SUK A2,/FF-SOH RB(NE) BRM100 NOT /FF CF A5,READ READ CHARACTER CWK A2,/FF RB(NE) BRM100 NOT ANOTHER /FF ABL BRM910 HALT INPUT AND RESYNCHRONIZE * * SOH RECEIVED * BRM200 LDK A7,0 CLEAR BCC CF A5,READP READ RID=TC ABL(NZ) BRM900 PARITY ERROR CW A2,DW2200 CHECK IF THIS TC RF(E) BRM201 CWK A2,GRID GENERAL RID ? ABL(NE) BRM900 NOT THIS TC: RESYNCHRONIZE BRM201 EQU * CF A5,READP READ SID=SUBTERMINAL ADDRESS ABL(NZ) BRM900 PARITY ERROR ST A2,FSID SAVE SUBTERMINAL ADDRESS CF A5,FINTER FIND SUBTERMINAL ADDRESS LDR A3,A3 SET CONDITION REGISTER RF(N) BRM205 DONT INIT DWT IF GENERAL SID ST A3,FDWTIN AND STORE IT BRM205 EQU * SUK A2,SID RF(Z) BRM210 GENERAL SID LDR A3,A3 ABL(Z) BRM900 SID UNKNOWN BRM210 EQU * CF A5,READP ABL(NZ) BRM900 PARITY ERROR ST A2,FDID SAVE DID CM HEADER CLEAR HEADER CONTENTS CM HEADER+2 LDK A3,0 RESET CHARACTER COUNTER BRM220 CF A5,READP READ CHARACTER ABL(NZ) BRM900 PARITY ERROR CWK A2,STX RF(E) BRM300 STX: TEXT FRAME CWK A2,ETX RF(E) BRM250 ETX: ANALYZE HEADER CWK A3,4 ABL(G) BRM900 HEADER OVEABLLOW SC A2,HEADER,A3 STORE CHARACTER ADK A3,1 INCREMENT POINTER RB BRM220 BRM250 CF A5,READP READ BCC ABL(NZ) BRM910 PARITY ERROR ANK A7,/7F MASK BCC PARITY BIT ABL(NZ) BRM910 BCC ERROR CF A5,HALTIN HALT INPUT EJECT * * * ANALYZE CONTROL SEQUENCE * * LD A1,HEADER GET HEADER LD A2,HEADER+2 LDK A3,0 FIND HEADER TYPE LDKL A4,STRING BRM260 CWR* A1,A4 RF(NE) BRM270 CW A2,2,A4 ABI(E) FRAME,A3 TYPE FOUND: BRANCH TO HANDLER BRM270 ADK A3,2 ADK A4,4 INCREMENT STRING POINTER CWK A4,STRINE RB(NE) BRM260 TRY NEXT RB BRM INVALID HEADER EJECT * * * RECEIVE TEXT * * BRM300 LD A6,FDWTIN RF(Z) BRM900 INVALID SUBTERMINAL ADDRESS LD A4,DCRBUF RF(Z) BRM900 NO BUFFER AVAILABLE LD A1,WPOLL RF(NZ) BRM900 MUST BE A POLL LD A1,DWTST,A6 ANK A1,BUSYFL RF(NZ) BRM900 DONT ACCEPT TEXT IF BUSY ADK A4,6 RESERVE 3 WORDS AT BEGIN LDK A3,0 RESET BUFFER INDEX BRM310 CF A5,READP READ CHARACTER RF(NZ) BRM900 PARITY ERROR CWK A2,DC2 PRINT COMMAND ? RF(E) BRM315 YES CWK A2,ETX RF(E) BRM350 ETX RECEIVED CWK A2,SYN RF(NE) BRM320 NOT SYN, NOT TO BE SKIPPED XRR A7,A2 ADJUST BCC RB BRM310 EJECT * * PRINT COMMAND DETECTED * BRM315 EQU * IM SPRINT INIT PRINT FLAG FOR FOLLOWING POLL LDK A1,BUSYFL ORS A1,DWTST,A6 SET BUSY SUB-TRMNL * * TAKE CARE OF FAST SELECTION * LD A1,FDID SUK A1,DID RF(Z) BRM318 LD A1,FDID ST A1,AIDID,A6 INIT AI DEVICE BRM318 EQU * * * STORE INCOMMING CHARACTER IN BUFFER * DC2 WILL BE TAKEN * BRM320 EQU * IFT NULTST=0 CWK A2,0 NULL ? RB(E)BRM310 YES SUPPRESS IT XIF CWK A3,RBUFL+RBUFL RF(G) BRM900 BUFFER OVERFLOW LDR A1,A4 ADR A1,A3 COMPUTE BUFFER ADDRESS SCR A2,A1 STORE CHARACTER ADK A3,1 INCREMENT INDEX RB BRM310 EJECT * * ETX DETECTED,STORE DID IN MESSAGE * BRM350 EQU * LDK A2,DID LD A1,SPRINT PRINT ASKED ? RF(Z) BRM355 NO LD A2,AIDID,A6 YES,GET SELECTED DEVICE BRM355 EQU * LC A1,HEADER CWK A1,/07 BEL ? RF(E) BRM356 YES,MESSAGE NUL CWK A3,RBUFL+RBUFL RF(G) BRM900 BUFFER OVERFLOW LDR A1,A4 ADR A1,A3 BUFFER ADDRESS SCR A2,A1 STORE CHARACTER ADK A3,1 UPDATE LENGTH * BRM356 EQU * CF A5,READP READ BCC RF(NZ) BRM910 PARITY ERROR ANK A7,/7F MASK BCC PARITY BIT RF(NZ) BRM910 BCC ERROR IM WPOLL SET WAIT FOR POLL ST A3,-4,A4 STORE LENGTH LD* A2,FDWTIN GET SUBTERMINAL ADDRESS ST A2,-2,A4 AND STORE IN BUFFER CF A5,HALTIN HALT INPUT CF A15,GRBUF ALLOCATE RECEIVE BUFFER LD A1,DCRBUF BUFFER SHORTAGE ? RF(Z) BRM370 YES LD A1,SPRINT RF(NZ) BRM370 SET WABT IM TACK ACK TO BE SENT BRM360 EQU * ADK A4,6 ADJUST BUFFER POINTER RF TEXT PROCESS TEXT * * LACK OF BUFFER,SET TRANSMIT WABT * BRM370 EQU * IM TWABT RB BRM360 EJECT * * * ERROR: WAIT FOR TWO /FF CONSECUTIVE * * BRM800 EQU * LDKL A5,STB LDKL A2,/100+SYN CIO A2,1,CHLCIN BRM900 CF A5,READ SUK A2,/FF RB(NZ) BRM900 NOT /FF CF A5,READ READ CHARACTER SUK A2,/FF RB(NZ) BRM900 NOT SECOND /FF BRM910 CF A5,HALTIN HALT INPUT AND RESYNCHRONIZE ABL BRM EJECT * * * TEXT RECEIVED * * TEXT EQU * LD A2,FSID ST A2,DCSTRX SAVE SID TEXT LD A6,FDWTIN GET INPUT DWT ST A6,DWTTXT LD A2,DWTST,A6 GET STATUS RF(N) TEX200 NO REQUEST LDK A2,2 CW A2,DWTOR,A6 RF(NE) TEX200 NO READ REQUEST LDK A1,0 COMPLETE READ REQUEST WITH RC=0 LD A8,DWTECB,A6 GET ECB ADDRESS ST A4,ECBBA,A8 STORE BUFFER ADDRESS IN ECB LD A3,-4,A4 GET LENGTH ST A3,ECBEL,A8 STORE EFFECTIVE LENGTH RF(NZ) TEX100 SUK A4,6 RESTORE BUFFER ADDRESS CF A15,RRBUF RELEASE IT LDKL A1,/400 BEL IN RETURN CODE TEX100 EQU * CF A5,CTIME STOP TIMER ST A2,ECBCW,A8 STORE REMAINING TIME CF A15,TENDIO COMPLETE REQUEST RF TEX205 TEX200 SUK A4,6 BASE OF BUFFER LDK A2,DWTBQ GET PROPER QUEUE ADR A2,A6 CF A5,QR100 LD A1,DWTBQ,A6 LDR* A2,A1 FIRST IN QUEUE RF(NZ) TEX205 LDR A1,A6 CF A15,SETIME START BUF SUPERVISOR TIMER DATA TEX210,TIMBUF ST A4,DWTBTP,A6 TEX205 EQU * LD A1,FDID SUK A1,DID RF(Z) TEX206 * * FORCE SELECT ANSWER * IF DC2,FORCE WABT * LD A1,SPRINT RF(NZ) TEX206 PRINT WITH FAST SELECTION IM SREADY FORCE SELECT ANSWER LD A1,FDID ST A1,DIDREA TEX206 EQU * ABL BRM * * TIME-OUT ENTRY * TEX210 EQU * LDR A6,A1 GET DWT CM DWTBTP,A6 LD A1,DWTBQ,A6 GET ANCHOR RF(Z) TEX250 CM DWTBQ,A6 CLEAR QUEUE ANCHOR LDKL A2,DW2200+DWTWQ DC TASK QUEUE ANCHOR TEX220 EQU * LDR* A3,A2 RF(Z) TEX230 END OF QUEUE LDR A2,A3 RB TEX220 TEX230 EQU * STR A1,A2 INSERT QUEUE IN DC CF A15,CKMESS COMPLETE DC TEX250 EQU * ABL TDISP EJECT * * * STATUS POLL: GENERAL AND SPECIFIC * * SP EQU * CM WPOLL CLEAR WAIT FOR POLL LD A2,XACK STATUS POLL WITHOUT ACK RF(Z) SPA200 ACK NOT EXPECTED CF A5,TRRPRQ SEND REPLY REQUEST SP100 ABL BRM SPA EQU * STATUS POLL WITH ACK CM WPOLL CLEAR WAIT FOR POLL LDK A1,0 RETURN CODE = 0 CF A5,CWRITE CHECK IF WRITE REQUEST IS TO BE COMPLETED SPA200 EQU * CF A5,CPTIM RESET POLL TIMER SPA300 EQU * LD A2,FSID GET SID SUK A2,SID GENERAL SID ? RF(NZ) SPA350 NO,SPECIFIC CHECK IT EJECT * * SEND TRAFFIC ON GENERAL STATUS POLL IF REQUIRED * LD A1,SREADY RF(Z) SPA301 CF A5,SETREA ABL TPA400 SELECT DEVICE SPA301 EQU * LD A1,SPRINT RF(Z) SPA302 CF A5,FRWABT PRINT MODE SPA302 EQU * LD A6,DCSTQ ABL(NZ) TPA305 SEND THRU SPA305 EQU * LD A6,DCWRQ GET QUEUE ANCHOR RF(Z) SPA500 NO TRAFFIC SUK A6,DWTWQ GET DWT ADDRESS SPA330 EQU * LDR* A2,A6 GET SUBTERMINAL ST A2,FSID STORE SID LDK A2,DID ST A2,FDID RESTORE DID CF A5,TRTRAF SEND TRAFFIC RB SP100 * EJECT * SPECIFIC STATUS POLL * SPA350 EQU * LD A1,SREADY RF(NZ) SPA700 SELECT DEVICE LD A1,SPRINT RF(NZ) SPA600 PRINT STATEMENT LD A6,FDWTIN RESTORE DWT LD A1,SPRT1,A6 PRINT IN PROGRESS ? RF(NZ) TPA201 YES SPA360 EQU * LD A1,FDID SUK A1,DID SELECTION OR DESELECTION ? ABL(NZ) TPA400 YES LD A1,DWTST,A6 GET STATUS RF(N) SPA500 NO ORDER ON LD A1,DWTOR,A6 GET ORDER SUK A1,/06 WRITE ? RF(NZ) SPA500 NO,NO TRAFFIC RB SPA330 TRAFFIC FOR THIS DWT SPA500 CF A5,TRNOTR SEND NO TRAFFIC RB SP100 SPA600 EQU * LD A1,DWTTXT CW A1,FDWTIN ABL(NE) BRM MUST BE FOR THE SAME TERMINAL CF A5,FRWABT SET WABT RB SPA360 * SPA700 EQU * LD A1,DWTTXT CW A1,FDWTIN ABL(NE) BRM CF A5,SETREA ABL TPA400 EJECT * * * TRAFFIC POLL * * TP EQU * TRAFFIC POLL WITHOUT ACK CM WPOLL CLEAR WAIT FOR POLL LD A2,XACK RF(Z) TPA200 NO ACK EXPECTED CF A5,TRRPRQ SEND REPLY REQUEST RB SP100 TPA EQU * TRAFFIC POLL WITH ACK CM WPOLL CLEAR WAIT FOR POLL LDK A1,0 RETURN CODE = 0 CF A5,CWRITE CHECK IF WRITE IS TO BE COMPLETED TPA200 EQU * * * CHECK IF SPECIFIC OR GENERAL SID * LD A2,FSID GET SID SUK A2,SID GENERAL SID ? RF(Z) TPA300 YES * * HERE ON SPECIFIC SID,TEST IF SPECIFIC DID * LD A1,FDID GET DID SUK A1,DID GENERAL DID ? ABL(NZ) TPA400 NO,SELECT AI DEVICE EJECT * * SPECIFIC TRAFFIC POLL * TEST IF PRINT MODE * LD A1,SREADY RF(NZ) TPA207 SELECT DEVICE LD A1,SPRINT RF(NZ) TPA206 PRINT STATEMENT LD A6,FDWTIN GET DWT LD A1,SPRT1,A6 RF(Z) TPA203 NO PRINT MODE TPA201 EQU * LD A1,AIDID,A6 ST A1,FDID INIT AI DEVICE ADDRESS LD A1,DWTST,A6 ANK A1,BUSYFL RF(Z) TPA306 NOT BUSY IM TWABT CF A5,TRNOTR ABL SP100 RETURN AFTER TRANSMIT BUSY TPA203 EQU * LD A1,DWTST,A6 GET STATUS RB(N) SPA500 NO ORDER ON LD A1,DWTOR,A6 GET ORDER SUK A1,/06 WRITE ORDER ? RB(NZ) SPA500 NOTHING TO SEND,NO TRAFFIC EJECT * * SEND TEXT ON SPECIFIC TRAFFIC POLL * TPA205 EQU * ST A6,FDWTUT WRITING DWT LD A8,DWTECB,A6 GET ECB ADDRESS ST A8,FECB LD A2,ECBBA,A8 GET BUFFER ADDRESS ST A2,FECBBA LD A2,ECBRL,A8 GET REQUESTED LENGTH RF(Z) TPA210 PROCESS KEY ST A2,FECBRL CM NAKCNT CLEAR NAK COUNTER CF A5,TRTEXT TRANSMIT TEXT IM XACK ACK EXPECTED ABL SP100 TPA206 EQU * LD A1,DWTTXT CW A1,FDWTIN ABL(NE) BRM MUST BE FOR THE SAME TERMINAL CF A5,FRWABT SET WABT RB TPA203 TPA207 EQU * LD A1,DWTTXT CW A1,FDWTIN ABL(NE) BRM CF A5,SETREA RF TPA400 TPA210 EQU * LD A1,ECBCW,A8 GET FUNCTION CODE ANKL A1,/FF SC A1,DCSTR9 INIT TRANSFER FIELD CF A5,TRSFCN TRANSFER FUNCTION KEY ABL SP100 EJECT * * GENERAL TRAFFIC POLL DETECTED * TPA300 EQU * * * TEST IF PRINT SEQUENCE INITIATED * LD A1,SREADY RF(Z) TPA301 CF A5,SETREA ABL TPA400 TPA301 EQU * LD A1,SPRINT RF(Z) TPA302 CF A5,FRWABT INIT WABT TPA302 EQU * LD A6,DCSTQ RF(Z) TPA315 NO PENDING THRU TPA305 EQU * SUK A6,DWTWQ ST A6,FDWTUT INIT OUTPUT DWT LD A1,AIDID,A6 GET DID ST A1,FDID LDR* A1,A6 ST A1,FSID TPA306 EQU * CF A5,TRTHRU SEND THRU CM SPRT1,A6 ABL SP100 TPA315 EQU * LD A6,DCWRQ GET QUEUE ANCHOR ABL(Z) SPA500 NO TRAFFIC SUK A6,DWTWQ GET DWT ADDRESS LDR* A2,A6 INIT SID ST A2,FSID LDK A2,DID ST A2,FDID RESTORE GENERAL DID RB TPA205 SEND FIRST TEXT IN QUEUE EJECT * * FORCE WABT ANSWER(WITH SPECIFIC DID) * ON POLL FOLLOWING TEXT+DC2 (PRINT) * FRWABT EQU * LD A6,FDWTIN RESTORE LAST DWT CM SPRINT RESTORE PRINT FLAG LD A1,AIDID,A6 GET SPECIFIC DID ST A1,FDID STORE IT TO BE SEND IM SPRT1,A6 INIT WABT-THRU INDICATOR RTN A5 * * INIT DEVICE (SID,DID) * SETREA EQU * LD A1,DIDREA ST A1,FDID LD A1,DCSTRX ST A1,FSID RTN A5 EJECT * * SELECT AI DEVICE * TPA400 EQU * * * TEST IF DID IS VALID * CF A5,DESEL EXAMINE EVENTUAL DESELECTION CM SREADY CLEAR READY TO SEND LD A6,FDWTIN GET DWT LD A1,DWTST,A6 TERMINAL BUSY ? ANKL A1,BUSYFL ABL(NZ) BRM YES,DONT ACCEPT ANY SELECT LD A1,FDID GET RECEIVED DID LDK A3,DIDLST GET DEVICE LIST ADR A3,A6 TPA403 EQU * LDR* A2,A3 GET DID IN LIST ABL(Z) BRM END OF LIST ANKL A2,NBIT0 IGNORE STATUS CWR A1,A2 OK ? RF(E) TPA405 YES,DID RECOGNIZED ADK A3,2 RB TPA403 EJECT * * DID OK,FETCH APPROPRIATE DEVICE STATUS * TPA405 EQU * ST A1,AIDID,A6 SAVE AI ADDRESS LDR* A2,A3 GET AI STATUS ANKL A2,BIT0 AI OPERABLE ? RF(NZ) TPA500 NO * * DEVICE READY * CF A5,TREADY ABL SP100 * * DEVICE NOT OPERABLE * TPA500 EQU * CF A5,TRNOP ABL SP100 EJECT * * DESELECT DEVICE IF REQUIRED * RECOVERY DID=/72 * RELEASE TERMINAL BY RESETTING STATUS BUSY * DESEL EQU * LD A1,FDID CWK A1,CHDSL DESELECTION ? RF(E) DESEL1 RTN A5 NO DESEL1 EQU * DESELECTION,RESTORE TERMINAL CM SPRT1,A6 RESET WABT-THRU INDICATOR LDK A1,/FE ANS A1,DWTST,A6 RESET TERMINAL BUSY CF A5,TRNOP SEND NO TRAFFIC RTN A5 EJECT * * * RETRANSMIT REQUEST * * RT EQU * LD A1,XACK ABL(Z) BRM IGNORE NACK IF NOT ACK EXPECTED LD A1,ZRECOV+4 CW A1,FSID ABL(NE) BRM NOT PROPER SID LD A6,FDWTUT RF(Z) RT150 NO TEXT TO RETRANSMIT LD A8,DWTECB,A6 RESTORE ECB ADDRESS LD A1,ECBRL,A8 THRU,FKEY ? RF(Z) RT150 YES IM NAKCNT COUNT NAK:S LD A2,NAKCNT SUK A2,4 RF(Z) RT100 4 NAK:S RECEIVED IM TSTENQ CF A5,TRTEXT RETRANSMIT TEXT ABL SP100 RT100 LDK A1,2 4 NAK:S: THROUGHPUT ERROR CF A5,CWRITE COMPLETE WRITE REQUEST IF ANY ABL SP100 EJECT * * HERE RECOVERY ON LAST MESSAGE * TEXT EXCLUDED * RT150 EQU * IM TSTENQ CFI A5,LSEND RETURN TO LAST STATUS ABL BRM EJECT * * * CHECK IF THERE IS A WRITE REQUEST TO BE COMPLETED * * A1 CONTAINS RETURN CODE * * CWRITE LD A2,XACK RF(Z) CWR900 NOTHING SENT YET CM XACK NO ACK EXPECTED LD A6,FDWTUT RF(Z) CWR900 NO WRITE GOING ON LD A2,DWTST,A6 RF(N) CWR250 NO REQUEST LD A2,DWTOR,A6 GET ORDER SUK A2,6 RF(Z) CWR100 WRITE REQUEST SUK A2,2 RF(NZ) CWR250 NOT EXCHANGE REQUEST LDR A1,A1 RF(NZ) CWR100 TRANSMISSION ERROR, RC NOT ZERO LDK A2,2 TRANMISSION OK ST A2,DWTOR,A6 INDICATE READ ORDER RF CWR200 CWR100 CF A5,CTIME ******UD 19 08 76 ******* CF A15,TENDIO COMPLETE REQUEST LD A2,DCSTQ THRU IN QUEUE RF(Z) CWR101 NO LDKL A2,DCSTQ INIT QUEUE ANCHOR CF A15,REM05 RF CWR250 CWR101 EQU * CF A15,REMOVW REMOVE FROM WRITE QUEUE CWR200 EQU * IFF TBUFL=0 LD A4,FECBBA GET BUFFER ADDRESS CF A15,RTBUF RELEASE TRANSMIT BUFFER CF A15,CKGBQ CHECK GET BUFFER QUEUE XIF CWR250 CM FDWTUT NO WRITE GOING ON CWR900 EQU * RTN A5 EJECT * * * TRANSMIT PROCEDURE RESPONSES * * TRACK EQU * LDKL A4,DCSTR1 NO TRAFFIC WITH ACK IM XACK LDKL A1,TRACK ST A1,LSEND RF TRCTRL * * ACK NOT RECEIVED SEND ENQ * TRRPRQ EQU * CF A5,TRSYNC LDK A2,SOH CF A5,WRITE LDK A7,0 BCC LD A2,DW2200 RID CF A5,WRITEP LD A2,ZRECOV+4 CF A5,WRITEP LAST SID LD A2,ZRECOV+6 LAST DID CF A5,WRITEP DID LDKL A4,DCSTR4 ENQ RF TRC100 * TRTRAF EQU * LDKL A4,DCSTR3 TRAFFIC IM XACK LDKL A1,TRTRAF ST A1,LSEND RF TRCTRL EJECT * * SEND NO TRAFFIC * IF ACK OR WABT HAVE TO BE INCLUDED * TAKE CARE ABOUT SID,DID * * TRNOTR EQU * LD A1,DCSTRX RESTORE SID TO BE ACKNOWLEDGED ST A1,FSID LD A1,TACK TRANSMIT ACK ? RF(Z) TRNOT1 NO RB TRACK YES TRNOT1 EQU * LD A1,TWABT TRANSMIT WABT ? RF(Z) TRNOT2 NO RB TRACK YES TRNOT2 EQU * LDKL A4,DCSTR5 CF A5,TRSYNC LDK A7,0 BCC RF TRC100 EJECT * * * DEVICE HANDLING * TREADY EQU * LDKL A4,DCSTR6 IM XACK LDKL A1,TREADY ST A1,LSEND RF TRCTRL TRTHRU EQU * LDKL A4,DCSTR7 IM XACK LDKL A1,TRTHRU ST A1,LSEND RF TRCTRL TRNOP EQU * LDKL A4,DCSTR8 IM XACK LDKL A1,TRNOP ST A1,LSEND RF TRCTRL TRSFCN EQU * LDKL A4,DCSTR9 IM XACK LDKL A1,TRSFCN ST A1,LSEND RF TRCTRL EJECT * TRCTRL EQU * * * HERE TO TEST ON RETRANSMISSION CASE OR NOT * IF YES RESTORE PREVIOUS HEADER * LD A1,TSTENQ RF(NZ) RETRAX RETRANSMISSION CF A5,TRHEAD TRC100 LCR A2,A4 GET CHARACTER ADK A4,1 INCREMENT POINTER ANK A2,/7F RF(Z) TRC200 END OF STRING CF A5,WRITEP WRITE CHARACTER RB TRC100 TRC200 LDK A2,ETX CF A5,WRITEP SEND ETX LDR A2,A7 CF A5,WRITEP SEND BCC LDK A3,3 TRC210 EQU * LDK A2,/FF CF A5,WRITE SEND PAD SUK A3,1 RB(NZ) TRC210 CIO A2,0,CHLCUT STOP TRANSMITTER SST A2,CHLCUT SST RTN A5 * * RESTORE LAST PARAMETERS: * RID SID DID (DLE 1 OR DLE ?) * RETRAX EQU * CM TSTENQ LC A3,ZRECOV ST A3,COUNT INIT PARAMETERS COUNT LDK A3,/FF ANS A3,ZRECOV DESTROY FIRST CHARACTER COUNTER CF A5,TRSYNC LD A2,ZRECOV CF A5,WRITE SEND SOH LDK A3,2 INIT INDEX COUNTING LDK A7,0 BCC LOOP EQU * LD A2,ZRECOV,A3 CF A5,WRITEP SEND CHARACTER ADK A3,2 COUNTER IN PROGRESS CC A3,COUNT+1 END OF SAVE AREA ? RB(NE) LOOP NO,GO ON WRITING LD A1,COUNT SC A1,ZRECOV RESTORE COUNTER LD A1,FDWTUT RECOGNIZE RETURN RB(Z) TRC100 STATUS LD A8,DWTECB,A1 RESTORE ECB ADDRESS LD A1,ECBRL,A8 THRU OR FKEY ? RB(Z) TRC100 YES RF TRT010 TEXT RECOVERY EJECT * * * TRANSMIT HEADER : * SOH RID SID DID * DLE 1 (ACK),DLE ? (WABT=ACK+BUSY) IF REQUIRED * SAVE IT FOR RECOVERY PURPOSES * * TRHEAD EQU * CF A5,TRSYNC TRANSMIT SYNC LDK A2,SOH LDK A3,0 INIT INDEX ST A2,ZRECOV,A3 CF A5,WRITE SEND SOH ADK A3,2 LDK A7,0 BCC LD A2,DW2200 ST A2,ZRECOV,A3 CF A5,WRITEP SEND RID ADK A3,2 LD A2,FSID ST A2,ZRECOV,A3 CF A5,WRITEP SEND SID ADK A3,2 LD A2,FDID ST A2,ZRECOV,A3 SEND DID CF A5,WRITEP ADK A3,2 * * HERE TO TEST IF ACK OR WABT HAVE TO BE INCLUDED IN HEADER * LD A1,TACK TRANSMIT ACK ? RF(Z) HEAD10 NO,TEST TRANSMIT WABT CM TACK LDK A2,DLE ST A2,ZRECOV,A3 CF A5,WRITEP SEND DLE ADK A3,2 LDK A2,ACK1 ST A2,ZRECOV,A3 CF A5,WRITEP SEND 1 ADK A3,2 RF HEAD20 RETURN HEAD10 EQU * LD A1,TWABT RF(Z) HEAD20 NO PENDING WABT * CM TWABT NO REJECT TRANSMIT WABT LDK A2,DLE ST A2,ZRECOV,A3 CF A5,WRITEP SEND DLE ADK A3,2 LDK A2,WABT ST A2,ZRECOV,A3 CF A5,WRITEP SEND WABT ADK A3,2 HEAD20 EQU * SC A3,ZRECOV SAVE PARAMETERS COUNTER IN FIRST POSITION RTN A5 EJECT * * * TEST IF TRANSMIT OR RETRANSMIT TEXT * INCLUDE PENDING ACK,PENDING WABT EVENTUALLY * TRTEXT EQU * LD A1,TSTENQ RB(NZ) RETRAX RETRANSMISSION EJECT * * TRANSMIT TEXT * * CF A5,TRHEAD TRT010 EQU * LDK A2,STX CF A5,WRITEP SEND STX LD A3,FECBRL GET REQUESTED LENGTH LD A4,FECBBA AND BUFFER ADDRESS TRT100 LCR A2,A4 GET CHARACTER ADK A4,1 INCREMENT POINTER CF A5,WRITEP SEND CHARACTER TRT120 EQU * SUK A3,1 RB(NZ) TRT100 NEXT CHARACTER ABL TRC200 ALL TRANSMITTED. SEND ETX AND BCC EJECT * * * TRANSMIT SYNC SEQUENCE * * TRSYNC CIO A2,1,CHLCUT START TRANSMITTER CF A5,READ WAIT FOR OUTPUT INTERRUPT LDK A3,4 4 SYNS TRS100 LDK A2,SYN CF A5,WRITE SEND SYN SUK A3,1 RB(NZ) TRS100 RTN A5 EJECT * * * RECEIVER INTERRUPT * * IH2201 CF A15,SAVE8 SAVE A1 - A8 CF A15,LDREG RESTORE DC REGS A3 - A8 INR A2,0,CHLCIN READ CHAR RF(NA) IHIN20 NOT ACCEPTED,CHECK STATUS IFF LOGG=0 CF A5,LOGIN LOG RECEIVED CHARACTER XIF XRR A7,A2 CALCULATE BCC IHIN10 RTN A5 IHIN20 CF A5,SST PERFORM SST ABL BRM * * * TRANSMITTER INTERRUPT * * IH2202 CF A15,SAVE8 SAVE A1 - A8 CF A15,LDREG RESTORE DC REGS A3 - A8 RB IHIN10 EJECT * * * SST INSTRUCTION AND STATUS CHECK * * CHLC STATUS : BIT 10=CARRIER OFF * BIT 14=THROUGHPUT ERROR * BIT 15=MODEM NOT READY * SST SST A1,CHLCIN LDR A2,A1 IFF LOGG=0 CF A5,LOGSST LOG SST INFORMATION XIF ANK A2,2 RF(Z) SST100 ABL BRM800 THROUGHPUT ERROR SST100 OR A1,DCONOF TAKE CARE OF POLL TIME OUT ST A1,DCSTCU CF A15,CKMESS CHECK IF STATUS CHANGE RTN A5 * * * HALT INPUT * * HALTIN CIO A1,0,CHLCIN RB SST PERFORM SST INSTRUCTION AND STATUS CHECK EJECT * * * WRITE FROM OR READ ONE CHARACTER TO A2 * * WRITE EQU * OTR A2,0,CHLCUT SEND CHARACTER RF(A) WRIT10 RF READ THROUGPUT ERROR WRIT10 XRR A7,A2 ACCUMULATE BCC IFF LOGG=0 CF A5,LOGOUT LOG OUTPUT CHARACTER XIF * READ CF A15,STREG ABL TDISP EJECT * * *** WRITEP * * WRITE A2 WITH PARITY * * WRITEP ECR A1,A2 ORK A2,/80 WRI100 SLL A1,1 RB(P) WRI100 RB(Z) WRITE WRITE XRK A2,/80 RB WRI100 * * * *** READP * * READ CHARACTER TO A2 AND CHECK PARITY * * READP CF A5,READ ECR A1,A2 RE100 SLL A1,1 RF(Z) RE110 RB(NN) RE100 XRK A2,/80 RB RE100 RE110 LDR A1,A2 ANK A2,/7F ADK A5,4 ANK A1,/80 XRK A1,/80 ABR* A5 * * EJECT * * FIND DWT CONTAINING SUBTERMINAL ADDRESS AS GIVEN IN A2 * * CALLING SEQUENCE: CF A5,FINTER * A2=SUBTERMINAL ADDRESS * A4 DESTROYED * A3#0: DWT TO FOUND TERMINAL * FINTER EQU * * * SEARCH IF GENERAL SID * LDR A1,A2 SUK A1,SID RF(NZ) FINT05 SPECIFIC LDKL A3,-1 INIT GENERAL SID RTN A5 * FINT05 EQU * LD A4,DCTAB GET ADDRESS TO DC:TAB AD* A4,DCTAB ADDRESS TO END OF DC:TAB FINT10 SUK A4,2 LDK A3,0 DEFAULT VALUE CW A4,DCTAB END OF TABLE RF(E) FINT20 SUBTERMINAL NOT FOUND LDR* A3,A4 LOAD DWT ADDRESS CWR* A2,A3 COMPARE SUBTERMINAL ADDRESS RB(NE) FINT10 TAKE NEXT TERMINAL FINT20 RTN A5 EJECT * * * POWER ON FUNCTIONS * * DC22ON CF A15,SAVE8 SAVE A1 - A8 LD A2,DCTPGP GET POLL TIMER POINTER RF(NZ) DRDC20 ALREADY STARTED DRDC10 CF A15,SETIME START POLL TIMER DATA PTOUT,TIMPOL ST A4,DCTPGP STORE TIMERIC RECEIVE MODE DRDC20 ABL BRM EJECT * * POLL TIME OUT * PTOUT LDKL A5,STB LOAD A5 STACK BASE LDK A2,/40 ST A2,DCONOF INDICATE POLL TIME OUT CIO A2,0,CHLCUT RESET HARDWARE SST A2,CHLCUT CF A5,HALTIN CHECK IF STATUS CHANGE RB DRDC10 RESTART TIMER * * RESTART POLL TIMER WHEN POLL HAS BEEN RECEIVED * CPTIM CM DCONOF INDICATE POLLING LDKL A2,-TIMPOL ST* A2,DCTPGP RESTART TIMER CF A15,CKMESS CHECK IF STATUS CHANGE RTN A5 EJECT * * * DEVICE WORK TABLE FOR DCTASK * * DW2200 EQU * TABLE ENTRY DATA 0 CU LINE ADDRESS DATA /8000 STATUS DATA 0 ECB ADDRESS DATA 0 ORDER DATA DC22DC POINTER TO AADRESS BLOCK DATA 0 TTAB ADDRESS DATA 0 WAIT/ACTIVATE INDICATOR DATA 0 TASK QUEUE DATA 0 TIMER POINTER DATA 0 WRITE QUEUE OR BUFFER QUEUE DATA 0 BUF QUEUE ANCHOR DATA 0 TIMER FOR BUFFER QUEING EJECT * * * DC RECEIVE BUFFER POOL * * RLINK EQU RBUFL+RBUFL+8 DCRBUF EQU * POINTER TO FIRST FREE BUFFER DATA *+2 IFT RBUFNR=14 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=13 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=12 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=11 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=10 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=9 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=8 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=7 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=6 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=5 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=4 DATA *+RLINK RES RBUFL+3 DATA *+RLINK RES RBUFL+3 XIF IFT RBUFNR=3 DATA *+RLINK RES RBUFL+3 XIF DATA *+RLINK RES RBUFL+3 DATA 0 RES RBUFL+3 EJECT * * * DC TRANSMIT BUFFER POOL * * DCTBUF EQU * * * IFF TBUFL=0 DATA BUFT1 POINTER TO FIRST FREE BUFFER BUFT1 DATA BUFT2 RES TBUFL BUFFER AREA 3 BUFT2 DATA 0 END OF CHAIN RES TBUFL BUFFER AREA 4 XIF * EJECT * * * INTERRUPT LOGGING ROUTINE * * IFF LOGG=0 LOGSST ST A2,SAVE2 ORKL A2,/F000 RF LOG10 LOGOUT ST A2,SAVE2 ORKL A2,/0F00 RF LOG10 LOGIN CWK A2,/FF RF(E) LOGE10 ST A2,SAVE2 LOG10 ST A3,SAVE3 LD A3,LOGPNT STR A2,A3 ADK A3,2 CWK A3,LOGEND RF(L) LOGEXI LDKL A3,LOGSTA LOGEXI ST A3,LOGPNT LD A2,SAVE2 LD A3,SAVE3 LOGE10 RTN A5 EJECT * * LOGPNT DATA LOGSTA LOGSTA EQU * RES 2200 LOGEND EQU *-4 SAVE2 DATA 0 SAVE3 DATA 0 XIF * * * EJECT * **** DC-TAB AREA * * DC:IN DATA DC:TAB+2 INSERT POINTER DCTAB DATA DC:TAB ENTRY POINT DC:TAB DATA 2 DC TAB'S VARIABLE LENGTH DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DC:END EQU * END OF TABLE END