;============================================================================
;	<< MASM V5.1 >>  for  FM TOWNS
;============================================================================
.186
	PAGE		60,132
	NAME		VMETER
	TITLE		Volume Meter
;============================================================================
;	Volume Meter program (FM-TOWNS)
;
;	ADｻﾝﾌﾟﾘﾝｸﾞの状態(ﾎﾞﾘｭｰﾑ値)を表示する.
;
;	All Rights Reserved, Copyright (C) Y.Hirata 1992-1993.
;	Programmed by Y.Hirata ( NIFTY-ID : NAB03321 )
;
;	< NOTE > TAB=4
;============================================================================
code		SEGMENT
			ASSUME	cs:code,ds:code,es:code,ss:code
;----------------------------------------------------------------------------
			ORG		000h
SEGTOP		LABEL	BYTE
;----------------------------------------------------------------------------
			ORG		02Ch
ENVADRS		LABEL	WORD
;----------------------------------------------------------------------------
			ORG		080h
ARGUMENT	LABEL	BYTE
;----------------------------------------------------------------------------
			ORG		100h
entry:		jmp		main
;----------------------------------------------------------------------------
CR			EQU		0Dh						;
LF			EQU		0Ah						;
BEL			EQU		07h						;
TAB			EQU		09h						;
EOF			EQU		1Ah						;
;
COPYRIGHT	DB		CR
			DB		01Bh,'[2K',CR,LF,BEL
			DB		CR,LF,TAB
			DB		'Volume Meter  Version 1.01   1993.03.02'
			DB		CR,LF,CR,LF,TAB
			DB		'Copyright (C) Y.Hirata 1992-1993.',CR,LF
			DB		CR,LF,EOF
;
TITLE_name	DB		'Volume Meter V1.01'
TITLE_len	EQU		$-TITLE_name
;
TVRAM		EQU		0C800h					; ﾃｷｽﾄVRAMｾｸﾞﾒﾝﾄ
KANJI		EQU		0CA00h					; 漢字VRAMｾｸﾞﾒﾝﾄ
;
INT_TIME	EQU		97h						; ﾀｲﾏ管理BIOS
INT_MODE	EQU		0						; 割り込みﾓｰﾄﾞ : ｲﾝﾀｰﾊﾞﾙﾓｰﾄﾞ
INT_INF		EQU		0						; 割り込みﾓｰﾄﾞ使用
;
ADCONV		EQU		04E7h					; ADｻﾝﾌﾟﾘﾝｸﾞI/O
;
;****************************************************************************
;			データ領域
;****************************************************************************
itimflg		DB		1						; 多重割り込み防止用
timecnt		DW		0						; ｲﾝﾀｰﾊﾞﾙﾀｲﾏのｶｳﾝﾀ
peak		DB		0						; ﾋﾟｰｸﾚﾍﾞﾙ
parablock	DB		INT_MODE				;
			DB		0						;
			DW		OFFSET itimhandr		; ﾊﾝﾄﾞﾗ･ｵﾌｾｯﾄ
			DW		?						; ﾊﾝﾄﾞﾗ･ｾｸﾞﾒﾝﾄ
			DW		0						;
			DW		1						; 10ms のｲﾝﾀｰﾊﾞﾙ設定
itimerno	DB		?						; ﾀｲﾏ管理番号
;
paraoff		LABEL	BYTE					;
dispx		DW		0						; 表示位置(桁) 0〜
dispy		DW		24						; 表示位置(行) 0〜
disptime	DW		10						; 表示時間(10ms単位)
colh		DW		0000h					; 強調
parasize	EQU		$-paraoff				; ﾊﾟﾗﾒﾀ領域ｻｲｽﾞ
;
col1		DW		0400h					; GREEN
col2		DW		0200h					; RED
onmsg		DB		0ECh,0					;
offmsg		DB		0EDh,0					;
;
;****************************************************************************
;			MACRO
;****************************************************************************
TSREND		MACRO							; ﾌﾟﾛｸﾞﾗﾑ常駐終了(31H)
			local	close					;
			mov		cx,5					; ﾃﾞﾌｫﾙﾄｵｰﾌﾟﾝﾌｧｲﾙのｸﾛｰｽﾞ
close:										;
			mov		bx,cx					;
			dec		bx						; ( 0 〜 4 )
			mov		ah,3Eh					; ﾌｧｲﾙｸﾛｰｽﾞ
			int		21h						;
			loop	close					;
;
			mov		si,OFFSET ENVADRS		; 環境変数領域を開放
			mov		ax,cs:[si]				;
			mov		es,ax					;
			mov		ah,49h					;
			int		21h						;
;
			mov		dx,OFFSET SEGEND		;
			add		dx,15					;
			shr		dx,4					; ﾊﾟﾗｸﾞﾗﾌ単位
			mov		ax,3100h				;
			int		21h						; 常駐終了
			ENDM							;
;----------------------------------------------------------------------------
PRGEND		MACRO							; ﾌﾟﾛｸﾞﾗﾑ終了(4CH)
			mov		ax,4C00h				;
			int		21h						; Program End !
			ENDM							;
;
;****************************************************************************
;			常駐処理部
;****************************************************************************
;----------------------------------------------------------------------------
;	ﾃｷｽﾄVRAM(ANK文字列)描画
;	< IN  >	: ｽﾀｯｸ(8ﾊﾞｲﾄ使用)
;	< OUT >	: 文字ｺｰﾄﾞ+文字属性
;----------------------------------------------------------------------------
TVputs		PROC	NEAR					;
			push	bp						;
			mov		bp,sp					; ｽﾀｯｸﾌﾚｰﾑ形成
			push	ax						; 使用ﾚｼﾞｽﾀ退避
			push	dx						;
			push	bx						;
			push	si						;
			push	es						;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 引数
;			[bp+4]	x (0〜)					; WORD: 桁
;			[bp+6]	y (0〜)					; WORD: 行
;			[bp+8]	*str					; WORD: 文字列ｱﾄﾞﾚｽ
;			[bp+10]	attr					; WORD: 表示属性
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			mov		bx,WORD PTR [bp+4]		; x
			shl		bx,1					;
			mov		ax,WORD PTR [bp+6]		; y
			shl		ax,7					; y*128
			add		bx,ax					;
			mov		ax,WORD PTR [bp+6]		; y
			shl		ax,5					; y*32
			add		bx,ax					; 2*x+160*y = offset
			mov		ax,TVRAM				;
			mov		es,ax					; text vram segment
			mov		si,WORD PTR [bp+8]		; str
			mov		ax,WORD PTR [bp+10]		; attr(AHのみ使用)
TVputslp:									;
			mov		al,BYTE PTR [si]		;
			or		al,al					; 文字列終端?
			jz		short TVputsend			; YES->TVputsend
;
			mov		WORD PTR es:[bx],ax		; text vram
			inc		bx						;
			inc		bx						; offset update
			inc		si						;
			jmp		short TVputslp			;
TVputsend:									;
			pop		es						; 使用ﾚｼﾞｽﾀ復元
			pop		si						;
			pop		bx						;
			pop		dx						;
			pop		ax						;
			mov		sp,bp					; ｽﾀｯｸﾌﾚｰﾑ開放
			pop		bp						;
			ret								;
TVputs		ENDP							;
;----------------------------------------------------------------------------
;	ﾎﾞﾘｭｰﾑ表示(ds=csでcall)
;	< USE >	: ax
;----------------------------------------------------------------------------
disp_meter:									;
			sub		ah,ah					;
			mov		al,peak					;
			add		al,6					; 補正
			mov		dl,12					;
			div		dl						; peak/12->al
			xor		cx,cx					;
disp_lp:									;
			cmp		cl,6					;
			ja		short disp_red			;
			mov		dx,col1					; 表示属性
			jmp		short disp_setmsg		;
disp_red:									;
			mov		dx,col2					; 表示属性
disp_setmsg:								;
			cmp		al,cl					;
			ja		short disp_on			;
			push	dx						; 表示属性
			mov		dx,OFFSET offmsg		; 文字列ｱﾄﾞﾚｽ
			jmp		short disp_setpos		;
disp_on:
			or		dx,colh					; 強調
			push	dx						; 表示属性
			mov		dx,OFFSET onmsg			; 文字列ｱﾄﾞﾚｽ
disp_setpos:								;
			push	dx						; str
			mov		dx,dispy				; 表示位置(行) 0〜
			push	dx						; y
			mov		dx,dispx				; 表示位置(桁) 0〜
			add		dx,cx					;
			push	dx						; x
			call	TVputs					; ﾌｧﾝｸｼｮﾝ状態表示
			add		sp,8					;
			inc		cx						;
			cmp		cx,10					;
			jb		short disp_lp			;
			ret								;
;----------------------------------------------------------------------------
;	ﾋﾟｰｸﾚﾍﾞﾙﾁｪｯｸ(ds=csでcall)
;	< USE >	: ax,dx
;----------------------------------------------------------------------------
peakchk:									;
			mov		dx,ADCONV				;
			in		al,dx					;
			cmp		al,0FFh					; ﾙｰﾌﾟﾏｰｶ?
			je		short peak_nolevel		; YES->ﾚﾍﾞﾙ無視
			test	al,80h					;
			jz		short peak_nolevel		; ﾚﾍﾞﾙがﾏｲﾅｽ値ならば無視
			and		al,7Fh					; 最上位ﾋﾞｯﾄﾏｽｸ
			jmp		short peak_level		; ﾚﾍﾞﾙ設定
peak_nolevel:								;
			sub		al,al					; al=ﾇﾙ
			ret								;
peak_level:									;
			cmp		peak,al					; peakを越えたか?
			ja		short peak_end			; peak>al ? YES->次の処理
			mov		peak,al					; peak update
peak_end:									;
			ret								;
;----------------------------------------------------------------------------
;	ｲﾝﾀｰﾊﾞﾙﾀｲﾏ割り込み処理					; ﾀｲﾏ管理BIOS使用
;----------------------------------------------------------------------------
itimhandr	PROC	FAR						; 割り込みﾊﾝﾄﾞﾗ
			cli								;
			cmp		BYTE PTR cs:itimflg,1	; 処理中?
			jne		short itim_st			; NO->処理開始
			sti								;
			ret								;
itim_st:									;
			mov		BYTE PTR cs:itimflg,1	; 処理中ﾌﾗｸﾞｾｯﾄ
			mov		ax,cs					;
			mov		ds,ax					;
			mov		es,ax					; es=ds=cs
			cld								;
			inc		WORD PTR timecnt		; ｶｳﾝﾄｱｯﾌﾟ
			mov		cx,8					;
itim_lp:									;
			call	peakchk					; ﾋﾟｰｸﾚﾍﾞﾙﾁｪｯｸ
			loop	itim_lp					;
itim_cntchk:								;
			mov		dx,timecnt				;
			cmp		dx,WORD PTR disptime	; 表示間隔を越えたか?
			ja		short itim_disp			; YES->表示
			jmp		short itim_end			; NO ->終了
itim_disp:									;
			call	disp_meter				; 表示
			xor		ax,ax					;
			mov		peak,al					; peak level clear
			mov		timecnt,ax				; time count clear
itim_end:									;
			mov		BYTE PTR itimflg,0		; 処理中ﾌﾗｸﾞｸﾘｱ
			sti								;
			ret								;
itimhandr	ENDP							;
;----------------------------------------------------------------------------
SEGEND		LABEL	BYTE					; ↑ここまでを常駐
;----------------------------------------------------------------------------
;
;****************************************************************************
;			非常駐処理部
;****************************************************************************
;----------------------------------------------------------------------------
;	文字列表示(^C無効)
;	< IN  >	: ds:si	文字列格納位置	
;
;	< USE >	: si
;----------------------------------------------------------------------------
puts		PROC	NEAR					;
			push	dx						;
putslp:										;
			mov		dl,[si]					;
			or		dl,dl					; 文字列終端?
			jz		short putsend			; YES->終了
			mov		ah,02					;
			int		21h						; 文字表示
			inc		si						;
			jmp		short putslp			;
putsend:									;
			pop		dx						;
			ret								;
puts		ENDP							;
;----------------------------------------------------------------------------
;	表示ｸﾘｱ(ds=csでcall)
;
;	< USE >	: ax
;----------------------------------------------------------------------------
dispclr:									;
			mov		ax,0700h				; 白
			push	ax						;
			mov		ax,OFFSET clrmsg		; 文字列ｱﾄﾞﾚｽ
			push	ax						; str
			mov		ax,dispy				; 表示位置(行) 0〜
			push	ax						; y
			mov		ax,dispx				; 表示位置(桁) 0〜
			push	ax						; x
			call	TVputs					;
			add		sp,8					;
			ret								;
;----------------------------------------------------------------------------
;	常駐文字列ﾁｪｯｸ(ds=csでcall)
;	< IN  >	: es	常駐ｾｸﾞﾒﾝﾄ
;	< RET >	: ｾﾞﾛﾌﾗｸﾞ (等しければ, ｾﾞﾛﾌﾗｸﾞon)
;
;	< USE >	: si, di
;----------------------------------------------------------------------------
tsrcmp:										;
			mov		cx,TITLE_len			;
			mov		si,OFFSET TITLE_name	; ds:si
			mov		di,OFFSET TITLE_name	; es:di
	repz	cmpsb							; 常駐ﾁｪｯｸ
			ret								;
;----------------------------------------------------------------------------
;	常駐ﾁｪｯｸ(ds=csでcall)
;	< RET >	: es:bx	常駐ｱﾄﾞﾚｽ
;
;	< USE >	: ax, si, di
;----------------------------------------------------------------------------
tsr_chk:									;
			mov		BYTE PTR tsrflg,0		; 常駐ﾌﾗｸﾞｸﾘｱ
mcb_chk:									;
			mov		ah,52h					; 内部変数領域ｱﾄﾞﾚｽ取得
			int		21h						;
			mov		es,es:[bx-2]			; 先頭MCBｾｸﾞﾒﾝﾄｱﾄﾞﾚｽ
mcb_lp:										;
			cmp		BYTE PTR es:[0],'Z'		; 最終MCB?
			je		short mcb_end			; YES->終了
			cmp		BYTE PTR es:[0],'M'		; MCB?
			jne		short mcb_err			; NO ->MCB MARK ERROR
mcb_idchk:									;
			push	es						; MCBｾｸﾞﾒﾝﾄ退避
			mov		es,WORD PTR es:[1]		; PSPｾｸﾞﾒﾝﾄ(Owner ID)
			mov		ax,es					;
			cmp		ax,pspseg				; 起動ﾌﾟﾛｸﾞﾗﾑのPSPか?
			je		short mcb_next			; YES->次のMCBをﾁｪｯｸ
			call	tsrcmp					; 常駐文字列照合
			jz		short mcb_on			; 等しければ, 常駐済
mcb_next:									;
			pop		es						; MCBｾｸﾞﾒﾝﾄ復元
			mov		ax,es					;
			add		ax,es:[3]				; 使用ﾒﾓﾘのﾊﾟﾗｸﾞﾗﾌ数加算
			inc		ax						; 次のMCBｾｸﾞﾒﾝﾄ
			mov		es,ax					;
			jmp		short mcb_lp			;
mcb_on:										; 常駐済
			pop		ax						; ｽﾀｯｸ調整
			mov		BYTE PTR tsrflg,1		;
mcb_end:									; 非常駐
			ret								;
mcb_err:									;
			mov		si,OFFSET msg6			; MCBｴﾗｰ
			call	puts					;
			ret								;
;----------------------------------------------------------------------------
;	ｲﾝﾀｰﾊﾞﾙﾀｲﾏの登録(ds=cs)
;	< RET >	: ax	ﾀｲﾏ管理BIOSの返り値
;----------------------------------------------------------------------------
itim_setup:									;
			push	di						;
			mov		WORD PTR [parablock+4],cs
			mov		di,OFFSET parablock		;
			xor		ax,ax					;
			int		INT_TIME				;
			mov		itimerno,al				; ﾀｲﾏ管理番号
			pop		di						;
			ret								;
;----------------------------------------------------------------------------
;	ｲﾝﾀｰﾊﾞﾙﾀｲﾏの取消
;	< IN  >	: es	常駐ｾｸﾞﾒﾝﾄ
;	< RET >	: ax	ﾀｲﾏ管理BIOSの返り値
;----------------------------------------------------------------------------
itim_release:								;
			mov		ah,01h					;
			mov		al,es:itimerno			; 常駐部分のﾀｲﾏ番号
			int		INT_TIME				;
			ret								;
;----------------------------------------------------------------------------
;	ﾌﾟﾛｸﾞﾗﾑ名の設定(es=ds=csでcall)
;	常駐時の識別用として, ｺﾏﾝﾄﾞﾗｲﾝ領域にﾌﾟﾛｸﾞﾗﾑ名を複写しておく.
;----------------------------------------------------------------------------
setpname:									;
			mov		si,OFFSET prgname		;
			mov		di,OFFSET ARGUMENT		;
			mov		cx,prgnamelen			;
	rep		movsb							; ds:si->es:di
			ret								;
;----------------------------------------------------------------------------
;	起動処理( メイン )
;----------------------------------------------------------------------------
main		PROC	NEAR					;
			mov		WORD PTR pspseg,es		; PSPｾｸﾞﾒﾝﾄ保存
			cli								; 割り込み禁止
			cld								;
;
			mov		si,OFFSET msg0			; ｵｰﾌﾟﾆﾝｸﾞﾒｯｾｰｼﾞ(文字列)
			call	puts					;
			call	tsr_chk					; 常駐ﾁｪｯｸ
			cmp		BYTE PTR tsrflg,0		; 常駐していない?
			jz		short arg_chk			; YES->arg_chk
;
			mov		BYTE PTR es:itimflg,1	; 常駐処理中断
			push	ds						; 常駐領域内ﾊﾟﾗﾒﾀを複写
			push	es						;
			mov		ax,es					;
			push	ds						;
			pop		es						;
			mov		ds,ax					; ds<->es
			mov		si,OFFSET paraoff		;
			mov		di,OFFSET paraoff		;
			mov		cx,parasize				; ﾊﾟﾗﾒﾀ領域ｻｲｽﾞ
	rep		movsb							; ds:si->es:di
			pop		es						; 常駐ｾｸﾞﾒﾝﾄ
			pop		ds						;
arg_chk:									;
			call	dispclr					; 表示ｸﾘｱ
			sti								;
			call	argchk					; 引数のﾁｪｯｸ
			mov		al,argflg				;
			or		al,al					; al=0?
			jz		short tsr_init			; YES->通常処理開始へ
			mov		si,OFFSET usage			; ﾍﾙﾌﾟﾒｯｾｰｼﾞ
			call	puts					;
			cmp		BYTE PTR tsrflg,0		; 常駐していない?
			jz		short arg_errend		; YES->終了
			mov		BYTE PTR es:itimflg,0	; 常駐処理再開
arg_errend:									;
			PRGEND							;
tsr_init:									;
			mov		al,tsrflg				;
			or		al,al					;
			jz		short mem_noclr			; 非常駐終了へ
;-------------------------------------------;
;	常駐解除処理
;-------------------------------------------;
mem_clear:									;
			mov		al,relflg				; 常駐解除ﾌﾗｸﾞ
			or		al,al					; 常駐解除しない?
			jz		short mem_update		; YES->終了
			push	ds						;
			call	itim_release			; ｲﾝﾀｰﾊﾞﾙﾀｲﾏの解除
			mov		ah,49h					; プログラムを開放
			int		21h						;
			pop		ds						;
			jc		short mem_clrerr		; ﾒﾓﾘ開放失敗
			mov		si,OFFSET msg2			; 開放ﾒｯｾｰｼﾞ
			jmp		short mem_clrend		;
mem_clrerr:									;
			mov		si,OFFSET msg7			; ﾒﾓﾘ開放失敗ﾒｯｾｰｼﾞ
mem_clrend:									;
			call	puts					;
			PRGEND							;
mem_update:									; 常駐領域内のﾊﾟﾗﾒﾀ値変更
			mov		si,OFFSET msg3			; 常駐済ﾒｯｾｰｼﾞ
			call	puts					;
			mov		al,optflg				;
			or		al,al					; ｵﾌﾟｼｮﾝ指定なし?
			jz		short mem_upend			; YES->終了
			cli								;
			mov		si,OFFSET paraoff		;
			mov		di,OFFSET paraoff		;
			mov		cx,parasize				; ﾊﾟﾗﾒﾀ領域ｻｲｽﾞ
	rep		movsb							; ds:si->es:di
			sti								;
			mov		si,OFFSET msg5			; ｱｯﾌﾟﾃﾞｰﾄﾒｯｾｰｼﾞ(文字数)
			call	puts					;
mem_upend:									;
			mov		BYTE PTR es:itimflg,0	; 常駐処理開始
			PRGEND							;
mem_noclr:
			mov		al,relflg				; 常駐解除ﾌﾗｸﾞ
			or		al,al					;
			jz		short mem_setup			;
			mov		si,OFFSET msg4			; 非常駐ﾒｯｾｰｼﾞ
			call	puts					;
			PRGEND							;
;-------------------------------------------;
;	常駐処理
;-------------------------------------------;
mem_setup:
			push	cs						;
			pop		es						; es=cs
			call	setpname				;
			mov		si,OFFSET msg1			; 常駐ﾒｯｾｰｼﾞ
			call	puts					;
;
			call	itim_setup				; ｲﾝﾀｰﾊﾞﾙﾀｲﾏ設定
			mov		BYTE PTR es:itimflg,0	; 常駐処理開始
;
			TSREND							; 常駐終了
;----------------------------------------------------------------------------
;	引数のﾁｪｯｸ
;----------------------------------------------------------------------------
argchk:										; 引数のﾁｪｯｸ
			mov		bx,OFFSET ARGUMENT		;
			mov		BYTE PTR optflg,0		;
arglp:										;
			inc		bx						;
			mov		al,[bx]					;
			cmp		al,0DH					;
			jne		short optchk			;
			ret								; 引数ﾁｪｯｸ終了
optchk:										; 引数ﾁｪｯｸ開始
			cmp		al,'-'					; ｵﾌﾟｼｮﾝｽｲｯﾁは'-','/'で始まる.
			je		short optsw1			;
			cmp		al,'/'					;
			je		short optsw1			;
			cmp		al,' '					; SPACE
			je		short arglp				;
			cmp		al,9H					; TAB
			je		short arglp				;
			jmp		opterr					;
optsw1:										;
			inc		bx						;
			mov		al,[bx]					;
			or		al,20H					; 大文字->小文字
			cmp		al,'r'					; 'r','R'か?
			jne		short optsw2			; NO->次のﾁｪｯｸへ
			mov		BYTE PTR relflg,1		; 常駐解除ﾌﾗｸﾞ ON
			jmp		short arglp				;
optsw2:										; 強調表示
			cmp		al,'h'					; 'h'か?
			jne		short optsw3			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定あり?
			jne		short optsw2chk			; YES->数値ﾁｪｯｸへ
			mov		WORD PTR colh,0000h		; 強調表示標準値設定
			jmp		short optswon			;
optsw2chk:									;
			or		ax,ax					;
			jnz		short optsw2chk2		; 0以外は次のﾁｪｯｸへ
			mov		colh,ax					;
			jmp		short optswon			;
optsw2chk2:									;
			cmp		ax,1					;
			jne		short opterr_00			; 1でなければｴﾗｰ
			mov		WORD PTR colh,2000h		; 強調表示ﾌﾗｸﾞ格納
			jmp		short optswon			;
optsw3:										; 表示位置(桁)
			cmp		al,'x'					; 'x'か?
			jne		short optsw4			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定あり?
			jne		short optsw3chk			; YES->数値ﾁｪｯｸへ
			mov		WORD PTR dispx,0		; 表示位置(桁)標準値設定
			jmp		short optswon			;
optsw3chk:									;
			cmp		ax,1					;
			jb		short opterr			; 1よりも小さければｴﾗｰ
			cmp		ax,71					;
			ja		short opterr			; 71よりも大きければｴﾗｰ
			dec		ax						; xは0〜79
			mov		dispx,ax				; 表示位置(桁)格納
			jmp		short optswon			;
arglp_00:									; 中継
			jmp		short arglp				; 次の引数処理へ
opterr_00:									; 中継
			jmp		short opterr			; ｴﾗｰへ
optpause:									;
			mov		al,[bx+1]				;
			cmp		al,' '					; SPACE
			je		short arglp_00			;
			cmp		al,9H					; TAB
			je		short arglp_00			;
			cmp		al,0DH					; 終了
			je		short arglp_00			;
			jmp		optsw1					;
optswon:									;
			mov		BYTE PTR optflg,1		; ｵﾌﾟｼｮﾝｽｲｯﾁ ON
			jmp		short optpause			;
optsw4:										; 表示位置(行)
			cmp		al,'y'					; 'y'か?
			jne		short optsw5			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定なし?
			jne		short optsw4chk			; NO->数値ﾁｪｯｸへ
			mov		WORD PTR dispy,24		; 表示位置(行)標準値設定
			jmp		short optswon			;
optsw4chk:									;
			cmp		ax,1					;
			jb		short opterr			; 1よりも小さければｴﾗｰ
			cmp		ax,25					;
			ja		short opterr			; 25よりも大きければｴﾗｰ
			dec		ax						; yは0〜24
			mov		dispy,ax				; 表示位置(行)格納
			jmp		short optswon			;
optsw5:										; 表示時間
			cmp		al,'t'					; 't'か?
			jne		short opterr			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定あり?
			jne		short optsw5chk			; YES->数値ﾁｪｯｸへ
			mov		WORD PTR disptime,10	; 表示時間標準値設定
			jmp		short optswon			;
optsw5chk:									;
			cmp		ax,1					;
			jb		short opterr			; 1よりも小さければｴﾗｰ
			cmp		ax,20					;
			ja		short opterr			; 20よりも大きければｴﾗｰ
			mov		disptime,ax				; 表示時間格納
			jmp		short optswon			;
opterr:										; ｵﾌﾟｼｮﾝｽｲｯﾁｴﾗｰ
			mov		BYTE PTR argflg,1		;
			ret								;
;----------------------------------------------------------------------------
;	文字列を整数に変換
;	< IN  >	: ds:bx	文字列の先頭位置-1
;	< RET >	: ax	整数値
;
;	< USE >	: bx, cx, dx
;----------------------------------------------------------------------------
atoi:										;
			inc		bx						;
			xor		ax,ax					; ax=0
			xor		dx,dx					; dx=0
			xor		ch,ch					; ch=0
			mov		BYTE PTR valflg,0		;
atoi_next:									;
			mov		cl,[bx]					; 文字ｺｰﾄﾞ取得
			sub		cl,'0'					; 文字->数字
			jb		short atoi_end			; '0'よりも小さければ終わり
			cmp		cl,9					; '9'よりも大きいか?
			ja		short atoi_end			; YESならば終わり
			push	cx						;
			mov		cx,0AH					;
			imul	cx						; AXを10倍する
			pop		cx						;
			add		ax,cx					; AXに新値を格納
			inc		bx						; 次の文字位置
			mov		BYTE PTR valflg,1		;
			jmp		short atoi_next			;
atoi_end:									;
			dec		bx						; 先読み分を戻す
			ret								;
main		ENDP							;
;
tsrflg		DB		0						; 常駐ﾌﾗｸﾞ
argflg		DB		0						; 引数ﾁｪｯｸﾌﾗｸﾞ
optflg		DB		0						; ｵﾌﾟｼｮﾝﾌﾗｸﾞ
valflg		DB		0						; ｵﾌﾟｼｮﾝ数値ﾌﾗｸﾞ
relflg		DB		0						; 常駐解除ﾌﾗｸﾞ
;
pspseg		DW		?						; PSPｾｸﾞﾒﾝﾄ
prgname		DB		12,'VMETER v1.01',0Dh	;
prgnamelen	EQU		$-prgname				;
;
msg0		DB		CR,LF,'Volume Meter  Version 1.01  (C)パオパオ 1992-1993.'
			DB		CR,LF,0
msg1		DB		'★ 常駐します ★',CR,LF,0
msg2		DB		'☆ 常駐解除しました ☆',CR,LF,0
msg3		DB		'常駐しています.',CR,LF,0
msg4		DB		'常駐していません.',CR,LF,BEL,0
msg5		DB		'オプションパラメタ値を更新しました.',CR,LF,BEL,0
msg6		DB		'メモリの状態が正しくありません.',CR,LF,BEL,0
msg7		DB		'メモリの開放に失敗しました.',CR,LF,BEL,0
;
clrmsg		DB		'          ',0
;
usage		DB		"Usage: 'VMETER "
			DB		"[-r] [-x[n]] [-y[n]] [-t[n]]'"
			DB		CR,LF
			DB		'        -r       常駐解除       ',CR,LF
			DB		'        -h[n]    強調表示       '
			DB		'n: 0=しない, 1=する,   標準: 0',CR,LF
			DB		'        -x[n]    表示桁位置     '
			DB		'n: 1〜71,              標準: 1',CR,LF
			DB		'        -y[n]    表示行位置     '
			DB		'n: 1〜25,              標準: 25(最下行)',CR,LF
			DB		'        -t[n]    表示間隔       '
			DB		'n: 1〜20 (単位10ms),   標準: 10(0.10秒)',CR,LF
			DB		0
;
code		ENDS							;
			END		entry					;
;
;============================================================================
;	ｱﾄﾘﾋﾞｭｰﾄ
;
;	Middle Resolution Display Type
;
;	   7   6   5   4   3   2   1   0
;	┌─┬─┬─┬─┬─┬─┬─┬─┐
;	└─┴─┴─┴─┴─┴─┴─┴─┘
;      0  ↓   I  BLK REV  G   R   B
;		 KANJI
;
;		G R B			G R B			G R B			G R B
;	黒  0 0 0		青	0 0 1		赤	0 1 0		紫	0 1 1
;	緑  1 0 0		水	1 0 1		黄	1 1 0		白	1 1 1
;============================================================================
;
;	< HISTORY >
;============================================================================
;	1992.12.22 : CREATE
;	1993.03.02 : 常駐時にﾃﾞﾌｫﾙﾄｵｰﾌﾟﾝﾌｧｲﾙをｸﾛｰｽﾞするようにした.
;============================================================================

