;*****************************************************************
;
;void	wrtank(ch,x,y,ccol,bcol)
;
;void	wrtkanji(ch,x,y,ccol,bcol)
;
;*****************************************************************
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,011111111h,022222222h,033333333h
	dd	044444444h,055555555h,066666666h,077777777h
	dd	088888888h,099999999h,0AAAAAAAAh,0BBBBBBBBh
	dd	0CCCCCCCCh,0DDDDDDDDh,0EEEEEEEEh,0FFFFFFFFh
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	es
	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	eax,104h
	mov	fs,ax

	mov	ebx,[ebp].v_ch
	bt	ebx,15
	jnc	sjto4
	cmp	bh,9fh
	jbe	sjto1
	sub	bh,0B1h-071h
sjto1:  sub	bh,071h
	shl	bh,1
	inc	bh
	cmp	bl,7fh
	jbe	sjto2
	dec	bl
sjto2:	cmp	bl,9eh
	jb	sjto3
	sub	bl,7dh
	inc	bh
	jmp	sjto4
sjto3:	sub	bl,1fh

sjto4:	mov	dx,0FF94h
	mov	al,bh
	out	dx,al
	inc	dx
	mov	al,bl
	out	dx,al

	mov	ecx,16
wrtkn1:	mov	dx,0FF96h
	sub	eax,eax
	in	al,dx
	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

	inc	dx
	sub	eax,eax
	in	al,dx
	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+4],eax

	add	edi,512
	and	edi,03FFFFh
	add	edi,[ebp].v_off
	loop	wrtkn1

	pop	fs
	pop	es
	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
;***********************************
;	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
;***********************************
;	Printer BIOS
;***********************************
       	public	sub_PRB_chr
sub_PRB_chr proc	near
	mov	ax,0100h
	mov	dl,[esp+4]
        int	94h
	mov	al,ah
	and	eax,0FFh
        ret
sub_PRB_chr endp

       	public	inp
inp	proc	near
	mov	dx,[esp+4]
	in	al,dx
	and	eax,0FFh
        ret
inp	endp

       	public	outp
outp	proc	near
	mov	dx,[esp+4]
	mov	ax,[esp+8]
	out	dx,al
        ret
outp	endp

VRAM	ends
	end
