1*8b26181fSAndroid Build Coastguard Worker; 2*8b26181fSAndroid Build Coastguard Worker; This file requires NASM 0.97+ to assemble 3*8b26181fSAndroid Build Coastguard Worker; 4*8b26181fSAndroid Build Coastguard Worker; Currently used only for djgpp + DOS4GW targets 5*8b26181fSAndroid Build Coastguard Worker; 6*8b26181fSAndroid Build Coastguard Worker; these sizes MUST be equal to the sizes in PKTDRVR.H 7*8b26181fSAndroid Build Coastguard Worker; 8*8b26181fSAndroid Build Coastguard Worker%define ETH_MTU 1500 ; max data size on Ethernet 9*8b26181fSAndroid Build Coastguard Worker%define ETH_MIN 60 ; min/max total frame size 10*8b26181fSAndroid Build Coastguard Worker%define ETH_MAX (ETH_MTU+2*6+2) ; =1514 11*8b26181fSAndroid Build Coastguard Worker%define NUM_RX_BUF 32 ; # of RX element buffers 12*8b26181fSAndroid Build Coastguard Worker%define RX_SIZE (ETH_MAX+6) ; sizeof(RX_ELEMENT) = 1514+6 13*8b26181fSAndroid Build Coastguard Worker%idefine offset 14*8b26181fSAndroid Build Coastguard Worker 15*8b26181fSAndroid Build Coastguard Workerstruc RX_ELEMENT 16*8b26181fSAndroid Build Coastguard Worker .firstCount resw 1 ; # of bytes on 1st call 17*8b26181fSAndroid Build Coastguard Worker .secondCount resw 1 ; # of bytes on 2nd call 18*8b26181fSAndroid Build Coastguard Worker .handle resw 1 ; handle for upcall 19*8b26181fSAndroid Build Coastguard Worker ; .timeStamp resw 4 ; 64-bit RDTSC value 20*8b26181fSAndroid Build Coastguard Worker .destinAdr resb 6 ; packet destination address 21*8b26181fSAndroid Build Coastguard Worker .sourceAdr resb 6 ; packet source address 22*8b26181fSAndroid Build Coastguard Worker .protocol resw 1 ; packet protocol number 23*8b26181fSAndroid Build Coastguard Worker .rxBuffer resb ETH_MTU ; RX buffer 24*8b26181fSAndroid Build Coastguard Workerendstruc 25*8b26181fSAndroid Build Coastguard Worker 26*8b26181fSAndroid Build Coastguard Worker;------------------------------------------- 27*8b26181fSAndroid Build Coastguard Worker 28*8b26181fSAndroid Build Coastguard Worker[org 0] ; assemble to .bin file 29*8b26181fSAndroid Build Coastguard Worker 30*8b26181fSAndroid Build Coastguard Worker_rxOutOfs dw offset _pktRxBuf ; ring buffer offsets 31*8b26181fSAndroid Build Coastguard Worker_rxInOfs dw offset _pktRxBuf ; into _pktRxBuf 32*8b26181fSAndroid Build Coastguard Worker_pktDrop dw 0,0 ; packet drop counter 33*8b26181fSAndroid Build Coastguard Worker_pktTemp resb 20 ; temp work area 34*8b26181fSAndroid Build Coastguard Worker_pktTxBuf resb (ETH_MAX) ; TX buffer 35*8b26181fSAndroid Build Coastguard Worker_pktRxBuf resb (RX_SIZE*NUM_RX_BUF) ; RX structures 36*8b26181fSAndroid Build Coastguard Worker LAST_OFS equ $ 37*8b26181fSAndroid Build Coastguard Worker 38*8b26181fSAndroid Build Coastguard WorkerscreenSeg dw 0B800h 39*8b26181fSAndroid Build Coastguard WorkernewInOffset dw 0 40*8b26181fSAndroid Build Coastguard Worker 41*8b26181fSAndroid Build Coastguard WorkerfanChars db '-\|/' 42*8b26181fSAndroid Build Coastguard WorkerfanIndex dw 0 43*8b26181fSAndroid Build Coastguard Worker 44*8b26181fSAndroid Build Coastguard Worker%macro SHOW_RX 0 45*8b26181fSAndroid Build Coastguard Worker push es 46*8b26181fSAndroid Build Coastguard Worker push bx 47*8b26181fSAndroid Build Coastguard Worker mov bx, [screenSeg] 48*8b26181fSAndroid Build Coastguard Worker mov es, bx ;; r-mode segment of colour screen 49*8b26181fSAndroid Build Coastguard Worker mov di, 158 ;; upper right corner - 1 50*8b26181fSAndroid Build Coastguard Worker mov bx, [fanIndex] 51*8b26181fSAndroid Build Coastguard Worker mov al, [fanChars+bx] ;; get write char 52*8b26181fSAndroid Build Coastguard Worker mov ah, 15 ;; and white colour 53*8b26181fSAndroid Build Coastguard Worker cld ;; Needed? 54*8b26181fSAndroid Build Coastguard Worker stosw ;; write to screen at ES:EDI 55*8b26181fSAndroid Build Coastguard Worker inc word [fanIndex] ;; update next index 56*8b26181fSAndroid Build Coastguard Worker and word [fanIndex], 3 57*8b26181fSAndroid Build Coastguard Worker pop bx 58*8b26181fSAndroid Build Coastguard Worker pop es 59*8b26181fSAndroid Build Coastguard Worker%endmacro 60*8b26181fSAndroid Build Coastguard Worker 61*8b26181fSAndroid Build Coastguard Worker;PutTimeStamp 62*8b26181fSAndroid Build Coastguard Worker; rdtsc 63*8b26181fSAndroid Build Coastguard Worker; mov [si].timeStamp, eax 64*8b26181fSAndroid Build Coastguard Worker; mov [si+4].timeStamp, edx 65*8b26181fSAndroid Build Coastguard Worker; ret 66*8b26181fSAndroid Build Coastguard Worker 67*8b26181fSAndroid Build Coastguard Worker 68*8b26181fSAndroid Build Coastguard Worker;------------------------------------------------------------------------ 69*8b26181fSAndroid Build Coastguard Worker; 70*8b26181fSAndroid Build Coastguard Worker; This routine gets called by the packet driver twice: 71*8b26181fSAndroid Build Coastguard Worker; 1st time (AX=0) it requests an address where to put the packet 72*8b26181fSAndroid Build Coastguard Worker; 73*8b26181fSAndroid Build Coastguard Worker; 2nd time (AX=1) the packet has been copied to this location (DS:SI) 74*8b26181fSAndroid Build Coastguard Worker; BX has client handle (stored in RX_ELEMENT.handle). 75*8b26181fSAndroid Build Coastguard Worker; CX has # of bytes in packet on both call. They should be equal. 76*8b26181fSAndroid Build Coastguard Worker; A test for equality is done by putting CX in _pktRxBuf [n].firstCount 77*8b26181fSAndroid Build Coastguard Worker; and _pktRxBuf[n].secondCount, and CL on first call in 78*8b26181fSAndroid Build Coastguard Worker; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive" 79*8b26181fSAndroid Build Coastguard Worker; (PKTDRVR.C) 80*8b26181fSAndroid Build Coastguard Worker; 81*8b26181fSAndroid Build Coastguard Worker;--------------------------------------------------------------------- 82*8b26181fSAndroid Build Coastguard Worker 83*8b26181fSAndroid Build Coastguard Worker_PktReceiver: 84*8b26181fSAndroid Build Coastguard Worker pushf 85*8b26181fSAndroid Build Coastguard Worker cli ; no distraction wanted ! 86*8b26181fSAndroid Build Coastguard Worker push ds 87*8b26181fSAndroid Build Coastguard Worker push bx 88*8b26181fSAndroid Build Coastguard Worker mov bx, cs 89*8b26181fSAndroid Build Coastguard Worker mov ds, bx 90*8b26181fSAndroid Build Coastguard Worker mov es, bx ; ES = DS = CS or seg _DATA 91*8b26181fSAndroid Build Coastguard Worker pop bx ; restore handle 92*8b26181fSAndroid Build Coastguard Worker 93*8b26181fSAndroid Build Coastguard Worker cmp ax, 0 ; first call? (AX=0) 94*8b26181fSAndroid Build Coastguard Worker jne @post ; AX=1: second call, do post process 95*8b26181fSAndroid Build Coastguard Worker 96*8b26181fSAndroid Build Coastguard Worker%ifdef DEBUG 97*8b26181fSAndroid Build Coastguard Worker SHOW_RX ; show that a packet is received 98*8b26181fSAndroid Build Coastguard Worker%endif 99*8b26181fSAndroid Build Coastguard Worker 100*8b26181fSAndroid Build Coastguard Worker cmp cx, ETH_MAX ; size OK ? 101*8b26181fSAndroid Build Coastguard Worker ja @skip ; no, too big 102*8b26181fSAndroid Build Coastguard Worker 103*8b26181fSAndroid Build Coastguard Worker mov ax, [_rxInOfs] 104*8b26181fSAndroid Build Coastguard Worker add ax, RX_SIZE 105*8b26181fSAndroid Build Coastguard Worker cmp ax, LAST_OFS 106*8b26181fSAndroid Build Coastguard Worker jb @noWrap 107*8b26181fSAndroid Build Coastguard Worker mov ax, offset _pktRxBuf 108*8b26181fSAndroid Build Coastguard Worker@noWrap: 109*8b26181fSAndroid Build Coastguard Worker cmp ax, [_rxOutOfs] 110*8b26181fSAndroid Build Coastguard Worker je @dump 111*8b26181fSAndroid Build Coastguard Worker mov di, [_rxInOfs] ; ES:DI -> _pktRxBuf[n] 112*8b26181fSAndroid Build Coastguard Worker mov [newInOffset], ax 113*8b26181fSAndroid Build Coastguard Worker 114*8b26181fSAndroid Build Coastguard Worker mov [di], cx ; remember firstCount. 115*8b26181fSAndroid Build Coastguard Worker mov [di+4], bx ; remember handle. 116*8b26181fSAndroid Build Coastguard Worker add di, 6 ; ES:DI -> _pktRxBuf[n].destinAdr 117*8b26181fSAndroid Build Coastguard Worker pop ds 118*8b26181fSAndroid Build Coastguard Worker popf 119*8b26181fSAndroid Build Coastguard Worker retf ; far return to driver with ES:DI 120*8b26181fSAndroid Build Coastguard Worker 121*8b26181fSAndroid Build Coastguard Worker@dump: add word [_pktDrop+0], 1 ; discard the packet on 1st call 122*8b26181fSAndroid Build Coastguard Worker adc word [_pktDrop+2], 0 ; increment packets lost 123*8b26181fSAndroid Build Coastguard Worker 124*8b26181fSAndroid Build Coastguard Worker@skip: xor di, di ; return ES:DI = NIL pointer 125*8b26181fSAndroid Build Coastguard Worker xor ax, ax 126*8b26181fSAndroid Build Coastguard Worker mov es, ax 127*8b26181fSAndroid Build Coastguard Worker pop ds 128*8b26181fSAndroid Build Coastguard Worker popf 129*8b26181fSAndroid Build Coastguard Worker retf 130*8b26181fSAndroid Build Coastguard Worker 131*8b26181fSAndroid Build Coastguard Worker@post: or si, si ; DS:SI->_pktRxBuf[n][n].destinAdr 132*8b26181fSAndroid Build Coastguard Worker jz @discard ; make sure we don't use NULL-pointer 133*8b26181fSAndroid Build Coastguard Worker 134*8b26181fSAndroid Build Coastguard Worker ; 135*8b26181fSAndroid Build Coastguard Worker ; push si 136*8b26181fSAndroid Build Coastguard Worker ; call bpf_filter_match ; run the filter here some day 137*8b26181fSAndroid Build Coastguard Worker ; pop si 138*8b26181fSAndroid Build Coastguard Worker ; cmp ax, 0 139*8b26181fSAndroid Build Coastguard Worker ; je @discard 140*8b26181fSAndroid Build Coastguard Worker 141*8b26181fSAndroid Build Coastguard Worker mov [si-6+2], cx ; store _pktRxBuf[n].secondCount 142*8b26181fSAndroid Build Coastguard Worker mov ax, [newInOffset] 143*8b26181fSAndroid Build Coastguard Worker mov [_rxInOfs], ax ; update _pktRxBuf input offset 144*8b26181fSAndroid Build Coastguard Worker 145*8b26181fSAndroid Build Coastguard Worker ; call PutTimeStamp 146*8b26181fSAndroid Build Coastguard Worker 147*8b26181fSAndroid Build Coastguard Worker@discard: 148*8b26181fSAndroid Build Coastguard Worker pop ds 149*8b26181fSAndroid Build Coastguard Worker popf 150*8b26181fSAndroid Build Coastguard Worker retf 151*8b26181fSAndroid Build Coastguard Worker 152*8b26181fSAndroid Build Coastguard Worker_pktRxEnd db 0 ; marker for end of r-mode code/data 153*8b26181fSAndroid Build Coastguard Worker 154*8b26181fSAndroid Build Coastguard WorkerEND 155*8b26181fSAndroid Build Coastguard Worker 156