;==============================================================================
;	<< 386ASM V2.0 >>  for  FM TOWNS
;==============================================================================
.386p
		PAGE		60,132
		NAME		CRITICAL
		TITLE		CRITICAL ERROR Interrupt
;==============================================================================
;	致命的ｴﾗｰ処理(CTRL+Cﾏｽｸ処理)
;
;	CREATE : 1990.06.01
;	FINISH : 1990.06.02
;
;	< High C からの呼出形式 >
;	extern	INT24_mask() ;
;	INT24_mask() ;
;
;	< note > : TABS = 4
;
;	< History >
;	1990.06.01 : CREATE
;	1991.06.07 : 清書
;
;	Programmed by Y.Hirata ( Nifty-ID : NAB03321 )
;==============================================================================
;
INCLUDE	hc.inc								;
;
CGROUP	GROUP pmcode, CODE					;
;
;--------------------------------------------
		public	INT24_mask					; 致命的ｴﾗｰ割り込み登録
;--------------------------------------------
;
DOSERROR_IGNORE	EQU		0					; 無視
DOSERROR_RETRY	EQU		1					; 再試行
DOSERROR_ABORT	EQU		2					; ﾌﾟﾛｸﾞﾗﾑ中止
DOSERROR_FAIL	EQU		3					; ﾌｧﾝｸｼｮﾝｺｰﾙ失敗
;
;////////////////////////////////////////////
;			ネイティブ部
;////////////////////////////////////////////
;
;********************************************
;	致命的ｴﾗｰﾊﾝﾄﾞﾗ/ﾈｲﾃｨﾌﾞ処理
;********************************************
;
pmcode	SEGMENT								;
		ASSUME	cs:CGROUP					;
;
;--------------------------------------------
;	致命的ｴﾗｰﾈｲﾃｨﾌﾞﾊﾝﾄﾞﾗ
;--------------------------------------------
		ALIGN	4							; dword boundary
INT24_hook	PROC	FAR						;
			cli								;
			mov		al,DOSERROR_FAIL		; ﾌｧﾝｸｼｮﾝｺｰﾙ失敗としてﾘﾀｰﾝ
			iretd							; 割り込み復帰
INT24_hook	ENDP							;
;
;--------------------------------------------
;	CTRL+C ﾈｲﾃｨﾌﾞﾊﾝﾄﾞﾗ
;--------------------------------------------
		ALIGN	4							; dword boundary
INT23_hook	PROC	FAR						;
			iretd							;
INT23_hook	ENDP							;
;
;--------------------------------------------
;	致命的ｴﾗｰ割り込み登録
;--------------------------------------------
		ALIGN	4							; dword boundary
INT24_mask	PROC	NEAR					;
			push	ebp						;
			mov		ebp,esp					; ｽﾀｯｸﾌﾚｰﾑ形成
;
			push	ds						;
			push	es						;
			push	edx						;
			push	ecx						;
;
			push	cs						;
			pop		ds						; ds = cs
;
			cli								;
			lea		edx,INT23_hook			;
			mov		cl,23h					; CTRL+Cの割り込み番号
			mov		ax,2506h				; ﾈｲﾃｨﾌﾞﾊﾝﾄﾞﾗの登録
			sti								;
			int		INT_DOS					;
;
			cli								;
			lea		edx,INT24_hook			;
			mov		cl,24h					; 致命的ｴﾗｰの割り込み番号
			mov		ax,2506h				; ﾈｲﾃｨﾌﾞﾊﾝﾄﾞﾗの登録
			sti								;
			int		INT_DOS					;
;
			pop		ecx						;
			pop		edx						;
			pop		es						;
			pop		ds						;
			xor		eax,eax					; return code = 0
;
			pop		ebp						; ｽﾀｯｸﾌﾚｰﾑ開放
			ret								;
INT24_mask	ENDP							;
;
pmcode		ENDS							;
;
		END

