|
|
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: 36434 (0x8e52)
Notes: pts_type(SC)
Names: »DRDC13.SC«
└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
└─⟦this⟧ »TOSSWORK/DRDC13.SC«
IDENT DRDC13 REL 10.0 80-03-14 870105041000
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 34
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
*
*
****** 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
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
*
*
* 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
EJECT
*
*
DCRTN EQU *
ABL TDISP GO TO DISPATCHER
*
*
* 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
EJECT
DCTP10 EQU *
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
*
*
*
* 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
*
********************
*
* 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
EJECT
********************
*
* 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 A1,DWTTP,A6 TIMER POINTER
RF(Z) AB:10 NO TIMER RUNNING
CM* DWTTP,A6 KILL TIMER
CM DWTTP,A6
AB:10 LD A1,DWTOR,A6 ORDER CODE
SUK A1,2
RF(Z) AB:RTN READ REQUEST. NO ACTION
SUK A1,4
RF(NZ) AB:RTN NO ACTION IF NOT READ/WRITE
AB:RTN EQU *
IFT CPU852=1
RB GBUF10 RETURN IN INHIBIT MODE
XIF
IFF CPU852=1
RTN A15
XIF
EJECT
*
*
* STORE REGISTER A3-A8
* CALLING SEQUENSE: CF A15,STREG
*
* RESTORE
* CALLING SEQUENCE: CF A15,LDREG
*
*
STREG ST A3,LCA3
ST A4,LCA4
ST A5,LCA5
ST A6,LCA6
ST A7,LCA7
ST A8,LCA8
RF RTNA15 RETURN
EJECT
LDREG LDKL A3,0
LCA3 EQU *-2
LDKL A4,0
LCA4 EQU *-2
LDKL A5,0
LCA5 EQU *-2
LDKL A6,0
LCA6 EQU *-2
LDKL A7,0
LCA7 EQU *-2
LDKL A8,0
LCA8 EQU *-2
RTNA15 EQU *
ADKL A15,4
ABR* A15
EJECT
*
*
* RECEIVE A FRAME AND DECODE IT
*
*
BRM LDKL A5,STB LOAD STACK BASE FOR A5
LD A2,PFPOST
RF(NZ) BRM100 WAIT FOR POWER UP
LDKL A2,/100+SYN SPECIFY SYN PATTERN
CIO A2,1,CHLCIN START RECEIVER
BRM100 CF A5,READ READ CHARACTER
SUK A2,SOH
RF(E) BRM200 SOH
SUK A2,/FF-SOH
RB(NE) BRM100 NOT /FF
CF A5,READ READ CHARACTER
CWK A2,/FF
RB(NE) BRM100 NOT ANOTHER /FF
ABL BRM920 HALT INPUT AND RESYNCHRONIZE
*
* SOH RECEIVED
*
BRM200 LDK A7,0 CLEAR BCC
CF A5,READP READ RID=TC
ABL(NZ) BRM100 PARITY ERROR
CWK A2,EOT -EOT-?
*************
*
* OLD CODE FOR THIS INSTRUCTION
* ABL(Z) BRM900 YES
*
*************
ABL(Z) BRM920 YES
ST A2,TERID STORE CURRENT ID
ANK A2,/1F
CF A5,FINTER FIND DWT
LDR A3,A3 OK?
RB(Z) BRM100 NO
BRM210 EQU *
ST A3,CURDWT STORE CURRENT DWT
LD A3,TERID
LDK A2,/1F
ANS A2,TERID SCRATCH POLL/SELECT BITS
ANK A3,/20
RF(Z) SELTRM SELECT ADDRESS
ABL SCANQ1 POLL ADDRESS
*
**
**** SELTRM : SCAN SELECTING FRAME
* HOLD TEXT, ACK , NAK
*
*
SELTRM EQU *
CF A5,VERHAD VERIFY SELECT FRAME
ANK A7,/7F BCC OK ?
ABL(NZ) BRM100 NO
SELT00 CF A5,READP
CWK A2,SYN
RB(E) SELT00
CWK A2,SOH
ABL(NE) BRM100
LDK A7,0 RESET BCC COUNTER
LD A6,CURDWT GET WORKING DWT
CF A5,READP IGNORE ADRT
ABL(NZ) BRM100
*************
*
* THIS IS TO TEST IF A FRAME IS CONSTITUTED
* OF A SELECT MESSAGE ONLY
*
*************
CWK A2,EOT
ABL(E) BRM920 IF YES RESYNCHRONISE
CF A5,READP CHECK CODE FRAME
CWK A2,KNUL
RF(E) SELTXT TEXT
CWK A2,ACK
RF(E) SELACK ACK
CWK A2,NAK
ABL(E) SELNAK NAK
ABL BRM100
SELTXT EQU *
CF A5,READP FC1
ABL(NZ) BRM100
CF A5,READP FC2
ABL(NZ) BRM100
CF A5,READP
CWK A2,STX STX
ABL(NE) BRM100
**********
*
* CHECK IF BUFFER AVAILABLE
*
**********
*
LD A4,DCRBUF GET BUFFER CHAIN POINTER
RF(Z) SELT03 SEND BUSY AND RESYNCHRONISE
ADK A4,6 ADJUST BUFFER POINTER
RF SELT20 OTHERWISE READ MESSAGE
SELT03 EQU *
LD A6,CURDWT
LDK A2,3 BUSY TO SEND
ST A2,DWTREQ,A6
ABL BRM100
SELT20 EQU *
LDK A3,1
LD A2,TERID GET TERMINAL ID
LDR A1,A4
SCR A2,A1 STORE IT AS FIRST CHARACTER
SELT04 EQU *
CF A5,READP GET CHARACTER
RF(NZ) SELT06
CWK A2,ETX END OF TEXT ?
RF(E) SELT10 YES
SELT05 EQU *
CWK A2,/5A
RB(G) SELT04 GREATER THAN 5A:IGNORE
CWK A2,/20
RB(L) SELT04 LESS THAN 20:IGNORE
CWK A3,/10E
RF(G) SELT06 FUFFER OVERFLOW
LDR A1,A4
ADR A1,A3 COMPUTE BUFFER ADDRESS
SCR A2,A1 STORE CHARACTER
ADK A3,1 ADEJUSTE POINETEURE
RB SELT04
** SUCH A PROGRESS !!!
SELT10 EQU *
CF A5,READP READ BCC
RF(NZ) SELT06
ANK A7,/7F
RF(NZ) SELT06
ST A3,SVRDL SAVE READ LENGTH
CF A15,GRBUF GET A BUFFER
ADK A4,6 ADJUST BUFFER PONTER
LD A2,DWTST,A6 GET STATUS
RF(N) SELT40 GO IF WRONG ORDER
LDK A2,/2
CW A2,DWTOR,A6 READ ORDER ?
RF(NE) SELT40 NO READ ORDER
LD A8,DWTECB,A6 GET ECB ADDRESS
LD A3,SVRDL GET READ LENGTH
ST A3,ECBEL,A8 STORE EFFECTIVE LENGTH
LDK A3,1 ACK TO BE SENT
ST A3,DWTREQ,A6 RESTORE REQUEST VECTOR
CF A5,CTIME STOP TIMER
LDK A1,0 RESET RETURN CODE
CF A15,DC:MIN MOVE DATA TO USER BUFFER
ABL BRM100
SELT06 EQU *
LDK A3,2 NAK TO BE SENT
ST A3,DWTREQ,A6 STORE IT
ABL BRM100
EJECT
SELACK EQU *
CF A5,READP FC1 OR STX
ABL(NZ) BRM100
CWK A2,STX STX ?
ABL(NE) BRM100
CF A5,READP GET ETX
CWK A2,ETX ETX ?
ABL(NE) SELAC1 NO
CF A5,READP GET BCC
ANK A7,/7F BCC OK ?
ABL(NZ) BRM100 NO
LD A2,DWTREQ,A6 GET REQUEST VECTOR
ABL(NN) BRM100 NO EXPECTED ACK
CM DWTREQ,A6
CM DWTTRY,A6
LD A2,DWTOR,A6 GET ORDER
CWK A2,/06 WRITE ?
ABL(NE) BRM100 NO
LDK A1,0 R.C. OK
CF A15,TENDIO COMPLETE REQUEST
ABL BRM100
SELAC1 EQU *
CM DWTREQ,A6
CM DWTTRY,A6
LD A2,DWTOR,A6
CWK A2,6
ABL(NE) SELT:2
LDK A1,0
CF A15,TENDIO
*****************
*
* ADDITION TO A CASE WHICH
* MAY NEVER OCCUR
*
*****************
SELT:2 LD A4,DCRBUF GET BUFFER CHAIN POINTER
ABL(Z) SELT03 NO BUFFER AVAILABLE,SEND BUSY
ADK A4,6 ADJUST BUFFER POINTER
LD A3,TERID GET TERMINAL ID
LDR A1,A4 GET BUFFER ADDRESS
SCR A3,A1 STORE TERMINAL ID
LDK A3,1 INITIATE LENGTH ACCUMULATOR
ABL SELT05 WHEN UNEXPECTED ACK WITH TEXT
*
**********
*
* QUEUE BUFFER IN ALL CASES EXCEPT FOR READ REQUEST
*
**********
*
SELT40 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 DCTASK
ABL BRM100
EJECT
SELNAK EQU *
ABL BRM100
EJECT
BRM900 EQU *
**********
*
* THIS CODE IS NOT NEEDED AND THEREFORE
* IT IS REMOVED
**
*
* BRM900 EQU *
* CF A5,READ
* CWK A2,/FF
* ABL(E) BRM900
* BRM910 CF A5,READ
* CWK A2,/FF
* ABL(NE) BRM100 NOT SECOND FF
*
***********
BRM920 CF A5,HALTIN
LD A2,WPOLL
ABL(Z) BRM THAT NOT MY POLL !!!!
ABL SCPOLL
EJECT
SCANQ1 EQU *
CF A5,VERHAD VERIFY HEADER
ANK A7,/7F
ABL(NZ) BRM100 BAD BCC
IM WPOLL
CF A5,CPTIM
ABL BRM100
SCANQ EQU *
ABL TREOT
SCPOLL EQU *
CM WPOLL
LD A6,CURDWT GET CURRENT DWT
SCPOL1 LD A3,DWTREQ,A6 GET REQUEST VECTOR
ABL(Z) TRQF10
SCPOL3 EQU *
LDR A4,A3
ANK A4,/07 ACK-NAK-BSY ?
RF(Z) SCTXT
SUK A4,1
RF(Z) SCACK =1, ACK
SUK A4,1
RF(Z) SCNAK =2, NAK
RF SCBSY =3, BUSY
SCTXT EQU *
ANKL A3,/100
ABL(Z) TRQF10
ABL TRTEXT TRANSMIT TEXT
SCACK EQU *
CF A5,TRACK
ABL SCANQ
SCNAK CF A5,TRNAK
ABL SCANQ
SCBSY CF A5,TRBSY
RB SCANQ
*
*
**** VERHAD : VERIFY HEADER FRAME POLL-SELECT
*
*
VERHAD EQU *
CF A5,READP GET CODE
XRK A2,KNUL
RF(NZ) VERH10
VERH1 CF A5,READP
XRK A2,STX GET STX
RF(NZ) VERH10
CF A5,READP
XRK A2,ETX ETX
RF(NZ) VERH10
CF A5,READP
VERH10 RTN A5
EJECT
*
*
* TRANSMIT PROCEDURE RESPONSES
*
*
EJECT
*
*
* TRANSMIT SYNC SEQUENCE
*
*
TRSYNC EQU *
LD A2,PFPOST
RF(NZ) TRS050 WAIT FOR POWER UP
CIO A2,1,CHLCUT START TRANSMITTER
TRS050 EQU *
CF A5,READ WAIT FOR OUTPUT INTERRUPT
LDK A3,4 4 SYNS
TRS100 LDK A2,SYN
CF A5,WRITE SEND SYN
SUK A3,1
RB(NZ) TRS100
RTN A5
****** TRHEAD : TRANSMIT HEADER
* CODE=HEADER, F1=HEADER+1
*
TRHEAD EQU *
CF A5,TRSYNC SEND 4 SYN
LDK A2,SOH SEND -SOH-
CF A5,WRITE
LDK A7,0 RESET BCC COUNTER
LDK A2,/60
CF A5,WRITEP SEND -ADRT-
LDK A2,0
LC A2,HEADER SEND CODE
CF A5,WRITEP
LDK A2,0
LC A2,HEADER+1 SEND FC1
CF A5,WRITEP SEND F1
LDK A2,SP
CF A5,WRITEP SEND SPACE
LDK A2,STX
CF A5,WRITEP SEND STX
RTN A5 RETURN TO CALL
*
*
****** TRACK : TRANSMIT ACK-SP-SP FRAME
*
*
TRACK EQU *
LDKL A2,/0620 ACK-SP.
TRACK1 ST A2,HEADER
CF A5,TRHEAD SEND HEADER
CF A5,TRETX SEND ETX
LDKL A3,/FF00
ANS A3,DWTREQ,A6
RTN A5 RETURN
*
*
****** TRNAK : TRANSMIT NAK-SP-SP FRAME
*
*
TRNAK EQU *
LDKL A2,/1520 NAK-SP
RB TRACK1
*
****** TRETX : TRANSMIT ETX/BCC
*
*
TRETX EQU *
LDK A2,ETX -SEND ETX-
CF A5,WRITEP
LDR A2,A7
CF A5,WRITEP -SEND BCC
RTN A5
*
*
****** TREOT : TRANSMIT END-OF-FRAME AND
* STOP TRANSMIT PROCESS
*
TREOT EQU *
LDK A2,EOT -EOT-
CF A5,WRITE
LDK A2,/7F -PAD-
CF A5,WRITE
LDK A2,/7F -PAD-
CF A5,WRITE -PAD-
CIO A2,0,CHLCUT STOP PROCESS
SST A2,CHLCUT SST
ABL BRM
*
*
****** TRTEXT : TRANSMIT TEXT
*
*
TRTEXT EQU *
LD A2,DWTTRY,A6
CWK A2,4
RF(NE) TRT080
CF A5,CTIME
CM DWTREQ,A6
CM DWTTRY,A6
LDK A1,/40
CF A15,TENDIO
ABL TRQF10
TRT080 EQU *
LDKL A2,/8020 NUL-SP
ST A2,HEADER
CF A5,TRHEAD SEND HEADER
LD A2,DWTECB,A6
LD A3,ECBRL,A2
ABL(Z) TRERR 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
ADK A4,2 ADJUST BUFFER POINTER
SUK A3,2 ADJUST LENGTH
TRT100 LCR A2,A4 GET CHARACTER
ADK A4,1 INCREMENT POINTER
ANK A2,/7F
CWK A2,/07 ILLEGAL CODE ?
RF(L) TRT120 YES- SKIP IT
CF A5,WRITEP
TRT120 EQU *
SUK A3,1 MORE TO SEND ?
RB(NZ) TRT100
CF A5,TRETX NO- SEND ETX/BCC
TRT130 EQU *
LD A6,CURDWT GET NORKING DWT
LDKL A3,/8100
IM DWTTRY,A6
ST A3,DWTREQ,A6 STORE IT
ABL SCANQ
TRERR CF A5,CTIME CLEAR T.O. REQUEST IF ANY
CM DWTREQ,A6 CLEAR REQUEST
LDKL A1,/8000 REQUEST ERROR
CF A15,TENDIO COMPLETE REQUEST
ABL SCANQ
EJECT
TRBSY EQU *
LDKL A2,/6F20 BUSY-SPACE
ABL TRACK1
TRQF EQU *
TRQF10 CF A5,TRSYNC
LDK A2,SOH
CF A5,WRITE
* SEND SOH
RB TREOT
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
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 INSTRUCTION AND STATUS CHECK
*
* CHLC STATUS : BIT 10=CARRIER OFF
* BIT 14=THROUGHPUT ERROR
* BIT 15=MODEM NOT READY
*
SST SST A1,CHLCIN
LDR A2,A1
IFF LOGG=0
CF A5,LOGSST LOG SST INFORMATION
XIF
ANK A2,2 TEST IF MODEM NOT READY/THROUGHPUT ERROR
RF(NZ) SST100 NO PROBLEM
ORS A2,DCSTCU FLAG ERROR
CF A15,CKMESS
SST100 RTN A5
*
*
* HALT INPUT
*
*
HALTIN CIO A1,0,CHLCIN
RB SST PERFORM SST INSTRUCTION AND STATUS CHECK
EJECT
*
*
* WRITE FROM OR READ ONE CHARACTER TO A2
*
*
WRITE EQU *
OTR A2,0,CHLCUT SEND CHARACTER
RF(A) WRIT10
RF READ
WRIT10 EQU *
IFF LOGG=0
CF A5,LOGOUT LOG OUTPUT CHARACTER
XIF
*
READ CF A15,STREG
ABL TDISP
EJECT
*
*
*** WRITEP
*
* WRITE A2 WITH PARITY
*
*
WRITEP ECR A1,A2
ORK A2,/80
WRI100 SLL A1,1
RB(P) WRI100
RF(Z) WRI101
XRK A2,/80
RB WRI100
WRI101 EQU *
XRR A7,A2
RB WRITE
*
*
*
*** READP
*
* READ CHARACTER TO A2 AND CHECK PARITY
*
*
READP CF A5,READ
CWK A2,SYN
RB(E) READP
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
ADKL A5,4
ANK A1,/80
XRR A7,A2
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
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 CM DCONOF INDICATING POLLING
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
*
**********
*
* 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