	.386p

CGROUP	group	EIN_ASMFUNC
EIN_ASMFUNC		segment	public dword 'CODE'
				assume	cs:EIN_ASMFUNC

;	int24ハンドラ

	align	4
_EIN_errhandle	proc	far
	mov		al,3                        ; "システムコール失敗"を指定
	iretd
_EIN_errhandle	endp

;typedef struct _EINSAVEVECT{
;    unsigned long   realAdr;
;    unsigned long   *offset;
;    unsigned long   segment;
;}EINSAVEVECT;
;
;/*<Func>================================================================
;*   void EIN_setVector( unsigned long *save );
;*
;*	【概  要】	int24hハンドラの設定
;*
;*	【機  能】	
;*
;*	【入  力】	*save		: 古いINT24Hハンドラを保存する領域(12byte)
;*								※ typedef struct _EINSAVEVECT{
;*										unsigned long   realAdr;
;*										unsigned long   *offset;
;*										unsigned long   segment;
;*									}EINSAVEVECT;
;*
;*	【注  意】	
;*
;*	【参  照】	
;*
;*-----------------------------------------------------------------------
;*	V11L10	1994.07.06/Nam
;*</Func>==============================================================*/
	public	EIN_setVector
	db	'EIN_setVector',13
	align	4
EIN_setVector	proc	near
	; get para
	mov     ecx,[esp+4]                 ; ecx = 引数のポインタ
	push	ebp
	push	ds
	push	es
	push	ebx
	mov     ebp, ecx                    ; ebp = 引数のポインタ
	; プロテクトモード割り込みベクタを退避
	mov		ax,2502h                    ; 2502h: ネイティブ割り込みベクタ取得
	mov		cl,24h                      ;   24h: 取得割り込み番号
	int		21h                         ; → es:ebx にアドレスを返す
	mov		[ebp+4], ebx                ; アドレスを保存
	xor		ebx, ebx                    ; (まずebxをクリアしておいて)
	mov		bx,es                       ; (bx = es)
	mov		[ebp+8], ebx                ; セグメントを保存
	; リアルモード割り込みベクタを退避
	mov		ax,2503h                    ; リアルモード割り込みベクタ取得
	int		21h                         ; → ebx上位16bit: セグメントパラグラフ
	                                    ;    ebx下位16bit: オフセット
	mov		[ebp],ebx
	; ネイティブモード割り込みを再設定
	mov		ax,2506h                    ; 
	mov		cl,24h                      ;  24h: 設定割り込み番号
	push	cs
	pop		ds                          ; ds = cs (ハンドラのベースアドレス)
	mov		edx,offset _EIN_errhandle	; edx : ハンドラへのオフセット
	int		21h

	pop		ebx
	pop		es
	pop		ds
	pop		ebp
	ret
EIN_setVector	endp

;
;/*<Func>================================================================
;*   void EIN_resetVector(unsigned long *save );
;*
;*	【概  要】	int24hハンドラを復帰
;*
;*	【機  能】	
;*
;*	【入  力】	*save		: 古いINT24Hハンドラを保存した領域(12byte)
;*
;*	【注  意】	
;*
;*	【参  照】	
;*
;*-----------------------------------------------------------------------
;*	V11L10	1994.07.06/Nam
;*</Func>==============================================================*/
	public	EIN_resetVector
	db	'EIN_resetVector',15
	align	4
EIN_resetVector	proc	near
	mov     ecx,[esp+4]
	push	ebp
	mov		ebp,ecx                     ; ebp = 引数のポインタ
	push	ds
	push	ebx

	mov		ax,2507h                    ; リアルとネイティブのハンドラ設定
	mov		cl,24h                      ; 設定割り込み番号
	mov		ebx, [ebp]                  ; ebx = リアル割り込みハンドラ
	lds		edx, pword ptr [ebp+4]      ; ds:edx = プロテクト割り込みハンドラ
	int		21h

	pop		ebx
	pop		ds
	pop		ebp
	ret
EIN_resetVector	endp


EIN_ASMFUNC	ends
		end
