;==============================================================================
;	<< MASM V5.1 >>  for  FM TOWNS
;==============================================================================
.286
	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
;	1991.08.31 : Version 0.72R  ﾒｯｾｰｼﾞ出力をDOSﾌｧﾝｸｼｮﾝ使用に変更.
;
;	All Rights Reserved, Copyright (C) Y.Hirata 1990-1991.
;
;	Programmed 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			01Bh,'[2K',0Dh,0Ah,07h
			db			0Dh,0Ah,09h
			db			'ACCESS LAMP  V0.72R   1991-08-31',0Dh,0Ah
			db			0Dh,0Ah,09h
			db			'Copyright (C) Y.Hirata 1990-1991.'
			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
;
INT_TIME	EQU			97h						; ﾀｲﾏ管理BIOS
;
INT_MODE	EQU			0						; 割り込みﾓｰﾄﾞ : ｲﾝﾀｰﾊﾞﾙﾓｰﾄﾞ
INT_INF		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						; 多重割り込み防止用
itimflg		db		FALSE						; 多重割り込み防止用
;
parablock	db		INT_MODE					;
			db		0							;
			dw		offset itimer_handr			; ﾊﾝﾄﾞﾗ･ｵﾌｾｯﾄ
			dw		?							; ﾊﾝﾄﾞﾗ･ｾｸﾞﾒﾝﾄ
			dw		0							;
			dw		1							; 10ms のｲﾝﾀｰﾊﾞﾙ設定
;
itimer_no	db		?							; ﾀｲﾏ管理番号
;
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
;
;
;***********************************************;
;			常駐処理部
;***********************************************;
;
;-----------------------------------------------;
;	ｲﾝﾀｰﾊﾞﾙﾀｲﾏ割り込みの横取り処理
;-----------------------------------------------;
itimer_handr	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		itimflg,TRUE				; 多重割り込み防止
			jne		itim						;
			jmp		short itim_end				;
itim:		mov		itimflg,TRUE				;
;
			cmp		dispflg,TRUE				; 書き換え有り?
			je		itim_on						;
			jmp		short itim_end				;
itim_on:										;
			cmp		time_cnt,ERACE_CNT			;
			jae		itim_erace					;
			inc		time_cnt					;
			jmp		short itim_end				;
itim_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				; 書き換え済
;
itim_end:										;
			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:itimflg,FALSE			;
;
			ret									;
itimer_handr	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
;-----------------------------------------------;
;
;-----------------------------------------------;
;	文字列表示
;
;	< INPUT >
;	si : 文字列格納位置	
;	cx : 文字数
;-----------------------------------------------;
outchar		PROC								;
			mov		ah,02						;
			mov		dl,[si]						;
			int		21h							; 文字表示
			inc		si							;
			loop	outchar						;
			ret									;
outchar		ENDP								;
;
;***********************************************;
;			起動処理( メイン )
;***********************************************;
;
;-----------------------------------------------;
;			タイマの登録
;-----------------------------------------------;
ITIMER_init		proc							;
			push	di							;
;
			mov		WORD ptr [parablock+4],cs	;
			mov		di,offset parablock			;
			xor		ax,ax						;
			int		INT_TIME					;
			mov		itimer_no,al				; ﾀｲﾏ管理番号
;
			pop		di							;
			ret									;
ITIMER_init		endp							;
;
;-----------------------------------------------;
;			タイマの取消
;-----------------------------------------------;
ITIMER_release	proc							;
			mov		ah,01h						;
			mov		al,es:itimer_no				;
			int		INT_TIME					;
			shr		ax,8						; ﾘﾀｰﾝｺｰﾄﾞ
			ret									;
ITIMER_release	endp							;
;
;-----------------------------------------------;
;			メイン処理
;-----------------------------------------------;
main		proc	near						;
;
			mov		cx,msg0_len					; ｵｰﾌﾟﾆﾝｸﾞﾒｯｾｰｼﾞ(文字数)
			lea		si,msg0						;
			call	outchar						;
;
			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					; 開放ﾒｯｾｰｼﾞ
			lea		si,msg2						;
			call	outchar						;
;
			lds		dx,DWORD ptr es:vct_93h		;
			mov		ax,2593h					; ﾃﾞｨｽｸBIOSを元のﾍﾞｸﾀに!
			int		21h							;
			call	ITIMER_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							;
;
			pgend								;
;
mem_noclr:
			mov		cx,msg4_len					; 非常駐ﾒｯｾｰｼﾞ
			lea		si,msg4						;
			call	outchar						;
			pgend								;
;
;
;	常駐処理
;
tsr_init:
			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					; 常駐済ﾒｯｾｰｼﾞ
			lea		si,msg3						;
			call	outchar						;
			mov		cx,msghp_len				; ﾍﾙﾌﾟﾒｯｾｰｼﾞ
			lea		si,msghp					;
			call	outchar						;
			pgend								;
;
mem_setup:
			mov		cx,msg1_len					; 常駐ﾒｯｾｰｼﾞ
			lea		si,msg1						;
			call	outchar						;
			mov		cx,msghp_len				; ﾍﾙﾌﾟﾒｯｾｰｼﾞ
			lea		si,msghp					;
			call	outchar						;
;
			call	ITIMER_init					; ｲﾝﾀｰﾊﾞﾙﾀｲﾏ設定
;
			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-1991.'
			db		0Dh,0Ah
			db		'Access Lamp  Version 0.72R  '
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		; 白色
;

