1511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPAGE 60,132
2511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallNAME PKT_RX
3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef ??version        ; using TASM
5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  masm
6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  jumps
7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif
8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
9511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC _pktDrop, _pktRxBuf, _pktTxBuf,    _pktTemp
10511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallPUBLIC _rxOutOfs, _rxInOfs, _PktReceiver, _pktRxEnd
11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;
13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; these sizes MUST be equal to the sizes in PKTDRVR.H
14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;
15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
16511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallRX_BUF_SIZE = 1500      ; max message size on Ethernet
17511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallTX_BUF_SIZE = 1500
18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef DOSX
20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall .386
21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  NUM_RX_BUF = 32       ; # of RX element buffers
22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _TEXT   SEGMENT PUBLIC DWORD USE16 'CODE'
23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _TEXT   ENDS
24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _DATA   SEGMENT PUBLIC DWORD USE16 'CODE'
25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _DATA   ENDS
26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  D_SEG   EQU <_TEXT SEGMENT>
27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  D_END   EQU <_TEXT ENDS>
28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ASSUME  CS:_TEXT,DS:_TEXT
29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallelse
30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall .286
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  NUM_RX_BUF = 10
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _TEXT   SEGMENT PUBLIC DWORD 'CODE'
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _TEXT   ENDS
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _DATA   SEGMENT PUBLIC DWORD 'DATA'
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  _DATA   ENDS
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  D_SEG   EQU <_DATA SEGMENT>
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  D_END   EQU <_DATA ENDS>
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  ASSUME  CS:_TEXT,DS:_DATA
39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif
40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;-------------------------------------------
42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
43511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallD_SEG
44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
45511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallRX_ELEMENT     STRUC
46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   firstCount  dw  0                          ; # of bytes on 1st call
47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   secondCount dw  0                          ; # of bytes on 2nd call
48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   handle      dw  0                          ; handle for upcall
49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   destinAdr   db  6           dup (0)        ; packet destination address
50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   sourceAdr   db  6           dup (0)        ; packet source address
51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   protocol    dw  0                          ; packet protocol number
52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   rxBuffer    db  RX_BUF_SIZE dup (0)        ; RX buffer
53511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENDS
54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall               align 4
55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_rxOutOfs      dw  offset _pktRxBuf           ; ring buffer offsets
56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_rxInOfs       dw  offset _pktRxBuf           ; into _pktRxBuf
57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktDrop       dw  0,0                        ; packet drop counter
58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktTemp       db  20                dup (0)  ; temp work area
59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktTxBuf      db  (TX_BUF_SIZE+14)  dup (0)  ; TX buffer
60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktRxBuf      RX_ELEMENT NUM_RX_BUF dup (<>) ; RX structures
61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall LAST_OFS      = offset $
62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall screenSeg     dw  0B800h
64511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall newInOffset   dw  0
65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall fanChars      db  '-\|/'
67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall fanIndex      dw  0
68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
69511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallD_END
70511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
71511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_TEXT SEGMENT
72511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
73511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
74511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallSHOW_RX  MACRO
75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         push es
76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         push bx
77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov bx, screenSeg
78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov es, bx                    ;; r-mode segment of colour screen
79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov di, 158                   ;; upper right corner - 1
80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov bx, fanIndex
81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov al, fanChars[bx]          ;; get write char
82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov ah, 15                    ;;  and white colour
83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         stosw                         ;; write to screen at ES:EDI
84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         inc fanIndex                  ;; update next index
85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         and fanIndex, 3
86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         pop bx
87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         pop es
88511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENDM
89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;------------------------------------------------------------------------
91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;
92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; This macro return ES:DI to tail of Rx queue
93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
94511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENQUEUE  MACRO
95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         LOCAL @noWrap
96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov ax, _rxInOfs              ;; DI = current in-offset
97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         add ax, SIZE RX_ELEMENT       ;; point to next _pktRxBuf buffer
98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         cmp ax, LAST_OFS              ;; pointing past last ?
99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         jb  @noWrap                   ;; no - jump
100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         lea ax, _pktRxBuf             ;; yes, point to 1st buffer
101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         align 4
102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@noWrap: cmp ax, _rxOutOfs             ;; in-ofs = out-ofs ?
103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         je  @dump                     ;; yes, queue is full
104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov di, _rxInOfs              ;; ES:DI -> buffer at queue input
105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov newInOffset, ax           ;; remember new input offset
106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   ;; NOTE. rxInOfs is updated after the packet has been copied
108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall   ;; to ES:DI (= DS:SI on 2nd call) by the packet driver
109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
110511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallENDM
111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;------------------------------------------------------------------------
113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;
114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; This routine gets called by the packet driver twice:
115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;   1st time (AX=0) it requests an address where to put the packet
116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;
117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;   2nd time (AX=1) the packet has been copied to this location (DS:SI)
118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;   BX has client handle (stored in RX_ELEMENT.handle).
119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;   CX has # of bytes in packet on both call. They should be equal.
120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;
121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; A test for equality is done by putting CX in _pktRxBuf [n].firstCount
122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; and _pktRxBuf[n].secondCount, and CL on first call in
123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive"
124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall; (PKTDRVR.C)
125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;
126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall;---------------------------------------------------------------------
127511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
128511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_PktReceiver:
129511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         pushf
130511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         cli                         ; no distraction wanted !
131511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         push ds
132511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         push bx
133511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef DOSX
134511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov bx, cs
135511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallelse
136511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov bx, SEG _DATA
137511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif
138511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov ds, bx
139511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov es, bx                  ; ES = DS = CS or seg _DATA
140511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         pop bx                      ; restore handle
141511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
142511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         cmp ax, 0                   ; first call? (AX=0)
143511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         jne @post                   ; AX=1: second call, do post process
144511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
145511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallifdef DEBUG
146511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         SHOW_RX                     ; show that a packet is received
147511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendif
148511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         cmp cx, RX_BUF_SIZE+14      ; size OK ?
149511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         ja  @skip                   ; no, packet to large for us
150511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
151511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         ENQUEUE                     ; ES:DI -> _pktRxBuf[n]
152511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
153511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov [di].firstCount, cx     ; remember the first count.
154511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov [di].handle, bx         ; remember the handle.
155511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         add di, 6                   ; ES:DI -> _pktRxBuf[n].destinAdr
156511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         pop ds
157511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         popf
158511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         retf                        ; far return to driver with ES:DI
159511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
160511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         align 4
161511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@dump:   inc _pktDrop[0]             ; discard the packet on 1st call
162511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         adc _pktDrop[2], 0          ; increment packets lost
163511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
164511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@skip:   xor di, di                  ; return ES:DI = NIL pointer
165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         xor ax, ax
166511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov es, ax
167511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         pop ds
168511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         popf
169511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         retf
170511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
171511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         align 4
172511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@post:   or si, si                   ; DS:SI->_pktRxBuf[n][n].destinAdr
173511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         jz @discard                 ; make sure we don't use NULL-pointer
174511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
175511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         sub si, 6                   ; DS:SI -> _pktRxBuf[n].destinAdr
176511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ;
177511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ; push si
178511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ; push [si].firstCount
179511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ; call bpf_filter_match       ; run the filter here some day?
180511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ; add sp, 4
181511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ; cmp ax, 0
182511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall       ; je  @discard
183511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
184511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov [si].secondCount, cx
185511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov ax, newInOffset
186511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         mov _rxInOfs, ax            ; update _pktRxBuf input offset
187511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
188511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         align 4
189511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall@discard:pop ds
190511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         popf
191511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall         retf
192511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
193511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_pktRxEnd  db 0                      ; marker for end of r-mode code/data
194511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
195511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall_TEXT ENDS
196511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
197511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallEND
198