home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
ms_dos
/
timer
/
timer.asm
next >
Wrap
Assembly Source File
|
1990-06-14
|
23KB
|
1,149 lines
.sall
.286
;
; Timer.asm ver. 4.10
;
; FM-TOWNS(MS-DOS)用アラーム設定プログラム
;
; 使用システム:FM-TOWNS
;
; 使用OS:MS-DOS V3.1 L23
;
; 使用言語:OPTASM V1.6
;
; 使用法:timer <hh:mm:ss>[-a[m|s][-c<n>][-l][-d|+d<n>][-x<n>][-y<n>][-b<n>]
; timer -r
; timer
;
; -<hh:mm:ss> : time to set alarm(00:00:00~23:59:59)
; -a[m|s] : set After [minutes/second/hour]
; -c[<n>] : Cancel <n>th alarm. (default last alarm)
; -l : Listing all alarm
; +d<n> : Display real time clock
; -d : cancel real time clock
; -x<n> : X position to display clock(0≦n≦72)
; -y<n> : Y position to display clock(0≦n≦24)
; -b<n> : Beep time (n = 0 : no beep, 1≦n≦6)
; -r : Release timer & cancel all alarm
; -s : Short size diplay clock(without second)
;
; 作成者:とくさん
;
; 作成日:'86年10月9日
;
; 更新日:'87年4月10日(version 3.0)
; 更新日:'88年2月19日(version 4.0)
; a → -l, -r → -a に変更
; x,-y,-r の追加
; 更新日:'88年4月5日(version 4.01)
; 更新日:'89年8月13日(version 4.10)
; s オプションの追加
; TOWNS専用版
; 更新日:'89年8月21日(version 4.11)
; +d オプションでの表示属性の指定追加
; 常駐サイズの縮小(432bytes)
;
; マクロ定義
;
CR equ 0dh
LF equ 0ah
DOS equ 21h
TAB equ 09h
TRUE equ 0ffh
AFTER equ 01h ; 時刻の相対指定
CANCEL equ 02h ; アラームの取消
DISP_ON equ 04h ; リアルタイムa表示
DISP_OFF equ 08h ; リアルタイム取消
MINUTES equ 10h ; 分指定
SECONDS equ 20h ; 秒指定
ALARMS equ 40h ; アラーム設定時刻一覧出力
EXIST equ 80h ; 常駐済
SETPOS equ 100h ; タイマー表示位置指定
SETBEEP equ 200h ; ビープ間隔
SSIZE equ 400h ; 秒の表示なし
RELEASE equ 800h ; タイマー常駐解放
DEBUG equ 8000h ; デバッグオプション
MAX_ALARM equ 20 ; 同時に設定するアラーム数
;
; アラームを表示する際の属性を定義
;
COLOR equ 6 ; 表示時刻の色
REVERS equ 0 ; 1なら反転
BLINK equ 0 ; 1なら点滅
INTENT equ 1 ; 1なら高輝度
ATTR equ COLOR + REVERS*8 + BLINK*16 + INTENT*32
;
; アラームを表示する位置の定義
;
CVRAM equ 0c800h ; キャラクタVRAMのセグメント
X equ 62 ; 時刻の表示位置(X座標)
Y equ 24 ; 時刻の表示位置(Y座標)
ADRS equ (Y*80+X)*2 ; 時刻を表示するアドレス
LEN equ 8 ; 'hh:mm:ss' の長さ
;
; ビープ出力用
;
BEEP_INT equ 0FFFFh ; ビープ出力間隔
BEEP_CNT equ 10 ; ビープ出力回数
;
JMPS macro lab
jmp short lab
endm
;
movseg macro dseg,sseg
push sseg
pop dseg
endm
;
; 文字列を標準出力に出力するマクロ
;
PRINT macro msg
mov dx,offset msg
mov ah,09h
int DOS
endm
;
; 時刻を取り出すマクロ
;
GET_CLOCK macro cpb
mov di,offset cpb
mov ah,01h
int 96h
endm
;
; 時計パラメータの構造定義
;
clock_param struc
dw ? ; 年(未使用)
db ? ; 月(未使用)
db ? ; 日(未使用)
db ? ; 曜日(未使用)
hour db ? ; 時
minute db ? ; 分
second db ? ; 秒
db ? ; 1/100秒(未使用)
db 0
clock_param ends
;
; 時計管理パラメータ構造
;
timer_param struc
mode db ? ; 設定モード
db 0h
ofs dw ? ; 時計管理割り込み処理オフセット
sgm dw ? ; 〃 セグメント
int_hi dw ? ; 割り込み周期(HIGH)
int_lo dw ? ; 割り込み周期(LOW)
timer_param ends
;
; メモリコントロールブロック定義
;
mcb_stru struc
mcb_id db ?
psp_seg dw ?
mcb_len dw ?
mcb_stru ends
;
; プログラム本体
;
code segment byte
assume cs:code, ds:code, ss:code, es:code
;
; 常 駐 部
;
org 80h
param label byte
;save_cvram db LEN*2 dup (?) ; VRAMの退避エリア
alarm_tab db 3*MAX_ALARM dup (?) ; アラームテーブル
alarm_tab_end label byte
org 100h
entry:
jmp timer_main ; メインルーチンへ
key_word db 'timer v4.11',1Ah ; 常駐チェック用キーワード
key_length equ $-key_word ; キーワードの長さ
time_attr db ATTR ; 時刻表示属性
trap_no db TRUE ; 時計管理番号
time_no db TRUE ; 時刻表示用管理番号
time_len db 3 ; 表示時刻の長さ
;v_bell db 9 ; ヴィジブルベル
disp_adrs dw ADRS ; 時刻表示アドレス
beep_wait dw BEEP_INT ; ビープ間隔
cpb1 clock_param <>
;
; サブルーチン:時刻表示(割り込みで使用)
;
;disp_clock proc near
; GET_CLOCK cpb1 ; 時刻の読み取り
; movseg es,CVRAM
; mov dl,time_attr ; 属性をセット
; xor ch,ch
; mov cl,time_len
; mov di,disp_adrs ; 時刻表示位置
; mov si,offset cpb1.hour
; jmp short put_clock
;put_loop:
; mov al,':'
; stosw
;put_clock:
; lodsb
; aam
; or ax,3030h
; mov dh,al
; mov al,ah
; mov ah,dl
; stosw
; mov al,dh
; stosw
; loop put_loop
; ret
;
;disp_clock endp
;
; サブルーチン:指定時刻割り込み処理
;
time_interrupt proc far
cld
movseg ds,cs
GET_CLOCK cpb1 ; 時刻の読み取り
; call disp_clock ; 時刻の表示
; mov di,offset save_cvram ; CVRAMを退避
; mov si,ADRS
; movseg es,ds
; push ds
; movseg ds,CVRAM
; mov cx,LEN
; rep movsw
; pop ds
; mov bx,'A'
; mov dx,25*256+62
; mov ax,1300h
; int 91h
; call disp_clock ; 時刻の表示
; mov dx,0FD98h
; in al,dx
; xchg al,v_bell
mov bx,beep_wait
mov cx,BEEP_CNT ; ビープを鳴らす
beep:
push cx
mov cx,bx
; jcxz beep1
; out dx,al
xor ah,ah
int 9eh
loop $
mov cx,bx
; jcxz beep2
; xchg al,v_bell
; out dx,al
mov ah,01h
int 9eh
loop $
pop cx
loop beep
; mov v_bell,al
; movseg es,CVRAM ; 退避したCVRAMを復帰
; mov si,offset save_cvram
; mov di,disp_adrs
; mov cx,LEN
; rep movsw
mov si,offset cpb1.hour ; アラームテーブルの更新
mov ax,word ptr [si]
mov bl,byte ptr [si+2]
mov di,offset alarm_tab
mov dx,offset alarm_tab_end
search_loop:
cmp ax,word ptr [di]
jne search_next
cmp bl,byte ptr [di+2]
jae found_time
search_next:
cmp di,dx
jae quit
add di,3
jmp short search_loop
found_time:
mov byte ptr [di],TRUE
quit:
ret
time_interrupt endp
;
; サブルーチン:リアルタイム表示処理
;
clock proc far
cld
movseg ds,cs
GET_CLOCK cpb1 ; 時刻の読み取り
movseg es,CVRAM
mov dl,time_attr ; 属性をセット
xor ch,ch
mov cl,time_len
mov di,disp_adrs ; 時刻表示位置
mov si,offset cpb1.hour
jmp short put_clock
put_loop:
mov al,':'
stosw
put_clock:
lodsb
aam
or ax,3030h
mov dh,al
mov al,ah
mov ah,dl
stosw
mov al,dh
stosw
loop put_loop
ret
clock endp
;
; 非 常 駐 部
;
tpb timer_param <>
cpb2 clock_param <>
flag dw 0
pos_x db X
pos_y db Y
ret_code db 0
exist_msg db '※timerが常駐しました。',CR,LF,'$'
usage_msg db CR,LF,'--- Timer v4.11, (C) Copyright 1986-89, tokusan(k.tok) ---',CR,LF
db CR,LF
db 'Usage :timer -<hh:mm:ss>[-{a|am|as}]'
db '[-c<n>][+d<n>|-d][-l][-x<n>][-y<n>][-b<n>]'
db CR,LF
db TAB,'timer -r',CR,LF,CR,LF
db TAB,'-<hh:mm:ss>: アラーム設定時刻(00:00:00~23:59:59)',CR,LF
db TAB,'-{a|am|as} : 相対時間の指定{時|分|秒}',CR,LF
db TAB,'-c[<n>] : n番のアラームの取消(n省略時 : 最後に設定したアラーム)',CR,LF
db TAB,'-l : アラームリストの表示',CR,LF
db TAB,'+d[<n>] : 時刻表示(n:表示属性 0~31)',CR,LF
db TAB,'-d : 時刻表示停止',CR,LF
db TAB,'-x[<n>] : 時刻の表示位置X座標(0≦n≦72)',CR,LF
db TAB,'-y[<n>] : 時刻の表示位置Y座標(0≦n≦24)',CR,LF
db TAB,'-b[<n>] : アラームベルの長さ(0≦n≦6)',CR,LF
db TAB,'-r : timerの常駐解除',CR,LF
db '$'
mcb_msg db '☆MCBが壊れてます。',CR,LF,'$'
now_time_msg1 db '※現在の時刻は、$'
now_time_msg2 db 'です。',CR,LF,'$'
h dw ?
db '時'
m dw ?
db '分'
s dw ?
db '秒$'
alarm_cancel_error db '☆指定した番号のアラームがありません。'
db CR,LF,'$'
alarm_cancel_msg db '※ '
alarm_cancel_no dw ?
db ' 番のアラームを'
db '取り消しました。',CR,LF,'$'
set_alarm_error db '☆アラームの設定が間違っています!',CR,LF,'$'
set_alarm_msg1 db '※設定時刻は、',CR,LF,'$'
set_alarm_msg2 db ' 番号は、'
set_no dw ?
db ' です。',CR,LF,'$'
set_alarm_over db '☆設定されているアラームが多過ぎます!',CR,LF,'$'
alarm_tab_msg db '※現在設定されているアラームは、',CR,LF,'$'
alarm_tab_msg1 db ' ['
alarm_tab_no dw ?
db ']',TAB,'$'
alarm_tab_msg2 db CR,LF,'$'
alarm_tab_msg3 db ' ありません。',CR,LF,'$'
release_msg db '※全てのアラームを取り消して常駐を解除しました。',CR,LF,'$'
not_exist_msg db '☆timerが常駐していません。',CR,LF,'$'
not_release_msg db '☆メモリ解放できませんでした。',CR,LF,'$'
debug_msg db 'RC='
rc dw ?
db ' AN='
an dw ?
db ' TN='
tn dw ?
db CR,LF,'$'
;
; タイマープログラム メイン・ルーチン
;
timer_main:
cld
call get_time ; 現在時刻を取り出し表示
call check_exist ; 常駐しているかチェック
call get_param ; パラメータの取り出し
release_chk:
test flag,RELEASE
jz set_pos_chk
call release_timer
jmp timer_exit1
set_pos_chk:
test flag,SETPOS
jz disp_on_chk
call set_pos
disp_on_chk:
test flag,DISP_ON ; リアルタイム表示?
jz disp_off_chk
call clock_on
disp_off_chk:
test flag,DISP_OFF ; リアルタイム表示取消?
jz cancel_chk
call clock_off
cancel_chk:
test flag,CANCEL ; アラームの取消?
jz alarm_chk
call alarm_cancel
alarm_chk:
cmp ch,TRUE ; 時刻設定なし?
je timer_exit_chk
test flag,MINUTES ; 分指定か
jz second_chk
mov dh,cl
mov cl,ch
jmp short second_chk1
second_chk:
test flag,SECONDS
jz after_chk
mov dh,ch
xor cl,cl
second_chk1:
xor ch,ch
after_chk:
test flag,AFTER ; 相対時間指定?
jz alarm_set
call add_time ; 相対時間を現在時刻に加算
alarm_set:
mov cpb2.hour,ch
mov cpb2.minute,cl
mov cpb2.second,dh
call set_alarm ; 指定時刻割り込み処理の登録
timer_exit_chk:
test flag,EXIST ; 常駐済?
jnz timer_exit
PRINT exist_msg
push es
mov es,word ptr ds:[2ch]
mov ah,49h
int DOS
pop es
mov di,offset alarm_tab
mov cx,MAX_ALARM*3
mov al,TRUE
rep stosb
mov dx,offset tpb
add dx,0fh
shr dx,4
test flag,DEBUG
jz timer_exit_chk1
call disp_rc
timer_exit_chk1:
mov al,ret_code
mov ah,31h ; 常駐終了
int DOS
timer_exit:
test flag,ALARMS ; アラーム設定表の出力?
jz timer_exit1
call print_alarm_tab
timer_exit1:
test flag,DEBUG
jz timer_exit2
call disp_rc
timer_exit2:
mov al,ret_code
mov ah,4ch ; 非常駐終了
int DOS
timer_usage:
PRINT usage_msg
mov ret_code,24
jmp timer_exit1
;
; サブルーチン:常駐済かどうかのチェック
;
; es <--- 常駐しているなら常駐ルーチンのセグメント
; flag <- 常駐済なら EXIST
; use reg : ax,bx,cx,si,di
;
check_exist proc near
mov ah,52h
int DOS
dec bx
dec bx
mov ax,es:[bx]
mov es,ax
mov bx,ds
xor ch,ch
check_search:
cmp byte ptr es:[mcb_id],'Z'
je check_not_exist
cmp byte ptr es:[mcb_id],'M'
jne check_error
mov dx,word ptr es:[psp_seg]
or dx,dx ; 空き領域
jz check_next
cmp bx,dx ; 自分自身か?
je check_next ; 自分より後に常駐してるかも
mov es,dx
mov cl,key_length
mov di,offset key_word
mov si,di
repz cmpsb ; キーワードのチェック
je check_exist_on
check_next:
mov es,ax
add ax,word ptr es:[mcb_len]
inc ax
mov es,ax
jmp check_search
check_exist_on: ; 常駐している
or flag,EXIST
mov al,es:trap_no ; 以前の管理番号を取り出す
mov trap_no,al
ret
check_not_exist: ; 常駐していない
movseg es,ds ; ds == es
check_exist_exit:
ret
check_error:
PRINT mcb_msg
mov ret_code,25
jmp timer_exit1
check_exist endp
;
; サブルーチン:パラメータを取り出す
;
; ch <--- 時間 cl <--- 分 dh <--- 秒
; ds:trap_no <--- 管理番号
;
get_param proc near
mov ch,TRUE ; 時間パラメータなしに初期化
clc
mov si,offset param+1
get_param_start:
lodsb
get_param_begin:
call skip_space
cmp al,CR
jne option_chk
jmp get_param_exit
option_chk:
cmp al,'-'
je get_option
cmp al,'/'
je get_option
cmp al,'+'
je get_plus_option
cmp al,'9'
jbe get_param_time
dec si
JMPS get_option_xx
get_param_time:
cmp ch,TRUE
jne get_param_error
get_param_hour:
xor cx,cx
xor dh,dh
dec si
call get_digit ; 時間の取り出し
jc get_param_error
mov ch,al ; 時間を ch に格納
lodsb
cmp al,':'
jne get_param_begin
get_param_min:
call get_digit ; 分の取り出し
jc get_param_error
mov cl,al ; 分を cl に格納
lodsb
cmp al,':'
jne get_param_begin
get_param_sec:
call get_digit ; 秒の取り出し
jc get_param_error
mov dh,al ; 秒を dh に格納
jmp short get_param_start
get_param_error:
jmp timer_usage
;
; オプションの取り出し
;
get_plus_option:
lodsb
and al,0dfh
cmp al,'D' ; リアルタイム表示?
jne get_option_00
cmp es:time_no,TRUE
jne get_plus_option1
or flag,DISP_ON
get_plus_option1:
call get_digit
jc get_option
mov ah,al
and al,0Fh
and ah,0F0h
shl ah,1
or al,ah
cli
mov es:time_attr,al
sti
get_option:
lodsb
cmp al,'A'
jb get_param_begin
get_option_xx:
and al,0dfh ; 英小文字を大文字に
get_option_00:
cmp al,'A' ; 相対時間指定か?
jne get_option_01
or flag,AFTER
JMPS get_option
get_option_01:
cmp al,'C' ; アラームの取消か?
jne get_option_03
or flag,CANCEL
call get_digit
jc get_option_02
mov trap_no,al
JMPS get_option
get_option_02:
clc
dec si
JMPS get_option
get_option_03:
cmp al,'D' ; リアルタイム表示取消?
jne get_option_04
cmp es:time_no,TRUE
je get_option
or flag,DISP_OFF
jmp get_option
get_option_04:
cmp al,'M'
jne get_option_05
or flag,MINUTES
jmp get_option
get_option_05:
cmp al,'S'
jne get_option_06
or flag,SECONDS
jmp get_option
get_option_06:
cmp al,'L'
jne get_option_07
or flag,ALARMS
jmp get_option
get_option_07:
cmp al,'X'
jne get_option_08
call get_digit
jc error_position
; cmp al,0
; jb error_position
; cmp al,72
; ja error_position
mov pos_x,al
or flag,SETPOS
jmp get_option
get_option_08:
cmp al,'Y'
jne get_option_09
call get_digit
jc error_position
; cmp al,0
; jb error_position
cmp al,24
ja error_position
mov pos_y,al
or flag,SETPOS
jmp get_option
error_position:
jmp get_param_error
get_option_09:
cmp al,'B'
jne get_option_10
call get_digit
cmp al,6
jbe get_option_091
mov al,6
get_option_091:
call set_beep_int
jmp get_option
get_option_10:
cmp al,'Z'
jne get_option_11
or flag,DEBUG
jmp get_option
get_option_11:
cmp al,'P'
jne get_option_99
mov es:time_len,2
jmp get_option
get_option_99:
cmp al,'R'
jne error_position
or flag,RELEASE
get_param_exit:
ret
;
; サブルーチン:空白及びタブの読みとばし
;
skip_space proc near
cmp al,' '
je skip_space_next
cmp al,TAB
jne skip_space_exit
skip_space_next:
lodsb
jmp short skip_space
skip_space_exit:
ret
skip_space endp
;
; サブルーチン:2桁以内の10進数字を取り出し2進に変換
;
get_digit proc near
lodsb
cmp al,'0'
jb get_digit_error
cmp al,'9'
ja get_digit_error
and al,0fh
mov bl,al
shl al,2
add al,bl
shl al,1
mov ah,al
lodsb
cmp al,'0'
jb get_1_digit
cmp al,'9'
ja get_1_digit
and al,0fh
add al,ah
jmp short get_digit_exit
get_digit_error:
stc
ret
get_1_digit:
mov al,bl
dec si
get_digit_exit:
clc
ret
get_digit endp
get_param endp
;
; サブルーチン:時刻を標準出力に出力
;
disp_time proc near
mov si,offset cpb2.hour
push cx
mov di,offset h
mov cx,3
xor ah,ah
mov_time_loop:
lodsb
aam
or ax,3030h
xchg ah,al
mov [di],ax
add di,4
loop mov_time_loop
PRINT h
pop cx
ret
disp_time endp
;
; サブルーチン:現在時刻を読み取り、出力
;
get_time proc near
push dx
GET_CLOCK cpb2
mov al,cpb2.hour
mov ret_code,al ; errorlevel に時間を返す
PRINT now_time_msg1
call disp_time
PRINT now_time_msg2
pop dx
ret
get_time endp
;
; サブルーチン:リアルタイム表示設定
;
clock_on proc near
mov di,offset tpb
mov ax,offset clock
mov [di].mode,0
mov [di].ofs,ax
mov [di].sgm,es
mov [di].int_hi,0
mov [di].int_lo,100
xor ah,ah
int 97h
mov es:time_no,al
ret
clock_on endp
;
; サブルーチン:リアルタイム表示取り消し
; use : ax,di,cx
;
clock_off proc near
mov al,es:time_no
mov ah,01h
int 97h
mov es:time_no,TRUE
push es
push cx
mov di,es:disp_adrs
mov cx,LEN
mov ax,0720h
movseg es,CVRAM
cli
clock_off1:
rep stosw
sti
pop cx
pop es
ret
clock_off endp
;
; サブルーチン:アラームの取り消し
;
alarm_cancel proc near
push dx
mov ah,01h
mov al,trap_no
int 98h
jnc alarm_cancel_exit
PRINT alarm_cancel_error
mov ret_code,26
JMPS alarm_cancel_ret
alarm_cancel_exit:
mov al,trap_no
cbw
push ax
mov di,offset alarm_tab
shl ax,1
add di,ax
pop ax
add di,ax
mov byte ptr es:[di],TRUE
mov dl,10
div dl
or ax,3030h
mov alarm_cancel_no,ax
PRINT alarm_cancel_msg
alarm_cancel_ret:
pop dx
ret
alarm_cancel endp
;
; サブルーチン:相対時間を現在時刻に加算
;
add_time proc near
add dh,cpb2.second
cmp dh,60
jb add_min
sub dh,60
inc cl
add_min:
add cl,cpb2.minute
cmp cl,60
jb add_hour
sub cl,60
inc ch
add_hour:
add ch,cpb2.hour
cmp ch,24
jb add_time_exit
sub ch,24
add_time_exit:
ret
add_time endp
;
; サブルーチン:アラームの設定
;
set_alarm proc near
mov di,offset tpb
mov ax,offset time_interrupt
mov [di].ofs,ax
mov [di].sgm,es
mov [di].mode,81h
mov [di].int_lo,00h
mov [di].int_hi,10h
xor ah,ah
int 98h ; 時間割り込み処理を登録
jnc set_alarm_exit
push ax
PRINT set_alarm_error
pop ax
add ah,30
jmp timer_exit1
set_alarm_exit:
mov es:trap_no,al
push ax
shl ax,1
mov di,offset alarm_tab
add di,ax
pop ax
add di,ax
cmp di,offset alarm_tab_end
ja set_alarm_exit2
mov si,offset cpb2.hour
mov cx,3
rep movsb
set_alarm_exit1:
mov cl,10
div cl
or ax,3030h
mov set_no,ax
PRINT set_alarm_msg1
call disp_time
PRINT set_alarm_msg2
ret
set_alarm_exit2:
PRINT set_alarm_over
mov ah,01
mov al,es:trap_no
int 98h
mov al,27
jmp timer_exit1
set_alarm endp
;
; サブルーチン:アラームテーブル出力
;
print_alarm_tab proc near
mov bp,offset alarm_tab
PRINT alarm_tab_msg
xor cx,cx
xor bx,bx
print_tab_loop:
mov ax,word ptr es:[bp]
cmp ah,60
jae print_tab_next
cmp al,24
jae print_tab_next
mov word ptr cpb2.hour,ax
mov al,byte ptr es:[bp+2]
cmp al,60
jae print_tab_next
mov cpb2.second,al
mov bl,10
mov ax,cx
div bl
or ax,3030h
mov alarm_tab_no,ax
PRINT alarm_tab_msg1
call disp_time
PRINT alarm_tab_msg2
print_tab_next:
inc cx
add bp,3
cmp bp,offset alarm_tab_end
jb print_tab_loop
or bl,bl
jnz print_tab_exit
PRINT alarm_tab_msg3
print_tab_exit:
ret
print_alarm_tab endp
;
; サブルーチン:時刻表示位置の設定
;
set_pos proc near
push ax
push bx
push cx
cmp es:time_no,TRUE
je set_pos1
call clock_off
or flag,DISP_ON
set_pos1:
mov bl,80
mov al,byte ptr pos_x
sub bl,al
cmp bl,es:time_len
jae set_pos2
mov al,80
sub al,es:time_len
set_pos2:
cbw
shl ax,1
mov bx,ax
mov al,byte ptr pos_y
cbw
shl ax,5
mov cx,ax
shl ax,2
add ax,cx
add ax,bx
cli
mov es:disp_adrs,ax
sti
pop cx
pop bx
pop ax
ret
set_pos endp
;
; サブルーチン:常駐の解放
;
release_timer proc near
test flag,EXIST
jz release_not_exist
cmp es:[time_no],TRUE
je release_alarm0
call clock_off
release_alarm0:
mov si,offset alarm_tab
xor cl,cl
release_alarm:
cmp byte ptr es:[si],TRUE
je release_alarm_next
mov ah,01h
mov al,cl
int 98h
release_alarm_next:
inc si
inc si
inc si
inc cl
cmp si,offset alarm_tab_end
jb release_alarm
; push es
; mov es,es:[2ch]
; mov ah,49h
; int DOS
; jc release_error
; pop es
mov ah,49h
int DOS
jc release_error
PRINT release_msg
ret
release_not_exist:
PRINT not_exist_msg
mov al,28
jmp timer_exit1
release_error:
PRINT not_release_msg
mov al,29
jmp timer_exit1
release_timer endp
;
; サブルーチン:ビープ間隔の設定
;
set_beep_int proc near
push cx
push dx
cmp al,0
jae set_beep_int1
xor al,al
set_beep_int1:
cbw
mov cx,ax
mov ax,10000
mul cx
mov es:beep_wait,ax
pop dx
pop cx
ret
set_beep_int endp
;
; サブルーチン:リターンコードの表示
;
disp_rc proc near
mov al,ret_code
xor ah,ah
aam
xchg ah,al
or ax,3030h
mov rc,ax
mov al,es:trap_no
cmp al,100
jb disp_rc1
mov ax,'FF'
JMPS disp_rc2
disp_rc1:
xor ah,ah
aam
xchg ah,al
or ax,3030h
disp_rc2:
mov an,ax
mov al,es:time_no
cmp al,100
jb disp_rc3
mov ax,'FF'
JMPS disp_rc4
disp_rc3:
xor ah,ah
aam
xchg ah,al
or ax,3030h
disp_rc4:
mov tn,ax
PRINT debug_msg
ret
disp_rc endp
code ends
end entry