home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
pao
/
ms_dos
/
aclamp
/
rlamp.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-02
|
12KB
|
472 lines
;==============================================================================
; << MASM V5.1 >> for FM TOWNS
;==============================================================================
page 60,132
name R_LAMP
title Access Lamp FMR
;==============================================================================
; Access Lamp Program FMR 内蔵HD(ユニットNo.0) 専用
;
; CREATE : 1990.06.03
; FINISH : 1990.06.03 V0.70R
;
; < HISTORY >
; 1990.06.03 : CREATE
;
; All Rights Reserved, Copyright (C) Y.Hirata 1990.
;
; Programed by Y.Hirata ( NIFTY-ID : NAB03321 )
;==============================================================================
;
code segment
assume cs:code,ds:code,es:code,ss:code
;
;--------------------------------------------
org 000h
SEGTOP label WORD
;--------------------------------------------
;
;--------------------------------------------
org 02ch
ENVADRS label WORD
;--------------------------------------------
;
;--------------------------------------------
org 080h
ARGUMENT label WORD
;--------------------------------------------
;
;--------------------------------------------
org 100h
entry: jmp main
;--------------------------------------------
;
COPYRIGHT db 0Dh
db ' ',0Dh,0Ah,07h
db 0Dh,0Ah,' '
db 'ACCESS LAMP V0.70R 1990-06-03',0Dh,0Ah
db 0Dh,0Ah,' '
db 'Copyright (C) Y.Hirata 1990.'
db 0Dh,0Ah,0Dh,0Ah,1Ah
;
TITLE_name db 'ACCESS LAMP FMR'
TITLE_len EQU $-TITLE_name
;
TRUE EQU 1
FALSE EQU 0
;
ZERO EQU 0
;
ERACE_CNT EQU 30 ; x 10 msec ( 0.30s )
;
DEV_HD EQU 0B0h ; デバイス : HD
;
DEF_ATR EQU 0 ; 表示属性(デフォルト)
DEF_COLOR EQU 1 ; 表示色(デフォルト)
;
READ_ATR EQU 020h ; 強調/リバース
READ_COLOR EQU 4 ; GREEN
WRITE_ATR EQU 020h ; 強調/リバース
WRITE_COLOR EQU 2 ; RED
;
S_CLM EQU 68 ; 表示開始位置(桁)
;
DispBlock struc ; 表示情報格納領域
Moff dw ? ; 文字 : オフセット ;+0
Mseg dw ? ; : セグメント ;+2
Aoff dw ? ; アトリビュート: オフセット ;+4
Aseg dw ? ; : セグメント ;+6
DispBlock ends ;
;
;
;********************************************
; データ領域
;********************************************
;
vct_93h dd far ; ディスクBIOS
vct_40h dd far ; インターバルタイマ
;
time_cnt dw ZERO ; インターバルタイマのカウンター
;
int93flg db FALSE ; 多重割り込み防止用
int40flg db FALSE ; 多重割り込み防止用
;
dispflg db TRUE ; 書き換え用
;
def_moji db 21h,7Bh ; デフォルト表示用 ('○')
def_len equ $-def_moji ;
;
disp_hd db 21h,7Ch ; 文字表示用 ('●')
; JISコードなんて嫌いだぁ~!
;
disp_tbl DispBlock <> ; 表示情報格納領域
;
atr_def db 1,DEF_ATR ; デフォルト
dw DEF_COLOR ;
db 3,DEF_ATR ;
dw DEF_COLOR ;
;
atr_read db 1,READ_ATR ; Read
dw READ_COLOR ;
db 3,READ_ATR ;
dw READ_COLOR ;
;
atr_write db 1,WRITE_ATR ; Write
dw WRITE_COLOR ;
db 3,WRITE_ATR ;
dw WRITE_COLOR ;
;
;
;********************************************
; MACRO
;********************************************
;
pgend macro ; プログラム終了(4CH)
mov ax,4C00h ;
int 21h ; Program End !
endm ;
;
disp macro ; 文字/アトリビュート表示(システム行)
mov al,1 ;
mov cx,def_len ;
mov dl,S_CLM ; 開始位置(桁)
mov di,offset disp_tbl ;
mov ah,1Fh ;
int 91h ;
endm
;
;
;********************************************
; 常駐処理部
;********************************************
;
;--------------------------------------------
; CRT(ディスプレイ)の横取り処理
;--------------------------------------------
INT40hook proc far
push ax ; +18
push cx ; +16
push dx ; +14
push bx ; +12
push sp ; +10
push bp ; +8
push si ; +6
push di ; +4
push ds ; +2
push es ; +0
mov bp,sp ;
mov ax,cs ;
mov ds,ax ;
mov es,ax ; es = ds = cs
cli ;
cld ;
;
cmp int40flg,TRUE ; 多重割り込み防止
jne i40 ;
jmp short i40end ;
i40: mov int40flg,TRUE ;
;
cmp dispflg,TRUE ; 書き換え有り?
je i40_on ;
jmp short i40end ;
i40_on: ;
cmp time_cnt,ERACE_CNT ;
jae i40_erace ;
inc time_cnt ;
jmp short i40end ;
i40_erace: ;
mov time_cnt,ZERO ;
mov bx,offset disp_tbl ;
mov ax,offset def_moji ; アクセスランプを省略値に戻す。
mov [bx].Moff,ax ; 文字 : オフセット
mov ax,offset atr_def ;
mov [bx].Aoff,ax ; アトリビュート: オフセット
mov ax,cs ;
mov [bx].Mseg,ax ; 文字 : セグメント
mov [bx].Aseg,ax ; アトリビュート: セグメント
sti ;
disp ; アクセスランプを省略値に戻して表示!
mov dispflg,FALSE ; 書き換え済
;
i40end: ;
mov sp,bp ; 割り込み時の状態に戻す。
pop es ;
pop ds ;
pop di ;
pop si ;
pop bp ;
pop bx ;
pop bx ;
pop dx ;
pop cx ;
pop ax ;
;
mov cs:int40flg,FALSE ;
;
i40ret: jmp cs:[vct_40h] ;
; iret ;
INT40hook endp ;
;
;
;--------------------------------------------
; ディスクBIOSの横取り処理
;--------------------------------------------
INT93hook proc far
cmp ah,05h ; データ Read
je i93_st ;
cmp ah,06h ; データ Write
je i93_st ;
jmp i93ret ;
i93_st:
push ax ; +18
push cx ; +16
push dx ; +14
push bx ; +12
push sp ; +10
push bp ; +8
push si ; +6
push di ; +4
push ds ; +2
push es ; +0
mov bp,sp ;
push ax ;
mov ax,cs ;
mov ds,ax ;
mov es,ax ; es = ds = cs
pop ax ;
cli ;
cld ;
;
cmp int93flg,TRUE ; 多重割り込み防止
jne short i93 ;
jmp short i93end ;
i93: mov int93flg,TRUE ;
;
; and al,0F0h ; ユニット番号無視ならばコメントを外す
cmp al,DEV_HD ; 内蔵HD ?
jne short i93end ;
mov bx,offset disp_tbl ;
mov dx,offset disp_hd ; HD
mov [bx].Moff,dx ; 文字 : オフセット
;
cmp ah,06h ; データ Write
jne i93_read ; データ Read
jmp short i93_write ;
i93_read: ; READ
mov ax,offset atr_read ;
mov [bx].Aoff,ax ; アトリビュート: オフセット
jmp short i93_disp ;
i93_write: ; WRITE
mov ax,offset atr_write ;
mov [bx].Aoff,ax ; アトリビュート: オフセット
i93_disp: ;
mov ax,cs ;
mov [bx].Mseg,ax ; 文字 : セグメント
mov [bx].Aseg,ax ; アトリビュート: セグメント
sti ;
disp ; アクセスランプ表示
mov time_cnt,ZERO ;
mov dispflg,TRUE ; 書き換えたよん
;
i93end: ;
mov sp,bp ; 割り込み時の状態に戻す。
pop es ;
pop ds ;
pop di ;
pop si ;
pop bp ;
pop bx ;
pop bx ;
pop dx ;
pop cx ;
pop ax ;
;
mov cs:int93flg,FALSE ;
;
i93ret: jmp cs:[vct_93h] ;
; iret ;
INT93hook endp ;
;
;--------------------------------------------
SEGEND label WORD
;--------------------------------------------
;
;********************************************
; 起動処理( メイン )
;********************************************
main proc near ;
;
mov cx,msg0_len ; オープニングメッセージ(文字数)
mov di,offset msg0 ; オープニングメッセージ(文字列)
mov ah,1Eh ;
int 91h ; 文字列出力(オープニングメッセージ)
;
mov si,offset ARGUMENT ;
optsw: ; オプションスイッチ は '/','-'で始まる。
inc si ;
cmp BYTE ptr cs:[si],' ' ;
jz optsw ;
cmp BYTE ptr cs:[si],'/' ;
jz optsw_01 ;
cmp BYTE ptr cs:[si],'-' ;
jz optsw_01 ;
cmp BYTE ptr cs:[si],0Dh ;
jnz optsw ;
jmp tsr_init ;
optsw_01:
cmp BYTE ptr cs:[si+1],0Dh ;
jnz optsw_02 ;
jmp tsr_init ;
optsw_02: ;
or BYTE ptr cs:[si+1],20h ; 大文字 -> 小文字
cmp BYTE ptr cs:[si+1],'r' ;
jz optsw_99 ;
jmp tsr_init ; 常駐処理へ
;
optsw_99: ;
mov ax,3593h ;
int 21h ; ディスクBIOS割込みベクタ取得
mov cx,TITLE_len ;
mov si,offset TITLE_name ;
mov di,offset TITLE_name ;
repz cmpsb ; 常駐チェック
je mem_clear ; 常駐解除へ
jmp mem_noclr ; 終了
;
;
; 常駐解除処理
;
mem_clear:
mov bx,offset disp_tbl ;
mov ax,offset def_moji ; アクセスランプを省略値に戻す。
mov [bx].Moff,ax ; 文字 : オフセット
mov ax,offset atr_def ;
mov [bx].Aoff,ax ; アトリビュート: オフセット
mov ax,cs ;
mov [bx].Mseg,ax ; 文字 : セグメント
mov [bx].Aseg,ax ; アトリビュート: セグメント
disp ; アクセスランプを省略値に戻して表示!
;
mov cx,msg2_len ; 開放メッセージ
mov di,offset msg2 ;
mov ah,1Eh ;
int 91h ;
;
lds dx,DWORD ptr es:vct_40h ;
mov ax,2540h ; インターバルタイマを元のベクタに!
int 21h ;
;
lds dx,DWORD ptr es:vct_93h ;
mov ax,2593h ; ディスクBIOSを元のベクタに!
int 21h ;
;
push es ;
mov si,offset ENVADRS ; 環境変数領域を開放
mov ax,es:[si] ;
mov es,ax ;
mov ah,49h ;
int 21h ;
pop es ;
;
mov ah,49h ; プログラムを開放
int 21h ;
;
pgend ;
;
mem_noclr:
mov cx,msg4_len ; 非常駐メッセージ
mov di,offset msg4 ;
mov ah,1Eh ;
int 91h ;
pgend ;
;
;
; 常駐処理
;
tsr_init:
mov ax,3540h ; * インターバルタイマ *
int 21h ;
mov WORD ptr cs:vct_40h,bx ;
mov WORD ptr cs:vct_40h+2,es
; 本来のINT40ベクタの取得・保存
;
mov ax,3593h ; * ディスクBIOS *
int 21h ;
mov WORD ptr cs:vct_93h,bx ;
mov WORD ptr cs:vct_93h+2,es
; 本来のINT93ベクタの取得・保存
;
mov cx,TITLE_len ;
mov si,offset TITLE_name ;
mov di,offset TITLE_name ;
repz cmpsb ; 常駐チェック
jne mem_setup ; 常駐処理へ
;
mov cx,msg3_len ; 常駐済メッセージ
mov di,offset msg3 ;
mov ah,1Eh ;
int 91h ;
mov cx,msghp_len ; ヘルプメッセージ
mov di,offset msghp ;
mov ah,1Eh ;
int 91h ;
pgend ;
;
mem_setup:
mov cx,msg1_len ; 常駐メッセージ
mov di,offset msg1 ;
mov ah,1Eh ;
int 91h ;
mov cx,msghp_len ; ヘルプメッセージ
mov di,offset msghp ;
mov ah,1Eh ;
int 91h ;
;
mov dx,offset INT40hook ; 常駐処理プロシジャを
mov ax,2540h ; ベクタセット
int 21h ; (インターバルタイマ割り込み)
;
mov dx,offset INT93hook ; 常駐処理プロシジャを
mov ax,2593h ; ベクタセット
int 21h ; (ディスクBIOS割り込み)
;
mov dx,offset SEGEND ;
add dx,15 ;
mov cl,4
shr dx,cl ; パラグラフ単位
mov ax,3100h ;
int 21h ; 常駐終了
;
main endp
;
msg0 db 'アクセスランプ表示(HD0専用) (C)パオパオ 1990. '
db '<< Copyright (C) Y.Hirata 1990. >>',0Dh,0Ah,0Dh,0Ah
db 'Access Lamp Version 0.70R '
msg0_len equ $-msg0
msg1 db '★ 常駐するよ~ん ★',0Dh,0Ah
msg1_len equ $-msg1
msg2 db '☆ 解除したよ~ん ☆',0Dh,0Ah
msg2_len equ $-msg2
msg3 db '常駐してるよ!',0Dh,0Ah,07h
msg3_len equ $-msg3
msg4 db '常駐してないよ!',0Dh,0Ah,07h
msg4_len equ $-msg4
msghp db 0Dh,0Ah
db '使用方法 ★ オプションスイッチ /r で、常駐解除します。'
db 0Dh,0Ah
msghp_len equ $-msghp
;
code ends
end entry
;
; BLACK EQU 0 ; 黒色
; BLUE EQU 1 ; 青色
; RED EQU 2 ; 赤色
; PURPLE EQU 3 ; 紫色
; GREEN EQU 4 ; 緑色
; SKY EQU 5 ; 水色
; YELLOW EQU 6 ; 黄色
; WHITE EQU 7 ; 白色
;