|
|
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: 62076 (0xf27c)
Notes: pts_type(SC)
Names: »DRDC22.SC«
└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
└─⟦this⟧ »TOSSWORK/DRDC22.SC«
IDENT DRDC22 REL 9.2 80-01-03 870105040920 =1, TIMEOUT RETRANSMIT ERROR SYSGEN 6805 REL 9.1 79-05-23 ********************************************* * * PHILIPS TERMINAL SYSTEM PTS * * * DRDC22 : UNISCOPE 100 SYNCHRONOUS PROTOCOL * ON PTS 6800 * * ********************************************* * * EJECT * * * ENTRY POINTS * * ENTRY DC22AD ADDRESS BLOCK TERMINAL REQUESTS ENTRY IH2201 INPUT INTERRUPT ENTRY IH2202 OUTPUT INTERRUPT ENTRY DC22ON POWER ON ROUTINE 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 EXTRN DC:MIN MOVE DATA TO USER BUFFER EXTRN DC:MOT MOVE DATA FROM USER BUFFER EXTRN DISEND COMPLETE REQUEST AND DISPATCH EXTRN INTSAV LAST INTERRUPT ADDRESS EJECT **************************************************************** * * CONDITIONAL ASSEMBLY * *************************************************************** * X:A EQU 128 RECEIVE BUFFER LENGTH RBUFL EQU X:A X:B EQU /60 DCTASK FILE CODE DCFC EQU /60 X:C EQU 1 IF 1 INTERRUPT LOGGING LOGG EQU X:C X:D EQU 600 TIMPOL EQU X:D POLL TIME-OUT X:E EQU 4 RBUFNR EQU X:E NUMBER RECEIVE BUFFER X:F EQU 1 SUPPRESS NULL NULTST EQU X:F X:G EQU 0 SALCUZ EQU X:G IF =0 DC UNIT TYPE 6834 IF =1 DC UNIT TYPE 6857/SALCUZ DC DEVICE ADDRESS IFT SALCUZ=0 X:H EQU /02 INPUT DEV ADDR DCDEVI EQU X:H INPUT ADDR DCDEVO EQU DCDEVI+/10 OUTPUT ADDR XIF IFT SALCUZ=1 X:H EQU /0A INPUT DEV ADDR DCDEVI EQU /0A INPUT ADDR =1 DCDEVO EQU DCDEVI+1 OUTPUT ADDR XIF X:I EQU 1000 TBUFL EQU X:I MMU BUFFER LENGTH * * A PROGRAM VERSION USING TOSS PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1 * MMUPAG EQU 0 * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0 * CPU852 EQU 1 * * BUFFER SUPERVISION TIMER * BUFTIM EQU 0 * * * DEVIND EQU -2 DEVICE INDEX DATA COMMUNICATION BUFLEN EQU TBUFL+TBUFL EJECT **************************************** * * USE OF STATUS WORD BIT-PATTERN * WITHIN DRDC22 * **************************************** SWBT00 EQU /8000 REQUEST ERROR SWBT02 EQU /2000 STATUS CHANGE DC-TASK SWBT05 EQU /0400 BEL MESSAGE SWBT09 EQU /0040 TIMEOUT / POLL TIMEOUT DC-TASK SWBT10 EQU /0020 CARRIER OFF DC-TASK SWBT14 EQU /0002 THROUGHPUT ERROR DC-TASK SWBT15 EQU /0001 MODEM NOT READY DC-TASK 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 * DWTDRD EQU /10 START OF DRIVER DEFINED PART * IFT MMUPAG=0 START EQU DWTDRD XIF IFT MMUPAG=1 START EQU DWTDRD+4 XIF DWTTP EQU START+/00 TIMER POINTER ORDER PROCESS DWTWQ EQU START+/02 WRITE/GET BUFFER QUEUE DWTBQ EQU START+/04 BUFFER QUEUE ANCHOR DWTBTP EQU START+/06 TIMER FOR BUFFER QUEUE AIDID EQU START+/08 LAST AI FOR THIS DWT SPRT1 EQU START+/0A PRINT MODE INDICATOR DWTTIM EQU START+/0C REQ TIMER VALUE DIDLST EQU START+/0E DEVICES PRESENT EJECT * * * REQUEST HANDLING * * * * PARAMETERS * * A7=ORDER * * /02: READ * /06: WRITE * /37: TRANSFER PARAMETERS * /38: SET STATUS * /39:SET REQUEST TIMER VALUE * 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 DCSTQ DATA 0 THRU REQUEST QUEUE DCTPGP DATA 0 TIMER POINTER GENERAL POLL DCLCI DATA 0 DC UNIT I/P STATUS EJECT * * DC TASK ADDRESS * DATA 0 INDICATES NO MMU BLOCKS DATA DEVIND DEVICE INDEX DC22DC DATA DCACTD ADDRESS BLOCK DC TASK DATA ABORT ABORT ROUTINE ADDRESS DATA DCRBUF RECEIVE BUFFER ANCHOR * * DRIVER ADDRESS BLOCK * DATA BUFLEN MMU BUFFER SIZE DATA DEVIND DEVICE INDEX DC22AD DATA DCACT ADDRESS BLOCK DATA ABORT ABORT ROUTINE ADDRESS DATA DCRBUF RECEIVE BUFFER ANCHOR * 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,/37-/06 RF(Z) DCTP TRANSFER PARAMETERS SUK A7,/38-/37 ABL(Z) DCSST SET STATUS SUK A7,/39-/38 ABL(Z) REQTIM SET REQUEST TIMER VALUE RF DCA100 EJECT * * * ACTIVATION FROM DCTASK * * DCACTD EQU * SUK A7,/02 RF(E) DCRDDC READ SUK A7,/37-/02 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 CWK A6,DW2200 DC-TASK ? RF(E) DCTP20 YES 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 CHECK IF DWT IN DC:TAB LD A1,DCTAB START OF DC:TAB AD* A1,DCTAB NEXT FREE ENTRY DCTP23 EQU * SUK A1,2 BACKWARDS CW A1,DCTAB AT START ? RF(E) DCTP25 NOT FOUND CWR* A6,A1 DWT? RF(E) DCTP30 YES EXIT RB DCTP23 CHECK NEXT ENTRY BACWARDS DCTP25 EQU * FIND FREE SLOT 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 DCTP30 EQU * 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 * IFT MMUPAG=1 LD A1,ECBRL,A8 REQUESTED LENGTH CWK A1,BUFLEN ILLEGAL LENGTH? RF(G) IL:LEN ILLEGAL LENGTH XIF 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 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 * LDR A4,A1 RECEIVE BUFFER ADDRESS LDK A1,0 RESET RETURN CODE CF A15,DC:MIN MOVE DATA TO USER BUFFER 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 ***** * * ILLEGAL APPLICATION BUFFER SIZE * ****** IL:LEN EQU * LDKL A1,/8008 REQUEST ERROR + ILLEGAL LENGTH ABL DISEND 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 RF(Z) DCSSTU 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 DCSSTU EQU * LDK A1,0 CF A15,TENDIO ABL DCRTN * * FUNCTION KEY * DCSST4 EQU * CM ECBRL,A8 CLEAR REQUESTED LENGTH LDK A2,6 ST A2,DWTOR,A6 REPLACE ORDER RB DCWR EJECT * * SET REQUEST TIMER VALUE * REQTIM EQU * LD A2,ECBCW,A8 TIMEOUT VALUE ST A2,DWTTIM,A6 SAVE TIMEOUT VALUE IN DWT ABL DCTP30 EJECT * * * * TIMER HANDLING PART * * * * READ TIMER=TIMERR * TIMERE EQU * LDR A1,A6 LD A2,DWTTIM,A6 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 TOUTR1 EQU * LDK A1,/40 INDICATE TIME OUT ABL ENDIO COMPLETE REQUEST * * WRITE TIMER=TIMWR * TIMEWR LDR A1,A6 LD A2,DWTTIM,A6 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 RB(NZ) TOUTR1 NOT WRITE LD A2,DWTECB,A6 GET DWT CW A6,FDWTUT SAME AS PRESENT DWT =1 RF(NE) TOUTW1 NO,REMOVE AND TENDIO CM XACK YES,CLEAR WAIT FOR ACK AND GO ON PROCESSING CM FDWTUT NO WRITE GOING ON TOUTW1 EQU * LD A4,ECBBA,A2 GET ECB CF A15,REMOVW REMOVE FROM WRITE QUEUE 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 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 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 * * * 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 LD A4,-4,A3 ST A4,ECBEL,A8 STORE NUMBERS OF CHARACTERS LD A4,-2,A3 ST A4,ECBCW,A8 STORE LINE DEVICE ADDRESS LDR A4,A3 RECEIVE BUFFER ADDRESS LDK A1,0 RESET RETURN CODE CF A15,DC:MIN MOVE DATA TO USER BUFFER 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 CF A15,TENDIO COMPLETE READ GENERAL REQUEST RB CKM110 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 * * ABORT ROUTINE * ABORT LD A1,DWTTP,A6 TIMER POINTER RF(Z) AB:10 NO TIMER RUNNING CM* DWTTP,A6 KILL TIMER CM DWTTP,A6 AB:10 LD A1,DWTOR,A6 ORDER SUK A1,2 RF(Z) AB:RTN READ REQUEST NA ACTION SUK A1,4 RF(NZ) AB:RTN NO ACTION IF NO READ/WRITE CF A15,REMOVW LD A2,FDWTUT WRITING DWT ADDRESS CWR A2,A6 RF(NE) AB:RTN NOT THIS DWT CM XACK RESET ACK EXPECTED CM FDWTUT RESET WRITING DWT AB:RTN EQU * IFT CPU852=1 ADKL A15,4 ABR* A15 XIF IFF CPU852=1 RTN A15 XIF EJECT ********************************************************** * * TIMING CONTROL EQU:S * ********************************************************** * TIMBUF EQU 1800 180 S * EJECT ********************************************************** * * LINE CONTROL CHAR EQU:S * ********************************************************** * 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 IFT SALCUZ=0 PAD EQU /FF PAD CHAR XIF IFT SALCUZ=1 PAD EQU /7F XIF EJECT ************************************************************* * * LINE CONTROL UNIT FUNCTION CONTROL EQU:S * ************************************************************* * IFT SALCUZ=1 CBBREK EQU /80 CIO START BREAK CBECHO EQU /10 ECHO CBNPAR EQU /0 NO CHAR PARITY CBEPAR EQU /4 EVEN CHAR PARITY CBOPAR EQU /C ODD CHAR PARITY * CBSTOP EQU /0 CIO STOP INPUT/OUTPUT * CBDISC EQU /1 CIO DISCONNECT MODEM FROM LINE XIF IFF SALCUZ=1 CBCARR EQU /100 CARRIER ON XIF * * IFT SALCUZ=1 PARITY EQU CBOPAR ODD PARITY FOR ASCII XIF EJECT *************************************************** * * LINE CONTROL UNIT SST STATUS BITS * *************************************************** * SBNOOP EQU /1 SST STATUS MODEM NOT OPERABLE SBTHRU EQU /02 THROUGHPUT ERROR IFT SALCUZ=1 SBPARI EQU /04 CHAR PARITY ERROR XIF SBCARR EQU /20 CARRIER OFF SBCALL EQU /40 INCOMING CALL * IFT SALCUZ=1 SBERR EQU /27 SBNOOP,SBTHRU,SBPARI,SBCARR XIF IFF SALCUZ=1 SBERR EQU /23 SBNOOP,SBTHRU,SBCARR XIF EJECT * * * PROCEDURE WORK AREAS * * FDWTIN DATA 0 CURRENT DWT FOR RECECEION 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 DATA 0 WRITING ECB FECBBA DATA 0 WRITING BUFFER ADDRESS FECBRL DATA 0 WRITING BUFFER LENGTH FSID DATA 0 RESPONDING SID FDID DATA 0 RESPONDING DID NAKCNT DATA 0 NAK COUNTER * TSTENQ DATA 0 RECOVERY FLAG COUNT DATA 0 CHARACTERS TO BE SAVED * ZRECOV DATA 0,0,0,0,0,0 SAVE TRANSMIT HEADER LSEND DATA 0 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 EQU * LDKL A5,STB LOAD STACK BASE FOR A5 CF A5,CSYNCI START I/P WITH SYNC DEF BRM100 CF A5,READ READ CHARACTER SUK A2,SOH RF(E) BRM200 SOH SUK A2,PAD-SOH PAD ? RB(NE) BRM100 NOT /FF CF A5,READ READ CHARACTER CWK A2,PAD PAD ? 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 CWK A3,-1 GENERAL SID ? RF(E) BRM205 YES,DONT INIT DWT INPUT 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,CHALTI 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=1 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 IFT SALCUZ=0 RF(NZ) BRM910 PARITY ERROR XIF ANK A7,/7F MASK BCC PARITY BIT RF(NZ) BRM910 BCC ERROR IFT SALCUZ=1 CF A5,CHALTI STOP I/P TO CHECK CHAR PAR ANK A2,SBPARI CHAR PARITY ERROR ? RF(NZ) BRM915 YES XIF 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,CHALTI 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 CF A5,CSYNCI START I/P WITH SYNC DEF BRM900 CF A5,READ LD A1,DCSTCU ANY STATUS FROM CONTROL UNIT ? RF(NZ) BRM910 YES HALT AND RESYNC SUK A2,PAD PAD ? RB(NZ) BRM900 NOT /FF BRM910 CF A5,CHALTI HALT INPUT AND RESYNCHRONIZE BRM915 EQU * 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 LD A3,-4,A4 GET LENGTH ST A3,ECBEL,A8 STORE EFFECTIVE LENGTH RF(NZ) TEX100 LDKL A1,/400 BEL IN RETURN CODE TEX100 EQU * CF A5,CTIME STOP TIMER ST A2,ECBCW,A8 STORE REMAINING TIME CF A15,DC:MIN MOVE DATA TO USER BUFFER 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 IFT BUFTIM=1 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 XIF 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 IFT BUFTIM=1 * * 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 XIF 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 * CF A5,CPTIM RESET POLL TIMER * * 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 IFF MMUPAG=0 LDKL A4,MMUBUF GET BUFFER ADDRESS ST A4,ECBBA,A8 CF A15,DC:MOT MOVE DATA TO OUTPUT BUFFER XIF LD A2,ECBBA,A8 GET BUFFER ADDRESS ADK A2,2 DUMMY WORD ST A2,FECBBA LD A2,ECBRL,A8 GET REQUESTED LENGTH RF(Z) TPA210 PROCESS KEY SUK A2,2 RESTORE CORRECT LENGTH 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 LD A1,AIDID,A6 GET DID ST A1,FDID LDR* A1,A6 ST A1,FSID TPA306 EQU * ST A6,FDWTUT INIT OUTPUT DWT 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 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 * 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,PAD PAD CHAR CF A5,WRITE SEND PAD SUK A3,1 RB(NZ) TRC210 CF A5,CHALTO STOP O/P 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 EQU * CF A5,CSYNCO START O/P WITH SYNC DEF 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 * * * CINIT : INITIALIZE LINE CONTROL UNIT INFO * CINIT EQU * CM DCLCI CLEAR I/P ACTIVE IND ADKL A15,4 INCREMENT STACK POINTER ABR* A15 RETURN TO CALLER EJECT * * CSYNCI : SEND SYNC PATTERN FOR INPUT DATA * * CSYNCI EQU * CF A5,CHALTI STOP I/P ST A5,DCLCI SET I/P ACTIVE FLAG ADK A5,4 ADD RETURN OFFSET FOR ABR IFT SALCUZ=1 LDK A2,PARITY CHAR PARITY FUNCTION FOR LC CIO A2,1,DCDEVI STARTY I/O LDK A2,SYN SYNC PATTERN OTR A2,1,DCDEVI SEND I/P SYNC PATTERN TO LC XIF IFF SALCUZ=1 LDKL A2,CBCARR+SYN SYNC PATTERN CIO A2,1,DCDEVI SEND I/P SYNC PATTERN TO LC XIF ABR* A5 RETURN TO CALLER WITH CR SET * * * CSYNCO : START TRANSMITTER WITH SYNC DEF * CSYNCO EQU * IFT SALCUZ=1 LDK A2,PARITY CHAR PARITY TYPE CHECK BY CU CIO A2,1,DCDEVO CIO START RF(A) CSYNC2 ACCEPTED -> SST A2,DCDEVO TRY TO READ STATUS THEN RF(A) CSYNC1 ACCEPTED -> ABL BRM NOT ACCEPTED TIMEOUT REQUEST CSYNC1 EQU * LDK A2,PARITY RETRY CIO CIO A2,1,DCDEVO DO IT CSYNC2 EQU * LDK A2,SYN SYNC PATTERN OTR A2,1,DCDEVO DEFINE SYNC XIF IFF SALCUZ=1 CIO A2,1,DCDEVO START TRANSMITTER XIF RTN A5 EJECT * * CHALTI : HALT INPUT CHANNEL * * CHALTI EQU * IFT SALCUZ=1 LDK A2,CBSTOP STOP FUNCTION BIT XIF CIO A2,0,DCDEVI HALT I/P CM DCLCI CLEAR I/P ACTIVE IND SST A2,DCDEVI READ STATUS IFF LOGG=0 CF A5,LOGSST LOGG I/P SST XIF ADK A5,4 INCR STACK POINTE ABR* A5 RETURN TO CALLER * * * CHALTO : HALT O/P CHANNNEL * CHALTO EQU * IFT SALCUZ=1 LDK A2,CBSTOP STOP FUNCTION CIO A2,0,DCDEVO STOP CU CF A5,READ WAIT FOR INTERRUPT XIF IFF SALCUZ=1 CIO A2,0,DCDEVO HALT CU XIF ADK A5,4 INCREMENT STACK POINTER SST A2,DCDEVO GET STATUS ABR* A5 RETURN TO CALLER EJECT * * * RECEIVER INTERRUPT * * IH2201 EQU * ST P,INTSAV SAVE INTERRUPT ROUTINE ADDRESS IFT CPU852=1 CF A15,SAVE8 XIF IFF CPU852=1 MSR 8,A15 XIF CF A15,LDREG RESTORE DC REGS A3 - A8 INR A2,0,DCDEVI READ CHAR RF(NA) IHIN20 NOT ACCEPTED,CHECK STATUS IFF LOGG=0 CF A5,LOGIN LOG RECEIVED CHARACTER XIF XRR A7,A2 CALCULATE BCC LDR A1,A2 MOVE CHAR TO FORM FLAG ORKL A1,/FF00 SET FLAG FOR CARRIER ON ST A1,DCLCI SET I/P CARR FLAG CM DCSTCU CLEAR SST SAVE IHIN10 RTN A5 IHIN20 CF A5,SST PERFORM SST ABL BRM * * * TRANSMITTER INTERRUPT * * IH2202 EQU * ST P,INTSAV SAVE INTERRUPT ROUTINE ADDRESS IFT CPU852=1 CF A15,SAVE8 XIF IFF CPU852=1 MSR 8,A15 XIF 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 * CONTROL UNIT STATUS: SEE EQU:S ABOVE * SST EQU * SST A2,DCDEVI READ STATUS LDR A1,A2 MOVE STATUS IFF LOGG=0 CF A5,LOGSST LOG SST INFORMATION XIF ANK A2,SBERR ERROR BIT SET ? RF(NZ) SST050 YES IFT SALCUZ=0 LD A2,DCLCI I/P STATUS ? RF(Z) EXDISP I/P NOT ACTIVE IGNORE RF(N) SST100 I/P ACTIVE WITH DATA LDKL A2,CBCARR+SYN CARRIER ON RESYNC CIO A2,1,DCDEVI START I/P AGAIN RF EXDISP RETURN TO DISP XIF IFT SALCUZ=1 RF SST100 XIF SST050 EQU * ANK A2,SBCARR CARRIER OFF RF(Z) SST052 NO LD A2,DCLCI I/P STATUS RF(Z) EXDISP NOT ACTIVE IGNORE CARRIER OFF RF SST100 EXIT SST052 EQU * LDR A2,A1 MOVE STATUS ANK A2,SBTHRU THROUGHPUT ERROR ? RF(Z) SST100 NO ABL BRM800 THROUGHPUT ERROR SST100 EQU * ST A1,DCSTCU CF A15,CKMESS CHECK IF STATUS CHANGE RTN A5 EJECT * * * WRITE FROM OR READ ONE CHARACTER TO A2 * * WRITE EQU * OTR A2,0,DCDEVO SEND CHAR 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 EXDISP EQU * ABL TDISP EJECT * * *** WRITEP * * WRITE A2 WITH PARITY * * WRITEP EQU * IFT SALCUZ=0 ANK A2,/FF ECR A1,A2 ORK A2,/80 WRI100 SLL A1,1 RB(P) WRI100 RB(Z) WRITE WRITE XRK A2,/80 RB WRI100 XIF IFT SALCUZ=1 RB WRITE WRITE CHAR XIF * * * *** READP * * READ CHARACTER TO A2 AND CHECK PARITY * * READP CF A5,READ IFT SALCUZ=0 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 XIF IFT SALCUZ=1 LDK A1,/80 XIF 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 EQU * IFT CPU852=1 CF A15,SAVE8 XIF IFF CPU852=1 MSR 8,A15 XIF CF A15,CINIT INIT LINE CONTROL UNIT INFO LD A2,DCTPGP GET POLL TIMER POINTER RF(NZ) DRDC20 ALREADY STARTED CF A15,SPOTIM START POLL TIMER 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 CF A15,CKMESS CF A15,SPOTIM ABL TDISP * * 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 * * START POLL TIMER * SPOTIM EQU * CF A15,SETIME DATA PTOUT,TIMPOL ST A4,DCTPGP ADKL A15,4 ABR* A15 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 IFT MMUPAG=1 DATA 0 USER ECB ADDRE4SS DATA DC:ECB MMU ECB ADDRESS XIF DATA 0 TIMER POINTER DATA 0 WRITE QUEUE OR BUFFER QUEUE DATA 0 BUF QUEUE ANCHOR DATA 0 TIMER FOR BUFFER QUEING DATA 0 REQUEST TIMEOUT VALUE IFT MMUPAG=1 DC:ECB EQU * DATA 0,0,0,0,0,0 XIF 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 * * MMU WORK BUFFER * IFF MMUPAG=0 MMUBUF RES TBUFL+1 MMU WORK BUFFER 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