;============================================================================
;	<< MASM V5.1 >>  for  FM TOWNS
;============================================================================
.186
	PAGE		60,132
	NAME		ACLAMP
	TITLE		Access Lamp
;============================================================================
;	Access Lamp program (FMｼﾘｰｽﾞ)
;
;	ﾃﾞｨｽｸｱｸｾｽの状態表示をする.
;
;	All Rights Reserved, Copyright (C) Y.Hirata 1990-1993.
;	Programmed by Y.Hirata ( NIFTY-ID : NAB03321 )
;
;	Spetial Thanks : PATCH MAN ( NIFTY-ID : NAC01123 )
;
;	< NOTE >
;	● ｱｾﾝﾌﾞﾙ方法 ●
;	中解像度: masm aclamp,aclamp50;
;	高解像度: masm /DHIGH_RESO aclamp,aclamp70;
;============================================================================
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
;----------------------------------------------------------------------------
%HIGH_RESO	LABEL	BYTE					; 機種別ｱｾﾝﾌﾞﾙ用
;
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		'Access Lamp  Version 1.01   1993.03.02'
			DB		CR,LF,TAB
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
			DB		'( Middle Resolution Display Type )',CR,LF
ELSE										; ● 高解像度 ●
			DB		'( High Resolution Display Type )',CR,LF
ENDIF										;
;///////////////////////////////////////////;
			DB		CR,LF,TAB
			DB		'Copyright (C) Y.Hirata 1990-1993.',CR,LF
			DB		CR,LF,EOF
;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
TITLE_name	DB		'Access Lamp R50系'		; 常駐ﾁｪｯｸ用文字列
ELSE										; ● 高解像度 ●
TITLE_name	DB		'Access Lamp R70系'		; 常駐ﾁｪｯｸ用文字列
ENDIF										;
;///////////////////////////////////////////;
TITLE_len	EQU		$-TITLE_name			;
;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
TVRAM		EQU		0C800h					; ﾃｷｽﾄVRAMｾｸﾞﾒﾝﾄ
KANJI		EQU		0CA00h					; 漢字VRAMｾｸﾞﾒﾝﾄ
ELSE										; ● 高解像度 ●
TVRAM		EQU		0F800h					; ﾃｷｽﾄVRAMｾｸﾞﾒﾝﾄ
AVRAM		EQU		0FA00h					; ｱﾄﾘﾋﾞｭｰﾄｾｸﾞﾒﾝﾄ
ENDIF										;
;///////////////////////////////////////////;
;
INT_TIME	EQU		97h						; ﾀｲﾏ管理BIOS
INT_MODE	EQU		0						; 割り込みﾓｰﾄﾞ : ｲﾝﾀｰﾊﾞﾙﾓｰﾄﾞ
INT_INF		EQU		0						; 割り込みﾓｰﾄﾞ使用
;
DEV_CD		EQU		0C0h					; ﾃﾞﾊﾞｲｽ : CD
DEV_FD		EQU		020h					;        : FD
DEV_HD		EQU		0B0h					;        : HD
DEV_ICM		EQU		050h					;        : ICﾒﾓﾘｶｰﾄﾞ
DEV_RAM		EQU		040h					;        : RAM
DEV_SRAM	EQU		041h					;        : SRAM
DEV_ROM		EQU		042h					;        : ROM
DEV_BRAM	EQU		043h					;        : ﾊﾞｯｸｱｯﾌﾟRAM
;
;****************************************************************************
;			データ領域
;****************************************************************************
vct93h		DD		FAR						; DISK-BIOS
int93flg	DB		0						; DISK-BIOS処理ﾌﾗｸﾞ
itimflg		DB		0						; 多重割り込み防止用
;
timecnt		DW		0						; ｲﾝﾀｰﾊﾞﾙﾀｲﾏのｶｳﾝﾀ
parablock	DB		INT_MODE				;
			DB		0						;
			DW		OFFSET itimhandr		; ﾊﾝﾄﾞﾗ･ｵﾌｾｯﾄ
			DW		?						; ﾊﾝﾄﾞﾗ･ｾｸﾞﾒﾝﾄ
			DW		0						;
			DW		1						; 10ms のｲﾝﾀｰﾊﾞﾙ設定
itimerno	DB		?						; ﾀｲﾏ管理番号
dispflg		DB		0						; 書き換え用(表示中ﾌﾗｸﾞ)
;
paraoff		LABEL	BYTE					;
dispx		DW		68						; 表示位置(桁) 0〜
dispy		DW		24						; 表示位置(行) 0〜
funcflg		DB		0						; R/W以外のﾌｧﾝｸｼｮﾝ表示ﾌﾗｸﾞ
revflg		DW		0800h					; 反転表示
eracetime	DW		50						; 表示消去時間(10ms単位)
parasize	EQU		$-paraoff				; ﾊﾟﾗﾒﾀ領域ｻｲｽﾞ
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
rcol		DW		2400h					; 反転?/強調/GREEN
wcol		DW		2200h					; 反転?/強調/RED
xcol		DW		0700h					; 反転?/WHITE
ecol		DW		0100h					; BLUE
ELSE										; ● 高解像度 ●
rcol		DW		000Ch					; 反転?/強調/GREEN
wcol		DW		000Ah					; 反転?/強調/RED
xcol		DW		0007h					; 反転?/WHITE
ecol		DW		0001h					; BLUE
ENDIF										;
;///////////////////////////////////////////;
;
dispcol		DW		?						; 表示属性
dispmsgp	DW		?						; 表示ﾒｯｾｰｼﾞ
;
rax			DW		0						; AX
;
CDmsg		DB		'CD',0					; CD
FDmsg		DB		'FD',0					; FD
HDmsg		DB		'HD',0					; HD
ICMmsg		DB		'IC',0					; ICﾒﾓﾘｶｰﾄﾞ
;-------------------------------------------; ﾒﾓﾘﾃﾞｨｽｸ
RAMmsg		DB		'RA',0					; RAM
SRAMmsg		DB		'SR',0					; SRAM
ROMmsg		DB		'RO',0					; ROM
BRAMmsg		DB		'BR',0					; ﾊﾞｯｸｱｯﾌﾟRAM
;
sixteen		DB		16						;
XXmsg		DB		'XX',0					; ??
XXlen		EQU		$-XXmsg-1				;
;
Memdisktbl	DB		DEV_RAM					; ﾒﾓﾘﾃﾞｨｽｸﾁｪｯｸﾃｰﾌﾞﾙ
			DW		OFFSET RAMmsg			;
			DB		DEV_SRAM				;
			DW		OFFSET SRAMmsg			;
			DB		DEV_ROM					;
			DW		OFFSET ROMmsg			;
			DB		DEV_BRAM				;
			DW		OFFSET BRAMmsg			;
Memdiskend	LABEL	BYTE					;
;
Disktbl		DB		DEV_CD					; ﾃﾞｨｽｸﾁｪｯｸﾃｰﾌﾞﾙ(ﾕﾆｯﾄ=0)
			DW		OFFSET CDmsg			;
			DB		DEV_FD					;
			DW		OFFSET FDmsg			;
			DB		DEV_HD					;
			DW		OFFSET HDmsg			;
			DB		DEV_ICM					;
			DW		OFFSET ICMmsg			;
Disktblend	LABEL	BYTE					;
;
;****************************************************************************
;			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							;
;----------------------------------------------------------------------------
INT93H		MACRO							; DISK-BIOS call
			pushf							;
			call	cs:[vct93h]				;
			ENDM							;
;----------------------------------------------------------------------------
CONVERT		MACRO	val,base,dest			; 数字(0〜15)->文字
			local	table,start				;
			jmp		short start				;
table		DB		"0123456789ABCDEF"		;
start:										;
			push	ax						;
			push	bx						;
			push	dx						;
			mov		al,val					;
			xor		ah,ah					; AH=0
			xor		bx,bx					; BX=0
			div		base					; AX/base->AL(商),AH(剰余)
			mov		bl,al					;
			mov		al,cs:table[bx]			;
			mov		dest,al					;
			mov		bl,ah					;
			mov		al,cs:table[bx]			;
			mov		dest[1],al				;
			pop		dx						;
			pop		bx						;
			pop		ax						;			
			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,160					;
;;			imul	WORD PTR [bp+6]			; y
			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
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
			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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	WORD ACCESS								;
;			mov		WORD PTR es:[bx],ax		; text vram
;			inc		bx						;
;			inc		bx						; offset update
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	BYTE ACCESS								; 16β互換はWORD ACCESS不可
			mov		BYTE PTR es:[bx],al		; code->text vram
			inc		bx						;
			mov		BYTE PTR es:[bx],ah		; attr->text vram
			inc		bx						;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELSE										; ● 高解像度 ●
			mov		ax,TVRAM				;
			mov		es,ax					; code segment
			mov		si,WORD PTR [bp+8]		; str
			mov		dx,WORD PTR [bp+10]		; attr
TVputslp:									;
			mov		al,BYTE PTR [si]		;
			or		al,al					; 文字列終端 ?
			jz		short TVputsend			; YES->TVputsend
;
			sub		ah,ah					;
			mov		WORD PTR es:[bx],ax		; code->text vram
			push	es						;
			mov		ax,AVRAM				; attribute segment
			mov		es,ax					;
			mov		WORD PTR es:[bx],dx		; attr->text vram
			pop		es						;
			inc		bx						;
			inc		bx						; offset update
ENDIF										;
;///////////////////////////////////////////;
			inc		si						;
			jmp		short TVputslp			;
TVputsend:									;
			pop		es						; 使用ﾚｼﾞｽﾀ復元
			pop		si						;
			pop		bx						;
			pop		dx						;
			pop		ax						;
			mov		sp,bp					; ｽﾀｯｸﾌﾚｰﾑ開放
			pop		bp						;
			ret								;
TVputs		ENDP							;
;----------------------------------------------------------------------------
;	int93hﾌｧﾝｸｼｮﾝ状態表示(ds=csでcall)
;	< IN  >	: dx	表示文字列先頭ｱﾄﾞﾚｽ
;
;	< USE >	: ax
;----------------------------------------------------------------------------
int93mon:									;
			mov		ax,dispcol				; 表示属性
			or		ax,WORD PTR revflg		;
			push	ax						;
			mov		dispmsgp,dx				; 文字列ｱﾄﾞﾚｽ
			push	dx						; str
			mov		ax,dispy				; 表示位置(行) 0〜
			push	ax						; y
			mov		ax,dispx				; 表示位置(桁) 0〜
			push	ax						; x
			call	TVputs					; ﾌｧﾝｸｼｮﾝ状態表示
			add		sp,8					;
			mov		BYTE PTR dispflg,1		; 表示中ﾌﾗｸﾞｾｯﾄ
			mov		WORD PTR timecnt,0		; ｶｳﾝﾀｸﾘｱ
			ret								;
;----------------------------------------------------------------------------
;	int93hﾌｧﾝｸｼｮﾝ状態消去(ds=csでcall)
;	< IN  >	: dx	表示文字列先頭ｱﾄﾞﾚｽ
;
;	< USE >	: ax
;----------------------------------------------------------------------------
int93erace:									;
			mov		ax,ecol					; 表示属性
			push	ax						;
			mov		dx,dispmsgp				; 文字列ｱﾄﾞﾚｽ
			push	dx						; str
			mov		ax,dispy				; 表示位置(行) 0〜
			push	ax						; y
			mov		ax,dispx				; 表示位置(桁) 0〜
			push	ax						; x
			call	TVputs					; ﾌｧﾝｸｼｮﾝ状態表示
			add		sp,8					;
			mov		BYTE PTR dispflg,0		; 表示中ﾌﾗｸﾞｸﾘｱ
			mov		WORD PTR timecnt,0		; ｶｳﾝﾀｸﾘｱ
			ret								;
;----------------------------------------------------------------------------
;	int93hﾌｧﾝｸｼｮﾝ状態表示色設定(ds=csでcall)
;	< RET >	: ｷｬﾘｰ	onならば該当色なし
;
;	< USE >	: ax
;----------------------------------------------------------------------------
setcolor:									;
			mov		ax,rax					; DISK-BIOS呼出時のAX
			cmp		ah,05h					; read ?
			jne		short setcol_wchk		; NO->次のﾁｪｯｸ
			mov		ax,rcol					;
			mov		dispcol,ax				;
			jmp		short setcol_dev		;
setcol_wchk:								;
			cmp		ah,06h					; write ?
			jne		short setcol_echk		; NO->その他へ
			mov		ax,wcol					;
			mov		dispcol,ax				;
			jmp		short setcol_dev		;
setcol_echk:								;
			cmp		BYTE PTR funcflg,1		; R/W以外のﾌｧﾝｸｼｮﾝ表示 ?
			je		short setcol_etc		; YES->色設定
			jmp		short setcol_end		; NO ->終了
setcol_etc:									;
			mov		ax,xcol					; その他
			mov		dispcol,ax				;
setcol_dev:									;
			clc								;
			ret								;
setcol_end:									;
			stc								; ｷｬﾘｰon
			ret								;
;----------------------------------------------------------------------------
;	int93hﾌｧﾝｸｼｮﾝ状態表示ﾒｯｾｰｼﾞ設定
;	(ds=csでcall)
;	< IN  >	: ax	DISK-BIOS呼出時のAX
;	< RET >	: dx	表示文字列先頭ｱﾄﾞﾚｽ
;
;	< USE >	: ax, si
;----------------------------------------------------------------------------
setmessage:									;
			mov		ax,rax					; DISK-BIOS呼出時のAX
			mov		si,OFFSET Memdisktbl	;
setmsg_lp1:									; ﾒﾓﾘﾃﾞｨｽｸﾁｪｯｸ
			cmp		al,[si]					;
			je		short setmsg_disk		;
			add		si,3					;
			cmp		si,OFFSET Memdiskend	;
			jne		short setmsg_lp1		;
;
			and		al,0F0h					; ﾕﾆｯﾄ番号無視
			mov		si,OFFSET Disktbl		;
setmsg_lp2:									; ﾃﾞｨｽｸﾁｪｯｸ
			cmp		al,[si]					;
			je		short setmsg_disk		;
			add		si,3					;
			cmp		si,OFFSET Disktblend	;
			jne		short setmsg_lp2		;
			jmp		short setmsg_xx			;
setmsg_disk:								; ﾃﾞｨｽｸ処理
			mov		dx,[si+1]				;
			ret								;
setmsg_xx:									; 不明ﾃﾞﾊﾞｲｽ処理
			mov		ax,rax					; その他
			CONVERT	al,sixteen,XXmsg[0]		; AL
			mov		dx,OFFSET XXmsg			; ??
			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								;
			cmp		BYTE PTR int93flg,1		; DISK-BIOS処理あり ?
			je		short itim_dispchk		; YES->表示処理開始
			jmp		short itim_eracechk		; NO ->消去処理へ
itim_dispchk:								;
			call	setcolor				; 表示色設定
			jc		short itim_dispend		;
			call	setmessage				; 表示ﾒｯｾｰｼﾞ設定
itim_disp:									;
			call	int93mon				; ﾌｧﾝｸｼｮﾝ状態表示
itim_dispend:								;
			mov		BYTE PTR int93flg,0		; DISK-BIOS処理ﾌﾗｸﾞｸﾘｱ
			jmp		short itim_end			;
itim_eracechk:								;
			cmp		BYTE PTR dispflg,1		; 表示中 ?
			jne		short itim_end			; NO->終了
			mov		ax,eracetime			;
			cmp		timecnt,ax				;
			jae		short itim_erace		; 表示消去時間以上ならば消去
			inc		WORD PTR timecnt		; ｶｳﾝﾄｱｯﾌﾟ
			jmp		short itim_end			;
itim_erace:									;
			call	int93erace				; 表示消去
itim_end:									;
			mov		BYTE PTR cs:itimflg,0	; 処理中ﾌﾗｸﾞｸﾘｱ
			sti								;
			ret								;
itimhandr	ENDP							;
;----------------------------------------------------------------------------
;	DISK-BIOSの横取り処理
;----------------------------------------------------------------------------
INT93hook	PROC	FAR						;
			mov		cs:rax,ax				; DISK-BIOS呼出時のAX保存
			INT93H							; DISK-BIOS call
			mov		BYTE PTR cs:int93flg,1	; DISK-BIOS処理ﾌﾗｸﾞｾｯﾄ
			sti								; 割り込み許可
			ret		2						; ﾌﾗｸﾞをpopせずに,iretをｼﾐｭﾚｰﾄ
INT93hook	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:									;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
			mov		ax,0700h				; 白
ELSE										; ● 高解像度 ●
			mov		ax,0007h				; 白
ENDIF										;
;///////////////////////////////////////////;
			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								;
;----------------------------------------------------------------------------
;	DISK-BIOSﾍﾞｸﾀ取得(ds=csでcall)
;	< RET >	: es:bx	ﾍﾞｸﾀｱﾄﾞﾚｽ
;----------------------------------------------------------------------------
getvct:										;
			mov		ax,3593h				;
			int		21h						; DISK-BIOS割込みﾍﾞｸﾀ取得
			mov		WORD PTR vct93h,bx		;
			mov		WORD PTR vct93h+2,es	; 本来のDISK-BIOSﾍﾞｸﾀの取得･保存
			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		; 常駐ﾌﾗｸﾞｸﾘｱ
			mov		BYTE PTR hookflg,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:									; 非常駐
			push	bx						;
			push	es						;
			call	getvct					; DISK-BIOS割込みﾍﾞｸﾀ取得
			pop		es						;
			pop		bx						;
vctchk_00:									;
			mov		ax,es					;
			cmp		WORD PTR vct93h+2,ax	; 常駐ｾｸﾞﾒﾝﾄ比較
			je		short vctchk_99			;
			mov		BYTE PTR hookflg,1		; ﾍﾞｸﾀﾌｯｸされている
vctchk_99:									;
			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ｾｸﾞﾒﾝﾄ保存
;
; COMﾌｧｲﾙとするのでｺﾒﾝﾄとする.
;			mov		ax,cs					;
;			mov		ds,ax					;
;			mov		es,ax					;
;			mov		ss,ax					; ss=es=ds=cs
			cli								; 割り込み禁止
			cld								;
;
			mov		si,OFFSET msg0			; ｵｰﾌﾟﾆﾝｸﾞﾒｯｾｰｼﾞ(文字列)
			call	puts					;
			call	tsr_chk					; 常駐ﾁｪｯｸ
			cmp		BYTE PTR tsrflg,0		; 常駐していない ?
			jz		short arg_chk			; YES->arg_chk
;
			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
			mov		si,OFFSET paraoff		;
			mov		di,OFFSET _paraoff		;
			mov		cx,parasize				; ﾊﾟﾗﾒﾀ領域ｻｲｽﾞ(保持用)
	rep		movsb							; ds:si->es:di
			pop		es						;
			pop		ds						;
arg_chk:									;
			sti								;
			call	argchk					; 引数のﾁｪｯｸ
			mov		al,argflg				;
			or		al,al					; al=0 ?
			jz		short tsr_init			; YES->通常処理開始へ
			mov		si,OFFSET usage			; ﾍﾙﾌﾟﾒｯｾｰｼﾞ
			call	puts					;
			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->終了
mem_clrchk:									;
			cmp		BYTE PTR hookflg,0		; ﾍﾞｸﾀﾌｯｸされていないか ?
			je		short mem_clear_ok		; YES->常駐解除
			mov		si,OFFSET msg8			; 常駐解除不可ﾒｯｾｰｼﾞ
			call	puts					;
			PRGEND							;
mem_clear_ok:								;
			push	ds						;
			lds		dx,DWORD PTR es:vct93h	;
			mov		ax,2593h				; DISK-BIOSを元のﾍﾞｸﾀに!
			int		21h						;
			call	itim_release			; ｲﾝﾀｰﾊﾞﾙﾀｲﾏの解除
;
; 常駐時に開放するようにしたので, ｺﾒﾝﾄとする.
;			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						;
			pop		ds						;
			jc		short mem_clrerr		; ﾒﾓﾘ開放失敗
			mov		si,OFFSET msg2			; 開放ﾒｯｾｰｼﾞ
			jmp		short mem_clrend		;
mem_clrerr:									;
			mov		si,OFFSET msg7			; ﾒﾓﾘ開放失敗ﾒｯｾｰｼﾞ
mem_clrend:									;
			call	puts					;
			call	dispclr					; 表示ｸﾘｱ
			PRGEND							;
;
mem_update:									; 常駐領域内のﾊﾟﾗﾒﾀ値変更
			mov		si,OFFSET msg3			; 常駐済ﾒｯｾｰｼﾞ
			call	puts					;
			mov		al,optflg				;
			or		al,al					; ｵﾌﾟｼｮﾝ指定なし ?
			jz		short mem_upend			; YES->終了
			cli								;
			call	dispclr					; 表示ｸﾘｱ
			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:									;
			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		dx,OFFSET INT93hook		; 常駐処理ﾌﾟﾛｼｼﾞｬを
			mov		ax,2593h				; ﾍﾞｸﾀｾｯﾄ
			int		21h						; (DISK-BIOS)
;
			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:										; R/W以外のﾌｧﾝｸｼｮﾝ表示
			cmp		al,'f'					; 'f'か ?
			jne		short optsw3			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定あり ?
			jne		short optsw2chk			; YES->数値ﾁｪｯｸへ
			mov		BYTE PTR funcflg,0		; 表示ﾌﾗｸﾞ標準値設定
			jmp		short optswon			;
optsw2chk:									;
			cmp		ax,0					;
			jb		short opterr_00			; 0よりも小さければｴﾗｰ
			cmp		ax,1					;
			ja		short opterr_00			; 1よりも大きければｴﾗｰ
			mov		funcflg,al				; 表示ﾌﾗｸﾞ格納
			jmp		short optswon			;
optsw3:										; 反転表示
			cmp		al,'v'					; 'v'か ?
			jne		short optsw4			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定あり ?
			jne		short optsw3chk			; YES->数値ﾁｪｯｸへ
			mov		WORD PTR revflg,0800h	; 反転表示ﾌﾗｸﾞ標準値設定
			jmp		short optswon			;
optsw3chk:									;
			or		ax,ax					;
			jnz		short optsw3chk2		; 0以外は次のﾁｪｯｸへ
			mov		revflg,ax				;
			jmp		short optswon			;
optsw3chk2:									;
			cmp		ax,1					;
			jne		short opterr_00			; 1でなければｴﾗｰ
			mov		WORD PTR revflg,0800h	; 反転表示ﾌﾗｸﾞ格納
			jmp		short optswon			;
optsw4:										; 表示位置(桁)
			cmp		al,'x'					; 'x'か ?
			jne		short optsw5			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定あり ?
			jne		short optsw4chk			; YES->数値ﾁｪｯｸへ
			mov		WORD PTR dispx,68		; 表示位置(桁)標準値設定
			jmp		short optswon			;
optsw4chk:									;
			cmp		ax,1					;
			jb		short opterr			; 1よりも小さければｴﾗｰ
			cmp		ax,80					;
			ja		short opterr			; 80よりも大きければｴﾗｰ
			dec		ax						; xは0〜79
			mov		dispx,ax				; 表示位置(桁)格納
			jmp		short optswon			;
opterr_00:									; 中継
			jmp		short opterr			; ｴﾗｰへ
arglp_00:									; 中継
			jmp		arglp					; 次の引数処理へ
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			;
optsw5:										; 表示位置(行)
			cmp		al,'y'					; 'y'か ?
			jne		short optsw6			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定なし ?
			jne		short optsw5chk			; NO->数値ﾁｪｯｸへ
			mov		WORD PTR dispy,24		; 表示位置(行)標準値設定
			jmp		short optswon			;
optsw5chk:									;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
			cmp		ax,1					;
			jb		short opterr			; 1よりも小さければｴﾗｰ
			cmp		ax,25					;
			ja		short opterr			; 25よりも大きければｴﾗｰ
			dec		ax						; yは0〜24
			mov		dispy,ax				; 表示位置(行)格納
ELSE										; ● 高解像度 ●
			cmp		ax,1					;
			jb		short opterr			; 1よりも小さければｴﾗｰ
			cmp		ax,30					;
			ja		short opterr			; 30よりも大きければｴﾗｰ
			dec		ax						; yは0〜29
			mov		dispy,ax				; 表示位置(行)格納
ENDIF										;
;///////////////////////////////////////////;
			jmp		short optswon			;
optsw6:										; 表示消去時間
			cmp		al,'t'					; 't'か ?
			jne		short opterr			; NO->次のﾁｪｯｸへ
			call	atoi					;
			cmp		BYTE PTR valflg,0		; 数値指定あり ?
			jne		short optsw6chk			; YES->数値ﾁｪｯｸへ
			mov		WORD PTR eracetime,50	; 表示消去時間標準値設定
			jmp		short optswon			;
optsw6chk:									;
			cmp		ax,10					;
			jb		short opterr			; 10よりも小さければｴﾗｰ
			cmp		ax,100					;
			ja		short opterr			; 100よりも大きければｴﾗｰ
			mov		eracetime,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							;
;-------------------------------------------; 起動前の値を保持する領域
_paraoff	LABEL	BYTE					;
_dispx		DW		0						; 表示位置(桁) 0〜
_dispy		DW		24						; 表示位置(行) 0〜
_funcflg	DB		0						; R/W以外のﾌｧﾝｸｼｮﾝ表示ﾌﾗｸﾞ
_revflg		DW		0800h					; 反転表示
_eracetime	DW		50						; 表示消去時間(10ms単位)
;-------------------------------------------;
tsrflg		DB		0						; 常駐ﾌﾗｸﾞ
argflg		DB		0						; 引数ﾁｪｯｸﾌﾗｸﾞ
optflg		DB		0						; ｵﾌﾟｼｮﾝﾌﾗｸﾞ
valflg		DB		0						; ｵﾌﾟｼｮﾝ数値ﾌﾗｸﾞ
relflg		DB		0						; 常駐解除ﾌﾗｸﾞ
hookflg		DB		0						; ﾍﾞｸﾀﾌｯｸﾌﾗｸﾞ
;
pspseg		DW		?						; PSPｾｸﾞﾒﾝﾄ
prgname		DB		12,'ACLAMP v1.01',0Dh	;
prgnamelen	EQU		$-prgname				;
;
msg0		DB		CR,LF,'Access Lamp  Version 1.01'
			DB		'  (C)パオパオ 1990-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
msg8		DB		'ベクタをフックされているため, 常駐解除できません.'
			DB		CR,LF,BEL,0
;
clrmsg		DB		'  ',0
;
usage		DB		"Usage: 'ACLAMP "
			DB		"[-r] [-f[n]] [-v[n]] [-x[n]] [-y[n]] [-t[n]]'"
			DB		CR,LF
			DB		'        -r       常駐解除       ',CR,LF
			DB		'        -f[n]    R/W以外も表示  '
			DB		'n: 0=しない, 1=する,   標準: 0',CR,LF
			DB		'        -v[n]    反転表示       '
			DB		'n: 0=しない, 1=する,   標準: 1',CR,LF
			DB		'        -x[n]    表示桁位置     '
			DB		'n: 1〜80,              標準: 69',CR,LF
			DB		'        -y[n]    表示行位置     '
;///////////////////////////////////////////;
IFNDEF HIGH_RESO							; ● 中解像度 ●
			DB		'n: 1〜25,              標準: 25(最下行)',CR,LF
ELSE										; ● 高解像度 ●
			DB		'n: 1〜30,              標準: 25(最下行)',CR,LF
ENDIF										;
;///////////////////////////////////////////;
			DB		'        -t[n]    表示消去時間   '
			DB		'n: 10〜100 (単位10ms), 標準: 50(0.5秒)',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
;	.........................................................................
;
;	High Resolution Display Type
;
;	   7   6   5   4   3   2   1   0
;	┌─┬─┬─┬─┬─┬─┬─┬─┐
;	└─┴─┴─┴─┴─┴─┴─┴─┘
;      0   0   0   0   I   G   R   B
;
;	  15  14  13  12  11  10   9   8
;	┌─┬─┬─┬─┬─┬─┬─┬─┐
;	└─┴─┴─┴─┴─┴─┴─┴─┘
;      0  SCT UNS BLK REV VTL OVL UNL
;	.........................................................................
;
;		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 >
;============================================================================
;	1990.05.20 : CREATE
;	1990.06.02 : V0.70  ROM,RAM にも対応｡
;	1990.06.03 : V0.71  細かい修正 etc.
;	1991.08.31 : V0.72  ﾒｯｾｰｼﾞ出力をDOSﾌｧﾝｸｼｮﾝ使用に変更.
;	1992.10.23 : FMRのﾃｷｽﾄVRAM直書に変更. (FMR50/FMR70用に別々ｱｾﾝﾌﾞﾙする)
;	1992.11.01 : ﾃﾞｨｽｸBIOSに対する影響を最小限にするため, ｲﾝﾀｰﾊﾞﾙﾀｲﾏ割り込み
;				 で表示/消去をするようにした.
;	1992.11.15 : MCBﾁｪｯｸにより, 再常駐しないようにした.
;	1993.03.02 : 常駐時にﾃﾞﾌｫﾙﾄｵｰﾌﾟﾝﾌｧｲﾙをｸﾛｰｽﾞするようにした.
;============================================================================

