home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / pao / ms_dos / aclamp / rlamp.asm < prev    next >
Assembly Source File  |  1980-01-02  |  12KB  |  472 lines

  1. ;==============================================================================
  2. ;    << MASM V5.1 >>  for  FM TOWNS
  3. ;==============================================================================
  4.     page        60,132
  5.     name        R_LAMP
  6.     title        Access Lamp FMR
  7. ;==============================================================================
  8. ;    Access Lamp Program FMR 内蔵HD(ユニットNo.0) 専用
  9. ;
  10. ;    CREATE : 1990.06.03
  11. ;    FINISH : 1990.06.03  V0.70R
  12. ;
  13. ;    < HISTORY >
  14. ;    1990.06.03 : CREATE
  15. ;
  16. ;    All Rights Reserved, Copyright (C) Y.Hirata 1990.
  17. ;
  18. ;    Programed by Y.Hirata ( NIFTY-ID : NAB03321 )
  19. ;==============================================================================
  20. ;
  21. code        segment
  22.             assume    cs:code,ds:code,es:code,ss:code
  23. ;
  24. ;--------------------------------------------
  25.             org 000h
  26. SEGTOP        label    WORD
  27. ;--------------------------------------------
  28. ;
  29. ;--------------------------------------------
  30.             org 02ch
  31. ENVADRS        label    WORD
  32. ;--------------------------------------------
  33. ;
  34. ;--------------------------------------------
  35.             org    080h
  36. ARGUMENT    label    WORD
  37. ;--------------------------------------------
  38. ;
  39. ;--------------------------------------------
  40.             org    100h
  41. entry:        jmp    main
  42. ;--------------------------------------------
  43. ;
  44. COPYRIGHT    db            0Dh
  45.             db            '     ',0Dh,0Ah,07h
  46.             db            0Dh,0Ah,'        '
  47.             db            'ACCESS LAMP  V0.70R   1990-06-03',0Dh,0Ah
  48.             db            0Dh,0Ah,'        '
  49.             db            'Copyright (C) Y.Hirata 1990.'
  50.             db            0Dh,0Ah,0Dh,0Ah,1Ah
  51. ;
  52. TITLE_name    db            'ACCESS LAMP FMR'
  53. TITLE_len    EQU            $-TITLE_name
  54. ;
  55. TRUE        EQU            1
  56. FALSE        EQU            0
  57. ;
  58. ZERO        EQU            0
  59. ;
  60. ERACE_CNT    EQU            30                    ; x 10 msec ( 0.30s )
  61. ;
  62. DEV_HD        EQU            0B0h                ; デバイス : HD
  63. ;
  64. DEF_ATR        EQU            0                    ; 表示属性(デフォルト)
  65. DEF_COLOR    EQU            1                    ; 表示色(デフォルト)
  66. ;
  67. READ_ATR    EQU            020h                ; 強調/リバース
  68. READ_COLOR    EQU            4                    ; GREEN
  69. WRITE_ATR    EQU            020h                ; 強調/リバース
  70. WRITE_COLOR    EQU            2                    ; RED
  71. ;
  72. S_CLM        EQU            68                    ; 表示開始位置(桁)
  73. ;
  74. DispBlock    struc                            ; 表示情報格納領域
  75.     Moff    dw            ?                    ; 文字    : オフセット  ;+0
  76.     Mseg    dw            ?                    ;         : セグメント ;+2
  77.     Aoff    dw            ?                    ; アトリビュート: オフセット  ;+4
  78.     Aseg    dw            ?                    ;         : セグメント ;+6
  79. DispBlock    ends                            ;
  80. ;
  81. ;
  82. ;********************************************
  83. ;            データ領域
  84. ;********************************************
  85. ;
  86. vct_93h        dd        far                        ; ディスクBIOS
  87. vct_40h        dd        far                        ; インターバルタイマ
  88. ;
  89. time_cnt    dw        ZERO                    ; インターバルタイマのカウンター
  90. ;
  91. int93flg    db        FALSE                    ; 多重割り込み防止用
  92. int40flg    db        FALSE                    ; 多重割り込み防止用
  93. ;
  94. dispflg        db        TRUE                    ; 書き換え用
  95. ;
  96. def_moji    db        21h,7Bh                    ; デフォルト表示用 ('○')
  97. def_len        equ        $-def_moji                ;
  98. ;
  99. disp_hd        db        21h,7Ch                    ; 文字表示用   ('●')
  100. ;                    JISコードなんて嫌いだぁ~!
  101. ;
  102. disp_tbl    DispBlock <>                    ; 表示情報格納領域
  103. ;
  104. atr_def        db        1,DEF_ATR                ; デフォルト
  105.             dw        DEF_COLOR                ;
  106.             db        3,DEF_ATR                ;
  107.             dw        DEF_COLOR                ;
  108. ;
  109. atr_read    db        1,READ_ATR                ; Read
  110.             dw        READ_COLOR                ;
  111.             db        3,READ_ATR                ;
  112.             dw        READ_COLOR                ;
  113. ;
  114. atr_write    db        1,WRITE_ATR                ; Write
  115.             dw        WRITE_COLOR                ;
  116.             db        3,WRITE_ATR                ;
  117.             dw        WRITE_COLOR                ;
  118. ;
  119. ;
  120. ;********************************************
  121. ;            MACRO
  122. ;********************************************
  123. ;
  124. pgend        macro                            ; プログラム終了(4CH)
  125.             mov        ax,4C00h                ;
  126.             int        21h                        ; Program End !
  127.             endm                            ;
  128. ;
  129. disp        macro                            ; 文字/アトリビュート表示(システム行)
  130.             mov        al,1                    ;
  131.             mov        cx,def_len                ;
  132.             mov        dl,S_CLM                ; 開始位置(桁)
  133.             mov        di,offset disp_tbl        ;
  134.             mov        ah,1Fh                    ;
  135.             int        91h                        ;
  136.             endm
  137. ;
  138. ;
  139. ;********************************************
  140. ;            常駐処理部
  141. ;********************************************
  142. ;
  143. ;--------------------------------------------
  144. ;    CRT(ディスプレイ)の横取り処理
  145. ;--------------------------------------------
  146. INT40hook    proc    far
  147.             push    ax                        ; +18
  148.             push    cx                        ; +16
  149.             push    dx                        ; +14
  150.             push    bx                        ; +12
  151.             push    sp                        ; +10
  152.             push    bp                        ; +8
  153.             push    si                        ; +6
  154.             push    di                        ; +4
  155.             push    ds                        ; +2
  156.             push    es                        ; +0
  157.             mov        bp,sp                    ;
  158.             mov        ax,cs                    ;
  159.             mov        ds,ax                    ;
  160.             mov        es,ax                    ; es = ds = cs
  161.             cli                                ;
  162.             cld                                ;
  163. ;
  164.             cmp        int40flg,TRUE            ; 多重割り込み防止
  165.             jne        i40                        ;
  166.             jmp        short i40end            ;
  167. i40:        mov        int40flg,TRUE            ;
  168. ;
  169.             cmp        dispflg,TRUE            ; 書き換え有り?
  170.             je        i40_on                    ;
  171.             jmp        short i40end            ;
  172. i40_on:                                        ;
  173.             cmp        time_cnt,ERACE_CNT        ;
  174.             jae        i40_erace                ;
  175.             inc        time_cnt                ;
  176.             jmp        short i40end            ;
  177. i40_erace:                                    ;
  178.             mov        time_cnt,ZERO            ;
  179.             mov        bx,offset disp_tbl        ;
  180.             mov        ax,offset def_moji        ; アクセスランプを省略値に戻す。
  181.             mov        [bx].Moff,ax            ; 文字    : オフセット
  182.             mov        ax,offset atr_def        ;
  183.             mov        [bx].Aoff,ax            ; アトリビュート: オフセット
  184.             mov        ax,cs                    ;
  185.             mov        [bx].Mseg,ax            ; 文字    : セグメント
  186.             mov        [bx].Aseg,ax            ; アトリビュート: セグメント
  187.             sti                                ;
  188.             disp                            ; アクセスランプを省略値に戻して表示!
  189.             mov        dispflg,FALSE            ; 書き換え済
  190. ;
  191. i40end:                                        ;
  192.             mov        sp,bp                    ; 割り込み時の状態に戻す。
  193.             pop        es                        ;
  194.             pop        ds                        ;
  195.             pop        di                        ;
  196.             pop        si                        ;
  197.             pop        bp                        ;
  198.             pop        bx                        ;
  199.             pop        bx                        ;
  200.             pop        dx                        ;
  201.             pop        cx                        ;
  202.             pop        ax                        ;
  203. ;
  204.             mov        cs:int40flg,FALSE        ;
  205. ;
  206. i40ret:        jmp        cs:[vct_40h]            ;
  207. ;            iret                            ;
  208. INT40hook    endp                            ;
  209. ;
  210. ;
  211. ;--------------------------------------------
  212. ;    ディスクBIOSの横取り処理
  213. ;--------------------------------------------
  214. INT93hook    proc    far
  215.             cmp        ah,05h                    ; データ Read
  216.             je        i93_st                    ;
  217.             cmp        ah,06h                    ; データ Write
  218.             je        i93_st                    ;
  219.             jmp        i93ret                    ;
  220. i93_st:
  221.             push    ax                        ; +18
  222.             push    cx                        ; +16
  223.             push    dx                        ; +14
  224.             push    bx                        ; +12
  225.             push    sp                        ; +10
  226.             push    bp                        ; +8
  227.             push    si                        ; +6
  228.             push    di                        ; +4
  229.             push    ds                        ; +2
  230.             push    es                        ; +0
  231.             mov        bp,sp                    ;
  232.             push    ax                        ;
  233.             mov        ax,cs                    ;
  234.             mov        ds,ax                    ;
  235.             mov        es,ax                    ; es = ds = cs
  236.             pop        ax                        ;
  237.             cli                                ;
  238.             cld                                ;
  239. ;
  240.             cmp        int93flg,TRUE            ; 多重割り込み防止
  241.             jne        short i93                ;
  242.             jmp        short i93end            ;
  243. i93:        mov        int93flg,TRUE            ;
  244. ;
  245. ;            and        al,0F0h                    ; ユニット番号無視ならばコメントを外す
  246.             cmp        al,DEV_HD                ; 内蔵HD ?
  247.             jne        short i93end            ;
  248.             mov        bx,offset disp_tbl        ;
  249.             mov        dx,offset disp_hd        ; HD
  250.             mov        [bx].Moff,dx            ; 文字   : オフセット
  251. ;
  252.             cmp        ah,06h                    ; データ Write
  253.             jne        i93_read                ; データ Read
  254.             jmp        short i93_write            ;
  255. i93_read:                                    ; READ
  256.             mov        ax,offset atr_read        ;
  257.             mov        [bx].Aoff,ax            ; アトリビュート: オフセット
  258.             jmp        short i93_disp            ;
  259. i93_write:                                    ; WRITE
  260.             mov        ax,offset atr_write        ;
  261.             mov        [bx].Aoff,ax            ; アトリビュート: オフセット
  262. i93_disp:                                    ;
  263.             mov        ax,cs                    ;
  264.             mov        [bx].Mseg,ax            ; 文字    : セグメント
  265.             mov        [bx].Aseg,ax            ; アトリビュート: セグメント
  266.             sti                                ;
  267.             disp                            ; アクセスランプ表示
  268.             mov        time_cnt,ZERO            ;
  269.             mov        dispflg,TRUE            ; 書き換えたよん
  270. ;
  271. i93end:                                        ;
  272.             mov        sp,bp                    ; 割り込み時の状態に戻す。
  273.             pop        es                        ;
  274.             pop        ds                        ;
  275.             pop        di                        ;
  276.             pop        si                        ;
  277.             pop        bp                        ;
  278.             pop        bx                        ;
  279.             pop        bx                        ;
  280.             pop        dx                        ;
  281.             pop        cx                        ;
  282.             pop        ax                        ;
  283. ;
  284.             mov        cs:int93flg,FALSE        ;
  285. ;
  286. i93ret:        jmp        cs:[vct_93h]            ;
  287. ;            iret                            ;
  288. INT93hook    endp                            ;
  289. ;
  290. ;--------------------------------------------
  291. SEGEND        label    WORD
  292. ;--------------------------------------------
  293. ;
  294. ;********************************************
  295. ;            起動処理( メイン )
  296. ;********************************************
  297. main        proc    near                    ;
  298. ;
  299.             mov        cx,msg0_len                ; オープニングメッセージ(文字数)
  300.             mov        di,offset msg0            ; オープニングメッセージ(文字列)
  301.             mov        ah,1Eh                    ;
  302.             int        91h                        ; 文字列出力(オープニングメッセージ)
  303. ;
  304.             mov        si,offset ARGUMENT        ;
  305. optsw:                                        ; オプションスイッチ は '/','-'で始まる。
  306.             inc        si                        ;
  307.             cmp        BYTE ptr cs:[si],' '    ;
  308.             jz        optsw                    ;
  309.             cmp        BYTE ptr cs:[si],'/'    ;
  310.             jz        optsw_01                ;
  311.             cmp        BYTE ptr cs:[si],'-'    ;
  312.             jz        optsw_01                ;
  313.             cmp        BYTE ptr cs:[si],0Dh    ;
  314.             jnz        optsw                    ;
  315.             jmp        tsr_init                ;
  316. optsw_01:
  317.             cmp        BYTE ptr cs:[si+1],0Dh    ;
  318.             jnz        optsw_02                ;
  319.             jmp        tsr_init                ;
  320. optsw_02:                                    ;
  321.             or        BYTE ptr cs:[si+1],20h    ; 大文字 -> 小文字
  322.             cmp        BYTE ptr cs:[si+1],'r'    ;
  323.             jz        optsw_99                ;
  324.             jmp        tsr_init                ; 常駐処理へ
  325. ;
  326. optsw_99:                                    ;
  327.             mov        ax,3593h                ;
  328.             int        21h                        ; ディスクBIOS割込みベクタ取得
  329.             mov        cx,TITLE_len            ;
  330.             mov        si,offset TITLE_name    ;
  331.             mov        di,offset TITLE_name    ;
  332.             repz    cmpsb                    ; 常駐チェック
  333.             je        mem_clear                ; 常駐解除へ
  334.             jmp        mem_noclr                ; 終了
  335. ;
  336. ;
  337. ;    常駐解除処理
  338. ;
  339. mem_clear:
  340.             mov        bx,offset disp_tbl        ;
  341.             mov        ax,offset def_moji        ; アクセスランプを省略値に戻す。
  342.             mov        [bx].Moff,ax            ; 文字    : オフセット
  343.             mov        ax,offset atr_def        ;
  344.             mov        [bx].Aoff,ax            ; アトリビュート: オフセット
  345.             mov        ax,cs                    ;
  346.             mov        [bx].Mseg,ax            ; 文字    : セグメント
  347.             mov        [bx].Aseg,ax            ; アトリビュート: セグメント
  348.             disp                            ; アクセスランプを省略値に戻して表示!
  349. ;
  350.             mov        cx,msg2_len                ; 開放メッセージ
  351.             mov        di,offset msg2            ;
  352.             mov        ah,1Eh                    ;
  353.             int        91h                        ;
  354. ;
  355.             lds        dx,DWORD ptr es:vct_40h    ;
  356.             mov        ax,2540h                ; インターバルタイマを元のベクタに!
  357.             int        21h                        ;
  358. ;
  359.             lds        dx,DWORD ptr es:vct_93h    ;
  360.             mov        ax,2593h                ; ディスクBIOSを元のベクタに!
  361.             int        21h                        ;
  362. ;
  363.             push    es                        ;
  364.             mov        si,offset ENVADRS        ; 環境変数領域を開放
  365.             mov        ax,es:[si]                ;
  366.             mov        es,ax                    ;
  367.             mov        ah,49h                    ;
  368.             int        21h                        ;
  369.             pop        es                        ;
  370. ;
  371.             mov        ah,49h                    ; プログラムを開放
  372.             int        21h                        ;
  373. ;
  374.             pgend                            ;
  375. ;
  376. mem_noclr:
  377.             mov        cx,msg4_len                ; 非常駐メッセージ
  378.             mov        di,offset msg4            ;
  379.             mov        ah,1Eh                    ;
  380.             int        91h                        ;
  381.             pgend                            ;
  382. ;
  383. ;
  384. ;    常駐処理
  385. ;
  386. tsr_init:
  387.             mov        ax,3540h                ; * インターバルタイマ *
  388.             int        21h                        ;
  389.             mov        WORD ptr cs:vct_40h,bx    ;
  390.             mov        WORD ptr cs:vct_40h+2,es
  391.                                             ; 本来のINT40ベクタの取得・保存
  392. ;
  393.             mov        ax,3593h                ; * ディスクBIOS *
  394.             int        21h                        ;
  395.             mov        WORD ptr cs:vct_93h,bx    ;
  396.             mov        WORD ptr cs:vct_93h+2,es
  397.                                             ; 本来のINT93ベクタの取得・保存
  398. ;
  399.             mov        cx,TITLE_len            ;
  400.             mov        si,offset TITLE_name    ;
  401.             mov        di,offset TITLE_name    ;
  402.             repz    cmpsb                    ; 常駐チェック
  403.             jne        mem_setup                ; 常駐処理へ
  404. ;
  405.             mov        cx,msg3_len                ; 常駐済メッセージ
  406.             mov        di,offset msg3            ;
  407.             mov        ah,1Eh                    ;
  408.             int        91h                        ;
  409.             mov        cx,msghp_len            ; ヘルプメッセージ
  410.             mov        di,offset msghp            ;
  411.             mov        ah,1Eh                    ;
  412.             int        91h                        ;
  413.             pgend                            ;
  414. ;
  415. mem_setup:
  416.             mov        cx,msg1_len                ; 常駐メッセージ
  417.             mov        di,offset msg1            ;
  418.             mov        ah,1Eh                    ;
  419.             int        91h                        ;
  420.             mov        cx,msghp_len            ; ヘルプメッセージ
  421.             mov        di,offset msghp            ;
  422.             mov        ah,1Eh                    ;
  423.             int        91h                        ;
  424. ;
  425.             mov        dx,offset INT40hook        ; 常駐処理プロシジャを
  426.             mov        ax,2540h                ; ベクタセット
  427.             int        21h                        ; (インターバルタイマ割り込み)
  428. ;
  429.             mov        dx,offset INT93hook        ; 常駐処理プロシジャを
  430.             mov        ax,2593h                ; ベクタセット
  431.             int        21h                        ; (ディスクBIOS割り込み)
  432. ;
  433.             mov        dx,offset SEGEND        ;
  434.             add        dx,15                    ;
  435.             mov        cl,4
  436.             shr        dx,cl                    ; パラグラフ単位
  437.             mov        ax,3100h                ;
  438.             int        21h                        ; 常駐終了
  439. ;
  440. main        endp
  441. ;
  442. msg0        db        'アクセスランプ表示(HD0専用)  (C)パオパオ 1990.    '
  443.             db        '<< Copyright (C) Y.Hirata 1990. >>',0Dh,0Ah,0Dh,0Ah
  444.             db        'Access Lamp  Version 0.70R  '
  445. msg0_len    equ        $-msg0
  446. msg1        db        '★ 常駐するよ~ん ★',0Dh,0Ah
  447. msg1_len    equ        $-msg1
  448. msg2        db        '☆ 解除したよ~ん ☆',0Dh,0Ah
  449. msg2_len    equ        $-msg2
  450. msg3        db        '常駐してるよ!',0Dh,0Ah,07h
  451. msg3_len    equ        $-msg3
  452. msg4        db        '常駐してないよ!',0Dh,0Ah,07h
  453. msg4_len    equ        $-msg4
  454. msghp        db        0Dh,0Ah
  455.             db        '使用方法 ★ オプションスイッチ /r で、常駐解除します。'
  456.             db        0Dh,0Ah
  457. msghp_len    equ        $-msghp
  458. ;
  459. code        ends
  460.             end        entry
  461. ;
  462. ;            BLACK        EQU            0        ; 黒色
  463. ;            BLUE        EQU            1        ; 青色
  464. ;            RED            EQU            2        ; 赤色
  465. ;            PURPLE        EQU            3        ; 紫色
  466. ;            GREEN        EQU            4        ; 緑色
  467. ;            SKY            EQU            5        ; 水色
  468. ;            YELLOW        EQU            6        ; 黄色
  469. ;            WHITE        EQU            7        ; 白色
  470. ;
  471.  
  472.