;==============================================================================
;	<< MASM V5.1 >>  for  FM TOWNS
;==============================================================================
	page		60,132
	name		VSYNC
	title		VSYNC
;==============================================================================
;	VSYNC割り込み
;
;	CREATE : 1990.08.17
;	FINISH : 1990.08.20  V0.50
;
;	MSC 用 関数(ｽﾓｰﾙﾓﾃﾞﾙ)
;	-- ｲﾝﾀｰﾊﾞﾙﾀｲﾏの使用 --
;	VSYNC_init(void) ;
;	VSYNC_release(void) ;
;
;	< HISTORY >
;	1990.08.17 : CREATE
;
;	All Rights Reserved, Copyright (C) Y.Hirata 1990.
;
;	Programmed by Y.Hirata ( NIFTY-ID : NAB03321 )
;==============================================================================
;
			.286							;
			.MODEL	SMALL,C					;
			.STACK	100h					;
;
;********************************************
;			データ領域
;********************************************
			.DATA							;
;
			public	Vcount					;
Vcount			dw		?					; VSYNCｶｳﾝﾀ
;
;
;********************************************
;			コード領域
;********************************************
			.CODE							;
;
COPYRIGHT	db			0Dh
			db			'     ',0Dh,0Ah,07h
			db			0Dh,0Ah,'        '
			db			'VSYNC INTERRUPT V0.50   1990-08-17',0Dh,0Ah
			db			0Dh,0Ah,'        '
			db			'Copyright (C) Y.Hirata 1990.'
			db			0Dh,0Ah,0Dh,0Ah,1Ah
;
TITLE_name	db			'VSYNC INTERRUPT'
TITLE_len	EQU			$-TITLE_name
;
;
;********************************************
;			定数定義
;********************************************
TRUE		EQU			1
FALSE		EQU			0
;
ZERO		EQU			0
;
INT_INT		EQU			0AEh				; 割り込み管理BIOS
INT_NUM		EQU			00Bh				; IRQ B (ｵﾌﾟｼｮﾝﾎﾞｰﾄﾞ)
IRQ_0B_ON	EQU			08h					; IRQ B 割り込み許可 (11 ﾋﾞｯﾄ)
IRQ_0B_OFF	EQU			0F7h				; IRQ B 割り込み不許可 (11 ﾋﾞｯﾄ)
VSYNC_CLR	EQU			05CAh				; VSYNC割り込み原因ｸﾘｱﾚｼﾞｽﾀ
;
;
;********************************************
;			データ定義
;********************************************
vsync_flg		DB		0					; VSYNC割り込みは許可されているか？
;
int_mask_data	label	BYTE				; 割り込み許可ﾃﾞｰﾀ
				db		?					; ﾋﾞｯﾄ 31～24		+0
				db		?					; ﾋﾞｯﾄ 23～16		+1
				db		?					; ﾋﾞｯﾄ 15～ 8		+2
				db		?					; ﾋﾞｯﾄ  7～ 0		+3
;
vsync_offset	dw		?					; 割り込みﾃﾞｰﾀﾌﾞﾛｯｸ･ｵﾌｾｯﾄ
vsync_segment	dw		?					; 割り込みﾃﾞｰﾀﾌﾞﾛｯｸ･ｾｸﾞﾒﾝﾄ
;
vsync_adrs		db		0					; 割り込みﾃﾞｰﾀﾌﾞﾛｯｸ..
				db		0					;
				dw		OFFSET VSYNC_handr	; ﾊﾝﾄﾞﾗｱﾄﾞﾚｽ･ｵﾌｾｯﾄ
				dw		?					; ﾊﾝﾄﾞﾗｱﾄﾞﾚｽ･ｾｸﾞﾒﾝﾄ
;
;
;********************************************
;			VSYNCﾊﾝﾄﾞﾗ
;********************************************
VSYNC_handr		proc	FAR					;
			push	ds						;
			push	dx						;
;
			cli								;
			mov		dx,VSYNC_CLR			;
			out		dx,al					; ﾀﾞﾐｰﾗｲﾄ (VSYNC割り込み原因ｸﾘｱ)
			sti								;
;
			mov		ax,@data				; load ds
			mov		ds,ax					;
			mov		ax,Vcount				;
			inc		ax						;
			mov		Vcount,ax				; VSYNCｶｳﾝﾀ･ｲﾝｸﾘﾒﾝﾄ
;
			pop		dx						;
			pop		ds						;
			lds		di,DWORD ptr cs:vsync_offset
											; 本来のVSYNCﾊﾝﾄﾞﾗに処理を移す
			jmp		DWORD ptr ds:[di+2]		; Jump Real Handler
;
			ret
VSYNC_handr		endp						;
;
;********************************************
;			VSYNC割り込みの登録
;********************************************
VSYNC_init		proc	NEAR				;
			push	ds						;
			push	di						;
			push	dx						;
;
			push	cs						;
			pop		ds						; ds = cs
;
			mov		ah,01h					;
			mov		dl,INT_NUM				; 割り込み要因ｺｰﾄﾞ
			int		INT_INT					; 割り込みﾃﾞｰﾀﾌﾞﾛｯｸｱﾄﾞﾚｽの取り出し
;
			mov		cs:vsync_offset,di		; ﾃﾞｰﾀﾌﾞﾛｯｸｱﾄﾞﾚｽ･ｵﾌｾｯﾄ
			mov		cs:vsync_segment,ds		; ﾃﾞｰﾀﾌﾞﾛｯｸｱﾄﾞﾚｽ･ｾｸﾞﾒﾝﾄ
;
			push	cs						;
			pop		ds						; ds = cs
;
			mov		WORD ptr cs:[vsync_adrs+4],cs
											; VSYNC ﾊﾝﾄﾞﾗのｾｸﾞﾒﾝﾄ
			mov		ah,00h					;
			mov		dl,INT_NUM				; 割り込み要因ｺｰﾄﾞ
			mov		di,offset cs:vsync_adrs	;
			int		INT_INT					; 割り込みﾃﾞｰﾀﾌﾞﾛｯｸｱﾄﾞﾚｽの登録
;
			mov		ah,03h					;
			mov		di,offset cs:int_mask_data	; 割り込み許可ﾃﾞｰﾀ
			int		INT_INT					; 割り込み管理ﾃﾞｰﾀの取り出し
;
			mov		cs:vsync_flg,FALSE		;
			test	byte PTR cs:[di+2],IRQ_0B_ON
			jz		int_enable				;
			mov		cs:vsync_flg,TRUE		; VSYNC割り込み許可済
;
int_enable:									;
			or		BYTE ptr [di+2],IRQ_0B_ON
											; VSYNC 割り込みの許可
			mov		ah,02h					;
			int		INT_INT					; 割り込み許可ﾃﾞｰﾀの書き込み
;
			shr		ax,8					; ﾘﾀｰﾝｺｰﾄﾞ
;
			pop		dx						;
			pop		di						;
			pop		ds						;
			ret								;
VSYNC_init		endp						;
;
;********************************************
;			VSYNC割り込みの取消
;********************************************
VSYNC_release	proc	near				;
			push	ds						;
			push	di						;
			push	dx						;
;
			push	cs						;
			pop		ds						; ds = cs
;
			mov		ah,03h					;
			mov		di,offset cs:int_mask_data	; 割り込み許可ﾃﾞｰﾀ
			int		INT_INT					; 割り込み管理ﾃﾞｰﾀの取り出し
			and 	BYTE ptr [di+2],IRQ_0B_OFF
											; VSYNC 割り込みの禁止
			cmp		cs:vsync_flg,TRUE		;
			jne		vsync_permission		;
			or		byte PTR cs:[di+2],IRQ_0B_ON
											; VSYNC 割り込み許可
;
vsync_permission:							;
			mov		ah,02h					;
			int		INT_INT					; 割り込み許可ﾃﾞｰﾀの書き込み
;
			mov		ah,00h					;
			mov		dl,INT_NUM				; 割り込み要因ｺｰﾄﾞ
			lds		di,DWORD ptr cs:vsync_offset
											; 割り込みﾃﾞｰﾀﾌﾞﾛｯｸ
			int		INT_INT					; 割り込みﾃﾞｰﾀﾌﾞﾛｯｸｱﾄﾞﾚｽの登録
;
			shr		ax,8					; ﾘﾀｰﾝｺｰﾄﾞ
;
			pop		dx						;
			pop		di						;
			pop		ds						;
			ret								;
VSYNC_release	endp						;
;
;
			end

