
	ASSUME	CS:CODE,DS:CODE,SS:STACK

CODE	SEGMENT	DWORD 'CODE'

DOT_Y	EQU	87H
LEN	EQU	130H
PROG	EQU	14000H-LEN

	PUBLIC	TBIOS
TBIOS:
;	PUBLIC	EGB_init
EGB_init:
	PUSH	DWORD PTR 0
	PUSHAD
	CLD
	MOV	AX,2CH
	MOV	DS,AX
	MOV	ES,AX
	MOV	AL,0
	XOR	EDI,EDI
	MOV	ECX,-1
ENV:	REPNZ	SCASB
	CMP	[EDI],AL
	JNZ	SHORT ENV
	ADD	EDI,2
CNVRT:	INC	EDI
	MOV	AL,[EDI]
	CMP	AL,'a'
	JC	SHORT KOMOJI
	CMP	AL,'z'+1
	JNC	SHORT KOMOJI
	SUB	AL,20H
	MOV	[EDI],AL
KOMOJI:	TEST	AL,AL
	JNZ	SHORT CNVRT
	CMP	DWORD PTR [EDI-12],'H'+'_'*100H+'V'*10000H+'2'*1000000H
	JNZ	SHORT EXIT3
	CMP	DWORD PTR [EDI-08],'1'+'L'*100H+'1'*10000H+'0'*1000000H
	JNZ	SHORT EXIT3
	CMP	DWORD PTR [EDI-04],'.'+'E'*100H+'X'*10000H+'P'*1000000H
	JNZ	SHORT EXIT3
	OR	AL,[EDI-13]
	JZ	SHORT FILEOK
	CMP	AL,':'
	JZ	SHORT FILEOK
	CMP	AL,'\'
	JNZ	SHORT EXIT3
FILEOK:	MOV	AL,24H
	MOV	DS,AX
	MOV	ES,AX
	MOV	EDI,81H
	MOVZX	ECX,BYTE PTR [EDI-1]
	MOV	AL,' '
	REPZ	SCASB			; パラメータ１の前のスペーススキップ
	JZ	SHORT EXIT3
	REPNZ	SCASB			; パラメータ１スキップ
	JNZ	SHORT EXIT3
	REPZ	SCASB			; パラメータ２の前のスペーススキップ
	JZ	SHORT EXIT3
	REPNZ	SCASB			; パラメータ２スキップ
	JNZ	SHORT EXIT3
	REPZ	SCASB			; パラメータ３の前のスペーススキップ
	JZ	SHORT EXIT3
	LEA	EDX,[EDI-1]
	REPNZ	SCASB			; パラメータ３スキップ
	XOR	ECX,ECX
	MOV	BYTE PTR [EDI-1],CL	; パラメータ３の末尾を０にする
	CMP	BYTE PTR [EDX],'+'
	JNZ	SHORT OVRWRT
	INC	EDX
	MOV	AX,3D02H		; ファイルのオープン
	INT	21H
	JC	SHORT OVRWRT
	MOV	EBX,EAX
	XOR	EDX,EDX
	MOV	AX,4202H		; ファイルのシーク
	INT	21H
	MOV	EAX,EBX
	JMP	SHORT EXIT4
OVRWRT:	MOV	AH,3CH			; オーバーライトモード
	INT	21H
	JNC	SHORT EXIT4
EXIT3:	XOR	EAX,EAX
EXIT4:	MOV	CX,118H
	MOV	DS,CX
	MOV	[HANDLE+PROG],AX
	POPAD
	RET

	ALIGN	4
;	PUBLIC	EGB_sjisString
EGB_sjisString:	
	PUSH	DWORD PTR 0
	CMP	WORD PTR [ESI+2],DOT_Y
	JNZ	SHORT EXIT2
	PUSH	ESI
	ADD	ESI,4
COMMON:	MOV	BX,FS:[HANDLE+PROG]
	TEST	BX,BX
	JZ	SHORT EXIT1
	LODSW
	MOVZX	ECX,AX
	TEST	ECX,ECX
	JZ	SHORT EXIT1
	PUSH	DS
	MOV	EDX,ESI
	MOV	AH,40H
	INT	21H
	JC	SHORT EXIT5
	CMP	EAX,ECX
	JNZ	SHORT EXIT5
	MOV	AX,118H
	MOV	DS,AX
	MOV	CL,2
	MOV	EDX,OFFSET CRLF+PROG
	MOV	AH,40H
	INT	21H
	JC	SHORT EXIT5
	CMP	EAX,ECX
	JZ	SHORT EXIT6
EXIT5:	MOV	[HANDLE+PROG],0
EXIT6:	POP	DS
EXIT1:	POP	ESI
EXIT2:	RET

	ALIGN	4
;	PUBLIC	EGB_connectSjisString
EGB_connectSjisString:
	PUSH	DWORD PTR 0
	CMP	WORD PTR GS:[EBP+344H+2],DOT_Y
	JNZ	SHORT EXIT2
	PUSH	ESI
	JMP	SHORT COMMON

CRLF	DB	13,10
HANDLE	DW	?

	ALIGN	4
	PUBLIC	START
START:
	; ＴＢＩＯＳ書き込みセグメント
	MOV	AX,118H
	MOV	ES,AX
	CLD
	; ＴＢＩＯＳ最後の必要エリアが０か調べる
	MOV	EDI,PROG
	XOR	EAX,EAX
	MOV	ECX,LEN/4
	REPZ	SCASD
	JNZ	SHORT ERROR
	; コール先を探す
	MOV	EBX,ES:[20H]
	MOV	EAX,0BD14FF2EH	; CALL CS:[EDI*4+????????]
	MOV	ECX,100H
	DEC	EBX
SEARCH:	INC	EBX
	CMP	ES:[EBX],EAX
	LOOPNZ	SEARCH
	JNZ	SHORT ERROR
	MOV	EBX,ES:[EBX+4]
	; データの書換え EGB_init
	MOV	EAX,OFFSET EGB_init+PROG
	XCHG	EAX,ES:[EBX]
	MOV	DWORD PTR [EGB_init+1],EAX
	; データの書換え EGB_sjisString
	MOV	EAX,OFFSET EGB_sjisString+PROG
	XCHG	EAX,ES:[EBX+60H*4]
	MOV	DWORD PTR [EGB_sjisString+1],EAX
	; データの書換え EGB_connectSjisString
	MOV	EAX,OFFSET EGB_connectSjisString+PROG
	XCHG	EAX,ES:[EBX+61H*4]
	MOV	DWORD PTR [EGB_connectSjisString+1],EAX
	; ＴＢＩＯＳへの転送
	XOR	ESI,ESI
	MOV	EDI,PROG
	MOV	ECX,LEN/4
	REP	MOVSD
	; 正常終了
	MOV	AL,0
	JMP	SHORT EXIT
	; 異常終了
ERROR:	MOV	AL,1
EXIT:	MOV	AH,4CH
	INT	21H

	DB	'H_LOG V1.1 by Yasu.Hara.'

CODE	ENDS

STACK	SEGMENT DWORD STACK 'STACK'

	DB	1024 DUP(?)

STACK	ENDS

	END	START
