; ===================================================
; Листинг 2. Инициализация и вызов драйвера IPX/SPX
; Файл ipxdrv.asm
;
; (C) A. Frolov, 1993
; ===================================================

.286
.MODEL SMALL

; ---------------------------------------
; Структура для вызова драйвера IPX/SPX
; ---------------------------------------

	IPXSPX_REGS struc
		rax	dw ?
		rbx	dw	?
		rcx	dw	?
		rdx	dw	?
		rsi	dw	?
		rdi	dw	?
		res	dw	?
	IPXSPX_REGS ends

.DATA

; Точка входа в драйвер IPX/SPX

_ipxspx_drv_entry	dd ?

.CODE

	PUBLIC 	_ipxspx_entry, _ipx_init
	PUBLIC 	_ipxspx_drv_entry

; ---------------------------------------
; Процедура, вызывающая драйвер IPX/SPX
; ---------------------------------------

_ipxspx_entry PROC FAR

; Готовим BP для адресации параметра функции

		push	bp
		mov  	bp,sp

; Сохраняем регистры, так как драйвер IPX/SPX
; изменяет содержимое практически всех регистров

		push	es
		push	di
		push	si
		push	dx
		push	cx
		push	bx
		push	ax

; Загружаем регистры из структуры,
; адрес которой передается как параметр

		push	ds
		mov 	bx, [bp+6]   ; смещение
		mov	ds, [bp+8]   ; сегмент
		mov	es, ds:[bx].res
		mov	di, ds:[bx].rdi
		mov	si, ds:[bx].rsi
		mov	dx, ds:[bx].rdx
		mov	cx, ds:[bx].rcx
		mov	ax, ds:[bx].rax
		mov	bx, ds:[bx].rbx
		pop	ds

; Вызываем драйвер IPX/SPX

		call	[dword ptr _ipxspx_drv_entry]

; Сохраняем регистры

		push	ds
		push	dx
		mov	dx, bx

; Записываем в структуру содержимое регистров
; после вызова драйвера

		mov 	bx, [bp+6]	 ; смещение
		mov	ds, [bp+8]   ; сегмент
		mov	ds:[bx].rax, ax
		mov	ds:[bx].rcx, cx
		mov	ds:[bx].rbx, dx
		pop	dx
		mov	ds:[bx].rdx, dx
		pop	ds

; Восстанавливаем регистры

		pop	ax
		pop	bx
		pop	cx
		pop	dx
		pop	si
		pop	di
		pop	es

		pop 	bp
		retf
_ipxspx_entry ENDP

; ---------------------------------------------
; Процедура инициализации драйвера IPX/SPX
; ---------------------------------------------

_ipx_init PROC NEAR
		push	bp
		mov  	bp,sp

; Определяем наличие драйвера в системе
; и его точку входа

		mov	ax, 7a00h
		int	2fh

; Если драйвера нет, завершаем процедуру

		cmp	al, 0ffh
		jne	_ipx_init_exit

; Сохраняем адрес точки входа

		mov	word ptr _ipxspx_drv_entry+2, es
		mov	word ptr _ipxspx_drv_entry, di

_ipx_init_exit:

; В регистре AX - код завершения процедуры

		mov	ah, 0
		pop 	bp
		ret
_ipx_init ENDP

end