
; 
;			ACcess Check  ACC.com               ( MASM 用 ソース )
;
;		書式	ACC 	    ACCを常駐する
;                       ACC -R      ACCの常駐解除
;
;
;       原作    ACLAMP  .ASM パオパオ(Y.Hirata)さん作を  ディスアセンブル
;
;               v1.10   90/12/??    ACLAMPをディスアセンブルしたものにボリュー
;                                 ムランプ表示機能をつける
;               v1.20   91/01/10    システム領域への表示をやめる
;               v1.30	91/09/01    点灯パターンをパラメータ指定にする  
;

.286p

code	segment	byte
	assume	cs:code,ds:code 

a_lamp	equ	04ech

vollamp	MACRO
;	push	ax
;	push	dx

	mov	ah,al

	mov	dx,a_lamp
	in	al,dx		
	and	al,01000000b	;ミュートかかっているか?

	or	al,ah
	out	dx,al

;	pop	dx
;	pop	ax
	ENDM


	ORG	002ch 
d_002c	label byte 
 
	ORG	0080h 
d_0080	label byte 
 
	ORG 100h 
 
start: 
	jmp	j_0388 

	db	0dh
	db	'     ',0dh,0ah,07h,0dh,0ah
	db	'        '
chkword	db	         'ACcess Check'
chk_end	db	                     ' V1.21   1991-01-10',0dh,0ah,0dh,0ah
	db	'        Copyright (C) T.Tacasaka & Y.Hirata 1990,1991.'
	db	0dh,0ah,0dh,0ah,1ah
 
w_016d	dw	0fffeh		; int 93h の割り込みベクタ(オリジナル) 
w_016f	dw	0ffffh		;       の待機領域
 
w_0171	dw	0fffeh		; int 40h の割り込みベクタ(オリジナル) 
w_0173	dw	0ffffh 		;	の待機領域

w_0175	dw	0000h 		; ランプ表示を消すかのカウンタ
d_0177	db	00h             ; int 93h に重複してはいったかのチェック
d_0178	db	00h		; int 40h に重複してはいったかのチェック
d_0179	db	01h		; インジケータ点灯中フラグ

;w_0203	dw	0000h 
		 
;d_0205	db	00h 

l_read	db	00000000b
l_write	db	00000000b
l_fd	db	00000000b
l_hd	db	00000000b
l_ram	db	00000000b
l_cd	db	00000000b
l_rom	db	00000000b
l_ic	db	00000000b
l_ext	db	00000000b
 
;--------------------- int 40h -----------------------------------------
;
;        インジケータを消すタイミングの制御
;
;        int 40h は インタバルタイマ(らしい)
;
;
d_0206:
	PUSH	AX
	PUSH	CX
	PUSH	DX				;0208 52
	PUSH	BX				;0209 53
	PUSH	SP				;020A 54
	PUSH	BP				;020B 55
	PUSH	SI				;020C 56
	PUSH	DI				;020D 57
	PUSH	DS				;020E 1E
	PUSH	ES				;020F 06

	MOV	BP,SP				;0210 8B EC bp <- sp
	MOV	AX,CS				;0212 8C C8 
	MOV	DS,AX				;0214 8E D8 ds <- cs 
	MOV	ES,AX				;0216 8E C0 es <- cs

	CLI					;原作 →不要ではないか?
	CLD					;0219 FC

	CMP	BYTE PTR d_0178,01h		;021A 80 3E 78 01 01
		; ↑ このルーチン 実行中に 再び コールされた場合(実行中フラグ)
	JNZ	j_0223				;021F 75 02
	JMP	SHORT	j_0275			;0221 EB 52
		; すぐに帰る
j_0223:
	mov	byte ptr d_0178 ,01h	;実行中フラグセット 
	cmp	byte ptr d_0179 ,01h 	;表示中か?
	jz	j_0231 			;表示中
	jmp	short j_0275 

j_0231: 
	inc	word ptr w_0175 
	cmp	word ptr w_0175 ,+40h 	;	
	je	j_023e 			; 40h 回目なら消去
	cmp	word ptr w_0175 ,+500h 	; 500h回目以上なら
	jnb	j_big			; ボリュームランプにもどす
	jmp	j_0275	 		; それ以外 すぐにかえる

j_023e: 
	mov	al,10001111b		; すべてのランプ消去 ○○○○○
	vollamp
	jmp	j_0275

j_big:

	mov	al,00001111b		;ボリュームランプにもどす
	vollamp
	mov	word ptr w_0175 ,0000h 	; カウンタクリア
	mov	byte ptr d_0179 ,00h	; 表示中フラグクリア 

j_0275: 
	mov	sp,bp 
	pop	es 
	pop	ds 
	pop	di 
	pop	si 
	pop	bp 
	pop	bx 
	pop	bx 
	pop	dx 
	pop	cx 
	pop	ax 

	mov	byte ptr cs:d_0178 ,00h		; 実行中フラグクリア 
	jmp 	dword ptr cs:w_0171		; int 40h (ｵﾘｼﾞﾅﾙ)へ  
 
;-------------------------- int 93h -------------------------------------

d_028c:
	CMP	AH,5		; もしデータの読み出しなら
	JZ	j_0299		; 表示ルーチンへ
	CMP	AH,6		; もしデータの書き込みなら
	JZ	j_0299		; 表示ルーチンへ
	JMP	j_0383		; それ以外は そのままオリジナル

j_0299:
	push	ax
	push	cx
	push	dx
	push	bx
	push	sp
	push	bp
	push	si
	push	di
	push	ds
	push	es

	mov	bp,sp			; bp <- sp

	push	ax			;
	mov	ax,cs 			;
	mov	ds,ax 			; ds <- cs
	mov	es,ax 			; es <- cs
	pop	ax 			;

	cli
	cld

	cmp	byte ptr d_0177 ,01h	; このルーチン実行中でないか
	jnz	j_02b9 			;
	jmp	j_0371 			; 実行中ならすぐに帰る

j_02b9:
	mov	byte ptr d_0177 ,01h	; 実行中フラグon
	mov	cl,00h			;
	cmp	ah,06h 			; データ書き込み???
	jnz	j_02c8 			;
	jmp	short j_02d0 		;

j_02c8:						; データ読みこみ
	or	cl,l_read
	jmp	short j_02d6 		;

j_02d0:						; データ書き込み
	or	cl,l_write

j_02d6: 
	cmp	al,42h			;
	jnz	j_02ea 			;
	or	cl,l_rom
	jmp	j_034a

j_02ea:
	cmp	al,40h			;
	jnz	j_02fe 			;
	or	cl,l_ram
	jmp	j_034a

j_02fe: 
	and	al,0f0h
	cmp	al,0c0h
	jnz	j_0314
	or	cl,l_cd 	;○○●○○
	jmp	short j_034a

j_0314: 
	cmp	al,20h			;
	jnz	j_0328
	or	cl,l_fd		;●○○○○
	jmp	short j_034a

j_0328:
	cmp	al,0b0h
	jnz	j_033c 			;
	or	cl,l_hd
	jmp	short j_034a

j_033c:
	or	cl,l_ext

j_034a:

	not	cl		; alを反転(0で点灯)
	and	cl,10001111b	;
	mov	al,cl

	vollamp

	mov	word ptr w_0175 ,0000h ;表示時間カウンタクリア 
	mov	byte ptr d_0179 ,01h   ;表示中カウンタセット

j_0371: 
	mov	sp,bp 
	pop	es 
	pop	ds 
	pop	di 
	pop	si 
	pop	bp 
	pop	bx 
	pop	bx 
	pop	dx 
	pop	cx 
	pop	ax 

	mov	byte ptr cs:d_0177 ,00h ;実行中フラグクリア

j_0383: 
	jmp 	dword ptr cs:w_016d   ;オリジナル 93hへ

;------------常駐するのは ここ(らへん)まで--(↑)------------------------------

j_0388:					;常駐、削除ルーチンエントリ 

	mov	cx,d_0539 - d_04cc	;6dh 文字		 
	mov	di,offset d_04cc	;'アクセスランプ表示〜 
	mov	ah,1eh			;コンソールに表示 
	int	91h 
 
	mov	si,offset d_0080	;0080h〜 コマンドパラメータ 
         
  	inc	si
	cmp	byte ptr cs:[si],0dh
	jnz	j001
	jmp	error			;パラメータがない

j00:	inc	si
	cmp	byte ptr cs:[si],0dh
	jnz	j001
	jmp	j_0451			;パラメータ終了
j001:

	cmp	byte ptr cs:[si],' '	;空白はパラメータ読みなおし	
	jz	j00
	cmp	byte ptr cs:[si],'-'	;パラメータ先頭コード
	jz	j01
	cmp	byte ptr cs:[si],'/'	;
	jz	j01
	jmp	error
	
j01:	inc	si
	or	byte ptr cs:[si],20h	;大文字→小文字
	cmp	byte ptr cs:[si],'r'
	jnz	j011
    	jmp	release
j011:	cmp	byte ptr cs:[si],'f'
	jz	fd_set
	cmp	byte ptr cs:[si],'h'
	jz	hd_set
	cmp	byte ptr cs:[si],'c'
	jz	cd_set
	cmp	byte ptr cs:[si],'a'
	jz	ram_set
	cmp	byte ptr cs:[si],'o'
	jz	rom_set
	cmp	byte ptr cs:[si],'w'
	jz	wri_set
	cmp	byte ptr cs:[si],'i'
	jz	ic_set
	jmp 	error

fd_set: call	getdec
	cmp	al,10h	
	jbe	jfd0
	jmp	error
jfd0:	mov	l_fd,al
	jmp	j00
	
hd_set: call	getdec
	cmp	al,10h	
	jbe	jhd0
	jmp	error
jhd0:	mov	l_hd,al
	jmp	j00
	
cd_set: call	getdec
	cmp	al,10h	
	jbe	jcd0
	jmp	error
jcd0:	mov	l_cd,al
	jmp	j00
	
ram_set: call	getdec
	cmp	al,10h	
	jbe	jram0
	jmp	error
jram0:	mov	l_ram,al
	jmp	j00
	
rom_set: call	getdec
	cmp	al,10h	
	jbe	jrom0
	jmp	error
jrom0:	mov	l_rom,al
	jmp	j00
	
wri_set:
	call	getdec
	cmp	al,10h	
	jbe	jwri0
	jmp	error
jwri0:	mov	l_write,al
	jmp	j00
	
ic_set: call	getdec
	cmp	al,10h	
	jbe	jic0
	jmp	error
jic0:	mov	l_ic,al
	jmp	j00
	
j_0396: 
	inc	si			;0080hにはコマンドパラメータの文字数
 
	cmp	byte ptr cs:[si],20h	;' ' 
	jz	j_0396 
	cmp	byte ptr cs:[si],2fh	;'/' 
	jz	j_03b2 
	cmp	byte ptr cs:[si],2dh	;'-' 
	jz	j_03b2 
	cmp	byte ptr cs:[si],0dh	;0dhはパラメータ列の最終尾のしるし 
	jnz	j_0396
 
	jmp	j_0451			;
 
j_03b2:
	cmp	byte ptr cs:[si+01h],0dh	; / - の次が 0dh か? 
	jnz	j_03bc			; no 

	jmp	j_0451			; yes

j_03bc:
	or	byte ptr cs:[si+01h],20h	;' '大文字→小文字 
	cmp	byte ptr cs:[si+01h],72h	;'r' 
	jz	release				;常駐解除ルーチンへ 

	jmp	j_0451
 
release:				;常駐解除 
	mov	ax,3593h		;int 93h割り込みベクタ読みだし 
	int	21h 			;→ES:BX
 
	mov	cx,chk_end - chkword	;常駐チェック 
	mov	si,offset chkword	;ds:si(このプログラム) 
	mov	di,offset chkword 	;es:di(常駐している?このプログラム)
	repz	cmpsb	 		;違う文字またはcxまでくりかえす
	jz	j_03e0 			;0bh文字目まで一致

	jmp	short j_0441		;常駐していない 
	 
j_03e0: 
	mov	al,00001111b		;ボリュームランプにもどす
	vollamp
 
	mov	cx,d_0565 - d_054f	; 
	mov	di,offset d_054f 	;'☆ 解除したよ〜ん ☆'
	mov	ah,1eh 			;を表示
	int	91h 			;
 
	lds	dx,dword ptr es:w_0171	;w_0171〜を ds:dxへ  
	mov	ax,2540h 		;int 40h の割り込みベクタ復帰
	int	21h 			;
 
	lds	dx,dword ptr es:w_016d	;w_016d〜を ds:dxへ  
	mov	ax,2593h 		;int 93h の割り込みベクタ復帰
	int	21h 
 
	push	es 
	mov	si,offset d_002c 	;環境のセグメントアドレス
	mov	ax,es:[si]		;
	mov	es,ax 			;常駐している
	mov	ah,49h			;メモリブロックの開放 
	int	21h 
	pop	es

	mov	ah,49h			;常駐しているプログラム
	int	21h 			;のメモリブロックの開放

	mov	ax,4c00h		;プロセス終了 ･ リターンコード 0
	int	21h

					;常駐解除プログラムはここまで

error:
	mov	cx,errmsgend - errmsg	;
	mov	di,offset errmsg 	;'常駐しないよ！'
	mov	ah,1eh 			;の表示
	int	91h			;

	mov	ax,4c00h		; '常駐しないよ！'
	int	21h 			;表示プログラムここまで
j_0441: 
	mov	cx,d_0589 - errmsg	;
	mov	di,offset d_0576 	;'常駐しないよ！'
	mov	ah,1eh 			;の表示
	int	91h			;

	mov	ax,4c00h		; '常駐しないよ！'
	int	21h 			;表示プログラムここまで


j_0451: 				;常駐させるルーチン

	mov	ax,3540h 		; 40h の割り込みベクタよみだし
	int	21h 			; -> es:bx

	mov	cs:w_0171 ,bx		; w_0171〜に 40h割り込みベクタ 
	mov	cs:w_0173 ,es 		; (オリジナル)をセーブ

	mov	ax,3593h		; 93h の割り込みベクタ読み出し 
	int	21h 			; -> es:bx

	mov	cs:w_016d ,bx		; w_0171〜に 93h割り込みベクタ  
	mov	cs:w_016f ,es		; (オリジナル)をセーブ

	mov	cx,chk_end - chkword	; すでに常駐されているか	 
	mov	si,offset chkword 	; チェック
	mov	di,offset chkword	;
	repz	cmpsb			;
	jnz	j_0497 			;

	mov	cx,d_0576 - d_0565	;0011h	; すでに常駐している 
	mov	di,offset d_0565 	; '常駐してるよ！' 
	mov	ah,1eh 			; 表示
	int	91h 			;
 
	mov	cx,d_0end - d_0589	;0032h	; 
	mov	di,offset d_0589 	; '使用方法〜
	mov	ah,1eh 			; 表示
	int	91h 			;
 
	mov	ax,4c00h		; '常駐してるよ' 
	int	21h 			; 表示プログラムおしまい

 
j_0497: 
	mov	cx,d_054f - d_0539	;0016h	; 
	mov	di,offset d_0539 	; '★ 常駐するよ〜ん ★'
	mov	ah,1eh 			; 表示
	int	91h 			;
 
	mov	cx,d_0end - d_0589	;0032h	;	 
	mov	di,offset d_0589 	; '使用方法 〜 
	mov	ah,1eh 			; 表示
	int	91h 			;
 
	mov	dx,offset d_0206	; 40h のフックアドレスは d_0206
	mov	ax,2540h 		; 割り込みベクタ設定	
	int	21h 			;
 
	mov	dx,offset d_028c	; 93h のフックアドレスは d_028c 
	mov	ax,2593h 		; 割り込みベクタ設定
	int	21h 			;
 
	mov	dx,offset j_0388	; dx <- 常駐ｻｲｽﾞ
	add	dx,+0fh 		; dx = dx + 0fh (割った時余り分が
	mov	cl,04h 			;                繰り上がるように)
	shr	dx,cl 			; dx = dx \ 16 
	mov	ax,3100h		; プログラム常駐終了 ( ﾘﾀｰﾝｺｰﾄﾞ 0 ) 
	int	21h 			; dx = 常駐するﾌﾟﾛｸﾞﾗﾑのﾊﾟﾗｸﾞﾗﾌｻｲｽﾞ



getdec:	;proc	near			;パラメータの数値を得る

	push	bx
	mov	al,00h
gj00:	
	inc	si
	mov	bl,byte ptr	cs:[si]
	cmp	bl,'0'
	jb	gj01
	cmp	bl,'5'
	jbe	gj10				;'0'から'5'ならgj10

gj01:	cmp	bl,'6'
	jb	gj02
	cmp	bl,'9'
	jbe	gj11				;'6'から'9'ならgj11

gj02:	cmp	bl,'a'
	jb	gj03
	cmp	bl,'f'
	jbe	gj12				;'a'から'f'ならgj12

gj03:	cmp	bl,'A'
	jb	gj04
	cmp	bl,'F'
	jbe	gj13				;'A'から'F'ならgj13

gj04:	cmp 	bl,' '
	jz	gj21				;' 'なら終了
	cmp	bl,0dh
	jz	gj20				;0dhなら終了
gj05:	mov	al,0ffh
	jmp	gj21				;それ以外ならエラー(-1)	
	
gj10:	cmp	al,00h
	jz	gj11				;
	cmp	al,01h
	jnz	gj05
	mov	al,bl
	sub	al,'0'-10			;
	jmp	gj00

gj11:	mov	al,bl
	sub	al,'0'
	jmp	gj00
	
gj12:	mov	al,bl
	sub	al,'a'-10
	jmp	gj00
	
gj13:	mov	al,bl
	sub	al,'A'-10
	jmp	gj00
	
gj20:	dec	si	
gj21:	pop	bx
	ret
			


d_04cc	db	'アクセスチェック  (C)おくと , パオパオ 1990,1991.',0dh,0ah
	db	'<< Copyright (C) T.takasaka , Y.Hirata 1990,1991 >>'
	db	0dh,0ah,0dh,0ah
	db	'ACcess Check  Version 1.21 '
d_0539	db	' ★ 常駐するよ〜ん ★',0dh,0ah 
d_054f	db	' ☆ 解除したよ〜ん ☆',0dh,0ah
d_0565	db	' 常駐してるよ！',07h,0dh,0ah
d_0576	db	' 常駐しないよ！',07h,0dh,0ah
errmsg	db	' 使い方 ',0dh,0ah
	db	' ACC -R   :常駐解除 ',0dh,0ah
	db	'     -Hnn :ハードディスク -Fnn:フロッピィディスク',0dh,0ah
	db	'     -Ann :RAMディスク    -Cnn:ＣＤ　ＲＯＭ',0dh,0ah
	db	'     nn→点灯パターン ○1○2○3○4',07h,0dh,0ah
errmsgend:  
d_0589	db	0dh,0ah,'使用方法 ★ ｵﾌﾟｼｮﾝｽｲｯﾁ /r で、常駐解除します。'
	db      0dh,0ah
d_0end	db	02h

code	ends 
 
	end	start 
