|
|
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: 52576 (0xcd60)
Notes: pts_type(SC)
Names: »DRDC07.SC«
└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
└─⟦this⟧ »TOSSWORK/DRDC07.SC«
IDENT DRDC07 REL 10.0 80-03-14 870105041000 REL 10.1 80-02-13 =1, OLLES POWER UP REL 10.1 79-10-26 * ********************************************* * * PHILIPS TERMINAL SYSTEM PTS * * * DRDC07: DRIVER DATA COMMUNICATION * HDLC FULL DUPLEX PROCEDURE * * * * * ********************************************* * * * * * EJECT * * * ENTRY POINTS * * ENTRY DC07AD ADDRESS BLOCK TERMINAL REQUESTS ENTRY IH0701 INPUT INTERRUPT ENTRY IH0702 OUTPUT INTERRUPT ENTRY DC07ON POWER ON ROUTINE ENTRY DW0700 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 QMJOB QUEUE MONITOR JOB EXTRN DC:MIN MOVE DATA TO USER BUFFER EXTRN DC:MOT MOVE DATA FROM USER BUFFER EXTRN DISEND COMPLETE REQUEST EXTRN PFPOST WAIT FOR POWER UP IF SET 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 * * * 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 ************************************************************************* * * CONDITIONAL ASSEMBLY * ************************************************************************* * * 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 * * 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 POINTER FOR BUFFER QUEUE DWTTIM EQU START+/08 REQUEST TIMER VALUE EJECT * * * PARAMETERS FOR CONDITIONAL ASSEMBLY * * X:A EQU 130 RECEIVE BUFFER LENGTH RBUFL EQU X:A X:B EQU 60 DCTASK FILE CODE DC07FC EQU X:B X:C EQU 1 IF 1 INTERRUPT LOGGING LOGG EQU X:C X:D EQU 300 POLL TIMEOUT VALUE TIMPOL EQU X:D X:E EQU 14 NUMBER OF RECEIVE BUFFERS RBUFNR EQU X:E VARIABLE BETWEEN 3 AND 14 X:F EQU 0 HFDUP EQU X:F FULL(=1),HALF(=X:F)DUPLEX X:G EQU 0 P6805 EQU X:G COMPUTER 6805 IF ::= 1 X:H EQU /02 INPUT DEVICE ADDRESS IFF P6805=1 CHLCIN EQU X:H XIF IFT P6805=1 CHLCIN EQU X'0A' XIF X:I EQU 1000 TBUFL EQU X:I MMU BUFFER LENGTH IFF P6805=1 CHLCUT EQU CHLCIN+/10 OUTPUT DEVICE ADDRESS XIF IFT P6805=1 CHLCUT EQU CHLCIN+1 XIF * * * DEVIND EQU -2 DEVICE INDEX DATA COMMUNICATION BUFLEN EQU TBUFL+TBUFL EJECT * * * REQUEST HANDLING * * * * PARAMETERS * * A7=ORDER * * /02: READ * /06: WRITE * /37: TRANSFER PARAMETERS * /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 DCTPGP DATA 0 TIMER POINTER GENERAL POLL * * DC TASK ADDRESS * DATA 0 INDICATES NO MMU BLOCKS DATA DEVIND DEVICE INDEX DC07DC DATA DCACTD ADDRESS BLOCK DC TASK DATA ABORT ABORT ROUTINE ADDRESS DATA DCRBUF ANCHOR RECEIVE BUFFER POOL DATA 6 HEADER LENGTH =2 * * DRIVER ADDRESS BLOCK * DATA BUFLEN MMU BUFFER SIZE DATA DEVIND DEVICE INDEX DC07AD DATA DCACT ADDRESS BLOCK DATA ABORT ABORT ROUTINE ADDRESS DATA DCRBUF ANCHOR RECEIVE BUFFER POOL DATA 6 HEADER LENGTH =2 RES 15 SUBROUTINE STACK FOR INTERRUPTS STB RES 1 * * TIMBUF EQU 1800 180 SECONDS EJECT * * CIO START-IN COMMANDS * CICMO EQU /2 CONNECT MODEM CIDISC EQU /1 DISCONNECT MODEM CIWAIC EQU /3 WAIT FOR CALLL CIREPC EQU /5 RECEIVE ON PROG.CHANNEL CIAREP EQU /4 RECEIVE ON PROG.CHANNEL (2-WIRE) CIREMX EQU /B RECEIVE ON MUX CHANNEL CIAREM EQU /E RECEIVE ALARM ON MUX CHANNEL * * CIO START-OUT COMMANDS * CINRTS EQU 1 NO REQUEST TO SEND CIT4WP EQU 2 4-WIRE PROG.CHANNEL CIT2WP EQU 3 2-WIRE PROG.CHANNEL CIT4WM EQU /A 4-WIRE MUX.CHANNEL CIT2WM EQU /B 2-WIRE MUX.CHANNEL CIIDLE EQU 4 TRANSMIT IDLE 1 EJECT * * CHANNEL UNIT PARAMETRS * * * PROCEDURE WORK AREAS * STATUS DATA 0 (=1):N(S)FAIL,(=2):N(R) FAIL BUFNUL DATA 0 BUFFER OVERFLOW INDICATOR SWITCH DATA 0 OUTPUT BUFFER FLAG TRMACT DATA 0 OUTPUT ACTIVE FLAG IFF MMUPAG=0 SWMMU DATA 0 FLAG TO INDIC.USER BUFFER MVD/NOT MVD XIF TESTCF DATA 0 INPUT BUFFER FLAG MODE DATA 0 MODE INDICATOR (0~=DISC,1=NRM,2=CMDR) QTRM DATA 0 COMMAND/RESPONSE QUEUE AREA FIELD1 DATA 0 ADDRESS + C-FIELD RECEPTION WRDWT DATA 0 WRITING DWT RES 15 STACK FOR INPUT PROCESS STBIN RES 1 INPUT STACK POINTER RES 15 STACK FOR OUTPUT PROCESS STBUT RES 1 OUTPUT STACK POINTER * * * PROCEDURE COUNTERS * * CPCNT DATA 0 CHECK POINT VSCNT DATA 0 SEND STATE VARIABLE VRCNT DATA 0 RECEIVE STATE VARIABLE NSCNT DATA 0 SEND COUNTER NRCNT DATA 0 RECEIVE COUNTER LNRCNT DATA 0 LAST ACCEPTED N(R) EJECT * * * PROCEDURE EQUATES * * * COMMANDS * SNRM EQU /93 SET NORMAL RESPONSE MODE DISC EQU /53 SET DISCONNECT MODE SIM EQU /7 SET INIT MODE * * MASKS ON RECEIVED FRAMES * RRMSK EQU 1 RECEIVE READY RNRMSK EQU 5 RECEIVE NOT READY REJMSK EQU 9 REJECT COMMAND IMSK EQU 1 INFORMATION FRAME UIMSK EQU 3 UNNUMBERED I-FRAME * * SENDING FRAMES * RNR EQU /15 RECEIVE NOT READY UA EQU /73 NON SEQUENCED ACK ROL EQU /1F REQUEST ON LINE RR EQU /11 READY TO RECEIVE CMDR EQU /97 INVALID COMMAND REJ EQU /19 FRAME REJECTION 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,/39-/37 SET REQUEST TIMER VALUE RF(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 ************************************************************ * * 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 CODE SUK A1,2 RF(Z) AB:RTN READ REQUEST. NO ACTION SUK A1,4 RF(NZ) AB:RTN NO ACTION IF NOT READ/WRITE CF A15,REMOVW REMOVE DWT FROM WRITE QUEUE LD A2,WRDWT WRITING DWT ADDRESS CWR A2,A6 RF(NE) AB:RTN NOT THIS DWT CM WRDWT RESET WRITING DWT AB:RTN EQU * IFT CPU852=1 ADKL A15,4 ABR* A15 RETURN IN INHIBIT MODE XIF IFF CPU852=1 RTN A15 XIF EJECT * * * READ FROM DCTASK * * * REQUEST FROM DC-TASK * COMPLETE WHEN: * STATUS CHANGE ON DC EQUIPMENT * SPONTANOUS MESSAGE RECEPTION * DCRDDC EQU * LD A2,ECBRL,A8 REQUEST BUFFER LENGTH CF A15,CKMESS CHECK IF MESSAGE RECEIVED RF DCRTN RETURN EJECT * * * TRANSFER PARAMETERS * * * REQUEST FROM DC-TASK: TRANSFER TERMINAL COMPUTER ADDRESS * FROM TERMINALS: TRANSFER TERMINAL ADDRESSES * * DCTP LD A2,ECBCW,A8 GET PARAMETER STR A2,A6 SAVE IN FIRST WORD OF DWT * * * HERE TO INTRODUCE DWT IN DC-TAB * IF NOT DC-TASK CONCERNED * CWK A6,DW0700 DC-TASK ? RF(E) DCTP30 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 DCRTN EQU * ABL TDISP GOTO DISPATCHER EJECT * * * WRITE * * * COMPLETE WHEN: * SUCCESFUL TRANSMISSION * TIME OUT * * DCWR EQU * IFT MMUPAG=1 LD A1,ECBRL,A8 REQUESTED LENGTH CWK A1,BUFLEN TEST IF CORRECT LENGTH RF(G) IL:LEN ILLEGAL LENGTH *** 9.1 ** XIF CF A15,TIMEWR SET TIMER CF A15,INSWQ QUEUE REQUEST RB DCRTN EJECT * * * * READ * * * COMPLETE WHEN: * MESSAGE RECEIVED * TIME OUT * * DCRD EQU * * * LD A1,DWTBQ,A6 CHECK BUFFER QUEUE RF(NZ) DCRD10 NOT EMPTY * * * CF A15,TIMERE START TIMER * * * RB DCRTN * * * BUFFER WAITING IN QUEUE * * DCRD10 EQU * LDR* A2,A1 GET NEXT ONE ST A2,DWTBQ,A6 STORE AS FIRST IN QUEUE LD A4,2,A1 GET LENGTH SUK A4,1 UPDATE LENGTH ST A4,ECBEL,A8 STORE IN ECB ADK A1,6 ADJUST ADDRESS LDR A4,A1 RECEIVE BUFFER ADDRESS LDK A1,0 CF A15,DC:MIN MOVE DATA TO USER BUFFER 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 EJECT * * * SET REQUEST TIMER VALUE * * REQTIM EQU * LD A2,ECBCW,A8 TIMEOUT VALUE ST A2,DWTTIM,A6 SAVE TIMEOUT VALUE IN DWT RB DCTP30 EJECT ********************************************************************* * * ILLEGAL SIZE OF APPLICATION BUFFER *** 9.1 *** * ********************************************************************* IL:LEN EQU * LDKL A1,/8008 REQUEST ERROR + ILLEGAL LENGTH ABL DISEND 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 RF TIME10 * * TIMEOUT READ TIMER * TOUTRE EQU * LDR A6,A1 FETCH DWT CM DWTTP,A6 * TOUTR1 EQU * LDK A1,/40 INDICATE TIME OUT RB ENDIO COMPLETE REQUEST EJECT * * WRITE TIMER=TIMWR * TIMEWR LDR A1,A6 LD A2,DWTTIM,A6 GET TIMEOUT VALUE RF(Z) TIME10 NO TIMING ST A2,TIMWR CF A15,SETIME DATA TOUTWR TIMWR DATA 0 ST A4,DWTTP,A6 TIME10 EQU * IFT CPU852=1 ADKL A15,4 ABR* A15 XIF IFT CPU852=0 RTN A15 XIF EJECT * * TIMEOUT WRITE TIMER * TOUTWR EQU * LDR A6,A1 FETCH DWT CM DWTTP,A6 LD A2,DWTECB,A6 LD A4,ECBBA,A2 FETCH BUFFER 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 EQU * IFT CPU852=1 ADKL A15,4 ABR* A15 XIF IFT CPU852=0 RTN A15 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 EJECT * * * INSERT DWT IN WRITE REQUEST QUEUE * * A2,A3,A4 DESTROYED * A6=DWT * INSWQ LDKL A2,DCWRQ GET QUEUE ANCHOR 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 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,DW0700+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,DW0700 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 LD A4,2,A3 SET LENGTH SUK A4,1 UPDATE LENGTH ST A4,ECBEL,A8 STORE NUMBERS OF CHARACTERS LD A4,4,A3 ST A4,ECBCW,A8 STORE LINE DEVICE ADDRESS ADK A3,6 ADDRESS DATA PART LDR A4,A3 RECEIVE BUFFER ADDRESS LDK A1,0 CF A15,DC:MIN MOVE DATA TO USER ADDRESS RF CKM110 CKM200 LD A1,DCSTCU NO MESSAGE RECEIVED,CHECK STATUS OR A1,DCONOF TAKE CARE OF POLL TIME OUT CW A1,DCSTOL ST A1,DCSTOL RF(E) CKM110 NO CHANGE OF STATUS ORKL A1,/2000 INDICATE STATUS CHANGE CKM100 EQU * CF A15,TENDIO COMPLETE READ GENERAL REQUEST CKM110 EQU * IFT CPU852=1 ADKL A15,4 ABR* A15 XIF IFT CPU852=0 RTN A15 XIF EJECT * * * HDLC INPUT PROCESS * * READ ONE FRAME,ANALYZE IT * QUEUE RESPONSES FOR * OUTPUT PROCESS * * BRM EQU * BASIC RECEIVE MODE LDKL A5,STBIN LOAD INPUT STACK BASE CF A5,RDFRAM READ ONE FRAME RB(NZ) BRM INVALID FRAME LC A1,FIELD1 GET CLUSTER ADDRESS CC A1,DW0700+1 RB(NE) BRM NOT MENT FOR THIS CLUSTER LC A1,FIELD1+1 GET C-FIELD LDR A2,A1 SAVE IT XRK A2,SNRM RF(NZ) BRM100 * * * SNRM RECEIVED * * LDK A1,1 ST A1,MODE INDICATE NORMAL RESPONSE MODE CF A5,RESCON RESET COUNTERS BRM050 EQU * LDK A1,1 LOAD 'UA' RF BRMTRA * BRM100 EQU * LDR A2,A1 XRK A2,DISC DISCONNECT ? RF(NZ) BRM110 * * * DISC RECEIVED * * BRM105 EQU * CM MODE INDICATE DISCONNECT MODE RB BRM050 BRM110 EQU * LD A2,MODE RF(NZ) BRM120 NRM OR CMDR * * * DISCONNECT MODE, REQUEST FOR ONLINE * * LDK A1,2 LOAD 'ROL' RF BRMTRA BRM120 EQU * SUK A2,2 RF(Z) BRM160 CMDR-MODE EJECT * * NORMAL RESPONSE MODE * TRANSACTIONS * ANK A1,/F IGNORE COUNTERS LDR A2,A1 GET C-FIELD XRK A2,RNRMSK RF(NZ) BRM130 * * RNR RECEIVED * * CF A5,UPDCON UPDATE COUNTERS AND CHECK OUTPUT QUEUE CF A5,TSTNR CMDR ? LC A1,FIELD1+1 GET C-FIELD ANK A1,/10 CHECK POLL-BIT RB(Z) BRM P-BIT OFF LDK A1,3 LOAD 'RR' LD A2,DCRBUF RF(NZ) BRMTRA OK READY TO RECEIVE LDK A1,5 LOAD RNR RF BRMTRA * BRM130 EQU * LDR A2,A1 GET MASK XRK A2,RRMSK RF(Z) BRM140 LDR A2,A1 XRK A2,REJMSK RF(NZ) BRM150 * * RR OR REJ RECEIVED * BRM140 EQU * CF A5,UPDCON UPDATE COUNTERS AND CHECK OUTPUT QUEUE CF A5,TSTNR CMDR ? BRM145 EQU * LC A1,FIELD1+1 GET C-FIELD ANK A1,/10 CHECK POLL-BIT RB(Z) BRM P-BIT OFF LDK A1,6 INDICATE POLL-BIT RECEIVED RF BRMTRA * EJECT * * FETCH IF INVALID CONTROL FIELD * BRM150 EQU * LDR A2,A1 ANK A2,IMSK RF(Z) BRM170 I-FRAME LC A1,FIELD1+1 GET C-FIELD ANK A1,/EF EXCLUDE POLL-BIT LDR A2,A1 XRK A2,UIMSK UI ? RF(Z) BRM155 YES LDR A2,A1 XRK A2,SIM SIM ? RF(NZ) BRM156 NO BRM155 EQU * LC A1,FIELD1+1 ANK A1,/10 P-BIT ON ? RB(NZ) BRM050 YES RB BRM * * * INVALID COMMAND * * BRM156 EQU * LDK A2,0 PRESENT CONTERS LDK A3,/80 FAIL CODE (CMDR MODE SETTING) CF A5,PRCMDR INIT CMDR BRM160 EQU * LDK A2,2 ST A2,MODE INDICATE CMDR MODE LDK A1,4 LOAD 'CMDR' * * QUEUE FOR TRANSMISSION * BRMTRA EQU * CF A15,QMTRM QUEUE FOR TRANSMISSION RB BRM EJECT * * * I-FRAME RECEIVED * * BRM170 EQU * LD A1,BUFNUL RB(NZ) BRM NO BUSY STATEMENT CF A5,UPDCON UPDATE COUNTERS LD A1,STATUS CHECK UNEXPECTED N(S) ANK A1,1 N(S) OK? RF(NZ) BRM185 NO CF A5,TSTNR CHECK UNEXPECTED N(R) LC A1,FIELD1+1 ANK A1,/10 CHECK POLL BIT RF(Z) BRM180 P-BIT OFF LDK A1,6 INDICATE POLL-BIT RECEIVED CF A15,QMTRM QUEUE FOR TRANSMISSION BRM180 EQU * CF A15,GRBUF ALLOCATE LINK BUFFER * * HERE TO PROCESS AVAILABLE FRAME * A4=BUFFER * LC A2,+5,A4 GET STA ANK A2,/FF CF A5,FINTER FIND OUT DESTINATION LDR A6,A3 DWT FOUND RF(NZ) BRM190 YES EJECT * * SUBTERMINAL ADDRESS IS NOT CONTAINED * IN DCTAB SUBSET. * QUEUE INCOMMING MESSAGE TO DC-TASK * AND CHECK IF REQUEST PENDING * ST A2,+4,A4 SAVE WRONG SUB TRMNL. ADDRESS CF A5,QRBUF QUEUE IN DW0700 CF A15,CKMESS COMPLETE DC-REQUEST ABL BRM * * EXEPTION STATE:WRONG N(S) * FULL-DUPLEX:SEND REJ WITHOUT TESTING POLL-BIT * HALF-DUPLEX:WAIT POLL-BIT * BRM185 EQU * CM STATUS RESTORE STATUS LDKL A1,HFDUP GET FULL OR HALF DUPLEX RB(Z) BRM145 WAIT POLL LDK A1,/FF INDICATE REJ TOBE SENT RB BRMTRA EJECT * * COMPLETE READ OR EXCHANGE REQUEST * BRM190 EQU * LD A1,DWTST,A6 GET STATUS RF(N) COMP30 NO REQUEST LD A1,DWTOR,A6 GET ORDER SUK A1,2 RF(NZ) COMP30 NOT READING COMP25 EQU * LD A8,DWTECB,A6 GET ECB ADDRRESS LD A1,+2,A4 GET LENGTH SUK A1,1 UPDATE LENGTH ST A1,ECBEL,A8 SAVE IT CF A5,CTIME RESET TIMER =2 ST A2,ECBCW,A8 ADK A4,6 ADDRESS OF BUFFER DATA LDK A1,0 CF A15,DC:MIN MOVE DATA TO USER BUFFER ABL BRM BASIS RECEIVE MODE EJECT * * QUEUE RECEIVED MESSAGE * COMP30 EQU * LDK A2,DWTBQ GET PROPER QUEUE ANCHOR ADR A2,A6 LC A1,+6,A4 GET TC IDENT ANK A1,/FF ST A1,+4,A4 SAVE IT CF A5,QR100 QUEUE RECEIVED BUFFER LD A1,DWTBQ,A6 LDR* A2,A1 FIRST IN QUEUE RF(NZ) COMP35 LDR A1,A6 CF A15,SETIME START BUF SUPERVISION TIMER DATA COMP40,TIMBUF ST A4,DWTBTP,A6 COMP35 ABL BRM * * TIME OUT ENTRY * COMP40 EQU * LDR A6,A1 GET DWT CM DWTBTP,A6 LD A1,DWTBQ,A6 GET ANCHOR RF(Z) COMP50 NOTHING IS QUEUED CM DWTBQ,A6 CLEAR QUEUE ANCHOR COMP42 EQU * LDKL A2,DW0700+DWTWQ GET DC-TASK QUEUE ANCHOR COMP43 EQU * LDR* A3,A2 RF(Z) COMP44 END OF QUEUE LDR A2,A3 RB COMP43 COMP44 EQU * STR A1,A2 INSERT BUFFERS IN DC TSSK QUEUE CF A15,CKMESS COMPLETE DC-TASK READ COMP50 EQU * ABL TDISP EJECT * * HERE TO TEST N(R) VALIDITY * TSTNR EQU * LD A1,STATUS GET STATUS ANK A1,2 WRONG N(R)? RF(NZ) TSTNRX YES RTN A5 ********** INIT CMDR PARAMETERS *********** TSTNRX EQU * CM STATUS RESTORE STATUS LD A1,VSCNT SLL A1,4 LD A2,VRCNT ORR A2,A1 PRESENT COUNTERS IN A2 LDK A3,/10 FAIL CODE IN A3 CF A5,PRCMDR INIT FIELDS ABL BRM160 EJECT * * HERE TO INITIALIZE CMDR OUTPUT FIELDS * PRCMDR EQU * LDK A1,CMDR LOAD 'CMDR'+F-BIT LDKL A4,DLOBUF GET BUFFER ADDRESS ADK A4,1 SCR A1,A4 STORE C-FIELD LC A1,FIELD1+1 GET WRONG RECEIVED C-FIELD ADK A4,1 SCR A1,A4 STORE IT ADK A4,1 SCR A2,A4 SAVE PRESENT COUNTERS ADK A4,1 SCR A3,A4 SAVE FAIL PARAMETERS RTN A5 EJECT * * * HDLC OUTPUT PROCESS * * QUEUED AS MONITOR JOB FROM INPUT PROCESS * * TRANSMIT FRAME IF ANY ON QUEUE * PRIORITY 1: COMMANDS/RESPONSES (UA,CMDR,ROL) * PRIORITY 2: RR-FRAMES WHEN NOTHING PENDING * * TRM EQU * INH SET INHIBIT LDKL A5,STBUT LOAD STACKBASE IM TRMACT OUTPUT IN PROGRESS LDR A7,A1 SAVE PARAMETER CCK A1,/FF00 REJ ? RF(NE) TRM050 NO LDK A1,REJ LOAD 'REJ'+ F-BIT RF TRM110 TRM050 EQU * CF A5,CPTIM CHECK POLL TIMER LDR A1,A7 RESTORE PARAMETER RF(Z) TRM150 CHECK APPLICATION QUEUE SUK A1,1 RF(Z) TRM100 UA ON QUEUE SUK A1,1 RF(Z) TRM120 ROL ON QUEUE SUK A1,1 RF(Z) TRM130 RR ON QUEUE SUK A1,1 RF(Z) TRM140 CMDR ON QUEUE SUK A1,1 RF(Z) TRM180 RNR ON QUEUE RF TRM150 CHECK APPLICATION QUEUE EJECT * * * UA SHOULD BE SENT * * TRM100 EQU * LDK A1,UA LOAD 'UA'+F TRM110 EQU * CF A5,TRSFR SEND SHORT FRAME RF TRMEND * * * ROL SHOULD BE SENT * * TRM120 EQU * LDK A1,ROL LOAD 'ROL'+F RB TRM110 * * * RR SHOULD BE SENT * * TRM130 EQU * LDK A1,RR LOAD 'RR'+F TRM135 EQU * LD A2,VRCNT GET NEXT EXPECTED SEND COUNTER SLL A2,5 ADJUST IT ORR A1,A2 INSERT IN RR RB TRM110 * * * CMDR SHOULD BE SENT * * TRM140 EQU * LDKL A4,DLOBUF GET BUFFER ADDRESS LDK A3,5 FRAME LENGTH TO A3 CF A5,WRFRAM SEND THE FRAME RF TRMEND * * * CHECK APPLICATION QUEUE AND SEND * I-FRAME OR RR-FRAME * * TRM150 EQU * LD A6,DCRBUF RF(NZ) TRM190 OK CHECK QUEUE * * * RNR SHOULD BE SENT, BUFFER SHORTAGE * * TRM180 EQU * LDK A1,RNR LOAD 'RNR'+F RB TRM135 * * CHECK APPLICATION QUEUE * TRM190 EQU * LD A6,DCWRQ CHECK APPLICATION QUEUE RB(Z) TRM130 NOTHING IN QUEUE EJECT * * * * HERE TO TRANSMIT AN IFRAME * TRM300 EQU * SUK A6,DWTWQ GET DWT ADDRESS LDKL A4,DLOBUF GET OUTPUT BUFFER ADDRESS CF A5,PRCFI PREPARE C-FIELD FORMAT LD A8,DWTECB,A6 GET ECB ADDRESS LD A3,ECBRL,A8 GET REQUESTED LENGTH ADK A3,1 ADJUST LENGTH ST A6,WRDWT SAVE WRITING DWT LDR* A1,A6 GET SUB-TERM ADDRESS ANK A1,/FF * IFF MMUPAG=0 LDKL A4,MMUBUF GET MMU BUFFER ADDRESS LD A7,SWMMU GET MMU FLAG RF(NZ) TRM320 BUFFER IS IN MMU BUFFER IM SWMMU INDICATE USER BUFFER IS MOVED ST A4,ECBBA,A8 CF A15,DC:MOT MOVE DATA TO MMU BUFFER TRM320 EQU * XIF * LD A7,ECBBA,A8 OUTPUT BUFFER ADDRESS ADK A7,1 USE FREE-WORD TO INSERT IT SCR A1,A7 SUK A7,2 INIT OUTPUT ADDRESSING ST A7,SWITCH