PGM VMPRX
REL
*
MPICMSK EQU #C2
ERRVEC EQU #3FC
* VMP addresses
VB EQU #80
VCTRL EQU VB+4
VRXG EQU VB+7
VSOURCE EQU VB+1
VSSR EQU VB+0
VRXB EQU VB+5
* VMP bits
VRON EQU #T00001000
VRRST EQU #T00000100
VNEN EQU #T00000001
VRTRY EQU #T00000010
* DCB symbols
D.ID EQU 6
D.WKQ EQU 8
D.START EQU 10
D.STOP EQU 14
D.CALL EQU 18
D.INT EQU 20
D.I EQU D.CALL+6
D.VEC EQU 24
* Pkt symbols
P.ID EQU 2
P.TYPE EQU 4
P.RES1 EQU 6
P.RES2 EQU 8
P.A1 EQU 10
P.A2 EQU 12
* Rootnode
CRNTSK EQU #506
DEVMVP EQU #51A
DEVINT EQU #51E
DEVRET EQU #522
*
DW VMPINITI
DW VMPUNINI
*
* Init.
* entry: BX = MC DCB addr.
* preserve: DX,DI,BP except DX=0 on error
VMPINIT MOV D.START(BX),!VMPSTART
MOV D.STOP(BX),!VMPSTOP
MOV D.START+2(BX),CS
MOV D.STOP+2(BX),CS
* check that ring is up
IN VCTRL
TEST AL,!VRON
JNE VI0
* not on, return 0
XOR DX,DX
RETS
* is on, plug interrupt vector
VI0 IN VCTRL
AND AL,!VTRST preserve tx setting
OR AL,!VRRST+VNEN
OUT VCTRL
MOV D.INT(BX),!VMPINT
MOV D.INT+2(BX),CS
MOV SI,D.VEC(BX)
ADD SI,!40
SHL SI
SHL SI
MOV (SI),BX
ADD (SI),!D.CALL
MOV 2(SI),!0
RETS
*
* Uninit.
* entry: BX = MC DCB addr.
* preserve: BX
VMPUNIN CALL DISINT
MOV SI,D.VEC(BX)