;*************************************************************************
;	Ｐ２５ファイル３２Ｋ色　変換Ｌｏａｄｅｒ ｖｅｒ０．６Ｍ
;			　・マウス対応版・
;		制作年月日　平成２年　４月　０４日
;	Ｐｒｏｇｒａｍｅｄ　ｂｙ　ＫＸＣ　Ｕ・Ｋ　ＵＯＴＡ
;
;	○対応機種：		ＦＭ－ＴＯＷＮＳシリーズ
;	○ソースファイル名：	Ｐ２５ＸＬＦ１０．ＡＳＭ
;	○実行ファイル名：	Ｐ２５ＸＬＦ１０．ＥＸＰ
;	○実行方法：		Ｔ－Ｍｅｎｕ等，ＴＢＩＯＳを組み込んだ
;				ＤＯＳ上から，
;				ＲＵＮ３８６　Ｐ２５ＸＬＦ１０　オプション
;				で，Ｐ２５，２５６色ファイルを３２Ｋ色に変換
;				しながら，順次画面ロードする。
;				マウス右クリックで次画面，左クリックで
;				終了し，Ｔ－Ｍｅｎｕへ。
;	オプション:		－０から－９９	ファイルナンバー
;				－Ｇ		マウスクリックを無視して
;						ロード実行
;				－Ｑ		１画面のみ表示して終了
;*************************************************************************

	.386p

msdos	macro	func		;(ＭＳ－ＤＯＳファンクションコールマクロ定義)
	mov	ah,func
	int	21H
	endm

XMAX		equ	320
YMAX		equ	240
YLWidth		equ	64
mo_port		equ	04d6h		;パッド／マウス入力ポート１
mi_port1	equ	04d0h		;パッド／マウス入力ポート１
mi_port2	equ	04d2h		;パッド／マウス入力ポート２
fn_ptr		equ	80h		;コマンドライン入力パラメータアドレス
PSP_seg		equ	004h		;ＰＳＰ領域のセグメント



	assume cs:CODE,ds:CODE,gs:CODE,es:CODE,ss:SSEG
;
CODE	segment


PRG_SRT:
	mov	dx,OFFSET NEW_DTA	;DTA Set
	msdos	1ah
	;
	mov	edi,OFFSET File_Name
	mov	esi,OFFSET P25_PATH
	push	ds
	mov	ax,PSP_seg
	mov	ds,ax
	mov	eax,OFFSET fn_ptr
	movzx	ebx,BYTE PTR [eax]
	or	bl,bl
	je	SHORT PRGlab01
	movzx	ecx,bl
	add	ebx,eax
	mov	ebx,OFFSET fn_ptr+1
	xor	eax,eax
	xor	dh,dh
	xor	ebp,ebp
;
PRGlab09:
	cmp	BYTE PTR [ebx],'-'
	jne	SHORT PRGlab08
PRGlab06:
	dec	ecx
	inc	ebx
	mov	dl,BYTE PTR [ebx]
	cmp	dl,'9'
	jbe	PRGlab10
	cmp	dl,'Z'
	jbe	PRGlab11
	sub	dl,'a'-'A'
PRGlab11:
	cmp	dl,'G'
	jne	SHORT PRGlab12
	or	bp,00000001b
	jmp	SHORT PRGlab06
PRGlab12:
	cmp	dl,'Q'
	jne	SHORT PRGlab06
	or	bp,00000010b
	jmp	SHORT PRGlab06
PRGlab10:
	cmp	dl,' '
	je	SHORT PRGlab07
	sub	dl,'0'
	sal	eax,8
	mov	al,dl
	jmp	SHORT PRGlab06
PRGlab07:
	dec	ecx
	inc	ebx
	aad					;al=ah*10+al
	mov	dh,al
	jmp	SHORT PRGlab09
PRGlab08:
	or	dh,dh			;? dh=0
	je	PRGlab02
	dec	dh			;dh-=1	(nannbannme wo kaunnto nisuru)
;
PRGlab02:
	mov	al,[ebx]
	cmp	al,'\'			;? al='\'
	jne	SHORT PRGlab03
	mov	ah,al
PRGlab03:
	inc	ebx
	mov	es:[edi],al
	inc	edi
	mov	es:[esi],al
	inc	esi
	loop	PRGlab02
	;
PRGlab01:
	pop	ds
	mov	BYTE PTR [File_Number],dh
	mov	edx,ebp
	mov	BYTE PTR [Control_Code],dl
	or	ah,ah
	je	SHORT PRGlab04
	cmp	al,'\'			;? al='\'
	je	SHORT PRGlab04
	mov	al,'\'			;al='\'
	mov	[edi],al
	inc	edi
	mov	[esi],al
	inc	esi
PRGlab04:
	mov	[FNadr],edi
	mov	edi,OFFSET P25_Fil
PRGlab05:
	mov	al,[edi]
	inc	edi
	mov	[esi],al
	inc	esi	
	or	al,al
	jne	SHORT PRGlab05
;
;-=================================================================-
;-	３２Ｋ色モード画面設定（ＳＣＲＥＥＮ＠１）		   -
;-=================================================================-
	mov	ax,110h
	mov	es,ax			;es=110H
	;		画面の初期化
	xor	ah,ah			;ah=0
	mov	edi,OFFSET work
	mov	ecx,1000h
	call	pword ptr es:[20h]	;EGB_init(work,0x1000)
	;		仮想画面設定	ページ０をモード１０
	mov	ax,100h			;ah=1 , al=0
	mov	dx,10
	mov	edi,OFFSET work
	call	pword ptr es:[20h]	;EGB_resolution(work,0,10)
	;		仮想画面設定	ページ０をモード１０
	mov	ax,101h			;ah=1 , al=1
	mov	dx,10
	mov	edi,OFFSET work
	call	pword ptr es:[20h]	;EGB_resolution(work,1,10)
	;		表示ページ指定	ページ０を前面にして表示	
	mov	ax,600h			;ah=6 , al=1
	mov	edx,1
	call	pword ptr es:[20h]	;EGB_displayPage(work,1,1)
	;		書き込みページ指定	ページ０
	mov	ax,500h			;ah=5 , al=0
	call	pword ptr es:[20h]	;EGB_wrihtPage(work,0)
	;		画面拡大	２×２倍
	mov	ax,202h			;ah=2 , al=2
	mov	dx,2
	mov	bx,2
	call	pword ptr es:[20h]	;EGB_displayStart(work,2,2,2)
	;		表示画面大きさ	Ｘ＝３２０　，　Ｙ＝２４０
	mov	ax,203h
	mov	dx,XMAX
	mov	bx,YMAX
	call	pword ptr es:[20h]	;EGB_displayStart(work,3,XMAX,YMAX)
	;
;-=================================================================-
;-	メインルーチン	(Ｐ２５ファイルチェック)		   -
;-=================================================================-
FN_chck:
	mov	dx,OFFSET P25_PATH
	mov	cx,03h
	mov	al,[lpcnt]
	and	al,al
	jne	SHORT FNlab01
	mov	al,1
	mov	[lpcnt],al
	msdos	4eh
	jb	PRG_END
	jmp	SHORT FNlab02
FNlab01:	
	msdos	4fh
	jb	SHORT PRG_END
FNlab02:
	mov	al,BYTE PTR[File_Number]
	or	al,al
	je	FNlab04
	dec	BYTE PTR[File_Number]
	jmp	SHORT FN_chck
FNlab04:
	mov	edx,OFFSET NEW_DTA+01EH
	mov	ebx,[FNadr]
FNlab03:
	mov	al,[edx]
	inc	edx
	mov	[ebx],al
	inc	ebx
	or	al,al
	jne	SHORT FNlab03
	;
	mov	dx,OFFSET File_Name
	mov	al,0
	msdos	3DH			;ax=fopen(P25_File,"rb")
	jnb	SHORT FNLB01		;? Open Error
FN_Err:
	mov	dx,OFFSET MES01		;Output Error Message
	msdos	09H			;(※ＴＯＷＮＳ－Ｍｅｎｕ上では無意味)
PRG_End:
	msdos	4ch			;プログラム終了

;-=================================================================-
;	データイニシャライズ
;-=================================================================-
FNLB01:
	mov	bx,104h
	mov	es,bx			;es=ds

	mov	[fp],ax	;ax=fp (ハンドル)
	mov	ecx,24
	mov	edx,OFFSET work
	mov	bx,[fp]				;bx=fp
	msdos	3FH				;read(fp,ldt,24)
	;
	mov	bx,[fp]
	mov	ecx,256*2*3+4+2*2
	mov	edx,OFFSET work
	msdos	3FH
	;
	mov	edi,OFFSET work
	xor	esi,esi
	mov	ecx,256
lbloop:
	mov	ax,[edi]
	inc	edi
	inc	edi
	mov	BYTE PTR [drd+esi],ah
	mov	ax,[edi]
	inc	edi
	inc	edi
	mov	BYTE PTR [dgr+esi],ah
	mov	ax,[edi]
	inc	edi
	inc	edi
	mov	BYTE PTR [dbl+esi],ah
	inc	esi
	loop	lbloop
	;
	xor	ebp,ebp
	mov	al,1
	mov	[r_count],al
	mov	al,240
	mov	[y_count],al
;
y_loop:
	dec	BYTE PTR [r_count]
	jne	y_lab01
	;
	mov	al,40
	mov	[r_count],al
	mov	bx,[fp]
	mov	ecx,640*40*2
	mov	edx,OFFSET buf
	push	ebp
	msdos	3FH
	pop	ebp
	;
	mov	esi,OFFSET buf
y_lab01:
	mov	eax,320
	mov	[x_count],eax
	xor	ebx,ebx
x_loop:
	mov	cx,WORD PTR [esi]		;緑
	mov	dx,WORD PTR [640+esi]
	add	esi,2
	xor	ebx,ebx
	xor	eax,eax
	mov	bl,cl
	mov	al,BYTE PTR [dgr+ebx]
	mov	edi,eax
	mov	bl,ch
	mov	al,BYTE PTR [dgr+ebx]
	add	edi,eax
	mov	bl,dl
	mov	al,BYTE PTR [dgr+ebx]
	add	edi,eax
	mov	bl,dh
	mov	al,BYTE PTR [dgr+ebx]
	add	eax,edi
	sar	eax,5
	sal	eax,10
	mov	[green],eax
	;
	xor	eax,eax
	mov	bl,cl
	mov	al,BYTE PTR [drd+ebx]
	mov	edi,eax
	mov	bl,ch
	mov	al,BYTE PTR [drd+ebx]
	add	di,ax
	mov	bl,dl
	mov	al,BYTE PTR [drd+ebx]
	add	edi,eax
	mov	bl,dh
	mov	al,BYTE PTR [drd+ebx]
	add	eax,edi
	and	eax,01111111111100000b
	mov	[red],eax
	;
	xor	eax,eax
	mov	bl,cl
	mov	al,BYTE PTR [dbl+ebx]
	mov	edi,eax
	mov	bl,ch
	mov	al,BYTE PTR [dbl+ebx]
	add	edi,eax
	mov	bl,dl
	mov	al,BYTE PTR [dbl+ebx]
	add	edi,eax
	mov	bl,dh
	mov	al,BYTE PTR [dbl+ebx]
	add	eax,edi
	sar	eax,5
	add	eax,[green]
	add	eax,[red]
	mov	es:[ebp],ax
	add	ebp,2
	dec	DWORD PTR [x_count]
	jne	x_loop
	;
	add	esi,640
	add	ebp,1024-320*2
	dec	BYTE PTR [y_count]
	jne	y_loop
	;
labed:
	mov	bx,[fp]			;fp (ハンドル)
	msdos	3EH			;close(fp)	(Ｆｉｌｅ　Ｃｌｏｓｅ)

	mov	al,BYTE PTR[Control_Code]
	test	al,00000001b
	jne	SHORT mlab02
;
;	マウストリガ入力
;
mloop:
	mov	dx,mo_port		;(両ポート及び全トリガ入力ＯＫ)
	mov	ax,00111111b
	out	dx,al
	mov	dx,mi_port1		;(ポート１入力)
	in	al,dx
	mov	bl,al
	and	al,00100000b		;(トリガ２が押されたか)
	je	SHORT mlab02
	and	bl,00010000b		;(トリガ１が押されたか)
	je	SHORT mlab01
	mov	dx,mi_port2
	in	al,dx
	mov	bl,al
	and	al,00100000b		;(トリガ２が押されたか)
	je	SHORT mlab02
	and	bl,00010000b		;(トリガ１が押されたか)
	jne	SHORT mloop		;(トリガが押されるまでループ)
mlab01:
	msdos	4ch			;(プログラム終了)
mlab02:
	mov	al,BYTE PTR[Control_Code]
	test	al,00000010b
	jne	SHORT mlab01
	;
	jmp	FN_chck



mes01		db 	'ファイルオープン出来ませんよ。$'
File_Name	db	64 dup(?)
FNadr		dd	0
NEW_DTA		db	100h dup(?)		;新規のＤＴＡ領域
P25_Fil		db	'*.P25',0
P25_PATH	db	64 dup(?)		;入力されたパス
fp		dw	0			;ファイルハンドル
File_Number	db	0
Control_Code	db	0
lpcnt		db	0
steax		dd	0
stebx		dd	0
stecx		dd	0
stedx		dd	0
grad		dd	0
x_count		dd	0
y_count		db	0
r_count		db	0
green		dd	0
red		dd	0
buf		dw	320*40*2 dup(?)
dgr		db	256 dup(?)
drd		db	256 dup(?)
dbl		db	256 dup(?)
work		db	1000h dup(?)
P25BEnd		db	0

code	ends

sseg	segment stack
	db 1000H dup(?)
sseg	ends
	end	PRG_SRT
