;
;			'Magl.exp' 	for FM-TOWNS
;
;		- MAKIchan Graphic loader is not 鮪だ！ -
;
;			Version 0.30	Update 1991/04/09
;
;				programmed by MALOR
;

	.386p

HeaderSize	equ	32/4
Plane2	equ	0104h
Plane1	equ	010ch

CODE	segment dword public use32 'CODE'
	assume cs:CODE,ds:DATA

;int  inpb(int addr)

	public inpb
	db	'inpb',4
inpb	proc near
	xor	eax,eax
	mov	dx,[esp+4]
	in	al,dx
	ret
inpb	endp

;void outpb(int addr,int dat)

	public outpb
	db	'outpb',5
outpb	proc near
	mov	dx,[esp+4]
	mov	al,[esp+8]
	out	dx,al
	ret
outpb	endp

;****************************************
;	 mag format pixel decode 
;****************************************

;int	mag(char *maghead,int mode,int offset,int xpixel);

flgdec	macro	flg_bit				;flag decode macro
	local	Then
	local	Endif

	rol	dl,1
	jnc	short Then
	lodsb					;read flag b to al
						;flag b pointer(esi) incliment
	jmp	short Endif
	align	4
Then:	xor	al,al				;write 0 to flag
Endif:	stosb					;write al to es:[edi]
						;flag pointer(edi) incliment
	endm

	public mag
	db	'mag',3
	align	4
mag	proc	near

	pushad					;汎用レジスタ全部push

	mov	eax,ss:[esp+36+4]		;mode
	mov	ds:[Mode],eax
	mov	eax,ss:[esp+36+8]		;VRAMオフセット
	mov	ds:[Vofs],eax
	mov	eax,ss:[esp+36+12]		;横方向のループ回数
	mov	ds:[Xloopc],ax

	mov	esi,ss:[esp+36+0]		;ヘッダをコピー

	cld					;メモリ転送はインクリメント方向

	push	es
	mov	ax,ds				;dsをesにコピー
	mov	es,ax

	mov	edi,offset Header
	mov	ecx,HeaderSize
	rep movsd

;flag a,b decode

	mov	ebp,ds:[flga]			;*ebp=flga
	mov	esi,ds:[flgb]			;*esi=flgb
	mov	edi,ds:[flg ]			;*edi=flg

	movzx	edx,ds:[RY]			;Y方向のループ回数セット
	sub	dx,ds:[LY]
	inc	edx
	mov	ds:[YLoopc],dx			;ワークにセット
	movzx	eax,ds:[XLoopc]			;X方向のループ回数セット
	mul	edx				;eax = eax * edx;edx broken
	mov	ebx,eax
	mov	ecx,eax				;Loop counter (ecx) set
	shr	ecx,3				;ecx = ecx / 8

	align	4

LOOP2:	jz	short LOOP2_Exit
	mov	dl,ds:[ebp]
	flgdec					;展開じゃ展開じゃ！
	flgdec
	flgdec
	flgdec
	flgdec
	flgdec
	flgdec
	flgdec
	inc	ebp
	dec	ecx
	jmp	short LOOP2

LOOP2_Exit:

	mov	dl,ds:[ebp]
	and	ebx,7h
	jmp	ds:[ebx*4+Jtable2]

	align	4

jt27:	flgdec
jt26:	flgdec
jt25:	flgdec
jt24:	flgdec
jt23:	flgdec
jt22:	flgdec
jt21:	flgdec
jt20:	

; 1 line xor

	mov	esi,ds:[flg]			;esi = 1ライン上のポインタ
	mov	edi,esi				;edi = フラグのポインタ
	movzx	ecx,ds:[XLoopc]			;ecx = *XLoopc
	add	edi,ecx				;edi = esi + *XLoopc
	movzx	eax,ds:[RY]
	sub	ax,ds:[LY]			;eax = ry - ly
	mul	ecx				;eax *= ecx	;edx broken
	mov	ecx,eax				;ecx = Loop counter
	mov	ebx,eax
	shr	ecx,2

	align	4

LOOP1:	jz	short LOOP1_Exit
	lodsd
	xor	ds:[edi],eax
	add	edi,4
	dec	ecx
	jmp	short LOOP1

LOOP1_Exit:

	and	ebx,3
	jmp	ds:[ebx*4+Jtable1]

	align	4

jt13:	lodsb
	xor	ds:[edi],al
	inc	edi
jt12:	lodsb
	xor	ds:[edi],al
	inc	edi
jt11:	lodsb
	xor	ds:[edi],al
jt10:

	mov	eax,ds:[Mode]
	and	eax,20h
	jz	Mem				;仮想vramに展開

	movzx	ecx,ds:[LX]			;左端のVRAMオフセット計算
	mov	bl,ds:[Screen]
	and	bl,80h
	jnz	short ThenA
	shr	ecx,3
	shl	ecx,2				;ecx = (ecx/8)*4
	jmp	short EndifA
ThenA:	shr	ecx,2
	shl	ecx,2				;ecx = (ecx/4)*4
EndifA:	add	ds:[Vofs],ecx			;水平方向誤差修正
	mov	eax,ds:[Lineofs]
	movzx	ecx,ds:[LY]
	mul	ecx				;eax = LY * Lineofs ;edx broken
	add	ds:[Vofs],eax			;垂直方向誤差修正
	mov	edi,ds:[Vofs]			;edi = VRAMのポインタ

	mov	ax,Plane1
	mov	bl,ds:[Screen]
	and	bl,80h
	jnz	Mode8				;256色展開

	mov	ax,Plane2
	jmp	short Mode4			;DOS互換モード

Mem:	mov	edi,ds:[vram]
	mov	ds:[Vofs],edi
	mov	ax,ds
	mov	bl,ds:[Screen]
	and	bl,80h
	jnz	Mode8

;pixel decode (16色モード)

Mode4:	mov	es,ax				;VRAMセレクタセット

	xor	ebx,ebx				;関係レジスタ初期化
	xor	edx,edx
	xor	ecx,ecx

						;edi = VRAM/RAMへのポインタ
	mov	esi,ds:[flg]			;esi = フラグのポインタ
	mov	ebp,ds:[pix]			;ebp = ピクセルのポインタ

	mov	dx,ds:[YLoopc]			;Y方向のループ回数セット

	align	4

LOOPY2:	mov	cx,ds:[XLoopc]			;cx set

	;左ピクセル展開

	align	4

LOOPX2:	xor	ebx,ebx
	mov	bl,ds:[esi]			;flag read
	jmp	ds:[ebx*4+Jtable3]

LOOPX2_Exit:

	mov	edi,ds:[Vofs]			;ediに1ライン分のオフセット加算
	add	edi,ds:[Lineofs]
	mov	ds:[Vofs],edi

	dec	dx
	jnz	short LOOPY2
	jmp	Exit

	;特化ピクセル展開ルーチン群
	; flag = 00h
	align	4
jtp0:	mov	eax,ds:[ebp]			;pixel read to ax
	add	ebp,4				;pixel incliment
	ror	al,4				;上位下位4ビット交換
	ror	ah,4
	ror	eax,16
	ror	al,4				;上位下位4ビット交換
	ror	ah,4
	ror	eax,16
	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = 0?h
	align	4
jtp1:	and	bl,0fh
	mov	ebx,ds:[ebx*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx+2]		;VRAM read to ax
	shl	eax,16
	mov	ax,ds:[ebp]			;pixel read to ax
	add	ebp,2
	ror	al,4				;上位下位4ビット交換
	ror	ah,4
	stosd
	inc	esi				;flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = ?0h
	align	4
jtp2:	mov	ax,ds:[ebp]			;pixel read to ax
	add	ebp,2				;pixel incliment
	ror	al,4				;上位下位4ビット交換
	ror	ah,4
	shl	eax,16
	shr	bl,4
	mov	ebx,ds:[ebx*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx]			;VRAM read to ax
	stosd
	inc	esi				;flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = ??h
	align	4
jtp3:	and	ebx,0fh
	mov	ebx,ds:[ebx*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx+2]		;VRAM read to ax
	shl	eax,16
	xor	ebx,ebx
	mov	bl,ds:[esi]			;flag read
	shr	bl,4
	mov	ebx,ds:[ebx*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx]			;VRAM read to ax
	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = 01h
	align	4
jtp4:	mov	ax,ds:[ebp]			;pixel read to ax
	add	ebp,2				;pixel incliment
	ror	al,4				;上位下位4ビット交換
	ror	ah,4
	mov	bx,ax
	shl	eax,16
	or	eax,ebx
	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = ?1h
	; or same two pixels read
	align	4
jtp5:	shr	bl,4
	mov	ebx,ds:[ebx*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx]			;VRAM read to ax
	xor	ebx,ebx
	mov	bx,ax
	shl	eax,16
	or	eax,ebx
	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = 10h
	align	4
jtp6:	mov	ax,ds:[ebp]			;pixel read to ax
	add	ebp,2				;pixel incliment
	ror	al,4				;上位下位4ビット交換
	ror	ah,4
	ror	eax,16
	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = 1?h
	align	4
jtp7:	and	bl,0fh
	mov	ebx,ds:[ebx*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx+2]		;VRAM read to ax
	ror	eax,16
	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = 22h
	align	4
jtp8:	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = 33h 44h .... eeh ffh
	align	4
jtps:	shr	bl,4
	mov	ebx,ds:[ebx*4+Mofs]		;前方参照
	mov	eax,es:[edi+ebx]		;VRAM read to ax
	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

	; flag = 11h,12h
	align	4
jtpe:	mov	ebx,eax				; eax = pre pixel data
	shr	ebx,16
	xor	ax,ax
	or	eax,ebx
temp:	stosd
	inc	esi				;Flag incliment
	dec	ecx
	jz	LOOPX2_Exit
	mov	bl,ds:[esi]
	cmp	bl,11h				;名付けて11hアクセレーター！
	je	short temp
	or	ecx,ecx
	jnz	LOOPX2
	jmp	LOOPX2_Exit

;pixel decode (256色モード)

Mode8:	mov	es,ax				;VRAMセレクタセット

	xor	eax,eax				;関係レジスタ初期化
	xor	ebx,ebx
	xor	edx,edx
	xor	ecx,ecx

	mov	ebp,ds:[flg]			;ebp = フラグのポインタ
	mov	esi,ds:[pix]			;esi = ピクセルのポインタ

	mov	dx,ds:[YLoopc]			;Y方向のループ回数セット
						;Y loop counter=dx
	test	dx,0ffffh

	align	4

LOOPY3:	jz	Exit
	mov	cx,ds:[XLoopc]			;cx set
	test	cx,0ffffh

	;左ピクセル展開

	align	4

LOOPX3:	jz	short LOOPX3_Exit
	mov	al,ds:[ebp]			;flag read
	shr	al,4
	jz	short Then5
	mov	ebx,ds:[eax*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx]			;VRAM read to ax
	jmp	short Endif5

	align	4

Then5:	lodsw					;pixel read to ax
						;pixel pointer(esi) incliment
Endif5:	stosw						;VRAM write from ax
						;VRAM pointer(edi) incliment
	xor	eax,eax

	;右ピクセル展開

	mov	al,ds:[ebp]			;flag read
	and	al,0fh
	jz	short Then6
	mov	ebx,ds:[eax*4+Mofs]		;前方参照
	mov	ax,es:[edi+ebx]			;VRAM read to ax
	jmp	short Endif6

	align	4

Then6:	lodsw					;pixel read to ax
						;pixel pointer(esi) incliment
Endif6:	stosw					;VRAM write from ax
						;VRAM pointer(edi) incliment
	xor	eax,eax

	inc	ebp				;Flag incliment
	dec	ecx
	jmp	short LOOPX3
;	loop	LOOPX3

LOOPX3_Exit:

	mov	edi,ds:[Vofs]			;ediに1ライン分のオフセット加算
	add	edi,ds:[Lineofs]
	mov	ds:[Vofs],edi
	dec	dx
	jmp	LOOPY3

Exit:	pop	es

	popad					;汎用レジスタ全部pop

	ret

mag	endp

;****************************************
;	 maki format pixel decode 
;****************************************

mkiflg	macro
	local	Endif1
	local	Endif2

	rol	dl,1				;Carry Flagに抽出
	jnc	short Endif1			;CF == 0 : jmp Endif
	lodsw					;Read from flag b to ax
						;flag b pointer(esi)incliment
	mov	bx,ax
	and	ax,0f0f0h
	shl	bx,4
	and	bx,0f0f0h
	mov	ds:[edi],al			;write to Flag
	mov	ds:[edi+40],bl
	mov	ds:[edi+80],ah
	mov	ds:[edi+120],bh
Endif1:	rol	dl,1
	jnc	short Endif2
	lodsw
	mov	bx,ax
	shr	ax,4
	and	ax,0f0fh
	and	bx,0f0fh
	or	ds:[edi],al
	or	ds:[edi+40],bl
	or	ds:[edi+80],ah
	or	ds:[edi+120],bh
Endif2:	inc	edi
	endm

mkipix	macro
	local	Then
	local	Endif

	rol	dl,1				;Carry flagに抽出
	jc	short Then			;CF == 1 : jmp Then
	xor	al,al				;write 0 to pix
	jmp	short Endif

	align	4

Then:	lodsb					;read from pix to al
						;pix pointer(esi) incliment
	ror	al,4				;上位下位交換
Endif:	stosb					;write al to VRAM(es:[edi])
	endm

;int mki(char *mkihead,int mode,int offset);
	public mki
	db	'mki',3
	align	4
mki	proc near

	pushad

	mov	eax,ss:[esp+36+4]		;mode
	mov	ds:[Mode],eax
	mov	eax,ss:[esp+36+8]		;VRAMオフセット
	mov	ds:[Vofs],eax
	mov	eax,ss:[esp+36+0]		;ヘッダ先頭アドレス
	mov	ds:[SizA],eax			;SizAが代わりのワーク

	cld					;flag clear
	mov	ecx,4000
	mov	edi,ds:[flg]
	xor	eax,eax
	rep stosd

	;flag a,b decode

	mov	ecx,100				;ecx = Y loop counter
	mov	edi,ds:[flg]			;edi = flag pointer
	mov	esi,ds:[flgb]			;esi = flag b pointer
	mov	ebp,ds:[flga]			;ebp = flag a pointer

	align	4

LOOPY5:	mov	dh,10				;dh = X loop counter

	align	4

LOOPX5:	mov	dl,ds:[ebp]			;dl = flag a
	mkiflg
	mkiflg
	mkiflg
	mkiflg
	inc	ebp				;flag a pointer(ebp) incliment
	dec	dh				;X loop counter decliment
	jnz	LOOPX5
	add	edi,40*3			;1 line offset
	dec	ecx				;Y loop counter decliment
	jnz	LOOPY5

	;pixel decode

	mov	eax,ds:[Mode]
	and	eax,20h
	jz	Pix2M				;メモリ展開モード
	mov	ebx,ds:[Mode]
	and	ebx,40h
	jnz	Pix2V				;DOS互換モード

	;1024*512画面モード

	align	4

Pix1:	mov	ax,Plane2			;VRAM selecter set to es
	mov	es,ax
	mov	edi,ds:[Vofs]			;es:[edi] = VRAM pointer
	mov	esi,ds:[pix]			;esi = pix pointer
	mov	ebp,ds:[flg]			;ebp = Flag pointer
	xor	eax,eax				;eax clear
	mov	ebx,400				;Y loop counter = ebx

	align	4

LOOPY6:	mov	ecx,40

	align	4

LOOPX6:	mov	dl,ds:[ebp]
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	inc	ebp
	dec	ecx
	jnz	LOOPX6
	add	edi,192
	dec	ebx
	jnz	LOOPY6

	mov	esi,ds:[Vofs]			; 1 Line Xor
	mov	edi,esi

	mov	eax,ds:[SizA]
	mov	al,ds:[eax+6]
	cmp	al,'A'
	je	Then9
	cmp	al,'B'
	jne	Exit2

	add	edi,512*4			; 4 Line 毎
	mov	ebx,396
	jmp	Endif9
Then9:	add	edi,512*2			; 2 Line 毎
	mov	ebx,398
Endif9:	

	align	4

LOOPY7:	mov	ecx,80

	align	4

LOOPX7:	mov	eax,es:[esi]
	xor	es:[edi],eax
	add	esi,4
	add	edi,4
	loop	LOOPX7
	add	esi,192
	add	edi,192
	dec	ebx
	jnz	LOOPY7

	jmp	Exit2

	;DOS互換モード&仮想vram

Pix2M:	mov	ax,ds				;Data selecter set to es
	mov	edi,ds:[vram]			;仮想vramアドレス
	mov	ds:[Vofs],edi
	jmp	short Pix2
Pix2V:	mov	ax,Plane2			;VRAM selecter set to es
	xor	edi,edi				;vramアドレス初期化
	mov	ds:[Vofs],edi
Pix2:	mov	es,ax
	xor	eax,eax
	mov	ecx,16000
	mov	esi,ds:[pix]
	mov	ebp,ds:[flg]

	align	4

LOOP8:	mov	dl,ds:[ebp]
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	mkipix
	inc	ebp
	dec	ecx
	jnz	LOOP8

	mov	edi,ds:[Vofs]
	mov	esi,edi

	mov	eax,ds:[SizA]
	mov	al,ds:[eax+6]
	cmp	al,'A'
	je	short Then10
	cmp	al,'B'
	jnz	Exit2

	add	edi,320*4			; 4 Line 毎
	mov	ecx,396*80
	jmp	short Endif10
Then10:	add	edi,320*2			; 2 Line 毎
	mov	ecx,398*80
Endif10:

	align	4

LOOP9:	mov	eax,es:[esi]
	xor	es:[edi],eax
	add	esi,4
	add	edi,4
	loop	LOOP9

Exit2:	mov	ax,ds
	mov	es,ax

	popad

	ret

mki	endp

;************************************
;	Copy memory to VRAM
;************************************

;int move(int xbyte,int ylooptime,int sofs,int slineofs,int seg,int dofs,int dlineofs);

	public move
	db	'move',4
	align	4
move	proc near

	pushad

	mov	ecx,ss:[esp+36+0]		;x loop counter = ecx
	mov	ds:[XLoopc],cx
	mov	ebx,ss:[esp+36+4]		;y loop counter = ebx
	mov	eax,ss:[esp+36+8]		;source オフセット
	mov	ds:[Sofs],eax
	mov	eax,ss:[esp+36+12]		;source line オフセット
	mov	ds:[Slofs],eax
	mov	eax,ss:[esp+36+16]		;dest. セレクタ
	mov	es,ax
	mov	eax,ss:[esp+36+20]		;dest. オフセット
	mov	ds:[Vofs],eax
	mov	eax,ss:[esp+36+24]		;dest. line オフセット
	mov	ds:[Vlofs],eax

	xor	ecx,ecx

	mov	esi,ds:[Sofs]
	mov	edi,ds:[Vofs]

	align	4

LOOP10:	mov	cx,ds:[XLoopc]
	shr	cx,2
	rep movsd
	mov	cx,ds:[Xloopc]
	and	cx,3
	rep movsb

	mov	esi,ds:[Sofs]
	add	esi,ds:[Slofs]
	mov	ds:[Sofs],esi

	mov	edi,ds:[Vofs]
	add	edi,ds:[Vlofs]
	mov	ds:[Vofs],edi
	
	dec	ebx
	jnz	short LOOP10
	
	mov	ax,ds
	mov	es,ax

	popad

	ret
	
move	endp

CODE	ends

DATA	segment dword
	assume ds:DATA

	align	4
	;前方参照オフセットアドレステーブル
Mofs	dd	-(512*0+0),-(512*0+2),-(512*0+4),-(512*0+8)
	dd	-(512*1+0),-(512*1+2)
	dd	-(512*2+0),-(512*2+2),-(512*2+4)
	dd	-(512*4+0),-(512*4+2),-(512*4+4)
	dd	-(512*8+0),-(512*8+2),-(512*8+4)
	dd	-(512*16+0)

	;1ライン分のオフセット
Lineofs	dd	512

	align	4

; header
Header	db	0	;ヘッダの先頭
Machine	db	0	;機種コード
Rflg	db	0	;機種依存フラグ
Screen	db	0	;スクリーンモード
LX	dw	0	;表示開始位置Ｘ
LY	dw	0	;表示開始位置Ｙ
RX	dw	639	;表示終了位置Ｘ
RY	dw	399	;表示終了位置Ｙ
OffA	dd	0	;フラグＡのオフセット
OffB	dd	0	;フラグＢのオフセット
SizB	dd	0	;フラグＢのサイズ
OffP	dd	0	;ピクセルのオフセット
SizP	dd	0	;ピクセルのサイズ

;Other work

SizA	dd	0	;フラグＡのサイズ

;Temporary work

XLoopc	dw	0	;Ｘ方向のループ回数
YLoopc	dw	0	;Ｙ方向のループ回数
Vofs	dd	0	;展開領域の左端のVRAMオフセット
Mode	dd	4	;画面モード == 4 : 16色1024*512モード
			;	    == 8 : 256色1024*512モード
			;	    == 1 : DOS互換640*400モード
Sofs	dd	0	;展開元領域の左端オフセット
Slofs	dd	0	;
Vlofs	dd	0	;

;Table

	;xorループの出口のジャンプテーブル

Jtable1	dd	offset jt10,offset jt11, offset jt12,offset jt13

	;flag decode ループの出口のジャンプテーブル
Jtable2	dd	offset jt20,offset jt21,offset jt22,offset jt23
	dd	offset jt24,offset jt25,offset jt26,offset jt27

	;pixcel decode (16色) の特化ジャンプテーブル
	;jtp0 : flag = 00h	;jtp1 : flag = 0?h
	;jtp2 : flag = ?0h	;jtp3 : flag = ??h
	;jtp4 : flag = 01h	;jtp5 : flag = ?1h
	;jtp6 : flag = 10h	;jtp7 : flag = 1?h
	;jtp8 : flag = 22h	;;jtp9 : flag = 21h	;;印は効果が期待でき
	;;jtpa : flag = 02h	;;jtpb : flag = ?2h	ないので、未サポート
	;;jtpc : flag = 20h	;;jtpd : flag = 2?h
	;jtpe : flag = 11h,12h
	; 連続ピクセルを参照
	;jtps : flag = 33h,･･････,ffh
	; 2ピクセルが同一ピクセルを参照
	;jtp5 : flag = 45h,67h,78h,9ah,abh,cdh,deh
Jtable3	dd	offset jtp0,offset jtp4,offset jtp1,offset jtp1	; 00h 〜 0fh
	dd	offset jtp1,offset jtp1,offset jtp1,offset jtp1
	dd	offset jtp1,offset jtp1,offset jtp1,offset jtp1
	dd	offset jtp1,offset jtp1,offset jtp1,offset jtp1
	dd	offset jtp6,offset jtpe,offset jtpe,offset jtp7	; 10h 〜 1fh
	dd	offset jtp7,offset jtp7,offset jtp7,offset jtp7
	dd	offset jtp7,offset jtp7,offset jtp7,offset jtp7
	dd	offset jtp7,offset jtp7,offset jtp7,offset jtp7
	dd	offset jtp2,offset jtp5,offset jtp8,offset jtp3	; 20h 〜 2fh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtps	; 30h 〜 3fh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; 40h 〜 4fh
	dd	offset jtps,offset jtp5,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; 50h 〜 5fh
	dd	offset jtp3,offset jtps,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; 60h 〜 6fh
	dd	offset jtp3,offset jtp3,offset jtps,offset jtp5
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; 70h 〜 7fh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtps
	dd	offset jtp5,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; 80h 〜 8fh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtps,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; 90h 〜 9fh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtps,offset jtp5,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; a0h 〜 afh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtps,offset jtp5
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; b0h 〜 bfh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtps
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; c0h 〜 cfh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtps,offset jtp5,offset jtp3,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; d0h 〜 dfh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtps,offset jtp5,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; e0h 〜 efh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtps,offset jtp3
	dd	offset jtp2,offset jtp5,offset jtp3,offset jtp3	; f0h 〜 ffh
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtp3
	dd	offset jtp3,offset jtp3,offset jtp3,offset jtps

DATA	ends

	public Mofs
	public Lineofs
	extrn flga:dword
	extrn flgb:dword
	extrn flg:dword
	extrn pix:dword
	extrn vram:dword
	extrn screen_mode:byte

	end
