home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / ms_dos / timer / timer.asm next >
Assembly Source File  |  1990-06-14  |  23KB  |  1,149 lines

  1.     .sall
  2.     .286
  3. ;
  4. ;    Timer.asm ver. 4.10
  5. ;
  6. ;    FM-TOWNS(MS-DOS)用アラーム設定プログラム
  7. ;
  8. ;    使用システム:FM-TOWNS
  9. ;
  10. ;    使用OS:MS-DOS V3.1 L23
  11. ;
  12. ;    使用言語:OPTASM V1.6
  13. ;
  14. ;    使用法:timer <hh:mm:ss>[-a[m|s][-c<n>][-l][-d|+d<n>][-x<n>][-y<n>][-b<n>]
  15. ;        timer -r
  16. ;        timer
  17. ;
  18. ;        -<hh:mm:ss> : time to set alarm(00:00:00~23:59:59)
  19. ;        -a[m|s] : set After [minutes/second/hour]
  20. ;        -c[<n>] : Cancel <n>th alarm. (default last alarm)
  21. ;        -l      : Listing all alarm
  22. ;        +d<n>   : Display real time clock
  23. ;        -d      : cancel real time clock
  24. ;        -x<n>    : X position to display clock(0≦n≦72)
  25. ;        -y<n>    : Y position to display clock(0≦n≦24)
  26. ;        -b<n>    : Beep time (n = 0 : no beep, 1≦n≦6)
  27. ;        -r      : Release timer & cancel all alarm
  28. ;        -s    : Short size diplay clock(without second)
  29. ;
  30. ;    作成者:とくさん
  31. ;
  32. ;    作成日:'86年10月9日
  33. ;
  34. ;    更新日:'87年4月10日(version 3.0)
  35. ;    更新日:'88年2月19日(version 4.0)
  36. ;      a → -l, -r →  -a に変更
  37. ;      x,-y,-r の追加
  38. ;    更新日:'88年4月5日(version 4.01)
  39. ;    更新日:'89年8月13日(version 4.10)
  40. ;         s オプションの追加
  41. ;      TOWNS専用版
  42. ;    更新日:'89年8月21日(version 4.11)
  43. ;      +d オプションでの表示属性の指定追加
  44. ;      常駐サイズの縮小(432bytes)
  45.  
  46. ;
  47. ;    マクロ定義
  48. ;
  49. CR        equ     0dh
  50. LF        equ     0ah
  51. DOS        equ     21h
  52. TAB        equ     09h
  53. TRUE        equ     0ffh
  54. AFTER        equ     01h             ; 時刻の相対指定
  55. CANCEL        equ     02h             ; アラームの取消
  56. DISP_ON        equ     04h             ; リアルタイムa表示
  57. DISP_OFF    equ     08h             ; リアルタイム取消
  58. MINUTES        equ     10h             ; 分指定
  59. SECONDS        equ     20h             ; 秒指定
  60. ALARMS        equ     40h             ; アラーム設定時刻一覧出力
  61. EXIST        equ     80h             ; 常駐済
  62. SETPOS        equ    100h        ; タイマー表示位置指定
  63. SETBEEP        equ    200h        ; ビープ間隔
  64. SSIZE        equ    400h        ; 秒の表示なし
  65. RELEASE        equ    800h        ; タイマー常駐解放
  66. DEBUG        equ    8000h        ; デバッグオプション
  67. MAX_ALARM    equ    20        ; 同時に設定するアラーム数
  68. ;
  69. ;    アラームを表示する際の属性を定義
  70. ;
  71. COLOR        equ     6               ; 表示時刻の色
  72. REVERS        equ     0               ; 1なら反転
  73. BLINK        equ     0               ; 1なら点滅
  74. INTENT        equ     1               ; 1なら高輝度
  75. ATTR        equ     COLOR + REVERS*8 +  BLINK*16 + INTENT*32
  76. ;
  77. ;    アラームを表示する位置の定義
  78. ;
  79. CVRAM        equ     0c800h          ; キャラクタVRAMのセグメント
  80. X        equ     62        ; 時刻の表示位置(X座標)
  81. Y        equ     24              ; 時刻の表示位置(Y座標)
  82. ADRS        equ     (Y*80+X)*2      ; 時刻を表示するアドレス
  83. LEN        equ     8               ; 'hh:mm:ss' の長さ
  84. ;
  85. ;       ビープ出力用
  86. ;
  87. BEEP_INT    equ     0FFFFh          ; ビープ出力間隔
  88. BEEP_CNT    equ     10              ; ビープ出力回数
  89. ;
  90. JMPS        macro   lab
  91.         jmp     short lab
  92.         endm
  93. ;
  94. movseg        macro   dseg,sseg
  95.         push    sseg
  96.         pop     dseg
  97.         endm
  98. ;
  99. ;       文字列を標準出力に出力するマクロ
  100. ;
  101. PRINT        macro   msg
  102.         mov     dx,offset msg
  103.         mov     ah,09h
  104.         int     DOS
  105.         endm
  106. ;
  107. ;       時刻を取り出すマクロ
  108. ;
  109. GET_CLOCK    macro   cpb
  110.         mov     di,offset cpb
  111.         mov     ah,01h
  112.         int     96h
  113.         endm
  114. ;
  115. ;       時計パラメータの構造定義
  116. ;
  117. clock_param struc
  118.         dw      ?    ; 年(未使用)
  119.         db      ?    ; 月(未使用)
  120.         db      ?    ; 日(未使用)
  121.         db      ?    ; 曜日(未使用)
  122. hour        db      ?    ; 時
  123. minute        db      ?    ; 分
  124. second        db      ?    ; 秒
  125.         db      ?    ; 1/100秒(未使用)
  126.         db      0
  127. clock_param ends
  128. ;
  129. ;       時計管理パラメータ構造
  130. ;
  131. timer_param struc
  132. mode        db      ?    ; 設定モード
  133.         db      0h  
  134. ofs        dw      ?    ; 時計管理割り込み処理オフセット
  135. sgm        dw      ?    ;     〃            セグメント
  136. int_hi        dw      ?    ; 割り込み周期(HIGH)
  137. int_lo        dw      ?    ; 割り込み周期(LOW)
  138. timer_param ends
  139. ;
  140. ;       メモリコントロールブロック定義
  141. ;
  142. mcb_stru    struc
  143. mcb_id        db    ?
  144. psp_seg        dw      ?
  145. mcb_len        dw      ?
  146. mcb_stru    ends
  147. ;
  148. ;       プログラム本体
  149. ;
  150. code        segment byte
  151.         assume  cs:code, ds:code, ss:code, es:code
  152. ;
  153. ;       常  駐  部
  154. ;
  155.         org     80h
  156.  
  157. param        label   byte
  158. ;save_cvram    db      LEN*2 dup (?)   ; VRAMの退避エリア
  159. alarm_tab    db      3*MAX_ALARM dup (?) ; アラームテーブル
  160. alarm_tab_end    label    byte
  161.  
  162.         org     100h
  163. entry:
  164.         jmp     timer_main      ; メインルーチンへ
  165.  
  166. key_word    db      'timer v4.11',1Ah    ; 常駐チェック用キーワード
  167. key_length    equ     $-key_word      ; キーワードの長さ
  168. time_attr    db    ATTR        ; 時刻表示属性
  169. trap_no        db      TRUE            ; 時計管理番号
  170. time_no        db      TRUE            ; 時刻表示用管理番号
  171. time_len    db    3        ; 表示時刻の長さ
  172. ;v_bell        db    9        ; ヴィジブルベル
  173. disp_adrs    dw      ADRS            ; 時刻表示アドレス
  174. beep_wait    dw    BEEP_INT    ; ビープ間隔
  175. cpb1        clock_param <>
  176. ;
  177. ;       サブルーチン:時刻表示(割り込みで使用)
  178. ;
  179. ;disp_clock    proc    near
  180.  
  181. ;        GET_CLOCK  cpb1         ; 時刻の読み取り
  182. ;        movseg  es,CVRAM
  183. ;        mov     dl,time_attr     ; 属性をセット
  184. ;        xor    ch,ch
  185. ;        mov     cl,time_len
  186. ;        mov     di,disp_adrs    ; 時刻表示位置
  187. ;        mov     si,offset cpb1.hour
  188. ;        jmp     short put_clock
  189.  
  190. ;put_loop:
  191. ;        mov     al,':'
  192. ;        stosw
  193. ;put_clock:
  194. ;        lodsb
  195. ;        aam
  196. ;        or      ax,3030h
  197. ;        mov    dh,al
  198. ;        mov    al,ah
  199. ;        mov    ah,dl
  200. ;        stosw
  201. ;        mov     al,dh
  202. ;        stosw
  203. ;        loop    put_loop
  204. ;        ret
  205. ;
  206. ;disp_clock    endp
  207. ;
  208. ;       サブルーチン:指定時刻割り込み処理
  209. ;
  210. time_interrupt  proc    far
  211.  
  212.         cld
  213.         movseg  ds,cs
  214.         GET_CLOCK  cpb1         ; 時刻の読み取り
  215. ;        call    disp_clock    ; 時刻の表示
  216. ;        mov     di,offset save_cvram   ; CVRAMを退避
  217. ;        mov     si,ADRS
  218. ;        movseg    es,ds
  219. ;        push    ds
  220. ;        movseg  ds,CVRAM
  221. ;        mov     cx,LEN
  222. ;        rep     movsw
  223. ;        pop     ds
  224. ;        mov    bx,'A'
  225. ;        mov    dx,25*256+62
  226. ;        mov    ax,1300h
  227. ;        int    91h
  228. ;        call    disp_clock    ; 時刻の表示
  229. ;        mov    dx,0FD98h
  230. ;        in    al,dx
  231. ;        xchg    al,v_bell
  232.         mov    bx,beep_wait
  233.         mov     cx,BEEP_CNT    ; ビープを鳴らす
  234. beep:
  235.         push    cx
  236.         mov    cx,bx
  237. ;        jcxz    beep1
  238. ;        out    dx,al
  239.         xor     ah,ah
  240.         int     9eh
  241.         loop    $
  242.         mov    cx,bx
  243. ;        jcxz    beep2
  244. ;        xchg    al,v_bell
  245. ;        out    dx,al
  246.         mov     ah,01h
  247.         int     9eh
  248.         loop    $
  249.         pop     cx
  250.         loop    beep
  251. ;        mov     v_bell,al
  252. ;        movseg  es,CVRAM           ; 退避したCVRAMを復帰
  253. ;        mov     si,offset save_cvram
  254. ;        mov     di,disp_adrs
  255. ;        mov     cx,LEN
  256. ;        rep     movsw
  257.  
  258.         mov     si,offset cpb1.hour ; アラームテーブルの更新
  259.         mov     ax,word ptr [si]
  260.         mov     bl,byte ptr [si+2]
  261.         mov     di,offset alarm_tab
  262.         mov    dx,offset alarm_tab_end
  263. search_loop:
  264.         cmp     ax,word ptr [di]
  265.         jne     search_next
  266.         cmp     bl,byte ptr [di+2]
  267.         jae     found_time
  268. search_next:
  269.         cmp     di,dx
  270.         jae     quit
  271.         add     di,3
  272.         jmp     short   search_loop
  273. found_time:
  274.         mov     byte ptr [di],TRUE
  275. quit:
  276.         ret
  277.  
  278. time_interrupt  endp
  279. ;
  280. ;       サブルーチン:リアルタイム表示処理
  281. ;
  282. clock        proc    far
  283.  
  284.         cld
  285.         movseg  ds,cs
  286.         GET_CLOCK  cpb1         ; 時刻の読み取り
  287.         movseg  es,CVRAM
  288.         mov     dl,time_attr    ; 属性をセット
  289.         xor    ch,ch
  290.         mov     cl,time_len
  291.         mov     di,disp_adrs    ; 時刻表示位置
  292.         mov     si,offset cpb1.hour
  293.         jmp     short put_clock
  294.  
  295. put_loop:
  296.         mov     al,':'
  297.         stosw
  298. put_clock:
  299.         lodsb
  300.         aam
  301.         or      ax,3030h
  302.         mov    dh,al
  303.         mov    al,ah
  304.         mov    ah,dl
  305.         stosw
  306.         mov     al,dh
  307.         stosw
  308.         loop    put_loop
  309.  
  310.         ret
  311.  
  312. clock        endp
  313. ;
  314. ;       非  常 駐 部
  315. ;
  316. tpb        timer_param <>
  317. cpb2            clock_param <>
  318. flag            dw      0
  319. pos_x        db    X
  320. pos_y        db    Y
  321. ret_code    db    0
  322. exist_msg    db      '※timerが常駐しました。',CR,LF,'$'
  323. usage_msg    db    CR,LF,'--- Timer v4.11, (C) Copyright 1986-89, tokusan(k.tok) ---',CR,LF
  324.         db      CR,LF
  325.         db      'Usage :timer -<hh:mm:ss>[-{a|am|as}]'
  326.         db      '[-c<n>][+d<n>|-d][-l][-x<n>][-y<n>][-b<n>]'
  327.         db      CR,LF
  328.         db    TAB,'timer -r',CR,LF,CR,LF
  329.         db    TAB,'-<hh:mm:ss>: アラーム設定時刻(00:00:00~23:59:59)',CR,LF
  330.         db    TAB,'-{a|am|as} : 相対時間の指定{時|分|秒}',CR,LF
  331.         db    TAB,'-c[<n>]    : n番のアラームの取消(n省略時 : 最後に設定したアラーム)',CR,LF
  332.         db    TAB,'-l         : アラームリストの表示',CR,LF
  333.         db    TAB,'+d[<n>]    : 時刻表示(n:表示属性 0~31)',CR,LF
  334.         db    TAB,'-d         : 時刻表示停止',CR,LF
  335.         db    TAB,'-x[<n>]    : 時刻の表示位置X座標(0≦n≦72)',CR,LF
  336.         db    TAB,'-y[<n>]    : 時刻の表示位置Y座標(0≦n≦24)',CR,LF
  337.         db    TAB,'-b[<n>]    : アラームベルの長さ(0≦n≦6)',CR,LF
  338.         db    TAB,'-r         : timerの常駐解除',CR,LF
  339.         db      '$'
  340. mcb_msg        db    '☆MCBが壊れてます。',CR,LF,'$'
  341. now_time_msg1   db    '※現在の時刻は、$'
  342. now_time_msg2   db    'です。',CR,LF,'$'
  343. h        dw    ?
  344.         db    '時'
  345. m        dw    ?
  346.         db    '分'
  347. s        dw    ?
  348.         db    '秒$'
  349. alarm_cancel_error  db    '☆指定した番号のアラームがありません。'
  350.             db    CR,LF,'$'
  351. alarm_cancel_msg    db    '※ '
  352. alarm_cancel_no     dw    ?
  353.             db    ' 番のアラームを'
  354.             db    '取り消しました。',CR,LF,'$'
  355. set_alarm_error db    '☆アラームの設定が間違っています!',CR,LF,'$'
  356. set_alarm_msg1  db    '※設定時刻は、',CR,LF,'$'
  357. set_alarm_msg2  db    '  番号は、'
  358. set_no        dw    ?
  359.         db    ' です。',CR,LF,'$'
  360. set_alarm_over    db    '☆設定されているアラームが多過ぎます!',CR,LF,'$'
  361. alarm_tab_msg   db    '※現在設定されているアラームは、',CR,LF,'$'
  362. alarm_tab_msg1  db    '  ['
  363. alarm_tab_no    dw    ?
  364.         db    ']',TAB,'$'
  365. alarm_tab_msg2  db    CR,LF,'$'
  366. alarm_tab_msg3  db    '  ありません。',CR,LF,'$'
  367. release_msg    db    '※全てのアラームを取り消して常駐を解除しました。',CR,LF,'$'
  368. not_exist_msg    db    '☆timerが常駐していません。',CR,LF,'$'
  369. not_release_msg db    '☆メモリ解放できませんでした。',CR,LF,'$'
  370. debug_msg    db    'RC='
  371. rc        dw    ?
  372.         db    ' AN='
  373. an        dw    ?
  374.         db    ' TN='
  375. tn        dw    ?
  376.         db    CR,LF,'$'
  377. ;
  378. ;    タイマープログラム メイン・ルーチン
  379. ;
  380. timer_main:
  381.         cld
  382.  
  383.         call    get_time        ; 現在時刻を取り出し表示
  384.         call    check_exist     ; 常駐しているかチェック
  385.         call    get_param       ; パラメータの取り出し
  386. release_chk:
  387.         test    flag,RELEASE
  388.         jz    set_pos_chk
  389.         call    release_timer
  390.         jmp    timer_exit1
  391. set_pos_chk:
  392.         test    flag,SETPOS
  393.         jz    disp_on_chk
  394.         call    set_pos
  395. disp_on_chk:
  396.         test    flag,DISP_ON    ; リアルタイム表示?
  397.         jz      disp_off_chk
  398.         call    clock_on
  399. disp_off_chk:
  400.         test    flag,DISP_OFF   ; リアルタイム表示取消?
  401.         jz      cancel_chk
  402.         call    clock_off
  403. cancel_chk:
  404.         test    flag,CANCEL     ; アラームの取消?
  405.         jz      alarm_chk
  406.         call    alarm_cancel
  407. alarm_chk:
  408.         cmp     ch,TRUE         ; 時刻設定なし?
  409.         je      timer_exit_chk
  410.         test    flag,MINUTES    ; 分指定か
  411.         jz      second_chk
  412.         mov     dh,cl
  413.         mov     cl,ch
  414.         jmp     short second_chk1
  415. second_chk:
  416.         test    flag,SECONDS
  417.         jz      after_chk
  418.         mov     dh,ch
  419.         xor     cl,cl
  420. second_chk1:
  421.         xor     ch,ch
  422. after_chk:
  423.         test    flag,AFTER    ; 相対時間指定?
  424.         jz      alarm_set
  425.         call    add_time        ; 相対時間を現在時刻に加算
  426. alarm_set:
  427.         mov     cpb2.hour,ch
  428.         mov     cpb2.minute,cl
  429.         mov     cpb2.second,dh
  430.         call    set_alarm       ; 指定時刻割り込み処理の登録
  431. timer_exit_chk:
  432.         test    flag,EXIST      ; 常駐済?
  433.         jnz     timer_exit
  434.         PRINT   exist_msg
  435.         push    es
  436.         mov    es,word ptr ds:[2ch]
  437.         mov    ah,49h
  438.         int    DOS
  439.         pop    es
  440.         mov    di,offset alarm_tab
  441.         mov    cx,MAX_ALARM*3
  442.         mov    al,TRUE
  443.        rep    stosb
  444.         mov     dx,offset tpb
  445.         add     dx,0fh
  446.         shr     dx,4
  447.         test    flag,DEBUG
  448.         jz    timer_exit_chk1
  449.         call    disp_rc
  450. timer_exit_chk1:
  451.         mov    al,ret_code
  452.         mov     ah,31h        ; 常駐終了
  453.         int     DOS
  454. timer_exit:
  455.         test    flag,ALARMS     ; アラーム設定表の出力?
  456.         jz      timer_exit1
  457.         call    print_alarm_tab
  458. timer_exit1:
  459.         test    flag,DEBUG
  460.         jz    timer_exit2
  461.         call    disp_rc
  462. timer_exit2:
  463.         mov    al,ret_code
  464.         mov     ah,4ch        ; 非常駐終了
  465.         int     DOS
  466.  
  467. timer_usage:
  468.         PRINT   usage_msg
  469.         mov    ret_code,24
  470.         jmp    timer_exit1
  471.  
  472. ;
  473. ;    サブルーチン:常駐済かどうかのチェック
  474. ;
  475. ;    es <--- 常駐しているなら常駐ルーチンのセグメント
  476. ;    flag <- 常駐済なら EXIST
  477. ;    use reg : ax,bx,cx,si,di
  478. ;
  479. check_exist     proc    near
  480.  
  481.         mov    ah,52h
  482.         int    DOS
  483.         dec    bx
  484.         dec    bx
  485.         mov    ax,es:[bx]
  486.         mov    es,ax
  487.         mov    bx,ds
  488.         xor    ch,ch
  489. check_search:
  490.         cmp    byte ptr es:[mcb_id],'Z'
  491.         je    check_not_exist
  492.         cmp    byte ptr es:[mcb_id],'M'
  493.         jne    check_error
  494.         mov    dx,word ptr es:[psp_seg]
  495.         or    dx,dx            ; 空き領域
  496.         jz    check_next
  497.         cmp    bx,dx            ; 自分自身か?
  498.         je    check_next        ; 自分より後に常駐してるかも
  499.         mov    es,dx
  500.         mov     cl,key_length
  501.         mov     di,offset key_word
  502.         mov     si,di
  503.         repz    cmpsb            ; キーワードのチェック
  504.         je      check_exist_on
  505. check_next:
  506.         mov    es,ax
  507.         add    ax,word ptr es:[mcb_len]
  508.         inc    ax
  509.         mov    es,ax
  510.         jmp    check_search
  511. check_exist_on:                ; 常駐している
  512.         or      flag,EXIST
  513.         mov     al,es:trap_no   ; 以前の管理番号を取り出す
  514.         mov     trap_no,al
  515.         ret
  516. check_not_exist:            ; 常駐していない
  517.         movseg    es,ds        ;  ds == es
  518.  
  519. check_exist_exit:
  520.         ret
  521.  
  522. check_error:
  523.         PRINT    mcb_msg
  524.         mov    ret_code,25
  525.         jmp    timer_exit1
  526.  
  527. check_exist endp
  528. ;
  529. ;       サブルーチン:パラメータを取り出す
  530. ;
  531. ;       ch <---  時間    cl <---  分   dh <--- 秒
  532. ;       ds:trap_no <---  管理番号
  533. ;
  534. get_param    proc    near
  535.  
  536.         mov     ch,TRUE        ; 時間パラメータなしに初期化
  537.         clc
  538.         mov     si,offset param+1
  539. get_param_start:
  540.         lodsb
  541. get_param_begin:
  542.         call    skip_space
  543.         cmp    al,CR
  544.         jne    option_chk
  545.         jmp    get_param_exit
  546. option_chk:
  547.         cmp    al,'-'
  548.         je    get_option
  549.         cmp    al,'/'
  550.         je    get_option
  551.         cmp    al,'+'
  552.         je    get_plus_option
  553.         cmp    al,'9'
  554.         jbe    get_param_time
  555.         dec    si
  556.         JMPS    get_option_xx
  557. get_param_time:
  558.         cmp    ch,TRUE
  559.         jne    get_param_error
  560. get_param_hour:
  561.         xor     cx,cx
  562.         xor     dh,dh
  563.         dec     si
  564.         call    get_digit    ; 時間の取り出し
  565.         jc      get_param_error
  566.         mov     ch,al        ; 時間を ch に格納
  567.         lodsb
  568.         cmp     al,':'
  569.         jne     get_param_begin
  570. get_param_min:
  571.         call    get_digit    ; 分の取り出し
  572.         jc      get_param_error
  573.         mov     cl,al        ; 分を cl に格納
  574.         lodsb
  575.         cmp     al,':'
  576.         jne     get_param_begin
  577. get_param_sec:
  578.         call    get_digit    ; 秒の取り出し
  579.         jc      get_param_error
  580.         mov     dh,al            ; 秒を dh に格納
  581.         jmp     short get_param_start
  582.  
  583. get_param_error:
  584.         jmp     timer_usage
  585. ;
  586. ;    オプションの取り出し
  587. ;
  588. get_plus_option:
  589.         lodsb
  590.         and     al,0dfh
  591.         cmp     al,'D'        ; リアルタイム表示?
  592.         jne     get_option_00
  593.         cmp     es:time_no,TRUE
  594.         jne     get_plus_option1
  595.         or      flag,DISP_ON
  596. get_plus_option1:
  597.         call    get_digit
  598.         jc    get_option
  599.         mov    ah,al
  600.         and    al,0Fh
  601.         and    ah,0F0h
  602.         shl    ah,1
  603.         or     al,ah
  604.         cli
  605.         mov    es:time_attr,al
  606.         sti
  607. get_option:
  608.         lodsb
  609.         cmp    al,'A'
  610.         jb    get_param_begin
  611. get_option_xx:
  612.         and    al,0dfh        ; 英小文字を大文字に
  613. get_option_00:
  614.         cmp     al,'A'        ; 相対時間指定か?
  615.         jne     get_option_01
  616.         or      flag,AFTER
  617.         JMPS    get_option
  618. get_option_01:
  619.         cmp     al,'C'        ; アラームの取消か?
  620.         jne     get_option_03
  621.         or      flag,CANCEL
  622.         call    get_digit
  623.         jc      get_option_02
  624.         mov     trap_no,al
  625.         JMPS    get_option
  626. get_option_02:
  627.         clc
  628.         dec     si
  629.         JMPS    get_option
  630. get_option_03:
  631.         cmp     al,'D'        ; リアルタイム表示取消?
  632.         jne     get_option_04
  633.         cmp     es:time_no,TRUE
  634.         je      get_option
  635.         or      flag,DISP_OFF
  636.         jmp    get_option
  637. get_option_04:
  638.         cmp     al,'M'
  639.         jne     get_option_05
  640.         or      flag,MINUTES
  641.         jmp     get_option
  642. get_option_05:
  643.         cmp     al,'S'
  644.         jne     get_option_06
  645.         or      flag,SECONDS
  646.         jmp     get_option
  647. get_option_06:
  648.         cmp     al,'L'
  649.         jne     get_option_07
  650.         or      flag,ALARMS
  651.         jmp     get_option
  652. get_option_07:
  653.         cmp    al,'X'
  654.         jne    get_option_08
  655.         call    get_digit
  656.         jc    error_position
  657. ;        cmp    al,0
  658. ;        jb    error_position
  659. ;        cmp    al,72
  660. ;        ja    error_position
  661.         mov    pos_x,al
  662.         or    flag,SETPOS
  663.         jmp    get_option
  664. get_option_08:
  665.         cmp    al,'Y'
  666.         jne    get_option_09
  667.         call    get_digit
  668.         jc    error_position
  669. ;        cmp    al,0
  670. ;        jb    error_position
  671.         cmp    al,24
  672.         ja    error_position
  673.         mov    pos_y,al
  674.         or    flag,SETPOS
  675.         jmp    get_option
  676. error_position:
  677.         jmp    get_param_error
  678. get_option_09:
  679.         cmp    al,'B'
  680.         jne    get_option_10
  681.         call    get_digit
  682.         cmp    al,6
  683.         jbe    get_option_091
  684.         mov    al,6
  685. get_option_091:
  686.         call    set_beep_int
  687.         jmp    get_option
  688. get_option_10:
  689.         cmp    al,'Z'
  690.         jne    get_option_11
  691.         or    flag,DEBUG
  692.         jmp    get_option
  693. get_option_11:
  694.         cmp    al,'P'
  695.         jne    get_option_99
  696.         mov    es:time_len,2
  697.         jmp    get_option
  698. get_option_99:
  699.         cmp    al,'R'
  700.         jne    error_position
  701.         or    flag,RELEASE
  702.  
  703. get_param_exit:
  704.         ret
  705. ;
  706. ;       サブルーチン:空白及びタブの読みとばし
  707. ;
  708. skip_space    proc    near
  709.  
  710.         cmp     al,' '
  711.         je      skip_space_next
  712.         cmp     al,TAB
  713.         jne     skip_space_exit
  714.  
  715. skip_space_next:
  716.         lodsb
  717.         jmp     short skip_space
  718.  
  719. skip_space_exit:
  720.         ret
  721.  
  722. skip_space    endp
  723. ;
  724. ;       サブルーチン:2桁以内の10進数字を取り出し2進に変換
  725. ;
  726. get_digit    proc    near
  727.  
  728.         lodsb
  729.         cmp     al,'0'
  730.         jb      get_digit_error
  731.         cmp     al,'9'
  732.         ja      get_digit_error
  733.         and     al,0fh
  734.         mov     bl,al
  735.         shl     al,2
  736.         add     al,bl
  737.         shl     al,1
  738.         mov     ah,al
  739.  
  740.         lodsb
  741.         cmp     al,'0'
  742.         jb      get_1_digit
  743.         cmp     al,'9'
  744.         ja      get_1_digit
  745.         and     al,0fh
  746.         add     al,ah
  747.         jmp     short get_digit_exit
  748.  
  749. get_digit_error:
  750.         stc
  751.         ret
  752.  
  753. get_1_digit:
  754.         mov     al,bl
  755.         dec     si
  756. get_digit_exit:
  757.         clc
  758.         ret
  759.  
  760. get_digit    endp
  761.  
  762. get_param    endp
  763. ;
  764. ;    サブルーチン:時刻を標準出力に出力
  765. ;
  766. disp_time    proc    near
  767.  
  768.         mov     si,offset cpb2.hour
  769.         push    cx
  770.         mov     di,offset h
  771.         mov     cx,3
  772.         xor     ah,ah
  773. mov_time_loop:
  774.         lodsb
  775.         aam
  776.         or      ax,3030h
  777.         xchg    ah,al
  778.         mov     [di],ax
  779.         add     di,4
  780.         loop    mov_time_loop
  781.         PRINT   h
  782.         pop     cx
  783.         ret
  784.  
  785. disp_time    endp
  786. ;
  787. ;    サブルーチン:現在時刻を読み取り、出力
  788. ;
  789. get_time    proc    near
  790.  
  791.         push    dx
  792.         GET_CLOCK   cpb2
  793.         mov    al,cpb2.hour
  794.         mov    ret_code,al    ; errorlevel に時間を返す
  795.         PRINT   now_time_msg1
  796.         call    disp_time
  797.         PRINT   now_time_msg2
  798.         pop     dx
  799.         ret
  800.  
  801. get_time    endp
  802. ;
  803. ;    サブルーチン:リアルタイム表示設定
  804. ;
  805. clock_on    proc    near
  806.  
  807.         mov     di,offset tpb
  808.         mov     ax,offset clock
  809.         mov     [di].mode,0
  810.         mov     [di].ofs,ax
  811.         mov     [di].sgm,es
  812.         mov     [di].int_hi,0
  813.         mov     [di].int_lo,100
  814.         xor     ah,ah
  815.         int     97h
  816.         mov     es:time_no,al
  817.         ret
  818.  
  819. clock_on    endp
  820. ;
  821. ;    サブルーチン:リアルタイム表示取り消し
  822. ;    use : ax,di,cx
  823. ;
  824. clock_off    proc    near
  825.  
  826.         mov     al,es:time_no
  827.         mov     ah,01h
  828.         int     97h
  829.         mov     es:time_no,TRUE
  830.         push    es
  831.         push    cx
  832.         mov    di,es:disp_adrs
  833.         mov    cx,LEN
  834.         mov    ax,0720h
  835.         movseg    es,CVRAM
  836.         cli
  837. clock_off1:
  838.         rep stosw
  839.         sti
  840.         pop    cx
  841.         pop    es
  842.         ret
  843.  
  844. clock_off    endp
  845. ;
  846. ;    サブルーチン:アラームの取り消し
  847. ;
  848. alarm_cancel    proc    near
  849.  
  850.         push    dx
  851.         mov     ah,01h
  852.         mov     al,trap_no
  853.         int     98h
  854.         jnc     alarm_cancel_exit
  855.         PRINT   alarm_cancel_error
  856.         mov    ret_code,26
  857.         JMPS    alarm_cancel_ret
  858.  
  859. alarm_cancel_exit:
  860.         mov     al,trap_no
  861.         cbw
  862.         push    ax
  863.         mov     di,offset alarm_tab
  864.         shl     ax,1
  865.         add     di,ax
  866.         pop     ax
  867.         add     di,ax
  868.         mov     byte ptr es:[di],TRUE
  869.         mov     dl,10
  870.         div     dl
  871.         or      ax,3030h
  872.         mov     alarm_cancel_no,ax
  873.         PRINT   alarm_cancel_msg
  874. alarm_cancel_ret:
  875.         pop     dx
  876.         ret
  877.  
  878. alarm_cancel    endp
  879. ;
  880. ;    サブルーチン:相対時間を現在時刻に加算
  881. ;
  882. add_time    proc    near
  883.  
  884.         add     dh,cpb2.second
  885.         cmp     dh,60
  886.         jb      add_min
  887.         sub     dh,60
  888.         inc     cl
  889. add_min:
  890.         add     cl,cpb2.minute
  891.         cmp     cl,60
  892.         jb      add_hour
  893.         sub     cl,60
  894.         inc     ch
  895. add_hour:
  896.         add     ch,cpb2.hour
  897.         cmp     ch,24
  898.         jb      add_time_exit
  899.         sub     ch,24
  900. add_time_exit:
  901.         ret
  902.  
  903. add_time    endp
  904. ;
  905. ;    サブルーチン:アラームの設定
  906. ;
  907. set_alarm    proc    near
  908.  
  909.         mov     di,offset tpb
  910.         mov     ax,offset time_interrupt
  911.         mov     [di].ofs,ax
  912.         mov     [di].sgm,es
  913.         mov     [di].mode,81h
  914.         mov     [di].int_lo,00h
  915.         mov     [di].int_hi,10h
  916.         xor     ah,ah
  917.         int     98h                 ; 時間割り込み処理を登録
  918.         jnc     set_alarm_exit
  919.         push    ax
  920.         PRINT   set_alarm_error
  921.         pop     ax
  922.         add    ah,30
  923.         jmp    timer_exit1
  924. set_alarm_exit:
  925.         mov     es:trap_no,al
  926.         push    ax
  927.         shl     ax,1
  928.         mov     di,offset alarm_tab
  929.         add     di,ax
  930.         pop     ax
  931.         add     di,ax
  932.         cmp     di,offset alarm_tab_end
  933.         ja      set_alarm_exit2
  934.         mov     si,offset cpb2.hour
  935.         mov     cx,3
  936.         rep     movsb
  937. set_alarm_exit1:
  938.         mov     cl,10
  939.         div     cl
  940.         or      ax,3030h
  941.         mov     set_no,ax
  942.         PRINT   set_alarm_msg1
  943.         call    disp_time
  944.         PRINT   set_alarm_msg2
  945.         ret
  946. set_alarm_exit2:
  947.         PRINT    set_alarm_over
  948.         mov    ah,01
  949.         mov    al,es:trap_no
  950.         int    98h
  951.         mov    al,27
  952.         jmp    timer_exit1
  953.  
  954. set_alarm    endp
  955. ;
  956. ;    サブルーチン:アラームテーブル出力
  957. ;
  958. print_alarm_tab proc    near
  959.  
  960.         mov     bp,offset alarm_tab
  961.         PRINT   alarm_tab_msg
  962.         xor     cx,cx
  963.         xor     bx,bx
  964. print_tab_loop:
  965.         mov     ax,word ptr es:[bp]
  966.         cmp     ah,60
  967.         jae     print_tab_next
  968.         cmp     al,24
  969.         jae     print_tab_next
  970.         mov     word ptr cpb2.hour,ax
  971.         mov     al,byte ptr es:[bp+2]
  972.         cmp     al,60
  973.         jae     print_tab_next
  974.         mov     cpb2.second,al
  975.         mov     bl,10
  976.         mov     ax,cx
  977.         div     bl
  978.         or      ax,3030h
  979.         mov     alarm_tab_no,ax
  980.         PRINT   alarm_tab_msg1
  981.         call    disp_time
  982.         PRINT   alarm_tab_msg2
  983. print_tab_next:
  984.         inc     cx
  985.         add     bp,3
  986.         cmp     bp,offset alarm_tab_end
  987.         jb      print_tab_loop
  988.         or      bl,bl
  989.         jnz     print_tab_exit
  990.         PRINT   alarm_tab_msg3
  991. print_tab_exit:
  992.         ret
  993.  
  994. print_alarm_tab endp
  995. ;
  996. ;    サブルーチン:時刻表示位置の設定
  997. ;
  998. set_pos        proc    near
  999.  
  1000.         push    ax
  1001.         push    bx
  1002.         push    cx
  1003.         cmp    es:time_no,TRUE
  1004.         je    set_pos1
  1005.         call    clock_off
  1006.         or    flag,DISP_ON
  1007. set_pos1:
  1008.         mov    bl,80
  1009.         mov    al,byte ptr pos_x
  1010.         sub    bl,al
  1011.         cmp    bl,es:time_len
  1012.         jae    set_pos2
  1013.         mov    al,80
  1014.         sub    al,es:time_len
  1015. set_pos2:
  1016.         cbw
  1017.         shl    ax,1
  1018.         mov    bx,ax
  1019.         mov    al,byte ptr pos_y
  1020.         cbw
  1021.         shl    ax,5
  1022.         mov    cx,ax
  1023.         shl    ax,2
  1024.         add    ax,cx
  1025.         add    ax,bx
  1026.         cli
  1027.         mov    es:disp_adrs,ax
  1028.         sti
  1029.         pop    cx
  1030.         pop    bx
  1031.         pop    ax
  1032.         ret
  1033.  
  1034. set_pos        endp
  1035. ;
  1036. ;    サブルーチン:常駐の解放
  1037. ;
  1038. release_timer        proc    near
  1039.  
  1040.         test    flag,EXIST
  1041.         jz    release_not_exist
  1042.         cmp    es:[time_no],TRUE
  1043.         je    release_alarm0
  1044.         call    clock_off
  1045. release_alarm0:
  1046.         mov    si,offset alarm_tab
  1047.         xor    cl,cl
  1048. release_alarm:
  1049.         cmp    byte ptr es:[si],TRUE
  1050.         je    release_alarm_next
  1051.         mov     ah,01h
  1052.         mov     al,cl
  1053.         int     98h
  1054. release_alarm_next:
  1055.         inc    si
  1056.         inc    si
  1057.         inc    si
  1058.         inc    cl
  1059.         cmp    si,offset alarm_tab_end
  1060.         jb    release_alarm
  1061. ;        push    es
  1062. ;        mov    es,es:[2ch]
  1063. ;        mov    ah,49h
  1064. ;        int    DOS
  1065. ;        jc    release_error
  1066. ;        pop    es
  1067.         mov    ah,49h
  1068.         int    DOS
  1069.         jc    release_error
  1070.         PRINT    release_msg
  1071.         ret
  1072.         
  1073. release_not_exist:
  1074.         PRINT    not_exist_msg
  1075.         mov    al,28
  1076.         jmp    timer_exit1
  1077.  
  1078. release_error:
  1079.         PRINT    not_release_msg
  1080.         mov    al,29
  1081.         jmp    timer_exit1
  1082.  
  1083.  
  1084. release_timer    endp
  1085. ;
  1086. ;    サブルーチン:ビープ間隔の設定
  1087. ;
  1088. set_beep_int    proc    near
  1089.  
  1090.         push    cx
  1091.         push    dx
  1092.         cmp    al,0
  1093.         jae    set_beep_int1
  1094.         xor    al,al
  1095. set_beep_int1:
  1096.         cbw
  1097.         mov    cx,ax
  1098.         mov    ax,10000
  1099.         mul    cx
  1100.         mov    es:beep_wait,ax
  1101.         pop    dx
  1102.         pop    cx
  1103.         ret
  1104.  
  1105. set_beep_int    endp
  1106. ;
  1107. ;    サブルーチン:リターンコードの表示
  1108. ;
  1109. disp_rc        proc    near
  1110.  
  1111.         mov    al,ret_code
  1112.         xor    ah,ah
  1113.         aam
  1114.         xchg    ah,al
  1115.         or    ax,3030h
  1116.         mov    rc,ax
  1117.         mov    al,es:trap_no
  1118.         cmp    al,100
  1119.         jb    disp_rc1
  1120.         mov    ax,'FF'
  1121.         JMPS    disp_rc2
  1122. disp_rc1:
  1123.         xor    ah,ah
  1124.         aam
  1125.         xchg    ah,al
  1126.         or    ax,3030h
  1127. disp_rc2:
  1128.         mov    an,ax
  1129.         mov    al,es:time_no
  1130.         cmp    al,100
  1131.         jb    disp_rc3
  1132.         mov    ax,'FF'
  1133.         JMPS    disp_rc4
  1134. disp_rc3:
  1135.         xor    ah,ah
  1136.         aam
  1137.         xchg    ah,al
  1138.         or    ax,3030h
  1139. disp_rc4:
  1140.         mov    tn,ax
  1141.         PRINT    debug_msg
  1142.         ret
  1143.  
  1144. disp_rc        endp
  1145.  
  1146. code        ends
  1147.  
  1148.         end     entry
  1149.