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