home *** CD-ROM | disk | FTP | other *** search
- .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