;===========================================================================
; Data segment
;===========================================================================
.386p
.MODEL flat

_DATA SEGMENT DWORD USE32
	Selector       dw	0000  		;got from _mapRMBuff

;	EXTRN C Shared_Memory_Buffer	:DATAPTR
	EXTRN C Function_Ptr				:DATAPTR
	EXTRN C Buffer_Length_Ptr		:DATAPTR
	EXTRN C Net_Common_Ptr        :DATAPTR

	EXTRN C baseadr:WORD      ;real mode segment of structure
	EXTRN C offs:WORD			  ;real mode offset of structure

;	EXTRN C RMShared_Memory_Buffer_Off	:WORD
	EXTRN C RMBuffer_Length_Off   		:WORD
	EXTRN C RMFunction_Off					:WORD


_DATA ENDS

;===========================================================================
; Code segment
;===========================================================================
_TEXT SEGMENT DWORD USE32

;###########################################################################
_mapRMBuff PROC CPP NEAR USES EAX EBX ECX EDX es
PUBLIC _mapRMBuff

;--------------------------------------------------------------------------
;	Map descriptor (i.e selector) to real mode memory
;--------------------------------------------------------------------------
	mov 	ax, 0002h
	mov	bx, baseadr
	INT	31h
	mov	Selector, ax
;--------------------------------------------------------------------------
;	Examine everything
;--------------------------------------------------------------------------
;Check base address in cx:edx
;	mov 	ax, 0006h
;	mov	bx, Selector
;	INT	31h

;Check segment limit in ax
;	lsl	ax, Selector

;Examine Access Rights in ax
;	lar	ax, Selector


	ret
ENDP _mapRMBuff


;###########################################################################
_getRMBuff PROC CPP NEAR USES EAX EBX ECX EDX edi esi es
PUBLIC _getRMBuff


;get counter for Block copy from real mode address
	mov	es, Selector
	mov	di, RMBuffer_Length_Off
	xor	ecx, ecx
	mov	cx, WORD PTR es:[di]
	add 	cx, 6               		;include Function,Status,Buffer_Length to Block

;get Block address
	mov	di, RMFunction_Off		;real mode Block
	mov	esi, Function_Ptr			;protected mode Block
CopyBlock:
	xor	eax, eax
	mov	al, es:[di] ;BYTE PTR es:[edi]
	mov	BYTE PTR [esi], al  		;copy to protected mode
	inc 	di
	inc	esi
	loopnz  CopyBlock


	ret
ENDP _getRMBuff

;###########################################################################
_setRMBuff PROC CPP NEAR USES EAX EBX ECX EDX edi esi es
PUBLIC _setRMBuff

;Copy from protected mode address
	mov	es, Selector
	mov	di, RMFunction_Off
	mov	esi, Function_Ptr
	xor	ecx, ecx
	mov	ebx, [Buffer_Length_Ptr];counter
	mov	cx, [ebx]
	add	cx, 6                   ;include Function,Status,Buffer_Length to Block
CopyBlk:
	xor	eax, eax
	mov	al, [esi]
	mov	es:[di], eax        		;copy to real mode
	inc 	di
	inc	esi
	loopnz  CopyBlk


	ret
ENDP _setRMBuff

;###########################################################################
_getRMNumbers PROC CPP NEAR USES EAX EBX ECX EDX edi esi es
PUBLIC _getRMNumbers

;Copy from protected mode address
   mov	es, Selector
;get counter for Block copy from real mode address
	xor	ecx, ecx
	mov	cx, 6     ;sizeof long Version_Number and short Interrupt_Number

;get Block address
	mov	di, offs					 	;real mode Block
	mov	esi, Net_Common_Ptr		;protected mode Block
CopyBl:
	xor	eax, eax
	mov	al, es:[di]
	mov	BYTE PTR [esi], al  		;copy to protected mode
	inc 	di
	inc	esi
	loopnz  CopyBl


	ret
ENDP _getRMNumbers

_TEXT ENDS
END

