mirror of
https://github.com/PDP-10/stacken.git
synced 2026-02-23 15:32:07 +00:00
3668 lines
125 KiB
Plaintext
3668 lines
125 KiB
Plaintext
TITLE KNISER - KLNI DEVICE DRIVER V111
|
||
SUBTTL WILLIAM C. DAVENPORT/WXD 26-JULY-88
|
||
|
||
SEARCH F,S,DEVPRM,ETHPRM,MACSYM
|
||
T20SYM
|
||
$RELOC
|
||
$HIGH
|
||
|
||
;THIS MODULE IMPLEMENTS THE KLNI INTERFACE DRIVER FOR ETHERNET
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
|
||
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1985,1986,1988.
|
||
;ALL RIGHTS RESERVED.
|
||
|
||
.CPYRT<1985,1988>
|
||
|
||
XP VKNISR,111 ;KNISER VERSION NUMBER
|
||
|
||
IFNDEF FTKNILDR,<FTKNILDR==0> ;-1 TO SUPPORT OLD KNILDR & KNIBT. UUO
|
||
|
||
KNISER::!ENTRY KNISER ;LOAD IF LIBRARY SEARCH
|
||
SUBTTL TABLE OF CONTENTS
|
||
|
||
|
||
; TABLE OF CONTENTS FOR KNISER
|
||
;
|
||
;
|
||
; SECTION PAGE
|
||
; 1. TABLE OF CONTENTS......................................... 2
|
||
; 2. KLNI DEVICE SERVICE
|
||
; 2.1 AUTCON PARAMETERS................................. 3
|
||
; 2.2 KLNI CONFIGURATION................................ 4
|
||
; 2.3 KLNI INITIALIZATION............................... 5
|
||
; 2.4 ONCE A TICK CODE.................................. 6
|
||
; 2.5 ONCE A SECOND CODE................................ 7
|
||
; 2.6 SET MEMORY OFFLINE SUPPORT........................ 9
|
||
; 2.7 REMOVE CPU SUPPORT................................ 11
|
||
; 2.8 CPU OFFLINE SUPPORT............................... 12
|
||
; 2.9 RESET UUO......................................... 13
|
||
; 3. KLNI USER SERVICE
|
||
; 3.1 ETHSER FUNCTION DISPATCH.......................... 14
|
||
; 3.2 SET KONTROLLER ETHERNET ADDRESS................... 16
|
||
; 3.3 READ AND CLEAR KONTROLLER COUNTERS................ 18
|
||
; 3.4 READ AND CLEAR PORTAL COUNTERS.................... 22
|
||
; 3.5 ENABLE PROTOCOL................................... 25
|
||
; 3.6 DISABLE PROTOCOL.................................. 28
|
||
; 3.7 ENABLE MULTI-CAST ADDRESS......................... 31
|
||
; 3.8 DISABLE MULTI-CAST ADDRESS........................ 33
|
||
; 3.9 RECEIVE DATAGRAM.................................. 35
|
||
; 3.10 TRANSMIT DATAGRAM................................. 37
|
||
; 3.11 INTERRUPT ETHSER.................................. 39
|
||
; 3.12 GENERATE KLNI COMMAND BUFFER...................... 40
|
||
; 4. KLNI DEVICE SERVICE
|
||
; 4.1 PORT CONTROL BLOCK INITIALIZATION................. 41
|
||
; 4.2 PORT CONTROL BLOCK RESET.......................... 42
|
||
; 4.3 ADD PROTOCOL TYPE TO PTT TABLE.................... 43
|
||
; 4.4 DELETE PROTOCOL TYPE FROM PTT TABLE............... 44
|
||
; 4.5 ADD MULTI-CAST ADDRESS TO MCAT TABLE.............. 45
|
||
; 4.6 DELETE MULTI-CAST ADDRESS FROM MCAT TABLE......... 46
|
||
; 4.7 UPDATE KLNI COUNTERS AREA......................... 47
|
||
; 4.8 GENERATE BSD CHAIN................................ 48
|
||
; 4.9 RELEASE A BSD CHAIN............................... 52
|
||
; 4.10 ALLOCATE KLNI COMMAND BUFFER...................... 53
|
||
; 4.11 RELEASE KLNI COMMAND BUFFER....................... 54
|
||
; 4.12 QUEUE KLNI COMMAND TO FREE QUEUE.................. 55
|
||
; 4.13 QUEUE KLNI COMMAND TO COMMAND QUEUE............... 56
|
||
; 4.14 MISCELLANEOUS..................................... 57
|
||
; 5. KLNI INTERRUPT SERVICE
|
||
; 5.1 INTERRUPT DISPATCH................................ 58
|
||
; 5.2 PROCESS RESPONSE QUEUE............................ 59
|
||
; 5.3 FREE QUEUE ERROR.................................. 60
|
||
; 5.4 CRAM PARITY ERROR................................. 61
|
||
; 5.5 MBUS ERROR........................................ 65
|
||
; 5.6 EBUS PARITY ERROR................................. 66
|
||
; 5.7 DATA PATH ERROR................................... 67
|
||
; 5.8 KLNI ERROR STOP PROCESSING........................ 68
|
||
; 5.9 SPEAR ERROR LOGGING............................... 69
|
||
; 6. KLNI MAINTENANCE SERVICE
|
||
; 6.1 DIAG. UUO......................................... 71
|
||
; 6.2 KNIBT. UUO........................................ 77
|
||
; 6.3 SHUT DOWN KLNI MICROCODE.......................... 84
|
||
; 6.4 STOP KLNI MICROCODE............................... 85
|
||
; 6.5 PROCESS KLNI QUEUE................................ 86
|
||
; 6.6 START KLNI MICROCODE.............................. 87
|
||
; 6.7 DISABLE KLNI MICROCODE............................ 89
|
||
; 6.8 ENABLE KLNI MICROCODE............................. 90
|
||
; 6.9 INITIALIZE KLNI MICROCODE......................... 91
|
||
; 6.10 READ LATCHED ADDRESS REGISTER..................... 97
|
||
; 6.11 READ CRAM CONTENTS................................ 98
|
||
; 6.12 WRITE CRAM CONTENTS............................... 99
|
||
; 6.13 REQUEST MICROCODE RELOAD.......................... 100
|
||
; 7. QUEUE MANIPULATION
|
||
; 7.1 INITIALIZE QUEUE HEADER........................... 101
|
||
; 7.2 FIX A QUEUE....................................... 102
|
||
; 7.3 REMOVE AN ENTRY FROM QUEUE........................ 103
|
||
; 7.4 INSERT AN ENTRY INTO QUEUE........................ 104
|
||
; 8. BYTE POINTERS............................................. 105
|
||
; 9. THE END................................................... 106
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- MICROCODE VALUES
|
||
|
||
|
||
;MICROCODE ADDRESSES
|
||
|
||
UCODSA==0 ;MICROCODE STARTING ADDRESS
|
||
UCODVR==137 ;MICROCODE VERSION ADDRESS
|
||
|
||
|
||
;MICROCODE VERSION RESTRICTIONS
|
||
|
||
MINUVR==100,,167 ;MINIMUM ALLOWABLE MICROCODE VERSION
|
||
|
||
|
||
;MICROCODE TABLE SIZES
|
||
|
||
MAXPTT==17 ;SIZE OF PTT TABLE
|
||
MAXMCT==17 ;SIZE OF MCAT TABLE
|
||
MAXKCB==54 ;SIZE OF COUNTERS DATA BUFFER
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- QUEUE BLOCKS
|
||
|
||
|
||
;QUEUE HEADER BLOCK
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.QHIWD:! BLOCK 1 ;INTERLOCK WORD
|
||
.QHFLI:! BLOCK 1 ;FORWARD LINK WORD (FLINK)
|
||
.QHBLI:! BLOCK 1 ;BACKWARD LINK WORD (BLINK)
|
||
.QHELN:! BLOCK 1 ;QUEUE ENTRY LENGTH
|
||
|
||
.QHLEN:! ;LENGTH OF QUEUE HEADER
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
DEPHASE
|
||
|
||
|
||
;QUEUE ENTRY BLOCK
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.QEFLI:! BLOCK 1 ;FORWARD LINK WORD (FLINK)
|
||
.QEBLI:! BLOCK 1 ;BACKWARD LINK WORD (BLINK)
|
||
.QERS0:! BLOCK 1 ;RESERVED FOR SOFTWARE
|
||
|
||
.QELEN:! ;LENGTH OF QUEUE ENTRY HEADER
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.QEVAD==.QERS0 ;VIRTUAL ADDRESS OF QUEUE ENTRY
|
||
|
||
DEPHASE
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- BUFFER SEGMENT DESCRIPTOR BLOCK
|
||
|
||
|
||
;A BUFFER SEGMENT DESCRIPTOR DESCRIBES A PHYSICALLY CONTIGUOUS
|
||
;SECTION OF MEMORY. SEVERAL BUFFER SEGMENT DESCRIPTORS MAY BE
|
||
;LINKED TOGETHER TO DESCRIBE A BUFFER BEING SENT OR RECEIVED.
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.BSSBA:! BLOCK 1 ;PHYSICAL BASE ADDRESS OF SEGMENT
|
||
BSASBA==000077,,777777 ;SEGMENT BASE ADDRESS
|
||
|
||
.BSNXT:! BLOCK 1 ;PHYSICAL ADDRESS OF NEXT BSD
|
||
BSNNXT==000077,,777777 ;ADDRESS OF NEXT BSD
|
||
|
||
.BSSGL:! BLOCK 1 ;BUFFER SEGMENT LENGTH
|
||
BSSSGL==000000,,177777 ;SEGMENT LENGTH
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.BSVNB:! BLOCK 1 ;VIRTUAL ADDRESS OF NEXT BSD
|
||
|
||
.BSRWB:! BLOCK 1 ;RE-ALIGNED WORD BYTE OFFSET
|
||
.BSRWA:! BLOCK 1 ;RE-ALIGNED WORD ADDRESS
|
||
.BSRWD:! BLOCK 1 ;RE-ALIGNED WORD DATA
|
||
|
||
.BSLEN:! ;LENGTH OF BSD
|
||
|
||
DEPHASE
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- COMMAND BLOCK
|
||
|
||
|
||
;KLNI COMMAND BLOCK
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
.CMPUB:! BLOCK 1 ;ADDRESS OF PROTOCOL USER BLOCK
|
||
.CMCBA:! BLOCK 1 ;CALLBACK ROUTINE ADDRESS
|
||
.CMEAB:! BLOCK 1 ;ADDRESS OF EA BLOCK
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.CMCMD:! ;START OF KLNI COMMAND
|
||
|
||
.CMQUE:! BLOCK .QELEN ;QUEUE ENTRY WORDS
|
||
|
||
.CMCSW:! BLOCK 1 ;KLNI COMMAND STATUS WORD
|
||
CMCSTS==776000,,000000 ;COMMAND STATUS
|
||
CMSSND==100 ;SEND DATAGRAM FLAG
|
||
CMSETY==076 ;ERROR TYPE
|
||
CMEEXC==00 ;EXCESSIVE COLLISIONS
|
||
CMECCF==01 ;CARRIER CHECK FAILED
|
||
CMECDF==02 ;COLLISION DETECT FAILED
|
||
CMESHT==03 ;SHORT CIRCUIT
|
||
CMEOPN==04 ;OPEN CIRCUIT
|
||
CMEFTL==05 ;FRAME TOO LONG
|
||
CMERFD==06 ;REMOTE FAILURE TO DEFER
|
||
CMEBCE==07 ;BLOCK CHECK ERROR
|
||
CMEFRE==10 ;FRAMING ERROR
|
||
CMEDOV==11 ;DATA OVERRUN
|
||
CMEUPT==12 ;UNRECOGNIZED PROTOCOL TYPE
|
||
CMEFTS==13 ;FRAME TOO SHORT
|
||
CMESCE==27 ;SPURIOUS CHANNEL ERROR
|
||
CMEWNZ==30 ;CHANNEL WORD COUNT NOT ZERO
|
||
CMEQLV==31 ;QUEUE LENGTH VIOLATION
|
||
CMEIPF==32 ;ILLEGAL PLI FUNCTION
|
||
CMEUCM==33 ;UNRECOGNIZED COMMAND
|
||
CMEBLV==34 ;BUFFER LENGTH VIOLATION
|
||
CMEXBP==36 ;TRANSMIT BUFFER PARITY ERROR
|
||
CMEINT==37 ;INTERNAL ERROR
|
||
CMSERR==001 ;ERROR FLAG
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
CMCFLG==001774,,000000 ;COMMAND FLAGS
|
||
CMFCRC==100 ;INTERNALLY GENERATED CRC
|
||
CMFPAD==040 ;PAD DATAGRAM
|
||
CMFBSD==010 ;BSD STYLE BUFFERS
|
||
CMFCLR==002 ;CLEAR COUNTERS AFTER READ
|
||
CMFRSP==001 ;COMMAND RESPONSE REQUIRED
|
||
CMCCMD==000003,,770000 ;COMMAND OPCODE
|
||
CMOXDG==1 ;SEND DATAGRAM
|
||
CMOLDM==2 ;LOAD MCAT TABLE
|
||
CMOLDP==3 ;LOAD PTT TABLE
|
||
CMORCC==4 ;READ AND CLEAR COUNTERS
|
||
CMORDG==5 ;RECEIVE DATAGRAM
|
||
CMOWPL==6 ;WRITE PLI
|
||
CMORPL==7 ;READ PLI
|
||
CMORSA==10 ;READ NI STATION ADDRESS
|
||
CMOWSA==11 ;WRITE NI STATION ADDRESS
|
||
CMOMAX==CMOWSA ;MAXIMUM DEFINED COMMAND OPCODE
|
||
CMCTDR==000000,,001777 ;TIME DOMAIN REFLECTOMETRY VALUE ON ERROR
|
||
|
||
.CMHLN:! ;LENGTH OF COMMON COMMAND HEADER
|
||
.CMLNX==. ;CALCULATE LENGTH OF COMMAND BLOCK
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
DEPHASE
|
||
;SNDDG (1) - SEND DATAGRAM COMMAND
|
||
|
||
PHASE .CMHLN ;FOLLOWING FIXED COMMAND HEADER
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.CMXDL:! BLOCK 1 ;LENGTH OF TEXT DATA
|
||
CMXXDL==000000,,177777 ;TRANSMIT DATAGRAM LENGTH
|
||
|
||
.CMXPT:! BLOCK 1 ;PROTOCOL TYPE CODE
|
||
CMXXPT==000003,,777760 ;TRANSMIT PROTOCOL TYPE
|
||
|
||
.CMXFQ:! BLOCK 1 ;PHYSICAL ADDRESS OF FREE QUEUE HEADER
|
||
.CMXDA:! BLOCK 2 ;DESTINATION ETHERNET ADDRESS
|
||
.CMXBA:! BLOCK 1 ;PHYSICAL ADDRESS OF BSD CHAIN
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.CMXVB:! BLOCK 1 ;VIRTUAL ADDRESS OF BSD CHAIN
|
||
|
||
IFG <.-.CMLNX>,<.CMLNX==.> ;COMPUTE MAXIMUM LENGTH OF COMMAND BLOCK
|
||
|
||
DEPHASE
|
||
|
||
|
||
;DGRCV (5) - DATAGRAM RECEIVED COMMAND
|
||
|
||
PHASE .CMHLN ;FOLLOWING FIXED COMMAND HEADER
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.CMRDL:! BLOCK 1 ;LENGTH OF TEXT DATA
|
||
CMRRDL==000000,,177777 ;RECEIVE DATAGRAM LENGTH
|
||
|
||
.CMRDA:! BLOCK 2 ;DESTINATION ETHERNET ADDRESS
|
||
.CMRSA:! BLOCK 2 ;SOURCE ETHERNET ADDRESS
|
||
|
||
.CMRPT:! BLOCK 1 ;PROTOCOL TYPE CODE
|
||
CMRRPT==000003,,777760 ;RECEIVE PROTOCOL TYPE
|
||
|
||
.CMRBA:! BLOCK 1 ;PHYSICAL ADDRESS OF BSD CHAIN
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.CMRVB:! BLOCK 1 ;VIRTUAL ADDRESS OF BSD CHAIN
|
||
|
||
IFG <.-.CMLNX>,<.CMLNX==.> ;COMPUTE MAXIMUM LENGTH OF COMMAND BLOCK
|
||
|
||
DEPHASE
|
||
;RDNSA (10) - READ NI STATION ADDRESS
|
||
;WRTNSA (11) - WRITE NI STATION ADDRESS
|
||
|
||
PHASE .CMHLN ;FOLLOWING FIXED COMMAND HEADER
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.CMNEA:! BLOCK 2 ;ETHERNET ADDRESS
|
||
|
||
.CMNSM:! BLOCK 1 ;SOFTWARE MODE WORD
|
||
CMMACE==000000,,000010 ;ACCEPT PACKETS WITH CRC ERRORS
|
||
CMMAAM==000000,,000004 ;ACCEPT ALL MULTI-CAST PACKETS
|
||
CMMH4K==000000,,000002 ;H4000 MODE TRANSCEIVER
|
||
CMMPRM==000000,,000001 ;PROMISCUOUS MODE
|
||
|
||
.CMNSW:! BLOCK 1 ;SOFTWARE WORD
|
||
;RDNSA COMMAND
|
||
CMWUCV==000003,,770000 ;KLNI MICROCODE VERSION
|
||
CMWLMC==000000,,007700 ;LENGTH OF MCAT TABLE
|
||
CMWLPT==000000,,000077 ;LENGTH OF PTT TABLE
|
||
;WRTNSA COMMAND
|
||
CMWERC==000000,,007777 ;ERROR RETRY COUNT
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
IFG <.-.CMLNX>,<.CMLNX==.> ;COMPUTE MAXIMUM LENGTH OF COMMAND BLOCK
|
||
|
||
DEPHASE
|
||
|
||
|
||
;DEFINE COMMAND BLOCK LENGTH AS LONGEST COMMAND
|
||
|
||
PHASE .CMLNX
|
||
.CMLEN:! ;LENGTH OF COMMAND BLOCK
|
||
DEPHASE
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- PORT CONTROL BLOCK
|
||
|
||
|
||
;THE PORT CONTROL BLOCK (PCB) IS THE BASIC MEANS OF COMMUNICATION
|
||
;BETWEEN THE KLNI AND THE KLNI DEVICE DRIVER. IT CONTAINS ALL
|
||
;ADDRESSES NEEDED BY THE KLNI AND HEADERS OF SEVERAL QUEUES
|
||
;USED IN COMMUNICATIONS BETWEEN THE KLNI AND ITS DRIVER.
|
||
|
||
PHASE IPKSIZ ;THESE ARE OFFSETS
|
||
|
||
.PBSTS:! BLOCK 1 ;KLNI STATUS FLAGS
|
||
PBSRUN==400000,,000000 ;KLNI IS RUNNING
|
||
PBSONL==200000,,000000 ;KLNI IS ONLINE
|
||
PBSMAI==100000,,000000 ;KLNI IS IN MAINTENANCE MODE
|
||
PBSPRM==040000,,000000 ;KLNI IS IN PROMISCUOUS RECEIVE MODE
|
||
PBSPMM==020000,,000000 ;KLNI IS IN PROMISCUOUS MULTI-CAST MODE
|
||
PBSADD==010000,,000000 ;KLNI AUTO-DUMP DISABLED
|
||
PBSARD==004000,,000000 ;KLNI AUTO-RELOAD DISABLED
|
||
PBSMOF==002000,,000000 ;SET MEMORY OFFLINE IS IN PROGRESS
|
||
PBSINI==001000,,000000 ;INITIALIZE KLNI AFTER MEMORY OFFLINE
|
||
PBSDMP==000400,,000000 ;KLNI DUMP REQUESTED
|
||
PBSRLD==000200,,000000 ;KLNI RELOAD REQUESTED
|
||
PBSQRR==000020,,000000 ;QUEUED RELOAD REQUEST FLAG
|
||
PBSQIO==000010,,000000 ;QUEUED I/O REQUEST FLAG
|
||
PBSCPU==000007,,000000 ;CPU NUMBER OF KLNI
|
||
PBSMJB==000000,,777000 ;JOB NUMBER OF MAINTENANCE JOB
|
||
PBSRJB==000000,,000777 ;JOB NUMBER OF KNILDR
|
||
|
||
.PBUVR:! BLOCK 1 ;KLNI MICROCODE VERSION
|
||
.PBKSA:! BLOCK 1 ;KLNI MICROCODE START ADDRESS
|
||
.PBLGO:! BLOCK 1 ;ADDRESS OF RH20 CHANNEL LOGOUT AREA
|
||
.PBCLI:! BLOCK 1 ;CONI AT LAST INTERRUPT
|
||
.PBCDB:! BLOCK 1 ;ADDRESS OF CHANNEL DATA BLOCK
|
||
.PBEKB:! BLOCK 1 ;ADDRESS OF ETHSER'S KONTROLLER BLOCK
|
||
|
||
.PBHEA:! BLOCK 2 ;HARDWARE ETHERNET ADDRESS
|
||
.PBEAD:! BLOCK 2 ;CURRENT ETHERNET ADDRESS
|
||
|
||
.PBLPT:! BLOCK 1 ;LENGTH OF PTT
|
||
.PBCPT:! BLOCK 1 ;COUNT OF ENTRIES USED IN PTT
|
||
.PBVPT:! BLOCK 1 ;VIRTUAL ADDRESS OF PTT
|
||
|
||
.PBLMC:! BLOCK 1 ;LENGTH OF MCAT
|
||
.PBCMC:! BLOCK 1 ;COUNT OF ENTRIES USED IN MCAT
|
||
.PBVMC:! BLOCK 1 ;VIRTUAL ADDRESS OF MCAT
|
||
|
||
.PBLCD:! BLOCK 1 ;LENGTH OF COUNTERS DATA BUFFER
|
||
.PBVCD:! BLOCK 1 ;VIRTUAL ADDRESS OF KLNI COUNTERS BUFFER
|
||
.PBVCT:! BLOCK 1 ;VIRTUAL ADDRESS OF KLNI COUNTERS AREA
|
||
|
||
.PBOLD:! BLOCK 1 ;NON-ZERO IF ALREADY CONFIGURED
|
||
.PBULB:! BLOCK .ULLEN ;MICROCODE LOADER PARAMETER BLOCK
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
.PBBIT:! BLOCK 1 ;ADDRESS OF CONI BITS TO TEST ON INTERRUPT
|
||
.PBKSC:! BLOCK 1 ;COUNT OF TIMES KLNI STARTED
|
||
.PBKST:! BLOCK 1 ;SYSTEM UPTIME WHEN KLNI LAST STARTED
|
||
.PBKAC:! BLOCK 1 ;COUNT OF TIMES KLNI KEEP ALIVE FAILED
|
||
.PBKAT:! BLOCK 1 ;SYSTEM UPTIME OF LAST KLNI KEEP ALIVE FAILURE
|
||
.PBKEC:! BLOCK 1 ;COUNT OF KLNI ERRORS
|
||
.PBKET:! BLOCK 1 ;SYSTEM UPTIME OF LAST KLNI ERROR
|
||
.PBKHC:! BLOCK 1 ;COUNT OF TIMES KLNI HALTED
|
||
.PBKHT:! BLOCK 1 ;SYSTEM UPTIME WHEN KLNI LAST HALTED
|
||
.PBKLC:! BLOCK 1 ;COUNT OF TIMES KLNI RELOAD REQUESTED
|
||
.PBKQC:! BLOCK 1 ;COUNT OF QUEUED I/O COMMANDS QUEUED
|
||
.PBKQT:! BLOCK 1 ;SYSTEM UPTIME OF LAST QUEUED I/O COMMAND
|
||
.PBKFC:! BLOCK 1 ;COUNT OF PROTOCOL FREE QUEUE COMMANDS QUEUED
|
||
.PBKFT:! BLOCK 1 ;SYSTEM UPTIME OF LAST FREE QUEUE COMMAND
|
||
.PBKCC:! BLOCK 1 ;COUNT OF KLNI COMMANDS QUEUED
|
||
.PBKCT:! BLOCK 1 ;CPU UPTIME OF LAST KLNI COMMAND
|
||
.PBKRC:! BLOCK 1 ;COUNT OF KLNI RESPONSES PROCESSED
|
||
.PBKRT:! BLOCK 1 ;CPU UPTIME OF LAST KLNI RESPONSE
|
||
|
||
;ERROR INFORMATION
|
||
|
||
.PBMCE:! BLOCK 1 ;COUNT OF MULTICAST CHECKSUM ERRORS
|
||
.PBFQE:! BLOCK 1 ;COUNT OF FREE QUEUE EMPTY ERRORS
|
||
.PBCIB:! BLOCK 1 ;COUNT OF INTERLOCKS BROKEN
|
||
.PBCLE:! BLOCK 1 ;CONI ON LAST ERROR INTERRUPT
|
||
.PBCRA:! BLOCK 1 ;CRAM ADDRESS FROM LAST ERROR
|
||
.PBCRC:! BLOCK 2 ;CRAM CONTENTS FROM LAST ERROR
|
||
.PBLG0:! BLOCK 1 ;CHANNEL LOGOUT WORD 0 FROM LAST ERROR
|
||
.PBLG1:! BLOCK 1 ;CHANNEL LOGOUT WORD 1 FROM LAST ERROR
|
||
.PBLG2:! BLOCK 1 ;CHANNEL LOGOUT WORD 2 FROM LAST ERROR
|
||
.PBECW:! BLOCK 1 ;PORT'S CCW FROM LAST ERROR
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.PBPCB:!
|
||
|
||
.PBCMQ:! BLOCK .QHLEN ;COMMAND QUEUE
|
||
.PBRSQ:! BLOCK .QHLEN ;RESPONSE QUEUE
|
||
.PBUPQ:! BLOCK .QHLEN ;UNKNOWN PROTOCOL TYPE QUEUE
|
||
|
||
.PBRS0:! BLOCK 1 ;RESERVED FOR SOFTWARE
|
||
|
||
.PBPTT:! BLOCK 1 ;PHYSICAL ADDRESS OF PTT
|
||
.PBMCT:! BLOCK 1 ;PHYSICAL ADDRESS OF MCAT
|
||
|
||
.PBRS1:! BLOCK 1 ;RESERVED FOR SOFTWARE
|
||
|
||
.PBER0:! BLOCK 1 ;ERROR WORD 0
|
||
PBECMD==1B0 ;ERROR WHILE READING A COMMAND
|
||
PBERES==1B3 ;ERROR WHILE BUILDING RESPONSE
|
||
PBEFLI==77777777B35 ;FLINK OF QUEUE IN ERROR
|
||
.PBER1:! BLOCK 1 ;ERROR WORD 1 (API FUNCTION WORD)
|
||
.PBER2:! BLOCK 1 ;ERROR WORD 2 (CHANNEL LOGOUT WORD 1)
|
||
.PBER3:! BLOCK 1 ;ERROR WORD 3 (CHANNEL LOGOUT WORD 2)
|
||
|
||
.PBPBA:! BLOCK 1 ;PHYSICAL ADDRESS OF PCB
|
||
.PBPIA:! BLOCK 1 ;PRIORITY INTERRUPT ASSIGNMENT
|
||
.PBRP0:! BLOCK 1 ;RESERVED TO KLNI MICROCODE
|
||
.PBCCW:! BLOCK 1 ;CHANNEL COMMAND WORD
|
||
|
||
.PBKCB:! BLOCK 1 ;PHYSICAL ADDRESS OF KLNI COUNTERS BUFFER
|
||
|
||
.PBPCL==.-.PBPCB ;LENGTH OF PCB AREA DEFINED BY KLNI MICROCODE
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.PBLEN:! ;LENGTH OF PORT CONTROL BLOCK
|
||
|
||
DEPHASE
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- PROTOCOL TYPE TABLE
|
||
|
||
|
||
;THE PROTOCOL TYPE TABLE SPECIFIES A SET OF PROTOCOL TYPES, WITH
|
||
;THEIR ASSOCIATED FREE QUEUE POINTERS THAT ARE CONSIDERED ENABLED
|
||
;BY THE PORT.
|
||
;
|
||
;THE PROTOCOL TYPES IN THIS TABLE COME INTO EFFECT ONLY AFTER
|
||
;THE EXECUTION OF A LOAD PTT COMMAND.
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.PTPTY:! BLOCK 1 ;PROTOCOL TYPE WORD
|
||
PTTENA==400000,,000000 ;PROTOCOL ENABLED
|
||
PTTPTY==000003,,777760 ;PROTOCOL TYPE CODE
|
||
|
||
.PTFRQ:! BLOCK 1 ;PHYSICAL ADDRESS OF FREE QUEUE HEADER
|
||
|
||
.PTRS0:! BLOCK 1 ;RESERVED TO SOFTWARE
|
||
|
||
.PTLEN:! ;LENGTH OF PTT ENTRY
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.PTPUB==.PTRS0 ;ADDRESS OF PROTOCOL USER BLOCK
|
||
|
||
DEPHASE
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- MULTI-CAST ADDRESS TABLE
|
||
|
||
|
||
;THE MCAT IS THE MULTI-CAST ADDRESS TABLE. THIS TABLE SPECIFIES
|
||
;WHICH MULTI-CAST ADDRESSES ARE TO BE ACCEPTED BY THE KLNI
|
||
;ADDRESS FILTER.
|
||
;
|
||
;THE ADDRESSES IN THIS TABLE COME INTO EFFECT ONLY AFTER THE
|
||
;EXECUTION OF A LOAD MCAT COMMAND.
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.MCHAD:! BLOCK 1 ;HIGH ORDER MULTI-CAST ADDRESS
|
||
MCTHAD==777777,,777760 ;HIGH ORDER MULTI-CAST ADDRESS
|
||
|
||
.MCLAD:! BLOCK 1 ;LOW ORDER MULTI-CAST ADDRESS
|
||
MCTLAD==777774,,000000 ;LOW ORDER MULTI-CAST ADDRESS
|
||
MCTENA==000000,,000001 ;MULTI-CAST ADDRESS ENABLED
|
||
|
||
.MCLEN:! ;LENGTH OF MCAT ENTRY
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
DEPHASE
|
||
SUBTTL KLNI HARDWARE DEFINITIONS -- COUNTERS BLOCK
|
||
|
||
|
||
;THE COUNTERS BLOCK CONTAINS ERROR COUNTERS ACCUMULATED BY THE KLNI.
|
||
;IT IS UPDATED UPON EXECUTION OF A READ/CLEAR COUNTERS COMMAND.
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
;***** START OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
.KCBYR:! BLOCK 1 ;BYTES RECEIVED
|
||
.KCBYX:! BLOCK 1 ;BYTES TRANSMITTED
|
||
.KCDGR:! BLOCK 1 ;DATAGRAMS RECEIVED
|
||
.KCDGX:! BLOCK 1 ;DATAGRAMS TRANSMITTED
|
||
.KCMBR:! BLOCK 1 ;MULTI-CAST BYTES RECEIVED
|
||
.KCMDR:! BLOCK 1 ;MULTI-CAST DATAGRAMS RECEIVED
|
||
.KCDXD:! BLOCK 1 ;DATAGRAMS TRANSMITTED, INITIALLY DEFERRED
|
||
.KCDX1:! BLOCK 1 ;DATAGRAMS TRANSMITTED, SINGLE COLLISION
|
||
.KCDXM:! BLOCK 1 ;DATAGRAMS TRANSMITTED, MULTIPLE COLLISIONS
|
||
.KCXMF:! BLOCK 1 ;TRANSMIT FAILURES
|
||
.KCXFM:! BLOCK 1 ;TRANSMIT FAILURE BIT MASK
|
||
CXFCRL==004000 ;CARRIER LOST
|
||
CXFBPE==002000 ;BUFFER PARITY ERROR
|
||
CXFRFD==001000 ;REMOTE FAILURE TO DEFER
|
||
CXFFTL==000400 ;FRAME TOO LONG
|
||
CXFOPN==000200 ;OPEN CIRCUIT
|
||
CXFSHT==000100 ;SHORT CIRCUIT
|
||
CXFCDF==000040 ;COLLISION DETECT CHECK FAILED
|
||
CXFEXC==000020 ;EXCESSIVE COLLISIONS
|
||
.KCCDF:! BLOCK 1 ;COLLISION DETECT CHECK FAILURES
|
||
.KCRCF:! BLOCK 1 ;RECEIVE FAILURES
|
||
.KCRFM:! BLOCK 1 ;RECEIVE FAILURE BIT MASK
|
||
CRFFPE==000400 ;FREE LIST PARITY ERROR
|
||
CRFNFB==000200 ;NO FREE BUFFERS
|
||
CRFFTL==000100 ;FRAME TOO LONG
|
||
CRFFRE==000040 ;FRAMING ERROR
|
||
CRFBCE==000020 ;BLOCK CHECK ERROR
|
||
.KCFQU:! BLOCK 1 ;FREE QUEUE ERRORS, UNKNOWN PROTOCOL QUEUE
|
||
.KCFQP:! BLOCK ^D16 ;FREE QUEUE ERRORS, INDIVIDUAL PROTOCOL TYPES
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
.KCUFD:! BLOCK 1 ;UNRECOGNIZED FRAME DESTINATION
|
||
.KCDOV:! BLOCK 1 ;DATA OVERRUN ERRORS
|
||
.KCSBU:! BLOCK 1 ;UNUSED
|
||
.KCFQE:! BLOCK 1 ;FREE QUEUE ERRORS, ALL QUEUES
|
||
.KCHE1:! BLOCK 1 ;HARDWARE ERROR COUNTS
|
||
CH1PRP==777777,,000000 ;PLI REGISTER READ PARITY ERRORS
|
||
CH1PPE==000000,,777777 ;PLI PARITY ERRORS
|
||
.KCHE2:! BLOCK 1 ;HARDWARE ERROR COUNTS
|
||
CH2MPE==777777,,000000 ;DATA MOVER PARITY ERRORS
|
||
CH2CPE==000000,,777777 ;CBUS PARITY ERRORS
|
||
.KCHE3:! BLOCK 1 ;HARDWARE ERROR COUNTS
|
||
CH3EPE==777777,,000000 ;EBUS PARITY ERRORS
|
||
CH3EQP==000000,,777777 ;EBUS QUEUE PARITY ERRORS
|
||
.KCHE4:! BLOCK 1 ;HARDWARE ERROR COUNTS
|
||
CH4CHN==777777,,000000 ;CHANNEL ERRORS
|
||
CH4SCE==000000,,777777 ;SPURIOUS CHANNEL ERRORS
|
||
.KCHE5:! BLOCK 1 ;HARDWARE ERROR COUNTS
|
||
CH5SXA==777777,,000000 ;SPURIOUS TRANSMIT ATTENTION ERRORS
|
||
CH5CRT==000000,,777777 ;CBUS REQUEST TIMEOUT ERRORS
|
||
.KCHE6:! BLOCK 1 ;HARDWARE ERROR COUNTS
|
||
CH6UBP==777777,,000000 ;USER BUFFER PARITY ERRORS
|
||
CH6XBP==000000,,777777 ;TRANSMIT BUFFER PARITY ERRORS
|
||
.KCHEX:! BLOCK 3 ;RESERVED
|
||
|
||
.KCLEN:! ;LENGTH OF COUNTERS DATA BUFFER
|
||
|
||
IF1,<IFN <.KCLEN-MAXKCB>,<PRINTX ?KLNI counters definition is in error>>
|
||
|
||
;***** END OF WORDS DEFINED BY THE KLNI MICROCODE *****
|
||
|
||
DEPHASE
|
||
SUBTTL KLNI SOFTWARE DEFINITIONS -- TIMER VALUES
|
||
|
||
|
||
;TIMEOUTS
|
||
|
||
TIMOUT==^D5000 ;INTERLOCK WORD TIMEOUT VALUE
|
||
IDLTIM==^D1*^D1000 ;KLNI IDLE TIMER (MILLISECONDS)
|
||
KAFTIM==^D30*^D1000 ;KLNI KEEP ALIVE TIMER (MILLISECONDS)
|
||
UPTTIM==^D5*^D60*^D1000 ;KLNI UPTIME TIMER (MILLISECONDS)
|
||
SUBTTL KLNI SOFTWARE DEFINITIONS -- PROTOCOL USER BLOCK
|
||
|
||
|
||
;KNISER MAINTAINS A PROTOCOL USER BLOCK FOR EACH PROTOCOL ENABLED
|
||
;ON THE KLNI. THIS BLOCK CONTAINS INFORMATION NEEDED TO PROPERLY
|
||
;PROCESS INCOMING DATAGRAMS AND TO INTERFACE WITH ETHSER.
|
||
|
||
PHASE 0 ;THESE ARE OFFSETS
|
||
|
||
.PUPTY:! BLOCK 1 ;PROTOCOL TYPE CODE (KLNI FORMAT)
|
||
|
||
.PUSTS:! BLOCK 1 ;PROTOCOL STATUS WORD
|
||
PUSPAD==400000,,000000 ;PROTOCOL USES PADDING
|
||
PUSPTT==000000,,000077 ;PTT TABLE INDEX OF THIS PROTOCOL
|
||
|
||
.PUEPB:! BLOCK 1 ;ADDRESS OF ETHSER'S PORTAL BLOCK
|
||
|
||
.PUFQH:! BLOCK .QHLEN ;FREE QUEUE HEADER FOR THIS PROTOCOL
|
||
|
||
.PULEN:! ;LENGTH OF PROTOCOL USER BLOCK
|
||
|
||
DEPHASE
|
||
SUBTTL KLNI SOFTWARE DEFINITIONS -- DIAG. UUO
|
||
|
||
|
||
|
||
;DIAG. ERROR CODES
|
||
|
||
DIANP%==1 ;INSUFFICIENT PRIVILEGES
|
||
DIAIA%==2 ;ILLEGAL NUMBER OF ARGUMENTS
|
||
DIAIC%==3 ;ILLEGAL CONTROLLER NUMBER
|
||
DIAIU%==4 ;ILLEGAL UNIT NUMBER
|
||
DIAAA%==5 ;SOME UNITS ALREADY ASSIGNED
|
||
DIADM%==6 ;UNIT NOT IN DIAGNOSTIC MODE
|
||
DIAAJ%==7 ;UNIT ASSIGNED TO ANOTHER JOB
|
||
DIAFC%==10 ;NOT ENOUGH FREE CORE
|
||
DIAAU%==11 ;NO ASSIGNED UNITS
|
||
DIACP%==12 ;IOWD CROSSES PAGE BOUNDARY
|
||
DIAIF%==13 ;ILLEGAL FUNCTION
|
||
DIAVC%==14 ;JOB MUST NOT BE VIRTUAL
|
||
DIANC%==15 ;NO SUCH CPU
|
||
DIANR%==16 ;CPU NOT RUNNING
|
||
DIABA%==17 ;BAD ARGUMENT LIST
|
||
DIACI%==20 ;NO CI PORT ON SPECIFIED CPU
|
||
DIATO%==21 ;READ PORT COUNTERS FUNCTION TIMED OUT
|
||
DIANK%==22 ;NO KLNI PRESENT ON CPU
|
||
SUBTTL KLNI SOFTWARE DEFINITIONS -- KNIBT. UUO
|
||
IFN FTKNILDR,<
|
||
|
||
;KNIBT. FUNCTION CODES
|
||
|
||
.KBSTS==1 ;CHECK KLNI STATUS
|
||
.KBSRJ==2 ;SET KLNI RELOAD JOB
|
||
.KBSTP==3 ;STOP KLNI
|
||
.KBSTA==4 ;START KLNI
|
||
.KBRED==5 ;READ KLNI CRAM
|
||
.KBWRT==6 ;WRITE KLNI CRAM
|
||
|
||
|
||
;KNIBT. FUNCTION .KBSTS STATUS BITS
|
||
|
||
KS.RUN==400000,,000000 ;KLNI IS RUNNING
|
||
KS.MAI==200000,,000000 ;KLNI IS IN MAINTENANCE MODE
|
||
KS.RLD==100000,,000000 ;KLNI NEEDS RELOADING
|
||
KS.ARD==040000,,000000 ;KLNI AUTO-RELOAD IS DISABLED
|
||
KS.RRQ==020000,,000000 ;KLNI RELOAD REQUESTED BY SYSTEM
|
||
KS.DRQ==010000,,000000 ;KLNI DUMP REQUESTED BY SYSTEM
|
||
KS.ADD==004000,,000000 ;KLNI AUTO-DUMP IS DISABLED
|
||
KS.RJB==000000,,777777 ;JOB NUMBER OF KNILDR
|
||
|
||
|
||
;KNIBT. ERROR CODES
|
||
|
||
KBPRV%==1 ;INSUFFICIENT PRIVILEGES
|
||
KBADC%==2 ;ADDRESS CHECK
|
||
KBIAL%==3 ;INVALID ARGUMENT LIST
|
||
KBILF%==4 ;ILLEGAL FUNCTION
|
||
KBICS%==5 ;ILLEGAL CPU SPECIFICATION
|
||
KBCNA%==6 ;CPU NOT AVAILABLE
|
||
KBKDE%==7 ;KLNI DOESN'T EXIST
|
||
KBKMM%==10 ;KLNI IS IN MAINTENANCE MODE
|
||
KBDNS%==11 ;KLNI DID NOT START
|
||
KBDNI%==12 ;KLNI DID NOT INITIALIZE
|
||
KBICA%==13 ;INVALID CRAM ADDRESS
|
||
KBCRE%==14 ;CRAM READ ERROR
|
||
KBCWE%==15 ;CRAM WRITE ERROR
|
||
KBNRJ%==16 ;NOT THE RELOAD JOB
|
||
>;END IFN FTKNILDR
|
||
SUBTTL KLNI DEVICE SERVICE -- AUTCON PARAMETERS
|
||
|
||
|
||
KNIBTS==CI.CPE!CI.MER!CI.EPE!CI.FQE!CI.RQA ;BITS TO TEST FOR ON INTERRUPT
|
||
|
||
CO.BTS==CO.MRN ;BITS WHICH MUST BE ON FOR ALL CONOS
|
||
|
||
|
||
;DRIVER CHARARCTERISTICS
|
||
; KNI = KNICNF
|
||
; KNI = KLNI
|
||
; M.CPU = MAXIMUM DEVICES IN SYSTEM
|
||
; .KTKNI = KONTROLLER TYPE
|
||
; 0 = MAXIMUM DRIVES PER KONTROLLER
|
||
; 0 = HIGHEST DFRIVE NUMBER ON KONTROLLER
|
||
; MDSEC0 = SECTION FOR KDB/UDB
|
||
; MDSEC0 = SECTION FOR DDB
|
||
DRVCHR (KNI,KNI,M.CPU##,.KTKNI,0,0,MDSEC0,MDSEC0,<DR.XAD!DR.NMC>)
|
||
|
||
|
||
.ORG IPKSIZ
|
||
BLOCK .PBLEN ;PCB
|
||
KNIKLN:! ;LENGTH OF KDB
|
||
.ORG
|
||
|
||
|
||
KNIKDB: KDBBEG (KNI,KNIKLN)
|
||
SETWRD (KDBNAM,<SIXBIT/KNI/>) ;KONTROLLER NAME
|
||
SETWRD (KDBPCC,<.PBPCL,,.PBPCB>) ;PHYSICALLY CONTIGUOUS CORE
|
||
SETWRD (.PBOLD,<EXP -1>) ;FULL CONFIGURE FIRST TIME
|
||
KDBEND
|
||
|
||
|
||
EQUATE (LOCAL,0,<KNICKT,KNIUDB,KNIULN>)
|
||
|
||
KNIULB==.PBULB ;OFFSET OF UCODE LOADER BLOCK
|
||
KNIICD==IPAICD## ;PROTOTYPE INTERRUPT CODE ADDRESS
|
||
KNIICL==IPAICL## ;PROTOTYPE INTERRUPT CODE LENGTH
|
||
|
||
KNIDSP: DRVDSP (KNI,KNICHN##,,,KNIDIA)
|
||
|
||
;DEFAULT MONGEN'ED DEVICE TABLE
|
||
DEFMDT: MDKL10 (7,564,0,0,<MD.KON>) ;DEVICE CODE 564
|
||
MDTERM ;TERMINATE TABLE
|
||
|
||
;PROTOTYPE MICROCODE PARAMETER BLOCK
|
||
KNIULP: EXP .BTKNI## ;MICROCODE INDEX
|
||
XWD 000,0 ;DEVICE CODE,,MASSBUS UNIT NUMBER
|
||
SIXBIT /KLNI/ ;INTERFACE NAME
|
||
SIXBIT /NIA20/ ;CHANNEL NAME
|
||
EXP MINUVR ;MINIMUM MICROCODE VERSION
|
||
EXP 0 ;DATE/TIME OF LOAD SUCCESS OR FAILURE
|
||
EXP 0 ;MICROCODE VERSION
|
||
EXP 0 ;POINTER TO MAGIC TABLE
|
||
EXP 0 ;MICROCODE LENGTH
|
||
EXP 0 ;MICROCODE ADDRESS
|
||
SUBTTL KLNI DEVICE SERVICE -- KLNI CONFIGURATION
|
||
|
||
|
||
;ROUTINE CALLED WHEN AUTCON
|
||
;LINKAGE:
|
||
; T1/ DEVICE CODE
|
||
; T2/ CONI BITS
|
||
; PUSHJ P,KNICFG
|
||
;RETURNS:
|
||
; CPOPJ TO STOP SCANNING DRIVERS
|
||
; CPOPJ1 TO SCAN OTHER DRIVERS
|
||
|
||
KNICFG: CAIL T1,FSTICD/4 ;AN RH20?
|
||
CAILE T1,LSTICD/4 ;...
|
||
JRST CPOPJ1## ;WRONG DRIVER
|
||
TLNN T2,(CI.PPT) ;IPA CHANNEL?
|
||
JRST CPOPJ1## ;NO
|
||
PUSHJ P,TYIPA## ;TRY TO DETERMINE THE PORT TYPE
|
||
JRST KNICF1 ;CAN'T
|
||
CAIN T1,.CIKNI ;KLNI?
|
||
JRST KNICF2 ;YES
|
||
JRST CPOPJ1## ;ON TO THE NEXT DRIVER
|
||
|
||
KNICF1: XMOVEI T1,KNIMDT## ;MONGEN'ED DEVICE TABLE
|
||
XMOVEI T2,DEFMDT ;DEFAULT TABLE
|
||
MOVNI T3,1 ;NO MASSBUS UNIT OR DRIVE INFORMATION
|
||
MOVEI T4,MD.KON ;MATCH ON KONTROLLER DEFINITION
|
||
PUSHJ P,AUTMDT## ;SCAN THE TABLES
|
||
JRST CPOPJ1## ;NO MATCHES
|
||
|
||
KNICF2: MOVSI T1,CP.KNI ;KLNI CHANNEL
|
||
PUSHJ P,AUTCHN## ;BUILD A CHANNEL DATA BLOCK
|
||
POPJ P, ;NO CORE
|
||
MOVNI T1,1 ;NOT MULTI-UNIT, BUT MUST DO ANYWAY
|
||
PUSHJ P,AUTKDB## ;BUILD A KDB
|
||
POPJ P, ;GIVE UP IF NO CORE
|
||
AOSE .PBOLD(W) ;BEEN HERE BEFORE?
|
||
POPJ P, ;YES--DO NOTHING OR I/O WILL STOP
|
||
|
||
MOVE T1,.CPCHA## ;GET CHANNEL DATA BLOCK ADDRESS
|
||
MOVEM T1,.PBCDB(W) ;SAVE IN THE PCB
|
||
|
||
HRRZ T1,@KDBCSO(W) ;ADDRESS OF CONI BITS TO TEST IN SKIP CHAIN
|
||
MOVEM T1,.PBBIT(W) ;UPDATE
|
||
MOVE T1,[KNIBTS] ;BITS TO TEST FOR ON INTERRUPT
|
||
MOVEM T1,@.PBBIT(W) ;SET IN THE CONSO SKIP CHAIN CODE
|
||
PUSHJ P,IPAADB## ;ALLOCATE DRAM DUMP BUFFER
|
||
PJRST KNIINI ;INITIALIZE THE KLNI AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- SYSINI INITIALIZATION
|
||
|
||
|
||
;ROUTINE TO DO ONCE-ONLY SYSINI INITIALIZATION.
|
||
;LINKAGE:
|
||
; PUSHJ P,KNISYS
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
$INIT
|
||
|
||
KNISYS::
|
||
IFE FTXMON,<
|
||
MOVEI T1,KNISIZ## ;SIZE OF KLNI FREECORE NEEDED
|
||
PUSHJ P,INICOR## ;ALLOCATE CORE
|
||
MOVEM T2,KNILOC## ;SAVE STARTING ADDRESS
|
||
>; END IFN FTXMON
|
||
IFN FTXMON,<
|
||
MOVEI T2,KNISIZ## ;SIZE OF FREECORE
|
||
MOVEI T1,(MS.DCN) ;SECTION NUMBER
|
||
PUSHJ P,GFWNZN## ;ASK ONCMOD FOR NON-ZERO SECTION CORE
|
||
HALT . ;*** FOR NOW
|
||
MOVEM T1,KNILOC## ;SAVE AS LOWEST ADDRESS IN FREECORE
|
||
>; END IFN FTXMON
|
||
POPJ P, ;RETURN
|
||
|
||
$HIGH
|
||
SUBTTL KLNI DEVICE SERVICE -- KLNI INITIALIZATION
|
||
|
||
|
||
;ROUTINE CALLED TO INITIALIZE THE KLNI ON THIS CPU
|
||
;LINKAGE:
|
||
; PUSHJ P,KNIINI
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNIINI::PUSHJ P,SAVQ## ;SAVE Q1-Q3
|
||
PUSHJ P,SAVE1## ;SAVE P1
|
||
SE1ENT ;RUN IN SECTION 1
|
||
SETZB Q1,Q2 ;START CLEAN
|
||
XMOVEI P1,SYSCHN##-CHNSYS ;SET PREDECESSOR
|
||
MOVEI T1,CP.KNI ;KLNI CHANNEL BITS
|
||
|
||
KNIIN1: MOVE P1,CHNSYS(P1) ;GET CHANNEL ADDRESS
|
||
HLRZS P1 ;ADDRESS IN LH QUANTITY
|
||
JUMPE P1,CPOPJ## ;THERE MUST BE ONE!
|
||
HLRZ T2,CHNTYP(P1) ;GET INTERESTING BITS
|
||
CAIE T1,(T2) ;A KLNI?
|
||
JRST KNIIN1 ;TRY AGAIN
|
||
LDB T2,CHYCPU## ;GET CPU NUMBER
|
||
CAME T2,.CPCPN## ;OURS?
|
||
JRST KNIIN1 ;NO
|
||
MOVE T1,CHNTBP(P1) ;FETCH THE KDB (PCB) TABLE POINTER
|
||
SKIPN Q3,(T1) ;AND GET THE PORT CONTROL BLOCK
|
||
POPJ P, ;NO KLNI ON THIS CPU
|
||
SKIPE .CPNPB## ;RESTART?
|
||
JRST [PUSHJ P,SHTKNI ;YES, SHUT DOWN KLNI
|
||
PUSHJ P,PCBINI ;RESET THE PORT CONTROL BLOCK
|
||
JRST RLDKNI] ;REQUEST KLNI RELOAD AND RETURN
|
||
PUSHJ P,PCBINI ;INITIALIZE THE PCB
|
||
MOVE T1,Q3 ;GET ADDRESS OF PORT CONTROL BLOCK
|
||
XMOVEI T2,KNUSER ;AND ADDRESS OF OUR DISPATCH ROUTINE
|
||
MOVSI T3,.KTKNI ;GET KONTROLLER TYPE AND NUMBER
|
||
PUSHJ P,ETKINI## ;CREATE AN ETHERNET KONTROLLER BLOCK
|
||
STOPCD CPOPJ##,DEBUG,KNICCK ;++CAN'T CREATE ETHERNET KONTROLLER BLOCK
|
||
MOVEM T1,.PBEKB(Q3) ;LINK KONTROLLER BLOCK TO PORT CONTROL BLOCK
|
||
MOVEM Q3,.CPNPB## ;SAVE PCB ADDRESS IN CDB
|
||
|
||
MOVE T1,.CPBIT## ;GET OUR CPU'S BIT
|
||
TDNN T1,IPAMSK## ;WANT TO SKIP STARTING THE NI?
|
||
PJRST RLDKNI ;REQUEST RELOAD OF KLNI AND RETURN
|
||
POPJ P, ;SKIP RELOAD AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- ONCE A TICK CODE
|
||
|
||
|
||
;ROUTINE CALLED ONCE A TICK ON ALL CPUS
|
||
;LINKAGE:
|
||
; PUSHJ P,KNITIC
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNITIC::SKIPN .CPNPB## ;THIS CPU HAVE A KLNI?
|
||
POPJ P, ;NO, RETURN
|
||
PUSHJ P,SAVQ## ;SAVE Q1-Q3
|
||
SE1ENT ;RUN IN SECTION 1
|
||
MOVE Q3,.CPNPB## ;GET ADDRESS OF PORT CONTROL BLOCK
|
||
MOVE T1,.PBSTS(Q3) ;GET CURRENT KLNI STATUS
|
||
TXNE T1,PBSMAI ;IS KLNI IN MAINTENANCE MODE?
|
||
POPJ P, ;YES, RETURN NOW
|
||
TXNE T1,PBSRUN ;IS KLNI RUNNING?
|
||
TXNN T1,PBSQIO ;YES, ANY QUEUED I/O REQUESTS?
|
||
POPJ P, ;NO, RETURN
|
||
MOVX T1,PBSQIO ;CLEAR QUEUED I/O REQUEST FLAG
|
||
ANDCAM T1,.PBSTS(Q3) ;...
|
||
MOVE T1,.PBPIA(Q3) ;GET KLNI PI ASSIGNMENT
|
||
TXO T1,CO.CQA!CO.BTS ;PLUS COMMAND QUEUE AVAILABLE FLAG
|
||
XCT KDBCNO(Q3) ;TELL KLNI
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- ONCE A SECOND CODE
|
||
|
||
|
||
;ROUTINE CALLED ONCE A SECOND ON ALL CPUS
|
||
;LINKAGE:
|
||
; PUSHJ P,KNISEC
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNISEC::SKIPN .CPNPB## ;THIS CPU HAVE A KLNI?
|
||
POPJ P, ;NO, RETURN
|
||
; MOVSI T1,(CR.ATO) ;BIT TO TEST
|
||
; TDNE T1,.CPRUN## ;WAITING FOR AUTCON TO RUN?
|
||
; POPJ P, ;THEN DO NOTHING
|
||
PUSHJ P,SAVQ## ;SAVE Q1-Q3
|
||
SE1ENT ;RUN IN SECTION 1
|
||
MOVE Q3,.CPNPB## ;GET ADDRESS OF PORT CONTROL BLOCK
|
||
MOVE T1,.PBSTS(Q3) ;GET CURRENT KLNI STATUS
|
||
TXNE T1,PBSMAI ;IS KLNI IN MAINTENANCE MODE?
|
||
POPJ P, ;YES, RETURN NOW
|
||
TXNE T1,PBSRUN ;KLNI RUNNING?
|
||
JRST KNISE2 ;YES, GO PERFORM KEEP ALIVE CHECKS
|
||
TXNN T1,PBSINI ;NEED TO INITIALIZE KLNI?
|
||
JRST KNISE1 ;NO
|
||
MOVX T1,PBSINI ;GET INIT BIT
|
||
ANDCAM T1,.PBSTS(Q3) ;CLEAR IT
|
||
PUSHJ P,PCBINI ;INITIALIZE PORT CONTROL BLOCK
|
||
PJRST RLDKNI ;REQUEST KLNI RELOAD AND RETURN
|
||
KNISE1: TXNE T1,PBSQRR ;QUEUED RELOAD REQUESTED?
|
||
PJRST KNILOD ;YES, RELOAD MICROCODE AND RETURN
|
||
POPJ P, ;RETURN
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
;AT THIS POINT, WE ASSUME THE KLNI IS RUNNING BECAUSE NO FLAVOR OF
|
||
;RELOAD OR INITIALIZATION HAS BEEN REQUESTED
|
||
KNISE2: MOVX T1,PBSMOF ;IS MEMORY BEING SET OFFLINE?
|
||
TDNE T1,.PBSTS(Q3) ;...
|
||
PJRST SHTKNI ;YES, SHUT KLNI DOWN AND RETURN
|
||
MOVX T1,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
POPJ P, ;NO, RETURN
|
||
MOVE T1,.CPUPT## ;GET CPU UPTIME
|
||
SUB T1,.PBKRT(Q3) ;CALCULATE TIME SINCE LAST KLNI RESPONSE
|
||
IMULI T1,^D1000 ;CONVERT TO MILLISECONDS
|
||
IDIV T1,TICSEC## ;...
|
||
CAIGE T1,KAFTIM ;TOO LONG SINCE LAST RESPONSE?
|
||
JRST KNISE3 ;NO, GO CHECK KLNI IDLE TIMER
|
||
XCT KDBCNI(Q3) ;CONI DEV,T1
|
||
PUSH P,T1 ;SAVE FOR A MOMENT
|
||
MOVEI T1,CO.CPT ;MAKE SURE THE KLNI IS REALLY STOPPED
|
||
XCT KDBCNO(Q3) ;CONO DEV,(T1)
|
||
POP P,T1 ;GET CONI BITS BACK
|
||
STOPCD .+1,INFO,KNIKAF ;++KLNI KEEP ALIVE FAILED
|
||
MOVEM T1,.PBCLI(Q3) ;SAVE CONI FOR ERROR LOGGING
|
||
AOS .PBKAC(Q3) ;UPDATE COUNT OF KLNI KEEP ALIVE FAILURES
|
||
MOVE T1,SYSUPT## ;GET SYSTEM UPTIME
|
||
MOVEM T1,.PBKAT(Q3) ;REMEMBER TIME OF LAST KEEP ALIVE FAILURE
|
||
PJRST KNESTP ;DO KLNI ERROR STOP PROCESSING AND RETURN
|
||
|
||
KNISE3: MOVE T1,.CPUPT## ;GET CPU UPTIME
|
||
SUB T1,.PBKCT(Q3) ;CALCULATE TIME SINCE LAST COMMAND QUEUED
|
||
IMULI T1,^D1000 ;CONVERT TO MILLISECONDS
|
||
IDIV T1,TICSEC## ;...
|
||
CAIGE T1,IDLTIM ;TOO LONG SINCE LAST COMMAND?
|
||
POPJ P, ;NO, ALL DONE
|
||
MOVEI T1,CMORSA ;READ NI STATION ADDRESS COMMAND FUNCTION
|
||
PUSHJ P,GETCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, RETURN NOW
|
||
XMOVEI T1,GIVCMD ;GET ADDRESS OF CALLBACK ROUTINE
|
||
PJRST KNICMD ;QUEUE COMMAND AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- SET MEMORY OFFLINE SUPPORT
|
||
|
||
|
||
;ROUTINE CALLED ON CPU0 WHEN MEMORY IS ABOUT TO BE SET OFFLINE
|
||
;LINKAGE:
|
||
; PUSHJ P,KNIMOF
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNIMOF::XMOVEI T1,KNIMF1 ;GET ADDRESS OF ROUTINE
|
||
PJRST CPUAPP## ;CALL ROUTINE FOR ALL CPUS
|
||
|
||
;ROUTINE CALLED FOR ALL CPUS
|
||
|
||
KNIMF1: MOVE T1,.CPBIT##-.CPCDB##(P1) ;GET CPU'S BIT
|
||
TDNN T1,IPAMSK## ;WANT TO SKIP STARTING THE NI?
|
||
SKIPN T2,.CPNPB##-.CPCDB##(P1) ;THIS CPU HAVE A KLNI?
|
||
POPJ P, ;NO, RETURN NOW
|
||
MOVX T1,PBSMOF ;SET MEMORY OFFLINE FLAG
|
||
IORM T1,.PBSTS(T2) ;...
|
||
POPJ P, ;AND RETURN
|
||
;ROUTINE CALLED ON CPU0 WHEN SET MEMORY OFFLINE HAS COMPLETED
|
||
;LINKAGE:
|
||
; PUSHJ P,KNIMON
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNIMON::XMOVEI T1,KNIMN1 ;GET ADDRESS OF ROUTINE
|
||
PJRST CPUAPP## ;CALL ROUTINE FOR ALL CPUS
|
||
|
||
;ROUTINE CALLED FOR ALL CPUS
|
||
|
||
KNIMN1: MOVE T1,.CPBIT##-.CPCDB##(P1) ;GET CPU'S BIT
|
||
TDNN T1,IPAMSK## ;WANT TO SKIP STARTING THE NI?
|
||
SKIPN T2,.CPNPB##-.CPCDB##(P1) ;THIS CPU HAVE A KLNI?
|
||
POPJ P, ;NO, RETURN NOW
|
||
MOVX T1,PBSMOF ;GET MEMORY OFFLINE FLAG
|
||
TDNN T1,.PBSTS(T2) ;KLNI STOPPED BECAUSE OF SET MEMORY OFFLINE?
|
||
POPJ P, ;NO, RETURN NOW
|
||
ANDCAM T1,.PBSTS(T2) ;YES, CLEAR MEMORY OFFLINE FLAG
|
||
MOVX T1,PBSINI ;SET INITIALIZE KLNI FLAG
|
||
IORM T1,.PBSTS(T2) ;...
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- REMOVE CPU SUPPORT
|
||
|
||
|
||
;ROUTINE CALLED WHEN A CPU IS REMOVED
|
||
;LINKAGE:
|
||
; PUSHJ P,KNIRMV
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
;ALL ACS PRESERVED
|
||
|
||
KNIRMV::PUSHJ P,SAVT## ;SAVE T1-T4
|
||
SKIPN .CPNPB## ;DO WE HAVE A KLNI?
|
||
POPJ P, ;NO, RETURN
|
||
PUSHJ P,SAVQ## ;SAVE Q1-Q3
|
||
SE1ENT ;RUN IN SECTION 1
|
||
MOVE Q3,.CPNPB## ;GET ADDRESS OF PORT CONTROL BLOCK
|
||
PJRST SHTKNI ;SHUT DOWN KLNI AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- CPU OFFLINE SUPPORT
|
||
|
||
|
||
;ROUTINE CALLED WHEN A CPU IS DECLARED DEAD
|
||
;LINKAGE:
|
||
; T1/ CPU NUMBER OF DEAD CPU
|
||
; PUSHJ P,KNIDED
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
;ALL ACS PRESERVED
|
||
|
||
KNIDED::PUSHJ P,SAVT## ;SAVE T1-T4
|
||
IMULI T1,.CPLEN## ;COMPUTE OFFSET FROM CPU0'S CDB
|
||
SKIPN .C0NPB##(T1) ;THIS CPU HAVE A KLNI?
|
||
POPJ P, ;NO, RETURN
|
||
PUSHJ P,SAVQ## ;SAVE Q1-Q3
|
||
SE1ENT ;RUN IN SECTION 1
|
||
MOVE Q3,.C0NPB##(T1) ;GET ADDRESS OF PORT CONTROL BLOCK
|
||
PJRST STPKNX ;DECLARE KLNI DEAD AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- RESET UUO
|
||
|
||
|
||
;ROUTINE CALLED WHEN A JOB DOES A RESET UUO
|
||
;LINKAGE:
|
||
; PUSHJ P,KNIRST
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNIRST::XMOVEI T1,KNIRS1 ;GET ADDRESS OF ROUTINE
|
||
PJRST CPUAPP## ;CALL ROUTINE FOR ALL CPUS
|
||
|
||
;ROUTINE CALLED FOR ALL CPUS
|
||
|
||
KNIRS1: SKIPN .CPNPB##-.CPCDB##(P1) ;THIS CPU HAVE A KLNI?
|
||
POPJ P, ;NO, RETURN NOW
|
||
PUSHJ P,SAVQ## ;SAVE Q1-Q3
|
||
SE1ENT ;RUN IN SECTION 1
|
||
MOVE Q3,.CPNPB##-.CPCDB##(P1) ;GET ADDRESS OF PORT CONTROL BLOCK
|
||
SETZ T1, ;GET A ZERO
|
||
IFN FTKNILDR,<
|
||
LDB T2,PBPRJB ;GET JOB NUMBER OF RELOAD JOB
|
||
CAMN T2,.CPJOB## ;SAME AS JOB DOING RESET?
|
||
DPB T1,PBPRJB ;YES, CLEAR RELOAD JOB NUMBER
|
||
>;END IFN FTKNILDR
|
||
LDB T2,PBPMJB ;GET JOB NUMBER OF MAINTENANCE JOB
|
||
CAMN T2,.CPJOB## ;SAME AS JOB DOING RESET?
|
||
DPB T1,PBPMJB ;YES, CLEAR MAINTENANCE JOB NUMBER
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- ETHSER FUNCTION DISPATCH
|
||
|
||
|
||
;ROUTINE CALLED BY ETHSER FOR DEVICE SPECIFIC FUNCTIONS
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF EA BLOCK
|
||
; T2/ ADDRESS OF PORT CONTROL BLOCK
|
||
; T3/ ADDRESS OF PROTOCOL USER BLOCK (OR ZERO)
|
||
; PUSHJ P,KNUSER
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNUSER::PUSHJ P,SAVE1## ;SAVE P1
|
||
PUSHJ P,SAVQ## ;AND Q1-Q3
|
||
SE1ENT ;RUN IN SECTION 1
|
||
MOVE P1,T1 ;SAVE EA BLOCK ADDRESS
|
||
MOVE Q3,T2 ;AND ADDRESS OF PORT CONTROL BLOCK
|
||
MOVE Q2,T3 ;AND ADDRESS OF PROTOCOL USER BLOCK
|
||
MOVE T1,.EAFCN(P1) ;GET KONTROLLER FUNCTION CODE
|
||
SKIPLE T1 ;RANGE CHECK FUNCTION CODE
|
||
CAILE T1,EK.MAX ;...
|
||
KNUIFC:!STOPCD [ERRRET (UNIFC%)],DEBUG,KNIIFC ;++ILLEGAL FUNCTION CODE
|
||
MOVE T1,KNUDSP(T1) ;GET ADDRESS OF FUNCTION SPECIFIC ROUTINE
|
||
PJRST (T1) ;DISPATCH
|
||
|
||
;GENERIC ERROR RETURN WHICH RELEASES KLNI COMMAND BUFFER
|
||
|
||
KNXSER: PUSH P,T1 ;SAVE ERROR CODE
|
||
KNXSR1: PUSHJ P,GIVCMD ;RELEASE KLNI COMMAND BUFFER
|
||
PJRST TPOPJ## ;RESTORE ERROR CODE AND RETURN
|
||
;KLNI FUNCTION DISPATCH TABLES
|
||
|
||
DEFINE FNC,<
|
||
|
||
XALL ;;LIST GENERATED TABLE
|
||
|
||
DISP 0, KNUIFC ;;ILLEGAL (PLACE HOLDER)
|
||
DISP EK.SEA, KNUSEA ;;SET ETHERNET ADDRESS
|
||
DISP EK.RKC, KNURKC ;;READ AND CLEAR KONTROLLER COUNTERS
|
||
DISP EK.RPC, KNURPC ;;READ AND CLEAR PORTAL COUNTERS
|
||
DISP EK.EPT, KNUEPT ;;ENABLE PROTOCOL
|
||
DISP EK.DPT, KNUDPT ;;DISABLE PROTOCOL
|
||
DISP EK.EMA, KNUEMA ;;ENABLE MULTI-CAST ADDRESS
|
||
DISP EK.DMA, KNUDMA ;;DISABLE MULTI-CAST ADDRESS
|
||
DISP EK.RDG, KNURDG ;;RECEIVE DATAGRAM
|
||
DISP EK.XDG, KNUXDG ;;TRANSMIT DATAGRAM
|
||
|
||
SALL ;;TURN LISTING BACK OFF
|
||
|
||
>; END DEFINE FNC
|
||
|
||
;GENERATE FUNCTION DISPATCH TABLE
|
||
|
||
DEFINE DISP(CODE,ADDR),<
|
||
IF1,<IFN <CODE-<.-KNUDSP>>,<PRINTX ?Table KNUDSP entry CODE is out of order>>
|
||
IFIW ADDR ;CODE
|
||
>; END DEFINE DISP
|
||
|
||
KNUDSP: FNC ;GENERATE FUNCTION DISPATCH TABLE
|
||
IF1,<IFN <EK.MAX-<.-KNUDSP-1>>,<PRINTX ?Table KNUDSP is missing entries>>
|
||
SUBTTL KLNI USER SERVICE -- SET KONTROLLER ETHERNET ADDRESS
|
||
|
||
|
||
;HERE TO PROCESS A SET KONTROLLER ETHERNET ADDRESS CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNUSEA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNUSEA: MOVEI T1,CMOWSA ;WRITE NI STATION ADDRESS COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
AOS (P) ;PRESET SUCCESS RETURN
|
||
DMOVE T1,.EAEAD(P1) ;GET NEW ETHERNET ADDRESS
|
||
DMOVEM T1,.PBEAD(Q3) ;STORE INTO PORT CONTROL BLOCK
|
||
LDB T1,PBPPRM ;GET PROMISCUOUS RECEIVER FLAG
|
||
DPB T1,CMPPRM ;SET AS APPROPRIATE IN COMMAND
|
||
LDB T1,PBPPMM ;GET PROMISCUOUS MULTI-CAST FLAG
|
||
DPB T1,CMPAAM ;SET AS APPROPRIATE IN COMMAND
|
||
DMOVE T1,.PBEAD(Q3) ;GET NEW ETHERNET ADDRESS
|
||
DMOVEM T1,.CMNEA(Q1) ;STORE INTO COMMAND BUFFER
|
||
XMOVEI T1,KNCSEA ;GET CALLBACK ROUTINE ADDRESS
|
||
MOVX T2,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T2,.PBSTS(Q3) ;...
|
||
PJRST (T1) ;NO, CALL CALLBACK ROUTINE NOW
|
||
PJRST KNICMD ;YES, QUEUE KLNI COMMAND
|
||
;HERE TO PROCESS WRITE ETHERNET ADDRESS CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCSEA
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCSEA: PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- READ AND CLEAR KONTROLLER COUNTERS
|
||
|
||
|
||
;HERE TO PROCESS AN READ AND CLEAR KONTROLLER COUNTERS CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNURKC
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNURKC: MOVEI T1,CMORCC ;READ/CLEAR COUNTERS COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
LDB T1,CMPFLG ;GET CURRENT FLAGS
|
||
IORX T1,CMFCLR ;SET CLEAR COUNTERS FLAG
|
||
DPB T1,CMPFLG ;...
|
||
AOS (P) ;PRESET SUCCESS RETURN
|
||
XMOVEI T1,KNCRKC ;GET CALLBACK ROUTINE ADDRESS
|
||
MOVX T2,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T2,.PBSTS(Q3) ;...
|
||
PJRST (T1) ;NO, CALL CALLBACK ROUTINE NOW
|
||
PJRST KNICMD ;YES, QUEUE KLNI COMMAND
|
||
;HERE TO PROCESS READ/CLEAR COUNTERS CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCRKC
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCRKC: PUSHJ P,SAVP2## ;SAVE P2
|
||
PUSHJ P,UPDCTR ;UPDATE KLNI COUNTERS AREA
|
||
MOVE P2,.PBVCT(Q3) ;GET ADDRESS OF KLNI COUNTERS AREA
|
||
MOVSI T4,-RKCTLN ;GET AOJBN POINTER TO COUNTERS TABLE
|
||
KNCRK1: HRRZ T3,RKCTAB(T4) ;GET KONTROLLER COUNTER NUMBER
|
||
CAML T3,.EACBS(P1) ;BUFFER LARGE ENOUGH FOR THIS COUNTER?
|
||
JRST KNCRK2 ;NO, SKIP IT
|
||
ADD T3,.EACBA(P1) ;CALCULATE ADDRESS WHERE COUNTER STORED
|
||
SETZ T1, ;ZERO FOR RESETING COUNTER
|
||
XCT RKCTAB+1(T4) ;FETCH AND ZERO NEXT COUNTER
|
||
MOVEM T1,(T3) ;STORE COUNTER IN USER BUFFER
|
||
KNCRK2: AOBJN T4,.+1 ;SKIP OVER COUNTER NUMBER LOCATION
|
||
AOBJN T4,KNCRK1 ;LOOP BACK TO PROCESS ENTIRE TABLE
|
||
PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
;TABLE OF INSTRUCTIONS FOR FETCHING AND ZEROING KONTROLLER COUNTERS
|
||
|
||
DEFINE CTR(CNTR,INST),<
|
||
EXP CNTR ;;COUNTER NUMBER
|
||
EXP INST ;;INSTRUCTION TO FETCH AND ZERO COUNTER
|
||
>; END DEFINE CTR
|
||
|
||
RKCTAB: CTR KC.BYR,<EXCH T1,.KCBYR(P2)> ;BYTES RECEIVED
|
||
CTR KC.BYX,<EXCH T1,.KCBYX(P2)> ;BYTES TRANSMITTED
|
||
CTR KC.DGR,<EXCH T1,.KCDGR(P2)> ;DATAGRAMS RECEIVED
|
||
CTR KC.DGX,<EXCH T1,.KCDGX(P2)> ;DATAGRAMS TRANSMITTED
|
||
CTR KC.MBR,<EXCH T1,.KCMBR(P2)> ;MULTI-CAST BYTES RECEIVED
|
||
CTR KC.MDR,<EXCH T1,.KCMDR(P2)> ;MULTI-CAST DATAGRAMS RECEIVED
|
||
CTR KC.DXD,<EXCH T1,.KCDXD(P2)> ;DATAGRAMS TRANSMITTED, INITIALLY DEFERRED
|
||
CTR KC.DX1,<EXCH T1,.KCDX1(P2)> ;DATAGRAMS TRANSMITTED, SINGLE COLLISION
|
||
CTR KC.DXM,<EXCH T1,.KCDXM(P2)> ;DATAGRAMS TRANSMITTED, MULTIPLE COLLISIONS
|
||
CTR KC.XMF,<EXCH T1,.KCXMF(P2)> ;TRANSMIT FAILURES
|
||
CTR KC.XFM,<PUSHJ P,RKCXFM> ;TRANSMIT FAILURE BIT MASK
|
||
CTR KC.RCF,<EXCH T1,.KCRCF(P2)> ;RECEIVE FAILURES
|
||
CTR KC.RFM,<PUSHJ P,RKCRFM> ;RECEIVE FAILURE BIT MASK
|
||
CTR KC.UFD,<EXCH T1,.KCUFD(P2)> ;UNRECOGNIZED FRAME DESTINATION
|
||
CTR KC.DOV,<EXCH T1,.KCDOV(P2)> ;DATA OVERRUN
|
||
CTR KC.SBU,<EXCH T1,.KCSBU(P2)> ;SYSTEM BUFFER UNAVAILABLE
|
||
CTR KC.UBU,<EXCH T1,.KCFQE(P2)> ;USER DATAGRAM BUFFER UNAVAILABLE
|
||
RKCTLN==.-RKCTAB ;LENGTH OF TABLE
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
;ROUTINE TO COMPUTE TRANSMIT FAILURE BIT MASK
|
||
|
||
RKCXFM: EXCH T1,.KCXFM(P2) ;FETCH BIT MASK AND ZERO
|
||
LSH T1,-4 ;POSITION ERROR BITS
|
||
POPJ P, ;AND RETURN
|
||
|
||
;ROUTINE TO COMPUTE RECEIVE FAILURE BIT MASK
|
||
|
||
RKCRFM: EXCH T1,.KCRFM(P2) ;FETCH BIT MASK AND ZERO
|
||
LSH T1,-4 ;POSITION ERROR BITS
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- READ AND CLEAR PORTAL COUNTERS
|
||
|
||
|
||
;HERE TO PROCESS AN READ AND CLEAR PORTAL COUNTERS CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNURPC
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNURPC: MOVEI T1,CMORCC ;READ/CLEAR COUNTERS COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
LDB T1,CMPFLG ;GET CURRENT FLAGS
|
||
IORX T1,CMFCLR ;SET CLEAR COUNTERS FLAG
|
||
DPB T1,CMPFLG ;...
|
||
AOS (P) ;PRESET SUCCESS RETURN
|
||
XMOVEI T1,KNCRPC ;GET CALLBACK ROUTINE ADDRESS
|
||
MOVX T2,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T2,.PBSTS(Q3) ;...
|
||
PJRST (T1) ;NO, CALL CALLBACK ROUTINE NOW
|
||
PJRST KNICMD ;YES, QUEUE KLNI COMMAND
|
||
;HERE TO PROCESS READ/CLEAR COUNTERS CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCRPC
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCRPC: PUSHJ P,SAVP2## ;SAVE P2
|
||
PUSHJ P,UPDCTR ;UPDATE KLNI COUNTERS AREA
|
||
MOVE P2,.PBVCT(Q3) ;GET ADDRESS OF KLNI COUNTERS AREA
|
||
MOVSI T4,-RPCTLN ;GET AOJBN POINTER TO COUNTERS TABLE
|
||
KNCRP1: MOVE T3,RPCTAB(T4) ;GET PORTAL COUNTER NUMBER
|
||
CAML T3,.EACBS(P1) ;BUFFER LARGE ENOUGH FOR THIS COUNTER?
|
||
JRST KNCRP2 ;NO, SKIP IT
|
||
ADD T3,.EACBA(P1) ;CALCULATE ADDRESS WHERE COUNTER STORED
|
||
SETZ T1, ;ZERO FOR RESETING COUNTER
|
||
XCT RPCTAB+1(T4) ;FETCH AND ZERO NEXT COUNTER
|
||
ADDM T1,(T3) ;UPDATE COUNTERS AREA
|
||
KNCRP2: AOBJN T4,.+1 ;SKIP OVER COUNTER NUMBER LOCATION
|
||
AOBJN T4,KNCRP1 ;LOOP BACK TO PROCESS ENTIRE TABLE
|
||
PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
;TABLE OF INSTRUCTIONS FOR FETCHING AND ZEROING PORTAL COUNTERS
|
||
|
||
DEFINE CTR(CNTR,INST),<
|
||
EXP CNTR ;;COUNTER NUMBER
|
||
EXP INST ;;INSTRUCTION TO FETCH AND ZERO COUNTER
|
||
>; END DEFINE CTR
|
||
|
||
RPCTAB: CTR PC.UBU,<PUSHJ P,RPCUBU> ;USER DATAGRAM BUFFER UNAVAILABLE
|
||
RPCTLN==.-RPCTAB ;LENGTH OF TABLE
|
||
|
||
;ROUTINE TO COMPUTE USER BUFFER UNAVAILABLE COUNTER
|
||
|
||
RPCUBU: LDB T2,PUPPTT ;GET PTT TABLE INDEX
|
||
ADD T2,P2 ;ADD STARTING ADDRESS OF COUNTERS AREA
|
||
EXCH T1,.KCFQP(T2) ;FETCH AND ZERO FREE QUEUE EMPTY COUNTER
|
||
POPJ P, ;RETURN
|
||
SUBTTL KLNI USER SERVICE -- ENABLE PROTOCOL
|
||
|
||
|
||
;HERE TO PROCESS AN ENABLE PROTOCOL CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNUEPT
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNUEPT: MOVEI T2,.PULEN ;GET LENGTH OF PROTOCOL USER BLOCK
|
||
PUSHJ P,GETNWZ## ;ALLOCATE CORE FOR PROTOCOL USER BLOCK
|
||
ERRRET (UNRES%) ;ERROR, NO RESOURCES
|
||
MOVE Q2,T1 ;SAVE ADDRESS OF PROTOCOL USER BLOCK
|
||
XMOVEI T1,.PUFQH(Q2) ;INITIALIZE PROTOCOL'S FREE QUEUE HEADER
|
||
PUSHJ P,INIQUE ;...
|
||
MOVE T1,.EAPPB(P1) ;GET ADDRESS OF ETHSER'S PORTAL BLOCK
|
||
MOVEM T1,.PUEPB(Q2) ;SAVE IN PROTOCOL USER BLOCK
|
||
MOVE T1,.EAPAD(P1) ;GET PROTOCOL PADDING FLAG
|
||
DPB T1,PUPPAD ;STORE IN PROTOCOL USER BLOCK
|
||
MOVE T1,.EAPTY(P1) ;GET PROTOCOL TYPE CODE
|
||
JUMPL T1,KNUEPP ;IF NEGATIVE, GO ENABLE PSEUDO PROTOCOL TYPE
|
||
CAILE T1,MAXPTY ;RANGE CHECK PROTOCOL TYPE CODE
|
||
ERRRET (UNIVP%,KNXEP2) ;ERROR, INVALID PROTOCOL TYPE
|
||
PUSHJ P,SWAB ;SWAP HIGH AND LOW ORDER BYTES FOR KLNI
|
||
MOVEM T1,.PUPTY(Q2) ;STORE IN PROTOCOL USER BLOCK
|
||
MOVEI T1,CMOLDP ;GET LOAD PTT TABLE COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
PJRST KNXEP2 ;ERROR, ERROR CODE IN T1
|
||
PUSHJ P,ADDPTT ;ADD PROTOCOL TO PTT TABLE
|
||
PJRST KNXEP1 ;ERROR, ERROR CODE IN T1
|
||
AOS (P) ;PRESET SUCCESS RETURN
|
||
XMOVEI T1,KNCEPT ;GET ADDRESS OF CALLBACK ROUTINE
|
||
MOVX T2,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T2,.PBSTS(Q3) ;...
|
||
PJRST (T1) ;NO, CALL CALLBACK ROUTINE NOW
|
||
PJRST KNICMD ;YES, QUEUE KLNI COMMAND
|
||
|
||
KNXEP1: PUSH P,T1 ;SAVE ERROR CODE
|
||
PUSHJ P,GIVCMD ;RELEASE KLNI COMMAND BUFFER
|
||
SKIPA ;AND CONTINUE
|
||
KNXEP2: PUSH P,T1 ;SAVE ERROR CODE
|
||
MOVEI T1,.PULEN ;GET LENGTH OF PROTOCOL USER BLOCK
|
||
MOVE T2,Q2 ;GET ADDRESS OF PROTOCOL USER BLOCK
|
||
PUSHJ P,GIVNWS## ;RELEASE THE CORE
|
||
PJRST TPOPJ## ;RESTORE ERROR CODE AND RETURN
|
||
;HERE TO ENABLE A PSEUDO-PROTOCOL TYPE
|
||
|
||
KNUEPP: CAXGE T1,MINPTY ;RANGE CHECK PSEUDO PROTOCOL TYPE
|
||
ERRRET (UNIVP%,KNXEP2) ;ERROR, INVALID PROTOCOL TYPE
|
||
MOVEM T1,.PUPTY(Q2) ;STORE PROTOCOL TYPE IN PROTOCOL USER BLOCK
|
||
ERRRET (UNIVP%,KNXEP2) ;ERROR, NOT YET IMPLEMENTED
|
||
;HERE TO PROCESS LOAD PROTOCOL TYPE TABLE CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCEPT
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCEPT: MOVEM Q2,.EAPPB(P1) ;SAVE ADDRESS OF PROTOCOL USER BLOCK
|
||
PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- DISABLE PROTOCOL
|
||
|
||
|
||
;HERE TO PROCESS A DISABLE PROTOCOL CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNUDPT
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNUDPT: MOVE T1,.PUPTY(Q2) ;GET PROTOCOL TYPE
|
||
JUMPL T1,KNUDPP ;IF NEGATIVE, GO DISABLE PSEUDO PROTOCOL TYPE
|
||
MOVEI T1,CMOLDP ;GET LOAD PTT TABLE COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
PUSHJ P,DELPTT ;REMOVE PROTOCOL FROM PTT TABLE
|
||
PJRST KNXSER ;ERROR, ERROR CODE IN T1
|
||
AOS (P) ;PRESET SUCCESS RETURN
|
||
XMOVEI T1,KNCDPT ;GET ADDRESS OF CALLBACK ROUTINE
|
||
MOVX T2,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T2,.PBSTS(Q3) ;...
|
||
PJRST (T1) ;NO, CALL CALLBACK ROUTINE NOW
|
||
PJRST KNICMD ;YES, QUEUE KLNI COMMAND
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
;HERE TO DISABLE A PSEUDO-PROTOCOL TYPE
|
||
|
||
KNUDPP: CAXN T1,PT%INF ;INFORMATION ONLY PROTOCOL TYPE?
|
||
PJRST KNCDPT ;YES, GIVE DISABLE CALLBACK NOW AND RETURN
|
||
ERRRET (UNIVP%) ;ERROR, INVALID PROTOCOL TYPE
|
||
;HERE TO PROCESS LOAD PROTOCOL TYPE TABLE CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCDPT
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCDPT: PUSH P,P1 ;SAVE ADDRESS OF EA BLOCK
|
||
PUSH P,Q1 ;AND ADDRESS OF COMMAND BLOCK
|
||
KNCDP1: XMOVEI T1,.PUFQH(Q2) ;GET ADDRESS OF PROTOCOL'S FREE QUEUE HEADER
|
||
PUSHJ P,REMQUE ;REMOVE NEXT ENTRY
|
||
JRST KNCDP2 ;NO MORE ENTRIES IN QUEUE
|
||
XMOVEI Q1,-.CMQUE(T2) ;GET ADDRESS OF KLNI COMMAND BUFFER
|
||
MOVE P1,.CMEAB(Q1) ;AND ADDRESS OF EA BLOCK
|
||
MOVEI T1,UNRAB% ;GET RECEIVE ABORTED STATUS CODE
|
||
PUSHJ P,KNCRDX ;DO RECEIVE DATAGRAM CALLBACK PROCESSING
|
||
JRST KNCDP1 ;LOOP BACK TO EMPTY ENTIRE QUEUE
|
||
KNCDP2: POP P,Q1 ;RESTORE COMMAND BLOCK ADDRESS
|
||
POP P,P1 ;RESTORE ADDRESS OF EA BLOCK
|
||
PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
MOVEI T1,.PULEN ;GET LENGTH OF PROTOCOL USER BLOCK
|
||
MOVE T2,Q2 ;GET ADDRESS OF PROTOCOL USER BLOCK
|
||
;$ PUSHJ P,GIVNWS## ;RELEASE THE CORE
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- ENABLE MULTI-CAST ADDRESS
|
||
|
||
|
||
;HERE TO PROCESS AN ENABLE MULTI-CAST ADDRESS CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNUEMA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNUEMA: MOVEI T1,CMOLDM ;LOAD MCAT TABLE COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
DMOVE T1,.EAMCA(P1) ;GET MULTI-CAST ADDRESS
|
||
TXNN T1,<BYTE (8) 1,0,0,0> ;IS MULTI-CAST BIT SET?
|
||
ERRRET (UNIMA%,KNXSER) ;NO, INVALID MULTI-CAST ADDRESS
|
||
TXNN T1,^-MCTHAD ;ANY EXTRANEOUS BITS SET?
|
||
TXNE T2,^-MCTLAD ;...
|
||
ERRRET (UNIMA%,KNXSER) ;YES, INVALID MULTI-CAST ADDRESS
|
||
PUSHJ P,ADDMCA ;ADD ADDRESS TO MCAT TABLE
|
||
PJRST KNXSER ;ERROR, ERROR CODE IN T1
|
||
AOS (P) ;PRESET SUCCESS RETURN
|
||
XMOVEI T1,KNCEMA ;AND ADDRESS OF CALLBACK ROUTINE
|
||
MOVX T2,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T2,.PBSTS(Q3) ;...
|
||
PJRST (T1) ;NO, CALL CALLBACK ROUTINE NOW
|
||
PJRST KNICMD ;YES, QUEUE KLNI COMMAND
|
||
;HERE TO PROCESS LOAD MULTI-CAST ADDRESS TABLE CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCEMA
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCEMA: PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- DISABLE MULTI-CAST ADDRESS
|
||
|
||
|
||
;HERE TO PROCESS A DISABLE MULTI-CAST ADDRESS CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNUDMA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNUDMA: MOVEI T1,CMOLDM ;LOAD MCAT TABLE COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
DMOVE T1,.EAMCA(P1) ;GET MULTI-CAST ADDRESS
|
||
TXNN T1,<BYTE (8) 1,0,0,0> ;IS MULTI-CAST BIT SET?
|
||
ERRRET (UNIMA%,KNXSER) ;NO, INVALID MULTI-CAST ADDRESS
|
||
TXNN T1,^-MCTHAD ;ANY EXTRANEOUS BITS SET?
|
||
TXNE T2,^-MCTLAD ;...
|
||
ERRRET (UNIMA%,KNXSER) ;YES, INVALID MULTI-CAST ADDRESS
|
||
PUSHJ P,DELMCA ;DELETE ADDRESS FROM MCAT TABLE
|
||
PJRST KNXSER ;ERROR, ERROR CODE IN T1
|
||
AOS (P) ;PRESET SUCCESS RETURN
|
||
XMOVEI T1,KNCDMA ;AND ADDRESS OF CALLBACK ROUTINE
|
||
MOVX T2,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T2,.PBSTS(Q3) ;...
|
||
PJRST (T1) ;NO, CALL CALLBACK ROUTINE NOW
|
||
PJRST KNICMD ;YES, QUEUE KLNI COMMAND
|
||
;HERE TO PROCESS LOAD MULTI-CAST ADDRESS TABLE CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCDMA
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCDMA: PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- RECEIVE DATAGRAM
|
||
|
||
|
||
;HERE TO PROCESS A RECEIVE DATAGRAM CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNURDG
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNURDG: MOVX T1,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
ERRRET (UNRAB%) ;NO, RECEIVE ABORTED
|
||
MOVEI T1,CMORDG ;RECEIVE DATAGRAM COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
LDB T1,CMPFLG ;GET CURRENT FLAGS
|
||
IORX T1,CMFBSD ;SET BSD STYLE COMMAND FLAG
|
||
LDB T2,PUPPAD ;GET PROTOCOL PADDING FLAG
|
||
JUMPE T2,KNURD1 ;JUMP IF DATAGRAM NOT PADDED
|
||
IORX T1,CMFPAD ;SET PADDING FLAG
|
||
KNURD1: DPB T1,CMPFLG ;STORE UPDATED FLAGS
|
||
XMOVEI T1,.EAMSD(P1) ;GET ADDRESS OF FIRST MSD
|
||
SETZ T2, ;$ DON'T RECEIVE PADDING SEPERATELY
|
||
PUSHJ P,GENBSC ;GENERATE BSD CHAIN
|
||
PJRST KNXSER ;ERROR, ERROR CODE IN T1
|
||
DPB T1,CMPRDL ;STORE SIZE OF DATAGRAM IN COMMAND BUFFER
|
||
MOVEM T2,.CMRVB(Q1) ;SAVE ADDRESS OF BSD CHAIN
|
||
MAP T2,0(T2) ;GET PHYSICAL ADDRESS OF BSD CHAIN
|
||
TXZ T2,MP.NAD ;...
|
||
MOVEM T2,.CMRBA(Q1) ;STORE IN COMMAND BUFFER
|
||
LDB T1,CMPRDL ;GET SIZE OF DATAGRAM
|
||
SKIPN .PUFQH+.QHELN(Q2) ;HAVE WE ALREADY SET UP QUEUE ENTRY LENGTH?
|
||
MOVEM T1,.PUFQH+.QHELN(Q2) ;NO, DO SO NOW
|
||
SKIPLE T1 ;VALID DATAGRAM LENGTH?
|
||
CAME T1,.PUFQH+.QHELN(Q2) ;YES, SAME SIZE AS PREVIOUS DATAGRAMS?
|
||
ERRRET (UNIBS%,KNURDX) ;NO, INVALID DATAGRAM BUFFER SIZE
|
||
XMOVEI T1,KNCRDG ;GET ADDRESS OF CALLBACK ROUTINE
|
||
PUSHJ P,KNICMF ;QUEUE KLNI COMMAND TO PROTOCOL FREE QUEUE
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
KNURDX: PUSH P,T1 ;SAVE ERROR CODE
|
||
MOVE T1,.CMRVB(Q1) ;GET ADDRESS OF BSD CHAIN
|
||
PUSHJ P,GIVBSC ;RELEASE THE CORE
|
||
PUSHJ P,GIVCMD ;RELEASE THE KLNI COMMAND
|
||
PJRST TPOPJ## ;RESTORE ERROR CODE AND RETURN
|
||
;HERE TO PROCESS RECEIVE DATAGRAM CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCRDG
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCRDG: DMOVE T1,.CMRDA(Q1) ;GET DESTINATION ADDRESS OF DATAGRAM
|
||
DMOVEM T1,.EADDA(P1) ;STORE IN EA BLOCK
|
||
DMOVE T1,.CMRSA(Q1) ;GET SOURCE ETHERNET ADDRESS
|
||
DMOVEM T1,.EADSA(P1) ;STORE IN EA BLOCK
|
||
LDB T1,CMPRPT ;GET PROTOCOL TYPE OF DATAGRAM
|
||
PUSHJ P,SWAB ;SWAP HIGH AND LOW ORDER BYTES
|
||
MOVEM T1,.EADPT(P1) ;STORE IN EA BLOCK
|
||
LDB T1,CMPRDL ;GET SIZE OF DATAGRAM
|
||
SUBI T1,4 ;SUBTRACT OFF CRC OVERHEAD BYTES
|
||
MOVEM T1,.EADSZ(P1) ;STORE IN EA BLOCK
|
||
LDB T1,PUPPAD ;GET PROTOCOL PADDING FLAG
|
||
JUMPE T1,KNCRD1 ;JUMP IF DATAGRAM NOT PADDED
|
||
ILDB T1,.EAFCD+1(P1) ;$ CROCK
|
||
ILDB T2,.EAFCD+1(P1) ;$ DITTO
|
||
LSH T2,^D8 ;$
|
||
IOR T1,T2 ;$
|
||
;$ MOVE T2,.CMRVB(Q1) ;YES, GET ADDRESS OF FIRST BSD
|
||
;$ MOVE T1,.BSRWD(T2) ;GET FIRST TWO BYTES OF DATAGRAM
|
||
;$ LSH T1,-<^D36-^D16> ;RIGHT JUSTIFY
|
||
;$ PUSHJ P,SWAB ;SWAP BYTES
|
||
MOVEM T1,.EADSZ(P1) ;STORE CORRECT DATAGRAM SIZE
|
||
KNCRD1: SETZ T1, ;ASSUME DATAGRAM STATUS IS OK
|
||
LDB T2,CMPSTS ;GET DATAGRAM STATUS
|
||
TXNN T2,CMSERR ;ANY ERRORS?
|
||
JRST KNCRDX ;NO, GO GIVE CALLBACK
|
||
LDB T1,[POINTR (T2,CMSETY)] ;GET SPECIFIC ERROR TYPE
|
||
PUSHJ P,CVTETY ;CONVERT INTO ETHSER STATUS CODE
|
||
KNCRDX: MOVEM T1,.EADST(P1) ;STORE DATAGRAM STATUS IN EA BLOCK
|
||
PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
MOVE T1,.CMRVB(Q1) ;GET ADDRESS OF BSD CHAIN
|
||
PUSHJ P,GIVBSC ;RELEASE THE CORE
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- TRANSMIT DATAGRAM
|
||
|
||
|
||
;HERE TO PROCESS A TRANSMIT DATAGRAM CALL TO KNISER
|
||
;LINKAGE:
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNUXDG
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
KNUXDG: MOVX T1,PBSONL ;IS KLNI ONLINE?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
ERRRET (UNDNS%) ;NO, DATAGRAM NOT SENT
|
||
MOVEI T1,CMOXDG ;TRANSMIT DATAGRAM COMMAND FUNCTION
|
||
PUSHJ P,GENCMD ;GENERATE KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
LDB T1,CMPFLG ;GET CURRENT FLAGS
|
||
IORX T1,CMFBSD ;SET BSD STYLE COMMAND FLAG
|
||
LDB T2,PUPPAD ;GET PROTOCOL PADDING FLAG
|
||
JUMPE T2,KNUXD1 ;JUMP IF DATAGRAM NOT PADDED
|
||
IORX T1,CMFPAD ;SET PADDING FLAG
|
||
KNUXD1: DPB T1,CMPFLG ;STORE UPDATED FLAGS
|
||
MOVE T1,.PUPTY(Q2) ;GET PROTOCOL TYPE CODE
|
||
DPB T1,CMPXPT ;STORE IN COMMAND BUFFER
|
||
DMOVE T1,.EADDA(P1) ;GET DESTINATION ADDRESS OF DATAGRAM
|
||
TXNE T1,<BYTE (8) 1,0,0,0> ;MULTI-CAST BIT SET?
|
||
AOS .PBMCE(Q3) ;YES, COUNT FOR ADJUSTMENT OF KLNI COUNTERS
|
||
DMOVEM T1,.CMXDA(Q1) ;STORE IN COMMAND BUFFER
|
||
XMOVEI T1,.EAMSD(P1) ;GET ADDRESS OF FIRST MSD
|
||
SETZ T2, ;NO SEPERATE RECEIVE PADDING BYTES
|
||
PUSHJ P,GENBSC ;GENERATE BSD CHAIN
|
||
PJRST KNXSER ;ERROR, ERROR CODE IN T1
|
||
SKIPG T1 ;VALID DATAGRAM SIZE?
|
||
ERRRET (UNIBS%,KNUXDX) ;NO, INVALID DATAGRAM BUFFER SIZE
|
||
DPB T1,CMPRDL ;STORE SIZE OF DATAGRAM IN COMMAND BUFFER
|
||
MOVEM T2,.CMXVB(Q1) ;SAVE ADDRESS OF BSD CHAIN
|
||
MAP T2,0(T2) ;GET PHYSICAL ADDRESS OF BSD CHAIN
|
||
TXZ T2,MP.NAD ;...
|
||
MOVEM T2,.CMXBA(Q1) ;STORE IN COMMAND BUFFER
|
||
XMOVEI T1,KNCXDG ;ADDRESS OF CALLBACK ROUTINE
|
||
PUSHJ P,KNICMD ;QUEUE KLNI COMMAND
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
KNUXDX: PUSH P,T1 ;SAVE ERROR CODE
|
||
MOVE T1,.CMXVB(Q1) ;GET ADDRESS OF BSD CHAIN
|
||
PUSHJ P,GIVBSC ;RELEASE THE CORE
|
||
PUSHJ P,GIVCMD ;RELEASE THE KLNI COMMAND
|
||
PJRST TPOPJ## ;RESTORE ERROR CODE AND RETURN
|
||
;HERE TO PROCESS TRANSMIT DATAGRAM CALLBACK
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q1/ ADDRESS OF COMMAND BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNCXDG
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNCXDG: DMOVE T1,.CMXDA(Q1) ;GET DESTINATION ADDRESS OF DATAGRAM
|
||
DMOVEM T1,.EADDA(P1) ;STORE IN EA BLOCK
|
||
DMOVE T1,.PBEAD(Q3) ;GET SOURCE ETHERNET ADDRESS
|
||
DMOVEM T1,.EADSA(P1) ;STORE IN EA BLOCK
|
||
LDB T1,CMPXPT ;GET PROTOCOL TYPE OF DATAGRAM
|
||
PUSHJ P,SWAB ;SWAP HIGH AND LOW ORDER BYTES
|
||
MOVEM T1,.EADPT(P1) ;STORE IN EA BLOCK
|
||
LDB T1,CMPXDL ;GET SIZE OF DATAGRAM
|
||
MOVEM T1,.EADSZ(P1) ;STORE IN EA BLOCK
|
||
SETZ T1, ;ASSUME DATAGRAM STATUS IS OK
|
||
LDB T2,CMPSTS ;GET DATAGRAM STATUS
|
||
TXNN T2,CMSERR ;ANY ERRORS?
|
||
JRST KNCXDX ;NO, GO GIVE CALLBACK
|
||
LDB T1,[POINTR (T2,CMSETY)] ;GET SPECIFIC ERROR TYPE
|
||
PUSHJ P,CVTETY ;CONVERT INTO ETHSER STATUS CODE
|
||
KNCXDX: MOVEM T1,.EADST(P1) ;STORE DATAGRAM STATUS IN EA BLOCK
|
||
PUSHJ P,CALETH ;INTERRUPT ETHSER
|
||
MOVE T1,.CMXVB(Q1) ;GET ADDRESS OF BSD CHAIN
|
||
PUSHJ P,GIVBSC ;RELEASE THE CORE
|
||
PJRST GIVCMD ;RELEASE COMMAND BUFFER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- INTERRUPT ETHSER
|
||
|
||
|
||
;ROUTINE TO INTERRUPT ETHSER
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK (OR ZERO)
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,CALETH
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
CALETH: MOVE T1,P1 ;GET ADDRESS OF EA BLOCK
|
||
MOVE T2,.PBEKB(Q3) ;AND ADDRESS OF ETHERNET KONTROLLER BLOCK
|
||
SKIPE T3,Q2 ;HAVE A PROTOCOL USER BLOCK?
|
||
MOVE T3,.PUEPB(Q2) ;YES, GET ADDRESS OF ETHERNET PORTAL BLOCK
|
||
PJRST ETKINT## ;INTERRUPT ETHSER AND RETURN
|
||
SUBTTL KLNI USER SERVICE -- GENERATE KLNI COMMAND BUFFER
|
||
|
||
|
||
;ROUTINE CALLED TO GENERATE A KLNI COMMAND BUFFER
|
||
;LINKAGE:
|
||
; T1/ KLNI COMMAND OPCODE
|
||
; P1/ ADDRESS OF EA BLOCK
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; PUSHJ P,GENCMD
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
|
||
GENCMD: PUSHJ P,GETCMD ;GET A KLNI COMMAND BUFFER
|
||
POPJ P, ;ERROR, ERROR CODE IN T1
|
||
MOVEM Q2,.CMPUB(Q1) ;STORE ADDRESS OF PROTOCOL USER BLOCK
|
||
MOVEM P1,.CMEAB(Q1) ;AND ADDRESS OF EA BLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- PORT CONTROL BLOCK INITIALIZATION
|
||
|
||
|
||
;ROUTINE TO INITIALIZE A PORT CONTROL BLOCK
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,PCBINI
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
PCBINI: MOVE T1,.CPCPN## ;GET OUR CPU NUMBER
|
||
DPB T1,PBPCPU ;STORE IN PORT CONTROL BLOCK
|
||
MOVEI T1,KNICHN## ;GET PRIORITY INTERRUPT ASSIGNMENT
|
||
MOVEM T1,.PBPIA(Q3) ;STORE IN PCB
|
||
LDB T1,[POINT 3,KDBCNO(Q3),9] ;GET RH20 NUMBER
|
||
LSH T1,2 ;COMPUTE EPT OFFSET TO CHANNEL LOGOUT AREA
|
||
ADD T1,.CPEPT## ;PLUS ADDRESS OF EPT
|
||
MOVEM T1,.PBLGO(Q3) ;STORE IN PORT CONTROL BLOCK
|
||
MAP T1,.PBPCB(Q3) ;DETERMINE PHYSICAL ADDRESS OF PCB
|
||
TXZ T1,MP.NAD ;CLEAR NON-ADDRESS BITS
|
||
MOVEM T1,.PBPBA(Q3) ;STORE PHYSICAL PCB ADDRESS FOR THE KLNI
|
||
MOVE T1,.PBLGO(Q3) ;GET ADDRESS OF RH20 LOGOUT AREA
|
||
MAP T1,1(T1) ;GET PHYSICAL ADDRESS OF SECOND WORD
|
||
TXZ T1,MP.NAD ;...
|
||
MOVEM T1,.PBER2(Q3) ;SAVE IN PCB FOR KLNI
|
||
XMOVEI T1,.PBCMQ(Q3) ;GET VIRTUAL ADDRESS OF COMMAND QUEUE
|
||
PUSHJ P,INIQUE ;INITIALIZE QUEUE HEADER
|
||
XMOVEI T1,.PBRSQ(Q3) ;GET VIRTUAL ADDRESS OF RESPONSE QUEUE
|
||
PUSHJ P,INIQUE ;INITIALIZE QUEUE HEADER
|
||
XMOVEI T1,.PBUPQ(Q3) ;GET VIRTUAL ADDRESS OF UNKNOWN PROTOCOL QUEUE
|
||
PUSHJ P,INIQUE ;INITIALIZE QUEUE HEADER
|
||
SETZM .PBPTT(Q3) ;CLEAR ADDRESS OF PTT TABLE
|
||
SETZM .PBMCT(Q3) ;AND ADDRESS OF MCAT TABLE
|
||
SETZM .PBKCB(Q3) ;AND ADDRESS OF COUNTERS BUFFER
|
||
MOVEI T1,1 ;$ SET PROMISCUOUS MULTI-CAST FLAG
|
||
DPB T1,PBPPMM ;$ ...
|
||
POPJ P, ;RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- PORT CONTROL BLOCK RESET
|
||
|
||
|
||
;ROUTINE CALLED TO RESET A PORT CONTROL BLOCK
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,PCBRST
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
PCBRST: SETOM .PBCMQ+.QHIWD(Q3) ;RESET COMMAND QUEUE INTERLOCK
|
||
SETOM .PBRSQ+.QHIWD(Q3) ;RESET RESPONSE QUEUE INTERLOCK
|
||
SETOM .PBUPQ+.QHIWD(Q3) ;RESET UNKNOWN PROTOCOL TYPE QUEUE INTERLOCK
|
||
MOVE T3,.PBLPT(Q3) ;GET LENGTH OF PROTOCOL TYPE TABLE
|
||
MOVE T4,.PBVPT(Q3) ;AND ADDRESS OF PTT
|
||
PCBRS1: JUMPE T3,PCBRS3 ;CONTINUE IF NO MORE PTT ENTRIES
|
||
LDB T1,PTPENA ;IS THIS PROTOCOL ENABLED?
|
||
JUMPE T1,PCBRS2 ;JUMP IF NOT ENABLED
|
||
MOVE T2,.PTPUB(T4) ;GET ADDRESS OF PROTOCOL USER BLOCK
|
||
SETOM .PUFQH+.QHIWD(T2) ;CLEAR PROTOCOL'S FREE QUEUE INTERLOCK
|
||
PCBRS2: ADDI T4,.PTLEN ;BUMP PTT TABLE POINTER TO NEXT ENTRY
|
||
SOJA T3,PCBRS1 ;LOOP BACK FOR ENTIRE PTT TABLE
|
||
|
||
PCBRS3: SETZM .PBER0(Q3) ;RESET ERROR WORDS
|
||
SETZM .PBER1(Q3) ;...
|
||
SETZM .PBER3(Q3) ;...
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- ADD PROTOCOL TYPE TO PTT TABLE
|
||
|
||
|
||
;ROUTINE TO ADD A PROTOCOL TO THE PTT TABLE
|
||
;LINKAGE:
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,ADDPTT
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ADDPTT: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
ETHLOK ;INTERLOCK AGAINST SMP RACES
|
||
SETZ T2, ;USED TO REMEMBER FIRST FREE ENTRY IN PTT
|
||
MOVE P1,.PBLPT(Q3) ;GET LENGTH OF PTT TABLE
|
||
MOVE P2,.PBVPT(Q3) ;GET VIRTUAL ADDRESS OF PTT TABLE
|
||
ADDPT1: JUMPE P1,ADDPT4 ;EXIT LOOP IF NO MORE ENTRIES
|
||
LDB T1,PTPENA ;GET PROTOCOL ENTRY ENABLED BIT
|
||
JUMPN T1,ADDPT2 ;IF ENABLED, GO CHECK FOR DUPLICATE
|
||
SKIPN T2 ;ALREADY HAVE POINTER TO FREE ENTRY?
|
||
MOVE T2,P2 ;NO, REMEMBER LOCATION OF FIRST FREE ENTRY
|
||
JRST ADDPT3 ;AND CONTINUE CHECK REMAINDER OF TABLE
|
||
ADDPT2: LDB T1,PTPPTY ;GET PROTOCOL TYPE OF THIS ENTRY
|
||
CAMN T1,.PUPTY(Q2) ;FOUND DUPLICATE PROTOCOL?
|
||
ERRRET (UNPIU%,UNLETH##) ;YES, PROTOCOL ALREADY IN USE
|
||
ADDPT3: ADDI P2,.PTLEN ;BUMP PTT TABLE POINTER TO NEXT ENTRY
|
||
SOJA P1,ADDPT1 ;LOOP BACK TO CHECK ALL TABLE ENTRIES
|
||
|
||
ADDPT4: JUMPE T2,[ERRRET (UNNRE%,UNLETH##)] ;ERROR IF NO FREE ENTRIES
|
||
MOVE P2,T2 ;GET ADDRESS OF FREE ENTRY
|
||
MOVE T1,.PUPTY(Q2) ;GET DESIRED PROTOCOL TYPE
|
||
DPB T1,PTPPTY ;STORE IN PTT ENTRY
|
||
MAP T1,.PUFQH+.QHFLI(Q2) ;GET PHYSICAL ADDRESS OF FREE QUEUE FLINK
|
||
TXZ T1,MP.NAD ;CLEAR NON-ADDRESS BITS
|
||
MOVEM T1,.PTFRQ(P2) ;SAVE IN PTT ENTRY
|
||
MOVEM Q2,.PTPUB(P2) ;SAVE ADDRESS OF PUB IN PTT ENTRY
|
||
MOVEI T1,1 ;SET THE PROTOCOL ENABLED FLAG
|
||
DPB T1,PTPENA ;...
|
||
MOVE T1,P2 ;GET INDEX INTO PTT TABLE
|
||
SUB T1,.PBVPT(Q3) ;CALCULATE PTT TABLE ENTRY NUMBER
|
||
IDIVI T1,.PTLEN ;...
|
||
DPB T1,PUPPTT ;AND REMEMBER IN PROTOCOL USER BLOCK
|
||
AOS .PBCPT(Q3) ;ADJUST COUNT OF PTT ENTRIES
|
||
ETHULK ;RELEASE SMP INTERLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- DELETE PROTOCOL TYPE FROM PTT TABLE
|
||
|
||
|
||
;ROUTINE TO DELETE A PROTOCOL FROM THE PTT TABLE
|
||
;LINKAGE:
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,DELPTT
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
DELPTT: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
ETHLOK ;INTERLOCK AGAINST SMP RACES
|
||
MOVE P1,.PBLPT(Q3) ;GET LENGTH OF PTT TABLE
|
||
MOVE P2,.PBVPT(Q3) ;GET VIRTUAL ADDRESS OF PTT TABLE
|
||
DELPT1: JUMPE P1,[ERRRET (UNIVP%,UNLETH##)] ;ERROR IF NO MORE ENTRIES
|
||
LDB T1,PTPENA ;GET PROTOCOL ENTRY ENABLED BIT
|
||
JUMPE T1,DELPT2 ;SKIP CHECK IF NOT ENABLED
|
||
CAMN Q2,.PTPUB(P2) ;FOUND SUBJECT PROTOCOL USER BLOCK?
|
||
JRST DELPT3 ;YES, EXIT LOOP
|
||
DELPT2: ADDI P2,.PTLEN ;BUMP PTT TABLE POINTER TO NEXT ENTRY
|
||
SOJA P1,DELPT1 ;LOOP BACK TO CHECK ALL TABLE ENTRIES
|
||
|
||
DELPT3: SETZ T1, ;CLEAR THE PROTOCOL ENABLED FLAG
|
||
DPB T1,PTPENA ;...
|
||
SOS .PBCPT(Q3) ;ADJUST COUNT OF PTT ENTRIES
|
||
ETHULK ;RELEASE SMP INTERLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- ADD MULTI-CAST ADDRESS TO MCAT TABLE
|
||
|
||
|
||
;ROUTINE TO ADD A MULTI-CAST ADDRESS TO THE MCAT FOR A PROTOCOL
|
||
;LINKAGE:
|
||
; T1-T2/ MULTI-CAST ADDRESS
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,ADDMCA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ADDMCA: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
DMOVE P3,T1 ;SAVE MULTI-CAST ADDRESS IN P3,P4
|
||
ETHLOK ;INTERLOCK AGAINST SMP RACES
|
||
SETZ T2, ;USED TO REMEMBER FIRST FREE ENTRY IN MCAT
|
||
MOVE P1,.PBLMC(Q3) ;GET LENGTH OF MCAT TABLE
|
||
MOVE P2,.PBVMC(Q3) ;GET VIRTUAL ADDRESS OF MCAT TABLE
|
||
ADDMC1: JUMPE P1,ADDMC4 ;EXIT LOOP IF NO MORE ENTRIES
|
||
LDB T1,MCPENA ;GET MULTI-CAST ADDRESS ENABLED BIT
|
||
JUMPN T1,ADDMC2 ;IF ENABLED, GO CHECK FOR DUPLICATE
|
||
SKIPN T2 ;ALREADY HAVE POINTER TO FREE ENTRY?
|
||
MOVE T2,P2 ;NO, REMEMBER LOCATION OF FIRST FREE ENTRY
|
||
JRST ADDMC3 ;AND CONTINUE CHECK REMAINDER OF TABLE
|
||
ADDMC2: MOVE T1,.MCHAD(P2) ;GET HIGH ORDER MULTI-CAST ADDRESS
|
||
ANDX T1,MCTHAD ;...
|
||
CAME T1,P3 ;MATCH SUBJECT ADDRESS?
|
||
JRST ADDMC3 ;NO, CONTINUE CHECKING
|
||
MOVE T1,.MCLAD(P2) ;GET LOW ORDER MULTI-CAST ADDRESS
|
||
ANDX T1,MCTLAD ;...
|
||
CAME T1,P4 ;MATCH SUBJECT ADDRESS?
|
||
ERRRET (UNIMA%,UNLETH##) ;YES, INVALID MULTI-CAST ADDRESS
|
||
ADDMC3: ADDI P2,.MCLEN ;BUMP MCAT TABLE POINTER TO NEXT ENTRY
|
||
SOJA P1,ADDMC1 ;LOOP BACK TO CHECK ALL TABLE ENTRIES
|
||
|
||
ADDMC4: MOVE P2,T2 ;GET ADDRESS OF FREE MCAT ENTRY
|
||
JUMPE P2,[ERRRET (UNNRE%,UNLETH##)] ;ERROR IF NO FREE ENTRIES
|
||
DMOVEM P3,.MCHAD(P2) ;STORE MULTI-CAST ADDRESS IN TABLE
|
||
MOVEI T1,1 ;SET THE MULTI-CAST ADDRESS ENABLED FLAG
|
||
DPB T1,MCPENA ;...
|
||
AOS .PBCMC(Q3) ;ADJUST COUNT OF MCAT ENTRIES
|
||
ETHULK ;RELEASE SMP INTERLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- DELETE MULTI-CAST ADDRESS FROM MCAT TABLE
|
||
|
||
|
||
;ROUTINE TO DELETE A MULTI-CAST ADDRESS FROM THE MCAT
|
||
;LINKAGE:
|
||
; T1-T2/ MULTI-CAST ADDRESS
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,DELMCA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
DELMCA: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
DMOVE P3,T1 ;SAVE MULTI-CAST ADDRESS IN P3,P4
|
||
ETHLOK ;INTERLOCK AGAINST SMP RACES
|
||
MOVE P1,.PBLMC(Q3) ;GET LENGTH OF MCAT TABLE
|
||
MOVE P2,.PBVMC(Q3) ;GET VIRTUAL ADDRESS OF MCAT TABLE
|
||
DELMC1: JUMPE P1,[ERRRET (UNIMA%,UNLETH##)] ;ERROR IF NO MORE ENTRIES
|
||
LDB T1,MCPENA ;GET MULTI-CAST ADDRESS ENABLED BIT
|
||
JUMPE T1,DELMC2 ;IF NOT ENABLED, SKIP CHECK
|
||
MOVE T1,.MCHAD(P2) ;GET MULTI-CAST ADDRESS
|
||
ANDX T1,MCTHAD ;...
|
||
ANDX T2,MCTLAD ;...
|
||
CAMN T1,P3 ;MATCH SUBJECT ADDRESS?
|
||
CAME T2,P4 ;...
|
||
SKIPA ;NO, KEEP CHECKING
|
||
JRST DELMC3 ;YES, EXIT LOOP
|
||
DELMC2: ADDI P2,.MCLEN ;BUMP MCAT TABLE POINTER TO NEXT ENTRY
|
||
SOJA P1,DELMC1 ;LOOP BACK TO CHECK ALL TABLE ENTRIES
|
||
|
||
DELMC3: SETZ T1, ;CLEAR THE MULTI-CAST ADDRESS ENABLED FLAG
|
||
DPB T1,MCPENA ;...
|
||
SOS .PBCMC(Q3) ;ADJUST COUNT OF MCAT ENTRIES
|
||
ETHULK ;RELEASE SMP INTERLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- UPDATE KLNI COUNTERS AREA
|
||
|
||
|
||
;ROUTINE CALLED TO UPDATE KLNI COUNTERS AREA (.PBCTR) FROM
|
||
;KLNI COUNTERS DATA BUFFER.
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,UPDCTR
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
UPDCTR: PUSHJ P,SAVE3## ;SAVE P1-P3
|
||
MOVE P1,.PBLCD(Q3) ;GET LENGTH OF KLNI COUNTERS AREA
|
||
MOVE P2,.PBVCD(Q3) ;GET ADDRESS OF COUNTERS DATA BUFFER
|
||
MOVE P3,.PBVCT(Q3) ;AND ADDRESS OF KLNI COUNTERS AREA
|
||
SETZ T1, ;FETCH AND ZERO MULTICAST CHECKSUM ERROR COUNT
|
||
EXCH T1,.PBMCE(Q3) ;...
|
||
MOVNS T1 ;NEGATE
|
||
ADDB T1,.KCRCF(P2) ;ADJUST COUNT OF RECEIVE FAILURES
|
||
JUMPG T1,UPDCT1 ;CONTINUE IF COUNT POSITIVE
|
||
SETZM .KCRCF(P2) ;CLEAR RECEIVE FAILURE COUNT
|
||
SETZM .KCRFM(P2) ;AND RECEIVE FAILURE BIT MASK
|
||
UPDCT1: MOVE T1,(P2) ;GET COUNTER VALUE FROM DATA BUFFER
|
||
ADDM T1,(P3) ;UPDATE KLNI COUNTERS AREA
|
||
AOJ P2, ;UPDATE POINTER TO COUNTERS DATA BUFFER
|
||
AOJ P3, ;AND POINTER TO KLNI COUNTERS AREA
|
||
SOJG P1,UPDCT1 ;LOOP BACK TO UPDATE ALL COUNTERS
|
||
MOVE P2,.PBVCD(Q3) ;GET ADDRESS OF COUNTERS DATA BUFFER
|
||
MOVE P3,.PBVCT(Q3) ;AND ADDRESS OF KLNI COUNTERS AREA
|
||
MOVE T1,.KCXFM(P3) ;GET TRANSMIT FAILURE BIT MASK
|
||
SUB T1,.KCXFM(P2) ;COMPENSATE FOR PREVIOUS LOOP
|
||
IOR T1,.KCXFM(P2) ;UPDATE TRANSMIT FAILURE BIT MASK
|
||
MOVEM T1,.KCXFM(P3) ;...
|
||
MOVE T1,.KCRFM(P3) ;GET RECEIVE FAILURE BIT MASK
|
||
SUB T1,.KCRFM(P2) ;COMPENSATE FOR PREVIOUS LOOP
|
||
IOR T1,.KCRFM(P2) ;UPDATE RECEIVE FAILURE BIT MASK
|
||
MOVEM T1,.KCRFM(P3) ;...
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- GENERATE BSD CHAIN
|
||
|
||
|
||
;ROUTINE TO GENERATE A BSD CHAIN FOR A DATAGRAM
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF FIRST MSD
|
||
; PUSHJ P,GENBSC
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; T1/ COMPUTED SIZE OF DATAGRAM
|
||
; T2/ ADDRESS OF START OF BSD CHAIN
|
||
|
||
GENBSC: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
SETZ P1, ;START WITH COMPUTED DATAGRAM SIZE OF ZERO
|
||
MOVE P2,T1 ;SAVE ADDRESS OF FIRST MSD
|
||
SETZB P3,P4 ;ZERO POINTERS TO BSD CHAIN
|
||
JUMPE T2,GENBC1 ;JUMP IF NOT DOING PADDING ON RECEIVE
|
||
MOVEI T2,.BSLEN ;GET SIZE OF BSD
|
||
PUSHJ P,GETNWZ## ;ALLOCATE ZEROED CORE FOR BSD
|
||
ERRRET (UNRES%) ;ERROR, NO RESOURCES
|
||
MOVE P3,T1 ;SAVE START ADDRESS OF BSD CHAIN IN P3
|
||
MOVE P4,T1 ;AND CURRENT BSD ADDRESS IN P4
|
||
MOVEI T1,2 ;SET UP BSD FOR TWO LENGTH BYTES
|
||
DPB T1,BSPSGL ;...
|
||
MAP T1,.BSRWD(P4) ;GET PHYSICAL ADDRESS OF BSD DATA WORD
|
||
TXZ T1,MP.NAD ;...
|
||
DPB T1,BSPSBA ;STORE AS BASE ADDRESS OF THIS SEGMENT
|
||
ADDI P1,2 ;ADJUST COMPUTED DATAGRAM SIZE
|
||
GENBC1: SKIPA ;ENTER MAIN LOOP
|
||
GENBC2: LOAD P2,MDNXT,(P2) ;GET ADDRESS OF NEXT MSD
|
||
JUMPE P2,GENBC5 ;EXIT LOOP AT END OF BSD CHAIN
|
||
LOAD T1,MDBYT,(P2) ;GET BYTE COUNT
|
||
JUMPE T1,GENBC2 ;LOOP BACK IF EMPTY MSD
|
||
ADD P1,T1 ;ADJUST COMPUTED DATAGRAM SIZE
|
||
LDB T2,[POINT 6,MD.AUX(P2),11] ;GET "S" FIELD FROM BYTE POINTER
|
||
CAIE T2,^D8 ;EIGHT BIT BYTES?
|
||
ERRRET (UNIBP%,GENBCX) ;NO, ILLEGAL BYTE POINTER
|
||
LDB T2,[POINT 6,MD.AUX(P2),5] ;GET "P" FIELD FROM BYTE POINTER
|
||
IDIVI T2,^D8 ;COMPUTE BYTE OFFSET
|
||
SUBI T2,4 ;...
|
||
MOVMS T2 ;...
|
||
CAIE T3,4 ;CORRECTLY ALIGNED BYTES?
|
||
ERRRET (UNIBP%,GENBCX) ;NO, ILLEGAL BYTE POINTER
|
||
HRRZ T3,MD.AUX(P2) ;GET ANY OFFSET FROM BYTE POINTER
|
||
ADD T3,MD.ALA(P2) ;COMPUTE ADDRESS OF DATA AREA
|
||
TLNE T3,777740 ;ANY BITS EXCEPT FOR ADDRESS PRESENT?
|
||
ERRRET (UNIBP%,GENBCX) ;YES, ILLEGAL BYTE POINTER
|
||
TRZE T2,4 ;WORD ALIGNED ON SECOND WORD OF DATA?
|
||
ADDI T3,1 ;YES, BUMP ADDRESS
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
GENBC3: PUSHJ P,GENBSD ;GENERATE NEXT BSD FOR THIS SEGMENT
|
||
JRST GENBCX ;ERROR, ERROR CODE IN T1
|
||
JUMPE P3,[MOVE P3,T4 ;IF FIRST BSD, SET UP INITIAL POINTER
|
||
JRST GENBC4] ;AND CONTINUE
|
||
PUSH P,T4 ;SAVE ADDRESS OF NEW BSD
|
||
MOVEM T4,.BSVNB(P4) ;LINK NEW BSD TO END OF CURRENT BSD CHAIN
|
||
MAP T4,0(T4) ;GET PHYSICAL ADDRESS OF BSD
|
||
TXZ T4,MP.NAD ;...
|
||
DPB T4,BSPNXT ;LINK TO PREVIOUS CHAIN
|
||
POP P,T4 ;GET BACK BSD ADDRESS
|
||
GENBC4: MOVE P4,T4 ;UPDATE POINTER TO CURRENT BSD
|
||
JUMPN T1,GENBC3 ;LOOP BACK TO COMPLETE THIS DATA SEGMENT
|
||
JRST GENBC2 ;THEN LOOP BACK FOR REMAINDER OF BSD CHAIN
|
||
|
||
GENBC5: MOVE T1,P1 ;GET COMPUTED SIZE OF DATAGRAM
|
||
MOVE T2,P3 ;AND ADDRESS OF BSD CHAIN
|
||
PJRST CPOPJ1## ;RETURN
|
||
|
||
GENBCX: PJUMPE P3,CPOPJ## ;JUST RETURN IF NO BSD CHAIN
|
||
PUSH P,T1 ;SAVE ERROR CODE
|
||
MOVE T1,P3 ;GET START OF BSD CHAIN
|
||
PUSHJ P,GIVBSC ;RELEASE BSD CHAIN
|
||
PJRST TPOPJ## ;RESTORE ERROR CODE AND RETURN
|
||
;ROUTINE CALLED TO BUILD A BUFFER SEGMENT DESCRIPTOR GIVEN
|
||
;A BYTE COUNT, BYTE OFFSET, AND ADDRESS OF A DATAGRAM SEGMENT
|
||
;LINKAGE:
|
||
; T1/ BYTE COUNT OF DATAGRAM SEGMENT
|
||
; T2/ BYTE OFFSET TO DATAGRAM SEGMENT
|
||
; T3/ ADDRESS OF DATAGRAM SEGMENT
|
||
; PUSHJ P,GENBSD
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; T1/ UPDATED BYTE COUNT OF DATAGRAM SEGMENT
|
||
; T2/ UPDATED BYTE OFFSET TO DATAGRAM SEGMENT
|
||
; T3/ UPDATED ADDRESS OF DATAGRAM SEGMENT
|
||
; T4/ ADDRESS OF BUFFER SEGMENT DESCRIPTOR
|
||
|
||
GENBSD: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
DMOVE P1,T1 ;SAVE BYTE COUNT AND BYTE OFFSET
|
||
MOVE P3,T3 ;AND ADDRESS OF DATAGRAM SEGMENT
|
||
JUMPE P2,GENBS1 ;JUMP IF WORD ALIGNED DATA
|
||
MOVEI T2,.BSLEN ;GET LENGTH OF BSD
|
||
PUSHJ P,GETNWZ## ;ALLOCATE ZEROED CORE FOR BSD
|
||
ERRRET (UNRES%) ;ERROR, NO RESOURCES
|
||
MOVE P4,T1 ;SAVE ADDRESS OF BSD IN P4
|
||
MOVEI T1,4 ;COMPUTE BYTE COUNT OF MIS-ALIGNED DATA
|
||
SUB T1,P2 ;...
|
||
CAMLE T1,P1 ;COMPARE TO SEGMENT'S BYTE COUNT
|
||
MOVE T1,P1 ;USE SMALLER OF THE TWO
|
||
DPB T1,BSPSGL ;STORE BYTE COUNT INTO BSD
|
||
SUB P1,T1 ;UPDATE SEGMENT BYTE COUNT
|
||
MOVE T1,P2 ;GET BYTE OFFSET
|
||
IMULI T1,^D8 ;COMPUTE SHIFT COUNT TO ALIGN DATA
|
||
MOVE T2,0(P3) ;FETCH FIRST DATA WORD
|
||
LSH T2,(T1) ;WORD ALIGN THE DATA
|
||
MOVEM P2,.BSRWB(P4) ;SAVE RE-ALIGNED WORD BYTE OFFSET
|
||
MOVEM P3,.BSRWA(P4) ;AND RE-ALIGNED WORD ADDRESS
|
||
MOVEM T2,.BSRWD(P4) ;AND RE-ALIGNED WORD DATA
|
||
MAP T1,.BSRWD(P4) ;GET PHYSICAL ADDRESS OF RE-ALIGNED DATA
|
||
TXZ T1,MP.NAD ;...
|
||
DPB T1,BSPSBA ;STORE IN BSD
|
||
SETZ P2, ;ZERO BYTE OFFSET AS NOW WORD ALIGNED
|
||
ADDI P3,1 ;UPDATE SEGMENT ADDRESS
|
||
JRST GENBS3 ;AND RETURN
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
GENBS1: MOVEI T2,.BSLEN ;GET LENGTH OF BSD
|
||
PUSHJ P,GETNWZ## ;ALLOCATE ZEROED CORE FOR BSD
|
||
ERRRET (UNRES%) ;ERROR, NO RESOURCES
|
||
MOVE P4,T1 ;SAVE BSD ADDRESS IN P4
|
||
MAP T1,0(P3) ;GET PHYSICAL ADDRESS OF DATA SEGMENT
|
||
TXZ T1,MP.NAD ;...
|
||
DPB T1,BSPSBA ;STORE IN BSD
|
||
MOVE T2,T1 ;CALCULATE NEXT PAGE BOUNDARY
|
||
ADDI T2,PAGSIZ ;...
|
||
TRZ T2,PG.BDY## ;...
|
||
SUB T2,T1 ;CONVERT INTO WORD COUNT
|
||
GENBS2: IMULI T2,4 ;CONVERT WORD COUNT INTO BYTE COUNT
|
||
CAMLE T2,P1 ;COMPARE TO SEGMENT BYTE COUNT
|
||
MOVE T2,P1 ;USE SMALLER OF THE TWO
|
||
LDB T3,BSPSGL ;GET BSD SEGMENT LENGTH
|
||
ADD T3,T2 ;ADJUST COUNT
|
||
DPB T3,BSPSGL ;...
|
||
SUB P1,T2 ;UPDATE DATAGRAM SEGMENT BYTE COUNT
|
||
IDIVI T2,4 ;CONVERT BYTE COUNT INTO WORD COUNT
|
||
ADD P3,T2 ;UPDATE SEGMENT DATA ADDRESS
|
||
JUMPE P1,GENBS3 ;RETURN AT END OF DATAGRAM SEGMENT
|
||
MAP T2,0(P3) ;GET PHYSICAL ADDRESS OF NEXT DATA CHUNK
|
||
TXZ T2,MP.NAD ;...
|
||
SUB T2,T1 ;COMPUTE OFFSET FROM PREVIOUS PAGE
|
||
SKIPL T2 ;PHYSICALLY CONTINGUOUS WITH PREVIOUS PAGE?
|
||
CAILE T2,PAGSIZ ;...
|
||
JRST GENBS3 ;NO, RETURN
|
||
MOVEI T2,PAGSIZ ;GET SIZE OF NEXT POSSIBLE CHUNK
|
||
MOVE T1,T2 ;GET BASE ADDRESS OF NEXT PAGE
|
||
JRST GENBS2 ;LOOP BACK TO PROCESS SEGMENT
|
||
GENBS3: DMOVE T1,P1 ;GET UPDATED BYTE COUNT AND BYTE OFFSET
|
||
DMOVE T3,P3 ;AND UPDATED SEGMENT ADDRESS AND BSD ADDRESS
|
||
PJRST CPOPJ1## ;RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- RELEASE A BSD CHAIN
|
||
|
||
|
||
;ROUTINE CALLED TO RELEASE A BSD CHAIN
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF BSD CHAIN
|
||
; PUSHJ P,GIVBSC
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
GIVBSC: PUSHJ P,SAVE1## ;SAVE P1
|
||
MOVE P1,T1 ;SAVE ADDRESS OF FIRST BSD
|
||
GIVBC1: PUSH P,.BSVNB(P1) ;SAVE ADDRESS OF NEXT BSD
|
||
MOVEI T1,.BSLEN ;GET LENGTH OF BSD
|
||
MOVE T2,P1 ;AND ADDRESS OF CURRENT BSD
|
||
PUSHJ P,GIVNWS## ;RELEASE THE CORE
|
||
POP P,P1 ;GET ADDRESS OF NEXT BSD
|
||
JUMPN P1,GIVBC1 ;LOOP BACK TO RELEASE ENTIRE CHAIN
|
||
POPJ P, ;RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- ALLOCATE KLNI COMMAND BUFFER
|
||
|
||
|
||
;ROUTINE CALLED TO ALLOCATE A KLNI COMMAND BUFFER
|
||
;LINKAGE:
|
||
; T1/ KLNI COMMAND OPCODE
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,GETCMD
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; T1/ ERROR CODE (UNXXX%)
|
||
; CPOPJ1 ON SUCCESS WITH:
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
|
||
GETCMD: PUSH P,T1 ;SAVE KLNI COMMAND CODE
|
||
MOVEI T2,.CMLEN ;GET LENGTH OF COMMAND BUFFER
|
||
PUSHJ P,GETNWZ## ;ALLOCATE CORE FOR COMMAND BUFFER
|
||
PJRST [POP P,(P) ;ERROR, CLEAR STACK
|
||
ERRRET (UNRES%)] ;AND GIVE ERROR RETURN
|
||
MOVE Q1,T1 ;GET ADDRESS OF COMMAND BUFFER
|
||
POP P,T1 ;GET BACK KLNI COMMAND CODE
|
||
DPB T1,CMPCMD ;STORE OPCODE IN KLNI COMMAND BUFFER
|
||
MOVX T1,CMFRSP ;SET RESPONSE REQUIRED FLAG
|
||
DPB T1,CMPFLG ;...
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- RELEASE KLNI COMMAND BUFFER
|
||
|
||
|
||
;ROUTINE CALLED TO RELEASE A KLNI COMMAND BUFFER
|
||
;LINKAGE:
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; PUSHJ P,GIVCMD
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
GIVCMD: PJUMPE Q1,CPOPJ## ;RETURN IF NO BUFFER ALLOCATED
|
||
MOVEI T1,.CMLEN ;GET LENGTH OF COMMAND BUFFER
|
||
MOVE T2,Q1 ;AND ADDRESS OF COMMAND BUFFER
|
||
SETZ Q1, ;NO KLNI COMMAND BUFFER
|
||
PJRST GIVNWS## ;RELEASE CORE AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- QUEUE KLNI COMMAND TO FREE QUEUE
|
||
|
||
|
||
;ROUTINE TO QUEUE A COMMAND BUFFER TO A PROTOCOL'S FREE QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF CALLBACK ROUTINE
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; Q2/ ADDRESS OF PROTOCOL USER BLOCK
|
||
; PUSHJ P,KNICMF
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNICMF: MOVEM T1,.CMCBA(Q1) ;STORE CALLBACK ROUTINE ADDRESS
|
||
AOS .PBKFC(Q3) ;UPDATE COUNT OF FREE COMMANDS QUEUED
|
||
MOVE T1,SYSUPT## ;GET SYSTEM UPTIME
|
||
MOVEM T1,.PBKFT(Q3) ;REMEMBER WHEN LAST COMMAND QUEUED
|
||
XMOVEI T1,.PUFQH(Q2) ;GET ADDRESS OF PROTOCOL'S FREE QUEUE
|
||
XMOVEI T2,.CMQUE(Q1) ;AND ADDRESS OF QUEUE ENTRY
|
||
PJRST PUTQUE ;INSERT COMMAND INTO QUEUE AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- QUEUE KLNI COMMAND TO COMMAND QUEUE
|
||
|
||
|
||
;ROUTINE TO QUEUE A COMMAND BUFFER TO THE KLNI'S COMMAND QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF CALLBACK ROUTINE
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNICMD
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNICMD: MOVEM T1,.CMCBA(Q1) ;STORE CALLBACK ROUTINE ADDRESS
|
||
XMOVEI T1,.PBCMQ(Q3) ;GET ADDRESS OF KLNI COMMAND QUEUE
|
||
XMOVEI T2,.CMQUE(Q1) ;AND ADDRESS OF QUEUE ENTRY
|
||
PUSHJ P,PUTQUE ;INSERT COMMAND INTO QUEUE
|
||
LDB T1,PBPCPU ;GET CPU NUMBER OF KLNI
|
||
CAME T1,.CPCPN## ;KLNI ON OUR CPU?
|
||
JRST KNICM1 ;NO, GO DO QUEUED I/O
|
||
AOS .PBKCC(Q3) ;UPDATE COUNT OF KLNI COMMANDS QUEUED
|
||
MOVE T1,.CPUPT## ;GET CPU UPTIME
|
||
MOVEM T1,.PBKCT(Q3) ;REMEMBER WHEN LAST COMMAND QUEUED
|
||
MOVX T1,PBSQIO ;CLEAR QUEUED I/O FLAG IN PCB
|
||
ANDCAM T1,.PBSTS(Q3) ;...
|
||
MOVE T1,.PBPIA(Q3) ;GET KLNI PI ASSIGNMENT
|
||
TXO T1,CO.CQA!CO.BTS ;PLUS COMMAND QUEUE AVAILABLE FLAG
|
||
XCT KDBCNO(Q3) ;TELL KLNI
|
||
POPJ P, ;AND RETURN
|
||
|
||
KNICM1: AOS .PBKQC(Q3) ;UPDATE COUNT OF QUEUED I/O COMMANDS
|
||
MOVE T1,SYSUPT## ;GET SYSTEM UPTIME
|
||
MOVEM T1,.PBKQT(Q3) ;REMEMBER WHEN LAST COMMAND QUEUED
|
||
MOVX T1,PBSQIO ;SET QUEUED I/O FLAG IN PCB
|
||
IORM T1,.PBSTS(Q3) ;...
|
||
MOVE T1,.CPQPC## ;GET THIS CPU'S QUEUED I/O FLAG
|
||
IORM T1,DOORBL## ;SET QUEUED I/O FLAG
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL KLNI DEVICE SERVICE -- MISCELLANEOUS
|
||
|
||
|
||
;ROUTINE TO SWAP HIGH AND LOW ORDER BYTES OF A NUMBER
|
||
;LINKAGE:
|
||
; T1/ NUMBER
|
||
; PUSHJ P,SWAB
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS WITH:
|
||
; T1/ NUMBER
|
||
|
||
SWAB: DPB T1,[POINT 8,T1,19] ;REPOSITION LOW ORDER BYTE
|
||
LSH T1,-^D8 ;JUSTIFY RESULT
|
||
POPJ P, ;RETURN
|
||
|
||
|
||
;ROUTINE TO CONVERT TRANSMIT/RECEIVE DATAGRAM ERROR CODE INTO
|
||
;APPROPRIATE ETHSER ERROR CODE
|
||
;LINKAGE:
|
||
; T1/ KLNI ERROR CODE
|
||
; PUSHJ P,CVTETY
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS WITH:
|
||
; T1/ ETHSER ERROR CODE (UNXXX%)
|
||
|
||
CVTETY: MOVEI T1,UNRAB% ;THESE HAVE TO BE DEFINED
|
||
POPJ P, ;RETURN
|
||
SUBTTL KLNI INTERRUPT SERVICE -- INTERRUPT DISPATCH
|
||
|
||
|
||
;ROUTINE CALLED FROM CONSO SKIP CHAIN TO PROCESS KLNI INTERRUPT
|
||
;LINKAGE:
|
||
; T1/ CONI STATUS WORD
|
||
; T2/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNIINT
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNIINT: MOVX T2,PBSMAI ;IS KLNI IN MAINTENANCE MODE?
|
||
TDNE T2,.PBSTS(W) ;...
|
||
POPJ P, ;YES, RETURN NOW
|
||
MOVE Q3,W ;COPY PCB ADDRESS TO STANDARD REGISTER
|
||
SETZB Q1,Q2 ;START CLEAN
|
||
MOVEM T1,.PBCLI(Q3) ;SAVE CONI IN PORT CONTROL BLOCK
|
||
TXNE T1,CI.CPE!CI.MER!CI.EPE!CI.DPE ;ANY BAD ERROR?
|
||
JRST KNIIT2 ;YES
|
||
MOVX T1,PBSQIO ;ANY QUEUED I/O REQUESTS?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
JRST KNIIT1 ;NO, CONTINUE NORMALLY
|
||
ANDCAM T1,.PBSTS(Q3) ;YES, CLEAR QUEUED I/O REQUEST FLAG
|
||
MOVE T1,.PBPIA(Q3) ;GET KLNI PI ASSIGNMENT
|
||
TRO T1,CO.CQA!CO.BTS ;PLUS COMMAND QUEUE AVAILABLE FLAG
|
||
XCT KDBCNO(Q3) ;TELL KLNI
|
||
KNIIT1: MOVX T1,CI.FQE ;FREE QUEUE ERROR?
|
||
TDNE T1,.PBCLI(Q3) ;...
|
||
PUSHJ P,KNEFQE ;YES, PROCESS
|
||
PUSHJ P,KNIRQA ;PROCESS ANY RESPONSES
|
||
POPJ P, ;DISMISS THE INTERRUPT
|
||
|
||
KNIIT2: PUSHJ P,KNESTP ;PERFORM KLNI ERROR STOP PROCESSING
|
||
MOVX T1,CI.CPE ;CRAM PARITY ERROR?
|
||
TDNE T1,.PBCLI(Q3) ;...
|
||
PUSHJ P,KNECPE ;YES
|
||
MOVX T1,CI.MER ;MBUS ERROR?
|
||
TDNE T1,.PBCLI(Q3) ;...
|
||
PUSHJ P,KNEMBE ;YES
|
||
MOVX T1,CI.EPE ;EBUS PARITY ERROR?
|
||
TDNE T1,.PBCLI(Q3) ;...
|
||
PUSHJ P,KNEEPE ;YES
|
||
MOVX T1,CI.DPE ;DATA PATH ERROR?
|
||
TDNE T1,.PBCLI(Q3) ;...
|
||
PUSHJ P,KNEDPE ;YES
|
||
POPJ P, ;DISMISS THE INTERRUPT
|
||
SUBTTL KLNI INTERRUPT SERVICE -- PROCESS RESPONSE QUEUE
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS KLNI RESPONSE QUEUE
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNIRQA
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNIRQA: PUSHJ P,SAVE1## ;SAVE P1
|
||
KNIRQ1: MOVE T1,.PBPIA(Q3) ;GET KLNI PI ASSIGNMENT
|
||
TXO T1,CO.RQA!CO.BTS ;PLUS RESPONSE QUEUE AVAILABLE
|
||
MOVX T2,PBSRUN ;IS KLNI RUNNING?
|
||
TDNE T2,.PBSTS(Q3) ;...
|
||
XCT KDBCNO(Q3) ;TELL KLNI RESPONSE QUEUE IS AVAILABLE
|
||
XMOVEI T1,.PBRSQ(Q3) ;GET VIRTUAL ADDRESS OF QUEUE HEADER
|
||
PUSHJ P,REMQUE ;REMOVE NEXT ENTRY FROM RESPONSE QUEUE
|
||
POPJ P, ;RESPONSE QUEUE EMPTY, RETURN
|
||
XMOVEI Q1,-.CMQUE(T2) ;GET ADDRESS OF KLNI COMMAND BUFFER
|
||
LDB T1,CMPCMD ;GET COMMAND OPCODE
|
||
SKIPE T1 ;VALID OPCODE?
|
||
CAILE T1,CMOMAX ;...
|
||
STOPCD .+1,DEBUG,KNIICO ;++INVALID COMMAND OPCODE
|
||
AOS .PBKRC(Q3) ;UPDATE COUNT OF KLNI RESPONSES PROCESSED
|
||
MOVE T1,.CPUPT## ;GET CPU UPTIME
|
||
MOVEM T1,.PBKRT(Q3) ;REMEMBER WHEN LAST RESPONSE PROCESSED
|
||
MOVE T1,.CMCBA(Q1) ;GET CALLBACK ROUTINE ADDRESS
|
||
MOVE Q2,.CMPUB(Q1) ;GET ADDRESS OF PROTOCOL USER BLOCK
|
||
MOVE P1,.CMEAB(Q1) ;AND ADDRESS OF EA BLOCK
|
||
PUSHJ P,(T1) ;CALL CALLBACK ROUTINE
|
||
JFCL ;...
|
||
JRST KNIRQ1 ;LOOP BACK TO EMPTY RESPONSE QUEUE
|
||
SUBTTL KLNI INTERRUPT SERVICE -- FREE QUEUE ERROR
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS A FREE QUEUE ERROR
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNEFQE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNEFQE: AOS .PBFQE(Q3) ;COUNT A FREE QUEUE ERROR
|
||
MOVE T1,.PBPIA(Q3) ;GET PI ASSIGNMENT
|
||
TXO T1,CO.FQE!CO.BTS ;PLUS FREE QUEUE ERROR
|
||
XCT KDBCNO(Q3) ;TELL KLNI
|
||
POPJ P, ;RETURN
|
||
SUBTTL KLNI INTERRUPT SERVICE -- CRAM PARITY ERROR
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS A CRAM PARITY ERROR
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNECPE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
;NOTE:
|
||
;MUST BE CALLED AFTER REPORT AS IT DEPENDS ON SOME
|
||
;OF THE DATA RECORDED GATHERED BY REPORT
|
||
|
||
KNECPE: MOVE T1,.PBCRA(Q3) ;GET THE CRAM ADDRESS
|
||
CAIL T1,PPEFST ;IS THIS A PLANNED CRAM PARITY ERROR?
|
||
CAILE T1,PPELST ;...
|
||
STOPCD CPOPJ,INFO,KNICPE,CPETYP ;++KLNI CRAM PARITY ERROR
|
||
STOPCD CPOPJ,INFO,KNIHLT,HLTTYP ;++KLNI MICROPROCESSOR HALT
|
||
|
||
;ROUTINE CALLED FROM DIE ON AN UNPLANNED CRAM PARITY ERROR
|
||
|
||
CPETYP: PUSHJ P,INLMES## ;PRINT TEXT
|
||
ASCIZ /NIA20 CRAM parity error
|
||
CRAM location /
|
||
MOVE T1,.PBCRA(Q3) ;GET THE CRAM ADDRESS
|
||
PUSHJ P,PRTDI8## ;PRINT IN OCTAL
|
||
PUSHJ P,INLMES## ;TYPE OUT CRAM CONTENTS
|
||
ASCIZ /, CRAM contents /
|
||
MOVE T1,.PBCRC(Q3) ;GET FIRST CRAM HALFWORD
|
||
PUSHJ P,HWDPNT## ;PRINT AS HALFWORDS
|
||
PUSHJ P,PRSPC## ;SPACE OVER
|
||
MOVE T1,.PBCRC+1(Q3) ;GET SECOND CRAM HALFWORD
|
||
PJRST HWDPNT## ;PRINT AS HALFWORDS AND RETURN (DIE ADDS CRLF)
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
;ROUTINE CALLED FROM DIE ON A PLANNED CRAM PARITY ERROR
|
||
|
||
HLTTYP: PUSHJ P,INLMES## ;PRINT TEXT
|
||
ASCIZ /NIA20 microprocessor halted - /
|
||
MOVE T1,.PBCRA(Q3) ;GET THE CRAM ADDRESS
|
||
HRRZ T1,CPETXT-PPEFST(T1) ;GET ERROR TEXT ADDRESS
|
||
PJRST CONMES## ;PRINT AND RETURN (DIE ADDS CRLF)
|
||
;TABLE OF TEXT STRINGS BASED ON CRAM ADDRESS FOR PLANNED CRAM PARITY ERRORS
|
||
|
||
DEFINE ERRS,<
|
||
|
||
XALL ;;LIST GENERATED TABLE
|
||
|
||
CPE 7750, <Internal port error>
|
||
CPE 7751, <Self test failed>
|
||
CPE 7752, <EBUS parity error>
|
||
CPE 7753, <EBUS parity error>
|
||
CPE 7754, <PLI parity error>
|
||
CPE 7755, <CBUS parity error>
|
||
CPE 7756, <Data path error>
|
||
CPE 7757, <CBUS request error>
|
||
CPE 7760, <EBUS request error>
|
||
CPE 7761, <Grant CSR error>
|
||
CPE 7762, <Short word count>
|
||
CPE 7763, <Spurious channel error>
|
||
CPE 7764, <Spuriour transmit attention error>
|
||
CPE 7765, <Used buffer list parity error>
|
||
CPE 7766, <Free buffer list parity error>
|
||
CPE 7767, <Transmit buffer list parity error>
|
||
CPE 7770, <Unknown halt code 7770>
|
||
CPE 7771, <Unknown halt code 7771>
|
||
CPE 7772, <Unknown halt code 7772>
|
||
CPE 7773, <Unknown halt code 7773>
|
||
CPE 7774, <Unknown halt code 7774>
|
||
CPE 7775, <Unknown halt code 7775>
|
||
CPE 7776, <Unknown halt code 7776>
|
||
CPE 7777, <Unknown halt code 7777>
|
||
|
||
SALL ;;TURN LISTING BACK OFF
|
||
|
||
>; END DEFINE ERRS
|
||
;GENERATE ERROR TEXT TABLE
|
||
|
||
DEFINE CPE(LOC,TEXT),<
|
||
IF1,<IFN <<LOC-PPEFST>-<.-CPETXT>>,<PRINTX ?Table CPETXT entry LOC is out of order>>
|
||
IFIW [ASCIZ/TEXT/] ;LOC
|
||
>; END DEFINE CPE
|
||
|
||
CPETXT: ERRS ;GENERATE ERROR TEXT TABLE
|
||
IF1,<IFN <<PPELST-PPEFST>-<.-CPETXT-1>>,<PRINTX ?Table CPETXT is missing entries>>
|
||
SUBTTL KLNI INTERRUPT SERVICE -- MBUS ERROR
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS AN MBUS ERROR
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNEMBE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
;NOTE:
|
||
;MUST BE CALLED AFTER REPORT AS IT DEPENDS ON SOME
|
||
;OF THE DATA WHICH REPORT STORES IN THE PCB
|
||
|
||
KNEMBE: STOPCD CPOPJ##,INFO,KNIMBE ;++KLNI MBUS ERROR
|
||
SUBTTL KLNI INTERRUPT SERVICE -- EBUS PARITY ERROR
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS AN EBUS PARITY ERROR
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNEEPE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
;NOTE:
|
||
;MUST BE CALLED AFTER REPORT AS IT DEPENDS ON SOME
|
||
;OF THE DATA WHICH REPORT STORES IN THE PCB
|
||
|
||
KNEEPE: STOPCD CPOPJ##,INFO,KNIEPE ;++KLNI EBUS PARITY ERROR
|
||
SUBTTL KLNI INTERRUPT SERVICE -- DATA PATH ERROR
|
||
|
||
|
||
;ROUTINE CALLED TO PROCESS AN DATA PATH ERROR
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNEDPE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
;NOTE:
|
||
;MUST BE CALLED AFTER REPORT AS IT DEPENDS ON SOME
|
||
;OF THE DATA WHICH REPORT STORES IN THE PCB
|
||
|
||
KNEDPE: STOPCD CPOPJ##,INFO,KNIDPE ;++KLNI DATA PATH ERROR
|
||
SUBTTL KLNI INTERRUPT SERVICE -- KLNI ERROR STOP PROCESSING
|
||
|
||
|
||
;ROUTINE CALLED WHEN KLNI STOPS
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNESTP
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNESTP: PUSHJ P,STPKNI ;STOP KLNI MICROCODE AND CLEAN UP
|
||
PUSHJ P,REPORT ;MAKE AN ERROR.SYS ENTRY
|
||
MOVE T1,.PBKHT(Q3) ;GET UPTIME WHEN KLNI HALTED
|
||
SUB T1,.PBKST(Q3) ;CALCULATE TIME KLNI WAS UP
|
||
IMULI T1,^D1000 ;CONVERT TO MILLISECONDS
|
||
IDIV T1,TICSEC## ;...
|
||
CAXL T1,UPTTIM ;WAS KLNI UP MINIMUM LENGTH OF TIME?
|
||
PJRST RLDKND ;YES, REQUEST KLNI DUMP AND RELOAD
|
||
STOPCD CPOPJ##,INFO,KNIARD ;++KLNI AUTO-RELOAD DISABLED
|
||
SUBTTL KLNI INTERRUPT SERVICE -- SPEAR ERROR LOGGING
|
||
|
||
|
||
;ROUTINE TO RECORD PORT ERROR INFORMATION AND MAKE A SPEAR ENTRY
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,REPORT
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
REPORT: AOS .PBKEC(Q3) ;UPDATE COUNT OF KLNI ERRORS
|
||
MOVE T1,SYSUPT## ;GET SYSTEM UPTIME
|
||
MOVEM T1,.PBKET(Q3) ;REMEMBER TIME OF LAST KLNI ERROR
|
||
MOVE T1,.PBCLI(Q3) ;GET CONI FROM THIS INTERRUPT
|
||
MOVEM T1,.PBCLE(Q3) ;SAVE AS CONI FROM LAST ERROR
|
||
PUSH P,W ;SAVE AC
|
||
MOVE W,Q3 ;PUT KDB (PCB) ADDRESS IN PROPER PLACE
|
||
PUSHJ P,RDLAR## ;READ LATCHED ADDRESS REGISTER CONTENTS
|
||
SETZ T1, ;ERROR?
|
||
MOVEM T1,.PBCRA(Q3) ;SAVE IT
|
||
PUSHJ P,RDIPA## ;READ THAT LOCATION'S CONTENTS
|
||
SETZB T2,T3 ;ERROR?
|
||
POP P,W ;RESTORE AC
|
||
DMOVEM T2,.PBCRC(Q3) ;SAVE IN PCB
|
||
MOVE T1,.PBLGO(Q3) ;ADDRESS OF CHANNEL LOGOUT AREA
|
||
DMOVE T2,0(T1) ;GET FIRST TWO WORDS OF CHANNEL LOGOUT AREA
|
||
DMOVEM T2,.PBLG0(Q3) ;SAVE THEM
|
||
MOVE T2,2(T1) ;GET THIRD WORD
|
||
MOVEM T2,.PBLG2(Q3) ;SAVE IT
|
||
MOVE T1,.PBCCW(Q3) ;GET PORT'S CCW
|
||
MOVEM T1,.PBECW(Q3) ;SAVE IT
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
MOVEI T1,KP%LEN ;LENGTH OF ERROR BLOCK
|
||
PUSHJ P,ALCSEB## ;ALLOCATE SYSTEM ERROR BLOCK
|
||
POPJ P, ;SORRY, WE TRIED
|
||
MOVEI T2,SEC%KP ;GET THE ERROR CODE
|
||
DPB T2,[POINT 9,.EBTYP(T1),8] ;STORE THE TYPE IN THE HEADER
|
||
MOVE T2,.PBCLE(Q3) ;GET CONI ON ERROR
|
||
MOVEM T2,.EBHDR+KP%CSR(T1) ;STORE IT
|
||
PUSH P,T1 ;SAVE ADDRESS FOR A MOMENT
|
||
LDB T1,[POINT 3,KDBCNO(Q3),9] ;GET RH20 NUMBER
|
||
MOVE T2,.PBUVR(Q3) ;GET KLNI MICROCODE VERSION
|
||
DPB T1,[POINTR (T2,KP%CHN)] ;SET RH20 CHANNEL
|
||
TXO T2,KP%NI ;AND KLNI FLAG
|
||
POP P,T1 ;RESTORE T1
|
||
MOVEM T2,.EBHDR+KP%VER(T1) ;STORE IT
|
||
MOVEI T2,2(P1) ;GET DISPOSITION CODE
|
||
MOVEM T2,.EBHDR+KP%DSP(T1) ;STORE IT
|
||
MOVE T2,.PBCRA(Q3) ;GET CRAM ADDRESS
|
||
MOVEM T2,.EBHDR+KP%CRA(T1) ;STORE IT
|
||
DMOVE T2,.PBCRC(Q3) ;GET CRAM CONTENTS
|
||
DMOVEM T2,.EBHDR+KP%CRD(T1) ;STORE IT
|
||
DMOVE T2,.PBLG0(Q3) ;GET FIRST TWO LOGOUT WORDS
|
||
DMOVEM T2,.EBHDR+KP%LG0(T1) ;STORE THEM
|
||
MOVE T2,.PBLG2(Q3) ;GET THIRD LOGOUT WORD
|
||
MOVEM T2,.EBHDR+KP%LG2(T1) ;STORE IT
|
||
MOVE T2,.PBECW(Q3) ;GET PORT'S CCW AT ERROR
|
||
MOVEM T2,.EBHDR+KP%ECW(T1) ;STORE IT
|
||
DMOVE T2,.PBER0(Q3) ;GET ERROR WORDS
|
||
DMOVEM T2,.EBHDR+KP%PE0(T1) ;STORE THEM
|
||
PJRST QUESEB## ;QUEUE THE BLOCK AND RETURN
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- DIAG. UUO
|
||
|
||
|
||
;DIAG. UUO FUNCTIONS FOR DIAGNOSTIC CONTROL OF A KLNI
|
||
;LINKAGE: (CALL FROM DIAUUO ON CORRECT CPU)
|
||
; P1/ NUMBER OF ARGUMENTS
|
||
; P2/ DIAG. UUO FUNCTION CODE
|
||
; P3/ SUBROUTINE (FROM KNIDIA)
|
||
; W/ KDB (PCB) ADDRESS
|
||
; PUSHJ P,@KNIDIA
|
||
;RETURNS:
|
||
; CPOPJ ON ERROR WITH:
|
||
; USER AC/ ERROR CODE (DIXXX%)
|
||
; CPOPJ1 ON SUCCESS
|
||
|
||
ERCODX DIAPRV,DIANP% ;INSUFFICIENT PRIVILEGES
|
||
ERCODX DIAIAL,DIAIA% ;INVALID ARGUMENT LIST LENGTH
|
||
ERCODX DIAICN,DIAIC% ;ILLEGAL CONTROLLER NUMBER
|
||
ERCODX DIAILF,DIAIF% ;ILLEGAL FUNCTION
|
||
ERCODX DIANKC,DIANK% ;NO KLNI PORT ON THIS CPU
|
||
|
||
KNIDIA: EXP KNIPPR ;PREPROCESSOR ROUTINE
|
||
DIAFNC (AAU,DIAAAU,) ;ASSIGN ALL UNITS
|
||
DIAFNC (RAU,DIARAU,) ;RELEASE CHANNEL AND ALL UNITS
|
||
DIAFNC (SCP,DIASCP,) ;SPECIFY CHANNEL PROGRAM
|
||
DIAFNC (RCP,DIARCP,) ;RELEASE CHANNEL PROGRAM
|
||
DIAFNC (GCS,DIACST,) ;GET CHANNEL STATUS
|
||
DIAFNC (ELD,DIAELD,) ;ENABLE MICROCODE LOADING
|
||
DIAFNC (DLD,DIADLD,) ;DISABLE MICROCODE LOADING
|
||
DIAFNC (LOD,DIALOD,) ;LOAD MICROCODE
|
||
DIAFNC (ISM,DIAISM,) ;SET MAINTENANCE MODE
|
||
DIAFNC (ICM,DIAICM,) ;CLEAR MAINTENANCE MODE
|
||
DIAFNC ;TERMINATE TABLE
|
||
|
||
;PREPROCESSOR ROUTINE
|
||
KNIPPR: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
PUSHJ P,SAVQ## ;AND Q1-Q3
|
||
MOVSI T1,JP.POK ;JOB HAVE SUFFICIENT PRIVILEGES?
|
||
PUSHJ P,PRVBIT## ;...
|
||
SKIPA Q3,W ;GET PORT CONTROL BLOCK (KDB) ADDRESS
|
||
PJRST DIAPRV ;NO, GIVE ERROR RETURN
|
||
CAIL P2,.DIELD ;THESE FUNCTIONS DON'T REQUIRE MAINTENANCE MODE
|
||
CAILE P2,.DIICM ;...
|
||
SKIPA ;NOT A SPECIAL FUNCTION
|
||
PJRST (P3) ;YES, DISPATCH NOW
|
||
MOVX T1,PBSMAI ;IN MAINTENANCE MODE?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
JRST DIAADM## ;NO, RETURN AN ERROR
|
||
PJRST (P3) ;DISPATCH BASED ON FUNCTION CODE
|
||
;(2) ASSIGN "CHANNEL" AND ALL UNITS
|
||
|
||
DIAAAU: ETHLOK ;INTERLOCK AGAINST SMP RACES
|
||
LDB T1,PBPMJB ;GET JOB NUMBER OF CURRENT MAINTENANCE JOB
|
||
JUMPE T1,DIAAA1 ;JUMP IF NOT CURRENTLY OWNED
|
||
ETHULK ;RELEASE SMP INTERLOCK
|
||
JRST DIAAAJ## ;RETURN ERROR
|
||
|
||
DIAAA1: MOVE T1,.CPJOB## ;GET OUR JOB NUMBER
|
||
DPB T1,PBPMJB ;SET UP OUR JOB AS MAINTENANCE JOB
|
||
ETHULK ;RELEASE SMP INTERLOCK
|
||
JRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;(3) RELEASE "CHANNEL" AND ALL UNITS
|
||
|
||
DIARAU: LDB T1,PBPMJB ;GET MAINTENANCE JOB NUMBER
|
||
CAME T1,J ;SAME AS CALLER'S JOB?
|
||
JRST DIAAAJ## ;NO, RETURN ERROR
|
||
SETZ T1, ;CLEAR MAINTENANCE JOB NUMBER
|
||
DPB T1,PBPMJB ;...
|
||
JRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;(4) SPECIFY CHANNEL PROGRAM
|
||
|
||
DIASCP: LDB T1,PBPMJB ;GET MAINTENANCE JOB NUMBER
|
||
CAME T1,J ;SAME AS CALLER'S JOB?
|
||
JRST DIAAAJ## ;NO, RETURN ERROR
|
||
MOVE P3,.PBCDB(Q3) ;GET CHANNEL DATA BLOCK ADDRESS
|
||
PUSHJ P,DIARCP ;RETURN ANY IOWD
|
||
S0PSHJ GETWD1## ;GET IOWD
|
||
HLRE T2,T1 ;LENGTH OF IOWD
|
||
JUMPE T2,DIAACP## ;TOO BIG IF 0
|
||
MOVEM T1,CHNICW(P3) ;UNRELOCATED IOWD
|
||
MOVEI T1,1(T1) ;START ADDRESS
|
||
MOVNS T2 ;+LENGTH
|
||
ADDI T2,-1(T1) ;TOP ADDRESS
|
||
S0PSHJ ZRNGE## ;MAKE SURE THE PAGES ARE OK
|
||
JRST [SETZM CHNICW(P3) ;PAGE NOT THERE
|
||
JRST DIAACP##] ;BOMB HIM OUT
|
||
SETZB P1,P4 ;SAY FIRST CALL, NOT A DX10
|
||
MOVE T2,CHNICW(P3) ;GET IOWD
|
||
S0PSHJ MAPIO## ;RELOCATE THE IOWD
|
||
JRST [SETZM CHNICW(P3)
|
||
JRST DIAAFC##] ;NO LOW-CORE BLOCKS
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
MOVSI T1,(CC.HLT) ;LIGHT HALT BIT IN LAST CCW
|
||
IORM T1,-1(P1) ;...
|
||
SETZM (P1) ;TERMINATE LIST
|
||
MOVEM P2,CHNICW(P3) ;STORE ADDRESS OF CHANNEL PROGRAM
|
||
TLO P2,(FLD(.CCJMP,CC.OPC)) ;MAKE ICW BE A JUMP
|
||
LDB T1,[POINT 3,KDBCNO(Q3),9] ;GET RH20 NUMBER
|
||
LSH T1,2 ;COMPUTE EPT OFFSET TO CHANNEL LOGOUT AREA
|
||
ADD T1,.CPEPT## ;PLUS ADDRESS OF EPT
|
||
MOVEM P2,.CSICW(T1) ;POINT ICWA AT CORE-BLOCK
|
||
SETZM .CSCLP(T1) ;CLEAR OTHER WORDS
|
||
SETZM .CSDBA(T1) ;...
|
||
PUSHJ P,STOTAC## ;TELL USER ICWA
|
||
JRST CPOPJ1## ;AND TAKE GOOD RETURN
|
||
|
||
|
||
;(5) RELEASE CHANNEL PROGRAM
|
||
|
||
DIARCP: LDB T1,PBPMJB ;GET MAINTENANCE JOB NUMBER
|
||
CAME T1,J ;SAME AS CALLER'S JOB?
|
||
JRST DIAAAJ## ;NO, RETURN ERROR
|
||
MOVE P3,.PBCDB(Q3) ;GET CHANNEL DATA BLOCK ADDRESS
|
||
SKIPN T1,CHNICW(P3) ;NOTHING TO DO IF NO IOWD
|
||
POPJ P,
|
||
SETZM CHNICW(P3) ;FORGET WE HAD IT
|
||
S0JRST RTNIOW## ;RETURN THE SPACE AND RETURN
|
||
|
||
|
||
;(6) GET CHANNEL STATUS
|
||
|
||
DIACST: LDB T1,PBPMJB ;GET MAINTENANCE JOB NUMBER
|
||
CAME T1,J ;SAME AS CALLER'S JOB?
|
||
JRST DIAAAJ## ;NO, RETURN ERROR
|
||
LDB P2,[POINT 3,KDBCNO(Q3),9] ;GET RH20 NUMBER
|
||
LSH P2,2 ;COMPUTE EPT OFFSET TO CHANNEL LOGOUT AREA
|
||
ADDI P2,.CSICW ;PLUS OFFSET TO ICWA WORD
|
||
ADD P2,.CPEPT## ;PLUS ADDRESS OF EPT
|
||
PJRST DIAGCS## ;FINISH UP IN UUOCON
|
||
;(17) ENABLE MICROCODE RELOAD
|
||
|
||
DIAELD: SETZ T1, ;CLEAR AUTO-RELOAD DISABLED FLAG
|
||
DPB T1,PBPARD ;...
|
||
MOVX T1,PBSRUN ;IS KLNI CURRENTLY RUNNING?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
PUSHJ P,RLDKNI ;NO, INITIATE RELOAD OF KLNI
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;(20) DISABLE MICROCODE RELOAD
|
||
|
||
DIADLD: MOVEI T1,1 ;SET AUTO-RELOAD DISABLED FLAG
|
||
DPB T1,PBPARD ;...
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;(21) RELOAD MICROCODE
|
||
|
||
DIALOD: MOVX T1,PBSMAI ;IS KLNI IN MAINTENANCE MODE?
|
||
TDNE T1,.PBSTS(Q3) ;...
|
||
PJRST DIAILF ;YES, RETURN AN ERROR
|
||
PUSHJ P,SHTKNI ;SHUT DOWN KLNI
|
||
PUSHJ P,LODKNI ;INITIATE RELOAD OF KLNI
|
||
MOVEI T2,10 ;WAIT AT MOST TEN SECONDS FOR RELOAD
|
||
DIALO1: MOVX T1,PBSONL ;IS KLNI ONLINE?
|
||
TDNE T1,.PBSTS(Q3) ;...
|
||
PJRST CPOPJ1## ;YES, RETURN
|
||
SOJL T2,DIAARF## ;ERROR IF KLNI DIDN'T RELOAD IN TIME
|
||
MOVEI T1,1 ;SLEEP FOR A SECOND
|
||
PUSHJ P,SLEEPF## ;...
|
||
JRST DIALO1 ;AND LOOP BACK TO CHECK AGAIN
|
||
;(22) SET MAINTENANCE MODE
|
||
|
||
DIAISM: MOVX T1,PBSMAI ;MAINTENANCE MODE ALREADY SET?
|
||
TDNE T1,.PBSTS(Q3) ;...
|
||
PJRST CPOPJ1## ;YES, RETURN NOW
|
||
IORM T1,.PBSTS(Q3) ;SET MAINTENANCE MODE
|
||
PUSHJ P,SHTKNI ;SHUT DOWN KLNI
|
||
SETZM @.PBBIT(Q3) ;ZAP BITS TO TEST FOR ON INTERRUPT
|
||
MOVE T1,.CPBIT## ;GET OUR CPU'S BIT
|
||
IORM T1,IPAMSK## ;DON'T LET THIS CHANNEL START IF SUSPENDED
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;(23) CLEAR MAINTENANCE MODE
|
||
|
||
DIAICM: MOVX T1,PBSMAI ;MAINTENANCE MODE ALREADY CLEAR?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
PJRST CPOPJ1## ;YES, RETURN NOW
|
||
ANDCAM T1,.PBSTS(Q3) ;CLEAR MAINTENANCE MODE
|
||
SETZ T1, ;CLEAR MAINTENANCE JOB NUMBER
|
||
DPB T1,PBPMJB ;...
|
||
MOVEI T1,CO.CPT ;MAKE SURE KLNI IS STOPPED
|
||
XCT KDBCNO(Q3) ;...
|
||
MOVE T1,[KNIBTS] ;BITS TO TEST FOR ON INTERRUPT
|
||
MOVEM T1,@.PBBIT(Q3) ;STORE IN CONSO SKIP CHAIN CODE
|
||
MOVE T1,.CPBIT## ;GET OUR CPU'S BIT
|
||
ANDCAM T1,IPAMSK## ;LET THIS CHANNEL START IF SUSPENDED
|
||
PUSHJ P,RLDKNI ;INITIATE AUTO-RELOAD OF KLNI
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- KNIBT. UUO
|
||
|
||
IFE FTKNILDR,<
|
||
UKNIBT:: POPJ P, ;NO KNIBT. UUO
|
||
>;END IFE FTKNILDR
|
||
IFN FTKNILDR,<
|
||
|
||
;UUO FOR BOOTING/DUMPING A KLNI
|
||
;LINKAGE:
|
||
; XMOVEI AC,ADDR
|
||
; KNIBT. AC,
|
||
; ERROR RETURN, CODE IN AC
|
||
; NORMAL RETURN
|
||
;
|
||
;ADDR: FUNCTION CODE,,LENGTH
|
||
; ARGUMENTS
|
||
|
||
ERCODX KBTPRV,KBPRV% ;INSUFFICIENT PRIVILEGES
|
||
ERCODX KBTADC,KBADC% ;ADDRESS CHECK
|
||
ERCODX KBTIAL,KBIAL% ;INVALID ARGUMENT LIST LENGTH
|
||
ERCODX KBTILF,KBILF% ;ILLEGAL FUNCTION
|
||
ERCODX KBTICS,KBICS% ;ILLEGAL CPU SPECIFICATION
|
||
ERCODX KBTCNA,KBCNA% ;CPU IS NOT AVAILABLE
|
||
ERCODX KBTKDE,KBKDE% ;KLNI DOESN'T EXIST
|
||
ERCODX KBTKMM,KBKMM% ;KLNI IS IN MAINTENANCE MODE
|
||
ERCODX KBTDNS,KBDNS% ;KLNI DID NOT START
|
||
ERCODX KBTDNI,KBDNI% ;KLNI DID NOT INITIALIZE
|
||
ERCODX KBTICA,KBICA% ;INVALID CRAM ADDRESS
|
||
ERCODX KBTCRE,KBCRE% ;CRAM READ ERROR
|
||
ERCODX KBTCWE,KBCWE% ;CRAM WRITE ERROR
|
||
ERCODX KBTNRJ,KBNRJ% ;NOT THE RELOAD JOB
|
||
|
||
UKNIBT::PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
PUSHJ P,SAVQ## ;AND Q1-Q3
|
||
PUSHJ P,SSPCS## ;SAVE CURRENT PCS
|
||
PUSHJ P,SXPCS## ;SET UP PCS FOR USER ARGUMENT
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
MOVE M,T1 ;SET UP FOR GETEWD
|
||
MOVSI T1,JP.POK ;JOB HAVE SUFFICIENT PRIVILEGES?
|
||
PUSHJ P,PRVBIT## ;...
|
||
SKIPA ;YES, CONTINUE
|
||
PJRST KBTPRV ;NO, GIVE ERROR RETURN
|
||
PUSHJ P,GETEWD## ;GET FUNCTION CODE AND LENGTH
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
HRRE P1,T1 ;SAVE LENGTH OF ARGUMENT BLOCK
|
||
HLRE P2,T1 ;ISOLATE FUNCTION CODE
|
||
SOJL P1,KBTIAL ;VALIDITY CHECK ARGUMENT BLOCK LENGTH
|
||
SKIPLE P2 ;RANGE CHECK FUNCTION CODE
|
||
CAILE P2,KBTMAX ;...
|
||
PJRST KBTILF ;ILLEGAL FUNCTION CODE
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
SOJL P1,KBTIAL ;VALIDITY CHECK ARGUMENT BLOCK LENGTH
|
||
PUSHJ P,GETEW1## ;YES, GET CPU NUMBER OF KLNI
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
MOVE P3,T1 ;SAVE IN P3
|
||
HLRE T1,P3 ;GET CPU NUMBER
|
||
PJUMPL T1,KBTICS ;RANGE CHECK CPU NUMBER
|
||
CAIL T1,M.CPU## ;...
|
||
PJRST KBTICS ;ILLEGAL CPU SPECIFICATION
|
||
IFN FTMP,<
|
||
PUSHJ P,ONCPUS## ;SET TO RUN ON THAT CPU
|
||
PJRST KBTCNA ;KLNI CPU IS NOT AVAILABLE
|
||
> ;END IFN FTMP
|
||
SKIPN Q3,.CPNPB## ;GET ADDRESS OF PORT CONTROL BLOCK
|
||
PJRST KBTKDE ;KLNI DOESN'T EXIST
|
||
LDB T1,[POINT 3,KDBCNO(Q3),9] ;GET RH20 NUMBER
|
||
HRL T1,.CPCPN## ;MAKE IT CPU#,,RH20#
|
||
CAME T1,P3 ;MATCH?
|
||
PJRST KBTKDE ;NO, KLNI DOESN'T EXIST
|
||
MOVX T1,DF.IMM ;IS FUNCTION ILLEGAL IN MAINTENANCE MODE?
|
||
TDNN T1,KBTDSF(P2) ;...
|
||
JRST KNIBT1 ;NO, CONTINUE
|
||
MOVX T1,PBSMAI ;IS KLNI IN MAINTENANCE MODE?
|
||
TDNE T1,.PBSTS(Q3) ;...
|
||
PJRST KBTKMM ;YES, KLNI IS IN MAINTENANCE MODE
|
||
KNIBT1: MOVX T1,DF.RJB ;NEED TO CHECK JOB NUMBER?
|
||
TDNN T1,KBTDSF(P2) ;...
|
||
JRST KNIBT2 ;NO, JUST DISPATCH
|
||
LDB T1,PBPRJB ;GET JOB NUMBER OF KNILDR
|
||
CAME T1,.CPJOB## ;IS THIS JOB THE CORRECT JOB?
|
||
PJUMPN T1,KBTNRJ ;NO, ERROR IF RELOAD JOB IS SET
|
||
KNIBT2: MOVE T1,KBTDSP(P2) ;GET ADDRESS OF FUNCTION SPECIFIC ROUTINE
|
||
PJRST (T1) ;DISPATCH TO FUNCTION SPECIFIC ROUTINE
|
||
;KNIBT. UUO DISPATCH TABLE
|
||
|
||
DEFINE FNC,<
|
||
|
||
DISP 0, 0, KBTILF ;;(0) ILLEGAL, PLACE HOLDER
|
||
DISP 0, .KBSTS, KBTSTS ;;(1) GET KLNI STATUS
|
||
DISP DF.IMM, .KBSRJ, KBTSRJ ;;(2) SET RELOAD JOB
|
||
DISP DF.IMM!DF.RJB, .KBSTP, KBTSTP ;;(3) STOP KLNI
|
||
DISP DF.IMM!DF.RJB, .KBSTA, KBTSTA ;;(4) START KLNI
|
||
DISP DF.IMM!DF.RJB, .KBRED, KBTRED ;;(5) READ CRAM LOCATION
|
||
DISP DF.IMM!DF.RJB, .KBWRT, KBTWRT ;;(6) WRITE CRAM LOCATION
|
||
|
||
>; END DEFINE FNC
|
||
|
||
;GENERATE FUNCTION FLAGS TABLE
|
||
|
||
DF.IMM==400000,,000000 ;FUNCTION ILLEGAL IN MAINTENANCE MODE
|
||
DF.RJB==200000,,000000 ;REQUIRE JOB TO BE THE RELOAD JOB
|
||
|
||
DEFINE DISP(FLAG,CODE,ADDR),<
|
||
EXP FLAG ;(CODE) ADDR
|
||
>; END DEFINE DISP
|
||
|
||
KBTDSF: FNC ;GENERATE FUNCTION FLAGS TABLE
|
||
;GENERATE FUNCTION DISPATCH TABLE
|
||
|
||
DEFINE DISP(FLAG,CODE,ADDR),<
|
||
IF1,<IFN <CODE-<.-KBTDSP>>,<PRINTX ?Table KBTDSP entry CODE is out of order>>
|
||
IFIW ADDR ;(CODE) ADDR
|
||
>; END DEFINE DISP
|
||
|
||
KBTDSP: FNC ;GENERATE FUNCTION DISPATCH TABLE
|
||
KBTMAX==.-KBTDSP-1 ;MAXIMUM KNIBT. UUO FUNCTION CODE
|
||
;KNIBT. UUO FUNCTION .KBSTS (RETURN KLNI STATUS)
|
||
|
||
KBTSTS: SETZ T1, ;START WITH ZERO
|
||
MOVE T2,.PBSTS(Q3) ;GET CURRENT KLNI STATUS
|
||
TXNE T2,PBSRUN ;IS KLNI RUNNING?
|
||
TXOA T1,KS.RUN ;YES, MARK AS RUNNING
|
||
TXO T1,KS.RLD ;NO, MARK AS NEEDING TO BE RELOADED
|
||
TXNE T2,PBSRLD ;RELOAD REQUESTED?
|
||
TXO T1,KS.RRQ ;YES, MARK RELOAD REQUESTED BY SYSTEM
|
||
TXNE T2,PBSDMP ;DUMP REQUESTED?
|
||
TXO T1,KS.DRQ ;YES, MARK DUMP REQUESTED BY SYSTEM
|
||
TXNE T2,PBSMAI ;IS KLNI IN MAINTENANCE MODE?
|
||
TXO T1,KS.MAI ;YES, MARK IN RETURNED STATUS
|
||
TXNE T2,PBSARD ;IS AUTO-RELOAD DISABLED?
|
||
TXO T1,KS.ARD ;YES, MARK IN RETURNED STATUS
|
||
TXNE T2,PBSADD ;IS AUTO-DUMP DISABLED?
|
||
TXO T1,KS.ADD ;YES, MARK IN RETURNED STATUS
|
||
LDB T2,PBPRJB ;GET JOB NUMBER OF KNILDR
|
||
DPB T2,[POINTR (T1,KS.RJB)] ;STORE IN RETURN AC
|
||
MOVS M,.USMUO ;RESTORE POINTER TO USER'S AC
|
||
PJRST STOTC1## ;STORE STATUS IN USER AC AND RETURN
|
||
|
||
|
||
;KNIBT. UUO FUNCTION .KBSRJ (SET RELOAD JOB)
|
||
|
||
KBTSRJ: ETHLOK ;INTERLOCK AGAINST SMP RACES
|
||
LDB T1,PBPRJB ;GET JOB NUMBER OF KNILDR
|
||
SKIPE T1 ;JOB NUMBER OF KNILDR ALREADY SET?
|
||
CAMN T1,.CPJOB## ;YES, SAME AS THIS JOB'S JOB NUMBER?
|
||
SKIPA ;YES, CONTINUE
|
||
PJRST [ETHULK ;NO, RELEASE SMP INTERLOCK
|
||
PJRST KBTNRJ] ;NOT THE RELOAD JOB
|
||
MOVE T1,.CPJOB## ;GET JOB NUMBER OF THIS JOB
|
||
DPB T1,PBPRJB ;SET THE JOB NUMBER OF KNILDR
|
||
ETHULK ;RELEASE SMP INTERLOCK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
;KNIBT. UUO FUNCTION .KBSTP (STOP KLNI)
|
||
|
||
KBTSTP: PUSHJ P,SHTKNI ;SHUT DOWN KLNI
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;KNIBT. UUO FUNCTION .KBSTA (START KLNI)
|
||
|
||
KBTSTA: SOJL P1,KBTIAL ;VALIDITY CHECK ARGUMENT BLOCK LENGTH
|
||
PUSHJ P,GETEW1## ;GET KLNI START ADDRESS
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
SKIPL T1 ;VALID CRAM ADDRESS?
|
||
CAILE T1,MAXCRA ;...
|
||
PJRST KBTICA ;NO, INVALID CRAM ADDRESS
|
||
MOVEM T1,.PBKSA(Q3) ;SAVE KLNI START ADDRESS IN PCB
|
||
PUSHJ P,STAKNI ;START THE KLNI
|
||
PJRST KBTDNS ;KLNI DID NOT START
|
||
PUSHJ P,INIKNI ;BEGIN INITIALIZATION OF KLNI
|
||
PJRST KBTDNI ;ERROR, KLNI DID NOT INITIALIZE
|
||
MOVEI T1,5 ;WAIT AT MOST 5 SECONDS
|
||
PUSHJ P,SLEEPF## ;...
|
||
SETZ T1, ;CLEAR JOB NUMBER OF KNILDR
|
||
DPB T1,PBPRJB ;...
|
||
MOVX T1,PBSONL ;IS KLNI NOW ONLINE?
|
||
TDNN T1,.PBSTS(Q3) ;...
|
||
PJRST KBTDNI ;NO, KLNI DID NOT INITIALIZE
|
||
PJRST CPOPJ1## ;RETURN
|
||
;KNIBT. UUO FUNCTION .KBRED (READ CRAM LOCATION)
|
||
|
||
KBTRED: SUBI P1,3 ;CHECK FOR ARGUMENT LENGTH ERROR
|
||
PJUMPL P1,KBTIAL ;...
|
||
PUSHJ P,GETEW1## ;GET CRAM LOCATION
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
SKIPL T1 ;VALID CRAM ADDRESS?
|
||
CAILE T1,MAXCRA ;...
|
||
PJRST KBTICA ;NO, INVALID CRAM ADDRESS
|
||
PUSH P,W ;SAVE AC
|
||
MOVE W,Q3 ;PUT KDB (PCB) ADDRESS IN PROPER PLACE
|
||
PUSHJ P,RDIPA## ;READ KLNI CRAM LOCATION
|
||
JRST [POP P,W ;RESTORE AC
|
||
PJRST KBTCRE] ;CRAM READ ERROR
|
||
POP P,W ;RESTORE AC
|
||
MOVE P1,T3 ;SAVE LOW-ORDER CRAM CONTENTS
|
||
MOVE T1,T2 ;GET HIGH ORDER CRAM CONTENTS
|
||
PUSHJ P,PUTEW1## ;STORE INTO ARGUMENT BLOCK
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
MOVE T1,P1 ;GET LOW-ORDER CRAM CONTENTS
|
||
PUSHJ P,PUTEW1## ;STORE INTO ARGUMENT BLOCK
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
|
||
;KNIBT. UUO FUNCTION .KBWRT (WRITE CRAM LOCATION)
|
||
|
||
KBTWRT: SUBI P1,3 ;CHECK FOR ARGUMENT LENGTH ERROR
|
||
PJUMPL P1,KBTIAL ;...
|
||
PUSHJ P,GETEW1## ;GET CRAM ADDRESS
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
SKIPL T1 ;VALID CRAM ADDRESS?
|
||
CAILE T1,MAXCRA ;...
|
||
PJRST KBTICA ;NO, INVALID CRAM ADDRESS
|
||
MOVE P2,T1 ;SAVE FOR LATER
|
||
PUSHJ P,GETEW1## ;GET HI-ORDER CRAM CONTENTS
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
MOVE P1,T1 ;SAVE FOR LATER
|
||
PUSHJ P,GETEW1## ;GET LOW-ORDER CRAM CONTENTS
|
||
PJRST KBTADC ;ADDRESS CHECK
|
||
EXCH T1,P2 ;SAVE LOW-ORDER CONTENTS, GET CRAM ADDRESS
|
||
DMOVE T2,P1 ;GET CRAM CONTENTS
|
||
PUSH P,W ;SAVE W
|
||
MOVE W,Q3 ;PUT KDB (PCB) ADDRESS IN PROPER PLACE
|
||
PUSHJ P,WTIPA## ;WRITE CRAM LOCATION
|
||
JRST [POP P,W ;RESTORE W
|
||
PJRST KBTCWE] ;CRAM WRITE ERROR
|
||
POP P,W ;RESTORE W
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
>;END IFN FTKNILDR
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- SHUT DOWN KLNI MICROCODE
|
||
|
||
|
||
;ROUTINE CALLED TO CLEANLY SHUT DOWN THE KLNI
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,SHTKNI
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
SHTKNI: MOVX T1,PBSRUN ;IS KLNI CURRENTLY RUNNING?
|
||
TDNE T1,.PBSTS(Q3) ;...
|
||
PUSHJ P,DISKNI ;YES, MAKE KLNI ENTER DISABLED STATE
|
||
JFCL ;DON'T CARE IF ERROR
|
||
PJRST STPKNI ;STOP KLNI MICROCODE AND RETURN
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- STOP KLNI MICROCODE
|
||
|
||
|
||
;ROUTINE CALLED TO STOP THE KLNI
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,STPKNI
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
STPKNI: MOVEI T1,CO.CPT ;MAKE SURE THE KLNI IS STOPPED
|
||
XCT KDBCNO(Q3) ;...
|
||
STPKNX: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
MOVX T1,PBSRUN!PBSONL ;CLEAR KLNI RUN AND ONLINE FLAGS
|
||
ANDCAM T1,.PBSTS(Q3) ;...
|
||
AOS .PBKHC(Q3) ;UPDATE COUNT OF TIMES KLNI HALTED
|
||
MOVE T1,SYSUPT## ;GET SYSTEM UPTIME
|
||
MOVEM T1,.PBKHT(Q3) ;REMEMBER WHEN KLNI LAST HALTED
|
||
XMOVEI T1,.PBRSQ(Q3) ;GET ADDRESS OF RESPONSE QUEUE
|
||
PUSHJ P,FIXQUE ;FIX IT UP IF NEEDED
|
||
PUSHJ P,KNIRQA ;PROCESS THE RESPONSE QUEUE
|
||
XMOVEI T1,.PBCMQ(Q3) ;GET ADDRESS OF COMMAND QUEUE
|
||
PUSHJ P,FIXQUE ;FIX IT UP AS NEEDED
|
||
XMOVEI T1,.PBCMQ(Q3) ;GET ADDRESS OF COMMAND QUEUE
|
||
PUSHJ P,STPKNQ ;EMPTY THE QUEUE
|
||
PUSH P,Q2 ;SAVE Q2
|
||
MOVE P1,.PBLPT(Q3) ;GET LENGTH OF PTT TABLE
|
||
MOVE P2,.PBVPT(Q3) ;AND ADDRESS OF PTT TABLE
|
||
STPKN1: JUMPE P1,STPKN3 ;EXIT LOOP IF NO MORE ENTRIES
|
||
LDB T1,PTPENA ;GET PROTOCOL ENABLED BIT
|
||
JUMPE T1,STPKN2 ;IF NOT ENABLED, SKIP PROTOCOL FREE QUEUE
|
||
MOVE Q2,.PTPUB(P2) ;GET ADDRESS OF PROTOCOL USER BLOCK
|
||
XMOVEI T1,.PUFQH(Q2) ;GET ADDRESS OF PROTOCOL'S FREE QUEUE
|
||
PUSHJ P,FIXQUE ;FIX IT UP AS NEEDED
|
||
XMOVEI T1,.PUFQH(Q2) ;GET ADDRESS OF PROTOCOL'S FREE QUEUE
|
||
PUSHJ P,STPKNQ ;EMPTY THE QUEUE
|
||
STPKN2: ADDI P2,.PTLEN ;BUMP PTT TABLE POINTER TO NEXT ENTRY
|
||
SOJA P1,STPKN1 ;LOOP BACK TO PROCESS ENTIRE PTT TABLE
|
||
STPKN3: POP P,Q2 ;RESTORE Q2
|
||
MOVE T1,.PBEKB(Q3) ;GET ADDRESS OF KONTROLLER BLOCK
|
||
PJRST ETKOFL## ;INFORM ETHSER OF KONTROLLER OFFLINE AND RETURN
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- PROCESS KLNI QUEUE
|
||
|
||
|
||
;ROUTINE CALLED WHEN KLNI STOPPED TO PROCESS A KLNI QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; PUSHJ P,STPKNQ
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
STPKNQ: PUSHJ P,SAVE2## ;SAVE P1-P2
|
||
PUSHJ P,SAVQ## ;AND Q1-Q3
|
||
MOVE P2,T1 ;SAVE ADDRESS OF QUEUE HEADER
|
||
STPKQ1: MOVE T1,P2 ;GET ADDRESS OF QUEUE HEADER
|
||
PUSHJ P,REMQUE ;REMOVE NEXT ENTRY FROM QUEUE
|
||
POPJ P, ;QUEUE EMPTY, RETURN
|
||
XMOVEI Q1,-.CMQUE(T2) ;GET ADDRESS OF KLNI COMMAND BUFFER
|
||
LDB T1,CMPSTS ;GET COMMAND STATUS BYTE
|
||
IORX T1,CMSERR ;SET COMMAND ERROR FLAG
|
||
DPB T1,CMPSTS ;STORE BACK INTO COMMAND
|
||
MOVE T1,.CMCBA(Q1) ;GET CALLBACK ROUTINE ADDRESS
|
||
MOVE Q2,.CMPUB(Q1) ;GET ADDRESS OF PROTOCOL USER BLOCK
|
||
MOVE P1,.CMEAB(Q1) ;AND ADDRESS OF EA BLOCK
|
||
PUSHJ P,(T1) ;CALL CALLBACK ROUTINE
|
||
JFCL ;...
|
||
JRST STPKQ1 ;LOOP BACK TO EMPTY QUEUE
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- START KLNI MICROCODE
|
||
|
||
|
||
;ROUTINE CALLED TO START THE KLNI MICROCODE
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,STAKNI
|
||
;RETURNS:
|
||
; CPOPJ IF COULDN'T START KLNI
|
||
; CPOPJ1 IF KLNI STARTED
|
||
|
||
STAKNI: AOS .PBKSC(Q3) ;UPDATE COUNT OF TIMES KLNI STARTED
|
||
MOVE T1,SYSUPT## ;GET SYSTEM UPTIME
|
||
MOVEM T1,.PBKST(Q3) ;REMEMBER WHEN KLNI LAST STARTED
|
||
MOVX T1,PBSDMP!PBSRLD ;CLEAR DUMP AND RELOAD REQUEST FLAGS
|
||
ANDCAM T1,.PBSTS(Q3) ;...
|
||
MOVEI T1,CO.CPT ;RESET KLNI
|
||
XCT KDBCNO(Q3) ;...
|
||
MOVE T2,.PBLGO(Q3) ;GET ADDRESS OF RH20 LOGOUT AREA
|
||
MOVE T1,.PBPBA(Q3) ;GET PHYSICAL ADDRESS OF PCB
|
||
ADD T1,[FLD(.CCFTH,CC.OPC)!FLD(3,CC.WDC)!FLD(<.PBPBA-.PBPCB>,CC.ADR)]
|
||
; SET INITIAL CCW TO TRANSFER .PBPBA, .PBPIA,
|
||
; AND .PBRP0 TO THE KLNI
|
||
MOVEM T1,.CSICW(T2) ;STORE IN THE CHANNEL LOGOUT AREA
|
||
MOVE T1,.PBKSA(Q3) ;GET KLNI START ADDRESS
|
||
IORX T1,.DOLRA ;LOAD RAM ADDRESS REGISTER
|
||
PUSH P,T2 ;SAVE T2
|
||
MOVE T2,T1 ;COPY
|
||
XCT KDBDTO(Q3) ;DATAO DEV,T2
|
||
POP P,T2 ;RESTORE T2
|
||
PUSHJ P,DISKNI ;START THE KLNI IN DISABLED STATE
|
||
PJRST STPKNI ;COULDN'T, STOP KLNI AND RETURN
|
||
MOVX T1,PBSRUN ;MARK KLNI AS RUNNING
|
||
IORM T1,.PBSTS(Q3) ;...
|
||
|
||
SKIPE T1,.PBVPT(Q3) ;PTT TABLE ALREADY ALLOCATED?
|
||
JRST STAKN1 ;YES, GO RECOMPUTE PHYSICAL ADDRESS
|
||
MOVEI T2,MAXPTT ;GET COUNT OF PTT ENTRIES SUPPORTED
|
||
MOVEM T2,.PBLPT(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
IMULI T2,.PTLEN ;CALCULATE LENGTH OF PTT TABLE
|
||
PUSHJ P,GETNWZ## ;ALLOCATE ZEROED CORE FOR TABLE
|
||
STOPCD STPKNI,DEBUG,KNICAP ;++CAN'T ALLOCATE PTT TABLE
|
||
MOVEM T1,.PBVPT(Q3) ;SAVE ADDRESS OF TABLE
|
||
STAKN1: MAP T1,(T1) ;CALCULATE PHYSICAL ADDRESS OF TABLE
|
||
TXZ T1,MP.NAD ;...
|
||
MOVEM T1,.PBPTT(Q3) ;AND SAVE FOR KLNI
|
||
|
||
;CONTINUED ON NEXT PAGE
|
||
;CONTINUED FROM PREVIOUS PAGE
|
||
|
||
SKIPE T1,.PBVMC(Q3) ;MCAT TABLE ALREADY ALLOCATED?
|
||
JRST STAKN2 ;YES, GO RECOMPUTE PHYSICAL ADDRESS
|
||
MOVEI T2,MAXMCT ;GET COUNT OF MCAT ENTRIES SUPPORTED
|
||
MOVEM T2,.PBLMC(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
IMULI T2,.MCLEN ;CALCULATE LENGTH OF MCAT TABLE
|
||
PUSHJ P,GETNWZ## ;ALLOCATE ZEROED CORE FOR TABLE
|
||
STOPCD STPKNI,DEBUG,KNICAM ;++CAN'T ALLOCATE MCAT TABLE
|
||
MOVEM T1,.PBVMC(Q3) ;SAVE ADDRESS OF TABLE
|
||
STAKN2: MAP T1,(T1) ;CALCULATE PHYSICAL ADDRESS OF TABLE
|
||
TXZ T1,MP.NAD ;...
|
||
MOVEM T1,.PBMCT(Q3) ;AND SAVE FOR KLNI
|
||
|
||
SKIPE T1,.PBVCD(Q3) ;COUNTERS BUFFER ALREADY ALLOCATED?
|
||
JRST STAKN3 ;YES, GO RECOMPUTE PHYSICAL ADDRESS
|
||
MOVEI T2,MAXKCB ;GET NUMBER OF COUNTERS SUPPORTED
|
||
MOVEM T2,.PBLCD(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
PUSHJ P,GETNWZ## ;ALLOCATE ZEROED CORE FOR TABLE
|
||
STOPCD STPKNI,DEBUG,KNICAD ;++CAN'T ALLOCATE COUNTERS DATA BUFFER
|
||
MOVEM T1,.PBVCD(Q3) ;SAVE ADDRESS OF TABLE
|
||
STAKN3: MAP T1,(T1) ;CALCULATE PHYSICAL ADDRESS OF TABLE
|
||
TXZ T1,MP.NAD ;...
|
||
MOVEM T1,.PBKCB(Q3) ;AND SAVE FOR KLNI
|
||
|
||
SKIPE T1,.PBVCT(Q3) ;KLNI COUNTERS AREA ALREADY ALLOCATED?
|
||
JRST STAKN4 ;YES, GO ENABLE KLNI AND RETURN
|
||
MOVE T2,.PBLCD(Q3) ;GET SIZE OF COUNTERS DATA BUFFER
|
||
PUSHJ P,GETNWZ## ;ALLOCATE ZEROED CORE FOR TABLE
|
||
STOPCD STPKNI,DEBUG,KNICAC ;++CAN'T ALLOCATE KLNI COUNTERS AREA
|
||
MOVEM T1,.PBVCT(Q3) ;SAVE ADDRESS OF TABLE
|
||
|
||
STAKN4: MOVE T2,.PBLGO(Q3) ;GET ADDRESS OF RH20 LOGOUT AREA
|
||
MOVE T1,.PBPBA(Q3) ;GET PHYSICAL ADDRESS OF PCB
|
||
ADD T1,[FLD(.CCJMP,CC.OPC)!FLD(<.PBCCW-.PBPCB>,CC.ADR)] ;GET A JUMP
|
||
; CCW FOR THE KLNI TO USE
|
||
MOVEM T1,.CSICW(T2) ;STORE IN THE CHANNEL LOGOUT AREA
|
||
PUSHJ P,ENAKNI ;PUT KLNI IN ENABLED STATE
|
||
PJRST STPKNI ;COULDN'T, STOP KLNI AND RETURN
|
||
PJRST CPOPJ1## ;SUCCESS, RETURN
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- DISABLE KLNI MICROCODE
|
||
|
||
|
||
;ROUTINE TO MAKE THE KLNI ENTER THE DISABLED STATE
|
||
;LINKAGE:
|
||
; PUSHJ P,DISKNI
|
||
;RETURNS:
|
||
; CPOPJ IF DIDN'T ENTER DISABLED STATE
|
||
; CPOPJ1 IF KLNI IN DISABLED STATE
|
||
|
||
DISKNI: MOVE T1,.PBPIA(Q3) ;GET KLNI PI ASSIGNMENT
|
||
TXO T1,CO.DIS!CO.BTS ;PLUS DISABLE STATE
|
||
XCT KDBCNO(Q3) ;TELL KLNI
|
||
MOVEI T2,5000 ;LOOP COUNT
|
||
DISKN1: XCT KDBCNI(Q3) ;CONI DEV,T1
|
||
TXNE T1,CI.DCP ;DISABLE COMPLETE?
|
||
AOSA (P) ;YES, SET FOR SKIP RETURN
|
||
SOJG T2,DISKN1 ;NO, WAIT A BIT
|
||
POPJ P, ;DIDN'T MAKE IT
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- ENABLE KLNI MICROCODE
|
||
|
||
|
||
;ROUTINE TO MAKE THE KLNI ENTER THE ENABLED STATE
|
||
;LINKAGE:
|
||
; PUSHJ P,ENAKNI
|
||
;RETURNS:
|
||
; CPOPJ IF DIDN'T ENTER ENABLED STATE
|
||
; CPOPJ1 IF KLNI ENABLED
|
||
|
||
ENAKNI: MOVE T1,.PBPIA(Q3) ;GET KLNI PI ASSIGNMENT
|
||
TXO T1,CO.ENA!CO.BTS ;PLUS ENABLED STATE
|
||
XCT KDBCNO(Q3) ;TELL KLNI
|
||
MOVEI T2,5000 ;LOOP COUNT
|
||
ENAKN1: XCT KDBCNI(Q3) ;CONI DEV,T1
|
||
TXNE T1,CI.ECP ;ENABLE COMPLETE?
|
||
AOSA (P) ;YES, SET FOR SKIP RETURN
|
||
SOJG T2,ENAKN1 ;NO, WAIT A BIT
|
||
POPJ P, ;DIDN'T MAKE IT
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- INITIALIZE KLNI MICROCODE
|
||
|
||
|
||
;ROUTINE CALLED TO INITIALIZE KLNI MICROCODE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF COMPLETION ROUTINE
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,INIKNI
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIKNI: PUSHJ P,SAVQ1## ;AND Q1
|
||
MOVEI T1,CMORSA ;READ NI STATION ADDRESS COMMAND FUNCTION
|
||
PUSHJ P,GETCMD ;GENERATE KLNI COMMAND BUFFER
|
||
PJRST INIKNX ;ERROR, GIVE COMPLETION NOW
|
||
XMOVEI T1,INIKN1 ;GET ADDRESS OF CALLBACK ROUTINE
|
||
PUSHJ P,KNICMD ;QUEUE READ NI STATION ADDRESS COMMAND
|
||
PJRST CPOPJ1## ;AND RETURN
|
||
|
||
INIKNX: PUSHJ P,SHTKNI ;SHUT DOWN KLNI
|
||
IFE FTKNILDR,<
|
||
POPJ P, ;RETURN
|
||
>;END IFE FTKNILDR
|
||
IFN FTKNILDR,<
|
||
LDB T1,PBPRJB ;GET JOB NUMBER OF KNILDR
|
||
PJUMPE T1,CPOPJ## ;RETURN NOW IF NO JOB NUMBER
|
||
PJRST WAKJOB## ;WAKE UP RELOAD JOB AND RETURN
|
||
>;END IFN FTKNILDR
|
||
;HERE ON COMPLETION OF READ NI STATION ADDRESS COMMAND FUNCTION
|
||
;DURING INITIALIZATION OF KLNI MICROCODE
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,INIKN1
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIKN1: PUSHJ P,SAVQ1## ;AND Q1
|
||
LDB T1,CMPUCV ;GET KLNI MICROCODE VERSION
|
||
CAIGE T1,MINUVR&377 ;WITHIN REASON?
|
||
STOPCD INIKNX,INFO,KNIWUV ;++WRONG MICROCODE VERSION
|
||
MOVEM T1,.PBUVR(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
DMOVE T1,.CMNEA(Q1) ;GET HARDWARE ETHERNET ADDRESS
|
||
DMOVEM T1,.PBHEA(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
SKIPN .PBEAD(Q3) ;DO WE HAVE ANY CURRENT ETHERNET ADDRESS?
|
||
DMOVEM T1,.PBEAD(Q3) ;NO, USE THE HARDWARE ETHERNET ADDRESS
|
||
LDB T1,CMPLPT ;GET SIZE OF PTT TABLE
|
||
CAME T1,.PBLPT(Q3) ;SAME SIZE AS CURRENT PTT TABLE?
|
||
STOPCD INIKNX,DEBUG,KNIPWS ;++KLNI PTT TABLE IS WRONG SIZE
|
||
LDB T1,CMPLMC ;GET SIZE OF MCAT TABLE
|
||
CAME T1,.PBLMC(Q3) ;SAME SIZE AS CURRENT MCAT TABLE?
|
||
STOPCD INIKNX,DEBUG,KNIMWS ;++KLNI MCAT TABLE IS WRONG SIZE
|
||
REPEAT 0,< ;NEED KLNI MICROCODE CHANGE FOR THIS
|
||
LDB T1,CMPLCB ;GET SIZE OF COUNTERS BUFFER
|
||
CAME T1,.PBLCD(Q3) ;SAME SIZE AS CURRENT BUFFER?
|
||
STOPCD INIKNX,DEBUG,KNICWS ;++KLNI COUNTERS BUFFER IS WRONG SIZE
|
||
>; END REPEAT 0
|
||
PUSHJ P,GIVCMD ;RELEASE PREVIOUS KLNI COMMAND
|
||
MOVEI T1,CMOWSA ;WRITE NI STATION ADDRESS COMMAND FUNCTION
|
||
PUSHJ P,GETCMD ;GENERATE KLNI COMMAND BUFFER
|
||
PJRST INIKNX ;ERROR, GIVE CALLBACK NOW
|
||
DMOVE T1,.PBEAD(Q3) ;GET CURRENT ETHERNET ADDRESS
|
||
DMOVEM T1,.CMNEA(Q1) ;SET IN KLNI COMMAND BUFFER
|
||
LDB T1,PBPPRM ;GET PROMISCUOUS RECEIVER FLAG
|
||
DPB T1,CMPPRM ;SET AS APPROPRIATE IN COMMAND
|
||
LDB T1,PBPPMM ;GET PROMISCUOUS MULTI-CAST FLAG
|
||
DPB T1,CMPAAM ;SET AS APPROPRIATE IN COMMAND
|
||
XMOVEI T1,INIKN2 ;GET ADDRESS OF CALLBACK ROUTINE
|
||
PJRST KNICMD ;QUEUE WRITE NI STATION ADDRESS AND RETURN
|
||
;HERE ON COMPLETION OF WRITE NI STATION ADDRESS COMMAND FUNCTION
|
||
;DURING INITIALIZATION OF KLNI MICROCODE
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,INIKN2
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIKN2: PUSHJ P,GIVCMD ;RELEASE COMMAND BUFFER
|
||
MOVEI T1,CMOLDP ;LOAD PTT TABLE COMMAND FUNCTION
|
||
PUSHJ P,GETCMD ;GENERATE KLNI COMMAND BUFFER
|
||
PJRST INIKNX ;ERROR, GIVE CALLBACK NOW
|
||
MOVE T1,.PBVPT(Q3) ;GET VIRTUAL ADDRESS OF PTT
|
||
MAP T1,0(T1) ;CALCULATE PHYSICAL ADDRESS OF PTT
|
||
TXZ T1,MP.NAD ;...
|
||
MOVEM T1,.PBPTT(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
XMOVEI T1,INIKN3 ;GET ADDRESS OF CALLBACK ROUTINE
|
||
PJRST KNICMD ;QUEUE LOAD PTT TABLE COMMAND AND RETURN
|
||
;HERE ON COMPLETION OF LOAD PTT TABLE COMMAND FUNCTION
|
||
;DURING INITIALIZATION OF KLNI MICROCODE
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,INIKN3
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIKN3: PUSHJ P,GIVCMD ;RELEASE COMMAND BUFFER
|
||
MOVEI T1,CMOLDM ;LOAD MCAT TABLE COMMAND FUNCTION
|
||
PUSHJ P,GETCMD ;GENERATE KLNI COMMAND BUFFER
|
||
PJRST INIKNX ;ERROR, GIVE CALLBACK NOW
|
||
MOVE T1,.PBVMC(Q3) ;GET VIRTUAL ADDRESS OF MCAT
|
||
MAP T1,0(T1) ;CALCULATE PHYSICAL ADDRESS OF MCAT
|
||
TXZ T1,MP.NAD ;...
|
||
MOVEM T1,.PBMCT(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
XMOVEI T1,INIKN4 ;GET ADDRESS OF CALLBACK ROUTINE
|
||
PJRST KNICMD ;QUEUE LOAD MCAT TABLE COMMAND AND RETURN
|
||
;HERE ON COMPLETION OF LOAD MCAT TABLE COMMAND FUNCTION
|
||
;DURING INITIALIZATION OF KLNI MICROCODE
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,INIKN4
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIKN4: PUSHJ P,GIVCMD ;RELEASE COMMAND BUFFER
|
||
MOVEI T1,CMORCC ;READ AND CLEAR COUNTERS COMMAND FUNCTION
|
||
PUSHJ P,GETCMD ;GENERATE KLNI COMMAND BUFFER
|
||
PJRST INIKNX ;ERROR, GIVE CALLBACK NOW
|
||
MOVE T1,.PBVCD(Q3) ;GET VIRTUAL ADDRESS OF COUNTERS BUFFER
|
||
MAP T1,0(T1) ;CALCULATE PHYSICAL ADDRESS OF BUFFER
|
||
TXZ T1,MP.NAD ;...
|
||
MOVEM T1,.PBKCB(Q3) ;SAVE IN PORT CONTROL BLOCK
|
||
LDB T1,CMPFLG ;GET CURRENT FLAGS
|
||
IORX T1,CMFCLR ;SET CLEAR COUNTERS FLAG
|
||
DPB T1,CMPFLG ;...
|
||
XMOVEI T1,INIKN5 ;GET ADDRESS OF CALLBACK ROUTINE
|
||
PJRST KNICMD ;QUEUE READ AND CLEAR COUNTERS AND RETURN
|
||
;HERE ON COMPLETION OF READ AND CLEAR COUNTERS COMMAND FUNCTION
|
||
;DURING INITIALIZATION OF KLNI MICROCODE
|
||
;LINKAGE: (CALLED AT INTERRUPT LEVEL)
|
||
; Q1/ ADDRESS OF KLNI COMMAND BUFFER
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,INIKN5
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIKN5: PUSHJ P,GIVCMD ;RELEASE COMMAND BUFFER
|
||
MOVE T1,.PBLCD(Q3) ;GET LENGTH OF COUNTERS BUFFER
|
||
SUBI T1,1 ;ADJUST FOR XBLT TO ZERO COUNTERS
|
||
MOVE T2,.PBVCD(Q3) ;GET ADDRESS OF COUNTERS BUFFER
|
||
XMOVEI T3,1(T2) ;AND ADDRESS+1 OF COUNTERS BUFFER
|
||
SETZM (T2) ;ZERO FIRST WORD OF BUFFER
|
||
EXTEND T1,[XBLT] ;ZERO REMAINDER OF COUNTERS BUFFER
|
||
MOVX T1,PBSONL ;MARK KLNI AS ONLINE
|
||
IORM T1,.PBSTS(Q3) ;...
|
||
IFN FTKNILDR,<
|
||
LDB T1,PBPRJB ;GET JOB NUMBER OF RELOAD JOB
|
||
SKIPE T1 ;JOB NUMBER SET?
|
||
PUSHJ P,WAKJOB## ;YES, WAKE IT UP
|
||
>;END IFN FTKNILDR
|
||
MOVE T1,.PBEKB(Q3) ;GET ADDRESS OF ETHSER'S KONTROLLER BLOCK
|
||
DMOVE T2,.PBHEA(Q3) ;GET HARDWARE ETHERNET ADDRESS
|
||
PJRST ETKONL## ;INFORM ETHSER OF KONTROLLER ONLINE AND RETURN
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- REQUEST MICROCODE DUMP/LOAD
|
||
|
||
|
||
;ROUTINE TO REQUEST THE DUMP/LOAD OF KLNI MICROCODE
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,RLDKNI
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
DMPKNI: SKIPA T1,[PBSDMP!PBSRLD] ;GET DUMP AND RELOAD REQUEST FLAGS
|
||
LODKNI: MOVX T1,PBSRLD ;GET RELOAD REQUEST FLAG
|
||
JRST RLDKN1 ;AND CONTINUE
|
||
RLDKND: SKIPA T1,[PBSDMP!PBSRLD] ;GET DUMP AND RELOAD REQUEST FLAGS
|
||
RLDKNI: MOVX T1,PBSRLD ;GET RELOAD REQUEST FLAG
|
||
MOVE T2,.PBSTS(Q3) ;GET KLNI STATUS WORD
|
||
TXNE T2,PBSMAI ;IS KLNI IN MAINTENANCE MODE?
|
||
POPJ P, ;YES, RETURN NOW
|
||
TXNE T2,PBSADD ;IS AUTO DUMP DISABLED?
|
||
TXZ T1,PBSDMP ;YES, CLEAR DUMP REQUEST FLAG
|
||
TXNE T2,PBSARD ;IS AUTO RELOAD DISABLED?
|
||
TXZ T1,PBSDMP!PBSRLD ;YES, CLEAR DUMP AND RELOAD REQUEST FLAGS
|
||
RLDKN1: IORM T1,.PBSTS(Q3) ;SET DUMP/RELOAD REQUEST FLAG(S)
|
||
TXNN T1,PBSRLD ;REALY WANT A RELOAD OR NOT NOW!?
|
||
POPJ P, ;NO - JUST FORGET IT.
|
||
AOS .PBKLC(Q3) ;UPDATE COUNT OF TIMES DUMP/RELOAD REQUESTED
|
||
XMOVEI T1,.PBULB(Q3) ;GET ADDRESS OF MICROCODE LOADER BLOCK
|
||
PUSHJ P,BTUCOD## ;LOCATE KLNI MICROCODE
|
||
JRST [XMOVEI T1,.PBULB(Q3) ;POINT TO MICROCODE LOADER BLOCK
|
||
PJRST BTURPT##] ;GO REPORT THE ERROR
|
||
PJRST KNILOD ;LOAD KLNI MICROCODE AND RETURN
|
||
SUBTTL KLNI MAINTENANCE SERVICE -- LOAD MICROCODE
|
||
|
||
|
||
;ROUTINE TO LOAD KLNI MICROCODE
|
||
;LINKAGE:
|
||
; Q3/ ADDRESS OF PORT CONTROL BLOCK
|
||
; PUSHJ P,KNILOD
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
KNILOD: MOVX T1,PBSQRR ;CLEAR QUEUED RELOAD REQUEST FLAG
|
||
ANDCAM T1,.PBSTS(Q3) ;...
|
||
LDB T2,PBPCPU ;GET CPU NUMBER OF KLNI
|
||
CAMN T2,.CPCPN## ;KLNI ON OUR CPU?
|
||
PJRST KNILO1 ;YES, GO SERVICE RELOAD REQUEST
|
||
IORM T1,.PBSTS(Q3) ;SET QUEUED RELOAD REQUEST FLAG
|
||
POPJ P, ;AND RETURN
|
||
|
||
KNILO1: PUSHJ P,SAVE1## ;SAVE P1
|
||
XMOVEI P1,.PBULB(Q3) ;POINT TO MICROCODE LOADER BLOCK
|
||
PUSHJ P,SHTKNI ;SHUTDOWN KLNI
|
||
PUSH P,W ;SAVE W
|
||
MOVE W,Q3 ;SET UP KDB FOR DMPIPA/LDIPA
|
||
MOVX T1,PBSDMP ;BIT TO TEST
|
||
TDNE T1,.PBSTS(Q3) ;WANT A DUMP?
|
||
PUSHJ P,DMPIPA## ;DUMP THE KLNI DRAM
|
||
JFCL ;FAILED, DON'T REALLY CARE
|
||
MOVE T1,.ULADR(P1) ;GET ADDRESS OF MICROCODE STORAGE
|
||
PUSHJ P,LDIPA## ;LOAD THE CRAM
|
||
JRST KNILO3 ;CHANNEL IS RUNNING
|
||
MOVX T1,UCODSA ;GET MICROCODE START ADDRESS
|
||
MOVEM T1,.PBKSA(Q3) ;SAVE IN KLNI PCB
|
||
PUSHJ P,STAKNI ;START THE MICROCODE
|
||
JRST KNILO3 ;ERROR STARTING MICROCODE
|
||
PUSHJ P,INIKNI ;BEGIN INITIALIZATION OF KLNI
|
||
JRST KNILO3 ;ERROR INITIALIZING KLNI
|
||
AOS -1(P) ;SKIP RETURN
|
||
JRST KNILO4 ;GO FINISH UP
|
||
|
||
KNILO3: MOVEI T1,.UEMPC ;MICROPROCESSOR CHECK
|
||
DPB T1,ULBEBP## ;STORE
|
||
|
||
KNILO4: POP P,W ;RESTORE W
|
||
MOVE T1,P1 ;COPY LOADER BLOCK ADDRESS
|
||
PJRST BTURPT## ;GO REPORT A SUCCESSFUL LOAD
|
||
SUBTTL QUEUE MANIPULATION -- INITIALIZE QUEUE HEADER
|
||
|
||
|
||
;ROUTINE TO INITIALIZE A QUEUE HEADER
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; PUSHJ P,INIQUE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
INIQUE: SETOM .QHIWD(T1) ;RESET QUEUE INTERLOCK WORD
|
||
MAP T2,.QHFLI(T1) ;GET PHYSICAL ADDRESS OF FLINK
|
||
TXZ T2,MP.NAD ;...
|
||
MOVEM T2,.QHFLI(T1) ;MAKE FLINK POINT TO ITSELF
|
||
MOVEM T2,.QHBLI(T1) ;AND BLINK POINT TO FLINK
|
||
SETZM .QHELN(T1) ;CLEAR QUEUE ENTRY LENGTH
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL QUEUE MANIPULATION -- FIX A QUEUE
|
||
|
||
|
||
;ROUTINE CALLED ON AN ERROR STOP TO FIX A QUEUE (IF POSSIBLE)
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; PUSHJ P,FIXQUE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
FIXQUE: POPJ P,
|
||
SUBTTL QUEUE MANIPULATION -- REMOVE AN ENTRY FROM QUEUE
|
||
|
||
|
||
;ROUTINE TO REMOVE FIRST QUEUE ENTRY FROM A QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; PUSHJ P,REMQUE
|
||
;RETURNS:
|
||
; CPOPJ IF QUEUE WAS EMPTY
|
||
; CPOPJ1 IF SUCCESS WITH:
|
||
; T2/ ADDRESS OF QUEUE ENTRY
|
||
|
||
REMQUE: SYSPIF ;NO INTERRUPTS
|
||
SETZ T3, ;INITIALIZE TIMEOUT COUNTER
|
||
REMQU1: SKIPGE .QHIWD(T1) ;SKIP IF INTERLOCK NOT AVAILABLE
|
||
AOSE .QHIWD(T1) ;AVAILABLE, TRY TO GET IT
|
||
AOSA T3 ;NOT AVAILABLE, INCREMENT COUNT AND SKIP
|
||
JRST REMQU2 ;GOT IT
|
||
CAIGE T3,TIMOUT ;WAITED LONG ENOUGH?
|
||
JRST REMQU1 ;NO, TRY AGAIN
|
||
AOS .PBCIB(Q3) ;INCREMENT COUNT OF BROKEN INTERLOCKS
|
||
STOPCD .+1,INFO,KNIRIT ;++REMQUE INTERLOCK TIMEOUT
|
||
|
||
REMQU2: MAP T3,.QHFLI(T1) ;GET PHYSICAL ADDRESS OF QUEUE HEADER
|
||
TXZ T3,MP.NAD ;...
|
||
CAMN T3,.QHFLI(T1) ;IS QUEUE EMPTY?
|
||
JRST REMQU3 ;YES, RETURN
|
||
MOVE T2,.QHFLI(T1) ;GET PHYSICAL ADDRESS OF FIRST QUEUE ENTRY
|
||
ADDI T2,.QEVAD ;GET VIRTUAL ADDRESS OF FIRST QUEUE ENTRY
|
||
PMOVE T2,T2 ;...
|
||
PUSH P,T2 ;SAVE ADDRESS OF QUEUE ENTRY
|
||
MOVE T2,.QEFLI(T2) ;GET ADDRESS OF NEXT QUEUE ENTRY
|
||
MOVEM T2,.QHFLI(T1) ;STORE AS NEW FIRST ENTRY IN QUEUE
|
||
ADDI T2,.QEBLI ;POINT NEW FIRST ENTRY BACK AT QUEUE HEADER
|
||
PMOVEM T3,T2 ;...
|
||
POP P,T2 ;GET BACK ADDRESS OF QUEUE ENTRY
|
||
AOS (P) ;SET FOR SKIP RETURN
|
||
|
||
REMQU3: SETOM .QHIWD(T1) ;RELEASE QUEUE INTERLOCK
|
||
SYSPIN ;ALLOW INTERRUPTS AGAIN
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL QUEUE MANIPULATION -- INSERT AN ENTRY INTO QUEUE
|
||
|
||
|
||
;ROUTINE TO INSERT A QUEUE ENTRY ONTO A QUEUE
|
||
;LINKAGE:
|
||
; T1/ ADDRESS OF QUEUE HEADER
|
||
; T2/ ADDRESS OF QUEUE ENTRY
|
||
; PUSHJ P,PUTQUE
|
||
;RETURNS:
|
||
; CPOPJ ALWAYS
|
||
|
||
PUTQUE: SYSPIF ;NO INTERRUPTS
|
||
SETZ T3, ;INITIALIZE TIMEOUT COUNTER
|
||
PUTQU1: SKIPGE .QHIWD(T1) ;SKIP IF INTERLOCK NOT AVAILABLE
|
||
AOSE .QHIWD(T1) ;AVAILABLE, TRY TO GET IT
|
||
AOSA T3 ;NOT AVAILABLE, INCREMENT COUNT AND SKIP
|
||
JRST PUTQU2 ;GOT IT
|
||
CAIGE T3,TIMOUT ;WAITED LONG ENOUGH?
|
||
JRST PUTQU1 ;NO, TRY AGAIN
|
||
AOS .PBCIB(Q3) ;INCREMENT COUNT OF BROKEN INTERLOCKS
|
||
STOPCD .+1,INFO,KNIPIT ;++PUTQUE INTERLOCK TIMEOUT
|
||
|
||
PUTQU2: MOVEM T2,.QEVAD(T2) ;SAVE VIRTUAL ADDRESS IN QUEUE ENTRY
|
||
MAP T3,.QEFLI(T2) ;GET PHYSICAL ADDRESS OF NEW QUEUE ENTRY
|
||
TXZ T3,MP.NAD ;...
|
||
PUSH P,T2 ;SAVE ADDRESS OF QUEUE ENTRY
|
||
MOVE T2,.QHBLI(T1) ;GET PHYSICAL ADDRESS OF LAST QUEUE ENTRY
|
||
ADDI T2,.QEFLI ;POINT IT AT NEW ENTRY
|
||
PMOVEM T3,T2 ;...
|
||
POP P,T2 ;GET BACK ADDRESS OF QUEUE ENTRY
|
||
EXCH T3,.QHBLI(T1) ;SET NEW LAST ENTRY ADDRESS, GET PREVIOUS
|
||
MOVEM T3,.QEBLI(T2) ;POINT LAST ENTRY BACK TO PREVIOUS ENTRY
|
||
MAP T3,.QHFLI(T1) ;GET PHYSICAL ADDRESS OF QUEUE HEADER
|
||
TXZ T3,MP.NAD ;...
|
||
MOVEM T3,.QEFLI(T2) ;POINT NEW LAST ENTRY AT QUEUE HEADER
|
||
|
||
PUTQU3: SETOM .QHIWD(T1) ;RELEASE QUEUE INTERLOCK
|
||
SYSPIN ;ALLOW INTERRUPTS AGAIN
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL BYTE POINTERS
|
||
|
||
|
||
;BYTE POINTERS FOR PORT CONTROL BLOCK
|
||
|
||
PBPCPU: POINTR (.PBSTS(Q3),PBSCPU) ;CPU NUMBER OF KLNI
|
||
PBPMAI: POINTR (.PBSTS(Q3),PBSMAI) ;KLNI IS IN MAINTENANCE MODE
|
||
PBPPRM: POINTR (.PBSTS(Q3),PBSPRM) ;KLNI IS IN PROMISCUOUS RECEIVER MODE
|
||
PBPPMM: POINTR (.PBSTS(Q3),PBSPMM) ;KLNI IS IN PROMISCUOUS MULTI-CAST MODE
|
||
PBPARD: POINTR (.PBSTS(Q3),PBSARD) ;KLNI AUTO-RELOAD DISABLED
|
||
PBPMJB: POINTR (.PBSTS(Q3),PBSMJB) ;JOB NUMBER OF MAINTENANCE JOB
|
||
PBPRJB: POINTR (.PBSTS(Q3),PBSRJB) ;JOB NUMBER OF KNILDR
|
||
|
||
|
||
;BYTE POINTERS FOR PROTOCOL USER BLOCK
|
||
|
||
PUPPAD: POINTR (.PUSTS(Q2),PUSPAD) ;PROTOCOL USES PADDING
|
||
PUPPTT: POINTR (.PUSTS(Q2),PUSPTT) ;PTT TABLE INDEX OF THIS PROTOCOL
|
||
|
||
|
||
;BYTE POINTERS FOR PTT AND MCAT TABLES
|
||
|
||
PTPENA: POINTR (.PTPTY(P2),PTTENA) ;PROTOCOL ENABLED FLAG
|
||
PTPPTY: POINTR (.PTPTY(P2),PTTPTY) ;PROTOCOL TYPE CODE
|
||
MCPENA: POINTR (.MCLAD(P2),MCTENA) ;MULTI-CAST ADDRESS ENABLED FLAG
|
||
|
||
|
||
;BYTE POINTERS FOR KLNI COMMAND BUFFERS
|
||
|
||
CMPSTS: POINTR (.CMCSW(Q1),CMCSTS) ;COMMAND STATUS
|
||
CMPFLG: POINTR (.CMCSW(Q1),CMCFLG) ;COMMAND FLAGS
|
||
CMPCMD: POINTR (.CMCSW(Q1),CMCCMD) ;COMMAND OPCODE
|
||
CMPTDR: POINTR (.CMCSW(Q1),CMCTDR) ;TIME DOMAIN REFLECTOMETRY VALUE
|
||
|
||
CMPXDL: POINTR (.CMXDL(Q1),CMXXDL) ;TRANSMIT DATAGRAM LENGTH
|
||
CMPXPT: POINTR (.CMXPT(Q1),CMXXPT) ;TRANSMIT DATAGRAM PROTOCOL TYPE
|
||
|
||
CMPRDL: POINTR (.CMRDL(Q1),CMRRDL) ;RECEIVE DATAGRAM LENGTH
|
||
CMPRPT: POINTR (.CMRPT(Q1),CMRRPT) ;RECEIVE DATAGRAM PROTOCOL TYPE
|
||
|
||
CMPACE: POINTR (.CMNSM(Q1),CMMACE) ;ACCEPT PACKETS WITH CRC ERRORS
|
||
CMPAAM: POINTR (.CMNSM(Q1),CMMAAM) ;ACCEPT ALL MULTI-CAST PACKETS
|
||
CMPH4K: POINTR (.CMNSM(Q1),CMMH4K) ;H400 MODE TRANSCEIVER
|
||
CMPPRM: POINTR (.CMNSM(Q1),CMMPRM) ;PROMISCUOUS MODE
|
||
|
||
CMPUCV: POINTR (.CMNSW(Q1),CMWUCV) ;KLNI MICROCODE VERSION
|
||
CMPLMC: POINTR (.CMNSW(Q1),CMWLMC) ;LENGTH OF MCAT TABLE
|
||
CMPLPT: POINTR (.CMNSW(Q1),CMWLPT) ;LENGTH OF PTT TABLE
|
||
CMPERC: POINTR (.CMNSW(Q1),CMWERC) ;ERROR RETRY COUNT
|
||
|
||
|
||
;BYTE POINTERS FOR BUFFER SEGMENT DESCRIPTORS
|
||
|
||
BSPSBA: POINTR (.BSSBA(P4),BSASBA) ;SEGMENT BASE ADDRESS
|
||
BSPNXT: POINTR (.BSNXT(P4),BSNNXT) ;ADDRESS OF NEXT BSD
|
||
BSPSGL: POINTR (.BSSGL(P4),BSSSGL) ;SEGMENT LENGTH
|
||
SUBTTL THE END
|
||
|
||
|
||
KNILIT:!XLIST ;LITERALS
|
||
LIT
|
||
LIST
|
||
|
||
KNIEND:!END
|