diff options
Diffstat (limited to 'msdos/pkt_rx1.s')
-rw-r--r-- | msdos/pkt_rx1.s | 155 |
1 files changed, 0 insertions, 155 deletions
diff --git a/msdos/pkt_rx1.s b/msdos/pkt_rx1.s deleted file mode 100644 index 654e6577..00000000 --- a/msdos/pkt_rx1.s +++ /dev/null @@ -1,155 +0,0 @@ -; -; This file requires NASM 0.97+ to assemble -; -; Currently used only for djgpp + DOS4GW targets -; -; these sizes MUST be equal to the sizes in PKTDRVR.H -; -%define ETH_MTU 1500 ; max data size on Ethernet -%define ETH_MIN 60 ; min/max total frame size -%define ETH_MAX (ETH_MTU+2*6+2) ; =1514 -%define NUM_RX_BUF 32 ; # of RX element buffers -%define RX_SIZE (ETH_MAX+6) ; sizeof(RX_ELEMENT) = 1514+6 -%idefine offset - -struc RX_ELEMENT - .firstCount resw 1 ; # of bytes on 1st call - .secondCount resw 1 ; # of bytes on 2nd call - .handle resw 1 ; handle for upcall - ; .timeStamp resw 4 ; 64-bit RDTSC value - .destinAdr resb 6 ; packet destination address - .sourceAdr resb 6 ; packet source address - .protocol resw 1 ; packet protocol number - .rxBuffer resb ETH_MTU ; RX buffer -endstruc - -;------------------------------------------- - -[org 0] ; assemble to .bin file - -_rxOutOfs dw offset _pktRxBuf ; ring buffer offsets -_rxInOfs dw offset _pktRxBuf ; into _pktRxBuf -_pktDrop dw 0,0 ; packet drop counter -_pktTemp resb 20 ; temp work area -_pktTxBuf resb (ETH_MAX) ; TX buffer -_pktRxBuf resb (RX_SIZE*NUM_RX_BUF) ; RX structures - LAST_OFS equ $ - -screenSeg dw 0B800h -newInOffset dw 0 - -fanChars db '-\|/' -fanIndex dw 0 - -%macro SHOW_RX 0 - push es - push bx - mov bx, [screenSeg] - mov es, bx ;; r-mode segment of colour screen - mov di, 158 ;; upper right corner - 1 - mov bx, [fanIndex] - mov al, [fanChars+bx] ;; get write char - mov ah, 15 ;; and white colour - cld ;; Needed? - stosw ;; write to screen at ES:EDI - inc word [fanIndex] ;; update next index - and word [fanIndex], 3 - pop bx - pop es -%endmacro - -;PutTimeStamp -; rdtsc -; mov [si].timeStamp, eax -; mov [si+4].timeStamp, edx -; ret - - -;------------------------------------------------------------------------ -; -; This routine gets called by the packet driver twice: -; 1st time (AX=0) it requests an address where to put the packet -; -; 2nd time (AX=1) the packet has been copied to this location (DS:SI) -; BX has client handle (stored in RX_ELEMENT.handle). -; CX has # of bytes in packet on both call. They should be equal. -; A test for equality is done by putting CX in _pktRxBuf [n].firstCount -; and _pktRxBuf[n].secondCount, and CL on first call in -; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive" -; (PKTDRVR.C) -; -;--------------------------------------------------------------------- - -_PktReceiver: - pushf - cli ; no distraction wanted ! - push ds - push bx - mov bx, cs - mov ds, bx - mov es, bx ; ES = DS = CS or seg _DATA - pop bx ; restore handle - - cmp ax, 0 ; first call? (AX=0) - jne @post ; AX=1: second call, do post process - -%ifdef DEBUG - SHOW_RX ; show that a packet is received -%endif - - cmp cx, ETH_MAX ; size OK ? - ja @skip ; no, too big - - mov ax, [_rxInOfs] - add ax, RX_SIZE - cmp ax, LAST_OFS - jb @noWrap - mov ax, offset _pktRxBuf -@noWrap: - cmp ax, [_rxOutOfs] - je @dump - mov di, [_rxInOfs] ; ES:DI -> _pktRxBuf[n] - mov [newInOffset], ax - - mov [di], cx ; remember firstCount. - mov [di+4], bx ; remember handle. - add di, 6 ; ES:DI -> _pktRxBuf[n].destinAdr - pop ds - popf - retf ; far return to driver with ES:DI - -@dump: add word [_pktDrop+0], 1 ; discard the packet on 1st call - adc word [_pktDrop+2], 0 ; increment packets lost - -@skip: xor di, di ; return ES:DI = NIL pointer - xor ax, ax - mov es, ax - pop ds - popf - retf - -@post: or si, si ; DS:SI->_pktRxBuf[n][n].destinAdr - jz @discard ; make sure we don't use NULL-pointer - - ; - ; push si - ; call bpf_filter_match ; run the filter here some day - ; pop si - ; cmp ax, 0 - ; je @discard - - mov [si-6+2], cx ; store _pktRxBuf[n].secondCount - mov ax, [newInOffset] - mov [_rxInOfs], ax ; update _pktRxBuf input offset - - ; call PutTimeStamp - -@discard: - pop ds - popf - retf - -_pktRxEnd db 0 ; marker for end of r-mode code/data - -END - |