;
;	helper control program
;
;	1994.07.04	remake by K.Miyazaki
;
		.386p
code		segment	byte public use16 'CODE'
code		ends

code		segment
		assume	cs:code,ds:code,es:code,ss:nothing

CTRL_INT	equ	0D9h

		org	02ch
EnvSeg		label	word

		org	05Ch
Exe_fcb1	label	byte

		org	06Ch
Exe_fcb2	label	byte

		org	080h
CmdsLine	label	byte

		org	100h
entry:		jmp	main

Exe_Param	dw	?		; Envp Seg	+0
		dw	offset Pam_line	; para offset	+2
		dw	?		;      seg	+4
		dw	offset Exe_fcb1	; FCB1 offset	+6
		dw	?		;      seg	+8
		dw	offset Exe_fcb2	; FCB2 offset	+10
		dw	?		;      seg	+12

Def_Cmd		db	'Q:\RUN386.EXE',0
Def_Param	db	26
		db	'-nocrtreset '
Def_Exp		db	'Q:\HELPER.EXP '
Def_ExpPara	db	0Dh
		db	100 dup (0)

Pam_line	db	128 dup (0)

Menu_Mark	db	1,2,3,4
Menu_Work	db	123 dup (0)	; M_MENU用のワ−クエリア
Boot_Drv	db	0		; 起動したドライブNo.
Cmd_code	dw	0		; コマンドコード(INPUT)
Cmd_stat	dw	0		; エラーレベル  (OUTPUT)
Dos_errno	dw	0		; INT21(#4B)時に返されるAXの値(OUTPUT)
Dev_code	dw	0		; INT24時に渡されるAXの値(OUTPUT)
Err_code	dw	0		; INT24時に渡されるDIの値(OUTPUT)
Cmd_line	db	128 dup (0)

Ctrl_Vect	dd	far
Abort_Vect	dd	far

exec		proc	near
		mov	si, offset Cmd_line
		cld

exec_0:		mov	al,[si]
		cmp	al,' '
		je	exec_01
		cmp	al,09h
		jne	exec_1
exec_01:	inc	si
		jmp	exec_0

exec_1:		mov	al,[si]
		cmp	al,0
		je	exec_3
		cmp	al,' '
		je	exec_2
		cmp	al,09h
		je	exec_2
		cmp	al,0Dh
		je	exec_2
		inc	si
		jmp	exec_1

exec_2:		mov	byte ptr [si], 0
		inc	si

exec_3:		mov	di, offset Pam_line + 1
		mov	ah,0

exec_4:		mov	al,[si]
		cmp	al,0
		je	exec_5
		cmp	al,0Dh
		je	exec_5
		movsb
		inc	ah
		jmp	exec_4

exec_5:		mov	Pam_line,ah
		mov	byte ptr [di], 0Dh
		mov	byte ptr [di + 1], 0

		mov	di,offset Exe_Param
		mov	word ptr [di+2],offset Pam_line

		mov	si,offset Pam_line + 1
		mov	di,offset Exe_fcb1
		mov	ax,2901h
		int	21h
		mov	di,offset Exe_fcb2
		mov	ax,2901h
		int	21h

		mov	Dos_errno,0
		mov	Dev_code,0
		mov	Err_code,0

		mov	dx,offset Cmd_line
		mov	bx,offset Exe_Param
		mov	ax,4B00h
		int	21h
		jnc	exec_6
		mov	Dos_errno,ax
		ret

exec_6:		mov	ah,4Dh
		int	21h
		mov	Cmd_stat,ax
		ret

exec		endp

menu		proc	near
		mov	ah,0Eh
		mov	dl,Boot_Drv
		int	21h

		mov	di,offset Exe_Param
		mov	word ptr [di+2],offset Def_Param

		mov	si,offset Def_Exp
		mov	di,offset Exe_fcb1
		mov	ax,2901h
		int	21h
		mov	di,offset Exe_fcb2
		mov	ax,2901h
		int	21h

		mov	dx,offset Def_Cmd
		mov	bx,offset Exe_Param
		mov	ax,4B00h
		int	21h
		ret		

menu		endp

Ctrl_Trap	proc	far
		push	cs
		pop	es
		mov	bx,cs
		shl	ebx,16
		mov	bx,offset Cmd_code
		iret
Ctrl_Trap	endp

Abort_Trap	proc	far
		mov	cs:Dev_code,ax
		mov	cs:Dev_code,di
		mov	al,3
		iret
Abort_Trap	endp

main		proc	near
		mov	ax,cs
		mov	ds,ax
		mov	es,ax

		mov	sp,offset Local_Stack		; Stack Init

		mov	bx,offset End_of_Prog
		add	bx,15
		shr	bx,4
		mov	ah,4Ah
		int	21h				; Memory resize

		mov	ah,19h
		int	21h
		mov	Boot_Drv,al

		add	al,'A'
		mov	Def_Cmd,al
		mov	Def_Exp,al

		mov	di,offset Exe_Param
		mov	ax,EnvSeg
		mov	[di+0],ax
		mov	ax,ds
		mov	[di+4],ax
		mov	[di+8],ax
		mov	[di+12],ax

		push	es
		mov	ah,35h
		mov	al,CTRL_INT
		int	21h
		mov	word ptr Ctrl_Vect,bx
		mov	ax,es
		mov	word ptr Ctrl_Vect + 2,ax
		pop	es

		mov	dx,offset Ctrl_Trap
		mov	ah,25h
		mov	al,CTRL_INT
		int	21h

		push	es
		mov	ax,3524h
		int	21h
		mov	word ptr Abort_Vect,bx
		mov	ax,es
		mov	word ptr Abort_Vect + 2,ax
		pop	es

		mov	dx,offset Abort_Trap
		mov	ax,2524h
		int	21h

		cld
		mov	si,offset CmdsLine
		mov	di,offset Def_ExpPara
		lodsb
main_ex_1:	cmp	al,0
		je	main_ex_2
		mov	ah,byte ptr [si]
		cmp	ah,0
		je	main_ex_2
		cmp	ah,0Dh
		je	main_ex_2
		movsb
		inc	Def_Param
		dec	al
		jmp	main_ex_1

main_ex_2:	mov	ah,0Dh
		mov	byte ptr [di], ah

main_1:		cmp	Cmd_code,0
		je	main_2
		cmp	Cmd_code,0FFh
		je	main_end
		call	exec
		mov	Cmd_code,0
main_2:		call	menu
		jnc	main_1

main_end:	push	ds
		lds	dx,Ctrl_Vect
		mov	ah,25h
		mov	al,CTRL_INT
		int	21h
		pop	ds

		push	ds
		lds	dx,Abort_Vect
		mov	ax,2524h
		int	21h
		pop	ds

		mov	ax,4C00h			; End of Prog
		int	21h

main		endp

		db	256 dup (?)
Local_Stack	label	word
End_of_Prog	label	word

code		ends
		end	entry
