vsync2.asm
comment *
MASM32 SDK
ml /c /AT /Fl vsync2.asm
link16 /t vsync2;
*
		.model	tiny
 
TABLE		equ	0028h			; VSYNC
 
VRAMSEG		equ	0a000h
 
CLS		equ	1ah
ESCAPE		equ	1bh
 
		.code
		org	0100h
 
main		proc
		mov	ah, 02h
		mov	dl, CLS
		int	21h
		call	setvect
		out	64h, al			; VSYNCリセット
	@@loop:
		call	disp
		mov	ah, 0bh			; キーボードのステータスチェック
		int	21h
		cmp	al, 0
		je	@@loop
		mov	ah, 07h			; コンソールからの直接入力
		int	21h
		cmp	al, ESCAPE
		jne	@@loop
 
		call	resvect
		mov	ax, 4c00h
		int	21h
main		endp
 
myint0a		proc	far
		sti
 
		inc	cs:count
		out	64h, al			; VSYNCリセット
 
		jmp	cs:[vect]
;		iret
myint0a		endp
 
setvect		proc
		cli
		mov	ax, 0000h
		mov	es, ax
		mov	si, TABLE
 
		mov	ax, es:[si]
		mov	vect_off, ax
		mov	ax, es:[si+2]
		mov	vect_seg, ax
 
		mov	ax, offset myint0a
		mov	es:[si], ax
		mov	ax, cs			; = seg myint0a
		mov	es:[si+2], ax
 
		in	al, 02h
		and	al, 0fbh		; VSYNC割り込みマスク on
		out	02h, al
		jmp	$+2
		sti
		ret
setvect		endp
 
resvect		proc
		cli
		in	al, 02h
		or	al, 04h			; VSYNC割り込みマスク off
		out	02h, al
 
		mov	ax, 0000h
		mov	es, ax
		mov	si, TABLE
 
		mov	ax, vect_off
		mov	es:[si], ax
		mov	ax, vect_seg
		mov	es:[si+2], ax
 
		jmp	$+2
		sti
		ret
resvect		endp
 
disp		proc
		mov	ah, 00h			; 日付・時刻の読み出し
		push	cs
		pop	es
		mov	bx, offset clock
		int	1ch			; カレンダ時計のBIOS
 
		mov	al, clock[5]
		cmp	al, sec
		je	@@skip
		mov	sec, al
		mov	ax, count
		mov	dx, ax
		sub	ax, fps
		mov	fps, dx
		mov	di, offset buf
		call	todec5
	@@skip:
		mov	ax, count
		mov	di, offset buf + 6
		call	todec5
 
		mov	ax, VRAMSEG
		mov	es, ax
		mov	si, offset buf
		mov	di, 0
		cld
		mov	ah, 0
		mov	cx, 11
	@@loop:
		lodsb
		stosw
		loop	@@loop
 
		ret
disp		endp
 
; ax=数値 di=バッファ
todec5		proc
		add	di, 5
		mov	bx, 10
		mov	cx, 5
	@@loop:
		mov	dx, 0
		div	bx
		add	dl, '0'
		dec	di
		mov	[di], dl
		loop	@@loop
		ret
todec5		endp
 
vect		label	dword
vect_off	dw	?
vect_seg	dw	?
 
sec		db	-1
fps		dw	0
count		dw	0
clock		db	6 dup (?)
buf		db	'xxxxx xxxxx'
 
		end	main
 
最終更新:2018年08月23日 21:33