.386p
extrn	MAX_SCR:DWORD
extrn	ReWrt_flg:WORD
extrn	dmy_vram:DWORD
extrn	locate:NEAR
;*****************************************************************
;
;void	wrtank(ch,x,y,ccol,bcol,off)
;
;void	wrtkanji(ch,x,y,ccol,bcol,off)
;
;*****************************************************************
v_para	struc
v_ebp	dd	?
v_pcr	dd	?
v_ch	dd	?
v_x	dd	?
v_y	dd	?
v_ccol	dd	?
v_bcol	dd	?
v_off	dd	?
v_para	ends
;*************************************
;	VRAM Direct Access Program
;*************************************
bitptn	segment	'DATA'
colptn: 
	dd	000000000h,099999999h,0AAAAAAAAh,0BBBBBBBBh
	dd	0CCCCCCCCh,0DDDDDDDDh,0EEEEEEEEh,0FFFFFFFFh
	dd	088888888h,011111111h,022222222h,033333333h
	dd	044444444h,055555555h,066666666h,077777777h
fntptn:	
	dd	000000000h,0F0000000h,00F000000h,0FF000000h
	dd	000F00000h,0F0F00000h,00FF00000h,0FFF00000h
	dd	0000F0000h,0F00F0000h,00F0F0000h,0FF0F0000h
	dd	000FF0000h,0F0FF0000h,00FFF0000h,0FFFF0000h
	dd	00000F000h,0F000F000h,00F00F000h,0FF00F000h
	dd	000F0F000h,0F0F0F000h,00FF0F000h,0FFF0F000h
	dd	0000FF000h,0F00FF000h,00F0FF000h,0FF0FF000h
	dd	000FFF000h,0F0FFF000h,00FFFF000h,0FFFFF000h
	dd	000000F00h,0F0000F00h,00F000F00h,0FF000F00h
	dd	000F00F00h,0F0F00F00h,00FF00F00h,0FFF00F00h
	dd	0000F0F00h,0F00F0F00h,00F0F0F00h,0FF0F0F00h
	dd	000FF0F00h,0F0FF0F00h,00FFF0F00h,0FFFF0F00h
	dd	00000FF00h,0F000FF00h,00F00FF00h,0FF00FF00h
	dd	000F0FF00h,0F0F0FF00h,00FF0FF00h,0FFF0FF00h
	dd	0000FFF00h,0F00FFF00h,00F0FFF00h,0FF0FFF00h
	dd	000FFFF00h,0F0FFFF00h,00FFFFF00h,0FFFFFF00h
	dd	0000000F0h,0F00000F0h,00F0000F0h,0FF0000F0h
	dd	000F000F0h,0F0F000F0h,00FF000F0h,0FFF000F0h
	dd	0000F00F0h,0F00F00F0h,00F0F00F0h,0FF0F00F0h
	dd	000FF00F0h,0F0FF00F0h,00FFF00F0h,0FFFF00F0h
	dd	00000F0F0h,0F000F0F0h,00F00F0F0h,0FF00F0F0h
	dd	000F0F0F0h,0F0F0F0F0h,00FF0F0F0h,0FFF0F0F0h
	dd	0000FF0F0h,0F00FF0F0h,00F0FF0F0h,0FF0FF0F0h
	dd	000FFF0F0h,0F0FFF0F0h,00FFFF0F0h,0FFFFF0F0h
	dd	000000FF0h,0F0000FF0h,00F000FF0h,0FF000FF0h
	dd	000F00FF0h,0F0F00FF0h,00FF00FF0h,0FFF00FF0h
	dd	0000F0FF0h,0F00F0FF0h,00F0F0FF0h,0FF0F0FF0h
	dd	000FF0FF0h,0F0FF0FF0h,00FFF0FF0h,0FFFF0FF0h
	dd	00000FFF0h,0F000FFF0h,00F00FFF0h,0FF00FFF0h
	dd	000F0FFF0h,0F0F0FFF0h,00FF0FFF0h,0FFF0FFF0h
	dd	0000FFFF0h,0F00FFFF0h,00F0FFFF0h,0FF0FFFF0h
	dd	000FFFFF0h,0F0FFFFF0h,00FFFFFF0h,0FFFFFFF0h
	dd	00000000Fh,0F000000Fh,00F00000Fh,0FF00000Fh
	dd	000F0000Fh,0F0F0000Fh,00FF0000Fh,0FFF0000Fh
	dd	0000F000Fh,0F00F000Fh,00F0F000Fh,0FF0F000Fh
	dd	000FF000Fh,0F0FF000Fh,00FFF000Fh,0FFFF000Fh
	dd	00000F00Fh,0F000F00Fh,00F00F00Fh,0FF00F00Fh
	dd	000F0F00Fh,0F0F0F00Fh,00FF0F00Fh,0FFF0F00Fh
	dd	0000FF00Fh,0F00FF00Fh,00F0FF00Fh,0FF0FF00Fh
	dd	000FFF00Fh,0F0FFF00Fh,00FFFF00Fh,0FFFFF00Fh
	dd	000000F0Fh,0F0000F0Fh,00F000F0Fh,0FF000F0Fh
	dd	000F00F0Fh,0F0F00F0Fh,00FF00F0Fh,0FFF00F0Fh
	dd	0000F0F0Fh,0F00F0F0Fh,00F0F0F0Fh,0FF0F0F0Fh
	dd	000FF0F0Fh,0F0FF0F0Fh,00FFF0F0Fh,0FFFF0F0Fh
	dd	00000FF0Fh,0F000FF0Fh,00F00FF0Fh,0FF00FF0Fh
	dd	000F0FF0Fh,0F0F0FF0Fh,00FF0FF0Fh,0FFF0FF0Fh
	dd	0000FFF0Fh,0F00FFF0Fh,00F0FFF0Fh,0FF0FFF0Fh
	dd	000FFFF0Fh,0F0FFFF0Fh,00FFFFF0Fh,0FFFFFF0Fh
	dd	0000000FFh,0F00000FFh,00F0000FFh,0FF0000FFh
	dd	000F000FFh,0F0F000FFh,00FF000FFh,0FFF000FFh
	dd	0000F00FFh,0F00F00FFh,00F0F00FFh,0FF0F00FFh
	dd	000FF00FFh,0F0FF00FFh,00FFF00FFh,0FFFF00FFh
	dd	00000F0FFh,0F000F0FFh,00F00F0FFh,0FF00F0FFh
	dd	000F0F0FFh,0F0F0F0FFh,00FF0F0FFh,0FFF0F0FFh
	dd	0000FF0FFh,0F00FF0FFh,00F0FF0FFh,0FF0FF0FFh
	dd	000FFF0FFh,0F0FFF0FFh,00FFFF0FFh,0FFFFF0FFh
	dd	000000FFFh,0F0000FFFh,00F000FFFh,0FF000FFFh
	dd	000F00FFFh,0F0F00FFFh,00FF00FFFh,0FFF00FFFh
	dd	0000F0FFFh,0F00F0FFFh,00F0F0FFFh,0FF0F0FFFh
	dd	000FF0FFFh,0F0FF0FFFh,00FFF0FFFh,0FFFF0FFFh
	dd	00000FFFFh,0F000FFFFh,00F00FFFFh,0FF00FFFFh
	dd	000F0FFFFh,0F0F0FFFFh,00FF0FFFFh,0FFF0FFFFh
	dd	0000FFFFFh,0F00FFFFFh,00F0FFFFFh,0FF0FFFFFh
	dd	000FFFFFFh,0F0FFFFFFh,00FFFFFFFh,0FFFFFFFFh
bitptn	ends

VRAM	segment 'CODE'
	assume  cs:VRAM
;**************************************
;	Write Kanji Code (JIS or SJIS)
;**************************************
       	public	wrtkan
wrtkan	proc	near
        push    ebp
        mov    	ebp,esp
        push   	esi
        push   	edi
	push	ebx
	push	ds
	push	fs

	mov	edi,[ebp].v_y
	shl	edi,13		; 128 * 4 * 16 * v_y = 8192 * v_x
	mov	eax,[ebp].v_x
	shl	eax,2		; v_x * 4
	add	edi,eax
	and	edi,03FFFFh
	add	edi,[ebp].v_off

	mov	eax,[ebp].v_ccol
	and	eax,0fh
	mov	eax,ds:[eax*4+offset colptn]
	mov	[ebp].v_ccol,eax
	mov	eax,[ebp].v_bcol
	and	eax,0fh
	mov	eax,ds:[eax*4+offset colptn]
	mov	[ebp].v_bcol,eax

	mov	ebx,[ebp].v_ch
	bt	ebx,15
	jnc	sjto4

	shl	bh,1				; Shift Jis to Jis
	cmp	bl,080h
	adc	bx,1f61h
	add	bl,7fh
	jc	knf1
	add	bl,0a2h
knf1:	and	bh,7fh				; StoJ end

sjto4:	push	es
	mov	ax,0110h
	mov	fs,ax
	mov	ax,0100h
	mov	dx,1010h
	call	pword ptr fs:[00a0h]
	pop	es

	mov	eax,104h
	mov	fs,ax

	mov	ecx,16
wrtkn1:	movzx	eax,byte ptr ds:[esi]
	inc	esi
	mov	eax,es:[eax*4+offset fntptn]
	mov	ebx,eax
	not	ebx
	and	eax,[ebp].v_ccol
	and	ebx,[ebp].v_bcol
	or	eax,ebx
	mov	fs:[edi],eax

	movzx	eax,byte ptr ds:[esi]
	inc	esi
	mov	eax,es:[eax*4+offset fntptn]
	mov	ebx,eax
	not	ebx
	and	eax,[ebp].v_ccol
	and	ebx,[ebp].v_bcol
	or	eax,ebx
	mov	fs:[edi+4],eax

	add	edi,512
	and	edi,03FFFFh
	add	edi,[ebp].v_off
	loop	wrtkn1

	pop	fs
	pop	ds
	pop	ebx
        pop    	edi
        pop    	esi
	pop	ebp
        ret
wrtkan	endp
;***********************************
;	Write ANK code
;***********************************
       	public	wrtank
wrtank	proc	near
        push    ebp
        mov    	ebp,esp
        push   	esi
        push   	edi
	push	ebx
	push	es
	push	fs

	mov	edi,[ebp].v_y
	shl	edi,13
	mov	eax,[ebp].v_x
	shl	eax,2
	add	edi,eax
	and	edi,03FFFFh
	add	edi,[ebp].v_off

	mov	eax,[ebp].v_ccol
	and	eax,0fh
	mov	eax,ds:[eax*4+offset colptn]
	mov	[ebp].v_ccol,eax
	mov	eax,[ebp].v_bcol
	and	eax,0fh
	mov	eax,ds:[eax*4+offset colptn]
	mov	[ebp].v_bcol,eax

	mov	ax,138h
	mov	es,ax
	mov	ax,104h
	mov	fs,ax

	mov	esi,[ebp].v_ch
	and	esi,0ffh
	shl	esi,4
	add	esi,3D800h

	mov	ecx,16
wrtak2:	movzx	eax,byte ptr es:[esi]
	inc	esi
	mov	eax,ds:[eax*4+offset fntptn]
	mov	ebx,eax
	not	ebx
	and	eax,[ebp].v_ccol
	and	ebx,[ebp].v_bcol
	or	eax,ebx
	mov	fs:[edi],eax
	add	edi,512
	and	edi,03FFFFh
	add	edi,[ebp].v_off
	loop	wrtak2

	pop	fs
	pop	es
	pop	ebx
        pop    	edi
        pop    	esi
	pop	ebp
        ret
wrtank	endp
;***********************************
;* 	VRAM Scrool
;***********************************
       	public	vramroll
vramroll proc	near
	push	esi
	push	edi
	push	ds
	push	es

	mov	eax,104h
	mov	es,ax
	mov	ds,ax

	mov	esi,512*16
	mov	edi,0
	cld
	mov	ax,16*24
vramlp:	mov	ecx,512/4
	rep movsd
	dec	ax
	jnz	vramlp

	mov	ecx,512*16/4
	mov	eax,0
	rep stosd

	pop	es
	pop	ds
	pop	edi
	pop	esi
	ret
vramroll endp
;********************************
;*    VRAM Clraer
;********************************
       	public	vramcls
vramcls proc	near
        push    ebp
        mov    	ebp,esp
	push	edx
	push	esi
	push	edi
	push	ds
	push	es

	mov	edi,[ebp+8]
	shl	edi,13
	and	edi,03ffffh
	add	edi,[ebp+16]

	cld
	mov	eax,[ebp+12]
	and	eax,0fh
	mov	eax,ds:[eax*4+offset colptn]

	mov	dx,104h
	mov	es,dx
	mov	ds,dx

	mov	dx,16
vramcl:	mov	ecx,512/4
	rep stosd
	and	edi,03ffffh
	add	edi,[ebp+16]
	dec	dx
	jnz	vramcl

	pop	es
	pop	ds
	pop	edi
	pop	esi
	pop	edx
	pop	ebp
	ret
vramcls endp
;***********************************
;	Displry CurSol
;***********************************
       	public	disp_cur
disp_cur proc	near
        push    ebp
        mov    	ebp,esp
        push   	edi
	push	ds

	mov	edi,[ebp+12]
	shl	edi,13
	mov	eax,[ebp+8]
	shl	eax,2
	add	edi,eax
	and	edi,03FFFFh
	add	edi,[ebp+16]

	mov	eax,104h
	mov	ds,ax

	mov	ecx,16
disp_1:	not	dword ptr ds:[edi]
	add	edi,512
	and	edi,03FFFFh
	add	edi,[ebp+16]
	loop	disp_1

	pop	ds
        pop    	edi
	pop	ebp
        ret
disp_cur endp
;***********************************
;	Displry CurSol
;***********************************
       	public	colset
colset	proc	near
        push    ebp
        mov    	ebp,esp
        push   	edi

	cld
	mov	edi,[ebp+8]
	mov	eax,[ebp+12]
	mov	ecx,[ebp+16]
	shr	ecx,1
	rep stosw

        pop    	edi
	pop	ebp
        ret
colset	endp
;***********************************
;	Soft Timer
;***********************************
       	public	Soft_Timer
Soft_Timer proc	near
	mov	cx,[esp+4]
        int	0FDh
        ret
Soft_Timer endp
;***********************************
;	Printer BIOS
;***********************************
       	public	PRB_chr
PRB_chr proc	near
	mov	ax,0100h
	mov	dl,[esp+4]
        int	94h
	mov	al,ah
	and	eax,0FFh
        ret
PRB_chr endp

;**********************************************
;	漢字コ−ドチェックテ−ブル
;**********************************************
ISKAN1	equ	1
ISKAN2	equ	2
;		0 1 2 3 4 5 6 7 8 9 A B C D E F
kantbl	db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;0
	db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;1
	db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;2
	db	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	;3
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2	;4
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2	;5
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2	;6
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0	;7
	db	2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3	;8
	db	3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3	;9
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2	;A
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2	;B
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2	;C
	db	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2	;D
	db	3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3	;E
	db	3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0	;F

;**************************************************
;void   wrtstr(char *str, int x, int y, int cl)
;                   +8        +12    +16    +20
;**************************************************
	public  wrtstr
wrtstr	proc	near
	push	ebp
	mov	ebp,esp
	sub	esp,8
	push	ebx
        push	esi
        push	edi

        mov	eax,[ebp+20]
        test	al,16
        je	BakCol
        and	eax,15
        mov	[ebp-8],eax		; bc
        mov	dword ptr [ebp-4],0	; fc
        jmp	WrtSt1

BakCol:	and	eax,0Fh
        mov	[ebp-4],eax		; fc
        mov	dword ptr [ebp-8],0	; bc

WrtSt1:	mov	eax,[ebp+12]		; x
	lea	edi,[eax+eax]
        mov	eax,[ebp+16]		; y
        lea    	eax,[eax+eax*4]
        shl	eax,5
        add	edi,eax
        add	edi,[dmy_vram]

        mov	esi,[ebp+8]		; *str
WrtStLp:
        movzx	eax,byte ptr [esi]
	inc	esi
        and	al,al
        jnz	WrtSt2

        pop	edi
        pop	esi
	pop	ebx
	leave
	ret

WrtSt2:
	mov	bl,[eax+offset kantbl]
	and	bl,ISKAN1
	jz	NonKan
	movzx	ebx,byte ptr [esi]
	mov	bh,[ebx+offset kantbl]
	and	bh,ISKAN2
	jz	NonKan
	mov	bh,al
	inc	si

        push	0
        push	dword ptr [ebp-8]
        push	dword ptr [ebp-4]
        push	dword ptr [ebp+16]
        push	dword ptr [ebp+12]
	push	ebx
        call	wrtkan
	add	esp,6*4

	mov	al,[ebp+20]
	or	al,40h
	mov	ah,bh
	mov	[edi],ax
	add	edi,2

	mov	al,[ebp+20]
	or	al,80h
	mov	ah,bl
	mov	[edi],ax
	add	edi,2

	add	dword ptr [ebp+12],2
	jmp	WrtStNt

NonKan:
	cmp	al,1Bh
	je	WrtStNt

	mov	ebx,eax
        push	0
        push	dword ptr [ebp-8]
        push	dword ptr [ebp-4]
        push	dword ptr [ebp+16]
        push	dword ptr [ebp+12]
        push	ebx
        call	wrtank
	add	esp,6*4

	mov	al,[ebp+20]
	mov	ah,bl
	mov	[edi],ax
	add	edi,2
        inc	dword ptr [ebp+12]

WrtStNt:
	cmp	dword ptr [ebp+12],80
	jl	WrtStLp
        inc	dword ptr [ebp+16]
        mov	dword ptr [ebp+12],0
        jmp	WrtStLp

wrtstr	endp

;******************************************
;void    Dsp_vram(char *vp)
;                       +8
;******************************************
	public	Dsp_vram
Dsp_vram proc	near
	push	ebp
	mov	ebp,esp
	sub	esp,16
	push	ebx
	push	esi
	push	edi

	mov	edi,[dmy_vram]
	add	edi,320
	mov	esi,[ebp+8]

	mov	dword ptr [ebp-4],0		; y = 0
DspYLop:
	mov	ecx,0
DspXLop:
	mov	ax,[esi]		; *vp
	cmp	ax,[edi]		; *mp
	je	DspXNxt

	cmp	ecx,0
	je	DspNxt1
	test	al,80h
	jz	DspNxt1
	mov	bx,[esi-2]
	test	bl,40h
	jz	DspNxt1

	dec	ecx
	sub	esi,2
	sub	edi,2

DspNxt1:
	movzx	eax,byte ptr [esi]
	test	al,10h
	je	DspNxt2
	and	al,0Fh
	mov	[ebp-16],eax
	mov	dword ptr [ebp-12],0
	jmp	DspNxt3

DspNxt2:
	and	al,0Fh
	mov	[ebp-12],eax
	mov	dword ptr [ebp-16],0

DspNxt3:
	mov	eax,[esi]
	and	eax,00800040h
	cmp	eax,00800040h
	jne	DspNxt4

	push	ecx
	push	0
	push	dword ptr [ebp-16]
	push	dword ptr [ebp-12]
	mov	eax,[ebp-4]
	add	eax,2
	push	eax
	push	ecx
	movzx	eax,byte ptr [esi+3]
	mov	ah,byte ptr [esi+1]
	push	eax
	call	wrtkan
	add	esp,6*4
	pop	ecx

	mov	eax,[esi]
	mov	[edi],eax
	jmp	DspXNxt

DspNxt4:
	push	ecx
	push	0
	push	dword ptr [ebp-16]
	push	dword ptr [ebp-12]
	mov	eax,[ebp-4]
	add	eax,2
	push	eax
	push	ecx
	mov	al,[esi]
	and	al,0C0h
	jz	DspNxt5
	mov	eax,0FEh
	jmp	DspNxt6
DspNxt5:
	movzx	eax,byte ptr [esi+1]
DspNxt6:
	push	eax
	call	wrtank
	add	esp,6*4
	pop	ecx

	mov	ax,[esi]
	mov	[edi],ax

DspXNxt:
	add	esi,2
	add	edi,2
	inc	ecx
	cmp	ecx,80
	jne	DspXLop

	inc	dword ptr [ebp-4]
	mov	eax,[ebp-4]
	cmp	eax,MAX_SCR
	jne	DspYLop

	mov    word ptr ReWrt_flg,-1
	call   locate

	pop	edi
	pop	esi
	pop	ebx
	leave
	ret

Dsp_vram endp

VRAM	ends
	end
