PAGE 60,132
NAME NDIS_0

ifdef DOSX
  .386
  _TEXT   SEGMENT PUBLIC DWORD USE16 'CODE'
  _TEXT   ENDS
  _DATA   SEGMENT PUBLIC DWORD USE16 'CODE'
  _DATA   ENDS
  _TEXT32 SEGMENT PUBLIC BYTE  USE32 'CODE'
  _TEXT32 ENDS
  CB_DSEG EQU <CS>                          ; DOSX is tiny-model
  D_SEG   EQU <_TEXT SEGMENT>
  D_END   EQU <_TEXT ENDS>
  ASSUME  CS:_TEXT,DS:_TEXT

  PUSHREGS equ <pushad>
  POPREGS  equ <popad>

  PUBPROC macro name
          align 4
          public @&name
          @&name label near
          endm
else
  .286
  _TEXT   SEGMENT PUBLIC DWORD 'CODE'
  _TEXT   ENDS
  _DATA   SEGMENT PUBLIC DWORD 'DATA'
  _DATA   ENDS
  CB_DSEG EQU <SEG _DATA>                   ; 16bit is small/large model
  D_SEG   EQU <_DATA SEGMENT>
  D_END   EQU <_DATA ENDS>
  ASSUME  CS:_TEXT,DS:_DATA

  PUSHREGS equ <pusha>
  POPREGS  equ <popa>

  PUBPROC  macro name
           public _&name
           _&name label far
           endm
endif

;-------------------------------------------

D_SEG

D_END


_TEXT SEGMENT

EXTRN _NdisSystemRequest      : near
EXTRN _NdisRequestConfirm     : near
EXTRN _NdisTransmitConfirm    : near
EXTRN _NdisReceiveLookahead   : near
EXTRN _NdisIndicationComplete : near
EXTRN _NdisReceiveChain       : near
EXTRN _NdisStatusProc         : near
EXTRN _NdisAllocStack         : near
EXTRN _NdisFreeStack          : near

;
; *ALL* interrupt threads come through this macro.
;
CALLBACK macro callbackProc, argsSize

     pushf
     PUSHREGS                ;; Save the registers

     push es
     push ds
     mov  ax,CB_DSEG         ;; Load DS
     mov  ds,ax
     call _NdisAllocStack    ;; Get and install a stack.

     mov  bx,ss              ;; Save off the old stack in other regs
     mov  cx,sp
     mov  ss,dx              ;; Install the new one
     mov  sp,ax
     push bx                 ;; Save the old one on to the new stack
     push cx
     sub  sp,&argsSize       ;; Allocate space for arguments on the stack

     mov  ax,ss              ;; Set up the destination for the move
     mov  es,ax
     mov  di,sp
     mov  ds,bx              ;; Set up the source for the move.
     mov  si,cx
     add  si,4+6+32

     mov  cx,&argsSize       ;; Move the arguments to the stack.
     shr  cx,1
     cld
     rep  movsw

     mov  ax,CB_DSEG         ;; Set my data segment again.
     mov  ds,ax

     call &callbackProc      ;; Call the real callback.
     pop  di                 ;; Pop off the old stack
     pop  si
     mov  bx,ss              ;; Save off the current allocated stack.
     mov  cx,sp
     mov  ss,si              ;; Restore the old stack
     mov  sp,di
     push ax                 ;; Save the return code
     push bx                 ;; Free the stack. Push the pointer to it
     push cx
     call _NdisFreeStack
     add  sp,4
     pop  ax                 ;; Get the return code back
     add  di,32              ;; Get a pointer to ax on the stack
     mov  word ptr ss:[di],ax
     pop  ds
     pop  es

     POPREGS
     popf
endm

;
; Define all of the callbacks for the NDIS procs.
;

PUBPROC systemRequestGlue
CALLBACK _NdisSystemRequest,14
RETF

PUBPROC requestConfirmGlue
CALLBACK _NdisRequestConfirm,12
RETF

PUBPROC transmitConfirmGlue
CALLBACK _NdisTransmitConfirm,10
RETF

PUBPROC receiveLookaheadGlue
CALLBACK _NdisReceiveLookahead,16
RETF

PUBPROC indicationCompleteGlue
CALLBACK _NdisIndicationComplete,4
RETF

PUBPROC receiveChainGlue
CALLBACK _NdisReceiveChain,16
RETF

PUBPROC statusGlue
CALLBACK _NdisStatusProc,12
RETF

;
; int FAR NdisGetLinkage (int handle, char *data, int size);
;

ifdef DOSX
  PUBPROC NdisGetLinkage
          push ebx
          mov ebx, [esp+8]              ; device handle
          mov eax, 4402h                ; IOCTRL read function
          mov edx, [esp+12]             ; DS:EDX -> result data
          mov ecx, [esp+16]             ; ECX = length
          int 21h
          pop ebx
          jc  @fail
          xor eax, eax
  @fail:  ret

else
  PUBPROC NdisGetLinkage
          enter 0, 0
          mov bx, [bp+6]
          mov ax, 4402h
          mov dx, [bp+8]
          mov cx, [bp+12]
          int 21h
          jc  @fail
          xor ax, ax
  @fail:  leave
          retf
endif

ENDS

END