|
|
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: 94100 (0x16f94)
Notes: pts_type(SC)
Names: »DRDC07.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DRDC07.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/DRDC07.SC«
IDENT DRDC07 REL 11.0 81-06-02 870105041100
=1,RETURN CODE
REL 11.0 81-01-26
=2,MESPAS
REL 11.0 81-04-14
*********************************************
*
* PHILIPS TERMINAL SYSTEM PTS
*
*
* DRDC07: DRIVER DATA COMMUNICATION
* UNBALANCED PROCEDURE WITH OPTION 2 (UNR 2) - REJ
* (FOR SECONDARY STATION)
*
* REFERENCES:
* ECMA STANDARD-40 HDLC FRAME STRUCTURE
* ECMA STANDARD-49 HDLC ELEMENTS OF PROCEDURE
* ECMA STANDARD-60 HDLC UNBALANCED CLASS OF PROCEDURES
*
*********************************************
EJECT
*
*
* ENTRY POINTS
*
*
ENTRY DC07AD ADDRESS BLOCK TERMINAL REQUESTS
ENTRY IH0701 INPUT INTERRUPT
ENTRY IH0702 OUTPUT INTERRUPT
ENTRY DC07ON POWER ON ROUTINE
*
*
* EXTERNAL REFERENCES
*
*
EXTRN TDISP DISPATCHER ENTRY
EXTRN SAVE8 SAVE A1-A8 ON A15 STACK
EXTRN TENDIO COMPLETE I/O EVENT
EXTRN SETIME SET TIMER
EXTRN DWTCHP TERMINAL ADDRESS
EXTRN DWTST DWT STATUS
EXTRN DWTOR DWT ORDER
EXTRN DWTECB DWT ECB
EXTRN DWTTAB TTAB ADDRESS
EXTRN DWTDTE SYMBOLIC DTE ADDRESS
EXTRN PFPOST WAIT FOR POWER UP IF SET
EXTRN MOVUS MOVE FROM USER TO SYSTEM BFR
EXTRN MOVSU MOVE FROM SYSTEM TO USER BFR
EXTRN DCSRED READ STATISTICS ENTRY POINT
EXTRN DCSRLL RESET ALL STATISTICS BUFFERS ENTRY POINT
EXTRN DCSUPR UPDATE STATISTICS ENTRY POINT IN DCSTAT
EXTRN GETDNA CONVERT DTE SYMB TO PHYS
EXTRN GETSNA CONVERT STA SYMB TO PHYS
EXTRN GETSSA CONVERT STA PHYS TO SYMB
EJECT
**********************************************************************
*
* REGISTER USAGE:
*
* A1 WORK (RETURN CODE)
* A2 WORK
* A3 WORK (BUFFER LENGTH)
* A4 WORK (BUFFER POINTER)
* A5 DRIVER STACK POINTER
* A6 DWT ADDRESS
* A7 WORK, ORDER CODE
* A8 ECB ADDRESS
*
************************************************************************
EJECT
*************************************************************************
*
* CONDITIONAL ASSEMBLY
*
*************************************************************************
*
* INTERNAL:
*
*
* 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
*
CUTIME EQU 5 CONTROL UNIT READY TIMEOUT = 500MS
*
* EXTERNAL:
*
*
X:A EQU 3
RBUFNR EQU X:A NIMBER OF RECEIVE BUFFERS
X:B EQU 130
RBUFL EQU X:B RECEIVE BUFFER LENGTH
X:C EQU 0
MUX EQU X:C MUX IF ::= 1. ELSE PC
X:D EQU 4
WIRES EQU X:D 4-WIRE IF ::= 4. 2-WIRE IF ::=2
X:E EQU 0
SUB EQU X:E SUBTERMINAL ADDRESSING IF ::= 1
X:F EQU 0
UNR2 EQU X:F REJ-FRAME SUPPORT IF ::= 1
X:G EQU 0
MESPAS EQU X:G MESSAGE PASSING IF ::= 1
X:H EQU 0
STAT EQU X:H STATISTIC SUPPORT IF ::= 1
X:I EQU 0
LOGG EQU X:I LOGG FUNCTION IF ::= 1
X:J EQU 0
P6805 EQU X:J 6805 COMPUTER IF ::= 1
X:K EQU 2
IFF P6805=1
CHLCIN EQU X:K INPUT DEVICE ADDRESS
XIF
IFT P6805=1
CHLCIN EQU X'0A' INPUT DEVICE ADDRESS
XIF
X:L EQU 130
TBUFL EQU X:L MMU AND/OR MUX BUFFER
EJECT
**********************************************************************
*
* GENERATED PARAMETERS
*
**********************************************************************
IFT MUX=1
CHLCUT EQU CHLCIN+/1 OUTPUT DEVICE ADDRESS
XIF
IFT MUX=0
IFF P6805=1
CHLCUT EQU CHLCIN+/10 OUTPUT DEVICE ADDRESS
XIF
IFT MUX=0
IFT P6805=1
CHLCUT EQU CHLCIN+1
XIF
*
* BUFFER HEADER EQUATES
*
RCVHDR EQU 6 RECEIVE BUFFER HEADER LENGTH IN BYTES
RCHDRW EQU 3 RCVHDR IN WORDS
RCVEL EQU 2 EL POS. IN RCV BFR HEADER
RCVTCA EQU 4 DISPLACEMENT FOR A+C
BUFLEN EQU TBUFL+TBUFL BFR LENGTH IN CHARS.
EJECT
**************************************
*
* DCDEFS COMMON DEFS FOR DC DRIVERS/PACKAGES
*
**************************************
**********************************************************************
*
* ECB
*
**********************************************************************
*
ECBFC EQU 0 FILE CODE WORD
ECBBA EQU 2 BUFFER ADDRESS
ECBRL EQU 4 REQUESTED LENGTH IN BYTES
ECBEL EQU 6 EFFECTIVE LENGTH IN BYTES
ECBRC EQU 8 RETURN CODE
ECBCW EQU 10 CONTROL WORD
ECBCW1 EQU ECBCW CONTROL WORD 1
ECBCW2 EQU 12 CONTROL WORD 2
EJECT
**********************************************************************
*
* DWT LAYOUT
*
**********************************************************************
*
* ...................
* 0 . DWTCHP .
* ...................
* 2 . DWTST .
* ...................
* 4 . DWTECB .
* ...................
* 6 . DWTOPT . DWTOR .
* ...................
* 8 . DWTADR .
* ...................
* 10 . DWTTAB .
* ...................
* 12 . DWTWAT .
* ...................
* 14 . DWTTQ .
* ...................
* (16). DWTUEC . IF MMUPAG=1
* ...................
* (18). DWTMEC . IF MMUPAG=1
* ...................
* DWTDRD +2 . DWTSTB .
* ...................
* +4 . DWTCHD .
* ...................
* +6 . DWTCHN .
* ...................
* +8 . DWTLAD .
* ...................
* +10 . DWTRAD .
* ...................
* +12 . DWTDR1/SUB .
* ...................
* +14 . DWTRCL .
* ...................
* +16 . DWTRTV .
* ...................
* +18 . DWTRTP .
* ...................
* +20 . DWTOPE .
* ...................
* +22 . DWTOPN .
* ...................
* +24 . DWTIPC .
* ...................
* +26 . DWTIPT .
* ...................
* +28 . .
* / DRIVER DEPEND /
* / /
* / /
* ...................
* . STATISTIC . IF STAT=1 AND DWTSTB /=0
* / BUFFER /
* ...................
*
DWTTQ EQU 14
DWTUEC EQU DWTTQ+2
DWTMEC EQU DWTUEC+2
IFT MMUPAG=0
DWTDRD EQU DWTTQ+2 START OF DC DEPENDENT AREA
XIF
IFT MMUPAG=1
DWTDRD EQU DWTMEC+2 START OF DC DEPENDENT AREA
XIF
DWTSTB EQU DWTDRD OFFSET REL START DWT TO STATISTIC BUFF IF ANY
DWTCHD EQU DWTDRD+2 CONFIG CHAIN LINK HEAD DWT
DWTCHN EQU DWTDRD+4 CONFIG CHAIN LINK NEXT DWT
DWTLAD EQU DWTDRD+6 LOCAL SYMBOLIC DTE ADDRESS
DWTRAD EQU DWTDRD+8 REMOTE SYMBOLIC DTE ADDRESS
DWTDR1 EQU DWTDRD+10 DRIVER DEP WORD 1
DWTSUB EQU DWTDR1 SYMBOLIC SUBADDRESS
DWTRCL EQU DWTDRD+12 REQUEST CONTROL WORD
DWTRTV EQU DWTDRD+14 REQUEST TIMER VALUE
DWTRTP EQU DWTDRD+16 REQUEST TIMER POINTER
DWTOPE EQU DWTDRD+18 O/P DATA Q EXPEDITED/STATUS LINK NXT DWT
DWTOPN EQU DWTDRD+20 O/P DATA Q NORMAL LINK NXT DWT
DWTIPC EQU DWTDRD+22 I/P DATA Q LINK TO BUFFER
DWTIPT EQU DWTDRD+24 I/P DATA TIMER POINTER
EJECT
*********************************************************************
*
* BUFFER LAYOUTS:
*
**********************************************************************
*
* TRANSMIT BUFFERS
*
* 1. APPLICATION
*
* *******/ /*********************
* * / / *
* * T E / / X T *
* * / / *
* *******/ /*********************
* <---- ECBRL --->
*
*
* 2. MMU AND/OR IOP INTERNAL DRIVER BUFFER
*
* **********************************************
* * * * * / / *
* * A * C * STA * / / T E X T *
* * * * * / / *
* **********************************************
* /
* --- 1ST APPLICATION CHARACTER
* A = TCA (A FIELD), STARTS ON WORD BOUNDARY
* C = CONTROL FIELD
* STA = SUBTERMINAL ADDRESS (FROM DWT) IF GENERATED
EJECT
*
* RECEIVE BUFFERS
*
* PROGRAMMED CHANNEL:
* ****************************************************/ /******
* * * / / *
* * RCVHDR * / / *
* * * / / *
* ****************************************************/ /******
* * * * * / / *
* * A * B * TCA * STA * TEXT / / *
* * * * * * / / *
* ****************************************************/ /******
* <--- ECBEL --->
* /
* '-- ECBBA
* MMU AND/OR IOP:
* **************************************************/ /******
* * * / / *
* * RCVHDR * / / *
* * * / / *
* **************************************************/ /******
* * * * * * / / *
* * A * B * C * STA * TEXT / / *
* * * * * * / / *
* **************************************************/ /******
* <--- ECBEL --->
* /
* '--- ECBBA
* A = LINKAGE TO NEXT RECEIVE BUFFER (1 WORD)
* B = EFFECTIVE LENGTH EXCL. STA (1 WORD)
* C = ADDRESS + CONTROL FIELDS OF FRAME (1+1 BYTE) (IF IOP)
* STA = FIRST DATA BYTE FROM LINE, ASSUMED = SUBTERMINAL ADDRESS (1 BYTE)
* IF GENERATED
* TCA = TERMINAL ADDRESS FROM A-FIELD OF FRAME (1 BYTE)
***********************************************************************
EJECT
**********************************************************************
*
* TOSS INTERFACE AREAS AND CONSTANTS
*
**********************************************************************
*
DEVIND EQU 0 DEVICE INDEX DATA COMMUNICATION
*
* DRIVER ADDRESS BLOCK
*
DATA BUFLEN MMU BUFFER SIZE
DATA DEVIND DEVICE INDEX
DC07AD DATA DCACT ADDRESS BLOCK
DATA ABORT ABORT ROUTINE ADDRESS
*
* REGISTER USAGE:
*
* ENTRY: A6 = DWT ADDRESS
* A7 = ORDER CODE
* A8 = ECB ADDRESS
* EXIT: A1 = RETURN CODE
EJECT
*
*
* REQUEST HANDLING
*
*
* ORDER CODE (A7)
*
OPEN EQU /21 OPEN
CLOSE EQU /22 CLOSE
CONPAS EQU /27 CONNECT PASSIVE
DISCO EQU /2F DISCONNECT
READO EQU 2 READ
WRITEO EQU 6 WRITE
RSTAT EQU /00 READ STATUS
STATIS EQU /2D READ/RESET STATISTICS
STIMOT EQU /39 SET TIMEOUT VALUE
*
* OPTIONS:
*
TYPRR EQU /43 RESET STATISTICS AFTER READ
*
* RETURN CODE EQUATES (A1)
*
RCREQ EQU /8000 REQUEST ERROR
RCABRT EQU /4000 REQUEST ABORTED
RCDATA EQU /0100 DATA UNIT QUEUED & AVAILABLE
RCSTAT EQU /0080 STATUS INFORMATION AVAILABLE
RCTIME EQU /0040 TIMEOUT
RCSEQ EQU /0010 SEQUENCE ERROR
RCLGTH EQU /0008 ILLEGAL LENGTH
RCLOGC EQU /0002 LOGICAL CONNECTION ERROR
RCPHYC EQU /0001 PHYSICAL CONNECTION ERROR
EJECT
**********************************************************************
*
* HARDWARE INTERFACE CONSTANTS AND EQUATES
*
**********************************************************************
*
* 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
CIR4MX EQU /D RECEIVE ON 4-WIRE MUX
IFT WIRES=2
CIRPC EQU CIAREP RECEIVE P.C.
CIRMX EQU CIREMX RECEIVE IOP
XIF
IFT WIRES=4
CIRPC EQU CIREPC RECEIVE P.C.
CIRMX EQU CIR4MX RECEIC
XIF
CIAREM EQU /E RECEIVE ALARM ON MUX CHANNEL
EJECT
*
* 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
IFT WIRES=2
CIXPC EQU CIT2WP TRANSMIT P.C.
CIXMX EQU CIT2WM TRANSMIT IOP
XIF
IFT WIRES=4
CIXPC EQU CIT4WP TRANSMIT P.C.
CIXMX EQU CIT4WM TRANSMIT IOP
XIF
CIIDLE EQU 4 TRANSMIT IDLE 1
*
* MUX DEVICE ADDRESSES ETC.
*
IOPIN EQU CHLCIN+CHLCIN INPUT DEVICE ADDRESS
IOPOUT EQU CHLCUT+CHLCUT OUTPUT DEVICE ADDRESS
WDXFER EQU /8000 WORD TRANSFER DCMODE
WRCMD EQU /4000 IOP WRITE COMMAND
*
* DWT STATUS
*
DWT:C EQU 1 CONNECTED =1
EJECT
**********************************************************************
*
* PROTOCOL CONSTANTS/WORK AREAS/EQUATES
*
**********************************************************************
*
* PROCEDURE WORK AREAS
*
FRMRMD DATA 0 FRMR CONTROL MODE
AIGFIL DATA 0 MODE SWITCH
BUFADD DATA 0 SAVE BUFFER ADDRESS
SAVPAM DATA 0 SAVE ACTION PARAMETER
SAHDLC DATA 0 SAVE STATUS
DCTPGP DATA 0 SAVE TIMER POINTER
TIMPOL EQU 500 POLL TIME OUT
STATUS DATA 0 (=1):N(S)FAIL,(=2):N(R) FAIL
BUFNUL DATA 0 BUFFER OVERFLOW INDICATOR
SWITCH DATA 0 OUTPUT BUFFER FLAG
IFT MESPAS=1
DTEDDT DATA 0 DISCARD DWT =2
XIF
TRMACT DATA 0 OUTPUT ACTIVE FLAG
IFF MMUPAG+MUX=0
SWMMU DATA 0 FLAG TO INDIC.USER BUFFER MVD/NOT MVD
XIF
TESTCF DATA 0 INPUT BUFFER FLAG
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 DCMODE
DISC EQU /53 SET DISCONNECT DCMODE
*
* MASKS ON RECEIVED FRAMES
*
RRMSK EQU 1 RECEIVE READY
RNRMSK EQU 5 RECEIVE NOT READY
REJMSK EQU 9 REJECT COMMAND
*
* RESPONSES
*
RNR EQU /15 RECEIVE NOT READY
UA EQU /73 NON SEQUENCED ACK
DM EQU /1F DISCONNECT DCMODE
RR EQU /11 READY TO RECEIVE
FRMR EQU /97 FRAME REJECT
REJ EQU /19 FRAME REJECTION
EJECT
*
* HDLC FRAME FORMAT:
*
*
* *************************//*********************************
* * * * * * * * *
* * F * A * C * I * FCS-1 * FCS-2 * F *
* * * * * * * * *
* *************************//*********************************
*
* F = OPENING AND CLOSING FLAGS (01111110)
*
* A = ADDRESS FIELD, 8 BITS, APPLICATION DEPENDENT
*
* C = CONTROL FIELD:
* BIT 1 2 3 4 5 6 7 8
* I I I I I I I I I
* I-FRAME I 0 I N(S) I P/F I N(R) I
* S-FRAME I 1 I 0 I S I S I P/F I N(R) I
* U-FRAME I 1 I 1 I M I M I P/F I M I M I M I
*
* I-FRAME = INFORMATION FRAME
*
* I = INFORMATION FRAME
* S = SUPERVISORY FRAME
* U = UNNUMBERED FRAME
* N(S) = SEND SEQUENCE NUMBER
* N(R) = RECEIVE SEQUENCE NUMBER
* P/F = POLL/FINAL BIT
*
* S = SUPERVISORY BITS:
* BIT 3 4
* 0 0 = RR = RECEIVE READY
* 0 1 = REJ = REJECT
* 1 0 = RNR = RECEIVE NOT READY
*
* M = MODIFIER BITS: (C - COMMAND, R = RESPONSE)
* BIT 3 4 - 6 7 8
* 0 0 0 0 1 = SNRM = SET NORMAL RESPONSE DCMODE (C)
* 1 1 0 0 0 = DM = DISCONNECT DCMODE (R)
* 0 0 0 1 0 = DISC = DISCONNECT (C)
* 0 0 1 1 0 = UA = UNNUMBERED ACKNOWLEDGE (R)
* 1 0 0 0 1 = FRMR = FRAME REJECT (R) )
*
* BITS GIVEN IN ORDER OF TRANSMISSION; IN MEMORY BIT 8 IS FIRST
*
* FCS = FRAME CHECK SEQUENCE (CCITT CRC-16)
*
EJECT
**********************************************************************
*
* DTE CONTROL TABLE - DCT
* SUBSTITUTES DRIVER DWT FOR SINGLE-LINE DRIVER
*
**********************************************************************
*
DTE EQU *
DTESTB EQU DTE+DWTSTB REQUIRED STATISTICS BUFFER OFFSET ADDRESS
DCREQS DATA 0 REQUEST STATE:
* 0 = INACTIVE (CLOSED)
* 1 = ACTIVE (OPEN)
* 2 = CONNECTED
DCHDLS DATA 0 HDLC PROCEDURE STATE:
* 0 = OFF
* 1 = NDM
* 2 = NRM
DCCUS DATA 0 CONTROL UNIT STATE:
* 0 = DISCONNECTED
* 1 = CONNECTED
DCMODE DATA OFF DCMODE - CONTAINS BRANCH ADDRESS
*
RORG DTESTB REQUIRED POSITION; MAKE DAMN SURE
* THERE'S NO OVERLAY!!!
DCSTB DATA STWSID-DTE RELATIVE OFFSET TO STATISTICS BUFFER
DCDWH DATA 0 DUMMY BACKWARD LINK TO HEAD 'DWT'
DCDWA DATA 0 DWT CHAIN ANCHOR
DCDTE DATA 0 SYMBOLIC DTE ADDRESS
DCCON DATA 0 CONNECTION-IN-PROGRESS INDICATOR
EJECT
DCWRQ DATA 0 WRITE REQUEST QUEUE
DCIPA DATA RBUFP RCV BFR QUEUE ANCHOR
DCIPC DATA 0 QUEUED RECEIVED I-FRAMES WHEN NO SUBADDRESSING
DCTCA DATA 0 LINE ADDRESS
DCSTA DATA 0 ACTIVE SUBTERMINAL ADDRESS
DCLCNT DATA 0 LOOP COUNTER
*
* STATISTICS BUFFER
*
STWSID DATA 0 RESERVED FOR SYMBOLIC ID
STWCST DATA 0 COUNTER STATUS INDEX
STWMIX DATA /20 COUNTER STATUS INDEX
STWCTA RES /20 BUFFER
EJECT
*
* COUNTER INDECES - PARAMETER-1 EQUATES
*
* REQUEST LEVEL COUNTERS:
* 01 TO /0D ARE NOT USED IN RELEASE 11
*
CSRCON EQU /01 CONNECTIONS ESTABLISHED
CSRCBY EQU /02 CONNECTION NOT ESTABLISHED - BUSY
CSRMSR EQU /03 MESSAGES RECEIVED
CSRCHR EQU /C5 CHARACTERS RECEIVED
CSRMST EQU /06 MESSAGES TRANSMITTED
CSRCHT EQU /C8 CHARACTERS TRANSMITTED
CSRTOP EQU /09 TIMEOUT
CSRABT EQU /0A ABORTED
CSRERR EQU /0B ERROR
CSRTRE EQU /0C TRANSMISSION ERROR
CSRXC1 EQU /0D PROTOCOL DEPENDENT
*
* LINK LEVEL COUNTERS
CSBRIF EQU /10 BITOR I-FRAMES RECEIVED
CSBRBY EQU /11 " I-FRAMES REJECTED BUFFER BUSY
CSBRBO EQU /12 " I-FRAMES REJECTED BUFFER OVERFLOW
CSBRAB EQU /13 " I-FRAMES REJECTED ABORTED
CSBRPE EQU /14 " I-FRAMES REJECTED FCS ERROR
CSBTIF EQU /15 " I-FRAMES TRANSMITTED
CSBTRT EQU /16 " I-FRAMES RETRANSMITTED
CSBRSM EQU /17 " SNRM/SARM/SABM RECEIVED
CSBRDI EQU /18 " DISC RECEIVED
CSBRDM EQU /19 " DM RECEIVED
CSBRFR EQU /1A " FRMR RECEIVED
CSBRUA EQU /1B " UA RECEIVED
CSBRRJ EQU /1C " REJ RECEIVED
CSBRNR EQU /1D " RNR RECEIVED
CSBTSM EQU /1E " SNRM/SARM/SABM TRANSMITTED
CSBTDI EQU /1F " DISC TRANSMITTED
CSBTDM EQU /20 " DM TRANSMITTED
CSBTFR EQU /21 " FRMR TRANSMITTED
CSBTUA EQU /22 " UA TRANSMITTED
CSBTRJ EQU /07 " REJ TRANSMITTED
CSBTNR EQU /24 " RNR TRANSMITTED
CSBXC1 EQU /25 " PROTOCOL DEPENDENT
CSBXC2 EQU /26 " " "
CSBXC3 EQU /27 " " "
* DTE/DCE LEVEL COUNTERS
CSCDTE EQU /28 DTE NOT OPERABLE
CSCDIT EQU /29 I/P THROUGHPUT ERROR
CSCDOT EQU /2A O/P THROUGHPUT ERROR
CSCDCE EQU /2B DCE NOT OPERABLE
CSCXC1 EQU /2C CONTROL UNIT DEPENDENT
CSCXC2 EQU /2D "
CSCXC3 EQU /2E "
*
* EXTENDED STATUS BUFFER
*
DCXSTB RES 0
DCXSTL EQU 0 LENGTH IN BYTES OF EXTENDED STATUS BUFFER
EJECT
**********************************************************************
**********************************************************************
*
*
* REQUEST HANDLER/APPLICATION INTERFACE
*
*
**********************************************************************
**********************************************************************
*
* ACTIVATION FROM TERMINAL TASKS
*
DCACT EQU *
LDKL A5,STBIN INPUT STACK BASE
LDR A2,A7 ORDER CODE AS PARAMETER
ANK A2,/FF STRIP OFF OPTION BITS
CF A15,LOOKUP BRANCH ON CODES, TABLE ADDRESS TO STACK
DATA TREQX,RQERR LAST ENTRY; ERROR ADDRESS
DATA READO,RQRD READ REQUEST
DATA WRITEO,RQWR WRITE REQUEST
DATA OPEN,RQOPEN OPEN REQUEST
DATA CLOSE,RQCLOS CLOSE REQUEST
DATA CONPAS,RQCON CONNECT PASSIVE REQUEST
DATA DISCO,RQDIS DISCONNECT REQUEST
DATA RSTAT,RQRSTS READ STATUS REQUEST
DATA STIMOT,RQTIME SET REQUEST TIMEOUT
TREQX DATA STATIS,RQSTAT READ/RESET STATISTICS REQUEST
EJECT
************************************************************
*
* ABORT ROUTINE
*
************************
ABORT LD A1,DWTRTP,A6 TIMER POINTER
RF(Z) AB:10 NO TIMER RUNNING
CM* DWTRTP,A6 KILL TIMER
CM DWTRTP,A6
AB:10 LD A2,DWTOR,A6 ORDER CODE
CF A15,LOOKUP BRANCH ON ACTIVE ORDER CODE
DATA ABEND,AB:RTN
ABEND DATA WRITEO,AB:20 ACT ON WRITE ONLY
AB:20 EQU *
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
EJECT
AB:RTN EQU *
LDKL A1,RCABRT LOAD RETURN CODE
CF A15,TENDIO
ABL TDISP
EJECT
*
*
* OPEN REQUEST
*
* ACTIVATION PARAMETERS:
* SYMBOLIC DTE-ADDRESS (ECBCW2, LEFT BYTE, ASCII)
*
* FUNCTIONS:
* 1. CHECK IF ALREADY OPEN & IF SO SAME DTE-ADDRESS
* 2. CONVERT & VERIFY DTE ADDRESS
* 3. CONNECT MODEM
* 4. CHANGE PROTOCOL TO NDM STATE
*
* COMPLETION PARAMETERS:
* RETURN CODE (A1)
*
RQOPEN EQU *
LDK A1,0 PRESET RC
LD A2,DCREQS GET REQUEST STATE
RF(Z) RQOP20 DTE INACTIVE
RQOP10 EQU *
LD A2,ECBCW2,A8 GET SYMBOLIC DTE-ADDRESS
CW A2,DCDTE SAME AS THE ONE WHO OPENED ?
ABL(E) RQRTN5 YES OK
LDKL A1,RCSEQ RC: SEQUENCE ERROR
ABL RQRTN5 COMPLETE
*
RQOP20 EQU *
LDKL A2,DCTCA LOAD POINTER FOR SNA
LD A1,ECBCW2,A8 GET SYMBOLIC DTE ADDRESS
CF A15,GETDNA GET LINK ADDRESS
LDR A1,A1 SET CONDITION REGISTER
RF(NN) RQOP21 OK
LDKL A1,RCREQ RC:REQUEST ERROR
ABL RQRTN5 EXIT
RQOP21 EQU *
LD A1,ECBCW2,A8 GET SYMB ADDR
ST A1,DCDTE SAVE IT
ST A6,WRDWT SAVE OPEN DWT =2
CF A5,CUOPEN CONNECT MODEM
CM WRDWT RESTORE =2
RF(Z) RQOP81 DCE DOWN
RF(N) RQOP81 DTE DOWN
EJECT
*
RQOP80 EQU *
LDK A1,1
ORS A1,DCREQS SET ACTIVE STATE
LDKL A2,TONDMX INITIATE NDM W/O SENDING UA
ST A2,DCMODE *
LDK A1,0
CF A15,CKMES PENDING MESSAGES ?
CF A15,TENDIO COMPLETE REQUEST
CF A15,SPTIM START POLL-TIMER
ABI DCMODE ENTER RECEIVE MODE
RQOP81 EQU *
LDKL A1,RCPHYC RC:PHYSICAL CONNECTION ERROR
ABL RQRTN5
EJECT
*
* CLOSE REQUEST
*
* ACTIVATION PARAMETERS:
* OPTION (LEFT BYTE OF A7) /80 = UNCONDITIONAL
* /00 = CONDITIONAL CLOSE
* FUNCTIONS:
* 1. IF CONDITIONAL, CHECK IF ANY LOGICAL CONNECTIONS (DWTS) ARE ACTIVE
* ACTIVE.
* 2. DISCONNECT MODEM
* 3. CHANGE PROTOCOL TO OFF STATE
*
* COMPLETION PARAMETERS:
* RETURN CODE (A1)
*
RQCLOS EQU *
LDK A1,0 PRESET RC
LD A2,ECBCW2,A8 GET DTE
CW A2,DCDTE SAME AS THE ONE WHO OPENED ?
RF(NE) RQCL20 NO,ERROR
LD A2,DCREQS GET CURRENT REQUEST STATE
ABL(Z) RQRTN5 ALREADY CLOSED
*
LDR A7,A7 CHECK OPTION
RF(N) RQCL30 SKIP OVER IF UNCONDITIONAL
LD A2,DCDWA CONDITIONAL - GET ANCHOR OF CONNECTED DWT'S
RF(NZ) RQCL20 IMPOSSIBLE,DWT'S STILL ACTIVE =2
IFT MESPAS=1
LD A2,DTEDDT DISCARD DWT CONNECTED ? =2
XIF
RF(Z) RQCL51 NONE CONNECTED
*
RQCL20 EQU *
ORKL A1,RCSEQ RC: SEQUENCE ERROR
ABL RQRTN5 COMPLETE
*
RQCL30 EQU *
ST A6,DCDTE SAVE THAT DWT
DEB EQU *
LD A6,DCDWA GET QUEUE ANCHOR
RF(NZ) DEB1 .SOME IN QUEUE =2
IFT MESPAS=1
LD A6,DTEDDT DISCARD DWT / =2
RF(Z) RQCL50 NO =2
CM DTEDDT YES,DISCARD IT =2
XIF
DEB1 EQU *
CM DWTSUB,A6 CLEAR SUB ADDRESS
LD A1,DWTIPC,A6 GET BUFFER QUEUE
RF(Z) OKSLUT NO BUFFERS IN QUEUE
CF A15,RELBFX RELEASE BUFFERS
CM DWTIPC,A6 CLEAR BUFFER'S QUEUE
OKSLUT LDK A1,0 PRESET RETURN CODE
LD A2,DWTST,A6 GET DWT STATUS
RF(N) OKSL1 NO ORDERS
LD A2,DWTOR,A6 GET ORDER
CWK A2,CLOSE
RF(E) OKSL2 OK CLOSE
LDK A1,RCSEQ ANY ORDERS
OKSL2 CF A15,TENDIO COMPLETE REQUEST
CF A15,CTIME RESET TIMER
CF A15,REMOVW REMOVE FROM WRITE QUEUE
OKSL1 CF A15,DCREMV RELEASE FROM CONNECT QUEUE
RB DEB OTHERS DWT
RELBFX EQU *
LD A2,DCIPA GET QUEUE ANCHOR
RF(NZ) RELBXX NOT FIRST IN QUEUE
ST A1,DCIPA ATTACH BUFFER IN QUEUE
RF RELBZZ EXIT
RELBXX EQU *
LDR* A3,A2 GET NEXT
RF(Z) RELBYY LAST
LDR* A2,A2 NOT LAST,GO ON
RB RELBXX
RELBYY STR A1,A2 ATTACH IN CHAIN
RELBZZ RTN A15 RETURN
EJECT
RQCL50 EQU *
LD A6,DCDTE
RQCL51 EQU *
CM DCDTE CLEAR ACTIVE DTE
LD A1,DCIPC GET DTE QUEUE ANCHOR
RF(Z) RQCL52 NO BUFFERS
CF A15,RELBFX RELEASE BUFFERS
CM DCIPC CLEAR QUEUE
RQCL52 EQU *
ST A6,WRDWT SAVE CLOSE DWT =2
CF A5,CUCLOS DISCONNECT MODEM
CM WRDWT RESTORE =2
LDKL A2,OFF * CHANGE PROCEDURE STATE TO OFF
ST A2,DCMODE *
*
CM DCREQS REQUEST STATE = INACTIVE/CLOSED
CM DCHDLS HDLC STATE = OFF
LD A2,DCTPGP POLL TIMER POINTER
RF(Z) RQCL53 NO TIMER
CM* DCTPGP CLEAR TIMER
CM DCTPGP CLEAR TIMER POINTER
RQCL53 EQU *
LDK A1,0 PRESET RETURN CODE
ABL RQRTN5 COMPLETE
EJECT
*
* CONNECT PASSIVE REQUEST
*
* ACTIVATION PARAMETERS:
* - SYMBOLIC SUBADDRESS (LEFTMOST BYTE IN ECBBA-BFR)
* - LENGTH OF BUFFER (ECBRL)
* - SYMBOLIC DTE-ADDRESS (ECBCW2)
*
* FUNCTIONS:
* 1. CHECK IF LINK IS ACTIVE
* 2. VERIFY DTE-ADDRESS AS PER OPEN REQUEST
* 3. VERIFY & CONVERT SUBTERMINAL ADDRESS
* 4. LINK CALLING DWT TO QUEUE
* 5. CHANGE HDLC STATE TO NDM & WAIT FOR NRM
*
* COMPLETION PARAMETERS:
* RETURN CODE (A1)
*
RQCON EQU *
LD A1,DCDTE GET DTE OF OPEN REQUEST
CW A1,ECBCW2,A8 COMPARE W/ DTE OF CONNECT REQUEST
RF(E) RQCN20 YES
*
RQCN15 EQU *
LDKL A1,RCREQ RC: REQUEST ERROR
ABL RQRTN5 COMPLETE
EJECT
RQCN20 EQU *
LD A2,DCCUS GET CONTROL UNIT STATE
RF(NZ) RQCN30 OK
LDKL A1,RCPHYC RC: PHYSICAL CONNECTION ERROR
ABL RQRTN5 COMPLETE
*
RQCN30 EQU *
IFT SUB=0
LDKL A2,/FFFF AS CONNECTED
RF RQCN31 SKIP ADDRESSING
XIF
IFT MESPAS=1
LD A2,DWTOR,A6 . =2
ANKL A2,/FF00 ISOLATE OPTION =2
CWK A2,/4000 DISCARD DWT ? =2
RF(NZ) RQCNXX NO =2
ST A6,DTEDDT YES,SAVE IT =2
RF RQCNYY . =2
RQCNXX EQU * . =2
XIF
IFF MMUPAG=0
LD A1,ECBBA,A8 USER BUFFER ADDRESS
LDKL A2,DCSTA MOVE DESTINATION
LDK A3,2 NUMBER OF CHARS. TO MOVE
LD A5,DWTTAB,A6 TTAB ADDRESS OF USER TASK
CF A15,MOVUS GET FIRST 2 BYTES OF USER BUFFER
SUR A1,A1 RE-CLEAR
LD A2,DCSTA GET SUBTERMINAL ADDRESS FROM SYSTEM 'BUFFER'
XIF
IFT MMUPAG=0
LD A2,ECBBA,A8 GET SUBTERMINAL ADDRESS =2
LC A2,1,A2 TAKE CARE ODD,EVEN =2
ANK A2,/FF SIGNIFICANT BITS
XIF
LD A1,DCDTE RESTORE SYMBOLIC DTE
CF A15,GETSNA GET PHYS SUB ADDRESS
LDR A1,A1 SET RETURN CODE
RB(N) RQCN15 INVALID SUBTERMINAL ADDRESS
RQCN31 EQU *
ST A2,DWTSUB,A6 SAVE SYMB ADDRESS
CF A15,DCLINK LINK DWT TO CHAIN =2
RQCNYY EQU *
LDK A2,2 *
ORS A2,DCREQS REQUEORS ORSATE = CONNECTED
LDK A1,DWT:C . =1
ORS A1,DWTST,A6 SET CONNECTED DWT =1
LDK A1,0 PRESET RETURN CODE
ABL RQRTN5
EJECT
*
* DISCONNECT REQUEST
*
* ACTIVATION PARAMETERS:
* DWT-ADDRESS (A6)
*
* FUNCTIONS:
* 1. CHECK IF IN CONNECTED STATE
* 2. TEST IF DWT IS IN CONFIGURATION CHAIN
* 3. DROP DWT-ADDRESS FROM CONFIGURATION CHAIN
* 4. SET REQUEST STATE TO ACTIVE (NOT CONNECTED)
* IF NO DWTS LEFT IN CHAIN.
* 5. CHECK PHYSICAL CONNECTION STATE
*
* COMPLETION PARAMETERS:
* RETURN CODE (A1)
*
RQDIS EQU *
LD A2,DCREQS GET REQUEST STATE
CWK A2,3 IS IT CONNECTED ?
RF(E) RQDS20 YES
*
RQDS10 EQU *
LDKL A1,RCSEQ RC: SEQUENCE ERROR
ABL RQRTN5 COMPLETE
RQDS20 EQU *
LD A2,DWTST,A6 GET DWT STATUS =1
ANK A2,DWT:C CONNECTED ? =1
RB(Z) RQDS10 NO =1
LDK A2,DWT:C . =1
XRS A2,DWTST,A6 RESET CONNECT =1
IFT MESPAS=1
LD A2,DTEDDT DISCARD DWT ? =2
RF(Z) RQDS21 NO =2
CWR A2,A6 YES,THAT ONE? =2
RF(NE) RQDS21 NO =2
CM DTEDDT YES,DISCARD ROOT =2
LD A2,DCDWA MORE IN QUEUE ? =2
RF(NZ) RQDS30 YES =2
RF RQDS22 NO,INIT DM MODE =2
RQDS21 EQU * . =2
XIF
CF A15,DCREMV REMOVE ACTIVE DWT FROM CONFIG. CHAIN
RB(N) RQDS10 DWT DID NOT EXIST IN CHAIN
RF(NZ) RQDS30 CHAIN NOT EMPTY
IFT MESPAS=1
LD A2,DTEDDT DISCARD DWT ? =2
RF(NZ) RQDS30 YES CHAIN NOT EMPTY =2
XIF
RQDS22 EQU *
LDK A2,1 * CHANGE REQUEST STATE TO ACTIVE/OPEN,
ST A2,DCREQS * I.E. NONE CONNECTED.
LDKL A1,TONDMX
ST A1,DCMODE INIT DM
CM FRMRMD RESET FRMR INDICATOR
IM AIGFIL SET RETURN SWITCH
RQDS30 EQU *
CF A15,CTIME RESET RUNNING TIMER
CF A15,REMOVW RESET WRITE FROM QUEUE
LD A1,DWTIPC,A6 GET BUFFER QUEUE
CF A15,RELBFX RELEASE IT
CM DWTIPC,A6 CLEAR QUEUE ANCHOR
CM DWTSUB,A6 SAVE SYMB ADDRESS
LDK A1,0 PRESET RETURN CODE
CF A15,TENDIO COMPLETE DISCONNECT REQUEST
LD A1,AIGFIL OTHER DWT STILL ACTIVE ?
ABL(Z) TDISP YE
CM AIGFIL CLEAR SWITCH
CIO A1,0,CHLCIN SET HW INACTIVE
ABL(NA) RQDS40 HW PROBLEMS
CF A5,READ GET INTERRUPT
ABI DCMODE NO,ENTER DISCONNECT MODE
RQDS40 EQU *
CM DCCUS HW OUT OF SERVICE
ABL TDISP
EJECT
*
* READ STATUS REQUEST
*
*
* ACTIVATION PARAMETERS:
* EXTENDED STATUS BUFFER ADDRESS (ECBBA)
* LENGTH OF EXTENDED STAUS BUFFER (ECBRL)
*
* FUNCTIONS:
* 1. TRANSFER LOGICAL CONNECTION STATUS TO APPLICATION
* 2. TRANSFER EXTENDED STATUS IF IMPLEMENTED
*
* COMPLETION PARAMETERS:
* LOGICAL CONNECTION STATUS (ECBCW1)
* LENGTH OF EXTENDED STATUS RETURNED (ECBEL)
* RETURN CODE (A1)
*
* 0......34......78......1112......15
* . DWT . DTE . REQ ST . CU .
* . STATE . STATE . . STATE .
* . 00XX . 00XX . 000X . 000X .
* ...................................
*
RQRSTS EQU *
LD A2,DCHDLS HDLC STATE
ANK A2,2 PICK OUT NRM
SLL A2,3 BITS 8 TO 11,X=1 WHEN NRM
LD A3,DCREQS REQUEST STATE
ANK A3,1 VALID BITS
SLL A3,9 BITS 4 T0 7,XX=10 WHEN DTE OPEN
ORR A2,A3 MERGE W/ HDLC STATE
LD A3,DCCUS GET CONTROL UNIT STATE
ANK A3,1 VALID BIT 15,X=1 WHEN HW OK
ORR A2,A3 MERGE W/ THE REST
LD A1,DWTST,A6 GET STATUS =2
ANK A1,DWT:C DWT CONNECTED ? =2
RF(Z) RQRST1 NO
LDKL A1,/2000 YES BITS 0 TO 3,XX=10 WHEN DWT CONNECTED
ORR A2,A1 MERGE WITH STATUS
RQRST1 EQU *
ST A2,ECBCW1,A8 TO ECB
LD A2,ECBBA,A8 GET EXTENDED STATUS BUFFER ADDRESS
RF(Z) RQRS80 NO BUFFER = NO STATUS
LDKL A1,DCXSTB DRIVER STATUS BUFFER
LDKL A3,DCXSTL BUFFER LENGTH
LD A4,DWTTAB,A6 TTAB
CF A15,MOVSU MOVE TO USER AREA
LDK A1,0 RESET RC
*
RQRS80 EQU *
ABL RQRTN COMPLETE
EJECT
*
* READ/RESET STATISTICS REQUEST
*
* ACTIVATION PARAMETERS:
* TYPE = BITS 0-7 OF ECBCW1
* ECB-ADDRESS (A8)
* DWT-ADDRESS OF LOW-LEVEL DWT (A6)
*
* FUNCTIONS:
* 1. READ STATISTICS TO USER AREA
* 2. RESET ALL STATISTICS BUFFERS
*
* COMPLETION PARAMETERS:
* NUMBER OF BYTES TRANSFERRED (ECBEL)
* RETURN CODE (A1)
*
RQSTAT EQU *
IFT STAT=0
LDK A1,0 RESET R.C
ORKL A1,RCREQ RC: REQUEST ERROR, NO STATISTICS INCLUDED
ABL RQRTN5 COMPLETE
XIF
IFF STAT=0
LD A1,ECBCW1,A8 GET TYPE
SRL A1,8 TYPE FIELD TO LEFT BYTE
CWK A1,TYPRR CORRECT TYPE?
RF(NE) RQST20 NOPE
CF A15,DCSRED READ STATISTICS
LDR A1,A1 OK?
RF(Z) RQST30 YES
*
RQST20 EQU *
LDKL A1,RCREQ RC: REQUEST ERROR
ABL RQRTN5 COMPLETE
*
RQST30 EQU *
CF A15,DCSRLL RESET ALL STATISTICS BUFFERS
LDR A1,A1 LUCKY AGAIN?
RB(NZ) RQST20 NO
ABL RQRTN5 COMPLETE
XIF
EJECT
*
* SET REQUEST TIMEOUT
*
* ACTIVATION PARAMETERS:
* ECBCW1 >= 0 : ACTIVATE TIMING CONTROL
* TIMEOUT VALUE IN MULTIPLES OF 100 MS;
* 0 = IMMEDIATE TIMEOUT.
* < 0: DE-ACTIVATE TIMING CONTROL
*
* FUNCTIONS:
* STORE VALUE DIRECTLY IN CALLER'S DWT
*
* COMPLETION PARAMETERS:
* DWTRTV = TIMEOUT VALUE = ECBCW1
* RETURN CODE (A1)
*
RQTIME EQU *
LD A2,ECBCW1,A8 GET TIMEOUT VALUE FROM ECB
ST A2,DWTRTV,A6 STORE IN DWT
LDK A1,0 PRESET RETURN CODE
ABL RQRTN5 COMPLETE - NEED A REST AFTER THIS
EJECT
*
* WRITE REQUEST
*
* ACTIVATION PARAMETERS:
* BUFFER ADDRESS (ECBBA)
* BUFFER LENGTH (ECBRL)
* SUBTERMINAL ADDRESS (DWT)
*
* FUNCTIONS:
* 1. VERIFY THAT LOGICAL & PHYSICAL CONNECTIONS EXIST.
* 2. VERIFY BUFFER SIZE IF MMU AND/OR IOP.
* 3. QUEUE REQUESTING DWT FOR HDLC PROCEDURE.
* 4. COMPLETE WHEN ACK'D OR TIMEOUT.
*
* COMPLETION PARAMETERS:
* RETURN CODE (A1)
*
RQWR EQU *
IFF MMUPAG+MUX=0
LD A2,ECBRL,A8 REQUESTED LENGTH
CWK A2,BUFLEN WILL IT FIT IN MMU-BUFFER?
RF(NG) RQWR10 YES - OK
LDKL A1,RCLGTH RC: ILLEGAL LENGTH
ABL RQRTN COMPLETE
*
RQWR10 EQU *
XIF
LD A1,DCCUS CONTROL UNIT STATE
RF(NZ) RQWR20 CONNECTED
LDKL A1,RCPHYC RC:PHYSICAL CONNECTION ERROR
ABL RQRTN
*
RQWR20 EQU *
LD A2,DCREQS IN REQUEST STATE = CONNECTED?
CWK A2,3 *
RF(E) RQWR30 YES - OK
RQWR21 EQU *
LDKL A1,RCLOGC RC: LOGICAL CONNECTION ERROR
ABL RQRTN COMPLETE
*
RQWR30 EQU *
LD A2,DWTST,A6 GET DWT STATUS =1
ANK A2,DWT:C CONNECTED ? =1
RB(Z) RQWR21 NO =1
IFT MESPAS=1
CW A6,DTEDDT DISCARD DWT ? =2
RB(E) RQWR21 YES NO WRITE ALLOWED =2
XIF
IFT SUB=1
LD A2,DWTSUB,A6 GET SYMB ADDRESS
ABL(Z) RQDS10 NOT PRESENT
XIF
CF A15,TIMEWR SET TIMER
CF A15,INSWQ QUEUE REQUEST
ABL TDISP WAIT
EJECT
*
* READ REQUEST
*
* ACTIVATION PARAMETERS:
* BUFFER ADDRESS (ECBBA)
* REQUESTED BUFFER LENGTH IN CHARS. (ECBRL)
* SUBTERMINAL ADDRESS (DWT)
*
* FUNCTIONS:
* 1. VERIFY THAT LOGICAL & PHYSICAL CONNECTIONS EXIST.
* 2. TRANSFER TO THE APPLICATION ANY MESSAGE QUEUED FOR THE DWT,
* INCLUDING THE MASTER DWT.
* 3. COMPLETE WHEN TRANSFER PERFORMED OR NO MESSAGE RECEIVED
* WITHIN TIMEOUT PERIOD.
*
* COMPLETION PARAMETERS:
* ACTUAL LENGTH OF RECEIVED MESSAGE (ECBEL)
* RETURN CODE (A1)
*
RQRD EQU *
LD A1,DCCUS CONTROL UNIT STATE
RF(NZ) RQRD10 CONNECTED
LDKL A1,RCPHYC RC: PHYSICAL CONNECTION ERROR
ABL RQRTN COMPLETE
*
RQRD10 EQU *
IFT SUB=1
LD A1,DWTIPC,A6 GET BUFFER QUEUE
XIF
IFT SUB=0
LD A1,DCIPC GET BUFFER QUEUE
XIF
RF(NZ) RQRD20 NOT EMPTY
LD A1,DCREQS CONNECTED ?
CWK A1,3
ABL(NE) RQWR21 NO
LD A1,DWTST,A6 GET DWT STATUS =1
ANK A1,DWT:C CONNECTED ? =1
RB(Z) RQWR21 NO
IFT MESPAS=1
CW A6,DTEDDT DISCARD DWT ? =2
RF(E) RQRD11 YES,NO ADDRESSING =2
XIF
IFT SUB=1
LD A2,DWTSUB,A6 GET SYMB ADDRESS
ABL(Z) RQDS10 NOT PRESENT
XIF
RQRD11 EQU *
CF A15,TIMERE START TIMER
ABL TDISP WAIT
*
* BUFFER WAITING IN QUEUE
*
RQRD20 EQU *
LDR* A2,A1 GET NEXT ONE
IFT SUB=1
ST A2,DWTIPC,A6 STORE AS FIRST IN QUEUE
XIF
IFT SUB=0
ST A2,DCIPC STORE AS FIRST IN QUEUE
XIF
LDR A4,A1 SAVE BUFFER ADDRESS
LD A2,RCVEL,A1 GET LENGTH
IFT SUB=1
SUK A2,1 UPDATE LENGTH FOR STA
XIF
ST A2,ECBEL,A8 STORE IN ECB
IFT SUB=0
ADK A1,RCVHDR ADJUST ADDRESS
XIF
IFT SUB=1
ADK A1,RCVHDR+1 ADJUST ADDRESS - DON'T TRANSFER STA
XIF
LD A2,DCIPA FREE CHAIN ANCHOR
RF(NZ) RQRD30 STILL BUFFERS FREE
ST A4,DCIPA THIS IS THE FIRST
RF RQRD40 HOP OVER
EJECT
RQRD30 EQU *
LDR* A3,A2 GET NEXT BUFFER
RF(Z) RQRD35 END OF CHAIN
LDR* A2,A2 GET NEXT
RB RQRD30 TEST IF END
*
RQRD35 EQU *
STR A4,A2 NEW LINK
*
RQRD40 EQU *
CMR A4 LAST IN CHAIN
LD A2,ECBBA,A8 USER BUFFER ADDRESS
LD A3,ECBEL,A8 LENGTH
LD A4,DWTTAB,A6 TTAB ADDRESS
CF A15,MOVSU MOVE BUFFER TO USER
LD A1,DWTRTP,A6 TIMER RUNNING?
RF(Z) RQRD41 EQU * NO
CM* DWTRTP,A6 * STOP THE TIMER
CM DWTRTP,A6 *
RQRD41 EQU *
LDK A1,0 PRESET RETURN CODE
ABL RQRTN COMPLETE
EJECT
CKMES EQU *
IFT SUB=1
LD A2,DWTIPC,A6 CHECK RECEIVE BFR CHAIN FOR THIS DWT
XIF
IFT SUB=0
LD A2,DCIPC GET RECEIVE BUFFER CHAIN
XIF
RF(Z) CKMES1 NO BUFFERS WAITING
ORKL A1,RCDATA RC: DATA AVAILABLE
CKMES1 EQU *
ADKL A15,4
ABR* A15 RETURN
RQRTN EQU *
CF A15,CKMES
*
RQRTN5 EQU *
CF A15,TENDIO COMPLETE REQUEST
ABL TDISP GOTO DISPATCHER
*
RQERR EQU * REQUEST ERROR
LDKL A1,RCREQ RC: REQUEST ERROR
RB RQRTN COMPLETE
EJECT
*
* REQUEST TIMER HANDLING PART
*
* READ REQUEST TIMER
*
TIMERE EQU *
LDR A1,A6
LD A2,DWTRTV,A6 GET TIMEOUT VALUE
RF(N) TIME10 NO TIMING
RF(Z) TOUTXX TIMER = 0 => IMMEDIATE TIMEOUT
ST A2,TIMERR
CF A15,SETIME
DATA TOUTRE
TIMERR DATA 0
ST A4,DWTRTP,A6 STORE TIMER POINTER
RF TIME10
*
* TIMEOUT READ TIMER
*
TOUTRE EQU *
LDR A6,A1 FETCH DWT
CM DWTRTP,A6
*
TOUTR1 EQU *
LDKL A1,RCTIME
LD A2,DCCUS HW OK ?
RF(NZ) HWOK YES
ORK A1,1 INDICATE HW FAIL
HWOK EQU *
LD A2,DCHDLS LINK OK ?
ANK A2,2
RF(NZ) SWOK YES
ORK A1,2 INDICATE SW FAIL UNDER LINK LEVEL
SWOK EQU *
ABL RQRTN INVESTIGATE FURTHER INFORMATION BEFORE RETURN
TOUTXX EQU *
ADKL A15,4 UPDATE STACK
RB TOUTR1 EXIT
EJECT
*
* WRITE REQUEST TIMER
*
TIMEWR LDR A1,A6
LD A2,DWTRTV,A6 GET TIMEOUT VALUE
RF(N) TIME10 NO TIMING
RB(Z) TOUTXX TIMER VALUE VALUE=0=>IMMEDIATE TIME OUT
ST A2,TIMWR
CF A15,SETIME
DATA TOUTWR
TIMWR DATA 0
ST A4,DWTRTP,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 DWTRTP,A6
LD A2,DWTECB,A6
LD A4,ECBBA,A2 FETCH BUFFER
CF A15,REMOVW REMOVE FROM WRITE QUEUE
ABL TOUTR1 SET PROPER RETURN CODES
EJECT
*
*
* STOP REQUEST TIMING
*
* REMAINING TIME IS RETURNED IN A2
*
*
CTIME EQU *
LD A2,DWTRTP,A6 GET TIMER POINTER
RF(Z) CTIM10 NOT RUNNING
LDR* A2,A2
NGR A2,A2 GET REMAINING TIME
CM* DWTRTP,A6 STOP TIMER
CM DWTRTP,A6
CTIM10 EQU *
RTN A15
EJECT
RETURN EQU *
IFT CPU852=1
ADKL A15,4
ABR* A15
XIF
IFT CPU852=0
RTN A15
XIF
*
EJECT
*
*
* INSERT DWT IN WRITE REQUEST QUEUE
*
* A2,A3,A4 DESTROYED
* A6=DWT
*
INSWQ LDKL A2,DCWRQ GET QUEUE ANCHOR
LDK A4,DWTOPN
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 RETURN RETURN
*
*
* REMOVE DWT FROM WRITE REQUEST QUEUE
*
* A2,A3,A4 DESTROYED
* A6=DWT
*
REMOVW LDKL A2,DCWRQ GET QUEUE ANCHOR
LDK A4,DWTOPN GET DC-LINK TO BE REMOVED
ADR A4,A6
REM10 LDR* A3,A2
RB(Z) RETURN 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 RETURN RETURN
EJECT
*
*
* CHECK IF THERE IS A WRITE REQUEST TO BE COMPLETED
*
* A1 CONTAINS RETURN CODE
*
*
CWRITE EQU *
LD A8,DWTECB,A6 GET ECBADDRESS
LD A2,DWTST,A6
RF(N) CWR200 NO REQUEST
LD A2,DWTOR,A6 GET ORDER
CWK A2,WRITEO WRITE ORDER?
RF(NE) CWR200 NO
CF A15,CTIME STOP REQUEST TIMING
CM ECBCW,A8 CLEAR ?????????????????????????
CF A15,TENDIO COMPLETE REQUEST
CWR200 EQU *
CF A15,REMOVW REMOVE FROM WRITE QUEUE
RTN A5
EJECT
**********************************************************************
**********************************************************************
*
*
* HDLC PROTOCOL PROCESSOR
*
*
**********************************************************************
**********************************************************************
*
* OFF MODE (SYSTEM DEFINED STATE)
*
* ACCEPT NO LINE ACTIVITY
* WAIT FOR OPEN REQUEST TO INITIATE DISCONNECTED MODE
* ('TODISC' --> DCMODE)
*
**********************************************************************
*
OFF EQU *
ABL TDISP *
*
EJECT
**********************************************************************
*
* CHANGE MODES
*
**********************************************************************
*
*
* CHANGE TO NORMAL RESPONSE DCMODE (NRM)
*
TONRM EQU *
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSBRSM LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
LDKL A1,NRM *
ST A1,DCMODE * BRANCH ADDRESS FOR NRM STATE
LDK A1,2 * STATE = NRM
ST A1,DCHDLS *
CF A15,RESCON RESET PROCEDURE COUNTERS
CF A15,RSRSPQ RESET RESPONSE QUEUE
LDK A1,UA * SEND UA RESPONSE
CF A15,QMTRM *
ABI DCMODE GO TO NRM
*
* CHANGE TO DISCONNECTED DCMODE (DM)
*
TONDM EQU * ENTRY W/ UA
LDK A1,UA * SEND UA RESPONSE
CF A15,QMTRM *
*
TONDMX EQU * ENTRY W/O SENDING UA
CF A15,RESCON REST PROCEDURE CUNTERS
CF A15,RSRSPQ RESET RESPONSE QUEUE
LDKL A1,NDM *
ST A1,DCMODE SET DM BRANCH ADDRESS
LDK A1,1
ST A1,DCHDLS SET DISCONNECT MODE
ABI DCMODE GO TO DM
EJECT
**********************************************************************
*
* NORMAL DISCONNECTED MODE (NDM)
*
* ENTERED FROM OFF MODE WITH OPEN REQUEST OR FROM
* NRM WITH DISC COMMAND
*
* COMMANDS ACCEPTED: SNRM
*
**********************************************************************
*
NDM EQU *
LDKL A5,STBIN RESET STACK BASE - INPUT
CF A5,RDFRAM GET A FRAME
ABL(N) TDISP INVALID DTE
ABI(NZ) DCMODE NO GOOD
LDK A2,1 RESTORE DISC MODE
ST A2,DCHDLS
LDR A2,A1 COMMAND FIELD = PARAMETER
CF A15,LOOKUP BRANCH ON TABLE
DATA DMEND,DM100 ILLEGAL COMMAND IN DM STATE
DMEND DATA SNRM,CMDNRM SNRM
*
DM100 EQU *
LDK A1,DM SET DM DCMODE
CF A15,QMTRM QUEUE FOR TRANSMISSION
ABI DCMODE UNACCEPTED COMMAND
*
* SNRM-COMMAND TO BE ACCEPTED?
*
CMDNRM EQU *
LD A2,DCREQS GET CURRENT REQUEST STATE
CWK A2,3 CONNECTED ALREADY?
ABL(E) TONRM YES - ACCEPT NRM
RB DM100 NO - CAN'T ACCEPT IT
EJECT
**********************************************************************
*
* NORMAL RESPONSE MODE - NRM
*
**********************************************************************
*
NRM EQU *
LDKL A5,STBIN RESET STACK BASE - INPUT
CF A5,RDFRAM READ A FRAME
ABL(N) TDISP INVALID DTE
ABI(NZ) DCMODE NO GOOD
LDK A2,2 RESTORE NRM MODE
ST A2,DCHDLS
LD A2,FRMRMD FRMR MODE ?
RF(Z) NRM01 NO NRM MODE
LDR A2,A1 YES,ONLY ACCEPT SNRM
CWK A2,SNRM
ABL(NE) NRM160 NO SNRM,RESEND FRMR
CM FRMRMD SNRM DETECTED,CLEAR FRMR MODE
NRM01 EQU * NRM,ACCEPT CONVENIENT FRAME
LDR A2,A1 GET COMMAND FIELD
ANK A2,3 ISOLATE FRAME TYPE BITS
ST A1,SAVPAM SAVE PARAMETER
ST A4,BUFADD SAVE BUFFER ADDRESS
CF A15,LOOKUP BRANCH ON FRAME TYPE
DATA NRMEND,IFRM I-FRAME
DATA 1,SFRM S-FRAME
NRMEND DATA 3,UFRM U-FRAME
EJECT
*
* U-FRAME RECEIVED
*
* COMMANDS ACCEPTED: DISC, SNRM
*
*
UFRM EQU *
LD A2,SAVPAM
CF A15,LOOKUP BRANCH ON COMMAND
DATA UFRMTE,XFRMR INVALID COMMAND
DATA DISC,TONDM DISC
UFRMTE DATA SNRM,TONRM SNRM
EJECT
*
*
* S-FRAME RECEIVED, DECODE
*
* ACCEPTED COMMANDS: RR, RNR, REJ(IF UN2 OPTION INCLUDED)
*
SFRM EQU *
LD A1,SAVPAM RESTORE PARAMETER
ANK A1,/F IGNORE COUNTERS
LDR A2,A1 GET C-FIELD
CF A15,LOOKUP BRANCH ON S-FRAME TYPE
DATA SFREND,XFRMR INVALID (SREJ)
DATA RNRMSK,SFRNR RNR
DATA RRMSK,SFRR RR
SFREND DATA REJMSK,SFREJ REJ
*
* RNR RECEIVED
*
*
SFRNR EQU *
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSBRNR LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
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
ABI(Z) DCMODE P-BIT OFF
LDK A1,RR LOAD 'RR'
LD A2,DCIPA
RF(NZ) NRMTRA OK READY TO RECEIVE
LDK A1,RNR LOAD RNR
RF NRMTRA
EJECT
*
* RR OR REJ RECEIVED
*
SFRR EQU *
SFREJ EQU *
CF A5,UPDCON UPDATE COUNTERS AND CHECK OUTPUT QUEUE
CF A5,TSTNR FRMR ?
NRM145 EQU *
LC A1,FIELD1+1 GET C-FIELD
ANK A1,/10 CHECK POLL-BIT
ABI(Z) DCMODE P-BIT OFF
LDK A1,0 INDICATE POLL-BIT RECEIVED
RF NRMTRA
EJECT
*
* INVALID COMMAND - SEND FRMR
*
*
XFRMR EQU *
LDK A2,0 PRESENT CONTERS
LDK A3,/80 FAIL CODE (FRMR DCMODE SETTING)
CF A5,PRFRMR INIT FRMR
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSBTFR LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
NRM160 EQU *
LDK A1,1
ST A1,FRMRMD INIT FRMR MODE
LDK A1,FRMR LOAD 'FRMR'
*
* QUEUE FOR TRANSMISSION
*
NRMTRA EQU *
CF A15,QMTRM QUEUE FOR TRANSMISSION
ABI DCMODE
EJECT
*
*
* I-FRAME RECEIVED
*
*
IFRM EQU *
LD A4,BUFADD RESTORE BUFFER ADDRESS
LD A1,BUFNUL
ABL(NZ) BSYMDE BUSY
CF A5,UPDCON UPDATE COUNTERS
LD A1,STATUS CHECK UNEXPECTED N(S)
ANK A1,1 N(S) OK?
RF(NZ) NRM400 NO
CF A5,TSTNR CHECK UNEXPECTED N(R)
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSBRIF LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
LC A1,FIELD1+1
ANK A1,/10 CHECK POLL BIT
RF(Z) NRM180 P-BIT OFF
LDK A1,0 INDICATE POLL-BIT W/ I-FRAME
CF A15,QMTRM QUEUE FOR TRANSMISSION
EJECT
*
* I - FRAME O.K.
* LINK TO PROPER DWT IF PRESENT, ELSE DROP BUFFER
* A4 = A(BUFFER)
*
NRM180 EQU *
IFT SUB=0
RF NRM186 . =2
XIF
IFT SUB=1
LD A3,DCDWA GET DWT ANCHOR
RF(Z) TSMSP
LC A2,RCVHDR,A4 GET STA
ANK A2,/FF SIGNIFICANT PORTION
LD A1,DCDTE GET SYMB DTE ADRESS
CF A15,GETSSA GET SYMB STA ADDRESS
LDR A1,A1 SET RETURN CODE
ABI(N) DCMODE INCORRECT ADDRESS
*
NRM185 EQU *
CW A1,DWTSUB,A3 STA = THAT OF THIS DWT?
RF(E) NRM190 YES - ALLOCATE BUFFER
LD A3,DWTCHN,A3 NEXT DWT IN CHAIN
RB(NZ) NRM185 MORE LEFT
XIF
TSMSP EQU * . =2
IFT MESPAS=1
LD A3,DTEDDT DISCARD DWT ? =2
ABI(Z) DCMODE NO =2
ABL NRM190 OK,DISCARD PRESENT =2
XIF
ABI DCMODE
NRM186 EQU *
LD A3,DCDWA DWT QUEUE
RF(Z) NRM191 NO
*
* CHECK DWT
*
NRM190 EQU *
LDR A6,A3 RESTORE A6 FOR DWT
LD A1,DWTST,A6 GET STATUS
RF(N) NRM191 NO ORDERS
LD A1,DWTOR,A6 GET ORDER
SUK A1,2 READ ?
RF(NZ) NRM191 NO
LD A8,DWTECB,A6 GET ECB
LD A3,+2,A4 LENGTH
SUK A3,1 ADJUST
ST A3,ECBEL,A8 SAVE IT
LDR A1,A4
ADK A1,7 ADJUST BUFFER ADDRESS
IFT SUB=0
SUK A1,1 IGNORE STA
XIF
LD A2,ECBBA,A8 GET BUFFER USER
LD A4,DWTTAB,A6
CF A15,MOVSU MOVE USER BUFFER
CF A15,CTIME RESET READ TIMER
LDK A1,0
CF A15,TENDIO COMPLETE
ABI DCMODE JUMP RECEIVER
*
* LINK BUFFER TO DWT OR DTE
*
NRM191 EQU *
IFT SUB=1
ADK A3,DWTIPC ADDRESS OF FIRST BUFFER POINTER
XIF
IFT SUB=0
ADK A6,DWTCHN CHECK CHAIN
LDR* A3,A6 GET DWT ON NEXT POSITION
RB(NZ) NRM190 YES ONE STILL THERE
LDKL A3,DCIPC CHAIN ANCHOR
XIF
*
NRM195 EQU *
LDR* A2,A3 GET BUFFER POINTER
RF(Z) NRM198 LAST IN CHAIN
LDR* A3,A3 GET NEXT
RB NRM195 TEST IF AT END
*
NRM198 EQU *
STR A4,A3 LAST IN CHAIN FOUND - LINK THIS BFR TO IT
LDR* A1,A4 SAVE LINK TO NEXT FREE BUFFER
CMR A4 END OF CHAIN FOR THE DWT
*
* REMOVE BUFFER FROM FREE CHAIN
*
LDKL A2,DCIPA CHAIN ANCHOR
*
NRM210 EQU *
LDR* A4,A2 GET NEXT IN CHAIN
CWR* A4,A3 SAME AS THE 1 CHAINED TO THE DWT/DTE?
RF(E) NRM220 YES
LDR* A2,A2 NO - GET NEXT
RB NRM210 TEST IT
*
NRM220 EQU *
STR A1,A2 REPLACE W/ THE NEXT FREE BFR
ABI DCMODE GET NEXT FRAME
*
* EXEPTION STATE:WRONG N(S)
* REJECT ENABLED= SEND REJ W/O TESTING P-BIT
* NOT ENABLED: WAIT FOR P-BIT
*
NRM400 EQU *
CM STATUS RESTORE STATUS
LDKL A1,UNR2 UNR2 ENABLED?
ABL(Z) NRM145 WAIT POLL
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSBTRJ LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
LDK A1,REJ INDICATE REJ TO BE SEND
ABL NRMTRA
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 FRMR 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,PRFRMR INIT FIELDS
ABL NRM160
EJECT
*
* HERE TO INITIALIZE FRMR OUTPUT FIELDS
*
PRFRMR EQU *
LDK A1,FRMR LOAD 'FRMR'+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
BSYMDE EQU *
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSBRBY LOAD STATISTICS
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
LC A1,FIELD1+1 GET C-FIELD
ANK A1,/10 POLL-BIT SET ?
ABI(Z) DCMODE
LDK A1,RNR YES
CF A15,QMTRM SEND BUSY
ABI DCMODE
EJECT
*
*
* HDLC OUTPUT PROCESS
*
* QUEUED FROM INPUT PROCESS
*
* TRANSMIT FRAME IF ANY ON QUEUE
* PRIORITY 1: COMMANDS/RESPONSES (UA,CMDR,DM)
* PRIORITY 2: RR-FRAMES WHEN NOTHING PENDING
*
*
TRM EQU *
INH SET INHIBIT
LDKL A5,STBUT LOAD STACKBASE
STR A1,A15 SAVE A1 ON STACK
LD A1,DCHDLS
ST A1,SAHDLC SAVE CURRENT STATUS
CF A15,CPTIM START POLL TIMER
LDR* A1,A15 RESTOR A1
IM TRMACT OUTPUT IN PROGRESS
LDR A2,A1 COMMAND FIELD = PARAMETER
ST A1,SAVPAM SAVE PARAMETER
CF A15,LOOKUP BRANCH ON COMMAND TO SEND
DATA RSPTBE,TRM150 MAY SEND I-FRAME
DATA REJ,TRM136 REJECT
DATA UA,TRM107 UA
DATA DM,TRM108 DM
DATA RR,TRM130 RCV READY
DATA FRMR,TRM140 FRAME REJECT
DATA RNR,TRM180 RCV NOT READY
RSPTBE DATA 0,TRM150 MAY SEND I-FRAME
TRM107 EQU *
IFT STAT=1
LDR A2,A6 SAVE DWT
LDKL A6,DTE INIT DTE
LDKL A1,CSBTUA LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTEORE DWT
XIF
RF TRM109
TRM108 EQU *
IFT STAT=1
LDR A2,A6 SAVE DWT
LDKL A6,DTE INIT DTE
LDKL A1,CSBTDM LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
TRM109 EQU *
LD A1,SAVPAM RESTORE PARAMETER
TRM110 EQU *
CF A5,TRSFR SEND SHORT FRAME
RF TRMEND
EJECT
*
* 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
TRM136 EQU *
LDK A1,REJ
RB TRM135
*
*
* FRMR 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
EJECT
*
* CHECK APPLICATION QUEUE AND SEND
* I-FRAME OR RR-FRAME
*
*
TRM150 EQU *
LD A6,DCIPA
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
*
* DEFINE AND TRANSMIT INFORMATION FRAME
*
SUK A6,DWTOPN GET WRITE REQUEST DWT ADDRESS
LD A8,DWTECB,A6 ECB ADDRESS
IFT MMUPAG+MUX=0
LDKL A4,DLOBUF GET HEADER BUFFER ADDRESS
LD A3,ECBRL,A8 REQUESTED LENGTH
ADK A3,2 INCLUDE HEADER
LD A7,ECBBA,A8 GET BUFFER START ADDRESS
IFT SUB=1
LD A2,DWTSUB,A6 SYMBOLIC SUBTERMINAL ADDRESS
LD A1,DCDTE GET SYMB DTE
CF A15,GETSNA GET PHYS STA
SLL A1,8 SHIT IT ON LEFT
LCR A1,A7 1ST DATA CHARACTER
ST A1,DLOBUF+2 MOVE TO HEADER BUFFER
ADK A3,1 INCREMENT LENGTH FOR STA
ADK A7,1 INCREMENT FOR 1ST DATA CHARACTER
XIF
IFT MMUPAG+MUX=0
ST A7,SWITCH SAVE FOR BUFFER SWITCHING
XIF
IFF MMUPAG+MUX=0
IFT SUB=1
LD A2,DWTSUB,A6 GT SYMBOLIC SUBTERMIKNAL ADDRESS
LD A1,DCDTE GET SYMB DTE
CF A15,GETSNA GET PHYS STA
SC A1,MMUBUF+2 PUT IN HEADER
LDKL A2,MMUBUF+3 SYSTEM BUFFER ADDRESS
XIF
IFF MMUPAG+MUX=0
IFT SUB=0
LDKL A2,MMUBUF+2 SYSTEM BUFFER ADDRESS
XIF
IFF MMUPAG+MUX=0
LD A1,ECBBA,A8 USER BUFFER ADDRESS
LD A3,ECBRL,A8 NUMBER OF CHARS. TO MOVE
STR A5,A15 SAVE A5 STACK
LD A5,DWTTAB,A6 TTAB ADDRESS OF USER TASK
CF A15,MOVUS MOVE APPLICATION DATA TO SYSTEM BUFFER
LDR* A5,A15 RESTORE A5 STACK
LDKL A4,MMUBUF TRANSMIT BUFFER START ADDRESS
SUKL A2,MMUBUF END ADDRESS - START ADDRESS =
LDR A3,A2 = TOTAL LENGTH
XIF
ST A6,WRDWT SAVE WRITING DWT
LDK A1,/10 LOAD 'I'+F
LD A2,VRCNT GET NEXT EXPECTED N(S)
SLL A2,5
ORR A1,A2
LD A2,VSCNT GET N(S)
SLL A2,1
ORR A1,A2
STR A1,A4 STORE C-FIELD IN BUFFER
CF A5,WRFRAM
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSBTIF
CF A15,DCSUPR UPDATE STATISTICS
LDR A6,A2 RESTORE DWT
XIF
LD A1,VSCNT UPDATE V(S)
ADK A1,1
ANK A1,7 MODULO 7
ST A1,VSCNT
ST A1,CPCNT UPDATE CHECKPINT
*
* DISPATCH
*
TRMEND EQU *
LD A2,QOUT
CM TRMACT RESET OUTPUT FLAG
CW A2,QIN
ABL(E) TDISP NOTHING ON QUEUE
LDR* A1,A2 GET COMMAND
CWK A2,COMQE
RF(NE) TRME10 NOT END OF QUEUE
LDKL A2,COMQ-2 RESET OUTPUT POINTER
TRME10 EQU *
ADK A2,2
ST A2,QOUT
ABL TRM
EJECT
**********************************************************************
**********************************************************************
*
* SERVICE ROUTINES
*
**********************************************************************
**********************************************************************
*
* RSRSPQ - RESET RESPONSE QUEUE
*
RSRSPQ EQU *
LDKL A2,COMQ BASE
ST A2,QIN APPEND POINTER
ST A2,QOUT EXTRACT POINTER
ADKL A15,4 *
ABR* A15 * RETURN
EJECT
* QUEUEING FACILITY FOR HDLC TRANSMITTER
* ON ENTRY A1 CONTAINS REQUESTED HDLC COMMAND
*
QMTRM EQU *
LD A2,TRMACT
RF(NZ) QMTRM10 OUTPUT ACTIVE
*
* ACTIVATE TRANSMITTER
*
STR A4,A15 SAVE A4 ON STACK
CF A15,SETIME
DATA TRM,1 AFTER 100 MS
LDR* A4,A15 RESTORE A4
RF QMRTN
*
* PUT COMMAND ON QUEUE
*
QMTRM10 EQU *
LD A2,QIN
CWK A2,COMQE
RF(NE) QMTRM20 STILL SPACE IN QUEUE
LDKL A2,COMQ-2 RESET POINTER
QMTRM20 EQU *
ADK A2,2
STR A1,A2
ST A2,QIN
*
* RETURN
*
QMRTN EQU *
IFT CPU852=1
ADKL A15,4
ABR* A15
XIF
IFT CPU852=0
RTN A15
XIF
EJECT
*
* RESET PROCEDURE COUNTERS
*
*
RESCON EQU *
CM VSCNT
CM VRCNT
LDK A1,7
ST A1,NSCNT
CM NRCNT
CM LNRCNT
CM CPCNT
RTN A15
EJECT
*
*
* UPDATE PROCEDURE COUNTERS
* AND CHECK OUTPUT QUEUE
*
* ON ENTRY A1 CONTAINS CURRENT C-FIELD
*
*
UPDCON EQU *
LC A1,FIELD1+1 GET C-FIELD
LDR A2,A1 SAVE C-FIELD
ANK A2,1
RF(NZ) UPD100 NOT I-FRAME, NO N(S)
LDR A2,A1
SRL A2,1
ANK A2,7 MASK N(S)
ST A2,NSCNT STORE IT
CW A2,VRCNT CHECK IT
RF(NE) UPD080 INVALID
IM VRCNT INCREMENT VARIABLE
LDK A2,7
ANS A2,VRCNT MODULO 7
RF UPD100
UPD080 EQU *
LDK A2,1
ORS A2,STATUS INDICATE WRONG N(S)
UPD100 EQU *
LDR A2,A1 GET C-FIELD
SRL A2,5 ADJUST IT
ANK A2,7
LD A3,CPCNT GET CHECKPOINT
CW A3,LNRCNT
RF(E) UPD210 NO TRANSMISSION DONE
ST A2,NRCNT STORE N(R)
LD A6,WRDWT GET WRITING DWT
CW A2,CPCNT TRANSMISSION ACKNOWLEDGED ?
RF(NE) UPD130 NO
ST A2,LNRCNT YES,SAVE LAST ACKNOWLEDGED N(R)
*
*
* UPDATE OUTPUT QUEUE
*
IFF MMUPAG+MUX=0
CM SWMMU RESET FLAG
XIF
*
LDK A1,0 RC=0
CF A5,CWRITE CHECK COMPLETE REQUEST
RTN A5
*
* LAST TRANSMISSION NOT ACKNOWLEDGED
*
UPD130 EQU *
****** TEST IF VALID N(R) *********
CW A2,LNRCNT VALID ?
RF(NE) UPD205 NO
ST A2,VSCNT STORE NEXT N(S) TO BE SENT
RTN A5
*
* INDICATE WRONG N(R)
*
UPD205 EQU *
LDK A1,2
ORS A1,STATUS
RTN A5
*
* HERE ,NO TRANSMISSION HAS BEEN DONE
* SO,JUST CHECK SYNCHRONOUS N(R) SEQUENCE
UPD210 EQU *
*
CW A2,VSCNT
RB(NE) UPD205 WRONG SEQUENCE
RTN A5
EJECT
*
*
* STORE INPUT REGISTER A3-A8
*
*
STREGI ST A3,LCI3
ST A4,LCI4
ST A5,LCI5
ST A6,LCI6
ST A7,LCI7
ST A8,LCI8
RTNA15 EQU *
*
IFT CPU852=1
ADKL A15,4
ABR* A15
XIF
IFT CPU852=0
RTN A15
XIF
EJECT
*
*
* RESTORE INPUT REGISTER A3-A8
*
*
LDREGI LDKL A3,0
LCI3 EQU *-2
LDKL A4,0
LCI4 EQU *-2
LDKL A5,0
LCI5 EQU *-2
LDKL A6,0
LCI6 EQU *-2
LDKL A7,0
LCI7 EQU *-2
LDKL A8,0
LCI8 EQU *-2
RB RTNA15
EJECT
*
*
* STORE OUTPUT REGISTER A3-A8
*
*
STREGO ST A3,LCO3
ST A4,LCO4
ST A5,LCO5
ST A6,LCO6
ST A7,LCO7
ST A8,LCO8
RB RTNA15
EJECT
*
*
* RESTORE OUTPUT REGISTER A3-A8
*
*
LDREGO LDKL A3,0
LCO3 EQU *-2
LDKL A4,0
LCO4 EQU *-2
LDKL A5,0
LCO5 EQU *-2
LDKL A6,0
LCO6 EQU *-2
LDKL A7,0
LCO7 EQU *-2
LDKL A8,0
LCO8 EQU *-2
RB RTNA15
EJECT TRABUG TRABUG TRABUG TRABUG TRABUG TRABUG
*
* LOOKUP - LOOK UP KEY IN TABLE & BRANCH ON ADDRESS
*
* CALL:
* CF A15,LOOKUP TABLE ADDRESS TO STACK
* DATA LAST,ADDRE LAST ENTRY; ERROR ADDRESS
* DATA KEY1,ADDR1 KEY (A2); ADDRESS FOR BRANCH
* " " "
* LAST DATA KEYN,ADDRN
*
* ENTRY: A2 = KEY VALUE
* EXIT: A3 & A4 DESTROYED
*
LOOKUP EQU *
LDR A1,A15 USE A1 REGISTER
ADK A1,4 POINT TO NEXT INSTRUCTION ADDRESS
LDR* A3,A1 GET CONTENT=TABLE ADDRESS
LDR* A4,A3 GET LAST LEGAL ADDRESS
*
LOOK50 EQU * LOOP ENTRY
ADK A3,4 GET NEXT TABLE ENTRY ADDRESS
CWR A3,A4 PAST THE END?
RF(G) LOOK90 YES = NOT FOUND
CWR* A2,A3 KEY = VALUE IN TABLE?
RB(NE) LOOK50 NO - CHECK NEXT ENTRY
RF LOOK95 BRANCH TO TABLE ADDRESS
* KEY NOT FOUND
LOOK90 EQU *
LDR* A3,A1 GET TABLE ADDRESS AGAIN
LOOK95 EQU *
ADKL A15,4
ABI 2,A3 BRANCH ADDRESS
EJECT
**********************************************************************
*
* DCLINK - LINK DWT ADDRESS TO CONFIGURATION CHAIN
*
* ENTRY: A6 = DWT-ADDRESS
*
* EXIT: DCDWA = A(FIRST DWT IN CHAIN)
* DWTCHD = A(DTE)
* A2, A3 DESTROYED
*
**********************************************************************
*
DCLINK EQU *
LDR A2,A7 GET OPTION+ORDER
SLL A2,1 BIT /40 SET?
RF(NN) DCLK10 NO - NOT A MASTER DWT
CM DWTSUB,A6 SUBTERMINAL ADDRESS = 0 FOR MASTER
LD A2,DCDWA GET ANCHOR VALUE
ST A2,DWTCHN,A6 PUT IN THIS DWT:S CHAIN ADDRESS
ST A6,DCDWA THIS DWT FIRST IN CHAIN
RF DCLK50 COMPLETE
*
DCLK10 EQU *
LDKL A3,DCDWA-DWTCHN GET ANCHOR ADDRESS COMPATIBLE W/ DWT'S
DCLK20 EQU *
LDR A2,A3 PREVIOUS POINTER
LD A3,DWTCHN,A2 GET POINTER TO NEXT IN CHAIN
RB(NZ) DCLK20 KEEP ON UNTIL LAST IN CURRENT CHAIN
ST A6,DWTCHN,A2 ADD NEW DWT TO CHAIN
CM DWTCHN,A6 END OF CHAIN MARKER
*
DCLK50 EQU *
LDKL A2,DTE *
ST A2,DWTCHD,A6 * BACKWARD LINK TO ANCHOR
ADKL A15,4
ABR* A15 RETURN
EJECT
**********************************************************************
*
* DCREMV - REMOVE DWT-ADDRESS FROM CONFIGURATION CHAIN
*
* ENTRY: A6 = DWT-ADDRESS TO BE REMOVED
*
* EXIT: CC = 0 = CHAIN NOW EMPTY; ANCHOR = 0
* POS = DWT FOUND & REMOVED
* NEG = DWT NOT FOUND OR CHAIN EMPTY ON ENTRY
* A2 & A3 DESTROYED
*
**********************************************************************
*
DCREMV EQU *
LDKL A3,DCDWA-DWTCHN MAKE ANCHOR DWT-COMPATIBLE
DCRM20 EQU *
LDR A2,A3 PREVIOUS DWT-POINTER
LD A3,DWTCHN,A2 GET DWT OF NEXT (OR 1ST) ENTRY IN CHAIN
RF(NZ) DCRM30 NOT AT END
SUK A3,1 AT END & NOT FOUND; SET FOR CC = NEGATIVE
RF DCRM80 RETURN
*
DCRM30 EQU *
CWR A3,A6 IS THIS OUR DWT?
RB(NE) DCRM20 NO - LOOK AT NEXT
LD A3,DWTCHN,A6 GET LINK TO NEXT IN DWT TO BE REMOVED
ST A3,DWTCHN,A2 MOVE IT TO THE PREVIOUS ONE
LDK A3,0 SET FOR CC = 0
LD A2,DCDWA GET ANCHOR
RF(Z) DCRM80 LAST DWT NOW REMOVED
ADK A3,1 SET CC = POS.
*
DCRM80 EQU *
ADKL A15,4 UPDATE STACK
LDR A3,A3 SET PROPER CC
ABR* A15 RETURN
EJECT
**********************************************************************
*
* COMMUNICATIONS I/O PROCESSING
*
**********************************************************************
*
*
* TRANSMIT SHORT FRAME WITHOUT I-FIELD
* ON ENTRY A1 CONTAINS COMMAND/RESPONSE
*
*
TRSFR EQU *
LDKL A4,DLOBUF GET BUFFER ADDRESS
SC A1,+1,A4 STORE C-FIELD
LDK A3,2 FRAME LENGTH TO A3
CF A5,WRFRAM SEND THE FRAME
RTN A5
EJECT
*
* TRANSMIT ONE FRAME
* ON ENTRY : A3 = FRAME LENGTH IN BYTES
* A4 = BUFFER ADDRESS
*
WRFRAM EQU *
LC A1,DCTCA GET DTE ADDRESS
SCR A1,A4 STORE FIRST IN BUFFER
IFT MUX=1
LDR A2,A3 LENGTH IN BYTES
ADK A2,1 +1 IN CASE OF ODD
SRL A2,1 LENGTH IN WORDS
ORKL A2,WDXFER+WRCMD WORD XFER, WRITE COMMAND
WER A2,IOPOUT LENGTH TO IOP REG. 0
WER A4,IOPOUT+/1 ADDRESS TO IOP REG. 1
XIF
LD A1,PFPOST
RF(NZ) WRF105 WAIT FOR POWER UP
LDR A1,A3 GET LENGTH
ANK A1,1 ODD?
RF(Z) WRF100 NO
LDKL A1,/800 YES - 8 SIGNIF. BITS IN LAST WORD
WRF100 EQU * . 1
IFT MUX=0
ADK A1,CIXPC TRANSMIT P.C. COMMAND
XIF
IFT MUX=1
ADK A1,CIXMX TRANSMIT IOP COMMAND
XIF
CIO A1,1,CHLCUT START CHLC TRANSMITTER
RF(NA) WRT115 FORCE RETURN
WRF105 EQU *
CF A5,WRITE SEND THE FRAME
LDK A1,CINRTS
CIO A1,1,CHLCUT NO REQUEST TO SEND
RF(NA) WRT115 FORCE RETURN
CF A15,STREGO SAVE REGISTERS
ABL TDISP
WRT115 EQU *
RTN A5
EJECT
*
*
* READ ONE FRAME INTO RECEIVE POOL BUFFER
* ON EXIT CR = (Z) IF THE FRAME IS VALID
* WITH CORRECT ADDRESS.
* A1 CONTAINS THE CONTROL FIELD
* AND A4 CONTAINS BUFFER ADDRESS
*
*
RDFRAM EQU *
CM FIELD1 CLEAR CONTROL FIELD (A+C)
LD A4,DCIPA GET BUFFER
RF(NZ) RDF001 BUFFERS STILL AVAILABLES
IM BUFNUL SET BUFFER OVERFLOW INDICATOR
IFT MUX=1
LDKL A4,FIELD1 SHORT BUFFER-
LDKL A3,2+WDXFER+1 1 WORD LONG
XIF
RF RDF002
RDF001 EQU *
CM BUFNUL RESET INDICATOR
IFT MMUPAG+MUX=0
ADK A4,RCVHDR RESERVE HEADER
XIF
IFT MMUPAG=1
IFT MUX=0
ADK A4,RCVHDR POINT AT 1ST DATA BYTE
XIF
IFT MUX=1
ADK A4,RCVHDR-2 POINT AT A-FIELD
LDKL A3,WDXFER+RBUFL+1 BFR LENGTH IN WDS INCL A+C
XIF
RDF002 EQU *
IFT MUX=0 .
LDK A3,0 RESET CHARACTER COUNTER
XIF .
IFT MUX=1
WER A3,IOPIN LENGTH ---> IOP REG. 0
WER A4,IOPIN+1 ADDRESS ---> IOP REG. 1
XIF
LD A1,PFPOST
RF(NZ) RDF010 WAIT FOR POWER UP
IFT MUX=0
LDK A1,CIRPC RECEIVE ON PC
XIF
IFT MUX=1
LDK A1,CIRMX RECEIVE ON IOP
XIF
CIO A1,1,CHLCIN START RECEIVER
RF(NA) RDF140 COMMAND NON ACCEPTED
RDF010 EQU *
LDK A7,0
CF A5,READ READ THE FRAME
IFT MUX=1
LDR A7,A7 SET CND REG
XIF
RF(Z) RDF110 VALID FRAME
RDF020 EQU *
LDK A3,1 FLAG INVALID
RF RDF120
RDF110 EQU *
LD A4,DCIPA
RF(Z) RDF115
ST A3,RCVEL,A4 LENGTH TO RECEIVE BUFFER
IFT MUX=1
LD A3,RCVTCA,A4 GET A + C
ST A3,FIELD1 SAVE FOR TESTS
XIF
RDF115 EQU *
LC A1,FIELD1 GET CLUSTER ADDRESS
LDR A1,A1 *
RF(Z) RDF150 SKIP CONTENTION SST
CC A1,DCTCA OUR ADDRESS?
RB(NE) RDF020 NO - SET INVALID
LDK A3,0 FLAG VALID FRAME
LC A1,FIELD1+1 GET COMMAND FIELD OF FRAME
RF RDF125 NO STATUS CHECK WHEN DATA OK
RDF120 EQU *
LDR A1,A2 SAVE STATUS
ANK A2,1 MODEM NOT OP ?
RF(NZ) RDF130 YES
ANKL A1,/302E MERGE WITH BAD HW STATUS
RF(NZ) RDF126 HW INCORRECT
RDF125 EQU *
ADK A5,4
LDR A3,A3 SET PROPER CC
ABR* A5
RDF126 EQU *
CF A15,STREGI SAVE REGISTERS
CF A15,SETIME
DATA RDF127,CUTIME
ABL TDISP START TIMER
RDF127 EQU *
CF A15,LDREGI RELOAD REGISTERS
RB RDF125 RETURN AFTER DELAY (HIGH SECURITY !!)
EJECT
*
* RESTORE LINE WHEN REQUIRED
*
RDF130 EQU * DISCONNECT,CONNECT MODEM
CF A5,CUOPEN TRY TO CONNECT MODEM
RF(N) RDF140 INVALID DTE
RB(Z) RDF130 NO SUCCESS
RDF131 EQU *
LDK A3,1 FLAG INVALID FRAME
RB RDF125
RDF140 EQU *
CM DCCUS HW OUT OF SERVICE
LDKL A3,-1 SET CC NEGATIVE
RB RDF125
RDF150 EQU *
CF A15,STREGI SAVE REGISTERS
CF A15,SETIME START TIMER
DATA RDF160,CUTIME
ABL TDISP
RDF160 EQU *
CF A15,LDREGI RESTORE REGISTERS
ABL RDF020 SKIP CONTENTION
EJECT
*
*
* POWER ON FUNCTIONS
*
*
DC07ON EQU *
IFT CPU852=1
CF A15,SAVE8 SAVE A1-A8
XIF
IFT CPU852=0
MSR 8,A15 SAVE REGISTERS
XIF
CF A15,RSRSPQ RESET RESPONSE QUEUE
LD A2,DCREQS CURRENT STATE
ABL(NZ) PWERXX DTE ACTIVE
LD A6,WRDWT DWT PRESENT ? =2
ABL(Z) TDISP NO
LD A1,DWTST,A6 ORDER PRESENT ?
ABL(N) TDISP NO
LD A1,DWTOR,A6 OPEN REQUEST ?
SUK A1,/21
ABL(NZ) TDISP NO
LDKL A5,STBIN YES,COMPLETE
ABL RQOP21
PWERXX EQU *
LD A6,WRDWT DWT PRESENT ? =2
RF(Z) PWERX1 NO
LD A1,DWTST,A6 ORDER PRESENT ?
RF(N) PWERX1 NO
LD A1,DWTOR,A6 GET ORDER
SUK A1,/22 CLOSE ?
ABL(E) RQCL52 YES COMPLETE
PWERX1 EQU *
LDKL A5,STBIN POWER FAILURE
CF A5,CUOPEN CONNECT MODEM
ABL(N) TDISP HW OUT OF SERVICE
RB(Z) PWERX1 NOT OK,TRY AGAIN
ABI DCMODE RESTART RECEIVER
EJECT
*
* TIMER FUNCTIONS
*
SPTIM EQU *
CF A15,SETIME
DATA PTOUT,TIMPOL
ST A4,DCTPGP SAVE POINTER
ADKL A15,4
ABR* A15 RETURN
PTOUT EQU *
*
LD A1,DCHDLS SAVE CURRENT STATE
RF(Z) PTOUT1 ALREADY TIMED OUT
ST A1,SAHDLC
CM DCHDLS CLEAR IT
PTOUT1 EQU *
CF A15,SPTIM RESTART TIMER
ABL TDISP
CPTIM EQU *
LD A1,SAHDLC
ST A1,DCHDLS RESTORE STATUS
LDKL A2,-TIMPOL
ST* A2,DCTPGP RESTORE TIMER
ADKL A15,4
ABR* A15 RETURN
EJECT
*
*
* READ FROM THE LINE
*
*
READ EQU *
CF A15,STREGI SAVE REGISTERS
ABL TDISP
*
*
* WRITE ON THE LINE
*
*
WRITE EQU *
CF A15,STREGO SAVE REGISTERS
ABL TDISP
EJECT
**********************************************************************
*
* CUOPEN - CONNECT MODEM
*
* ISSUE CONNECT MODEM FUNCTION IF CONTROL UNIT STATE = 0
* CHANGE STATE TO 1 IF SUCCESSFUL
*
**********************************************************************
*
CUOPEN EQU *
CF A15,STREGI SAVE REGISTERS
CF A15,SETIME START TIMER
DATA CUOP89 TIMEOUT ADDRESS
DATA CUTIME TIMEOUT VALUE X 100 MS
ABL TDISP
CUOP89 EQU *
CF A15,LDREGI RESTORE REGISTERS
LDK A1,CICMO CONNECT MODEM
CIO A1,1,CHLCIN ISSUE FUNCTION
RF(NA) CUOP91 COMMAND NOT ACCEPTED
CF A5,READ WAIT FOR INTERRUPT OR TIMEOUT
IFT MUX=1
LDR A7,A7 SET CND REG
XIF
RF(NZ) CUOP90 BAD
LDK A1,1
ST A1,DCCUS OK,SET CONNECT
*
CUOP90 EQU *
ADK A5,4 UPDATE STACK
LD A1,DCCUS SET CC
ABR* A5 RETURN
CUOP91 EQU *
CM DCCUS HW OUT OF SERVICE
ADK A5,4 UPDATE STACK
LDKL A1,-1 SET CC NEGATIVE
ABR* A5 RETURN
EJECT
**********************************************************************
*
* CUCLOS - DISCONNECT MODEM
*
* DISCONNECT MODEM (DROP DSR) AND CHANGE
* CONTROL UNIT STATE TO 0
*
**********************************************************************
*
CUCLOS EQU *
LD A1,DCCUS GET CURRENT CONTROL UNIT STATE
RF(Z) CUCL90 ALREADY DISCONNECTED
CIO A1,0,CHLCIN SET HW INACTIVE
RF(NA) CUCL90 HW PROBLEMS
CF A5,READ
LDK A1,CIDISC DISCONNECT COMMAND
CIO A1,1,CHLCIN ISSUE FUNCTIOON
RF(NA) CUCL90 HW PROBLEMS
CF A5,READ WAIT FOR INTERRUPT
*
CUCL90 EQU *
CM DCCUS HW DOWN
RTN A5
EJECT
*
*
* INPUT INTERRUPT HANDLER
*
*
IH0701 EQU *
*
IFT CPU852=1
CF A15,SAVE8
XIF
IFT CPU852=0
MSR 8,A15 SAVE REGISTERS
XIF
*
CF A15,LDREGI
IFT MUX=1
ABL SSTIN MUST BE STATUSL
XIF
IFT MUX=0
INR A2,0,CHLCIN READ 16 BITS
RF(NA) IHLC10 NOT ACCEPTED
*
IFT MUX=0
IFF LOGG=0
CF A5,LOGIN
*
XIF
IFT MUX=0
*
*
* STORE FIRST WORD IN FIELD1
*
LD A7,TESTCF FIRST WORD ?
RF(NZ) NFIRST NO
IM TESTCF YES,SET FIRST WORD FLAG
ST A2,FIELD1 AND STORE ADDRESS + C-FIELD
ABL READ
NFIRST EQU *
LD A1,BUFNUL
ABL(NZ) READ BUSY DO NOT ACCEPT ANY DATA
SC A2,1,A4
ECR A2,A2
SCR A2,A4
ADK A4,2 INCREMENT POINTER
ADK A3,2 INCREMENT COUNTER
CWK A3,RBUFL+RBUFL BUFFER OVERFLOW ?
ABL(L) READ NO
*
* BUFFER OVERFLOW
*
SUK A4,2 DECREMENT POINTER
ABL READ
*
* INR NOT ACCEPTED
*
IHLC10 EQU *
CM TESTCF RESET FIRST WSORD TEST
CF A5,SSTIN PERFORM SST
ADK A5,4
LDR A7,A7
ABR* A5
XIF
EJECT
*
*
* PERFORM SST ON INPUT CHANNEL
*
*
SSTIN EQU *
SST A2,CHLCIN PERFORM SST
RF(NA) SSTI20 NOT ACCEPTED
IFF LOGG=0
CF A5,LOGSST
XIF
LDR A1,A2
ANK A1,1 MODEM NOT OP
RF(Z) SSTI30 NOT PRESENT
IFT STAT=1
LDR A2,A6 SAVE DWT
LDKL A6,DTE GET DTE
LDKL A1,CSCDCE LOAD STATISTICS
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE THAT DWT
XIF
LDK A2,1 RESTORE MODEM NOT OPERABLE
CM DCCUS CLEAR MODEM UP
EJECT
*
* MODEM OK:
* COULD BE OK OR RETRY INPUT
*
SSTI20 EQU *
LDK A7,1 INDICATE INVALID FRAME
RTN A5
SSTI30 EQU *
LDK A1,1
ST A1,DCCUS MODEM OK
IFT MUX=1
LDR A2,A1 GET SST
ANK A2,8 OVRFLOW ?
RF(NZ) SSTI31 YES ACCEPT IT ANYWAY
XIF
LDR A1,A2
ANKL A1,/302E INVALID FRAME ?
RB(NZ) SSTI20 YES,CARRIER DOWN,THROUGPUT,CRC...ETC...
IFT MUX=0
CWK A3,RBUFL+RBUFL BUFFER OVERFLOW?
RB(G) SSTI20 YES - ERROR
XIF
SSTI31 EQU *
LDK A7,0
IFT MUX=1
LD A4,BUFNUL SHORT BUFFER USED?
RF(NZ) SSTI40 YES
RER A4,IOPIN GET RESIDUAL LENGTH IN WORDS
LDKL A3,RBUFL ORIG. LENGTH, DON`'T INCL A+C
SUR A3,A4 MINUS RESIDUAL LENGTH
SLL A3,1 LENGTH RCVD IN CHARS
XIF
ANKL A2,/0F00
RF(Z) SSTI40 ALL BITS IN LAST INTERRUPT SIGNIFICANT
SUK A3,1 ADJUST LENGTH
SSTI40 RTN A5
EJECT
*
*
* OUTPUT INTERRUPT HANDLER
*
*
IH0702 EQU *
*
IFT CPU852=0
MSR 8,A15 SAVE REGISTERS
XIF
IFT CPU852=1
CF A15,SAVE8
XIF
*
CF A15,LDREGO
IFT MUX=1
ABL IHLCU1
XIF
IFT MUX=0
LCR A2,A4
SLL A2,8
LC A2,+1,A4 INIT OUTPUT REGISTER
OTR A2,0,CHLCUT SEND THEM
RF(NA) IHLCU1 NOT ACCEPTED
*
IFT MUX=0
IFF LOGG=0
CF A5,LOGOUT
XIF
IFT MMUPAG+MUX=0
*
* HERE TO BROADCAST DIRECT FROM USER BUFFER
*
LD A7,SWITCH LOAD USER BUFFER ADDRESS
RF(Z) IHLCUX I-FRAME
IFT SUB=1
CWK A4,DLOBUF 1ST WORD SENT?
RF(E) IHLCUX YES - SEND 2ND
XIF
IFT MMUPAG+MUX=0
LDR A4,A7 INIT FIRST PASSAGE
SUK A4,2 PREPARE POINTER
XIF
IFT MUX=0
CM SWITCH CLEAR INDICATOR
IHLCUX EQU *
ADK A4,2 INCREMENT POINTER
SUK A3,2 DECREMENT COUNTER
RF(P) IHWAIT WAIT FOR NEXT INTERRUPT
*
* END OF FRAME
*
CIO A1,0,CHLCUT HALT TRANSMISSION
IHWAIT EQU *
CF A15,STREGO SAVE REGISTERS
ABL TDISP
XIF
EJECT
*
* CHECK SST
*
IHLCU1 EQU *
SST A2,CHLCUT PERFORM SST
RF(NA) IHLCU2 NOT ACCEPTED
*
IFF LOGG=0
CF A5,LOGSST
XIF
*
LDR A1,A2
RF(Z) IHLCU2 SST OK
ANK A1,1
RF(Z) IHLCU3 THROUGHPUT ERROR
*
* MODEM NOT OPERABLE
*
IFT STAT=1
LDR A2,A6 SAVE THAT DWT
LDKL A6,DTE GET DTE
LDKL A1,CSCDCE LOAD STATISTIC
CF A15,DCSUPR UPDATE
LDR A6,A2 RESTORE DWT
XIF
CF A15,STREGO SAVE REGISTERS
CF A15,SETIME START TIMER
DATA IHLCU5,10
ABL TDISP DISPATCH
*
* TIMEOUT
*
IHLCU5 EQU *
CF A15,LDREGO
*
* THROUGHPUT ERROR
*
IHLCU3 EQU *
CM TRMACT RESET OUTPUT ACTIVE
LDK A7,1
IHLCU2 EQU *
RTN A5
EJECT
**********************************************************************
*
* BUFFER AREAS
*
**********************************************************************
*
*
* DC RECEIVE BUFFER POOL
*
*
* BYPASS ASSEMBLER CONSTRAINTS:
RBUFLB EQU RBUFL+RBUFL BUFFER DATA PORTION - BYTES
* .
RLINK EQU RBUFLB+RCVHDR+2 SECTION SIZE, LINKAGE WORD INCL. (BYTES)
*
RBUFP EQU * START OF RECEIVE BUFFER POOL
IFT RBUFNR=14
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=13
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=12
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=11
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=10
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=9
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=8
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=7
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=6
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=5
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=4
DATA *+RLINK
RES RBUFL+RCHDRW
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
IFT RBUFNR=3
DATA *+RLINK
RES RBUFL+RCHDRW
XIF
DATA *+RLINK
RES RBUFL+RCHDRW
DATA 0
RES RBUFL+RCHDRW
*
IFF MMUPAG+MUX=0
MMUBUF RES TBUFL+2 MMU TRANSMIT BUFFER INCL. HEADER SP]ACE
XIF
EJECT
*
* DATA LINK CONTROL OUTPUT BUFFER
* HEADER IF I-FRAME
*
*
DLOBUF EQU *
RES 6 OUTPUT BUFFER
*
*
* HDLC CIRCULAR COMMAND QUEUE
*
*
QIN DATA COMQ INPUT POINTER
QOUT DATA COMQ OUTPUT POINTER
*
*
COMQ EQU * CIRCULAR COMMAND QUEUE
DATA 0,0,0,0,0
COMQE EQU *-2 END OF QUEUE
*
*
*
EJECT
**********************************************************************
*
*
* INTERRUPT LOGGING ROUTINE
*
**********************************************************************
*
IFF LOGG=0
LOGSST EQU *
LDKL A1,/5555
RF LOG10
LOGOUT EQU *
LDK A1,0
RF LOG10
LOGIN EQU *
LDKL A1,/1111
LOG10 ST A3,SAVE3
ST A2,SAVE2
LD A3,LOGPNT
STR A1,A3
ADK A3,2
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
RTN A5
EJECT
*
*
LOGPNT DATA LOGSTA
LOGSTA EQU *
RES 400
LOGEND EQU *-6
SAVE2 DATA 0
SAVE3 DATA 0
XIF
*
*
*
END