|
|
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: 39616 (0x9ac0)
Notes: pts_type(SC)
Names: »DRDC13.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DRDC13.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/DRDC13.SC«
IDENT DRDC13 REL 11.0 81-01-26 870105041100
=3, ABORT ROUTINE FOR REL 11.0
PRR 10.0 80-02-15
=2, DC:MIN HEADER LENGTH
REL 10.1 79-12-07
=1, OLLES POWER UP
REL 10.1 79-10-26
*
*********************************************
*
* PHILIPS TERMINAL SYSTEM PTS
*
*
* DRDC13 : VIP7700 FOR BPPOAA
*
* PROC : SYNCHRONOUS,HALF-DUPLEX,8-BIT ASCII
** SIMULATION OF SINGLE ADDRESS TRIBUTARY STATION
* TT ADDRESS ALWAYS 60 HERE (NOT SIGNIFI.)
* SERVICE FRAME USED : ACK NAK,BSY
*
*
*
*********************************************
*
*
EJECT
*
*
* ENTRY POINTS
*
*
ENTRY DC13AD ADDRESS BLOCK TERMINAL REQUESTS
ENTRY IH1301 INPUT INTERRUPT
ENTRY IH1302 OUTPUT INTERRUPT
ENTRY DC13ON POWER ON ROUTINE
ENTRY DW1300 DWT FOR DCTASK
*
*
* 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 INTSAV SAVE AREA LAST INTERRUPT
EXTRN ECBBA ECB BUFFER ADDRESS
EXTRN ECBRL ECB REQUEST LENGTH
EXTRN ECBEL ECB EFFECTIVE READ LENGTH
EXTRN ECBCW ECB CONTROL WORD
EXTRN ECBRC ECB RETURN CODE
EXTRN DC:MIN MOVE DATA TO USER BUFFER
EXTRN DC:MOT MOVE DATA FROM USER BUFFER
EXTRN DISEND COMPLETE REQUEST AND DISPATCH
EXTRN SETTIM START TIMER
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
* DWTTP TIMERPOINTER, ORDER PROCESS
* DWTWQ WRITE/GET BUFFER QUEUE
*
EJECT
********************
*
* PARAMETERS FOR CONDITIONAL ASSEMBLY
*
********************
*
X:A EQU 270
RBUFL EQU 270 RECEIVE BUFFER LENGTH
X:B EQU /60
DCFC EQU /60 DC TASK FILE CODE
X:C EQU 1
LOGG EQU 1 INTERRUPT LOGGING
X:D EQU 2
RBUFNR EQU 3 NUMBER OF RECEIVE BUFFERS(2-4)
X:E EQU 45
TIMPOL EQU 045 POLL TIMEOUT VALUE
X:F EQU 0
P6805 EQU 00
X:G EQU /02
IFT P6805=0
CHLCIN EQU 02
XIF
IFT P6805=1
CHLCIN EQU /0A DEVICE ADDRESS OF RECEIVER
XIF
X:H EQU 500
TBUFL EQU 300 MMU BUFFER LENGTH
*
IFT P6805=0
CHLCUT EQU CHLCIN+/10 DEVICE ADDRESS OF TRANSMITTER
XIF
IFT P6805=1
CHLCUT EQU CHLCIN+/01 DEVICE ADDRESS OF TRANSMITTER
XIF
EJECT
********************
*
* CONDITIONAL ASSEMBLY
*
********************
MMUPAG EQU 0 0=NO TOSS MMU-PAGING
*
*
CPU852 EQU 1 0=EXTENDED INSTRUCTION SET
*
*
DEVIND EQU -2 DEVICE INDEX DATA COMMUNICATION
*
*
BUFLEN EQU TBUFL+TBUFL MMU BUFFER SIZE
EJECT
********************************************
*
* USE OF STATUS WORD BIT PATTERN
* WITHIN DRDC13
*
********************************************
SWBT00 EQU /8000 REQUEST ERROR
SWBT02 EQU /2000 STATUS CHANGE DC-TASK
SWBT09 EQU /0040 TIMEOUT ERROR DC-TASK
SWBT10 EQU /0020 CARRIER OFF
SWBT15 EQU /0001 MODEM NOT READY
SWBT0:12 EQU /8008 REQUEST ERROR & ILLEGAL LENGTH
SWBT2:09 EQU /2040 TIMEOUT ON READ OR WRITE REQUEST
EJECT
********************************************
*
* DWTREQ IS AN INTERNAL VARIABLE USED
* AS A REQUEST VECTOR AND MAY HAVE
* THE FOLLOWING VALUES.
*
********************************************
* DWTREQ = /8100 MEANS AN EXPECTED ACK ON A PREVIOUS MESSAGE
* DWTREQ = /0100 " AN OUTSTANDING WRITE
* DWTREQ = /0003 " A BSY TO BE SENT
* DWTREQ = /0002 " A NAK TO BE SENT
* DWTREQ = /0001 " AN ACK TO BE SENT
********************************************
EJECT
********************
*
* DWT DISPLACEMENTS
*
********************
DWTDRD EQU /10
*
*
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
DWTSQ EQU START+/04 STATUS QUEUE
DWTRQ EQU START+/06 RECEIVE QUEUE
DWTTIM EQU START+/08 REQUEST TIMER VALUE
DWTREQ EQU START+/0A REQUEST VECTOR
DWTTRY EQU START+/0C RETRY-COUNTER
*
*
* REQUEST HANDLING
*
*
*
* PARAMETERS
*
* A7=ORDER
*
* /02: READ
* /06: WRITE
* /37: TRANSFER PARAMETERS
* /39: SET REQUEST TIMEOUT VALUE
*
EJECT
****** CHARACTERS EQUATES
* SPECIAL PROC. VIP700
*
SOH EQU /01
SYN EQU /16
STX EQU /02
ETX EQU /03
EOT EQU /04
SP EQU /20
KC EQU /43
KNUL EQU /00
ACK EQU /06
NAK EQU /15
PADP EQU /FF
PAD EQU /7F
ACKSP EQU /0620 ACK+SPACE
NAKSP EQU /1520 NAK
BSYSP EQU /6F20 BUSY
NULSP EQU /8020 NUL
EJECT
*
*
****** PROC. AREAS AND CONSTANTS
*
*
TERID RES 1 TERMINAL ID
HEADER DATA 0 CODE-F1 FOR HEADER
DCONOF DATA 0 LINE STATUS 1=OK,0=OFF,2=RESTART
DCSTOL DATA 0 OLD DC EQUIPMENT STATUS
DCSTCU DATA 0 CURRENT STATUS
DCTPGP DATA 0 TIMER POINTER GENERAL POLL
DCLCI DATA 0 DC UNIT INPUT STATUS
CURDWT RES 1 CURRENT DWT
SVRDL RES 1 SAVE READ LENGTH AREA
WPOLL DATA 0 OH !! MY POLL !!
RES 20 USER STACK
STB RES 1
EJECT
*
*
* LINE CONTROL UNIT FUNCTION CONTROL
*
IFT P6805=0
CBCARR EQU /100+SYN
XIF
IFT P6805=1 SALCUZ
CBSTOP EQU /00
CBPARI EQU /0C
XIF
*
*
* LINE CONTROL UNIT SST STATUS BITS
*
SBNOOP EQU /01
SBTHRU EQU /02
SBCARR EQU /20
IFT P6805=0
SBERR EQU /23 SBNOOP+SBTHRU+SBCARR
XIF
IFT P6805=1 SALCUZ
SBPARI EQU /04
SBERR EQU /27 SBNOOP+SBTHRU+SBCARR+SBPARI
XIF
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
ABL(Z) REQTIM SET REQUEST TIMER
RF DCA100
*
**********
*
* ACTIVATION FROM DCTASK
*
**********
*
DCACTD EQU *
SUR A1,A1 PRESET RETURN CODE
SUK A7,/02
RF(E) DCRDDC READ
SUK A7,/37-/02
RF(E) DCTP TRANSFER PARAMETERS
DCA100 ABL DISIOE INVALID ORDER
EJECT
**********
*
* DC TASK ADDRESS BLOCK
*
**********
*
DATA 0 INDICATES NO MMU BUFFER
DATA DEVIND DEVICE INDEX
DC13DC DATA DCACTD ACTIVATION ADDRESS
DATA ABORT ABORT ROUTINE ADDRESS
DATA DCRBUF RECEIVE BUFFER ANCHOR
DATA 6 HEADER LENGTH =2
*
*
**********
*
* DRIVER ADDRESS BLOCK
*
**********
*
DATA BUFLEN MMU BUFFER SIZE
DATA DEVIND DEVICE INDEX
DC13AD DATA DCACT ACTIVATION ADDRESS
DATA ABORT ABORT ROUTINE
DATA DCRBUF RECEIVE BUFFER ANCHOR
DATA 6 HEADER LENGTH =2
EJECT
**********
*
* READ FROM DC TASK
* REQUEST FROM DC TASK
* COMPLETE WHEN:
* -STATUS CHANGE ON DC EQUIPMENT
* -SPONTANEOUS MESSAGE RECEPTION
*
**********
*
DCRDDC EQU *
CF A15,CKMESS CHECK IF MESSAGE RECEIVED
*
*
*
DCRTN EQU *
ABL TDISP TO DISPATCHER
EJECT
*
*
* TRANSFER PARAMETERS
*
*
* FROM TERMINALS: TRANSFER TERMINAL ADDRESSES
*
*
DCTP LD A2,ECBCW,A8 GET PARAMETER
STR A2,A6 SAVE IN FIRST WORD OF DWT
CWK A6,DW1300 DCTASK DWT ?
RF(E) DCTP40 YES!SHOULD'NT BE IN DC:TAB
LD A1,DC:IN GET DC:TAB INPUT POINTER
CWK A1,DC:END TABLE ALREADY FULL ??
ABL(E) DISIOE YES!! REQUEST ERROR
LD A4,DCTAB GET DC:TAB ADDRESS
AD* A4,DCTAB LAST TABLE ENTRY
DCTP20 SUK A4,2 ADDRESS TO NEXT ENTRY
CW A4,DCTAB ALL ENTRIES CHECKED ??
RF(E) DCTP30 YES!! DWT NOT IN TABLE
CWR* A6,A4 IN TABLE ?
RF(E) DCTP40 YES !!
RB DCTP20 CHECK NEXT ENTRY
DCTP30 EQU *
STR A6,A1 INSERT DWT IN DC:TAB
LDK A1,2
ADS A1,DC:IN UPDATE DC:TAB IN POINTER
ADS A1,DC:TAB INCREMENT DC:TAB LENGTH
DCTP40 EQU *
LDK A1,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 YES!!
XIF
CF A15,TIMEWR SET TIMER
LDKL A2,/0100
ORS A2,DWTREQ,A6 INDICATE WRITE REQUEST OUTSTANDING
CM DWTTRY,A6 CLEAR RETRY-COUNTER
RB DCRTN
EJECT
*
*
* READ
*
*
* COMPLETE WHEN:
* MESSAGE RECEIVED
* TIME OUT
*
*
DCRD EQU *
LD A8,DWTECB,A6 GET ECB
LD A4,DWTRQ,A6 AND RECEIVE MESSAGE QUEUE
RF(Z) DCRD20 NOTHING IN QUEUE
LDR* A2,A4 TAKE THE FIRST IN QUEUE
ST A2,DWTRQ,A6
LDK A1,0 RESET RETURN CODE
ADK A4,6
LD A3,-4,A4 EFFECTIVE LENGTH
ST A3,ECBEL,A8
CF A15,DC:MIN MOVE DATA TO USER BUFFER
RB DCRTN
DCRD10 EQU *
LDK A1,0
CF A15,TENDIO
RB DCRTN
DCRD20 CF A15,TIMERE START TIMER
RB DCRTN
EJECT
********************
*
* SET REQUEST TIMEOUT VALUE
*
********************
*
REQTIM EQU *
LD A2,ECBCW,A8 TIMEOUT VALUE
ST A2,DWTTIM,A6 SAVE IT IN DWT
RB DCRD10 TENDIO AND DISPATCH
*
*
IFT MMUPAG=1
IL:LEN LDKL A1,/8008 REQUEST ERROR + ILLEGAL LENGTH
ABL DISEND COMPLETE REQUEST
XIF
*
*
EJECT
********************
*
* TIMER HANDLING PART
*
********************
*
* READ TIMER = TIMERR
*
********************
*
TIMERE EQU *
LDR A1,A6
LD A2,DWTTIM,A6 GET REQUEST TIME 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 TO CALLER
*
********************
*
* TIMEOUT READ TIMER
*
********************
*
TOUTRE EQU *
LDR A6,A1 FETCH DWT
CM DWTTP,A6 CLEAR TIMER POINTER
TOUTR1 EQU *
LDK A1,/40 INDICATE TIMEOUT ERROR
CM DWTREQ,A6 CLEAR REQUEST VECTOR
TOUTR2 RB ENDIO COMPLETE REQUEST
EJECT
*
********************
*
* WRITE TIMER = TIMWR
*
********************
*
TIMEWR LDR A1,A6
LD A2,DWTTIM,A6 GET REQUEST 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 GET DWT
CM DWTTP,A6
RB TOUTR1
EJECT
*
*
* STOP REQUEST TIMING
*
* REMAINING TIME IS RETURNED IN A2
*
*
CTIME EQU *
INH
LD A2,DWTTP,A6 GET TIMER POINTER
RF(Z) CTIM10 NOT RUNNING
LDR* A2,A2 GET REMAINING TIME
NGR A2,A2
CM* DWTTP,A6
CM DWTTP,A6
CTIM10 EQU *
ENB
RTN A5
EJECT
********************
*
* GET RECEIVE BUFFER
*
* CALLING SEQUENCE: CF A15,GRBUF
*
* A4 = 0 IF NO AVAILABLE BUFFER
* 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 FREE BUFFER
LDR* A3,A4 REMOVE BUFFER FROM FREE CHAIN
STR A3,A2
GBUF10 ADKL A15,4 ADJUST STACK POINTER
ABR* A15 RETURN TO CALLER
EJECT
********************
*
* QUEUE ALLOCATED RECEIVE BUFFER
*
* A4 = BUFFER ADDRESS
* A2,A3 ARE DESTROYED
*
********************
*
QRBUF EQU *
LDR A2,A6 QUEUE ON TERMINAL DWT
ADK A2,DWTRQ 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 OF QUEUE
RTN A5
EJECT
********************
*
* CHECK IF UNEXPECTED MESSAGE OR STATUS REQUEST CHANGE
* REGISTERS A1 - A4,A6,A8 ARE DESTROYED
*
********************
*
CKMESS LDKL A6,DW1300
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 ADDRESS TO A8
LD A3,DWTRQ,A6 A3 = ADDRESS TO READ QUEUE
RF(Z) CKM200 NO READ IN QUEUE
LDR* A2,A3 A2 = ADDRESS TO NEXT READ BUFFER
ST A2,DWTRQ,A6 STORE THIS ADDRESS ON QUEUE
ADK A3,6 MOVE POINTER TO TEXT
ST A3,ECBBA,A8 SAVE THIS ADDRESS IN ECB
LD A4,-4,A3
ST A4,ECBEL,A8 STORE NUMBER OF CHARACTERS
LD A4,-2,A3
ST A4,ECBCW,A8 STORE LINE DEVICE ADDRESS
LDR A4,A3
LDK A1,0 RESET RETURN CODE
CF A15,DC:MIN MOVE DATA TO USER BUFFER
CKM110 RB GBUF10 RETURN
CKM200 LD A1,DCSTCU NO MESSAGE RECEIVED,CHECK STATUS
OR A1,DCONOF TAKE CARE OF POLL TIMEOUT
CW A1,DCSTOL
ST A1,DCSTOL
RB(E) CKM110 NO CHANGE OF STATUS
ORKL A1,/2000 INDICATE STATUS CHANGE
CF A15,TENDIO COMPLETE READ REQUEST
RB CKM110
EJECT
********************
*
* ABORT ROUTINE
*
********************
*
ABORT LD A2,DWTTP,A6 TIMER POINTER =3
RF(Z) AB:10 NO TIMER RUNNING
CM* DWTTP,A6 KILL TIMER
CM DWTTP,A6
AB:10 LD A2,DWTOR,A6 ORDER CODE =3
SUK A2,2 . =3
RF(Z) AB:RTN READ REQUEST. NO ACTION
SUK A2,4 . =3
RF(NZ) AB:RTN NO ACTION IF NOT READ/WRITE
AB:RTN EQU *
ABL DISEND COMPLETE REQUEST =3
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
*
*
*
LDREG EQU *
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
*
*
* BASIC RECEIVE MODE
*
BRM EQU *
LDKL A5,STB LOAD STACKBASE TO A5
CF A5,CSYNCI START INPUT WITH SYN.DEF.
*
*
* LOOK FOR SOH OR TWO CONSECUTIVE PAD:S
*
BRM100 EQU *
CF A5,READ READ A CHARACTER
*
BRM110 EQU *
SUK A2,SOH IS IT START OF HEADER ?
RF(E) BRM200 YES
SUK A2,PADP-SOH IS IT A PAD ?
RB(NE) BRM100 NO
CF A5,READ READ A CHARACTER
SUK A2,PADP IS IT THE SECOND PAD ?
RB(NE) BRM100 NO
EJECT
*
*
* HALT INPUT CHECK IF THERE IS A POLL
*
BRM150 EQU *
CF A5,CHALTI HALT INPUT
LD A2,WPOLL IS THERE A POLL ?
RB(Z) BRM NO RESYNCHRONIZE
ABL POLL YES
*
*
* CHECK STATUS FROM THE CONTROL UNIT
*
BRM160 EQU *
CF A5,READ READ A CHARACTER
LD A1,DCSTCU CHECK OLD STATUS
RB(NZ) BRM150 STATUS CHANGED HALT INPUT
RB BRM110
*
*
* THROUGHPUT ERROR
*
BRM170 EQU *
LDKL A5,STB LOAD STACKBASE TO A5
CF A5,CSYNCI START INPUT AGAIN
RB BRM160 CHECK STATUS
EJECT
*
*
* SOH RECEIVED
*
BRM200 EQU *
LDK A7,0 CLEAR BCC
CF A5,READP READ A CHARACTER
RB(NZ) BRM160 PARITY ERROR
CWK A2,EOT A QUIESCENT FRAME ?
RB(Z) BRM150 YES HALT INPUT
*
*
* FIND DWT, VERIFY HEADER, CHECK POLL OR SELECT
*
ST A2,TERID STORE CURRENT ID
ANK A2,/1F MASK THE POLL AND SELECT BITS
CF A5,FINTER FIND DWT
LDR A3,A3 IS THERE A DWT ?
RB(Z) BRM160 NO
ST A3,CURDWT STORE CURRENT DWT
LD A3,TERID LOAD ID
LDK A2,/1F
ANS A2,TERID MASK THE POLL AND SELECT BITS
CF A5,VERHAD VERIFY HEADER FRAME
ANK A7,PAD MASK BCC
RB(NZ) BRM160 BCC ERROR
ANK A3,/20 A POLL OR A SELECT ?
RF(Z) SELECT A SELECT
EJECT
*
*
* POLL RECEIVED
*
IM WPOLL INDICATE POLL
CF A5,CPTIM RESTART POLLTIMER
RB BRM100 LOOK FOR TWO PADS
*
*
* SELECT RECEIVED
*
SELECT EQU *
CF A5,READP READ A CHARACTER
CWK A2,SYN A SYN CHARACTER ?
RB(E) SELECT SKIP IT
CWK A2,SOH AN SOH ?
RB(NE) BRM160 NO
LDK A7,0 RESET BCC-COUNTER
LD A6,CURDWT GET WORKING DWT
CF A5,READP IGNORE THE ADDRESS
RB(NZ) BRM160 PARITY ERROR
SUK A2,EOT A SELECT MESSAGE ONLY ?
RB(E) BRM150 YES HALT INPUT AND RESYNC.
EJECT
*
*
* A TEXT, AN ACK OR AN ACK WITH TEXT ?
*
CF A5,READP READ A CHARACTER
CWK A2,KNUL A TEXT ?
RF(E) SELTXT YES
CWK A2,ACK AN ACK ?
RB(NE) BRM160 NO THE SAME FOR NAK
*
*
* ACK OR ACK WITH TEXT
*
CF A5,READP READ A CHARACTER
RB(NZ) BRM160 PARITY ERROR
CWK A2,STX AN STX ?
RB(NE) BRM160 NO
CF A5,READP READ A CHARACTER
CWK A2,ETX AN ETX ?
RF(NE) SELACT NO AN ACK WITH TEXT
EJECT
*
*
* AN ACK
*
CF A5,READP GET BCC
ANK A7,PAD MASK BCC
RB(NZ) BRM160 BCC ERROR
LD A2,DWTREQ,A6 GET REQUEST VECTOR
RB(NN) BRM160 NO EXPECTED ACK
CM DWTREQ,A6 CLEAR THE REQUEST VECTOR
CM DWTTRY,A6 CLEAR THE RETRY-COUNTER
LD A2,DWTOR,A6 GET THE ORDER
SUK A2,/06 A WRITE ORDER ?
RB(NE) BRM160 NO
LDK A1,0 RETURN CODE
CF A15,TENDIO COMPLETE REQUEST
RB BRM160
*
*
* AN ACK WITH TEXT
*
SELACT EQU *
CM DWTREQ,A6 CLEAR REQUEST VECTOR
CM DWTTRY,A6 CLEAR THE RETRY-COUNTER
LD A2,DWTOR,A6 GET THE ORDER
SUK A2,/06 A WRITE ORDER ?
RF(NZ) SELT10 NO
LDK A1,0 RETURN CODE
CF A15,TENDIO COMPLETE REQUEST
RF SELT10
EJECT
*
*
* A TEXT
*
SELTXT EQU *
CF A5,READP DON`'T TAKE ANY NOTICE OF
RF(NZ) SELT90 THE NEXT TWO CHARACTERS
CF A5,READP FC1 AND FC2 EXEPT FOR
RF(NZ) SELT90 PARITY ERRORS
CF A5,READP READ A CHARACTER
SUK A2,STX AN STX ?
RF(NE) SELT90 NO
*
*
* GET BUFFER
*
SELT10 EQU *
LD A4,DCRBUF GET BUFFER CHAIN POINTER
RF(NZ) SELT20 YES
LDK A3,3 NO BUFFER AVAILABLE SEND BUSY
RF SELT60
*
*
* STORE THE TEXT
*
SELT20 EQU *
ADK A4,6 ADJUST BUFFER POINTER
LD A2,TERID TERMINAL ID FIRST IN BUFFER
LDK A3,0 INITIATE LENGTH ACCUMULATOR
RF SELT35 STORE ID
EJECT
*
*
* READ, CHECK AND STORE THE RECEIVED CHARACTERS
*
SELT30 EQU *
CF A5,READP READ A CHARACTER
RF(NZ) SELT50 PARITY ERROR
CWK A2,ETX END OF TEXT ?
RF(E) SELT40 YES READ BCC
CWK A2,/5A ILLEGAL CHARACTER ?
RB(G) SELT30 SKIP IT
CWK A2,/20 SPACE ?
RB(L) SELT30 SKIP IT
CWK A3,/10E BUFFER OVERFLOW ?
RF(G) SELT50 SEND NAK
SELT35 EQU *
LDR A1,A4 GET BUFFER
ADR A1,A3 GET BUFFER POINTER ADDRESS
SCR A2,A1 STORE THE CHARACTER
ADK A3,1 INCREMENT BUFFER-POINTER
RB SELT30 GET NEXT CHARACTER
EJECT
*
*
* READ AND CHECK BCC MOVE DATA TO USER BUFFER
*
SELT40 EQU *
CF A5,READP READ BCC
RF(NZ) SELT50 PARITY ERROR SEND NAK
ANK A7,PAD MASK BCC
RF(NZ) SELT50 BCC ERROR
ST A3,SVRDL SAVE READ LENGTH
CF A15,GRBUF GET A BUFFER
ADK A4,6 ADJUST BUFFER-POINTER
LD A2,DWTST,A6 GET STATUS
RF(N) SELT70 NEGATIVE ORDER
LDK A2,/02 LOAD READ ORDER
CW A2,DWTOR,A6 A READ ORDER ?
RF(NE) SELT70 NO
LD A8,DWTECB,A6 GET ECB ADDRESS
LD A3,SVRDL GET READ LENGTH
ST A3,ECBEL,A8 STORE EFFECTIVE LENGTH
LDK A3,1 AN ACK TO BE SENT
ST A3,DWTREQ,A6 RESTORE REQUEST VECTOR
CF A5,CTIME STOP TIMER
LDK A1,0 REST RETURN CODE
CF A15,DC:MIN MOVE DATA TO USER BUFFER
RF SELT90
EJECT
*
*
* NAK OR BUSY TO BE SENT
*
SELT50 EQU *
LDK A3,2 NAK TO BE SENT
SELT60 EQU *
ST A3,DWTREQ,A6 RESTORE THE REQUEST VECTOR
RF SELT90
*
*
* QUEUE BUFFER FOR DC-TASK
*
SELT70 EQU *
LD A3,SVRDL GET READ LENGTH
ST A3,-4,A4 STORE READ LENGTH
SUK A4,6 GET BUFFER BASE
CF A5,QRBUF QUEUE BUFFER FOR DC-TASK
SELT90 EQU *
ABL BRM160 HALT IMPUT
EJECT
*
*
* WHAT'S TO BE SENT ?
*
POLL EQU *
CM WPOLL CLEAR POLL INDICATION
LD A6,CURDWT GET CURRENT DWT
LD A3,DWTREQ,A6 GET THE REQUEST VECTOR
RF(Z) TRNOTC SEND NO TRAFFIC
LDR A4,A3
ANK A4,/07 ANY OF ACK, NAK OR BUSY ?
RF(Z) TRTEXT NO BUT IT COULD BE A TEXT
LDKL A2,ACKSP LOAD ACK+SPACE
SUK A4,1
RF(Z) TRTSTA YES SEND ACK
LDKL A2,NAKSP LOAD NAK+SPACE
SUK A4,1
RF(Z) TRTSTA YES SEND NAK
LDKL A2,BSYSP LOAD BUSY+SPACE
EJECT
*
*
* SEND ACK, NAK OR BUSY
*
TRTSTA EQU *
ST A2,HEADER STORE THE CODE
CF A5,TRHEAD SEND HEADER
CF A5,TRETX SEND ETX + BCC
LDKL A3,/FF00
ANS A3,DWTREQ,A6
RF TREOT SEND EOT AND HALT OUTPUT
*
*
* SEND TEXT OR NO TRAFFIC
*
TRTEXT EQU *
ANKL A3,/100 AN OUTSTANDING WRITE ?
RF(Z) TRNOTC NO SEND NO TRAFFIC
LD A2,DWTTRY,A6 GET THE RETRY-COUNTER
CWK A2,4 IS IT 4 ?
RF(NE) TRT100 NO SEND TEXT
CF A5,CTIME STOP REQUEST TIMING
CM DWTREQ,A6 CLEAR THE REQUEST VECTOR
CM DWTTRY,A6 CLEAR THE RETRY-COUNTER
LDK A1,/40 TIMEOUT ERROR
CF A15,TENDIO COMPLETE REQUEST
*
*
* SEND NO TRAFFIC
*
TRNOTC EQU *
CF A5,TRSYNC START TRANSMITTER
LDK A2,SOH LOAD AN SOH
CF A5,WRITE SEND IT
RF TREOT SEND EOT AND HALT OUTPUT
EJECT
*
*
* SEND TEXT
*
TRT100 EQU *
LDKL A2,NULSP LOAD NUL + SPACE
ST A2,HEADER STORE THE CODE
CF A5,TRHEAD SEND HEADER + STX
LD A2,DWTECB,A6 GET ECB
LD A3,ECBRL,A2 GET LENGTH
RF(Z) TRT900 NUL LENGTH ERROR
IFF MMUPAG=0
LDKL A4,MMUBUF MMU WORK BUFFER
ST A4,ECBBA,A2
CF A15,DC:MOT MOVE DATA FROM USER BUFFER
XIF
LD A4,ECBBA,A2 GET BUFFER ADDRESS
ADK A4,2 ADJUST BUFFER-POINTER
SUK A3,2 ADJUST LENGTH
TRT200 EQU *
LCR A2,A4 GET CHARACTER
ADK A4,1 INCREMENT POINTER
ANK A2,PAD MASK THE CHARACTER
CWK A2,/07 ILLEGAL CODE ?
RF(L) TRT300 YES SKIP IT
CF A5,WRITEP SEND THE CHARACTER
TRT300 EQU *
SUK A3,1 MORE TO SEND ?
RB(NZ) TRT200 YES
CF A5,TRETX YES SEND ETX AND BCC
LDKL A3,/8100 LOAD ACK IS EXPECTED
ST A3,DWTREQ,A6 STORRE IT
IM DWTTRY,A6 INCREMENT RETRY-COUNTER
RF TREOT SEND EOT AND HALT OUTPUT
EJECT
*
*
* REQUEST ERROR
*
TRT900 EQU *
CF A5,CTIME CLEAR TIMEOUT REQUEST IF ANY
CM DWTREQ,A6 CLEAR THE REQUEST VECTOR
LDKL A1,/8000 LOAD REQUEST ERROR
CF A15,TENDIO COMPLETE REQUSET
*
*
* SEND EOT AND HALT OUTPUT
*
TREOT EQU *
LDK A2,EOT LOAD EOT
CF A5,WRITE SEND IT
LDK A2,PAD LOAD PAD
CF A5,WRITE SEND IT
LDK A2,PAD LOAD PAD
CF A5,WRITE SEND IT
CF A5,CHALTO HALT OUTPUT
ABL BRM
EJECT
*
*
* SUBROUTINES THAT ARE USED
*
*
* VERHAD * VERIFY HEADER FRAME IN POLL OR SELECT
*
VERHAD EQU *
CF A5,READP READ A CHARACTER
XRK A2,KNUL THE NUL CHARACTER ?
RF(NZ) VERH10 NO
CF A5,READP READ A CHARACTER
XRK A2,STX THE STX CHARACTER ?
RF(NZ) VERH10 NO
CF A5,READP READ A CHARACTER
XRK A2,ETX THE ETX CHARACTER ?
RF(NZ) VERH10 NO
CF A5,READP READ BCC
VERH10 EQU *
RTN A5
EJECT
*
*
* TRHEAD * START OUTPUT AND TRANSMIT HEADER
*
TRHEAD EQU *
CF A5,TRSYNC START OUTPUT
LDK A2,SOH LOAD THE SOH
CF A5,WRITE SEND IT
LDK A7,0 RESET BCC COUNTER
LDK A2,/60 LOAD ADRT
CF A5,WRITEP SEND IT
LDK A2,0 RESET A2
LC A2,HEADER LOAD THE CODE
CF A5,WRITEP SEND IT
LDK A2,0 RESET A2
LC A2,HEADER+1 LOAD FC1
CF A5,WRITEP SEND IT
LDK A2,SP LOAD SPACE
CF A5,WRITEP SEND IT
LDK A2,STX LOAD THE STX
CF A5,WRITEP SEND IT
RTN A5 RETURN
EJECT
*
*
* TRSYNC * START TRANSMITTER AND SEN 4 SYNS
*
TRSYNC EQU *
CF A5,CSYNCO START TRANSMITTER
CF A5,READ WAIT FOR INTERRUPT
LDK A3,4
TRS100 EQU *
LDK A2,SYN LOAD A SYN
CF A5,WRITE SEND IT
SUK A3,1
RB(NZ) TRS100
RTN A5 RETURN
*
*
* TRETX * SEND ETX AND BCC
*
TRETX EQU *
LDK A2,ETX LOAD THE ETX
CF A5,WRITEP SEND IT
LDR A2,A7 LOAD THE BCC
CF A5,WRITEP SEND IT
RTN A5 RETURN
EJECT
*
*
* CSYNCI * STOP INPUT SEND SYN-PATTERN FOR INPUT
*
CSYNCI EQU *
LD A2,PFPOST
RF(NZ) CSYN:I WAIT FOR POWER UP
CF A5,CHALTI HALT INPUT
ST A5,DCLCI SET INPUT ACRIVE FLAG
IFT P6805=1 SALCUZ
LDK A2,CBPARI LOAD PARITY CHECK FOR LC
CIO A2,1,CHLCIN START RECEIVER
LDK A2,SYN LOAD SYN
OTR A2,1,CHLCIN SEND SYN-PATTERN
XIF
IFT P6805=0
LDKL A2,CBCARR LOAD SYN-PATTERN
CIO A2,1,CHLCIN START RECEIVER WITH SYN-PATTERN
XIF
CSYN:I EQU *
RTN A5 RETURN
*
*
* CHALTI * HALT INPUT
*
CHALTI EQU *
IFT P6805=1 SALCUZ
LDK A2,CBSTOP LOAD STOP FUNCTION BIT
XIF
CIO A2,0,CHLCIN HALT RECEIVER
CM DCLCI CLEAR INPUT ACTIVE FLAG
SST A2,CHLCIN READ STATUS
IFF LOGG=0
CF A5,LOGSST LOG INPUT STATUS
XIF
RTN A5 RETURN
EJECT
*
*
* CSYNCO * START TRANSMITTER
*
CSYNCO EQU *
LD A2,PFPOST
RF(NZ) CSYN:O WAIT FOR POWER UP
IFT P6805=1 SALCUZ
LDK A2,CBPARI LOAD PARITY CHECK FOR CU
XIF
CIO A2,1,CHLCUT START TRANSMITTER
IFT P6805=1 SALCUZ
RF(A) CSYNC1 ACCEPTED
SST A2,CHLCUT READ STATUS
ABL BRM NOT ACCEPTED TIMEOUT
CSYNC1 EQU *
LDK A2,SYN LOAD SYN-PATTERN
OTR A2,1,CHLCUT SEND IT
XIF
CSYN:O EQU *
RTN A5 RETURN
*
*
* CHALTO * HALT OUTPUT
*
CHALTO EQU *
IFT P6805=1 SALCUZ
LDK A2,CBSTOP LOAD STOP FUNCTION
XIF
CIO A2,0,CHLCUT HALT RECEIVER
IFT P6805=1 SALCUZ
CF A5,READ WAIT FOR INTERRUPT
XIF
SST A2,CHLCUT READ STATUS
RTN A5 RETURN
EJECT
*
*
* RECEIVER INTERRUPT
*
*
IH1301 CF A15,SAVE8 SAVE A1 - A8
CF A15,LDREG RESTORE DC REGS A3 - A8
INR A2,0,CHLCIN READ CHAR
RF(NA) IHIN20 NOT ACCEPTED,CHECK STATUS
IFF LOGG=0
CF A5,LOGIN LOG RECEIVED CHARACTER
XIF
LDR A1,A2
ORKL A1,/FF00 SET FLAG FOR CARRIER ON
ST A1,DCLCI STORE INPUT ACTIVE FLAG
CM DCSTCU CLEAR SST SAVE
IHIN10 RTN A5
IHIN20 CF A5,SST PERFORM SST
ABL BRM
*
*
* TRANSMITTER INTERRUPT
*
*
IH1302 CF A15,SAVE8 SAVE A1 - A8
CF A15,LDREG RESTORE DC REGS A3 - A8
RB IHIN10
EJECT
*
*
* SST * ANALYZE STATUS FROM LCU
*
SST EQU *
SST A2,CHLCIN READ STATUS
LDR A1,A2
IFT LOGG=1
CF A5,LOGSST LOG SST INFORMATION
XIF
ANK A2,SBERR ANY ERROR BIT SET ?
RF(NZ) SST050 YES THERE IS
IFT P6805=1 SALCUZ
RF SST225
XIF
IFT P6805=0
LD A2,DCLCI LOAD INPUT STATUS
RF(N) SST225 INPUT ACTIVE WITH DATA
RF(Z) SST125 INPUT NOT ACTIVE
LDKL A2,CBCARR LOAD SYN-PATTERN
CIO A2,1,CHLCIN START INPUT AGAIN
RF SST125 TO DISPATCHER
XIF
EJECT
SST050 EQU *
ANK A2,SBCARR CARRIER OFF ?
RF(Z) SST075 NO
LD A2,DCLCI LOAD INPUT STATUS
RF(Z) SST125 NOT ACTIVE IGNORE CARRIER OFF
RF SST100
SST075 EQU *
LDR A2,A1
ANK A2,SBTHRU THROUGHPUT ERROR ?
ABL(NZ) BRM170 YES
SST100 EQU *
LDR A2,A1
ANK A2,SBNOOP NOT OPERABLE
RF(Z) SST200 NO
CF A15,STREG SAVE REGISTERS
CF A15,SETIME DELAY 1SEC
DATA SST150,10
SST125 EQU *
ABL TDISP TO DISPATCHER
SST150 EQU *
CF A15,LDREG LOAD REGISTER
SST200 EQU *
LDR A2,A1
ANK A2,SBCARR CARRIER OFF ?
RF(Z) SST225 NO
XRK A1,SBCARR CARRIER OFF
RF(Z) SST250 YES
SST225 EQU *
ST A1,DCSTCU STORE CURRENT STATUS
CF A15,CKMESS STATUS CHANGE ?
SST250 EQU *
RTN A5 RETURN
EJECT
*
*
* WRITEP * CALCULATE PARITY FOR A2
*
WRITEP EQU *
ECR A1,A2
ORK A2,/80
WRIT10 EQU *
SLL A1,1
RB(P) WRIT10
RF(Z) WRIT20
XRK A2,/80
RB WRIT10
WRIT20 EQU *
XRR A7,A2 ACCUMULATE BCC
*
*
* WRITE * WRITE A2
*
WRITE EQU *
OTR A2,0,CHLCUT SEND THE CHARACTER IN A2
RF(NA) READ NOT ACCEPTED
IFF LOGG=0
CF A5,LOGOUT LOG OUTPUT CHARACTER
XIF
*
*
* READ * WAIT FOR INTERRUPT
*
READ EQU *
CF A15,STREG SAVE THE REGISTERS
ABL TDISP TO DISPATCHER
EJECT
*
*
*
*** READP
*
* READ CHARACTER TO A2 AND CHECK PARITY
*
*
READP CF A5,READ
CWK A2,SYN
RB(E) READP SKIP SYN-CHARACTERS
IFT P6805=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 P6805=1 SALCUZ
LDK A1,/80
XIF
ADKL A5,4
ANK A1,/80
XRR A7,A2 ACCUMULATE BCC
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 *
LD A4,DCTAB
AD* A4,DCTAB ADDRESS TO END OF DCTAB
FINT10 SUK A4,2
LDK A3,0 DEFAULT VALUE
CWK A4,DCTAB END OF DC:TAB
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
*
*
DC13ON CF A15,SAVE8 SAVE A1 - A8
LDKL A5,STB INIT STACK
CF A5,CLREQ CLEAR REQUEST PENDING
CM DCLCI CLEAR INPUT ACTIVE FLAG
DRDC20 ABL BRM
*
*
******* CLREQ : CLEAR PENDING REQUEST AT
* POWER ON,BY KILLING REQ. VECTOR
*
CLREQ EQU *
LD A4,DCTAB
AD* A4,DCTAB END OF TABLE
CLRQ10 SUK A4,2 MAKE POINTER FOR DWTAD
CWK A4,DCTAB
RF(E) CLRQ20 YES
LDR* A6,A4
LD A2,DWTST,A6
RB(N) CLRQ10
CM DWTREQ,A6
CF A5,CTIME
LDKL A1,/2040
CF A15,TENDIO
RB CLRQ10
LD A2,DCTPGP
RF(NZ) CLRQ20
CF A15,SPOTIM START POLL TIMER
CLRQ20 RTN A5
EJECT
**********
*
* RESART POLL TIMER WHEN POLL HAS BEEN RECEIVED
*
**********
*
CPTIM EQU *
LD A1,DCONOF POLL TIME OUT ?
ANK A1,/40
RF(Z) CPTIM1 NO
AN A1,DCSTOL OLD STATUS POLL TIMEOUT ?
RF(Z) CPTIM2 NO
CPTIM1 EQU *
CM DCONOF INDICATE POLL
CPTIM2 EQU *
LDKL A2,-TIMPOL
ST* A2,DCTPGP RESTART TIMER
CF A15,CKMESS CHECK IF STATUS CHANGE
RTN A5
*
**********
*
* START POLL TIMER
*
**********
*
SPOTIM CF A15,SETTIM START TIMER
DATA PTOUT,TIMPOL
ST A4,DCTPGP STORE TIMER POINTER
ADKL A15,4
ABR* A15
EJECT
*
**********
*
* POLL TIMEOUT
*
**********
*
PTOUT LDKL A5,STB LOAD AS STACK BASE
LDK A2,/40
ST A2,DCONOF INDICATE POLL TIMEOUT
CF A15,CKMESS CHECK IF STATUS CHANGE
CF A15,SPOTIM START POLL TIMER
ABL TDISP
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 300
LOGEND EQU *-4
SAVE2 DATA 0
SAVE3 DATA 0
XIF
*
*
*
********************
*
* DC BUFFER POOL
*
********************
*
RLINK EQU RBUFL+RBUFL+8
*
DCRBUF EQU *
DATA *+2 FREE BUFFER ANCHOR
IFF RBUFNR=2
DATA *+RLINK
RES RBUFL+3
IFF RBUFNR=3
DATA *+RLINK
RES RBUFL+3
XIF
DATA *+RLINK
RES RBUFL+3
DATA 0 END OF CHAIN
RES RBUFL+3
IFF MMUPAG=0
*
MMUBUF RES TBUFL+1 MMU WORK AREA
XIF
EJECT
*
**********
*
* DEVICE WORK TASK
* FOR DC-TASK
*
**********
*
DW1300 EQU * TABLE ENTRY
DATA 0 CU LINE ADDRESS
DATA /8000 STATUS
DATA 0 ECB ADDRESS
DATA 0 ORDER
DATA DC13DC POINTER TO ADDRESS BLOCK
DATA 0 TTAB ADDRESS
DATA 0 WAIT/ACTIVATE INDICATOR
DATA 0 TASK QUEUE
IFT MMUPAG=1
DATA 0 USER ECB ADDRESS
DATA DC:ECB MMU ECB ADDRESS
XIF
DATA 0 TIMER POINTER
DATA 0 WRITE QUEUE
DATA 0 STATUS QUEUE(NOT USED BY DCTASK)
DATA 0 RECEIVE MESSAGE QUEUE
DATA 0 REQUEST TIMEOUT VALUE
DATA 0 REQUEST VECTOR
DATA 0 RETRY COUNTER
IFT MMUPAG=1
DC:ECB EQU * MMU ECB
DATA 0,0,0,0,0,0
XIF
EJECT
*
*
DC:IN DATA DC:TAB+2
*
DCTAB DATA DC:TAB
*
DC:TAB DATA 2 LENGTH OF DC:TAB
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
*
DC:END EQU *
*
*
END