;==============================================================================
;	<< 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	int (*INT24_entry)( unsigned,unsigned ) ;
;	extern	INT24_init() ;
;
;	static int critical_handler( unsigned di,unsigned ax ) ;
;	INT24_entry = critical_handler ;
;	INT24_init() ;
;
;	< note > : TABS = 4
;
;	< History >
;	1990.06.01 : CREATE
;	1991.04.23 : 清書
;
;	Programmed by Y.Hirata ( Nifty-ID : NAB03321 )
;==============================================================================
;
INCLUDE	hc.inc								;
;
CGROUP	GROUP pmcode, CODE					;
DGROUP	GROUP pmdata, DATA					;
;
;--------------------------------------------
		public	INT24_init					; 致命的ｴﾗｰ割り込み登録
		public	INT24_entry					; 致命的ｴﾗｰﾊﾝﾄﾞﾗ･ｱﾄﾞﾚｽ(ﾈｲﾃｨﾌﾞ)
;--------------------------------------------
;
;////////////////////////////////////////////
;			ネイティブ部
;////////////////////////////////////////////
;
;********************************************
;	致命的ｴﾗｰﾈｲﾃｨﾌﾞﾊﾝﾄﾞﾗ内での使用データ領域
;********************************************
;
DATA	SEGMENT								;
;
;--------------------------------------------
			public	INT24errno				;
;--------------------------------------------
INT24errno		DW		0					; 致命的ｴﾗｰｺｰﾄﾞ
;
ErrorBlock	STRUC							; 致命的ｴﾗｰ情報
	extcode		DW		0					; 拡張ｴﾗｰｺｰﾄﾞ
	class		DB		0					; ｴﾗｰｸﾗｽ
	action		DB		0					; ｴﾗｰ対処
	locus		DB		0					; ｴﾗｰ発生場所
ErrorBlock	ENDS							;
;
;--------------------------------------------
			public	INT24err				;
;--------------------------------------------
INT24err	ErrorBlock	<>					; 致命的ｴﾗｰ情報格納領域
;
Regs_sp			DD		0					; ｽﾀｯｸ退避用(ESP)
Regs_ss			DW		0					; ｽﾀｯｸ退避用(SS)
;
				DB		32768 DUP (?)		; ﾈｲﾃｨﾌﾞ･ﾛｰｶﾙｽﾀｯｸｻｲｽﾞ(適当)
TmpSTACK 		LABEL	byte				;
;
DATA	ENDS								;
;
;
;********************************************
;	致命的ｴﾗｰﾊﾝﾄﾞﾗ/ﾈｲﾃｨﾌﾞ処理
;********************************************
;
pmcode	SEGMENT								;
		ASSUME	cs:CGROUP, ds:DGROUP		;
;
INT24_entry		DD		?					; 致命的ｴﾗｰﾊﾝﾄﾞﾗｱﾄﾞﾚｽ
;
;--------------------------------------------
;	致命的ｴﾗｰﾈｲﾃｨﾌﾞﾊﾝﾄﾞﾗ
;--------------------------------------------
		ALIGN	4							; dword boundary
INT24_hook	PROC	FAR						;
			cli								;
			push	ds						;
;
			push	eax						;
			mov		ax,DATASEG				; ﾃﾞｰﾀｾｸﾞﾒﾝﾄ設定
			mov		ds,ax					;
			pop		eax						;
;
			mov		word PTR Regs_ss,ss		; ｽﾀｯｸ退避
			mov		dword PTR Regs_sp,esp	;
;
			push	ds						;
			pop		ss						; ss = ds
			mov		esp,OFFSET TmpSTACK		; ﾛｰｶﾙｽﾀｯｸの確保
;
			push	gs						; 全てのﾚｼﾞｽﾀ退避
			push	fs						;
			push	es						;
			push	ebp						;
			push	edi						;
			push	esi						;
			push	edx						;
			push	ecx						;
			push	ebx						;
			push	eax						; INT24h発生時のEAX
;
			mov		ax,ds					;
			mov		es,ax					;
			mov		fs,ax					;
			mov		gs,ax					; gs = fs = es = ds
;
			mov		ax,di					;
			and		ax,00FFh				; 下位ﾊﾞｲﾄのみ
			mov		INT24errno,ax			;
;
			sti								;
			cld								;
;
			push	ecx						;
			push	esi						;
			push	edi						;
			push	ebp						;
			push	es						;
			push	ds						;
			mov		ah,59h					;
			mov		bx,ZERO					;
			int		INT_DOS					; 拡張ｴﾗｰｺｰﾄﾞの取得
;
			pop		ds						; ﾚｼﾞｽﾀ復元(拡張ｴﾗｰｺｰﾄﾞ取得時に
			pop		es						; 破壊されるﾚｼﾞｽﾀ)
			pop		ebp						;
			pop		edi						;
			pop		esi						;
			pop		ecx						;
;
			mov		dx,bx					;
			mov		bx,OFFSET INT24err		; 致命的ｴﾗｰ情報格納領域 : [BX]
			mov		[bx].extcode,ax			; 拡張ｴﾗｰｺｰﾄﾞ
			mov		[bx].class,dh			; ｴﾗｰｸﾗｽ
			mov		[bx].action,dl			; 可能な対処
			mov		[bx].locus,ch			; ｴﾗｰ発生場所
;
			pop		eax						; INT24h発生時のEAX
			push	eax						; ﾃﾞﾊﾞｲｽのｴﾗｰｺｰﾄﾞ(第二引数)
			push	edi						; 致命的ｴﾗｰｺｰﾄﾞ  (第一引数)
			call	dword PTR cs:INT24_entry
											; 致命的ｴﾗｰ処理ﾙｰﾁﾝを呼ぶ(HighC用)
			add		esp,8					; C言語ｲﾝﾀｰﾌｪｰｽのｽﾀｯｸを元に戻す｡
;
			cli								;
			pop		ebx						; 全てのﾚｼﾞｽﾀ復元(EAX除く)
			pop		ecx						;
			pop		edx						;
			pop		esi						;
			pop		edi						;
			pop		ebp						;
			pop		es						;
			pop		fs						;
			pop		gs						;
;
			mov		ss,word PTR Regs_ss		; ｽﾀｯｸを元に戻す
			mov		esp,dword PTR Regs_sp	;
;
			pop		ds						;
			sti								;
			iretd							; 割り込み復帰
INT24_hook	ENDP							;
;
;--------------------------------------------
;	CTRL+C ﾈｲﾃｨﾌﾞﾊﾝﾄﾞﾗ
;--------------------------------------------
		ALIGN	4							; dword boundary
INT23_hook	PROC	FAR						;
			iretd							;
INT23_hook	ENDP							;
;
;--------------------------------------------
;	致命的ｴﾗｰ割り込み登録
;--------------------------------------------
		ALIGN	4							; dword boundary
INT24_init	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_init	ENDP							;
;
pmcode		ENDS							;
;
		END

