;*****************************
;	セグメント宣言
;*****************************
pmdata	segment dword public 'DATA' use32
pmdata	ends
pmcode	segment dword public 'CODE' use32
pmcode	ends

VRAMSEL	equ	104h
TBIOSEL	equ	110h
FONTSEL	equ	138h

ISKAN1	equ	1
ISKAN2	equ	2

;*************************************
;    protect data segment defs
;*************************************
pmdata	segment

;*************************************
;	16色VRAMビットパタ−ン
;*************************************
ankfnt	dd	16*256 dup(?)
fntcol	dd	256 dup(?)

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

;**********************************************
;	漢字コ−ドチェックテ−ブル
;**********************************************
	public	kantbl
;		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

pmdata	ends
;*************************************
;    protect data segment defs end
;*************************************

;*************************************
;    stack parametor defs
;*************************************
p_para	struc
p_vadr	dd	?
p_ebp	dd	?
p_eip	dd	?
p_str	dd	?
p_page	dd	?
p_x	dd	?
p_y	dd	?
p_chrc	dd	?
p_bakc	dd	?
p_fsiz	dd	?
p_para	ends

;*************************************
;    protect code segment defs
;*************************************
pmcode	segment
	assume	cs:pmcode,ds:pmdata

;****************************************************************************
;void	wrtstr(char *str,int page,int x,int y,
;	       int chrcol,int bakcol,int fsiz)
;****************************************************************************
	align	4				; align set
	public	wrtstr
wrtstr	proc	near
	push	ebp
	push	eax				; vram address work
	mov	ebp,esp
	push	gs
	push	fs
	push	es
	push	esi
	push	edi
	push	ebx

	mov	ax,VRAMSEL			; VRAM Selecter
	mov	gs,ax				; gs = VRAM Selecter
	mov	ax,TBIOSEL			; TBIOS Selecter
	mov	fs,ax				; fs = TBIOS

	mov	edi,[ebp].p_y			; dsp pos Y
	shl	edi,9				; Y * 512
	mov	eax,[ebp].p_x			; dsp pos X
	shr	eax,1				; X / 2
	add	edi,eax				; vram address
	and	edi,03FFFFh			; mask 1 page
	mov	[ebp].p_vadr,edi		; work set

	movzx	eax,byte ptr [ebp].p_chrc
	and	al,0fh
	mov	eax,[eax*4+offset colptn]
	mov	[ebp].p_chrc,eax		; color pattn cheng

	movzx	eax,byte ptr [ebp].p_bakc
	and	al,0fh
	mov	eax,[eax*4+offset colptn]
	mov	[ebp].p_bakc,eax		; color pattn cheng

	align	4				; align set
wrtlop:						; Put Loop
	mov	esi,[ebp].p_str			; char *str
	movzx	eax,byte ptr [esi]
	inc	si
	or	al,al
	jz	end_wrt				; End of String ?

	mov	bl,[eax+offset kantbl]
	and	bl,ISKAN1
	jz	wrtank				; Not iskanji1 ?
	movzx	ebx,byte ptr [esi]
	mov	bh,[ebx+offset kantbl]
	and	bh,ISKAN2
	jz	wrtank				; Not iskanji2 ?
	mov	bh,al
	inc	si
	mov	[ebp].p_str,esi			; Save *str

	shl	bh,1				; Shift Jis to Jis
	cmp	bl,080h
	adc	bx,1f61h
	add	bl,7fh
	jc	short wrtst1
	add	bl,0a2h
wrtst1:	and	bh,7fh				; StoJ end

	mov	ax,0100h			; get font egb call
	mov	dx,1010h			; 16 * 16
	push	ds
	call	pword ptr fs:[00a0h]		; Get Kanji Font
	push	ds				; ds:esi = Kanji Font
	pop	es				; cheng ds<->es
	pop	ds

	mov	edi,[ebp].p_vadr		; vram address
	and	edi,03FFFFh			; mask 1 page
	or	edi,[ebp].p_page		; page
	mov	ecx,[ebp].p_fsiz		; Y = 16 Dot Font
	align	4				; align set

wtkn1:	mov	bx,es:[esi]
	add	esi,2

	cmp	byte ptr [ebp].p_fsiz,16
	je	short wtkn2
	or	bx,es:[esi]
	add	esi,2
wtkn2:
	movzx	eax,bl				; Get Kanji Left Font Pattan
	mov	eax,[eax*4+fntptn]		; Get Vram Bit Patan
	mov	edx,eax
	not	edx
	and	eax,[ebp].p_chrc
	and	edx,[ebp].p_bakc
	or	eax,edx
	mov	gs:[edi],eax			; Write Kanji Left Font

	movzx	eax,bh				; Get Kanji Right Font Pattan
	mov	eax,[eax*4+fntptn]		; Get Vram Bit Patan
	mov	edx,eax
	not	edx
	and	eax,[ebp].p_chrc
	and	edx,[ebp].p_bakc
	or	eax,edx
	mov	gs:[edi+4],eax			; Write Kanji Right Font

	add	edi,512				; 1 Line 512 Byte
	and	edi,03FFFFh
	or	edi,[ebp].p_page		; Page
	loop	wtkn1

	add	[ebp].p_vadr,8			; 16 / 2
	jmp	wrtlop				; Next Put String Loop

	align	4				; align set
wrtank:						; Write Ank Font
	cmp	al,1Bh				; Esc Code
	jne	short wtak0

	movzx	eax,byte ptr [esi]
	inc	esi
wtak0:	mov	[ebp].p_str,esi			; Save *str
	mov	esi,eax

	cmp	byte ptr [ebp].p_fsiz,16
	jne	short wrtft1
	shl	esi,4				; x16
	add	esi,3D800h			; 8x16 ANK Font Offset
	jmp	short wrtft2
wrtft1:	shl	esi,3				; x8
	add	esi,3D000h			; 8x8 ANK Font Offset

wrtft2:	mov	ax,FONTSEL			; ANK Font Selecter
	mov	es,ax

	mov	edi,[ebp].p_vadr		; vram address
	and	edi,03FFFFh			; mask 1 page
	or	edi,[ebp].p_page		; Page
	mov	ecx,[ebp].p_fsiz		; Y = 16 Dot Font
	align	4				; align set

wtak1:	movzx	eax,byte ptr es:[esi]		; Get Font Pattan
	inc	esi
	mov	eax,[eax*4+fntptn]		; Get Vram Bit Patan
	mov	edx,eax
	not	edx
	and	eax,[ebp].p_chrc
	and	edx,[ebp].p_bakc
	or	eax,edx
	mov	gs:[edi],eax			; Write Ank Font

	add	edi,512				; 1 Line 512 Byte
	and	edi,03FFFFh
	or	edi,[ebp].p_page		; Page
	loop	wtak1

	add	[ebp].p_vadr,4			; 8 / 2
	jmp	wrtlop				; Next Put String Loop

end_wrt:
	pop	ebx
	pop	edi
	pop	esi
	pop	es
	pop	fs
	pop	gs
	pop	eax				; work dmy pop
	pop	ebp
	ret					; end of wrtstr

wrtstr	endp

;*****************************************************
;void	putstr(char *str,int page,int y)
;*****************************************************
	align	4				; align set
	public	putstr
putstr	proc	near
	push	ebp
	push	eax				; vram address work
	mov	ebp,esp
	xor	eax,eax
	push	eax

	push	gs
	push	fs
	push	es
	push	esi
	push	edi
	push	edx
	push	ecx
	push	ebx

	cld
	mov	ax,VRAMSEL			; VRAM Selecter
	mov	es,ax				; es = VRAM Selecter
	mov	ax,TBIOSEL			; TBIOS Selecter
	mov	fs,ax				; fs = TBIOS
	mov	ax,ds
	mov	gs,ax				; gs = ds

	mov	edi,[ebp].p_x			; dsp pos Y !!!! x == y
	shl	edi,9				; Y * 512
	and	edi,03FFFFh			; mask 1 page
	mov	[ebp].p_vadr,edi		; work set

	align	4				; align set
putlop:						; Put Loop
	mov	esi,[ebp].p_str			; char *str
putlp2:
	lodsb					; Get String	※
	or	al,al
	je	end_put				; End of String ?

	movzx	eax,al
	mov	bl,[eax+offset kantbl]
	and	bl,ISKAN1
	jz	putank				; Not iskanji1 ?
	movzx	ebx,byte ptr [esi]
	mov	bh,[ebx+offset kantbl]
	and	bh,ISKAN2
	jz	putank				; Not iskanji2 ?
	mov	bh,al
	inc	esi				; doubel_word ?????	※
	mov	[ebp].p_str,esi			; Save *str

	shl	bh,1				; Shift Jis to Jis
	cmp	bl,080h
	adc	bx,1f61h
	add	bl,7fh
	jc	short knf1
	add	bl,0a2h
knf1:	and	bh,7fh				; StoJ end

	mov	ax,0100h
	mov	dx,1010h

	call	pword ptr fs:[00a0h]		; Get Kanji Font

	mov	edi,[ebp].p_vadr		; *vram
	add	edi,[ebp-4]
	and	edi,03FFFFh			; mask 1 page
	or	edi,[ebp].p_page		; or Page Offset
	mov	ebx,offset fntcol
	xor	edx,edx				; edx=0
	xor	ecx,ecx				; ecx=0

	REPT	16
	lodsw					; Get Kanji Font Pattern
	mov	cl,al				; Left Font Pattern
	mov	dl,ah				; Right Font Pattern
	mov	eax,gs:[ebx+ecx*4]		; Get Vram Bit Patan
	stosd					; Write Left Font 
	mov	eax,gs:[ebx+edx*4]		; Get Vram Bit Patan
	stosd					; Write Right Font
	add	edi,512-4*2			; 1 Line 512 Byte
	ENDM

	mov	ax,gs
	mov	ds,ax
	add	dword ptr [ebp-4],8		; 16 / 2 Next vram Address

	jmp	putlop				; Next Put String Loop

	align	4				; align set
putank:						; Write Ank Font
	cmp	al,1Bh				; ESC code
	jne	putak1
	lodsb					; Get String

putak1:	mov	[ebp].p_str,esi			; Save *str
	movzx	esi,al
	shl	esi,6				; 4 x 16 = 64
	add	esi,offset ankfnt		; ANK Font Table Offset

	mov	edi,[ebp].p_vadr		; *vram
	add	edi,[ebp-4]
	and	edi,03FFFFh			; mask 1 page
	or	edi,[ebp].p_page		; page add
	mov	ebx,512-4

	REPT	16
	movsd					; Trans Font
	add	edi,ebx				; Line add
	ENDM

	add	dword ptr [ebp-4],4		; 8 / 2 Next vram Address

	jmp	putlop				; Next Put String Loop

	align	4
end_put:
	mov	ebx,320
	sub	ebx,[ebp-4]			; nokori dword
	je	nonclr
	shr	ebx,2				; / 4

	mov	edi,[ebp].p_vadr		; *vram
	add	edi,[ebp-4]			; work add
	and	edi,03FFFFh
	or	edi,[ebp].p_page		; or Page Offset
	mov	edx,[ebp-4]
	add	edx,512-320
	mov	eax,[fntcol]
	REPT	16
	mov	ecx,ebx				; nokori dword
	rep	stosd
	add	edi,edx
	and	edi,03FFFFh
	or	edi,[ebp].p_page
	endm
nonclr:
	pop	ebx
	pop	ecx
	pop	edx
	pop	edi
	pop	esi
	pop	es
	pop	fs
	pop	gs
	add	esp,8				; work pop
	pop	ebp
	ret					; end of putstr
putstr	endp

;***************************************************
;void	ctblset(int chrcol,int bakcol);
;***************************************************
	public	ctblset
ctblset	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	fs

	movzx	eax,byte ptr [ebp+8]
	and	al,0fh
	mov	eax,[eax*4+offset colptn]
	mov	[ebp+8],eax			; color pattn cheng

	movzx	eax,byte ptr [ebp+12]
	and	al,0fh
	mov	eax,[eax*4+offset colptn]
	mov	[ebp+12],eax			; color pattn cheng

	mov	ecx,256				; color bit pattn gen
	mov	esi,offset fntptn
	mov	edi,offset fntcol
ctblp:	lodsd
	mov	edx,eax
	not	edx
	and	eax,[ebp+8]
	and	edx,[ebp+12]
	or	eax,edx
	stosd
	loop	ctblp

	mov	ax,FONTSEL			; ANK Font Selecter
	mov	fs,ax
	mov	esi,3D800h
	mov	edi,offset ankfnt

	mov	ecx,16*256			; ANK bit pattn gen
aktb1:	movzx	eax,byte ptr fs:[esi]
	inc	esi
	mov	eax,[eax*4+fntcol]
	stosd
	loop	aktb1

	pop	fs
	pop	edi
	pop	esi
	pop	ebp
	ret
ctblset	endp

;**************************************************************
;
;	任意のCRTCレジスタに任意のワ−ド値を設定する
;
;void	vram_offset(reg,ofs)
;int	reg;		[ebp+8]		CRTCレジスタNo.
;int	ofs;		[ebp+12]	設定値
;**************************************************************
	public	vram_offset
vram_offset	proc	near
	push	ebp
	mov	ebp,esp
	push	edx

	mov	al,[ebp+8]			; CRTCレジスタNo.を
	mov	dx,0440h			; 
	out	dx,al				; 書き込み
	mov	eax,[ebp+12]			; 設定値を
	mov	dx,0442h			;
	out	dx,ax				; 書き込む

	pop	edx
	pop	ebp
	ret
vram_offset	endp

	public	sjistojis
sjistojis	proc	near
	movzx	eax,word ptr [esp+4]
	shl	ah,1				; Shift Jis to Jis
	cmp	al,080h
	adc	ax,1f61h
	add	al,7fh
	jc	short sjis1
	add	al,0a2h
sjis1:	and	ah,7fh				; StoJ end
	ret
sjistojis	endp

	public	peek
peek	proc	near
	push	edx
	sub	eax,eax
	mov	dx,[esp+8]
	in	al,dx
	pop	edx
	ret
peek	endp

;****************************************************************************
;void	CTRL_sysdrv()
;****************************************************************************
		align	4				; align set
		public	CTRL_sysdrv
CTRL_sysdrv	proc	near
		push	es
		push	esi
		push	edi
		push	ebx

		mov	ax,0060h			; Real 1M Selector
		mov	es,ax

		mov	ax,0000h
		int	0D9h				; CONTRL.EXE Call
		mov	edx,ebx
		and	edx,0FFFF0000h
		and	ebx,00000FFFFh
		shr	edx,12				; base address
		add	ebx,edx

		movzx	eax, byte ptr es:[ebx - 1]
		pop	ebx
		pop	edi
		pop	esi
		pop	es
		ret
CTRL_sysdrv	endp
;****************************************************************************
;int	CTRL_command(int code, char *str)
;		         +8         +12
;****************************************************************************
		align	4				; align set
		public	CTRL_command
CTRL_command	proc	near
		push	ebp
		mov	ebp,esp
		push	ds
		push	es
		push	esi
		push	edi
		push	ebx

		mov	ax,0060h			; Real 1M Selector
		mov	es,ax

		mov	ax,0000h
		int	0D9h				; CONTRL.EXE Call
		mov	edx,ebx
		and	edx,0FFFF0000h
		and	ebx,00000FFFFh
		shr	edx,12				; base address
		add	ebx,edx

		mov	eax,dword ptr es:[ebx - 128]
		cmp	eax,04030201h			; 'HELPER.COM'
		je	CTRL_cmd4
		mov	eax,0FFFFFFFFh
		jmp	CTRL_cmd3

CTRL_cmd4:	mov	ax,[ebp + 8]			; code
		mov	word ptr es:[ebx],ax

		lea	edi,[ebx + 10]
		mov	esi,[ebp + 12]			; str
		mov	ecx,120

CTRL_cmd1:	lodsb
		stosb
		cmp	al,0
		jz	CTRL_cmd2
		loop	CTRL_cmd1

CTRL_cmd2:	mov	eax,0
CTRL_cmd3:	pop	ebx
		pop	edi
		pop	esi
		pop	es
		pop	ds
		pop	ebp
		ret					; end of
CTRL_command	endp

;****************************************************************************
;int	CTRL_work(int mode, char *str) mode = 0 get; 1 set
;		       +8         +12
;****************************************************************************
		align	4				; align set
		public	CTRL_work
CTRL_work	proc	near
		push	ebp
		mov	ebp,esp
		push	ds
		push	es
		push	esi
		push	edi
		push	ebx

		mov	ax,0060h			; Real 1M Selector
		mov	es,ax

		mov	ax,0000h
		int	0D9h				; CONTRL.EXE Call
		mov	edx,ebx
		and	edx,0FFFF0000h
		and	ebx,00000FFFFh
		shr	edx,12				; base address
		add	ebx,edx

		mov	eax,dword ptr es:[ebx - 128]
		cmp	eax,04030201h			; 'HELPER.COM'
		je	CTRL_wrk4
		mov	eax,0FFFFFFFFh
		jmp	CTRL_wrk3

CTRL_wrk4:	mov	eax,[ebp + 8]
		cmp	eax, 0
		jne	CTRL_wrk1

		lea	esi,[ebx - 128]
		mov	edi,[ebp + 12]			; str
		push	ds
		push	es
		pop	ds
		pop	es
		jmp	CTRL_wrk2

CTRL_wrk1:	lea	edi,[ebx - 128]
		mov	esi,[ebp + 12]			; str

CTRL_wrk2:	mov	ecx,32				; 30 * 4 = 128
		rep	movsd

		mov	eax,0
CTRL_wrk3:	pop	ebx
		pop	edi
		pop	esi
		pop	es
		pop	ds
		pop	ebp
		ret					; end of
CTRL_work	endp

;****************************************************************************
;void	TRAP_init()
;****************************************************************************
ABORT_entry	proc	far
		mov	al,03h
		iretd
ABORT_entry	endp

		public	ABORT_init
ABORT_init	proc	near
		mov	ax,2506h
		mov	cl,24h		; ABORTINT
		push	ds
		mov	dx,cs
		mov	ds,dx
		lea	edx,ABORT_entry
		int	21h
		pop	ds
		ret
ABORT_init	endp

extrn		FGS_close:near

dmywork		dd	256 dup(0)

		public	sub_FGS_close
sub_FGS_close	proc	near
		push	ebx
		push	esi
		push	edi
		mov	ebx, offset dmywork
		mov	esi,ebx
		mov	edi,ebx
		call	FGS_close
		pop	edi
		pop	esi
		pop	ebx
		ret
sub_FGS_close	endp

pmcode		ends
;*************************************
;    protect code segment defs end
;*************************************
		end
