PGM EDRIV
REL
******************************************************
* *
* DEVICE DRIVER FOR THE SIMPLE ETHERNET BOARDS. *
* (gigantic system version) *
* *
******************************************************
*
* DEVICE CONTROL BLOCK SYMBOLS
*
* 0 DEVICE DRIVER PTR (BCPL)
* 0 CODE LINK (=0)
D.ID EQU 6 ID
D.WKQ EQU 8 WORK QUEUE
D.START EQU 10 START ROUTINE (NOT USED)
D.STOP EQU 14 STOP ROUTINE (NOT USED)
D.CALL EQU 18 SUBROUTINE JUMP TO
D.INT EQU 20 OFFSET ADDRESS
D.I EQU D.CALL+6 OFFSET USED IN INTERRUPT ROUTINE
D.VEC EQU 24 VECTOR NUMBER
D.TXPKT EQU 26 BCPL ADDRESS OF TX TRIPOS PKT
D.RXPKT EQU 28 BCPL ADDRESS OF RX TRIPOS PKT
*
* PACKET SYMBOLS
*
P.ID EQU 2 TASK OR DEVICE ID
P.RES1 EQU 6 FIRST RESULT
*
* PARALLEL I/O PORT ADDRESSES
*
CONTROL EQU #CE CONTROL & SET/RESET PORT C BITS
PORTC EQU #CC
PORTA EQU #C8
PORTB EQU #CA OUTPUT
*
* STATUS BIT MASKS FOR M.S. 4 BITS OF PORT C
*
TXACKED EQU #10 TRANSMITTED BLOCK WAS ACKED
CONTENT EQU #20 CONTENTION WAS DETECTED
TXENDED EQU #40 BLOCK TRANSMIT COMPLETE
RXENDED EQU #80 BLOCK RECEIVE COMPLETE
RXACKED EQU RXENDED
*
* PORTC L.S. BIT POSITIONS
*
RESETB EQU 2*2+1
STROBE EQU 3*2+1 STROBE CONTROL INFO FROM DATA LINES
*
* CONTROL WORDS
*
RESRXEND EQU #5F RESET RECEIVE ENDED
*
ERRVEC EQU #3FC
MPICMSK EQU #C2
* THE ROOTNODE
*
CRNTSK EQU #506
DEVMVP EQU #51A MOVPKT
DEVINT EQU #51E INTENT
DEVRET EQU #522 INTRET
*
DW EINITI
DW EUNINI
*
* INITIALIZATION ROUTINE. SETS UP DCB, MC ADDRESS IN BX.
*
EINIT MOV SI,!EINT CALCULATE OFFSET FOR DCB CALL
MOV D.INT(BX),SI PUT IN DCB
MOV D.INT+2(BX),CS correct code seg in DCB
XOR SI,SI
MOV D.TXPKT(BX),SI CLEAR DCB LOCATIONS
MOV D.RXPKT(BX),SI
MOV SI,!40*4 OFFSET IN TABLE FOR TXINT
MOV (SI),BX PLUG INTERRUPT VECTOR
ADD (SI),!D.CALL
MOV 2(SI),!0 CS := 0 FOR INTERRUPT
MOV SI,!42*4 FOR RX INT
MOV (SI),BX
ADD (SI),!D.CALL
MOV 2(SI),!0 CS := 0 FOR INTERRUPT
*
MOV AL,!#98
OUT CONTROL INIT PPI
* MAKE PORT C ALL 0S
XOR AL,AL
OUT PORTC
* RESET ETHERNET BOARD
MOV AL,!RESETB
OUT CONTROL
DEC AL
OUT CONTROL
MOV AL,!RESRXEND
OUT PORTB
MOV AL,!STROBE
OUT CONTROL
DEC AL
OUT CONTROL
* ENABLE INTERRUPTS
IN MPICMSK GET CURRENT BITS
AND AL,!#FA CLEAR OUR BITS
OUT MPICMSK SET IT UP
*
RETS
*
* UNINITIALIZATION. ADDRESS OF DCB IN BX.
*
EUNIN PUSH AX
MOV SI,!40*4
MOV AX,ERRVEC
MOV (SI),AX
MOV AX,ERRVEC+2
MOV 2(SI),AX
MOV SI,!42*4
MOV AX,ERRVEC
MOV (SI),AX
MOV AX,ERRVEC+2
MOV 2(SI),AX
* DISABLE INTERRUPT
IN MPICMSK
OR AL,!5
OUT MPICMSK
POP AX
RETS
*
* INTERRUPT ROUTINE ENTERED WHEN A TX OR RX ENDED INTERRUPT OCCURS.
* THE DCB ADDRESS MAY BE FOUND FROM THE SUBROUTINE RETURN ADDRESS
* ON THE MC STACK.
* WHEN EINTR IS REACHED CX SHOULD ONLY BE ZERO IF A TASK CHANGE IS NEEDED.
*
EINT PUSH BX SAVE REGISTERS
PUSH AX
PUSH CX
PUSH DX
PUSH SI
MOV BX,SP
MOV BX,10(BX) GET ADDRESS OFFSET 10 IN DCB
* WHY DID IT INTERRUPT?
* EXAMINE STATUS
XOR CX,CX
NOT CX MAKE CX NON-ZERO
IN PORTC GET STATUS IN AL
TEST AL,!RXENDED
JNE ETRTX NOT RX, GO SEE IF TX
* HANDLE RECEIVE ENDED INTERRUPT
MOV SI,D.RXPKT-D.I(BX) GET TRIPOS PKT
SHL SI
JE ETRTX IF NO PKT WAITING !!!
* SEE IF WE ACKED THE BLOCK (I.E. IT WAS OK)
MOV AL,!RESRXEND
OUT PORTB SET UP CONTROL WORD
MOV AL,!STROBE
OUT CONTROL STROBE TO RESET RX ENDED STATUS
DEC AL
OUT CONTROL RESET STROBE
* NOW READ SAME BIT WHICH WILL BE ACTIVE IF WE ACKED
IN PORTC
XOR CX,CX CX HOLDS 'RETURN CODE'
TEST AL,!RXACKED
JE ERXA YES, WAS ACKED
NOT CX SET RESULT NON-ZERO FOR FAILURE
ERXA MOV P.RES1(SI),CX SET RESULT
MOV D.RXPKT-D.I(BX),!0 CLEAR DCB LOCATION
CALL EMPKT MOVE PKT BACK TO TASK
MOV DX,AX SAVE NEW TCB PTR
IN PORTC
ETRTX TEST AL,!TXENDED TX ENDED?
JNE EINTR NO TX ENDED
*
* HANDLE TRANSMIT ENDED INTERRUPT
MOV SI,D.TXPKT-D.I(BX)
SHL SI
JE EINTR NO PKT WAITING !!!
* SEE IF THERE WAS CONTENTION AND WHETHER BLOCK WAS ACKED
*
XOR CX,CX RESULT
TEST AL,!CONTENT
JNE ETRTXA
INC CX
NOT CX RETURN -2 FOR CONTENTION
B ETXA
ETRTXA MOV CX,!16
ETRLP LOOP ETRLP
IN PORTC
TEST AL,!TXACKED
JE ETXA YES, WAS ACKED
NOT CX -1 -> NO ACK RECEIVED
ETXA MOV P.RES1(SI),CX SET RESULT IN PKT
MOV D.TXPKT-D.I(BX),!0
CALL EMPKT MOVE BACK TO TASK
MOV DX,AX SAVE NEW TCB PTR
EINTR OR CX,CX TASK SWAP NEEDED
JE EINTW YES
JIS DEVRET NO, RETURN QUICKLY
EINTW MOV AX,DX GET NEW TCB PTR
JIS DEVINT RETURN FOR TASK SWAP
* MOVE PKT BACK TO TASK USING MOVPKT
*
EMPKT MOV CX,D.ID-D.I(BX)
PUSH BX SAVE DCB PTR
MOV BX,CRNTSK
SHL BX
CIS DEVMVP
POP BX
RET
*
*
EVEN
DSEG
EVEN
EINITI DW EINIT
DW 0
EUNINI DW EUNIN
DW 0
END