|
|
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: 154962 (0x25d52)
Notes: pts_type(SC)
Names: »DRPL01.SC«
└─⟦7a1dcd5a9⟧ Bits:30009673 Philips computer tape "600134"
└─⟦this⟧ »PTMON/DRPL01.SC«
IDENT DRPL01 REL 11.1 83-10-20 870105041110 DK2,WAITING LEV. 3 ACK (PE-AB) DK1, PE-AB CHGE, LINE 3207 =17,BLOCKING IMPROVED REL 11.1 82-08-13 =16,CHANGED BLOCKING OF OUTPUT REL 11.1 82-07-08 =15,COMPARE ADDR. CORR. REL 11.1 82-02-12 =14,SET CR CORR. REL 11.0 81-10-20 =13,ADAPTED FOR PTS8000 REL 11.0 81-10-14 =12,DIAGNOSTIC FOR RWSI REL 11.0 81-08-27 =11,CH. OF PARAMETERS REL 11.0 81-08-10 =10,CORR. OF RWSI REL 11.0 81-08-10 =9,CORR. OF INTERRUPT ENTRY REL 11.0 81-06-24 =8,OPEN LINE PARAM. CHANGED REL 11.0 81-06-23 =7,CORR. OF CWT-DISPL. REL 11.0 81-06-11 =6,LENGTH OF LONG BUFFERS CHANGED REL 11.0 81-05-27 =5,CORR. OF RWSI-CWT:S , OPEN LINE PROC. & COND. ASS. REL 11.0 81-05-22 =4,CORR. OF CWT-DISPL. REL 11.0 81-05-20 =3,CORR. OF TIMER NAME REL 11.0 81-04-29 =2,CORR. OF OPEN LINE PROCEDURE REL 11.0 81-04-21 GENERAL UPDATE FOR RWSI REL 11.0 81-01-26 =1,OPEN LINE PARAM. AREA EXPANDED PRR 11.0 80-11-19 EJECT * * * * ************************************************************ * * PHILIPS TERMINAL SYSTEM PTS * * DRPL01 = DRIVER PROCESSOR FOR LINE CONTROL, * LOCAL & REMOTE CONNECTIONS * * * ************************************************************ * * * THIS PROGRAM HANDLES I/O OPERATIONS ON THE * PROCESSOR FOR LINE CONTROL (PLC). IT IS * CALLED FROM THE TERMINAL DEVICE DRIVERS. * * INPUT AND OUTPUT OF CHARACTERS FROM/TO THE * TERMINAL DEVICE DRIVERS ARE MADE ON CHARACTER * BASIS. BLOCKING AND DEBLOCKING OF CHARACTERS * IN DATA PACKETS ARE HANDLED BY THIS DRIVER. * EJECT * * THE PROGRAM IS DIVIDED INTO A NUMBER OF SECTIONS. * SECTIONS CONTAINING PROGRAM CODE ARE DIVIDED * INTO ROUTINES. THE ROUTINES ARE LISTED AT * BEGINNING OF EACH SECTION. THE SECTIONS, IN * ORDER OF APPEARANCE IN LIST, ARE: * * NAME FUNCTION * * ENTRIES DECLARE ENTRY POINTS * EXTERNALS DECLARE EXTERNAL REFERENCES * CONDITION SET CONDITIONAL ASSEMBLY PARAMETERS * CONSTANTS SET CONSTANT VALUES * DATA DATA AREAS * * REQUEST DEVICE DRIVER REQUEST ROUTINES * INTERRUPT INTERRUPT ENTRIES * RECOVERY SYSTEM START, POWER FAIL AND RECOVERY * DISPATCH LOCAL PLC DISPATCHER * ROUTINE COMMON SERVICE ROUTINES * SUBROUTIN COMMON SERVICE SUBROUTINES * TBUFF BUFFER HANDLING SUBROUTINES * EJECT * *********** * ENTRIES * *********** * * I/O REQUESTS * ENTRY PLCHRI CHARACTER INPUT ENTRY PLSTBL DEFINE START OF OUTPUT BLOCK ENTRY PLCHRO CHARACTER OUTPUT ENTRY PLENBL DEFINE END OF OUTPUT BLOCK ENTRY PLDISP LOCAL DISPATCHER ENTRY PRCHRI CHR INP REMOTE ENTRY PRSTBL START OUTP BLOCK, REMOTE ENTRY PRCHRO CHR OUTP. REMOTE ENTRY PRENBL END OUTP BLOCK, REMOTE ENTRY PRDISP LOCAL DSIP. REMOTE ENTRY PLTEST TEST COMMANDS ENTRY CWTPLC CWT TABLE ENTRY GETDWT GET DWT SUBROUTINE ENTRY PLCLOG LOGG POINTER =11 ENTRY TIMACT INACTIVITY TIMER =11 ENTRY POLRTL POLL FREQ. & NO OF RETRANSM =11 ENTRY POLRTR POLL FR. & NO OF RETR. =11 EJECT * * * INTERRUPTS * ENTRY IHPL01 PLC NUMBER 1 ENTRY IHPL02 PLC NUMBER 2 ENTRY IHPL03 PLC NUMBER 3 ENTRY IHPL04 PLC NUMBER 4 * ENTRY IHPR01 PLC NUMBER 5,REMOTE ENTRY IHPR02 6,REMOTE ENTRY IHPR03 7,REMOTE ENTRY IHPR04 8,REMOTE * * RECOVERY AT TC POWER UP * ENTRY PLON RECOVER ALL DEFINED PLC:S * EJECT * ************* * EXTERNALS * ************* * * TOSS MONITOR * * ROUTINES EXTRN TDISP TOSS DISPATCHER EXTRN QMJOB QUEUE MONITOR JOB EXTRN MEXIT EXIT FROM MONITOR JOB EXTRN GETBLK GET MONITOR BLOCK EXTRN FREBLK RETURN MONITOR BLOCK EXTRN SAVE8 PUSH A1-A8 ON A15 STACK EXTRN SETIME SET TIMER * DATA WORDS EXTRN PFPOST POWER FAIL FLAG EXTRN INTSAV LATEST INTERRUPT SAVE AREA * * * DRND01 SERVICE ROUTINES * EXTRN NDSAV8 SAVE A3-A5, A7-A8 IN DWT EXTRN NDGET8 GET A3-A5, A7-A8 FROM DWT EXTRN NDREWS CALL RECOVERY FOR ALL DEV ON WS EXTRN NDREDW CALL RECOVERY FOR DWT EXTRN NDGEDN GET HIGEST DWT NUMBER ON WS EXTRN NDGEDW GET DWT ADDRESS * EJECT * * DRND01 ROUTINES FOR RETURN TO DEVICE DRIVER * EXTRN NDREPO POP, OK & RETURN EXTRN NDRETO OK & RETURN EXTRN NDREP POP & RETURN EXTRN NDRET RETURN * * * DWT DISPLACEMENTS * EXTRN DWTCHP CHANNEL PARAMETERS EXTRN DWTST STATUS FLAGS EXTRN DWTOR ORDER (RIGHT BYTE) EXTRN DWTADR DRIVER ADDRESS BLOCK ADDRESS EXTRN DWTOTQ QUEUE LINK EXTRN DWTCP2 SECOND CHANNEL PARAMETER WORD EXTRN DWTLD1 PLC INPUT/OUTPUT BUFFER ADDR EXTRN DWTLD2 PLC FLOW CONTROL COUNTERS EXTRN DWTTBU PLC TEST COMMANDS BUFFER ADDR EXTRN DWTTLN PLC TEST COMMANDS BUFFER LENGTH EXTRN DWTTCW PLC TEST COMMANDS SPECIAL PARAM EXTRN DWTWAT WAIT/ACT INDICATOR =16 * EJECT * * WORK STATION TABLES * EXTRN INTPL1 PLC 1 EXTRN INTPL2 PLC 2 EXTRN INTPL3 PLC 3 EXTRN INTPL4 PLC 4 * EXTRN INTPR1 REMOTE EXTRN INTPR2 REMOTE EXTRN INTPR3 REMOTE EXTRN INTPR4 REMOTE * * MISCELLANEOUS * EXTRN INTADR INTERRUPT ADDR IN DRIVER ADDR BLOCK * EJECT * ************************ * CONDITIONAL ASSEMBLY * ************************ * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 0 * * * PLCNRL DEFINES NUMBER OF LOCAL PLC:S ACTUALLY CONNECTED (0-4) * X:A EQU 1 PLCNRL EQU X:A * * PLCNRR DEFINES THE NUMBER OF REMOTE PLC:S ACTUALLY CONN. (0-4) * X:B EQU 0 PLCNRR EQU 1 * * EJECT * ************* * CONSTANTS * ************* * * SYSTEM PARAMETER DEFINITION * * LEVEL 3 FLOW CONTROL WINDOW SIZE (1-7) WINDOW EQU 2 * * MAXIMAL NUMBER OF WORK STATIONS PER PLC (1-32) MAXWS EQU 32 * * DELAY BEFORE EXECUTING "TEST CU" AT RESTART. (IN 100 MS) STADLY EQU 100 10 SECONDS * * LENGTH OF USER PART OF SHORT OUTPUT BUFFER IN WORDS (1-128) SOBUFU EQU 3 * * LENGTH OF USER PART OF GENERAL READ BUFFER IN WORDS (1-128) GRBUFU EQU 70 * * INACTIVITY TIMER (MINUTES) TIMACT EQU 3 U =8 * * POLLING FREQUENCY (L BYTE) & NUMBER OF RETRANSMISSIONS (R BYTE) =11 POLRTL EQU /1805 LOCAL =11 POLRTR EQU /0D05 REMOTE =11 * * IF PLCTST IS 1 THE PLC DIAGNOSTIC COMMANDS ARE HANDLED * BY THIS DRIVER. * PLCTST EQU 0 * * * A TEST VERSION OF THE DRIVER IS OBTAINED BY SETTING UTTEST><0 * IF UTTEST=1 THE TEST CODE IS INCLUDUD BUT TRAP IS NOT USED * IF UTTEST=2 THE TEST CODE IS INCLUDED AND TRAP IS USED * UTTEST EQU 0 * * * LOBUFN IS THE NUMBER OF LONG OUTPUT BUFFERS USED * FOR EACH PLC (1-32) * LOBUFN EQU 3 * * * LOBUFU IS THE LENGTH OF THE USER PART OF A LONG * OUTPUT BUFFER IN WORDS (1-128) * LOBUFU EQU 128 U =6,=16 * EJECT * * HARDWARE INTERRUPT LEVELS * THESE LEVELS MUST CORRESPOND TO INTERRUPT * VECTOR IN SYSTAB * INTLV0 EQU 26 PLC NUMBER 1 INTLV1 EQU 27 PLC NUMBER 2 INTLV2 EQU 24 PLC NUMBER 3 INTLV3 EQU 25 PLC NUMBER 4 INTRV0 EQU 18 PLC NUMBER 5, REMOTE INTRV1 EQU 19 6, REMOTE INTRV2 EQU 20 7, REMOTE INTRV3 EQU 21 8, REMOTE * * CHANNEL UNIT DEVICE ADDRESSES * PLCDA0 EQU /06 PLC 1 PLCDA1 EQU /07 PLC 2 PLCDA2 EQU /26 PLC 3 PLCDA3 EQU /27 PLC 4 PLCDA4 EQU /3A PLC 5 PLCDA5 EQU /3B PLC 6 PLCDA6 EQU /2A PLC 7 PLCDA7 EQU /2B PLC 8 * EJECT * * BUFFER AREA PARAMETER DEFINITION * HEADLW EQU 4 BUFFER HEADER LENGTH (WORDS) FLOWLW EQU 2 FLOW CONTROL FIELD LENGTH (WORDS) SYSTLW EQU HEADLW+FLOWLW SYSTEM PART OF BUFFER * * LONG OUTPUT BUFFERS LOBUF1 EQU SYSTLW+LOBUFU LENGTH OF ONE BUFFER (WORDS) LOBUF2 EQU LOBUF1+LOBUF1 2 BUFFERS LOBUF3 EQU LOBUF2+LOBUF1 LOBUF4 EQU LOBUF3+LOBUF1 LOBUF5 EQU LOBUF4+LOBUF1 LOBUF6 EQU LOBUF5+LOBUF1 LOBUF7 EQU LOBUF6+LOBUF1 . =17 LOBUF8 EQU LOBUF7+LOBUF1 . =17 LOBUF9 EQU LOBUF8+LOBUF1 . =17 LOBU10 EQU LOBUF9+LOBUF1 . =17 LOBU11 EQU LOBU10+LOBUF1 . =17 LOBU12 EQU LOBU11+LOBUF1 . =17 LOBU13 EQU LOBU12+LOBUF1 . =17 LOBU14 EQU LOBU13+LOBUF1 . =17 LOBU15 EQU LOBU14+LOBUF1 . =17 LOBU16 EQU LOBU15+LOBUF1 . =17 LOBU17 EQU LOBU16+LOBUF1 . =17 LOBU18 EQU LOBU17+LOBUF1 , =17 LOBU19 EQU LOBU18+LOBUF1 . =17 LOBU20 EQU LOBU19+LOBUF1 . =17 LOBU21 EQU LOBU20+LOBUF1 . =17 LOBU22 EQU LOBU21+LOBUF1 . =17 LOBU23 EQU LOBU22+LOBUF1 . =17 LOBU24 EQU LOBU23+LOBUF1 . =17 LOBU25 EQU LOBU24+LOBUF1 . =17 LOBU26 EQU LOBU25+LOBUF1 . =17 LOBU27 EQU LOBU26+LOBUF1 . =17 LOBU28 EQU LOBU27+LOBUF1 . =17 LOBU29 EQU LOBU28+LOBUF1 . =17 LOBU30 EQU LOBU29+LOBUF1 . =17 LOBU31 EQU LOBU30+LOBUF1 . =17 LOBU32 EQU LOBU31+LOBUF1 . =17 IFT LOBUFN=1 LOBUFS EQU LOBUF1 LENGTH OF BUFFER AREA (WORDS) XIF IFT LOBUFN=2 LOBUFS EQU LOBUF2 LENGTH OF BUFFER AREA (WORDS) XIF IFT LOBUFN=3 LOBUFS EQU LOBUF3 LENGTH OF BUFFER AREA (WORDS) XIF IFT LOBUFN=4 LOBUFS EQU LOBUF4 LENGTH OF BUFFER AREA (WORDS) XIF IFT LOBUFN=5 LOBUFS EQU LOBUF5 LENGTH OF BUFFER AREA (WORDS) XIF IFT LOBUFN=6 LOBUFS EQU LOBUF6 LENGTH OF BUFFER AREA (WORDS) XIF IFT LOBUFN=7 . =17 LOBUFS EQU LOBUF7 . =17 XIF IFT LOBUFN=8 . =17 LOBUFS EQU LOBUF8 . =17 XIF IFT LOBUFN=9 . =17 LOBUFS EQU LOBUF9 . =17 XIF IFT LOBUFN=10 . =17 LOBUFS EQU LOBU10 . =17 XIF IFT LOBUFN=11 . =17 LOBUFS EQU LOBU11 . =17 XIF IFT LOBUFN=12 . =17 LOBUFS EQU LOBU12 . =17 XIF IFT LOBUFN=13 . =17 LOBUFS EQU LOBU13 . =17 XIF IFT LOBUFN=14 . =17 LOBUFS EQU LOBU14 . =17 XIF IFT LOBUFN=15 . =17 LOBUFS EQU LOBU15 . =17 XIF IFT LOBUFN=16 . =17 LOBUFS EQU LOBU16 . =17 XIF IFT LOBUFN=17 . =17 LOBUFS EQU LOBU17 . =17 XIF IFT LOBUFN=18 . =17 LOBUFS EQU LOBU18 . =17 XIF IFT LOBUFN=19 . =17 LOBUFS EQU LOBU19 . =17 XIF IFT LOBUFN=20 . =17 LOBUFS EQU LOBU20 . =17 XIF IFT LOBUFN=21 . =17 LOBUFS EQU LOBU21 . =17 XIF IFT LOBUFN=22 . =17 LOBUFS EQU LOBU22 . =17 XIF IFT LOBUFN=23 .17 LOBUFS EQU LOBU23 . =17 XIF IFT LOBUFN=24 . =17 LOBUFS EQU LOBU24 . =17 XIF IFT LOBUFN=25 . =17 LOBUFS EQU LOBU25 . =17 XIF IFT LOBUFN=26 . =17 LOBUFS EQU LOBU26 . =17 XIF IFT LOBUFN=27 . =17 LOBUFS EQU LOBU27 . =17 XIF IFT LOBUFN=28 . =17 LOBUFS EQU LOBU28 . =17 XIF IFT LOBUFN=29 . =17 LOBUFS EQU LOBU29 . =17 XIF IFT LOBUFN=30 . =17 LOBUFS EQU LOBU30 . =17 XIF IFT LOBUFN=31 . =17 LOBUFS EQU LOBU31 . =17 XIF IFT LOBUFN=32 . =17 LOBUFS EQU LOBU32 . =17 XIF * EJECT * * SHORT OUTPUT BUFFERS SOBUF1 EQU SYSTLW+SOBUFU LENGTH OF ONE BUFFER (WORDS) SOBUF2 EQU SOBUF1+SOBUF1 2 BUFFERS SOBUF4 EQU SOBUF2+SOBUF2 SOBUF8 EQU SOBUF4+SOBUF4 SOBUFS EQU SOBUF8 LENGTH OF BUFFER AREA (WORDS) * * GENERAL READ BUFFERS GRBUF1 EQU SYSTLW+GRBUFU LENGTH OF ONE BUFFER (WORDS) GRBUF2 EQU GRBUF1+GRBUF1 GRBUFS EQU GRBUF2 LENGTH OF BUFFER AREA (WORDS) * * LENGTHS OF USER PART OF BUFFERS (BYTES) SOBUFL EQU SOBUFU+SOBUFU SHORT OUTPUT BUFFERS LOBUFL EQU LOBUFU+LOBUFU LONG OUTPUT BUFFERS GRBUFL EQU GRBUFU+GRBUFU GENERAL READ BUFFERS * EJECT * * CONTROLLER COMMAND RECORD (CCR) LAYOUT * CCRDLS EQU 0 DATA LINK STATION INDEX CCRCMD EQU 1 COMMAND CODE CCRSU1 EQU 2 SUBCOMMAND BYTE 1 CCRSU2 EQU 3 SUBCOMMAND BYTE 2 CCRSUB EQU 2 SUBCOMMAND WORD CCRSTA EQU 4 STATUS WORD CCRIDB EQU 7 IDENTITY, BYTE FIELD CCRIDW EQU 8 IDENTITY, WORD FIELD CCRLEN EQU 10 BUFFER LENGTH (BYTES) CCRC1B EQU 12 DATA CHAINING CTRL & MSB BUFFER ADDR CCRBUF EQU 14 BUFFER ADDRESS * * * BUFFER LAYOUT * * HEADER LENGTH BUFHLN EQU HEADLW+HEADLW LENGTH (BYTES) * HEADER LAYOUT BUFLNK EQU -8 FREE LIST LINK BUFDWT EQU -6 DWT ADDRESS BUFLEN EQU -4 LENGTH OF TEXT IN BUFFER BUFBIX EQU -2 BYTE INDEX * X25 CONTROL FIELD LAYOUT X25LGN EQU 0 LOGICAL CHANNEL GROUP NUMBER X25LCN EQU 1 LOGICAL CHANNEL NUMBER X25FLW EQU 2 FLOW CONTROL INFORMATION X25DAT EQU 3 START OF USER DATA * EJECT * * PLC COMMAND CODES * CMDTC EQU /80 TEST CHANNEL UNIT CMDOP EQU /86 OPEN LINE CMDOD EQU /85 OPEN DLS CMDPS EQU /84 GET LINE STATISTICS CMDDS EQU /83 GET DLS STATISTICS CMDRM EQU /87 READ LOCAL MEMORY CMDSW EQU /40 STANDARD WRITE CMDFW EQU /41 FAST WRITE CMDGR EQU /20 GENERAL READ * * * APPLICATION TEST COMMAND CODES * ORDPS EQU 1 GET LINE STATISTICS ORDDS EQU 2 GER DLS STATISTICS ORDRM EQU 3 READ LOCAL MEMORY * * * MESSAGE TYPES * TYERR EQU 0 ILLEGAL TYPE OR ERROR TYNFLO EQU 2 DATA PACKET WITH NO FLOW CONTROL TYSTAT EQU 4 DEVICE STATUS MESSAGE TYDATA EQU 6 NORMAL DATA PACKET TYRR EQU 8 RECIEVE READY PACKET TYRES EQU 10 RESET PACKET TYRESC EQU 12 RESET CONFIRMATION PACKET * EJECT * * DWT STATUS FLAGS (DWTST) * DWFBSY EQU /8000 DEVICE NOT BUSY DWFECH EQU /2000 ECHO MODE DWFINP EQU /0020 INPUT REQUESTED DWFRES EQU /0008 RESET SEQUENCE ACTIVE DWFAK3 EQU /0004 WAITING FOR LEVEL 3 ACK DWFPLC EQU DWFRES+DWFAK3 PLC FLAGS DWFTY1 EQU /0002 USE ONLY TYPE 1 DATA PACKETS DWFSAC EQU /0001 WAIT FOR LEVEL 3 ACK * * * PLC STATUS FLAGS (CCRSTA) * STANOC EQU /0001 NO CONNECTION STALIR EQU /0004 LINK RESET STADNO EQU /1000 DCE NOT OPERABLE STAE1 EQU STANOC+STALIR DUMMY STAERR EQU STAE1+STADNO ERROR IN COMMUNICATION * STAREQ EQU /8000 REQUEST ERROR STANOB EQU /0800 NO BUFFERS FOR CCR STAPOL EQU /0100 POLLING STOPPED STACOM EQU /0080 COMMUNICATION REESTABLISHED STASEQ EQU /0010 SEQUENCE ERROR STAILL EQU /0008 ILLEGAL LENGTH STALER EQU /0002 LINK ERROR * EJECT * * WORK STATION STATUS FLAGS * WSFERR EQU /01 COMMUNICATION ERROR * * * MASKS FOR CHANNEL PARAMETERS * MASKPL EQU /0F PLC NUMBER (0-3 USED) MASKWS EQU /3F WORK STATION NUMBER (1-32 USED) MASKLC EQU /3F LOGICAL CHANNEL (0-7 USED) * * * RETURN CODES * * AT REQUEST RETURN NOTOPR EQU /0001 NOT OPERABLE LINERR EQU /0004 LINK ERROR PLSERR EQU /0001 SOFTWARE ERROR * AT RECOVERY ENTRY RETCP EQU /0001 TC POWER UP RESECP EQU /0002 SECONDARY POWER UP RELINE EQU /0004 LINK ERROR * * * MISCELLANEOUS * PLCERR EQU /F1 SOP ERROR CODE AT TRAP CIDINT EQU 8 OFFSET TO INTERRUPT DESCRIPTOR MAXFR EQU 4 MAX OUTSTANDING FRAMES ON LEVEL 2 CHABLO EQU /80 FLAG CHANGED BLOCKING =16 * EJECT * ************** * DATA AREAS * ************** * * CWT ADDRESS TABLE * CWTPLC EQU * TABCWT EQU * IFF PLCNRL=0 DATA PL0CWT CWT FOR PLC NR 1 IFF PLCNRL=1 DATA PL1CWT CWT FOR PLC NR 2 IFF PLCNRL=2 DATA PL2CWT CWT FOR PLC NR 3 IFF PLCNRL=3 DATA PL3CWT CWT FOR PLC NR 4 XIF * IFF PLCNRL=4 DATA 0 PLC NR 4 NOT CONNECTED IFF PLCNRL=3 DATA 0 PLC NR 3 NOT CONNECTED IFF PLCNRL=2 DATA 0 PLC NR 2 NOT CONNECTED IFF PLCNRL=1 =5 DATA 0 PLC NR 1 NOT CONNECTED =5 XIF * IFF PLCNRR=0 DATA PR1CWT CWT FOR PLC NR. 5, REM. IFF PLCNRR=1 DATA PR2CWT CWT FOR PLC NR. 6, REM. IFF PLCNRR=2 DATA PR3CWT CWT FOR PLC NR. 7, REM. IFF PLCNRR=3 DATA PR4CWT CWT FOR PLC NR. 8, REM. XIF * IFF PLCNRR=4 DATA 0 PLC NR 8 NOT CONNECTED IFF PLCNRR=3 DATA 0 PLC NR 7 NOT CONNECTED IFF PLCNRR=2 DATA 0 PLC NR 6 NOT CONNECTED IFF PLCNRR=1 DATA 0 PLC NR 5 NOT CONNECTED XIF * EJECT * * OPARR1 EQU * IFF PLCNRR=0 U =5 DATA OPNR10 LINE 0 DATA OPNR11 LINE 1 DATA OPNR12 LINE 2 DATA OPNR13 LINE 3 XIF OPARR2 EQU * IFF PLCNRR=0 U =5 IFF PLCNRR=1 U =5 DATA OPNR20 LINE 0 DATA OPNR21 LINE 1 DATA OPNR22 LINE 2 DATA OPNR23 LINE 3 XIF OPARR3 EQU * IFF PLCNRR=0 U =5 IFF PLCNRR=1 U =5 IFF PLCNRR=2 U =5 DATA OPNR30 LINE 0 DATA OPNR31 LINE 1 DATA OPNR32 LINE 2 DATA OPNR33 LINE 3 XIF OPARR4 EQU * IFF PLCNRR=0 U =5 IFF PLCNRR=1 U =5 IFF PLCNRR=2 U =5 IFF PLCNRR=3 U =5 DATA OPNR40 LINE 0 DATA OPNR41 LINE 1 DATA OPNR42 LINE 2 DATA OPNR43 LINE 3 XIF * OPARL1 EQU * U =5 DATA OPNL10 LOCAL PLC 1 =5 OPARL2 EQU * U =5 DATA OPNL20 LOCAL PLC 2 =5 OPARL3 EQU * U =5 DATA OPNL30 LOCAL PLC 3 =5 OPARL4 EQU * U =5 DATA OPNL40 LOCAL PLC 4 =5 EJECT * * OPEN LINE PARAMETER AREAS, LOCAL * * STANDARD AREAS : * PRIMARY STATION * FULL DUPLEX * 96000 BITS/SEC * NO NRZI ENCODING * POLLING 24HZ U =8 * 5 RETRANSMISSIONS * 3 MIN. TIME OUT * * OPNL40 EQU * LOCAL PLC 4, LINE 0 IFF PLCNRL=0 IFF PLCNRL=1 IFF PLCNRL=2 IFF PLCNRL=3 DATA /0101,/A000,POLRTL,TIMACT,/0120,0 =8,=11 XIF OPNL30 EQU * LOCAL PLC 3, LINE 0 IFF PLCNRL=0 IFF PLCNRL=1 IFF PLCNRL=2 DATA /0101,/A000,POLRTL,TIMACT,/0120,0 =8,=11 XIF OPNL20 EQU * LOCAL PLC 2, LINE 0 IFF PLCNRL=0 IFF PLCNRL=1 DATA /0101,/A000,POLRTL,TIMACT,/0120,0 =8,=11 XIF OPNL10 EQU * LOCAL PLC 1, LINE 0 IFF PLCNRL=0 DATA /0101,/A000,POLRTL,TIMACT,/0120,0 =8,=11 XIF * * END OF LOCAL LINE PARAMETER AREAS * EJECT * * OPEN LINE PARAMETER AREAS, REMOTE * * STANDARD AREAS : * PRIMARY STATION * FULL DUPLEX * 2400 BITS/SEC * NO NRZI ENCODING * POLLING 13HZ * 5 RETRANSMISSIONS * 5 MIN. TIME OUT * * * REMOTE PLC 4 OPNR40 EQU * LINE 0 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFF PLCNRR=3 DATA /0103,/0400,POLRTR,TIMACT,/0108,0 =11 XIF OPNR41 EQU * LINE 1 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFF PLCNRR=3 DATA /0103,/0400,POLRTR,TIMACT,/0908,0 =11 XIF OPNR42 EQU * LINE 2 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFF PLCNRR=3 DATA /0103,/0400,POLRTR,TIMACT,/1108,0 =10,=11 XIF OPNR43 EQU * LINE 3 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFF PLCNRR=3 DATA /0103,/0400,POLRTR,TIMACT,/1908,0 =10,=11 XIF * REMOTE PLC 3 OPNR30 EQU * LINE 0 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 DATA /0103,/0400,POLRTR,TIMACT,/0108,0 =11 XIF OPNR31 EQU * LINE 1 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 DATA /0103,/0400,POLRTR,TIMACT,/0908,0 =11 XIF OPNR32 EQU * LINE 2 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 DATA /0103,/0400,POLRTR,TIMACT,/1108,0 =10,=11 XIF OPNR33 EQU * LINE 3 IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 DATA /0103,/0400,POLRTR,TIMACT,/1908,0 =10,=11 XIF * * REMOTE PLC 2 OPNR20 EQU * LINE 0 IFF PLCNRR=0 IFF PLCNRR=1 DATA /0103,/0400,POLRTR,TIMACT,/0108,0 =11 XIF OPNR21 EQU * LINE 1 IFF PLCNRR=0 IFF PLCNRR=1 DATA /0103,/0400,POLRTR,TIMACT,/0908,0 =11 XIF OPNR22 EQU * LINE 2 IFF PLCNRR=0 IFF PLCNRR=1 DATA /0103,/0400,POLRTR,TIMACT,/1108,0 =10,=11 XIF OPNR23 EQU * LINE 3 IFF PLCNRR=0 IFF PLCNRR=1 DATA /0103,/0400,POLRTR,TIMACT,/1908,0 =10,=11 XIF * * REMOTE PLC 1 OPNR10 EQU * LINE 0 IFF PLCNRR=0 DATA /0103,/0400,POLRTR,TIMACT,/0108,0 =11 XIF OPNR11 EQU * LINE 1 IFF PLCNRR=0 DATA /0103,/0400,POLRTR,TIMACT,/0908,0 =11 XIF OPNR12 EQU * LINE 2 IFF PLCNRR=0 DATA /0103,/0400,POLRTR,TIMACT,/1108,0 =10,=11 XIF OPNR13 EQU * LINE 3 IFF PLCNRR=0 DATA /0103,/0400,POLRTR,TIMACT,/1908,0 =10,=11 XIF * END OF REMOTE LINE PARAMETER AREAS * * PLCPFP DATA 0 PLC LOCAL POWER FAIL FLAG * IFF UTTEST=0 TEST VERSION OF DRIVER * EJECT * UTTST DATA UTTEST 1 = TRAP NOT USED * * * QUEUE STATISTICS COUNTERS * EACH COUNTER HAS ONE WORD / PLC * STATAR EQU * WIQSTA RES 8 WINDOW QUEUE SBQSTA RES 8 SHORT BUFFERS QUEUE LBQSTA RES 8 LONG BUFFERS QUEUE CCQSTA RES 8 CCA QUEUE STATLN EQU *-STATAR TABLE LENGTH * XIF EJECT * * * CWT DISPLACEMENTS * CWTOPR EQU /00 CU OPERABLE CWTCCB EQU /02 CCA BUSY CWTGR EQU /04 GENERAL READ ALLOWED CWTPNR EQU /06 CU NUMBER (0-7) CWTABW EQU /08 WS TO ABORT CWTPLS EQU /0A LATEST PLC RCA STATUS CWTLNO EQU /0C LINE NO INDICATOR CWTPAR EQU /0E INDEX TO PARAMETER AREA CWTOPP EQU /10 OPEN LINE PARAMETER AREA ADDRESS =2 CWTINT EQU /12 WS TABLE ADDRESS CWTBUF EQU /14 INP. BUFFER ADDRESS CWTSBQ EQU /16 QUEUE FOR SHORT OUTP. BUFFERS CWTLBQ EQU /18 QUEUE FOR LONG OUTP. BUFFERS CWTCCQ EQU /1A QUEUE FOR CCA FREE CWTMBQ EQU /1C QUEUE OF ALLOCATED MON. BLOCKS CWTTPR EQU /1E TIMER POINTER CWTCIO EQU /20 CIO START INSTR. CWTST3 EQU /22 SST INSTR. CWTCSD EQU /24 CTRL UNIT START DESCRIPTOR CWTCID EQU /2A CTRL UNIT INTERF. DESCR. CWTCCA EQU /34 COMMAND CTRL AREA CWTRCA EQU /44 RESPONSE CTRL AREA CWTPBS EQU /54 POOLBL. SHORT OUTP. BUFFERS CWTPBL EQU /5E POOLBL. LONG OUTP. BUFFERS =2 CWTPBG EQU /68 POOLBL. GENERAL READ BUFFERS CWTWSS EQU /72 WS STATUS CWTSOB EQU MAXWS+MAXWS+/74 SH. OUTP. BUFFERS =4 CWTLB1 EQU CWTSOB+SOBUFS U =7 CWTLOB EQU CWTLB1+SOBUFS LONG OUTP. BUFFERS =7 CWTGR1 EQU CWTLOB+LOBUFS U =7 CWTGRB EQU CWTGR1+LOBUFS GEN. READ BUFFERS =7 EJECT * IFF PLCNRL=0 * CWT FOR PLC NUMBER 1 * PL0CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 0 PLC NUMBER (0-3) DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR DATA 0 INDEX PARAMETER AREA * * POINTERS AND QUEUE HEADS DATA OPARL1 OPEN LINE PARAMETER AREA ADDR DATA INTPL1 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA0 START I/O OPERATION SST A3,PLCDA0 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL0CWT+CWTCID CID ADDRESS DATA INTLV0 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL0CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PL0CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS DATA 'SO',0 ID & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS * * XIF IFF PLCNRL=1 * EJECT * * CWT FOR PLC NUMBER 2 * PL1CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 1 PLC NUMBER (0-3) DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR DATA 0 INDEX TO PARAMETER AREA * * POINTERS AND QUEUE HEADS DATA OPARL2 OPEN LINE PARAMETER AREA ADDR DATA INTPL2 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA1 START I/O OPERATION SST A3,PLCDA1 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL1CWT+CWTCID CID ADDRESS DATA INTLV1 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL1CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PL1CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS (5 WORDS / BLOCK) DATA 'SO',0 ID = "SHORT OUTPUT" & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 ID = "LONG OUTPUT" DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 ID = "GENERAL READ" DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS * * IFF PLCNRL=2 * EJECT * * CWT FOR PLC NUMBER 3 * PL2CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 2 PLC NUMBER (0-3) DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR DATA 0 INDEX TO PARAMETER AREA * * POINTERS AND QUEUE HEADS DATA OPARL3 OPEN LINE PARAMETER AREA ADDR DATA INTPL3 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA2 START I/O OPERATION SST A3,PLCDA2 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL2CWT+CWTCID CID ADDRESS DATA INTLV2 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL2CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PL2CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS (5 WORDS / BLOCK) DATA 'SO',0 ID = "SHORT OUTPUT" & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 ID = "LONG OUTPUT" DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 ID = "GENERAL READ" DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS * * IFF PLCNRL=3 * EJECT * * CWT FOR PLC NUMBER 4 * PL3CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 3 PLC NUMBER (0-3) DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR DATA 0 INDEX TO PARAMETER AREA * * POINTERS AND QUEUE HEADS DATA OPARL4 OPEN LINE PARAMETER AREA ADDR DATA INTPL4 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA3 START I/O OPERATION SST A3,PLCDA3 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL3CWT+CWTCID CID ADDRESS DATA INTLV3 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PL3CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PL3CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS (5 WORDS / BLOCK) DATA 'SO',0 ID = "SHORT OUTPUT" & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 ID = "LONG OUTPUT" DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 ID = "GENERAL READ" DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS XIF * EJECT IFF PLCNRR=0 * * CWT FOR PLC NUMBER 5 REMOTE * PR1CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 4 PLC NUMBER (4-7) =5 DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR DATA 0 INDEX TO PARAMETER AREAS * * POINTERS AND QUEUE HEADS DATA OPARR1 OPEN LINE PARAMETER AREA ADDRESSES DATA INTPR1 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA4 START I/O OPERATION SST A3,PLCDA4 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR1CWT+CWTCID CID ADDRESS DATA INTRV0 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR1CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PR1CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS (5 WORDS / BLOCK) DATA 'SO',0 ID = "SHORT OUTPUT" & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 ID = "LONG OUTPUT" DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 ID = "GENERAL READ" DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS * * EJECT IFF PLCNRR=1 * * CWT FOR PLC NUMBER 6 REMOTE * PR2CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 5 PLC NUMBER (4-7) =5 DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR =5 DATA 0 INDEX TO PARAMETER AREAS =5 * * POINTERS AND QUEUE HEADS DATA OPARR2 OPEN LINE PARAMETER AREA ADDRESSES DATA INTPR2 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA5 START I/O OPERATION SST A3,PLCDA5 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR2CWT+CWTCID CID ADDRESS DATA INTRV1 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR2CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PR2CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS (5 WORDS / BLOCK) DATA 'SO',0 ID = "SHORT OUTPUT" & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 ID = "LONG OUTPUT" DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 ID = "GENERAL READ" DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS * * EJECT IFF PLCNRR=2 * * CWT FOR PLC NUMBER 7 REMOTE * PR3CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 6 PLC NUMBER (4-7) =5 DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR DATA 0 INDEX TO PARAMETER AREAS * * POINTERS AND QUEUE HEADS DATA OPARR3 OPEN LINE PARAMETER AREA ADDRESSES DATA INTPR3 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA6 START I/O OPERATION SST A3,PLCDA6 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR3CWT+CWTCID CID ADDRESS DATA INTRV2 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR3CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PR3CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS (5 WORDS / BLOCK) DATA 'SO',0 ID = "SHORT OUTPUT" & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 ID = "LONG OUTPUT" DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 ID = "GENERAL READ" DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS * * EJECT IFF PLCNRR=3 * * CWT FOR PLC NUMBER 8 REMOTE * PR4CWT EQU * * * FLAGS RES 1 PLC OPERABLE FLAG DATA 0 CCA BUSY FLAG (0=FREE) DATA 1 GENERAL READ ALLOWED (0=ALLOWED) * * DATA WORDS DATA 7 PLC NUMBER (4-7) =5 DATA 0 WORK STATION TO ABORT (0=NO ABORT) DATA 0 LATEST PLC RCA STATUS DATA 0 LINE NO INDICATOR DATA 0 INDEX TO PARAMETER AREAS * * POINTERS AND QUEUE HEADS DATA OPARR4 OPEN LINE PARAMETER AREA ADDRESSES DATA INTPR4 WORK STATION TABLE ADDRESS DATA 0 INPUT BUFFER ADDRESS DATA 0 QUEUE FOR SHORT OUTPUT BUFFER DATA 0 QUEUE FOR LONG OUTPUT BUFFER DATA 0 QUEUE FOR CCA FREE DATA 0 QUEUE OF ALLOCATED MONITOR BLOCKS DATA 0 TIMER POINTER FOR RESTART DELAY * * INSTRUCTIONS CIO A3,1,PLCDA7 START I/O OPERATION SST A3,PLCDA7 RELEASE RCA AND RESET INTERRUPT * * PLC CONTROL AREAS * CONTROL UNIT START DESCRIPTOR (3 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR4CWT+CWTCID CID ADDRESS DATA INTRV3 INTERRUPT LEVEL * CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) DATA 0 DUMMY & MSB ADDRESS DATA PR4CWT+CWTCCA CCA ADDRESS DATA 0 DUMMY & MSB ADDRESS DATA PR4CWT+CWTRCA RCA ADDRESS DATA 0 INTERRUPT SPECIFICATION RES 8 COMMAND CONTROL AREA RES 8 RESPONSE CONTROL AREA * * POOLBLOCKS (5 WORDS / BLOCK) DATA 'SO',0 ID = "SHORT OUTPUT" & FLAGS DATA 0,SOBUF1+SOBUF1 QUEUE HEAD & BUFFER LENGTH DATA SOBUFS+SOBUFS AREA LENGTH DATA 'LO',0 ID = "LONG OUTPUT" DATA 0,LOBUF1+LOBUF1 DATA LOBUFS+LOBUFS DATA 'GR',0 ID = "GENERAL READ" DATA 0,GRBUF1+GRBUF1 DATA GRBUFS+GRBUFS * * WORK STATION STATUS WORDS. 1 WORD / WS RES MAXWS+1 L BYTE = STATUS. R BYTE = FLAGS. * * BUFFER AREAS RES SOBUFS SHORT OUTPUT BUFFERS RES LOBUFS LONG OUTPUT BUFFERS RES GRBUFS GENERAL READ BUFFERS * * XIF EJECT * * I/O COMPLETION DISPATCH TABLE * * THE MOST FREQUENTLY USED ROUTINES ARE PLACED * AT THE END OF THE TABLE, AS IT IS SCANNED * FROM THE END. * CMDTAB EQU * DATA CMDTC COMMAND CODE "TEST CHANNEL UNIT" DATA COMPTC START OF "TEST CU" COMPLETION ROUTINE DATA 0 ALLOWED STATUS FOR "TEST CU" COMMAND CMDTB1 EQU *-CMDTAB LENGTH OF ONE ENTRY DATA CMDOP OPEN LINE DATA COMPOP DATA 0 DATA CMDOD OPEN DLS DATA COMPOD DATA STADNO+STANOC IFT PLCTST=1 DATA CMDPS GET LINE STATISTICS DATA COMPPS STAE2 EQU STAREQ+STAILL DUMMY STAE3 EQU STASEQ+STANOB DUMMY DATA STAE2+STAE3 DATA CMDDS GET DLS STATISTICS DATA COMPDS DATA STAE2+STAE3 DATA CMDRM READ LOCAL MEMORY DATA COMPRM DATA STAE2 * EJECT * XIF DATA CMDSW STANDARD WRITE DATA COMPSW DATA STAERR DATA CMDFW FAST WRITE DATA COMPFW DATA STAERR DATA CMDGR GENERAL READ DATA COMPGR DATA 0 CMDTBL EQU *-CMDTAB TABLE LENGTH * EJECT * * READ COMPLETION DISPATCH TABLE * * THIS TABLE IS INDEXED BY THE "MESSAGE TYPE" * CONSTANTS DEFINED ABOVE. REAROU EQU * DATA GRERR1 ERROR ROUTINE DATA GRERR1 DATA PACKET NO FLOW C. (NOT IMPLEM.) DATA GRSTAT DEVICE STATUS DATA PACKET DATA GRDATA NORMAL DATA PACKET DATA GRRR RECIEVE READY PACKET DATA GRRES RESET PACKET DATA GRERR1 RESET CONFIRM. PACKET (NOT IMPLEM.) * * * WRITE COMPLETION DISPATCH TABLE * * THIS TABLE IS INDEXED BY THE "MESSAGE TYPE" * CONSTANTS DEFINED ABOVE. WRIROU EQU * DATA WRERR ERROR ROUTINE DATA WRNFLO DATA PACKET WITHOUT FLOW CONTROL DATA WRERR DEVICE STATUS DATA (NOT RELEVANT) DATA WRDATA NORMAL DATA PACKET DATA WRRR RECIEVE READY PACKET DATA WRERR RESET PACKET (NOT IMPLEMENTED) DATA WRRESC RESET CONFIRMATION PACKET * EJECT * ******************** * REQUEST ROUTINES * ******************** * * THIS SECTION CONTAINS REQUEST HANDLING ROUTINES. * THE REQUEST ROUTINES ARE CALLED FROM TERMINAL * DEVICE DRIVERS. THIS IS NORMALLY DONE THROUGH * THE TERMINAL NETWORK DISTRIBUTOR DRIVER (DRND01). * THE DISTRIBUTOR DRIVER WILL SWITCH CALL TO * CONNECTED LINE DRIVER. RETURN IS MADE DIRECTLY * FROM THIS DRIVER TO TERMINAL DEVICE DRIVER. * A CALL WILL NORMALLY RESULT IN A WAIT FOR SOME * I/O ACTION AND DISPATCHING. THIS MEANS, THAT AT * TIME OF CALL THE DEVICE DRIVER MAY NOT HAVE ANY * DATA ON THE A15 STACK. * * ROUTINES IN ORDER OF APPEARANCE IN CODE: * * NAME FUNCTION * * PLCHRI INPUT OF ONE CHARACTER * PLSTBL DEFINE START OF OUTPUT BLOCK * PLCHRO OUTPUT OF ONE CHARACTER * PLENBL DEFINE END OF OUTPUT BLOCK * PLTEST PERFORM PLC TEST FUNCTION * EJECT * ************************************************************ * * ROUTINE NAME: * PLCHRI * * FUNCTION: * THIS ROUTINE FETCHES ONE CHARACTER FROM THE * INPUT BUFFER. IF NO BUFFER HAS ARRIVED, "INPUT * REQUESTED" FLAG IN DWT IS SET, AND CALLING * PROCESS IS SUSPENDED UNTIL A BUFFER ARRIVES. * * CALL: * ABI INPTAB,A1 * CF A5,PLCHRI * * INPUT: * A6 = DWT ADDRESS * * OUTPUT: * AT RETURN TO DEVICE DRIVER * A1 = BITS 0-14 CHANGED * BIT 15 1 IF MORE CHAR IN BUFFER * A2 = BITS 0-7 ZERO * BITS 8-15 CHARACTER * INTERR. ENABLED * ************************************************************ * PLCHRI EQU * PRCHRI EQU * STR A4,A15 PUSH A4 LD A4,DWTLD1,A6 INPUT TEXT WAITING? RF(Z) CI100 NO, WAIT FOR TEXT * EJECT * CF A15,PLGECH GET CHARACTER FROM BUFFER LDR A1,A1 CHECK RETURN STATUS RF(N) CI100 BUFFER EMPTY, WAIT FOR NEXT LDR* A4,A15 POP A4 RF CI110 RETURN TO DEVICE DRIVER * * CI100 EQU * LDR* A4,A15 POP A4 LDK A2,DWFINP FLAG "INPUT REQUESTED" ORS A2,DWTST,A6 SET INPUT REQUESTED IN DWT CF A15,NDSAV8 SAVE A3-A5, A7-A8 IN DWT ABL PLDISP LOCAL DISPATCHER * * * ENTRY IS MADE HERE WHEN A NEW BUFFER HAS ARRIVED * REGISTERS ON ENTRY: * A1 = NR OF CHARACTERS LEFT IN BUFFER * A2 = BITS 0-7 ZERO * BITS 8-15 CHARACTER * A4 = BUFFER ADDRESS * A6 = DWT ADDRESS * INPRST EQU * LDKL A3,/FFFF-DWFINP MASK FOR INPUT REQUESTED ANS A3,DWTST,A6 RESET FLAG ST A4,DWTLD1,A6 LINK BUFFER TO DWT * CF A15,NDGET8 GET A3-A5, A7-A8 FROM DWT * EJECT * CI110 EQU * * RETURN TO DEVICE DRIVER LDR A1,A1 ANY CHAR LEFT IN BUFFER? RF(Z) CI120 NO, CONTINUE LDK A1,1 INDICATE MORE CHARACTERS RF CI130 * CI120 EQU * CM DWTLD1,A6 UNLINK BUFFER CI130 EQU * ENB RTN A5 * EJECT * ************************************************************ * * ROUTINE NAME: * PLSTBL * * FUNCTION: * THIS ROUTINE DEFINES START OF AN OUTPUT BLOCK. * IT ALLOCATES AN OUTPUT BUFFER, AND LINKS IT * TO THE DWT. * * CALL: * ABI STBTAB,A1 * CF A5,PLSTBL * * INPUT: * A2 = MAXIMAL LENGTH OF TEXT IN BLOCK (BYTES) * A6 = DWT ADDRESS * * OUTPUT: * AT RETURN TO DEVICE DRIVER * A1 = RETURN CODE * 0 IF OK * NOT 0 IF ERROR * A2 = DEVICE STATUS (IF RELEVANT, IE A1=0) * CR = CONTENTS OF A1 * INTERR. ENABLED * ************************************************************ * PLSTBL EQU * PRSTBL EQU * ENB CF A15,NDSAV8 SAVE A3-A5, A7-A8 IN DWT CF A15,GETCWT A5 := CWT ADDRESS * EJECT LD A1,DWTST,A6 WAITING LEV. 3 ACK DK2 ANK A1,DWFAK3+DWFSAC . DK2 RF(Z) SB050 . DK2 ANK A1,DWFAK3 . DK2 RF(NZ) SB060 . DK2 * SB050 EQU * . =16 LD A1,DWTLD1,A6 BUFFER ALREADY ALLOCATED? ABL(NZ) NDREPO YES, SET OK & RETURN SB060 EQU * CF A15,GETLCS A1 := STATUS & INH RF(NZ) SBERR2 ERROR, RETURN LD A3,DWTCHP,A6 CHANNEL PARAMETERS =16 ANK A3,CHABLO CHANGED BLOCKING? =16 RF(Z) SB070 NO =16 LDKL A2,LOBUFL LOAD MAX BLOCK LENGTH =16 SB070 EQU * . =16 * * CHECK LEVEL 3 WINDOW LDR A3,A2 SAVE MAX BLOCK LENGTH LD A1,DWTST,A6 DWT STATUS ANKL A1,DWFECH+DWFTY1 ECHO OR ONLY TYPE 1? RF(NZ) SB090 YES, DON'T CHECK WINDOW CF A15,GETOFR A2 := NR OF OUTSTANDING FRAMES LDR A2,A2 ANY FRAMES OUTSTANDING? RF(Z) SB090 NO, CONTINUE LD A1,DWTST,A6 DWT STATUS ANK A1,DWFSAC ALWAYS WAIT FOR LEVEL 3 ACK? RF(NZ) SBERR YES, NO FRAMES MAY BE OUT. ERROR SUK A2,WINDOW WINDOW FULL? RF(N) SB090 NO, CONTINUE * DWT WILL HAVE TO WAIT UNTIL WINDOW IS OPEN ST A3,DWTLD1,A6 SAVE REQUESTED BUFFER LENGTH LDK A1,DWFAK3 FLAG "WAITING FOR LEVEL 3 ACK" ORS A1,DWTST,A6 SET FLAG IN DWT STATUS IFF UTTEST=0 QUEUE STATISTICS LD A1,CWTPNR,A5 PLC NUMBER SLA A1,1 MAKE INDEX IM WIQSTA,A1 INCREMENT QUEUE STATISTICS COUNTER XIF ABL PLDSP2 LOCAL DISPATCHER * * * ENTRY IS MADE HERE WHEN WINDOW IS OPEN AGAIN * (AFTER A LEVEL 3 ACK) * REGISTER CONTENTS ON ENTRY: * A1 = RETURN CODE * A5 = CWT ADDRESS * A6 = DWT ADDRESS * WINRST EQU * LD A3,DWTLD1,A6 RESTORE REQUESTED BUFFER LENGTH CM DWTLD1,A6 LDR A1,A1 RETURN CODE RF(NZ) SBERR2 ERROR, RETURN TO DEVICE DRIVER * * SB090 EQU * LDR A7,A5 CWK A3,SOBUFL SHORT BUFFER ENOUGH? RF(G) SB100 NO, TAKE LONG BUFFER * * ALLOCATE SHORT OUTPUT BUFFER ADK A7,CWTPBS POOLBLOCK FOR SHORT BUFFERS CF A15,PLGTBU ALLOCATE BUFFER RF(NZ) SB120 COMMON PART FOR SHORT/LONG LDK A7,CWTSBQ NO BUFFER LEFT. SET QUEUE HEAD IFF UTTEST=0 QUEUE STATISTICS LD A1,CWTPNR,A5 PLC NUMBER SLA A1,1 MAKE INDEX IM SBQSTA,A1 INCREMENT QUEUE STATISTICS COUNTER XIF RF SB110 COMMON PART FOR NO BUFFER * SB100 EQU * CWK A3,LOBUFL LONG BUFFER ENOUGH? RF(G) SBERR NO, ERROR * ALLOCATE LONG OUTPUT BUFFER ADK A7,CWTPBL POOLBLOCK FOR LONG BUFFERS CF A15,PLGTBU ALLOCATE BUFFER RF(NZ) SB120 COMMON PART FOR SHORT/LONG LDK A7,CWTLBQ NO BUFFER LEFT. SET QUEUE HEAD IFF UTTEST=0 QUEUE STATISTICS LD A1,CWTPNR,A5 PLC NUMBER SLA A1,1 MAKE INDEX IM LBQSTA,A1 INCREMENT QUEUE STATISTICS COUNTER XIF * SB110 EQU * * NO BUFFER WAS AVAILABLE. PUT REQUEST IN QUEUE. ADR A7,A5 A7 := QUEUE HEAD ADDRESS LDR A4,A6 DWT ADDRESS ADKL A4,DWTOTQ QUEUE LINK ADDRESS CF A15,LNKLST PUT LAST IN QUEUE ABL PLDSP2 LOCAL DISPATCHER * * * ENTRY IS MADE HERE WHEN A BUFFER IS FREE * REGISTERS ON ENTRY: * A1 = RETURN CODE * A4 = BUFFER ADDRESS (IF A1=0) * A5 = CWT ADDRESS * A6 = DWT ADDRESS * BUFRST EQU * LDR A1,A1 RETURN CODE RF(NZ) SBERR2 RETURN IF ERROR SB120 EQU * LDK A2,X25DAT LENGTH OF X25 HEADER ST A2,BUFBIX,A4 BYTE INDEX := START OF DATA ST A4,DWTLD1,A6 SAVE BUFFER ADDRESS IN DWT * ABL NDREPO RETURN TO DEVICE DRIVER * RETURN CODE := OK * * SBERR EQU * LDK A1,PLSERR RET CODE := SW ERROR SBERR2 EQU * LDK A2,0 RESET DEVICE STATUS ABL NDREP RETURN TO DEVICE DRIVER * EJECT * ************************************************************ * * ROUTINE NAME: * PLCHRO * * FUNCTION: * THIS ROUTINE WRITES ONE CHARACTER TO OUTPUT BUFFER. * * CALL: * ABI OUPTAB,A1 * CF A5,PLCHRO * * INPUT: * A2 = BITS 0-7 IRRELEVANT * BITS 8-15 CHARACTER * A6 = DWT ADDRESS * * OUTPUT: * AT RETURN TO DEVICE DRIVER * A1 = RETURN CODE * 0 IF OK * NOT 0 IF ERROR * A2 = DEVICE STATUS (IF RELEVANT, IE A1=0) * CR = CONTENTS OF A1 * INTERR. ENABLED * ************************************************************ * PLCHRO EQU * PRCHRO EQU * ENB * EJECT * STR A4,A15 PUSH A4 LD A4,DWTLD1,A6 BUFFER ADDRESS RF(Z) COERR2 ERROR IF NO BUFFER CF A15,PLPUCH PUT CHARACTER IN BUFFER LDR A1,A1 CHECK RETURN CODE RF(NZ) COERR1 ERROR IF BUFFER FULL LD A2,BUFBIX,A4 BUFFER INDEX =16 * LDR* A4,A15 POP A4 * RETURN DIRECTLY INSTEAD OF THROUGH NDRETO TO GET * FASTER PROCESSING. CWK A2,LOBUFL+3 BUFFER FULL? =16 RF(NE) OP100 NO =16 LD A2,DWTCHP,A6 CHANNEL PARAMETER =16 ANK A2,CHABLO CHANGED BLOCKING? =16 RF(NZ) EB050 YES SEND BUFFER =16 OP100 EQU * . =16 ENB ADK A5,4 ADJUST STACK LDR A2,A1 DEVICE STATUS & RET CODE := OK ABR* A5 RETURN TO DEVICE DRIVER * * COERR1 EQU * CF A15,PLRLBU RELEASE BUFFER CM DWTLD1,A6 INDICATE NO BUFFER COERR2 EQU * LDR* A4,A15 POP A4 LDK A1,PLSERR RET CODE := SW ERROR ABL NDRET RETURN TO DEVICE DRIVER * EJECT * ************************************************************ * * ROUTINE NAME: * PLENBL * * FUNCTION: * THIS ROUTINE DEFINES END OF OUTPUT BLOCK. * IT SENDS THE BLOCK TO PLC AND WAITS FOR * ACKNOWLEDGE. * * CALL: * ABI ENBTAB,A1 * CF A5,PLENBL * * INPUT: * A6 = DWT ADDRESS * * OUTPUT: * AT RETURN TO DEVICE DRIVER * A1 = RETURN CODE * 0 IF OK * NOT 0 IF ERROR * A2 = DEVICE STATUS (IF RELEVANT, IE A1=0) * CR = CONTENTS OF A1 * INTERR. ENABLED * ************************************************************ * PLENBL EQU * PRENBL EQU * LDK A1,0 SET RETURN CODE OK =16 LD A2,DWTWAT,A6 GET WAIT/ACT INDICATOR =16 SUK A2,1 . =16 RF(Z) EB040 . =16 LDKL A2,/FFFF-CHABLO RESET CHANGED BLOCKING =16 ANS A2,DWTCHP,A6 . =16 EB040 EQU * . =16 LD A2,DWTCHP,A6 CHANNEL PARAMETER =16 ANK A2,CHABLO CHANGED BLOCKING =16 RB(NZ) OP100 YES, RETURN =16 EB050 EQU * . =16 ENB CF A15,NDSAV8 SAVE A3-A5, A7-A8 IN DWT CF A15,GETCWT A5 := CWT ADDRESS * EJECT * LDK A1,PLSERR SET RET CODE JUST IN CASE LD A2,DWTLD1,A6 BUFFER ADDRESS ABL(Z) NDREPO ERROR IF NO BUFFER. RETURN =16 CF A15,GETLCS A1 := STATUS & INH RF(NZ) EBERR1 RETURN IF ERROR * LDR A3,A6 DWT ADDRESS ADKL A3,DWTOTQ QUEUE POINTER CF A15,PLCCCS RESERVE CCA CM DWTOTQ,A6 RESET QUEUE ELEMENT POINTER LDR A1,A1 RETURN CODE RF(NZ) EBERR1 RETURN IF ERROR * * WRITE PARAMETERS IN CCA AND X25 HEADER ENB LD A4,DWTLD1,A6 BUFFER ADDRESS ST A4,CWTCCA+CCRBUF,A5 TO CCA CM CWTCCA+CCRC1B,A5 RESET DATA CHAINING & MSB OF ADDR LDK A3,CMDFW ASSUME FAST WRITE LD A2,DWTST,A6 DEVICE STATUS LDR A7,A2 SAVE ANKL A7,DWFECH ECHO OUTPUT? RF(NZ) EB090 YES, USE TYPE 1 LDK A3,CMDSW NOT ECHO, USE STANDARD WRITE ANK A2,DWFTY1 ONLY TYPE 1 ALLOWED? RF(Z) EB100 NO, USE TYPE 2 * EJECT * EB090 EQU * * NO FLOW CONTROL CF A15,WRADR1 WRITE LINE ADDRESS. NO FLOW C LDK A2,TYNFLO MESSAGE TYPE := NO FLOW CONTROL RF EB110 CONTINUE * EB100 EQU * * FLOW CONTROL CF A15,WRADR2 WRITE LINE ADDRESS. FLOW CTRL CF A15,FWOPSR FETCH AND UPDATE FLOW CONTROL SC A2,X25FLW,A4 P(R) & P(S) TO PACKET LDK A2,TYDATA MESSAGE TYPE := NORMAL DATA * EB110 EQU * SC A2,CWTCCA+CCRIDB,A5 MESSAGE TYPE TO CCA SC A3,CWTCCA+CCRCMD,A5 COMMAND TO CCA ST A6,CWTCCA+CCRIDW,A5 DWT ADDRESS TO CCA LD A3,BUFBIX,A4 BYTE INDEX ST A3,CWTCCA+CCRLEN,A5 BUFFER LENGTH TO CCA * CF A15,GETLCS A1 := STATUS & INH RF(NZ) EBERR2 RETURN IF ERROR CF A15,PLCCIO EXECUTE CIO START RF(NZ) EBERR1 HANDLE ERROR ABL PLDSP2 LOCAL DISPATCHER * EJECT * * ENTRY TO ACKRST IS MADE WHEN I/O OPERATION * IS COMPLETED. * REGISTER CONTENTS ON ENTRY: * A1 = RETURN CODE * A5 = CWT ADDRESS * A6 = DWT ADDRESS * A7 = MESSAGE TYPE * ACKRST EQU * LDK A2,0 RESET DEVICE STATUS LDR A1,A1 ANY ERROR? RF(NZ) EB130 YES, RETURN * LD A3,DWTST,A6 DWT STATUS LDR A4,A3 ANK A4,DWFRES RESET PACKET RECIEVED? RF(Z) EB120 NO LDK A1,LINERR YES. RET CODE := LINK RESET RF EB130 RETURN * EB120 EQU * CWK A7,TYNFLO PACKET WITH NO FLOW CONTROL? RF(E) EB130 YES, RETURN ANK A3,DWFSAC WAIT FOR LEVEL 3 ACK? RF(Z) EB130 NO, RETURN * LDK A3,DWFAK3 FLAG "WAITING FOR LEVEL 3 ACK" ORS A3,DWTST,A6 SET FLAG IN DWT STATUS ABL PLDSP2 LOCAL DISPATCHER * EJECT * * ENTRY IS MADE HERE WHEN ACK ON LEVEL 3 HAVE BEEN RECIEVED * REGISTER CONTENTS ON ENTRY: * A1 = RETURN CODE * A2 = DEVICE STATUS (IF RELEVANT, IE A1=0) * A5 = CWT ADDRESS * A6 = DWT ADDRESS * AK3RST EQU * * EB130 EQU * * LD A2,DWTCHP,A6 CHANNEL PARAMETER =16 ANK A2,CHABLO CHANGED BLOCKING? =16 ABL(NZ) SB050 YES, START NEW BLOCK =16 ABL NDREP RETURN TO DEVICE DRIVER * * * EBERR2 EQU * CM CWTCCB,A5 SET CCA FREE EBERR1 EQU * LD A4,DWTLD1,A6 OUTPUT BUFFER ADDRESS CF A15,PLRLBU RELEASE BUFFER CM DWTLD1,A6 INDICATE NO BUFFER CM DWTLD2,A6 RESET FLOW CONTROL ABL NDREP RETURN TO DEVICE DRIVER * EJECT * ************************************************************ * * ROUTINE NAME: * PLTEST * * FUNCTION: * THIS ROUTINE HANDLES TEST COMMANDS FOR PLC. * THE TEST COMMANDS ARE GENERATED BY A TEST * COMMAND "DRIVER" WITH AN INTERFACE SIMILAR TO * THAT OF THE NORMAL TERMINAL DEVICE DRIVERS. * CALL IS MADE DIRECTLY TO THE PLC DRIVER, AND * NOT THROUGH THE TERMINAL NETWORK DISTRIBUTOR, * AS THIS FUNCTION IS NOT AVAILABLE FOR OTHER * LINE DRIVERS. * * CALL: * CF A5,PLTEST * * INPUT: * A6 = DWT ADDRESS * * OUTPUT: * AT RETURN TO DEVICE DRIVER * A1 = RETURN CODE * 0 IF OK * NOT 0 IF ERROR * A2 = CHANGED * CR = CONTENTS OF A1 * INTERR. ENABLED * ************************************************************ * EJECT * PLTEST EQU * IFT PLCTST=1 CF A15,NDSAV8 SAVE A3-A5, A7-A8 IN DWT CF A15,GETCWT A5 := CWT ADDRESS CF A15,PLCCCA RESERVE CCA * ENB ST A6,CWTCCA+CCRIDW,A5 DWT ADDRESS TO CCA CM CWTCCA+CCRC1B,A5 DATA CHAINING & MSB OF BUFFER ADDR LD A4,DWTTBU,A6 USER REQUEST BUFFER ADDRESS ST A4,CWTCCA+CCRBUF,A5 TO CCA LD A2,DWTTLN,A6 USER REQUEST BUFFER LENGTH ST A2,CWTCCA+CCRLEN,A5 LENGTH TO CCA LD A3,DWTTCW,A6 USER REQUEST CONTROL WORD * * DETERMINE TYPE OF TEST ORDER LC A1,DWTOR+1,A6 USER REQUEST ORDER CODE ANK A1,/3F CLEAN CWK A1,ORDPS GET LINE STATISTICS? RF(E) TE100 YES, HANDLE CWK A1,ORDDS GET DLS STATISTICS? RF(E) TE110 YES, HANDLE CWK A1,ORDRM READ LOCAL MEMORY? RF(NE) TEERR2 NO, COMMAND NOT DEFINED. ERROR * * READ LOCAL MEMORY ST A3,CWTCCA+CCRSUB,A5 PLC MEMORY ADDRESS TO CCA LDK A3,CMDRM PLC COMMAND READ LOCAL MEMORY RF TE120 TO COMMON PART * TE100 EQU * * GET LINE STATISTICS SC A3,CWTCCA+CCRSU1,A5 STORE LINE NUMBER (0-3) =12 LDK A3,CMDPS PLC COMMAND GET LINE STATISTICS RF TE120 TO COMMON PART * TE110 EQU * * GET DLS STATISTICS LC A3,DWTCP2,A6 CHANNEL PARAMETER ANK A3,MASKWS CLEAN WS NUMBER SLL A3,8 TO LEFT BYTE ADK A3,CMDDS PLC COMMAND GET DLS STATISTICS * TE120 EQU * ST A3,CWTCCA+CCRDLS,A5 DLS INDEX & COMMAND TO CCA * CF A15,PLCCIO EXECUTE CIO START RF(NZ) TEERR1 ERROR. HANDLE ABL PLDSP2 LOCAL DISPATCER. WAIT * * * ENTRY IS MADE TO TSTRST WHEN COMMAND IS COMPLETED. * REGISTER CONTENTS ON ENTRY: * A1 = RETURN CODE * A5 = CWT ADDRESS * A6 = DWT ADDRESS * TSTRST EQU * ABL NDREP RETURN TO DEVICE DRIVER * * TEERR2 EQU * CM CWTCCB,A5 INDICATE CCA FREE LDK A1,PLSERR RET CODE := SW ERROR TEERR1 EQU * ABL NDREP RETURN TO DEVICE DRIVER XIF * EJECT * ********************** * INTERRUPT ROUTINES * ********************** * * THIS SECTION CONTAINS INTERRUPT HANDLING ROUTINES. * IT IS ENTERED IMMEDIATELY AT A RELEASE, * ATTENTION OR I/O COMPLETION INTERRUPT. * ALL ROUTINES ARE EXECUTED * ON INTERRUPT PRIORITY. AFTER PROCESSING, EXIT IS * MADE EITHER TO SOME ROUTINE WAITING FOR THE INTERRUPT, * TO THE LOCAL PLC DISPATCHER OR TO TOSS DISPATCHER. * ON EXIT, A15 STACK CONTAINS INTERRUPT RETURN AND * A1-A8. * * * ROUTINES IN ORDER OF APPEARANCE IN CODE: * * NAME FUNCTION * * IHPL INTERRUPT ENTRY * PLIHR HANDLE RELEASE INTERRUPT * PLIHA HANDLE ATTENTION INTERRUPT * PLIHC HANDLE I/O COMPLETION INTERRUPT * COMPSTA HANDLE COMPLETION OF START COMMANDS * (TEST CU, OPEN LINE, OPEN DLS) * COMPTEST HANDLE COMPLETION OF TEST COMMANDS * (PLC STATISTICS, DLS STAT., READ LOCAL MEMORY) * COMPWRI HANDLE COMPLETION OF WRITE COMMANDS * COMPGR HANDLE COMPLETION OF GENERAL READ COMMANDS * GRERR HANDLE ERRORS AT GENERAL READ * GRSACK HANDLE STATUS AND RR MESSAGE FROM DEVICE * GRDATA HANDLE DATA INPUT FROM DEVICE * GRRES HANDLE RESET MESSAGE FROM SECONDARY * EJECT * ************************************************************ * * ROUTINE NAME: * IHPL * * FUNCTION: * THIS ROUTINE CONTAINS INTERRUPT ENTRIES FOR * ALL PLC:S INCLUDED. IT SAVES A1-A8, SETS CWT * ADDRESS AND EXITS TO RELEASE OR I/O COMPLETION * INTERRUPT HANDLER. * * CALL: * HARDWARE INTERRUPT * * INPUT: * A15 = SYSTEM STACK POINTER * INTERR. INHIBITED * MODE SYSTEM * * OUTPUT: * A5 = CWT ADDRESS * ************************************************************ * IHPL01 EQU * IFF PLCNRL=0 U =5 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF IFF PLCNRL=0 U =5 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF * IFF PLCNRL=0 U =5 LDKL A5,PL0CWT CWT ADDRESS, PLC 0 RF IHPL COMMON PART, ALL PLC:S XIF * EJECT * IHPL02 EQU * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF * IFF PLCNRL=0 U =5 IFF PLCNRL=1 LDKL A5,PL1CWT CWT ADDRESS, PLC 1 RF IHPL COMMON PART, ALL PLC:S XIF * IHPL03 EQU * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFF PLCNRL=2 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFF PLCNRL=2 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFF PLCNRL=2 LDKL A5,PL2CWT CWT ADDRESS, PLC 2 RF IHPL COMMON PART, ALL PLC:S XIF * IHPL04 EQU * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFF PLCNRL=2 IFF PLCNRL=3 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFF PLCNRL=2 IFF PLCNRL=3 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF * IFF PLCNRL=0 U =5 IFF PLCNRL=1 IFF PLCNRL=2 IFF PLCNRL=3 LDKL A5,PL3CWT CWT ADDRESS, PLC 3 RF IHPL COMMON PART, ALL PLC:S XIF * IHPR01 EQU * IFF PLCNRR=0 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF IFF PLCNRR=0 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF IFF PLCNRR=0 LDKL A5,PR1CWT CWTADDRESS PLC 1 REMOTE RF IHPL COMMON PART ALL CWT:S XIF IHPR02 EQU * IFF PLCNRR=0 IFF PLCNRR=1 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF IFF PLCNRR=0 IFF PLCNRR=1 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF IFF PLCNRR=0 IFF PLCNRR=1 LDKL A5,PR2CWT CWTADDRESS PLC 2 REMOTE RF IHPL COMMON PART ALL CWT:S XIF IHPR03 EQU * IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 LDKL A5,PR3CWT CWTADDRESS PLC 3 REMOTE RF IHPL COMMON PART ALL PLC:S XIF IHPR04 EQU * IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFF PLCNRR=3 IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 IFF PLCNRR=3 IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF IFF PLCNRR=0 IFF PLCNRR=1 IFF PLCNRR=2 U =9 IFF PLCNRR=3 U =9 LDKL A5,PR4CWT CWTADDRESS PLC 4 REMOTE RF IHPL COMMON PART ALL CWT:S XIF EJECT * IHPL EQU * ST P,INTSAV SAVE LATEST INTERRUPT LDK A1,0 RESET HIGH BYTE LC A1,CWTCID+CIDINT,A5 INTERRUPT SOURCE CWK A1,/40 RELEASE? RF(E) PLIHR YES, HANDLE CWK A1,/20 I/O COMPLETION? RF(E) PLIHC YES, HANDLE CWK A1,/80 ATTENTION? RF(E) PLIHA YES, HANDLE * CF A15,PLCNOP ILLEGAL CODE, SET NOT OPERABLE ABL TDISP EXIT * EJECT * ************************************************************ * * ROUTINE NAME: * PLIHR * * FUNCTION: * THIS ROUTINE HANDLES RELEASE INTERRUPTS. * IT RESETS THE INTERRUPT, AND IF ANOTHER * PROCESS IS WAITING FOR THE CCA, RETURN * IS MADE TO CCA ALLOCATION ROUTINE. * * CALL: * RF PLIHR * * INPUT: * A5 = CWT ADDRESS * * OUTPUT: * IF PROCESS WAITING * A4 = BLOCK ADDRESS OF WAITING PROCESS * A5 = CWT ADDRESS * ************************************************************ * PLIHR EQU * EX CWTST3,A5 RESET INTERRUPT LD A4,CWTCCQ,A5 PROCESS WAITING FOR CCA? ABL(NZ) CCARST YES, ACTIVATE PROCESS CM CWTCCB,A5 NO, SET CCA FREE ABL TDISP EXIT * EJECT * ************************************************************ * * ROUTINE NAME: * PLIHA * * FUNCTION: * THIS ROUTINE HANDLES ATTENTION INTERRUPTS. IF * ERROR, IT SETS AN ERROR CODE AND STARTS ABORT * OF ALL CALLS. IF COMMUNICATION REESTABLISHED, * IT STARTS RECOVERY. * * CALL: * RF PLIHA * * INPUT: * A5 = CWT ADDRESS * * OUTPUT: * A5 = CWT ADDRESS * A6 = WS NUMBER * ************************************************************ * PLIHA EQU * LD A1,CWTRCA+CCRSTA,A5 PLC STATUS ST A1,CWTPLS,A5 SAVE FOR TESTING IFF UTTEST=0 CF A15,LOGATT LOG RCA XIF LC A6,CWTRCA+CCRDLS,A5 WS NUMBER ANK A6,MASKWS CLEAN EX CWTST3,A5 RELEASE RCA * EJECT * LDKL A2,/FFFF-STACOM-STAERR * MASK FOR ALLOWED ERRORS ANR A2,A1 FATAL ERROR? RF(Z) IA100 NO, CONTINUE CF A15,PLCNOP SET PLC NOT OPERABLE ABL TDISP EXIT * IA100 EQU * LDR A2,A1 STATUS ANK A2,STACOM COMMUNICATION REESTABLISHED? ABL(NZ) PLREWS YES, START RECOVERY OF WS * LDR A2,A6 WS NUMBER CF A15,STAHAN HANDLE ERROR STATUS ABL PLDSP2 LOCAL DISPATCHER * EJECT * ************************************************************ * * ROUTINE NAME: * PLIHC * * FUNCTION: * THIS ROUTINE HANDLES I/O COMPLETION INTERRUPTS. * IT CHECKS WHICH COMMAND THAT HAS BEEN COMPLETED, * AND EXITS TO CORRESPONDING COMMAND HANDLER. * * CALL: * RF PLIHC * * INPUT: * A5 = CWT ADDRESS * * OUTPUT: * A1 = PLC STATUS * A2 = FATAL PLC STATUS * A5 = CWT ADDRESS * A6 = USER PARAMETER * ************************************************************ * PLIHC EQU * LD A1,CWTRCA+CCRSTA,A5 PLC STATUS ST A1,CWTPLS,A5 SAVE FOR TESTING IFF UTTEST=0 CF A15,LOGIOC LOG CCR XIF ANKL A1,/FFFF-STAPOL-STALER * RESET POLL STOP & LINK ERROR LD A6,CWTRCA+CCRIDW,A5 USER PARAMETER (DWT, DLS OR ...) LC A2,CWTRCA+CCRCMD,A5 COMMAND * EJECT * LDK A3,CMDTBL COMMAND TABLE LENGTH IC100 EQU * * SCAN TABLE TO FIND MATCHING COMMAND SUK A3,CMDTB1 DECREMENT INDEX RF(N) IC120 END OF TABLE. ERROR CC A2,CMDTAB+1,A3 COMMAND FOUND? RB(NE) IC100 NO, CONTINUE * C1 A2,CMDTAB+4,A3 MASK FOR ALLOWED ERRORS ANR A2,A1 FATAL ERROR? RF(Z) IC110 NO, CONTINUE CF A15,PLCNOP SET PLC NOT OPERABLE IC110 EQU * ABI CMDTAB+2,A3 CALL COMMAND HANDLING ROUTINE * IC120 EQU * EX CWTST3,A5 RELEASE RCA CF A15,PLCNOP SET PLC NOT OPERABLE ABL PLDSP2 LOCAL DISPATCHER * EJECT * ************************************************************ * * ROUTINE NAME: * COMPSTA * * FUNCTION: * THESE ROUTINES HANDLE COMPLETION OF TEST CU, * OPEN LINE AND OPEN DLS COMMANDS. * THEY CHECK THE RETURN CODE AND EXIT TO THE * ROUTINE THAT MADE THE I/O CALL. * * CALL: * ABI CMDROU,A3 * * INPUT: * A1 = PLC STATUS * A2 = FATAL PLC STATUS * A5 = CWT ADDRESS * A6 = PARAMETER (IF RELEVANT) * * OUTPUT: * A1 = PLC STATUS * A2 = FATAL PLC STATUS * A5 = CWT ADDRESS * A6 = DLS INDEX (IF EXIT TO ODLRST) * ************************************************************ * COMPTC EQU * EX CWTST3,A5 RELEASE RCA ABL TCURST RETURN TO ROUTINE MAKING I/O CALL * EJECT * * * OPEN LINE, COMPLETION * COMPOP EQU * EX CWTST3,A5 RELEASE RCA ABL OPLRST RETURN TO ROUTINE MAKING I/O CALL * * * OPEN DLS, COMPLETION * COMPOD EQU * EX CWTST3,A5 RELEASE RCA LDR A2,A2 FATAL STATUS? RF(NZ) CD100 YES, SKIP STATUS CHECK * LDR A2,A6 WS NUMBER CF A15,STAHAN HANDLE PLC STATUS LDK A2,0 CLEAR FATAL STATUS FLAGS * CD100 EQU * ABL ODLRST RETURN TO ROUTINE MAKING I/O CALL * EJECT * ************************************************************ * * ROUTINE NAME: * COMPTEST * * FUNCTION: * THIS ROUTINE HANDLES COMPLETION OF GET LINE * STATISTICS, GET DLS STATISTICS AND READ LOCAL * MEMORY COMMANDS. * IT CHECKS THE PLC STATUS, SETS EFFECTIVE * LENGTH IN DWT AND EXITS TO THE ROUTINE THAT * MADE THE I/O CALL. * * CALL: * ABI CMDROU,A3 * * INPUT: * A1 = PLC STATUS * A5 = CWT ADDRESS * A6 = DWT ADDRESS * * OUTPUT: * A1 = RETURN CODE * A5 = CWT ADDRESS * A6 = DWT ADDRESS * ************************************************************ * IFT PLCTST=1 COMPPS EQU * COMPDS EQU * COMPRM EQU * * EJECT * LDR A1,A1 PLC STATUS RF(NZ) TS100 ERROR. HANDLE * LD A2,CWTRCA+CCRLEN,A5 EFFECTIVE LENGTH ST A2,DWTTLN,A6 TO DWT RF TS110 EXIT. A1 = 0 * TS100 EQU * LDK A1,NOTOPR RETURN CODE := NOT OPERABLE CM DWTTLN,A6 EFFECTIVE LENGTH := 0 * TS110 EQU * EX CWTST3,A5 RELEASE RCA ABL TSTRST RETURN TO ROUTINE MAKING I/O CALL XIF * EJECT * ************************************************************ * * ROUTINE NAME: * COMPWRI * * FUNCTION: * THIS ROUTINE HANDLES COMPLETION OF STANDARD * WRITE AND FAST WRITE. * IT CHECKS THE PLC STATUS AND RELEASES THE OUTPUT * BUFFER, IF ANY WAS ALLOCATED. IF THE OUTPUT * OPERATION IS FINISHED, IT THEN EXITS TO THE * ROUTINE THAT MADE THE I/O CALL. * * CALL: * ABI CMDROU,A3 * * INPUT: * A1 = PLC STATUS * A2 = FATAL PLC STATUS * A5 = CWT ADDRESS * A6 = DWT ADDRESS * * OUTPUT: * WHEN RETURN TO ROUTINE MAKING OUTPUT CALL * A1 = RETURN CODE * A2 = BITS 0-7 ZERO * BITS 8-15 DEVICE STATUS * A5 = CWT ADDRESS * A6 = DWT ADDRESS * ************************************************************ * EJECT * COMPSW EQU * COMPFW EQU * LDR A2,A2 FATAL PLC STATUS? RF(NZ) WRERR1 YES, HANDLE * LC A2,DWTCP2,A6 CHANEL PARAMETER ANK A2,MASKWS CLEAN WS NUMBER CF A15,STAHAN HANDLE PLC STATUS LC A7,CWTRCA+CCRIDB,A5 TYPE OF WRITE COMMAND ANK A7,/FF CLEAN LD A4,CWTRCA+CCRBUF,A5 BUFFER ADDRESS EX CWTST3,A5 RELEASE RCA ABI WRIROU,A7 CALL CORRESPONDING ROUTINE * * * IRRECOVERABLE ERROR * WRERR1 EQU * EX CWTST3,A5 RELEASE RCA WRERR EQU * ABL PLDSP2 EXIT * * * COMPLETION OF DATA MESSAGE OUTPUT * WRNFLO EQU * WRDATA EQU * CF A15,PLRLBU RELEASE OUTPUT BUFFER CM DWTLD1,A6 INDICATE NO BUFFER ABL ACKRST RETURN TO REQUEST HANDLER * * * COMPLETION OF RECIEVE READY MESSAGE OUTPUT * WRRR EQU * SUK A4,2 START OF MONITOR BLOCK LDR A7,A5 CWT ADDRESS ADK A7,CWTMBQ MONITOR BLOCK QUEUE HEAD CF A15,LNKOUT REMOVE FROM QUEUE CF A15,FREBLK RETURN BLOCK * ABL PLDSP2 EXIT * * * COMPLETION OF RESET CONFIRMATION MESSAGE OUTPUT * WRRESC EQU * SUK A4,2 START OF MONITOR BLOCK LDR A7,A5 CWT ADDRESS ADK A7,CWTMBQ MONITOR BLOCK QUEUE HEAD CF A15,LNKOUT REMOVE FROM QUEUE CF A15,FREBLK RETURN BLOCK * LDKL A2,/FFFF-DWFRES MASK FOR RESET FLAG ANS A2,DWTST,A6 CLEAR "RESET" FLAG LDK A4,RELINE RECOVERY CAUSE := LINK RESET CF A15,NDREDW CALL RECOVERY FOR DWT ABL PLDSP2 LOCAL DISPATCHER * EJECT * ************************************************************ * * ROUTINE NAME: * COMPGR * * FUNCTION: * THIS ROUTINE HANDLES COMPLETION OF GENERAL * READ COMMANDS. * IT CHECKS TYPE OF MESSAGE AND CALLS * CORRESPONDING ROUTINE. * * CALL: * ABI CMDROU,A3 * * INPUT: * A1 = PLC STATUS * A2 = FATAL PLC STATUS * A5 = CWT ADDRESS * * OUTPUT: * A1 = PLC STATUS * A4 = BUFFER ADDRESS * A5 = CWT ADDRESS * A6 = DLS INDEX * A7 = DEVICE ADDRESS (IF RELEVANT) * ************************************************************ * COMPGR EQU * LDR A2,A2 FATAL STATUS? RF(NZ) GRERR2 YES, EXIT * EJECT * CF A15,INTYPE A3 := TYPE OF MESSAGE LD A4,CWTRCA+CCRBUF,A5 BUFFER ADDRESS LC A6,CWTRCA+CCRDLS,A5 DLS INDEX ANK A6,MASKWS CLEAN LC A7,X25LCN,A4 DEVICE ADDRESS ANK A7,MASKLC CLEAN * ABI REAROU,A3 ROUTINE FOR THIS MESSAGE TYPE * EJECT * ************************************************************ * * ROUTINE NAME: * GRERR * * FUNCTION: * THIS ROUTINE HANDLES ILLEGAL INPUT MESSAGES. * GRERR1 RETURNS BUFFER * * CALL: * ABI REAROU,A3 * RB GRERR1 * RF GRERR2 * * INPUT: * A4 = BUFFER ADDRESS (IF GRERR1) * A5 = CWT ADDRESS * * OUTPUT: * - * ************************************************************ * GRERR1 EQU * CF A15,PLRLBU RELEASE GENERAL READ BUFFER * GRERR2 EQU * EX CWTST3,A5 RELEASE RCA * ABL PLDSP2 EXIT * EJECT * ************************************************************ * * ROUTINE NAME: * GRSACK * * FUNCTION: * THIS ROUTINE HANDLES STATUS AND RECIEVE READY * MESSAGES FROM A DEVICE. * IT RELEASES THE BUFFER AND RETURNS TO ROUTINE * MAKING I/O CALL. * * CALL: * ABI REAROU,A3 * * INPUT: * A4 = BUFFER ADDRESS * A5 = CWT ADDRESS * A6 = DLS INDEX * A7 = DEVICE ADDRESS * * OUTPUT: * A1 = RETURN CODE * =0 IF OK * ><0 IF ERROR * A2 = BITS 0-7 ZERO * BITS 8-15 DEVICE STATUS * A5 = CWT ADDRESS * A6 = DWT ADDRESS * ************************************************************ * EJECT * GRSTAT EQU * CF A15,GETDWT A6 := DWT ADDRESS RB(Z) GRERR1 NO DWT DEFINED CF A15,FWIPSR UPDATE FLOW CONTROL COUNTERS LC A2,X25DAT,A4 DEVICE STATUS BYTE ANK A2,/FF CLEAN RF SR100 COMMON PART * * GRRR EQU * CF A15,GETDWT A6 := DWT ADDRESS RB(Z) GRERR1 NO DWT DEFINED CF A15,FWIPR UPDATE FLOW CONTROL COUNTERS LDK A2,0 RESET DEVICE STATUS BYTE * * SR100 EQU * * COMMON PART FOR DEVICE STATUS AND RECIEVE READY MESSAGES EX CWTST3,A5 RELEASE RCA CF A15,PLRLBU RELEASE GENERAL READ BUFFER LD A3,DWTST,A6 DWT STATUS LDR A4,A3 ANK A4,DWFAK3 ANYONE WAITING FOR THIS MESSAGE? ABL(Z) PLDSP2 NO, DISPATCH * XRS A4,DWTST,A6 RESET WAIT FLAG LDK A1,0 RETURN CODE := OK ANK A3,DWFSAC ALWAYS WAIT FOR LEVEL 3 ACK? ABL(NZ) AK3RST YES, RETURN WITH ACK 3 ABL WINRST NO, RETURN TO WINDOW QUEUE * EJECT * ************************************************************ * * ROUTINE NAME: * GRDATA * * FUNCTION: * THIS ROUTINE HANDLES DATA INPUT MESSAGES. * IT LINKS THE BUFFER TO THE CWT. * * CALL: * ABI REAROU,A3 * * INPUT: * A4 = BUFFER ADDRESS * A5 = CWT ADDRESS * A6 = DLS INDEX * A7 = DEVICE ADDRESS * * OUTPUT: * - * ************************************************************ * GRDATA EQU * CF A15,GETDWT A6 := DWT ADDRESS RB(Z) GRERR1 NO DWT DEFINED * CF A15,FWIPSR UPDATE FLOW CONTROL COUNTERS ST A4,CWTBUF,A5 SAVE INPUT DATA BUFFER ADDRESS ST A6,BUFDWT,A4 SAVE DWT ADDRESS IN BUFFER LD A2,CWTRCA+CCRLEN,A5 EFFECTIVE LENGTH ST A2,BUFLEN,A4 SAVE IN BUFFER LDK A2,X25DAT START OF USER DATA ST A2,BUFBIX,A4 TO BYTE INDEX * EJECT * EX CWTST3,A5 RELEASE RCA ABL PLDSP2 EXIT * EJECT * ************************************************************ * * ROUTINE NAME: * GRRES * * FUNCTION: * THIS ROUTINE HANDLES RESET MESSAGES FROM THE * SECONDARY. * IT RESETS THE FLOW CONTROL COUNTERS IN THE DWT, * AND SETS A RESET PACKET FLAG IN THE DWT. THEN A * RESET CONFIRMATION MESSAGE IS SENT. IF THE * PROCESS IS WAITING FOR LEVEL 3 ACK OR IN A BUFFER * QUEUE IT IS ABORTED. * * CALL: * ABI REAROU,A3 * * INPUT: * A4 = BUFFER ADDRESS * A5 = CWT ADDRESS * A6 = DLS INDEX * A7 = DEVICE ADDRESS * * OUTPUT: * - * ************************************************************ * GRRES EQU * CF A15,GETDWT A6 := DWT ADDRESS RB(Z) GRERR1 NO DWT DEFINED * EJECT * EX CWTST3,A5 RELEASE RCA CF A15,PLRLBU RELEASE GENERAL READ BUFFER CM DWTLD2,A6 RESET FLOW CONTROL COUNTERS * LD A2,DWTST,A6 DWT STATUS ANK A2,DWFRES RESET ALREADY RECIEVED? ABL(NZ) PLDSP2 YES, EXIT LDK A2,DWFRES ORS A2,DWTST,A6 INDICATE RESET RECIEVED * CF A15,PLCCCA RESERVE PLC CCA ENB * CF A15,GETBLK GET OUTPUT BUFFER LDR A7,A5 CWT ADDRESS ADK A7,CWTMBQ MONITOR BLOCK QUEUE HEAD CF A15,LNKFST PUT BLOCK IN QUEUE (FOR RECOVERY) ADK A4,2 SKIP QUEUE LINK ST A4,CWTCCA+CCRBUF,A5 BUFFER ADDR TO CCA CM CWTCCA+CCRC1B,A5 RESET DATA CHAINING & MSB OF ADDR CF A15,WRADR2 WRITE ADDRESS IN CCA (TYPE 2) LDK A2,CMDSW COMMAND CODE "STANDARD WRITE" SC A2,CWTCCA+CCRCMD,A5 TO CCA LDK A2,/1F MESSAGE TYPE FLAGS SC A2,X25FLW,A4 TO OUTPUT BUFFER LDK A2,TYRESC TYPE "RESET CONFIRMATION" SC A2,CWTCCA+CCRIDB,A5 TO CCA, COMMAND ID ST A6,CWTCCA+CCRIDW,A5 DWT ADDRESS TO CCA, COMMAND ID LDK A2,X25DAT LENGTH OF SYSTEM PART ST A2,CWTCCA+CCRLEN,A5 TO CCA LENGTH * EJECT * LD A2,DWTST,A6 DWT STATUS ANK A2,DWFRES RESET STILL WANTED? RF(Z) REERR1 NO, EXIT CF A15,GETWSS A1 := STATUS & INH RF(NZ) REERR1 EXIT IF ERROR CF A15,PLCCIO EXECUTE CIO START RF(NZ) REERR2 EXIT IF ERROR * LDK A1,LINERR RET CODE := LINK ERROR LD A2,DWTST,A6 DWT STATUS LDR A3,A2 ANK A2,DWFAK3 WAITING FOR LEVEL 3 ACK? RF(Z) RE100 NO, CONTINUE XRS A2,DWTST,A6 RESET ACK3 FLAG ANK A3,DWFSAC ALWAYS WAIT FOR LEVEL 3 ACK? ABL(NZ) AK3RST YES, RETURN WITH ACK 3 ABL WINRST NO, RETURN TO WINDOW QUEUE * RE100 EQU * CF A15,OUTBUQ REMOVE DWT FROM BUFFER QUEUE LDR A2,A2 FOUND? ABL(NZ) BUFRST YES, RETURN WITH ERROR CODE * ABL PLDSP2 LOCAL DISPATCHER * * REERR1 EQU * CM CWTCCB,A5 SET CCA FREE REERR2 EQU * * ERROR. RETURN MONITOR BLOCK IMMEDIATELY SUK A4,2 START ADDRESS OF MONITOR BLOCK CF A15,LNKOUT REMOVE FROM QUEUE. A7 ALREADY SET CF A15,FREBLK RETURN MONITOR BLOCK ABL PLDSP2 LOCAL DISPATCHER * EJECT * ********************* * RECOVERY ROUTINES * ********************* * * THESE ROUTINES ARE USED AT SYSTEM START OR TC POWER * UP. IN CASE OF POWER UP, THEY FIRST REMOVE ALL RUNNING * OUTPUT OPERATIONS. AFTER THAT, THE PLC IS STARTED, * AND LAST RECOVERY ROUTINES IN DEVICE DRIVERS ARE * CALLED FOR ALL DWT:S. * THE SECTION ALSO CONTAINS ROUTINES FOR RECOVERY * OF I/O ERRORS. * * * ROUTINES IN ORDER OF APPEARANCE IN CODE: * * NAME FUNCTION * * PLON CALL RECOVERY ONCE FOR EACH PLC CHANNEL UNIT * PLSTRT START PLC AND CALL DEVICE RECOVERY * EJECT * ************************************************************ * * ROUTINE NAME: * PLON * * FUNCTION: * THIS ROUTINE WILL ACTIVATE A MONITOR JOB * FOR THE PLC RECOVERY, IF THE JOB NOT ALREADY * IS PENDING. * THE MONITOR JOB WILL CALL THE RECOVERY ROUTINE ONCE * FOR EACH PLC DEFINED. * * CALL: * CF A15,PLON * * INPUT: * - * * OUTPUT: * AT ENTRY TO PLSTRT: * A5 = CWT ADDRESS * ************************************************************ * PLON EQU * LD A1,PLCPFP POWER UP PENDING? RF(NZ) PO100 YES, EXIT IM PLCPFP INDICATE POWER UP STARTED * LDKL A2,PO110 START ADDRESS CF A15,QMJOB ACTIVATE MONITOR JOB * PO100 EQU * RTN A15 * EJECT * PO110 EQU * CM PLCPFP NO LONGER PENDING * * IFF UTTEST=0 QUEUE STATISTICS * RESET QUEUE STATISTICS COUNTERS LDK A1,STATLN TABLE LENGTH PO113 EQU * SUK A1,2 NEXT WORD RF(N) PO116 READY WHEN ALL DONE CM STATAR,A1 RESET COUNTER RB PO113 NEXT WORD PO116 EQU * XIF * LDK A1,16 (MAX NUMBER OF PLC:S) * 2 PO120 EQU * * THIS LOOP IS EXECUTED ONCE FOR EACH PLC SUK A1,2 NEXT PLC RF(N) PO130 EXIT IF ALL DONE LD A5,TABCWT,A1 CWT ADDRESS RB(Z) PO120 TAKE NEXT IF NOT DEFINED CF A15,PLSTRT START ONE PLC RB PO120 NEXT PLC * PO130 EQU * ABL MEXIT MONITOR JOB EXIT * EJECT * ************************************************************ * * ROUTINE NAME: * PLSTRT * * FUNCTION: * THIS ROUTINE FIRST CLEARS ALL WORK AREAS AND * DWT:S, AND SETS THE DWT:S BUSY. IT THEN STARTS * THE PLC, AND CALLS RECOVERY ROUTINES IN ALL * DEVICE DRIVERS. * * CALL: * CF A15,PLSTRT * * INPUT: * A5 = CWT ADDRESS * * OUTPUT: * - * ************************************************************ * PLSTRT EQU * IFT CPU852=1 CF A15,SAVE8 PUSH A1-A8 XIF IFF CPU852=1 MSR 8,A15 PUSH A1-A8 XIF * ENB IM CWTGR,A5 INDICATE GENERAL READ NOT ALLOWED CM CWTABW,A5 STOP ABORT OF WS CM CWTSBQ,A5 RESET SHORT BUFFER QUEUE CM CWTLBQ,A5 RESET LONG BUFFER QUEUE * EJECT * ST100 EQU * * RETURN MONITOR BLOCKS USED AS BUFFERS LDR A7,A5 ADK A7,CWTMBQ MONITOR BLOCK QUEUE HEAD LDR* A4,A7 FIRST BLOCK RF(Z) ST105 CONTINUE IF NO LEFT CF A15,LNKOUT REMOVE FROM QUEUE CF A15,FREBLK RETURN BLOCK RB ST100 TAKE NEXT ST105 EQU * * RETURN MONITOR BLOCKS FROM CCA QUEUE LDR A7,A5 ADK A7,CWTCCQ CCA QUEUE HEAD LDR* A4,A7 FIRST BLOCK RF(Z) ST110 CONTINUE IF NO LEFT CF A15,LNKOUT REMOVE FROM QUEUE CF A15,FREBLK RETURN BLOCK RB ST105 TAKE NEXT * ST110 EQU * * INITIATE BUFFER AREAS LDR A4,A5 CWT ADDRESS ADKL A4,CWTSOB AREA FOR SHORT OUTPUT BUFFERS LDR A7,A5 ADK A7,CWTPBS POOLBLOCK, SHORT OUTPUT BUFFERS CF A15,INIBUF INITIATE BUFFER AREA LDR A4,A5 CWT ADDRESS ADKL A4,CWTLOB AREA FOR LONG OUTPUT BUFFERS LDR A7,A5 ADK A7,CWTPBL POOLBLOCK, LONG OUTPUT BUFFERS CF A15,INIBUF INITIATE BUFFER AREA LDR A4,A5 CWT ADDRESS ADKL A4,CWTGRB AREA FOR GENERAL READ BUFFERS LDR A7,A5 ADK A7,CWTPBG POOLBLOCK, GENERAL READ BUFFERS CF A15,INIBUF INITIATE BUFFER AREA * * RESET ALL DWT:S AND WORK STATION STATUS LDK A3,MAXWS+1 NUMBER OF WORK STATIONS + 1 ST120 EQU * SUK A3,1 NEXT WORK STATION RF(N) ST150 END IF NO MORE LEFT LDR A2,A3 WORK STATION NUMBER SLA A2,1 MAKE INDEX ADR A2,A5 ADD CWT ADDRESS ADK A2,CWTWSS WORK STATION STATUS WORD CMR A2 CLEAR STATUS LDK A1,NOTOPR SCR A1,A2 WS := NOT OPERABLE LD* A1,CWTINT,A5 WORK STATION TABLE ADDRESS LDR A6,A3 WORK STATION NUMBER CF A15,NDGEDN A7 := HIGEST DWT NUMBER ON WS ADK A7,1 ST130 EQU * SUK A7,1 NEXT DWT RF(N) ST140 NEXT WS IF NO DWT LEFT LDR A6,A3 WS NUMBER CF A15,GETDWT A6 := DWT ADDRESS RB(Z) ST130 NOT DEFINED CM DWTLD2,A6 RESET FLOW CONTROL LDKL A2,/FFFF-DWFBSY-DWFPLC * MASK FOR BUSY AND PLC FLAGS ANS A2,DWTST,A6 RESET FLAGS CM DWTLD1,A6 RELEASE BUFFER, IF ANY CM DWTOTQ,A6 REMOVE DWT FROM QUEUE, IF ANY RB ST130 NEXT DWT ST140 EQU * RB ST120 NEXT WORK STATION * ST150 EQU * * DELAY UNTIL PLC IS READY FOR START LD A4,CWTTPR,A5 TIMER ALREADY STARTED? RF(Z) ST152 NO, START TIMER LDKL A1,-STADLY-1 DELAY TIME STR A1,A4 RESTART TIMER RF ST154 EXIT * ST152 EQU * LDR A1,A5 SAVE CWT ADDRESS CF A15,SETIME START TIMER DATA ST156,STADLY RESTART ADDRESS & DELAY TIME ST A4,CWTTPR,A5 SAVE TIMER POINTER ST154 EQU * ABL TDISP WAIT UNTIL TIMER EXPIRES * ST156 EQU * LDR A5,A1 RESTORE CWT ADDRESS CM CWTTPR,A5 INDICATE NO TIMER RUNNING * * START "TEST CHANNEL UNIT" OPERATION IM CWTCCB,A5 SET CCA BUSY CM CWTOPR,A5 SET PLC OPERABLE CM CWTCCA+CCRSU1,A5 CLEAR SUB-COMM DK1 LDK A2,CMDTC COMMAND CODE TEST CU ST A2,CWTCCA+CCRDLS,A5 COMMAND AND DLS INDEX TO CCA CM CWTCCA+CCRC1B,A5 RESET DATA CHAINING LDR A3,A5 CWT ADDRESS ADK A3,CWTCSD CONTROL UNIT START DESCRIPTOR ADDR INH CF A15,PLCCIO CIO START RF(NZ) STERR2 EXIT IF ERROR IM CWTOPR,A5 SET NOT OPERABLE UNTIL TEST CU READY ABL TDISP WAIT FOR COMPLETION * * * ENTRY IS MADE HERE WHEN TEST CU IS COMPLETED. * REGISTER CONTENTS ON ENTRY: * A1 = PLC STATUS * A5 = CWT ADDRESS * TCURST EQU * LDR A1,A1 OPERATION OK? RF(NZ) STERR2 NO, EXIT * * PERFORM "OPEN LINE" OPERATION U =5 LDK A2,0 INITIATE LINE COUNTER ST A2,CWTLNO,A5 ST157 EQU * CF A15,PLCCCA RESERVE CCA * LD A2,CWTLNO,A5 GET LINE NO SC A2,CWTCCA+CCRSU1,A5 SET UP LINE IN CCA =5 SLL A2,1 MAKE OPEN LINE PARA- ST A2,CWTPAR,A5 METER AREA ST158 EQU * LD A2,CWTOPP,A5 MAKE ADDRESS TO AD A2,CWTPAR,A5 OPEN LINE PARAMETER AREA LDR* A2,A2 U =5 ST A2,CWTCCA+CCRBUF,A5 SET UP IN CCA LDK A2,CMDOP COMMAND OPEN LINE ST A2,CWTCCA+CCRDLS,A5 COMMAND AND DLS INDEX TO CCA CM CWTCCA+CCRC1B,A5 RESET DATA CHAINING & MSB OF ADDR LDK A2,12 PARAMETER AREA LENGTH =1 ST A2,CWTCCA+CCRLEN,A5 TO CCA * CM CWTOPR,A5 SET PLC OPERABLE CF A15,PLCCIO CIO START RF(NZ) STERR2 EXIT IF ERROR ABL PLDSP2 LOCAL DISPATCHER * * * ENTRY TO OPLRST WILL BE MADE WHEN THE OPEN LINE * OPERATION IS COMPLETED. * REGISTER CONTENTS ON ENTRY: * A1 = PLC STATUS * A5 = CWT ADDRESS * OPLRST EQU * LDR A1,A1 OPERATION OK? RF(NZ) STERR2 NO, EXIT * LD A2,CWTPNR,A5 GET PLC NR SUK A2,3 CHECK IF LOCAL RF(NP) ST159 YES IM CWTLNO,A5 INCREMENT LINE NUMBER LD A2,CWTLNO,A5 GET LINE NO SUK A2,4 ALL LINES OPENED ? RB(NZ) ST157 NO, TAKE NEXT CM CWTLNO,A5 ST159 EQU * * CM CWTGR,A5 INDICATE GENERAL READ ALLOWED * * PERFORM OPEN DATA LINK FOR ALL CONNECTED SECONDARIES * LDK A6,MAXWS+1 (MAX NR OF DLS) + 1 ST160 EQU * SUK A6,1 NEXT WORK STATION (DLS) RF(N) ST180 EXIT IF ALL DONE LD* A1,CWTINT,A5 WORK STATION TABLE CF A15,NDGEDN A7 := HIGEST DWT NUMBER ON WS LDR A7,A7 ANY DWT:S? RB(N) ST160 NO, TAKE NEXT WS * CF A15,PLCCCA RESERVE CCA LDR A3,A6 WORK STATION NUMBER SLA A3,1 MAKE INDEX ADR A3,A5 ADD CWT ADDRESS CM CWTWSS,A3 CLEAR WS STATUS SC A6,CWTCCA+CCRDLS,A5 DLS INDEX (WS NUMBER) TO CCA ST A6,CWTCCA+CCRIDW,A5 SAVE DLS INDEX LDK A2,CMDOD COMMAND OPEN DLS SC A2,CWTCCA+CCRCMD,A5 TO CCA LDK A2,MAXFR MAX OUTSTANDING FRAMES SC A2,CWTCCA+CCRSU1,A5 TO SUBCOMMAND 1 CM CWTCCA+CCRC1B,A5 RESET DATA CHAINING CF A15,PLCCIO CIO START RF(NZ) STERR2 EXIT IF ERROR ABL PLDSP2 EXIT. WAIT FOR COMPLETION * * * ENTRY TO ODLRST IS MADE WHEN OPERATION IS COMPLETED. * REGISTER CONTENTS ON ENTRY: * A2 = FATAL PLC STATUS * A5 = CWT ADDRESS * A6 = WORK STATION NUMBER (DLS INDEX) * ODLRST EQU * LDR A2,A2 FATAL ERROR? RF(NZ) STERR2 YES, EXIT LD* A3,CWTINT,A5 WORK STATION TABLE ADDRESS LDK A4,RETCP FLAG "TC POWER UP" CF A15,NDREWS RECOVERY OF ALL DWT:S ON WS RB ST160 TAKE NEXT WORK STATION * * ST180 EQU * * ALL DATA LINKS ARE STARTED. EXIT. ABL PLDSP2 LOCAL DISPATCHER * * STERR2 EQU * * ERROR DURING STARTUP. EXIT. * ABL TDISP EXIT * EJECT * ******************** * LOCAL DISPATCHER * ******************** * * THIS SECTION CONTAINS A DISPATCHER FOR THE PLC DRIVER. * IT CAN BE CALLED EITHER FROM ANOTHER ROUTINE IN THE * PLC DRIVER, OR FROM A TERMINAL DEVICE DRIVER (THROUGH * THE NETWORK DISTRIBUTOR). * SOME INTERRUPTS OR DEVICE DRIVER CALLS SET SEVERAL * RESOURCES FREE. THIS MEANS THAT SEVERAL WAITING * PROCERSSES MAY BECOME READY FOR ACTIVATION. ONLY ONE * OF THESE PROCESSES CAN BE ACTIVATED DIRECTLY. THE * OTHER PROCESSES WILL BE ACTIVATED IN TURN, WHEN FIRST * PROCESS EXITS TO THIS DISPATCHER. * * * ROUTINES IN ORDER OF APPEARANCE IN CODE: * * NAME FUNCTION * * PLDISP ACTIVATE PROCESS OR PERFORM COMMON FUNCTION * EJECT * ************************************************************ * * ROUTINE NAME: * PLDISP * * FUNCTION: * THIS ROUTINE LOOKS FOR WAITING PROCESSES THAT ARE * READY FOR DISPATCHING. IF ANY IS FOUND, IT IS * ACTIVATED. THE ROUTINE ALSO PERFORMS ACTIONS THAT * ARE NOT EXPLICITLY REQUESTED BY USER PROCESSES, EG * GENERAL READ. WHEN NOTHING IS LEFT TO DO, THE ROUTINE * EXITS TO TOSS DISPATCHER. * TWO ENTRIES ARE PROVIDED. ONE IS USED WHEN CALLER * KNOWS OWN DWT ADDRESS, ONE WHEN CALLER KNOWS OWN * CWT ADDRESS. * * CALL: * ABL PLDISP * ABL PLDSP2 * * INPUT: * A5 = CWT ADDRESS (IF PLDSP2) * A6 = DWT ADDRESS (IF PLDISP) * A1-A8 ON A15 STACK * * OUTPUT: * - * ************************************************************ * PLDISP EQU * PRDISP EQU * CF A15,GETCWT A5 := CWT ADDRESS LDR A5,A5 ABL(Z) TDISP NOT DEFINED. EXIT * * PLDSP2 EQU * * * DP100 EQU * ENB * HANDLE CHARACTER INPUT LD A4,CWTBUF,A5 INPUT BUFFER WAITING? RF(Z) DP200 NO, CONTINUE LD A6,BUFDWT,A4 DWT ADDRESS * CF A15,PLGECH A2 := CHARACTER LDR A1,A1 CHECK RETURN CODE RF(N) DP110 BUFFER EMPTY LD A3,DWTST,A6 DEVICE STATUS ANK A3,DWFINP INPUT REQUESTED? ABL(NZ) INPRST YES, RETURN TO DEVICE DRIVER * LD A1,DWTADR,A6 ADDRESS BLOCK LD A1,INTADR,A1 INTERRUPT ENTRY DEFINED? ABR(NZ) A1 YES, GO TO INTERRUPT HANDLER * DP110 EQU * CW A4,DWTLD1,A6 BUFFER CHAINED TO THIS DWT? RF(NE) DP120 NO, CONTINUE CM DWTLD1,A6 REMOVE LINK DP120 EQU * CM CWTBUF,A5 NO BUFFER WAITING CF A15,PLRLBU RELEASE BUFFER * * CHECK IF LEVEL 3 RECIEVE READY SHOULD BE SENT CF A15,GETIFR A2 := NR OF FRAMES NOT ACK:ED SUK A2,6 TIME TO SEND RR? ABL(NN) SENDRR YES * * DP200 EQU * ENB * HANDLE POWER UP FOR TC LD A1,PFPOST POWER UP TASK PENDING? OR A1,PLCPFP PLC POWER UP PENDING? ABL(NZ) TDISP YES, EXIT * * DP300 EQU * * HANDLE ABORT OF ONE WORK STATION LD A6,CWTABW,A5 WS TO ABORT, IF ANY ABL(NZ) ABTHAN DO ABORT, IF REQUESTED * * DP400 EQU * * CHECK IF ANYONE WAITING FOR CCA LD A4,CWTCCQ,A5 ANYONE IN CCA QUEUE? RF(Z) DP500 NO, CONTINUE LD A1,CWTCCB,A5 CCA FREE? RF(NZ) DP500 NO, CONTINUE IM CWTCCB,A5 SET CCA BUSY ABL CCARST ACTIVATE WAITING PROCESS * * DP500 EQU * * CHECK BUFFER QUEUES LD A6,CWTSBQ,A5 ANYONE IN SHORT BUFFERS QUEUE? RF(Z) DP510 NO, CHECK LONG LDR A7,A5 CWT ADDRESS ADK A7,CWTPBS POOLBLOCK FOR SHORT BUFFERS CF A15,PLGTBU A4 := BUFFER ADDRESS RF(Z) DP510 NO BUFFER AVAILABLE LDK A7,CWTSBQ OFFSET TO CWT QUEUE HEAD RF DP520 COMMON PART FOR SHORT/LONG * DP510 EQU * LD A6,CWTLBQ,A5 ANYONE IN LONG BUFFERS QUEUE? RF(Z) DP600 NO, CONTINUE LDR A7,A5 CWT ADDRESS ADK A7,CWTPBL POOLBLOCK FOR LONG BUFFERS CF A15,PLGTBU A4 := BUFFER ADDRESS RF(Z) DP600 CONTINUE IF NO BUFFER AVAILABLE LDK A7,CWTLBQ OFFSET TO LONG BUFFERS QUEUE HEAD * DP520 EQU * * SHORT OR LONG BUFFER FOUND LDR A2,A4 SAVE BUFFER ADDRESS LDR A4,A6 DWT QUEUE LINK ADR A7,A5 BUFFER QUEUE HEAD CF A15,LNKOUT REMOVE FROM QUEUE SUKL A6,DWTOTQ A6 := DWT ADDRESS LDR A4,A2 RESTORE BUFFER ADDRESS LDK A1,0 RET CODE := OK ABL BUFRST RETURN TO ROUTINE WAITING * * DP600 EQU * * CHECK IF GENERAL READ SHOULD BE PERFORMED LD A1,CWTGR,A5 GENERAL READ ALLOWED? RF(NZ) DP800 NO, EXIT * LDR A7,A5 CWT ADDRESS ADK A7,CWTPBG POOLBLOCK FOR GENERAL READ BUFFERS CF A15,PLGTBU A4 := BUFFER ADDRESS ABL(NZ) GREAD PERFORM GR IF BUFFER FOUND * * DP800 EQU * * NOTHING MORE TO DO. EXIT TO DISPATCHER ABL TDISP TOSS DISPATCHER * EJECT * ************ * ROUTINES * ************ * * THIS SECTION CONTAINS MISCELLANEOUS SERVICE ROUTINES. * ALL ROUTINES ARE CALLED BY AN ABL "NAME" INSTRUCTION. * REGISTER INTERFACE IS DESCRIBED FOR EACH ROUTINE. * WHEN A ROUTINE HAS PERFORMED THE REQUESTED FUNCTION, * IT WILL EXIT TO THE LOCAL DISPATCHER. * * ROUTINES IN ORDER OF APPEARANCE IN CODE: * * NAME FUNCTION * * ABTHAN ABORT ALL WAITING DWT:S ON A WORK STATION * PLREWS HANDLE RECOVERY OF ONE WORK STATION * SENDRR SEND LEVEL 3 RECIEVE READY MESSAGE * GREAD PERFORM GENERAL READ * EJECT * ************************************************************ * * ROUTINE NAME: * ABTHAN * * FUNCTION: * THIS ROUTINE WILL HANDLE ABORTS FOR ONE WORK * STATION. ALL REQUESTS OF DWT:S WAITING FOR * LEVEL 3 ACK OR WAITING IN CCA OR BUFFER QUEUES * WILL BE ABORTED. ONE CALL IS NEEDED FOR EACH * REQUEST TO BE ABORTED. * * CALL: * ABL ABTHAN * * INPUT: * A5 = CWT ADDRESS * A6 = WORK STATION NUMBER * * OUTPUT: * AT RETURN TO REQUEST: * A1 = RETURN CODE * A5 = CWT ADDRESS * A6 = DWT ADDRESS * ************************************************************ * ABTHAN EQU * LDR A3,A6 WORK STATION NUMBER SLA A3,1 MAKE INDEX ADR A3,A5 ADD CWT ADDRESS ADK A3,CWTWSS A3 := ADDRESS OF STATUS FOR WS * EJECT * LDR A8,A6 SAVE WS NUMBER LD* A1,CWTINT,A5 WORK STATION TABLE CF A15,NDGEDN A7 := HIGEST DWT NR ON WS LDK A1,0 LCR A1,A3 WORK STATION STATUS * ADK A7,1 PREPARE FOR SUK AH100 EQU * SUK A7,1 NEXT DWT RF(N) AH110 EXIT IF ALL DONE LDR A6,A8 WS NUMBER CF A15,GETDWT A6 := DWT ADDRESS RB(Z) AH100 NOT DEFINED * CM DWTLD2,A6 RESET FLOW CONTROL LD A2,DWTST,A6 DWT STATUS LDR A3,A2 LDKL A4,/FFFF-DWFPLC MASK FOR PLC FLAGS ANS A4,DWTST,A6 RESET FLAGS ANK A2,DWFAK3 IS DWT WAITING FOR LEVEL 3 ACK? RF(Z) AH105 NO, CONTINUE ANK A3,DWFSAC ALWAYS WAIT FOR LEVEL 3 ACK? ABL(NZ) AK3RST YES, RETURN WITH ACK 3 ABL WINRST NO, RETURN TO WINDOW QUEUE * AH105 EQU * LD A4,DWTOTQ,A6 CCA QUEUE ELEMENT POINTER LDR A2,A7 SAVE DEVICE ADDRESS LDR A3,A1 SAVE RETURN CODE LDR A7,A5 CWT ADDRESS ADK A7,CWTCCQ CCA QUEUE HEAD CF A15,LNKOUT LINK MONITOR BLOCK OUT OF QUEUE LDR A7,A7 FOUND? ABL(NZ) CCAABT YES, ABORT REQUEST LDR A7,A2 RESTORE DEVICE ADDRESS LDR A1,A3 RESTORE RETURN CODE * CF A15,OUTBUQ REMOVE FROM BUFFER QUEUE LDR A2,A2 FOUND IN QUEUE? ABL(NZ) BUFRST YES, TERMINATE REQUEST RB AH100 NEXT DWT * AH110 EQU * * ALL PROCESSES WAITING FOR ACK 3 OR IN QUEUES ARE ABORTED CM CWTABW,A5 NO MORE ABORT ABL PLDSP2 LOCAL DISPATCHER * EJECT * ************************************************************ * * ROUTINE NAME: * PLREWS * * FUNCTION: * THIS ROUTINE WILL HANDLE RECOVERY OF ONE WORK * STATION. ACTUAL CALL TO TERMINAL DEVICE DRIVER * RECOVERY ROUTINES ARE MADE THROUGH NDREWS. * * CALL: * ABL PLREWS * * INPUT: * A5 = CWT ADDRESS * A6 = WORK STATION NUMBER * * OUTPUT: * AT ENTRY TO DEVICE RECOVERY: * SEE NDREWS * ************************************************************ * PLREWS EQU * LDR A3,A6 WORK STATION NUMBER SLA A3,1 MAKE INDEX ADR A3,A5 ADD CWT ADDRESS ADK A3,CWTWSS A3 := ADDRESS OF STATUS FOR WS * LDKL A2,/FFFF-WSFERR MASK FOR ERROR FLAG ANRS A2,A3 INDICATE WS WORKING AFTER ERROR LCR A1,A3 WS STATUS LDK A2,0 SCR A2,A3 RESET STATUS LDK A4,RESECP ASSUME SECONDARY POWER UP ANK A1,NOTOPR WAS IT? RF(NZ) PR110 YES LDK A4,RELINE NO, LINK ERROR PR110 EQU * LD* A3,CWTINT,A5 WORK STATION TABLE CF A15,NDREWS CALL RECOVERY FOR ALL DWT:S ON WS * ABL PLDSP2 LOCAL DISPATCHER * EJECT * ************************************************************ * * ROUTINE NAME: * SENDRR * * FUNCTION: * THIS ROUTINE WILL SEND ONE LEVEL 3 RECIEVE READY * MESSAGE TO A SECONDARY STATION. * * CALL: * ABL SENDRR * * INPUT: * A5 = CWT ADDRESS * A6 = DWT ADDRESS * * OUTPUT: * - * ************************************************************ * SENDRR EQU * CF A15,PLCCCA RESERVE CCA CF A15,GETBLK GET MONITOR BLOCK AS BUFFER ENB LDR A7,A5 CWT ADDRESS ADK A7,CWTMBQ QUEUE FOR KEEPING TRACK OF MB:S CF A15,LNKFST PUT MONITOR BLOCK IN QUEUE ADK A4,2 A4 := START OF USER PART CF A15,WRADR2 WRITE LINE ADDRESS IN CCA & BUFFER LDK A2,CMDSW COMMAND := STANDARD WRITE SC A2,CWTCCA+CCRCMD,A5 TO CCA LDK A2,TYRR MESSAGE TYPE := RECIEVE READY SC A2,CWTCCA+CCRIDB,A5 TO CCA, IDENTITY LDK A2,X25DAT LENGTH OF X25 HEADER ST A2,CWTCCA+CCRLEN,A5 BUFFER LENGTH TO CCA CM CWTCCA+CCRC1B,A5 RESET DATA CHAIN & MSB BUFFER ADDR ST A4,CWTCCA+CCRBUF,A5 BUFFER ADDRESS TO CCA * CF A15,GETLCS A1 := STATUS & INH RF(Z) RR100 CONTINUE IF OK CM CWTCCB,A5 SET CCA FREE RF RR110 SKIP RR RR100 EQU * CF A15,FWOPR A2 := P(R). UPDATE FLOW CTRL ORK A2,/01 MESSAGE TYPE := RR SC A2,X25FLW,A4 TO BUFFER CF A15,PLCCIO EXECUTE CIO START RF(Z) RR120 EXIT IF OK RR110 EQU * SUK A4,2 START ADDRESS OF MONITOR BLOCK CF A15,LNKOUT REMOVE FROM QUEUE. A7 ALREADY SET CF A15,FREBLK RETURN MONITOR BLOCK * RR120 EQU * ABL PLDSP2 LOCAL DISPATCHER * EJECT * ************************************************************ * * ROUTINE NAME: * GREAD * * FUNCTION: * THIS ROUTINE WILL PERFORM ONE GENERAL READ * OPERATION TO THE PLC. * * CALL: * ABL GREAD * * INPUT: * A4 = BUFFER ADDRESS * A5 = CWT ADDRESS * * OUTPUT: * - * ************************************************************ * GREAD EQU * LDR A6,A4 PARAMETER := BUFFER ADDRESS CF A15,PLCCCA RESERVE PLC CCA * SET CCA PARAMETERS CM CWTCCA+CCRC1B,A5 CLEAR DATA CHAINING & MSB ADDR ST A6,CWTCCA+CCRBUF,A5 BUFFER ADDRESS LD A2,BUFLEN,A6 BUFFER LENGTH ST A2,CWTCCA+CCRLEN,A5 LDK A2,CMDGR COMMAND GENERAL READ ST A2,CWTCCA+CCRDLS,A5 DLS INDEX & COMMAND CF A15,PLCCIO EXECUTE CIO START ABL PLDSP2 CHECK WHAT TO DO NEXT * EJECT * *************** * SUBROUTINES * *************** * * THIS SECTION CONTAINS MISCELLANEOUS SERVICE SUBROUTINES. * ALL ROUTINES ARE CALLED BY A CF A15,"NAME" * INSTRUCTION. REGISTER INTERFACE IS DESCRIBED FOR EACH * ROUTINE. ONLY REGISTERS A1-A8 & PSW ARE CONSIDERED. * REGISTERS NOT MENTIONED UNDER "OUTPUT" ARE UNCHANGED * FROM CALL. * THE ROUTINES ARE OF TWO TYPES, ASYNCHRONOUS ROUTINES * AND COMPUTATION ROUTINES. ASYNCHRONOUS ROUTINES MAY, * IF THE REQUESTED FUNCTION IS OCCUPIED OR NOT USEABLE, * EXIT TO THE LOCAL DISPATCHER AND/OR TOSS DISPATCHER. * THIS MEANS THAT THE A15 STACK AT CALL MUST CONTAIN * INTERRUPT RETURN, A1-A8 AND NOTHING ELSE. COMPUTATION * ROUTINES HAVE NO SUCH LIMITATIONS, AS THEY WILL RETURN * IMMEDIATELY WHEN THEY HAVE PERFORMED THE PROCESSING. * EJECT * * ROUTINES IN ORDER OF APPEARANCE IN CODE: * * NAME FUNCTION * * ASYNCHRONOUS ROUTINES * PLCCCA RESERVE CCA FOR PROCESS * PLCCIO EXECUTE CIO START * * COMPUTATION ROUTINES * PLCNOP SET FLAG INDICATING PLC NOT OPERABLE * GETDWT CALCULATE DWT ADDRESS * GETCWT CALCULATE CWT ADDRESS * GETFR GET NUMBER OF OUTSTANDING FRAMES * FLWINP HANDLE FLOW CONTROL FOR INPUT * FLWOUT HANDLE FLOW CONTROL FOR OUTPUT * WRADDR WRITE LINE ADDRESS IN CCA AND BUFFER * STAHAN PLC RETURN STATUS HANDLER * GETSTA GET STATUS FOR I/O CONNECTION * PLGTBU ALLOCATE BUFFER AND SET TO PLC FORMAT * PLRLBU RELEASE BUFFER OF PLC FORMAT * PLCHAR GET/PUT CHARACTER FROM/IN PLC FORMAT BUFFER * INTYPE DECIDE TYPE OF INPUT MESSAGE * OUTBUQ REMOVE ELEMENT FROM BUFFER QUEUE * LNKFST LINK ELEMENT FIRST IN QUEUE * LNKLST LINK ELEMENT LAST IN QUEUE * LNKOUT LINK ELEMENT OUT OF QUEUE * EJECT * ************************************************************ * * ROUTINE NAME: * PLCCCA * * FUNCTION: * THIS ROUTINE IS CALLED WHEN A PROCESS WANTS TO * USE THE PLC COMMAND COMMUNICATION AREA (CCA). * IF THE AREA IS FREE, THE ROUTINE SETS IT BUSY * AND RETURNS. IF THE AREA IS BUSY, THE CALLING * PROCESS IS PUT IN A QUEUE, AND EXIT IS MADE TO * THE LOCAL DISPATCHER. * PLCCCA ONLY RESERVES THE AREA. * PLCCCS ALSO SAVES THE QUEUE ELEMENT ADDRESS. * * CALL: * CF A15,PLCCCA * CF A15,PLCCCS * * INPUT: * A3 = QUEUE ELEMENT ADDRESS SAVE AREA (IF PLCCCS) * A5 = CWT ADDRESS * A6 = PARAMETER * A1-A8 ON A15 STACK * * OUTPUT: * A1 = RETURN CODE (IF PLCCCS, ELSE CHANGED) * A2-A4 CHANGED * A7-A8 CHANGED * CR = CHANGED * INTERR. INHIBITED * ************************************************************ * EJECT * PLCCCA EQU * LDK A3,0 DON'T SAVE QUEUE ELEMENT ADDRESS * PLCCCS EQU * INH LD A1,CWTCCQ,A5 ANYONE WAITING FOR CCA? RF(NZ) CA100 YES, PUT IN QUEUE LD A4,CWTCCB,A5 PLC BUSY? RF(NZ) CA100 YES, PUT IN QUEUE * * PLC FREE IM CWTCCB,A5 SET PLC BUSY ADKL A15,4 ADJUST STACK FOR RETURN LDK A1,0 RETURN CODE := OK ABR* A15 RETURN IN INHIBIT MODE * * CA100 EQU * * PLC BUSY. PUT REQUEST IN QUEUE. LDR A1,A6 SAVE PARAMETER LDR* A2,A15 SKIP PSW LDR* A2,A15 SAVE RETURN ADDRESS CF A15,GETBLK GET MONITOR BLOCK AND SAVE A1-A2 LDR A3,A3 SAVE POINTER? RF(Z) CA110 NO, CONTINUE STR A4,A3 SAVE QUEUE ELEMENT ADDRESS CA110 EQU * LDR A7,A5 CWT ADDRESS ADK A7,CWTCCQ PLC BUSY QUEUE HEAD CF A15,LNKLST PUT BLOCK LAST IN QUEUE IFF UTTEST=0 QUEUE STATISTICS LD A1,CWTPNR,A5 PLC NUMBER SLA A1,1 MAKE INDEX IM CCQSTA,A1 INCREMENT QUEUE STATISTICS COUNTER XIF ABL PLDSP2 LOCAL DISPATCHER * * * RETURN IS MADE HERE WHEN THE CCA IS FREE. * (AT A RELEASE INTERRUPT OR FROM DISPATCHER.) * REGISTERS ON ENTRY: * A4 = MONITOR BLOCK ADDRESS * A5 = CWT ADDRESS * CCARST EQU * INH LDR A7,A5 CWT ADDRESS ADK A7,CWTCCQ CCA QUEUE HEAD CF A15,LNKOUT REMOVE PROCESS FROM QUEUE LDK A3,0 RETURN CODE := OK * * * ENTRY IS MADE HERE WHEN A REQUEST SHOULD BE ABORTED * DUE TO I/O ERROR. * REGISTERS ON ENTRY: * A3 = RETURN CODE * A4 = MONITOR BLOCK ADDRESS * A5 = CWT ADDRESS * CCAABT EQU * INH LDR A7,A3 SAVE RETURN CODE CF A15,FREBLK RETURN MONITOR BLOCK. LOAD A1-A2 LDR A6,A1 PARAMETER LDR A1,A7 A1 := RETURN CODE ABR A2 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * PLCCIO * * FUNCTION: * THIS ROUTINE CHECKS IF THE PLC CAN BE USED. IF IT CAN, * THE ROUTINE EXECUTES A CIO START INSTRUCTION. * IF THE PLC IS NOT OPERABLE DUE TO TC POWER UP, * THE ROUTINE WILL EXIT TO TOSS DISPATCHER. IN ALL OTHER * CASES, IT WILL RETURN TO CALLING PROGRAM WITH A RETURN * CODE. * * CALL: * CF A15,PLCCIO * * INPUT: * A5 = CWT ADDRESS * A1-A8 ON A15 STACK * * OUTPUT: * A1 = RETURN CODE * 0 IF OK * NOT 0 ELSE * A2 = CHANGED * CR = CONTENTS OF A1 * INTERR. INHIBITED * ************************************************************ * PLCCIO EQU * INH LDR* A2,A15 SKIP PSW LDR* A2,A15 GET RETURN ADDRESS * EJECT * LD A1,PFPOST POWER UP TASK PENDING? OR A1,PLCPFP PLC POWER UP PENDING? ABL(NZ) TDISP YES, GO TO TOSS DISPATCHER LD A1,CWTOPR,A5 PLC OPERABLE? RF(NZ) CS100 NO, HANDLE IFF UTTEST=0 CF A15,LOGCOM LOG CCR XIF EX CWTCIO,A5 EXECUTE CIO START RF(U) CS090 UNDEFINED, NOT OK =13 LDKL A1,0 SET CR, OK =14 ABR A2 CS090 EQU * * CF A15,PLCNOP ERROR. SET NOT OPERABLE CS100 EQU * LDK A1,NOTOPR RETURN CODE := NOT OPERABLE CM CWTCCB,A5 SET CCA FREE LDR A1,A1 SET CR ABR A2 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * PLCNOP * * FUNCTION: * THIS ROUTINE SETS A FLAG TO INDICATE THAT THE PLC * IS "NOT OPERABLE". * * CALL: * CF A15,PLCNOP * * INPUT: * A5 = CWT ADDRESS * * OUTPUT: * - * ************************************************************ * PLCNOP EQU * STR A1,A15 PUSH A1 LD A1,CWTPLS,A5 GET PLC STATUS RF(NZ) PN100 LDKL A1,-1 SET DUMMY ERROR CODE PN100 EQU * ST A1,CWTOPR,A5 SET PLC NOT OPERABLE * IFF UTTEST=0 * EJECT * LD A1,UTTST TRAP CONTROL SUK A1,1 TRAP USED? RF(NG) PN120 NO, SKIP LDK A1,PLCERR ERROR CODE OTR A1,0,/2E TO SOP LAMPS DATA /6300 TRAP TO BUGGER PN120 EQU * * XIF * LDR* A1,A15 POP A1 RTN A15 EJECT * ************************************************************ * * ROUTINE NAME: * GETDWT * * FUNCTION: * THIS ROUTINE CALCULATES THE DWT ADDRESS FOR A * DEVICE CONNECTED TO A PLC. * * CALL: * CF A15,GETDWT * * INPUT: * A5 = CWT ADDRESS * A6 = DLS INDEX * A7 = DEVICE ADDRESS * * OUTPUT: * A6 = DWT ADDRESS IF FOUND, * ELSE 0 * CR = CONTENTS OF A6 * INTERR. INHIBITED * ************************************************************ * GETDWT EQU * INH STR A1,A15 PUSH A1 LD* A1,CWTINT,A5 WORK STATION TABLE CF A15,NDGEDW A6 := DWT ADDRESS LDR* A1,A15 POP A1 ADKL A15,4 ADJUST STACK FOR RETURN ANKL A6,/FFFE SET CR & SKIP ODD ADDRESS ABR* A15 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * GETCWT * * FUNCTION: * THIS ROUTINE CALCULATES THE CWT ADDRESS FOR * THE PLC CONTROLLING CALLING DEVICE. * * CALL: * CF A15,GETCWT * * INPUT: * A6 = DWT ADDRESS * * OUTPUT: * A5 = CWT ADDRESS IF FOUND, * ELSE 0 * A7 = 0 IF LOCAL CONNECTION * CR = CHANGED * ************************************************************ * GETCWT EQU * LD A5,DWTCHP,A6 CHANNEL PARAMETERS ANK A5,MASKPL CLEAN CHANNEL UNIT INDEX SLL A5,1 MAKE INDEX IFF PLCNRR=0 IFF PLCNRL=0 LDR* A7,A6 CHANNEL PARAMETER ANKL A7,/0500 MASK =10 SUKL A7,/0500 REMOTE ? RF(Z) GET010 NO ADK A5,8 ADJUST INDEX FOR REMOTE XIF GET010 LD A5,TABCWT,A5 A5 := CWT ADDRESS * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * GETFR * * FUNCTION: * THIS ROUTINE CALCULATES THE NUMBER OF OUTSTANDING * FRAMES, IE FRAMES THAT HAVE BEEN TRANSFERRED BUT * NOT ACKNOWLEDGED ON LEVEL 3, FOR A LOGICAL * CHANNEL. * GETIFR GETS NUMBER OF FRAMES RECIEVED BY PLC. * GETOFR GETS NUMBER OF FRAMES SENT BY PLC. * * CALL: * CF A15,GETIFR * CF A15,GETOFR * * INPUT: * A6 = DWT ADDRESS * * OUTPUT: * A1 = CHANGED * A2 = NUMBER OF OUTSTANDING FRAMES * CR = CHANGED * ************************************************************ * GETIFR EQU * LD A2,DWTLD2,A6 FLOW CONTROL COUNTERS LDR A1,A2 SRL A2,9 BITS 13-15 := NEXT EXPECTED P(S) SRL A1,5 BITS 13-15 := LAST SENT P(R) RF GF100 TO COMMON PART * EJECT * GETOFR EQU * LD A2,DWTLD2,A6 FLOW CONTROL COUNTERS LDR A1,A2 SRL A2,1 BITS 13-15 := NEXT P(S) TO SEND SLC A1,3 BITS 13-15 := LAST RECIEVED P(R) * * GF100 EQU * SUR A2,A1 A2 := OUTSTANDING FRAMES ANK A2,/07 CLEAN & MODULO 8 * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF * IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * FLWINP * * FUNCTION: * THIS ROUTINE HANDLES FLOW CONTROL FOR INPUT. IT FETCHES * FLOW CONTROL INFORMATION FROM MESSAGE AND UPDATES * COUNTERS IN DWT. * FWIPR IS FOR MESSAGES ONLY CONTAINING P(R). * FWIPSR IS FOR MESSAGES CONTAINING P(S) AND P(R). * NO ERROR CHECK IS MADE. * * CALL: * CF A15,FWIPR * CF A15,FWIPSR * * INPUT: * A4 = BUFFER ADDRESS * A6 = DWT ADDRESS * * OUTPUT: * A1 = CHANGED * CR = CHANGED * ************************************************************ * FWIPR EQU * STR A2,A15 PUSH A2 LC A1,X25FLW,A4 FLOW CONTROL FROM INPUT ANK A1,/E0 BITS 8-10 = P(R) IN LC A2,DWTLD2,A6 OLD FLOW CONTROL ANK A2,/0E BITS 12-14 = OLD P(S) IN ORR A1,A2 KEEP OLD P(S) LDR* A2,A15 POP A2 RF FI100 COMMON ENDING * * FWIPSR EQU * LC A1,X25FLW,A4 FLOW CONTROL FROM INPUT ANK A1,/EE CLEAN ADK A1,/02 BITS 12-14 := NEXT EXPECTED P(S) IN ANK A1,/EE MODULO 8 * * FI100 EQU * SC A1,DWTLD2,A6 SAVE NEW FLOW CONTROL * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF * IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * FLWOUT * * FUNCTION: * THIS ROUTINE HANDLES FLOW CONTROL FOR OUTPUT. FLOW * CONTROL INFORMATION IS FETCHED FROM DWT, AND COUNTERS * IN DWT ARE UPDATED. * FWOPR IS FOR MESSAGES CONTAINING ONLY P(R). * FWOPSR IS FOR MESSAGES CONTAINING P(S) AND P(R). * * CALL: * CF A15,FWOPR * CF A15,FWOPSR * * INPUT: * A6 = DWT ADDRESS * * OUTPUT: * A1 = CHANGED * A2 = BITS 0-7 ZERO * BITS 8-10 P(R) TO SEND * BIT 11 ZERO * BITS 12-14 P(S) TO SEND IF FWOPSR * ELSE ZERO * BIT 15 ZERO * CR = CHANGED * ************************************************************ * FWOPR EQU * LD A2,DWTLD2,A6 FLOW CONTROL COUNTERS LDR A1,A2 SRL A2,4 BITS 8-10 := NEXT EXPECTED P(S) IN * (= P(R) TO SEND) ANK A2,/E0 CLEAN ANK A1,/0E BITS 12-14 = NEXT P(S) TO SEND ORR A1,A2 P(S) := SAME AS BEFORE RF FO100 COMMON ENDING * * FWOPSR EQU * LD A2,DWTLD2,A6 FLOW CONTROL COUNTERS LDR A1,A2 SRL A2,4 BITS 8-10 := NEXT EXPECTED P(S) IN * (= P(R) TO SEND) ANK A2,/E0 CLEAN ANK A1,/0E BITS 12-14 = NEXT P(S) TO SEND ORR A2,A1 COUNTERS FOR MESSAGE LDR A1,A2 ADK A1,/02 INCREMENT P(S) TO SEND ANK A1,/EE MODULO 8 * * FO100 EQU * SC A1,DWTLD2+1,A6 SAVE FLOW CONTROL COUNTERS * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF * IFF CPU852=1 RTN A15 XIF EJECT * ************************************************************ * * ROUTINE NAME: * WRADDR * * FUNCTION: * THIS ROUTINE WRITES THE LINE ADDRESS IN A * MESSAGE. THE ADDRESS CONSISTS OF: DROP ADDRESS, * GROUP NUMBER AND DEVICE ADDRESS. WRADR1 SETS * GROUP=1 INDICATING NO FLOW CONTROL, WRADR2 SETS * GROUP=0 INDICATING FLOW CONTROL. * * CALL: * CF A15,WRADR1 * CF A15,WRADR2 * * INPUT: * A4 = BUFFER ADDRESS * A5 = CWT ADDRESS * A6 = DWT ADDRESS * * OUTPUT: * A2 = CHANGED * CR = CHANGED * ************************************************************ * WRADR1 EQU * LDK A2,/11 GROUP NUMBER 1 RF WA100 TO COMMON PART * EJECT * WRADR2 EQU * LDK A2,/10 GROUP NUMBER 0 * * WA100 EQU * SC A2,X25LGN,A4 GROUP NUMBER TO BUFFER LC A2,DWTCP2,A6 CHANNEL PARAMETERS ANK A2,MASKWS CLEAN WS NUMBER SC A2,CWTCCA+CCRDLS,A5 TO CCA LC A2,DWTCP2+1,A6 ANK A2,MASKLC CLEAN DEVICE ADDRESS SC A2,X25LCN,A4 TO BUFFER * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF * IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * STAHAN * * FUNCTION: * THIS ROUTINE HANDLES PLC STATUS WORD FOR ONE * WORK STATION. IF "NO CONNECTION", "LINK RESET" * OR "DCE NOT OPERABLE" IS INDICATED, AN ERROR * CODE WILL BE * SET IN THE WORK STATION STATUS WORD (CWTWSS). * OTHER STATUS BITS ARE NOT ALLOWED. * * CALL: * CF A15,STAHAN * * INPUT: * A1 = PLC STATUS * A2 = WORK STATION NUMBER * A5 = CWT ADDRESS * * OUTPUT: * A1 = DEVICE RETURN CODE * CR = CHANGED * ************************************************************ * STAHAN EQU * STR A3,A15 PUSH A3 LDR A3,A1 ANY ERROR? RF(Z) SH120 NO, RETURN STR A4,A15 PUSH A4 * EJECT * LDK A1,NOTOPR ASSUME NO CONNECTION ANKL A3,STADNO+STANOC IS IT? RF(NZ) SH100 YES, CONTINUE LDK A1,LINERR NO, LINK ERROR SH100 EQU * LDR A3,A2 WORK STATION NUMBER SLA A3,1 MAKE INDEX ADR A3,A5 ADD CWT ADDRESS ADK A3,CWTWSS A3 := ADDRESS OF STATUS FOR WS SCR A1,A3 SAVE ERROR CODE LDK A4,WSFERR WORK STATION ERROR ANR* A4,A3 ALREADY DETECTED? RF(NZ) SH110 YES, RETURN LDK A4,WSFERR ORRS A4,A3 SET ERROR DETECTED ST A2,CWTABW,A5 INDICATE ABORT DWT:S FOR WS * SH110 EQU * LDR* A4,A15 POP A4 SH120 EQU * LDR* A3,A15 POP A3 * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * GETSTA * * FUNCTION: * THIS ROUTINE WILL CHECK THE I/O STATUS FOR * A DEVICE. * GETWSS WILL ONLY CHECK THE STATUS FOR THE * WORK STATION CONNECTION. * GETLCS WILL CHECK BOTH LOGICAL CHANNEL AND * WORK STATION STATUS. * * CALL: * CF A15,GETLCS * CF A15,GETWSS * * INPUT: * A5 = CWT ADDRESS * A6 = DWT ADDRESS * * OUTPUT: * A1 = RETURN CODE * CR = CONTENTS OF A1 * INTERR. INHIBITED * ************************************************************ * GETLCS EQU * INH STR A3,A15 PUSH A3 * LDK A1,LINERR SET RETURN CODE IN CASE LD A3,DWTST,A6 DWT STATUS ANK A3,DWFRES RESET PACKET RECIEVED? RF(NZ) LS110 YES, RETURN. RET CODE = LINERR RF LS100 NOT RESET. CHECK WSS * * GETWSS EQU * INH STR A3,A15 PUSH A3 * * LS100 EQU * LC A3,DWTCP2,A6 WS NUMBER ANK A3,MASKWS CLEAN SLA A3,1 MAKE INDEX ADR A3,A5 CWT ADDRESS LC A1,CWTWSS,A3 WS STATUS * * LS110 EQU * LDR* A3,A15 POP A3 ADKL A15,4 ADJUST STACK ANK A1,/FF CLEAN RETURN CODE & SET CR ABR* A15 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * PLGTBU * * FUNCTION: * THIS ROUTINE WILL ALLOCATE A BUFFER AND FORMAT IT * ACCORDING TO THE FORMAT USED BY THIS DRIVER. * * CALL: * CF A15,PLGTBU * * INPUT: * A7 = POOLBLOCK ADDRESS * * OUTPUT: * A2 = LENGTH OF USER PART OF BUFFER * A4 = START OF USER PART OF BUFFER (IF ANY) * CR = NOT 0 IF BUFFER ALLOCATED * 0 IF NO BUFFER ALLOCATED * INTERR. INHIBITED * ************************************************************ * PLGTBU EQU * LDR* A2,A15 SKIP PSW LDR* A2,A15 GET RETURN ADDRESS CF A15,GETBUF A4 := BUFFER. INH ABR(Z) A2 RETURN IF NO BUFFER * ST A2,0,A15 SAVE RETURN ADDRESS ADK A4,BUFHLN START OF USER PART ST A7,BUFLNK,A4 SAVE POOLBLOCK ADDRESS LD A2,POBBUS,A7 BUFFER SIZE SUK A2,BUFHLN A2 := LENGTH OF USER PART RF(P) GU100 CONTINUE IF OK ANK A2,0 TOO SHORT. BUFFER LENGTH & CR := 0 GU100 EQU * ST A2,BUFLEN,A4 USER BUFFER LENGTH ABR* A15 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * PLRLBU * * FUNCTION: * THIS ROUTINE RELEASES AN I/O BUFFER OF THE * FORMAT USED BY THIS DRIVER. * * CALL: * CF A15,PLRLBU * * INPUT: * A4 = BUFFER ADDRESS * * OUTPUT: * A4 = CHANGED * CR = CHANGED * INTERR. INHIBITED IF CPU 852 * ************************************************************ * PLRLBU EQU * STR A7,A15 PUSH A7 LD A7,BUFLNK,A4 POOLBLOCK ADDRESS SUK A4,BUFHLN A4 :- PHYSICAL START OF BUFFER CF A15,RELBUF RELEASE BUFFER & INH LDR* A7,A15 POP A7 * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF IFF CPU852=1 RTN A15 XIF EJECT * ************************************************************ * * ROUTINE NAME: * PLCHAR * * FUNCTION: * THESE ROUTINES ARE USED TO GET A CHARACTER * FROM A BUFFER OR PUT A CHARACTER IN A BUFFER. * THE BUFFER SHOULD HAVE A HEADER OF THE NORMAL * PLC FORMAT (SE "BUFFER LAYOUT" CONSTANT * DEFINITION). * * CALL: * CF A15,PLGECH * CF A15,PLPUCH * * INPUT: * A2 = IF PUT CHAR * BITS 0-7 IRRELEVANT * BITS 8-15 CHARACTER * A4 = BUFFER ADDRESS * * OUTPUT: * A1 = RETURN CODE * -1 IF OVERFLOW/UNDERFLOW, ELSE * AT PLPUCH: 0 * AT PLGECH: NR OF CHAR LEFT IN BUFFER * A2 = IF PLGECH & A1>=0 : * BITS 0-7 ZERO * BITS 8-15 CHARACTER * INTERR. INHIBITED * ************************************************************ * EJECT * PLGECH EQU * INH * LD A1,BUFLEN,A4 LENGTH OF TEXT IN BUFFER LD A2,BUFBIX,A4 BYTE INDEX SUR A1,A2 SUK A1,1 A1 := NR OF CHAR LEFT RF(N) CH100 EXIT IF UNDERFLOW IM BUFBIX,A4 INCREMENT INDEX ADR A2,A4 ABSOLUTE ADDRESS OF CHARACTER LCR A2,A2 GET CHARACTER ANK A2,/FF CLEAN * RF CH110 NORMAL EXIT * * PLPUCH EQU * INH * LD A1,BUFBIX,A4 BYTE INDEX CW A1,BUFLEN,A4 OUTSIDE BUFFER? RF(NL) CH100 YES, ERROR IM BUFBIX,A4 INCREMENT INDEX ADR A1,A4 FREE PLACE IN BUFFER SCR A2,A1 PUT CHARACTER IN BUFFER LDK A1,0 RETURN CODE := OK RF CH110 NORMAL EXIT * * CH100 EQU * LDKL A1,-1 RETURN CODE := ERROR CH110 EQU * ADKL A15,4 ADJUST STACK ABR* A15 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * INTYPE * * FUNCTION: * THIS ROUTINE CHECKS A GENERAL READ ANSWER FROM * THE PLC TO DETERMINE TYPE OF MESSAGE. * * CALL: * CF A15,INTYPE * * INPUT: * A5 = CWT ADDRESS * * OUTPUT: * A2 = CHANGED * A3 = TYPE * A4 = CHANGED * CR = CHANGED * ************************************************************ * INTYPE EQU * LDK A2,X25DAT MINIMUM INPUT LENGTH CW A2,CWTRCA+CCRLEN,A5 LENGTH >= MINIMUM? RF(G) ITERR NO, ERROR * EJECT * LD A3,CWTRCA+CCRBUF,A5 BUFFER ADDRESS LC A2,X25LGN,A3 GROUP NUMBER LDR A4,A2 SAVE ANK A4,/0F CLEAN RF(NZ) IT120 NOT GROUP ZERO * * CHANNEL GROUP ZERO. NORMAL MESSAGES. LC A3,X25FLW,A3 FLOW CONTROL BYTE LDR A4,A3 SAVE ANK A4,/01 FLAG RF(NZ) IT100 NOT DATA PACKET LDK A3,TYDATA ASSUME NORMAL DATA ANK A2,/80 QUALIFY BIT SET? RF(Z) ITEXIT NO, NORMAL DATA. EXIT LDK A3,TYSTAT YES, STATUS MESSAGE RF ITEXIT EXIT * IT100 EQU * LDR A4,A3 SAVE FLOW CONTROL BYTE ANK A3,/02 RECIEVE READY? RF(NZ) IT110 NO LDK A3,TYRR TYPE := RECIEVE READY RF ITEXIT EXIT * IT110 EQU * LDK A3,TYRES ASSUME TYPE = RESET ANK A4,/04 IS IT RESET? RF(Z) ITEXIT YES, EXIT LDK A3,TYRESC NO, TYPE := RESET CONFIRMATION RF ITEXIT EXIT * EJECT * IT120 EQU * * NOT NORMAL MESSAGE LDK A3,TYNFLO ASSUME TYPE = NO FLOW CONTROL SUK A4,1 IS IT NO FLOW CONTROL? RF(Z) ITEXIT YES, EXIT * ITERR EQU * LDK A3,TYERR IRRECOVERABLE ERROR * ITEXIT EQU * IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * OUTBUQ * * FUNCTION: * THIS ROUTINE WILL REMOVE A DWT FROM THE QUEUES FOR * SHORT OR LONG OUTPUT BUFFERS, IF IT IS IN ANY * OF THE QUEUES. * * CALL: * CF A15,OUTBUQ * * INPUT: * A5 = CWT ADDRESS * A6 = DWT ADDRESS * * OUTPUT: * A2 = NOT 0 IF DWT FOUND * 0 IF DWT NOT FOUND * A4 = CHANGED * CR = CHANGED * ************************************************************ * OUTBUQ EQU * STR A1,A15 PUSH A1 STR A7,A15 PUSH A7 LDR A4,A6 DWT ADDRESS ADKL A4,DWTOTQ QUEUE LINK * LDR A7,A5 CWT ADDRESS ADK A7,CWTSBQ SHORT BUFFERS QUEUE CF A15,LNKOUT REMOVE DWT FROM QUEUE LDR A7,A7 FOUND? RF(NZ) OB100 YES, RETURN * LDR A7,A5 ADKL A7,CWTLBQ LONG BUFFERS QUEUE CF A15,LNKOUT REMOVE FROM QUEUE * OB100 EQU * LDR A2,A7 A2 := FOUND / NOT FOUND * LDR* A7,A15 POP A7 LDR* A1,A15 POP A1 IFT CPU852=1 ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * LNKFST * * FUNCTION: * THIS ROUTINE LINKS A QUEUE ELEMENT FIRST IN * A QUEUE (CLOSEST TO QUEUE HEAD). * ONE WORD IN EACH ELEMENT IS USED AS A LINK. * END OF QUEUE IS INDICATED BY LINK=0 IN LAST * ELEMENT. * * CALL: * CF A15,LNKFST * * INPUT: * A4 = QUEUE ELEMENT LINK ADDRESS * A7 = QUEUE HEAD LINK ADDRESS * * OUTPUT: * A1 = CHANGED * CR = CHANGED * ************************************************************ * LNKFST EQU * LDR* A1,A7 FIRST QUEUE ELEMENT STR A1,A4 SET LINK FROM NEW ELEMENT STR A4,A7 SET NEW ELEMENT FIRST IFT CPU852=1 RF LNKRET RETURN XIF IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * LNKLST * * FUNCTION: * THIS ROUTINE LINKS A QUEUE ELEMENT LAST IN * A QUEUE (OPOSITE END TO QUEUE HEAD). * ONE WORD IN EACH ELEMENT IS USED AS A LINK. * END OF QUEUE IS INDICATED BY LINK=0 IN LAST * ELEMENT. * * CALL: * CF A15,LNKLST * * INPUT: * A4 = QUEUE ELEMENT LINK ADDRESS * A7 = QUEUE HEAD LINK ADDRESS * * OUTPUT: * A1 = CHANGED * A7 = CHANGED * CR = CHANGED * ************************************************************ * LNKLST EQU * LDR A1,A7 SAVE PRESENT ELEMENT LDR* A7,A7 NEXT ELEMENT RB(NZ) LNKLST CONTINUE IF NOT LAST ELEMENT STR A4,A1 LINK NEW ELEMENT AFTER LAST CMR A4 SET END MARKER IN LAST ELEMENT * EJECT * IFT CPU852=1 RF LNKRET RETURN XIF IFF CPU852=1 RTN A15 XIF * EJECT * ************************************************************ * * ROUTINE NAME: * LNKOUT * * FUNCTION: * THIS ROUTINE REMOVES AN ELEMENT FROM A QUEUE. * ONE WORD IN EACH ELEMENT IS USED AS A LINK. * END OF QUEUE IS INDICATED BY LINK=0 IN LAST * ELEMENT. * * CALL: * CF A15,LNKOUT * * INPUT: * A4 = QUEUE ELEMENT LINK ADDRESS * A7 = QUEUE HEAD LINK ADDRESS * * OUTPUT: * A1 = CHANGED * A7 = =0 IF ELEMENT NOT FOUND * ><0 IF ELEMENT FOUND * CR = CHANGED * ************************************************************ * LNKOUT EQU * LDR A1,A7 SAVE PRESENT ELEMENT LDR* A7,A7 NEXT ELEMENT RF(Z) LO100 EXIT IF END OF QUEUE CWR A4,A7 ELEMENT FOUND? RB(NE) LNKOUT NO, CHECK NEXT * EJECT * LDR* A7,A7 ELEMENT AFTER WANTED ELEMENT STR A7,A1 SET LINK FROM PREVIOUS TO NEXT LDK A7,1 INDICATE ELEMENT FOUND LO100 EQU * * * IFT CPU852=1 LNKRET EQU * * COMMON EXIT FOR QUEUE ROUTINES * RETURN WITHOUT CHANGING INTERRUPT ENABLE FLAG ADKL A15,2 SKIP PSW LDR* P,A15 RETURN XIF * IFF CPU852=1 RTN A15 XIF * EJECT * * * * ************************************************************ * * PHILIPS TERMINAL SYSTEM PTS * * TBUFF = TOSS BUFFER HANDLING SUBROUTINES * * * ************************************************************ * * THIS PROGRAM CONTAINS A SET OF BUFFER HANDLING * SUBROUTINES. THEY OPERATE ON BUFFERS ORGANIZED * IN BUFFER POOLS. A BUFFER POOL CONSISTS OF A * POOLBLOCK FOR CONTROL INFORMATION, AND ONE OR * MORE BUFFER AREAS. THE POOLBLOCK AND BUFFER * AREA(S) SHOULD BE SUPPLIED BY THE USER. * * ROUTINES IN ORDER OF APPEARANCE IN CODE: * * NAME FUNCTION * * GETBUF GET BUFFER FROM POOL * RELBUF RETURN BUFFER TO POOL * AREBUF DIVIDE AREA INTO BUFFERS * EJECT * ************* * CONSTANTS * ************* * * * POOLBLOCK LAYOUT DEFINITION * * POOLBLOCK WORD OFFSETS POBID EQU 0 POOL IDENTITY POBFLG EQU 2 BINARY FLAGS POBFRE EQU 4 FREE LIST LINK HEAD POBBUS EQU 6 BUFFER SIZE (BYTES) POBARS EQU 8 AREA SIZE (BYTES) * * POOLBLOCK LENGTH POBLEN EQU 10 LENGTH (BYTES) * EJECT * ************************************************************ * * ROUTINE NAME: * GETBUF * * FUNCTION: * THIS ROUTINE FETCHES ONE BUFFER FROM A BUFFER * POOL AND GIVES IT TO THE CALLER. * * CALL: * CF A15,GETBUF * * INPUT: * A7 = POOLBLOCK ADDRESS * * OUTPUT: * A4 = BUFFER ADDRESS IF BUFFER ALLOCATED * ELSE ZERO * CR = CONTENTS OF A4 * INTERR.= INHIBITED * ************************************************************ * GETBUF EQU * INH LD A4,POBFRE,A7 FREE LIST START RF(Z) GB100 NO BUFFER LEFT. EXIT * EJECT * STR A1,A15 PUSH A1 LDR* A1,A4 NEW START OF FREE LIST ST A1,POBFRE,A7 TO POOLBLOCK LDR* A1,A15 POP A1 * GB100 EQU * ADKL A15,4 ADJUST STACK LDR A4,A4 CR := CONTENTS OF A4 ABR* A15 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * RELBUF * * FUNCTION: * THIS ROUTINE RELEASES ONE BUFFER AND RETURNS * IT TO A BUFFER POOL. * * CALL: * CF A15,RELBUF * * INPUT: * A4 = BUFFER ADDRESS * A7 = POOLBLOCK ADDRESS * * OUTPUT: * CR = CHANGED * INTERR.= INHIBITED * ************************************************************ * RELBUF EQU * INH STR A1,A15 PUSH A1 * LD A1,POBFRE,A7 OLD FREE LIST START STR A1,A4 LINK AFTER NEW BUFFER ST A4,POBFRE,A7 SET NEW FREE LIST START * LDR* A1,A15 POP A1 ADKL A15,4 ADJUST STACK ABR* A15 RETURN * EJECT * ************************************************************ * * ROUTINE NAME: * AREBUF * * FUNCTION: * THIS ROUTINE ALLOCATES A SPECIFIED DATA AREA TO * A BUFFER POOL. THIS CAN BE DONE IN TWO WAYS. * "INIBUF" IS USED WHEN A NEW BUFFER POOL IS * INITIATED. IT DIVIDES THE AREA INTO BUFFERS, * LINKS THE BUFFERS IN A CHAIN FROM THE FREE LIST * HEAD IN POOLBLOCK, AND PUTS AN END MARKER (-1) * IN THE LAST BUFFER. "LNKBUF" IS USED WHEN A NEW * AREA IS ADDED TO AN EXISTING BUFFER POOL. IT * DIVIDES THE AREA INTO BUFFERS, AND LINKS THE * BUFFERS FIRST IN THE FREE LIST. * * CALL: * CF A15,INIBUF * CF A15,LNKBUF * * INPUT: * A4 = AREA ADDRESS * A7 = POOLBLOCK ADDRESS * * OUTPUT: * CR = CHANGED IF CPU852 * ************************************************************ * EJECT * INIBUF EQU * IFT CPU852=1 STR A1,A15 PUSH A1 XIF * IFF CPU852=1 MSR 4,A15 PUSH A1-A4 XIF * LDK A1,0 MARKER FOR LAST BUFFER RF IL100 GO TO COMMON PART * * LNKBUF EQU * IFT CPU852=1 STR A1,A15 PUSH A1 XIF * IFF CPU852=1 MSR 4,A15 PUSH A1-A4 XIF * LD A1,POBFRE,A7 LINK TO OLD BUFFERS * * IL100 EQU * * * COMMON PART FOR INIBUF AND LNKBUF * IFT CPU852=1 STR A2,A15 PUSH A2-A4 STR A3,A15 STR A4,A15 XIF * EJECT * LDR A2,A7 ADK A2,POBFRE FREE LIST START LDR A3,A4 AD A3,POBARS,A7 END OF AREA SU A3,POBBUS,A7 HIGEST BUFFER START IN AREA * IL110 EQU * * BUFFER LINKING LOOP SRL A3,1 SHIFT ADDRESS =15 SRL A4,1 . =15 CWR A4,A3 ROOM LEFT? RF(G) IL120 NO, FINISH * SLL A3,1 . =15 SLL A4,1 . =15 STR A4,A2 SET LINK FROM PREVIOUS TO PRESENT LDR A2,A4 NEW PREVIOUS AD A4,POBBUS,A7 NEW PRESENT RB IL110 TAKE NEXT BUFFER * IL120 EQU * SLL A3,1 . =15 SLL A4,1 . =15 STR A1,A2 SET LINK OR END IN LAST BUFFER * IFT CPU852=1 LDR* A4,A15 POP A1-A4 LDR* A3,A15 LDR* A2,A15 LDR* A1,A15 ADKL A15,2 ADJUST STACK LDR* P,A15 RETURN XIF * IFF CPU852=1 MLR 4,A15 POP A1-A4 RTN A15 XIF * IFF UTTEST=0 EJECT * ****************************************** * * ROUTINE NAMES: LOGCOM * LOGIOC * LOGATT * FUNCTION: LOG MSG TYPE AND CCR+BUFFER * DLSSEL SPECIFIES DLS TO BE SELECTED * 0 MEANS LOG ALL * * RECORD FORMAT: BYTE 1-2 MSG TYPE (CO,RE,AT) * BYTE 3 DLS INDEX * BYTE 4 COMMAND CODE * BYTE 5-6 STATUS-1 * BYTE 7 BUFFER LENGTH * BYTE 8 PACKET HEADER -1 * BYTE 9 PACKET HEADER -2 (LOGICAL CHANNEL) * BYTE 10 PACKET HEADER -3 (FLOW CONTOL) * BYTE 11-16 6 FIRST DATA BYTES *********************************************** * DLSSEL DATA 0 0=LOG ALL * ELSE DLS TO BE LOGGED XIF PLCLOG EQU * IFF UTTEST=0 LOGPTR DATA LOGARE RECORD POINTER IN LOG AREA LOGARE RES 960 LOG AREA LOGEND EQU * DATA 'ENDLOG' MARK END OF LOG AREA *-------------------------------------------- LOGCOM EQU * SUBROUTINE ENTRY IFT CPU852=1 STR A1,A15 STR A2,A15 STR A3,A15 XIF IFF UTTEST=0 IFF CPU852=1 MSR 3,A15 PUSH A1-A3 XIF IFF UTTEST=0 LDKL A1,'CO' MSG TYPE LDK A2,CWTCCA CCA OFFSET RF LOG:10 LOGIOC EQU * SUBROUTINE ENTRY IFT CPU852=1 STR A1,A15 STR A2,A15 STR A3,A15 XIF IFF UTTEST=0 IFF CPU852=1 MSR 3,A15 PUSH A1-A3 XIF IFF UTTEST=0 LDKL A1,'RE' MSG TYPE LDK A2,CWTRCA RCA OFFSET RF LOG:10 LOGATT EQU * SUBROUTINE ENTRY IFT CPU852=1 STR A1,A15 STR A2,A15 STR A3,A15 XIF IFF UTTEST=0 IFF CPU852=1 MSR 3,A15 PUSH A1-A3 XIF IFF UTTEST=0 LDKL A1,'AT' MSG TYPE LDK A2,CWTRCA RCA OFFSET *------------------------------------------ LOG:10 EQU * COMMON PART LD A3,LOGPTR STR A1,A3 LOG MSG TYPE ADR A2,A5 CCR PTR LD A1,DLSSEL SELECTED DLS RF(Z) LOG:15 LOG ALL CC A1,CCRDLS,A2 RF(NE) LOG:20 NOT SELECTED,SKIP LOG:15 EQU * LD A1,CCRDLS,A2 DLS INDEX ST A1,2,A3 +COMMAND INTO LOG LD A1,CCRSTA,A2 STATUS-1 ST A1,4,A3 LOG STATUS-1 LD A1,CCRLEN,A2 BUFFER LENGTH SC A1,6,A3 INTO LOG LD A2,CCRBUF,A2 BUFFER ADDRESS LDR* A1,A2 BYTE 0-1 SC A1,8,A3 PACKET HEADER 2 SRL A1,8 SC A1,7,A3 PACKET HEADER 1 LD A1,2,A2 PACKET HEADER 3+ BYTE 1 SC A1,10,A3 SRL A1,8 SC A1,9,A3 LD A1,4,A2 BYTE 2-3 SC A1,12,A3 SRL A1,8 SC A1,11,A3 LD A1,6,A2 BYTE 4-5 SC A1,14,A3 SRL A1,8 SC A1,13,A3 LD A1,8,A2 SRL A1,8 SC A1,15,A3 ADK A3,16 ST A3,LOGPTR NEXT RECORD IN LOG AREA CWK A3,LOGEND END OF LOG AREA? RF(NE) LOG:20 NO! LDKL A1,LOGARE RESET PTR ST A1,LOGPTR LOG:20 EQU * IFT CPU852=1 LDR* A3,A15 RESTORE LDR* A2,A15 LDR* A1,A15 ADKL A15,4 ABR* A15 RETURN XIF IFF UTTEST=0 IFF CPU852=1 MLR 3,A15 RTN A15 XIF * * END