;
;		ish file converter for MS-DOS  Ver 2.00 (90/3/27)
;
;
;		Copyright (c) 1986, 1987, 1989, 1990  by  M. ishizuka
;		All rights reserved.
;



;-----------------------------------------------;
;						;
;	get_num					;
;						;
;	INPUT :	dl (switch character)		;
;		si (pointer)			;
;	OUTPUT:	bx (number)			;
;		si (next pointer)		;
;	ERROR :	error_01			;
;	BREAK : flags, ax			;
;						;
;-----------------------------------------------;

get_num:	xor	bx, bx
get_num_1:	lodsb
		cmp	al, dl
		jz	get_num_2
		cmp	al, 0dh
		jz	get_num_2
		cmp	al, 20h
		jz	get_num_2
		cmp	al, 9
		jz	get_num_2
		sub	al, '0'
		jc	error_01
		cmp	al, 9+1
		jnc	error_01
		cbw
		add	bx, bx
		add	ax, bx
		add	bx, bx
		add	bx, bx
		add	bx, ax
		jmp	get_num_1
;
get_num_2:	dec	si
		ret



;-----------------------------------------------;
;						;
;	movsb1					;
;						;
;	INPUT :	si (source pointer)		;
;		di (destination pointer)	;
;		flags (cld)			;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	ax, cx, si, di			;
;						;
;-----------------------------------------------;

movsb1:		lodsb
		cbw
		mov	cx, ax
		rep	movsb
		ret



;-----------------------------------------------;
;						;
;	_read					;
;						;
;	INPUT :	cx (read length)		;
;		dx (read buffer address)	;
;	OUTPUT:	CY (disk read error)		;
;		ZR (end of file)		;
;	ERROR :	NON				;
;	BREAK :	flags, ax, bx			;
;						;
;-----------------------------------------------;

_read:		xor	ax, ax
		push	ds
		push	si
		push	di
		push	dx
		mov	si, 0
_read_buffer_seg  equ	$-2
		mov	ds, si
		mov	di, dx
_read_1:	push	cx
		cmp	es:disk_read_length, 0
		jnz	_read_3
		push	ax
		push	bx
		xor	dx, dx
		mov	es:disk_read_ptr, dx
		mov	cx, 1000h
_read_buffer_length equ	$-2
		mov	bx, es:read_handler
		mov	ah, 3fh
		int	21h
		jc	_read_2
		mov	es:disk_read_length, ax
		or	ax, ax
_read_2:	pop	bx
		pop	ax
		pop	cx
		ja	_read_1
		jmp	_read_5

_read_3:	sub	cx, ax
		sub	es:disk_read_length, cx
		jnc	_read_4
		add	cx, es:disk_read_length
		mov	es:disk_read_length, 0
_read_4:	add	ax, cx
		mov	si, es:disk_read_ptr
		rep	movsb
		mov	es:disk_read_ptr, si
		pop	cx
		cmp	es:disk_read_length, 0
		jz	_read_1
_read_5:	pop	dx
		pop	di
		pop	si
		pop	ds
		ret



;-----------------------------------------------;
;						;
;	write					;
;						;
;	INPUT :	?				;
;	OUTPUT:	?				;
;	ERROR :	?				;
;	BREAK :	flags, ?			;
;						;
;-----------------------------------------------;

write:		mov	dx, offset write_buffer

;-----------------------------------------------;
;						;
;	write2					;
;						;
;	INPUT :	cx (length)			;
;		dx (pointer)			;
;	OUTPUT:	flags (NC: ok)			;
;		      (CY: end of file or error);
;	ERROR :	error_09, error_33		;
;	BREAK :	flags, ax			;
;						;
;-----------------------------------------------;

write_2:	push	cx
		@@write
		jc	error_09
		pop	cx
		cmp	ax, cx
		jnz	error_09
		ret



;-----------------------------------------------;
;						;
;	_write_close				;
;						;
;	INPUT :	?				;
;	OUTPUT:	?				;
;	ERROR :	?				;
;	BREAK :	flags, ?			;
;						;
;-----------------------------------------------;

_write_close:	mov	bx, word ptr cmpfile_handler
		or	bx, bx
		jnz	_write_close_3
		xor	dx, dx
		mov	disk_write_ptr, dx
		mov	cx, 1000h
_write_buffer_length_2	equ	$-2
		sub	cx, disk_write_length_left
		jz	_write_close_1_5
		mov	disk_write_length_left, 1000h
_write_buffer_length_3	equ	$-2
		mov	bx, write_handler
		push	ds
		mov	ax, 0
_write_buffer_seg_2 equ	$-2
		mov	ds, ax
		mov	ah, 40h
		int	21h
		pop	ds
		jc	_write_close_ret
		cmp	ax, cx
		jnc	_write_close_1
		cmp	byte ptr error_33_flag, 0
		jnz	error_33
		stc
		jmp	_write_close_ret

_write_close_1:	cmp	byte ptr stdout, 0
		jnz	_write_close_1_5
		cmp	byte ptr renamed_flag, '#'
		jnz	_write_close_1_5
		cmp	byte ptr restore_ok, 0
		jz	_write_close_1_5
		mov	si, offset idblock_volume_table
		mov	cx, -8
_write_close_1_1:
		lodsb
		add	cx, 8
		inc	al
		jz	_write_close_1_1
		dec	al
_write_close_1_2:
		inc	cx
		shr	al, 1
		jc	_write_close_1_2
		mov	ax, 4200h
		mov	bx, write_handler
		cmp	cx, word ptr max_division
		jna	_write_close_1_4
		xor	cx, cx
		xor	dx, dx
		int	21h		; move file pointer (rewind)
		jc	_write_close_ret
		@@display	msg_rename_0
		mov	ax, word ptr idblock_header_copy
		mov	dx, word ptr idblock_header_copy[2]
		mov	bx, write_handler
		call	calc_crc_of_file
		jc	_write_close_ret
		xor	cx, cx
		test	byte ptr idblock_header_copy[24], 4d
		jz	_write_close_1_3
		cmp	bp, word ptr idblock_header_copy[32]
		jnz	error_27
		mov	cx, 1
_write_close_1_3:
		test	byte ptr idblock_header_copy[24], 8d
		jz	_write_close_1_3_1
		cmp	ax, word ptr idblock_header_copy[34]
		jnz	error_28
		cmp	dx, word ptr idblock_header_copy[36]
		jnz	error_28
		or	cx, 2
_write_close_1_3_1:
		mov	dx, offset msg_crc_ok_0
		jcxz	_write_close_1_3_2
		mov	dx, offset msg_crc_ok_1
		dec	cx
		jz	_write_close_1_3_2
		mov	dx, offset msg_crc_ok_2
		dec	cx
		jz	_write_close_1_3_2
		mov	dx, offset msg_crc_ok_3
_write_close_1_3_2:
		@@display	dx
		mov	ah, 40h
		mov	bx, write_handler
		xor	cx, cx
		int	21h		; adjust file size
		jc	_write_close_ret
		mov	byte ptr restore_ok, 1
		jmp	_write_close_1_5

_write_close_1_4:
		mov	dx, word ptr idblock_offset
		mov	cx, word ptr idblock_offset[2]
		int	21h
		jc	_write_close_ret
		mov	ah, 40h
		mov	bx, write_handler
		mov	cx, INTERMEDIATE_HEADER_SIZE
		mov	dx, offset idblock
		int	21h
		jc	_write_close_ret
		cmp	ax, cx
		jc	_write_close_ret
_write_close_1_5:
		cmp	byte ptr stdout, 0
		jnz	_write_close_ret_or
		mov	si, offset date_time_flag
		lodsb
		test	al, 1
		jz	_write_close_2
		lodsw
		mov	cx, ax
		lodsw
		mov	dx, ax
		mov	ax, 5701h
		mov	bx, write_handler
		int	21h
		jb	error_11
_write_close_2:	mov	bx, write_handler
		mov	ah, 3eh
		int	21h
		mov	word ptr write_handler, 0
		jc	_write_close_ret
		cmp	byte ptr restore_ok, 1
		jnz	_write_close_ret_or
		mov	word ptr max_division, 0
		@@rename_intermediate_file
_write_close_ret_or:
		or	al, al		; clear CY flag
_write_close_ret:
		ret

_write_close_3:	mov	ah, 3eh
		int	21h
		jc	error_24
		mov	word ptr cmpfile_handler, 0
		ret



;-----------------------------------------------;
;						;
;	tolower					;
;						;
;	INPUT :	al (character)			;
;	OUTPUT:	al (character)			;
;	ERROR :	NON				;
;	BREAK :	flags				;
;						;
;-----------------------------------------------;

tolower:	cmp	al, 'A'
		jb	tolower_ret
		cmp	al, 'Z'+1
		jnb	tolower_ret
		add	al, 20h
tolower_ret:	ret



;-----------------------------------------------;
;						;
;	lodsb_tolower_new			;
;						;
;	INPUT :	si (pointer)			;
;		ah (0ffh: the 2nd character of KANJI)
;		   ( 00h: else)			;
;	OUTPUT:	al (character)			;
;		si (next pointer)		;
;		ah (0ffh: the 1st character of KANJI)
;		   ( 00h: else)			;
;	ERROR :	NON				;
;	BREAK :	flags				;
;						;
;-----------------------------------------------;

lodsb_tolower_new:
		lodsb
		xor	ah, 0ffh
		jz	lodsb_tolower_new_ret
		cmp	al, 'A'
		jb	lodsb_tolower_new_1
		cmp	al, 'Z'+1
		jb	lodsb_tolower_new_2
		cmp	al, 81h
		jb	lodsb_tolower_new_1
		cmp	al, 0a0h
		jb	lodsb_tolower_new_ret
		cmp	al, 0e0h
		jb	lodsb_tolower_new_1
		cmp	al, 0fdh
		jb	lodsb_tolower_new_ret
lodsb_tolower_new_1:
		not	ah
lodsb_tolower_new_ret:
		ret

lodsb_tolower_new_2:
		add	al, 20h
		jmp	lodsb_tolower_new_1



;-----------------------------------------------;
;						;
;	skip_space				;
;						;
;	INPUT :	si (pointer)			;
;	OUTPUT:	al (next character)		;
;		si (pointer)			;
;		flag				;
;		( ZR : next char is 0dh )	;
;	ERROR :	NON				;
;	BREAK :	NON				;
;						;
;-----------------------------------------------;

skip_space:	lodsb
		cmp	al, 20h
		jz	skip_space
		cmp	al, 9h
		jz	skip_space
		dec	si
		cmp	al, 0dh
		ret



;-----------------------------------------------;
;						;
;	trunc					;
;						;
;	INPUT :	dx (high word)			;
;		ax (low word)			;
;	OUTPUT:	dx (high word)			;
;		ax (low word)			;
;	ERROR :	NON				;
;	BREAK :	flags				;
;						;
;	FUNCTION:				;
;	 trunc[((dx, ax)+para_A)/para_B]	;
;						;
;-----------------------------------------------;

trunc:		push	bx
		push	cx
		push	si
		add	ax, para_A
		adc	dx, 0
		mov	cx, 0ffffh
		mov	bx, cx
		mov	si, para_B
trunc_1:	add	cx, 1
		adc	bx, 0
		sub	ax, si
		sbb	dx, 0
		jnc	trunc_1
		mov	ax, cx
		mov	dx, bx
		pop	si
		pop	cx
		pop	bx
		ret



;-----------------------------------------------;
;						;
;	hex_to_dec				;
;						;
;	INPUT :	dx (high word)			;
;		ax (low word)			;
;		di (write pointer)		;
;	OUTPUT:	di (next write pointer)		;
;	ERROR :	NON				;
;	BREAK :	flags				;
;						;
;-----------------------------------------------;

hex_to_dec:	push	ax
		push	bx
		push	cx
		push	dx
		push	si
		push	bp
		mov	cx, 10d
		mov	si, offset dec_table
hex_to_dec_0:	push	cx
		push	ax
		lodsw
		mov	cx, ax
		lodsw
		mov	bx, ax
		pop	ax
		mov	bp, 02fh
hex_to_dec_1:	inc	bp
		sub	ax, cx
		sbb	dx, bx
		jnc	hex_to_dec_1
		add	ax, cx
		adc	dx, bx
		cmp	bp, 30h
		jnz	hex_to_dec_2
		cmp	byte ptr [di-1], '0'
		jc	hex_to_dec_3
		cmp	byte ptr [di-1], '9' + 1
		jnc	hex_to_dec_3
hex_to_dec_2:	mov	[di], bp
		inc	di
hex_to_dec_3:	pop	cx
		loop	hex_to_dec_0
		pop	bp
		pop	si
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		ret



;-----------------------------------------------;
;						;
;	calc_order				;
;						;
;	INPUT :	dx (high word)			;
;		ax (low word)			;
;	OUTPUT:	ax (order)			;
;	ERROR :	NON				;
;	BREAK :	flags				;
;						;
;-----------------------------------------------;

calc_order:	push	bx
		push	cx
		push	si
		push	di
		mov	bx, ax
		mov	cx, 10d + 1
		mov	si, offset dec_table
calc_order_1:	dec	cx
		lodsw
		mov	di, ax
		lodsw
		cmp	dx, ax
		jc	calc_order_1
		jnz	calc_order_2
		cmp	bx, di
		jc	calc_order_1
calc_order_2:	mov	ax, cx
		pop	di
		pop	si
		pop	cx
		pop	bx
		ret



;-----------------------------------------------;
;						;
;	disp_ish				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx, dl, si		;
;						;
;-----------------------------------------------;

disp_ish:	mov	si, offset work_fcb_2
		@@dispstr_sub
		@@dispchr	':'
		mov	cx, word ptr file_block_length
		push	cx
disp_ish_3:	@@dispchr	'.'
		loop	disp_ish_3
		pop	cx
disp_ish_4:	@@dispchr	08h
		loop	disp_ish_4
		ret



;-----------------------------------------------;
;						;
;	init_constants				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	NON				;
;						;
;-----------------------------------------------;

init_constants:	mov	byte ptr renamed_flag, 0
		mov	word ptr read_length, 0ffffh
		mov	word ptr title_count, 0
		mov	word ptr title_count2, 0
		mov	word ptr line_number_low, 1
		mov	word ptr line_number_high, 0
		mov	word ptr save_count_low, 0
		mov	word ptr save_count_high, 0
		mov	word ptr line_number_low_save, 1
		mov	word ptr line_number_high_save, 0
		mov	word ptr disk_write_length_left, 1000h
_write_buffer_length_4	equ	$-2
		ret



;-----------------------------------------------;
;						;
;	search_env				;
;						;
;	INPUT :	si (pointer to search name)	;
;	OUTPUT:	flags (ZR: found)		;
;		      (NZ: not found)		;
;		ds:si (pointer)			;
;	ERROR :	NON				;
;	BREAK : flags, ax, cx, di		;
;						;
;-----------------------------------------------;

search_env:	lodsb
		xor	ah, ah
		mov	cx, ax
		mov	ax, word ptr ENV_SEG
		mov	es, ax
		xor	di, di
search_env_1:	push	cx
		push	si
		repz	cmpsb
		pop	si
		pop	cx
		jz	search_env_ret
search_env_2:	cmp	byte ptr es:[di-1], 0
		jz	search_env_3
		inc	di
		jmp	search_env_2

search_env_3:	cmp	byte ptr es:[di], 1
		jnc	search_env_1
search_env_ret:	push	ds
		push	es
		pop	ds
		pop	es
		mov	si, di
		ret



;-----------------------------------------------;
;						;
;	get_ishopt_fname_sub			;
;						;
;	INPUT :	ds:si (source pointer)		;
;	OUTPUT:	di (next dest pointer)		;
;	ERROR :	error_34			;
;	BREAK : flags, ax, cx, si, ds		;
;						;
;-----------------------------------------------;

get_ishopt_fname_sub:
		mov	cx, 128d
		mov	di, offset ishopt_fname
get_ishopt_fname_sub_1:
		lodsb
		stosb
		cmp	al, 0
		loopnz	get_ishopt_fname_sub_1
		mov	ax, es
		mov	ds, ax
		jnz	error_34
		ret



;-----------------------------------------------;
;						;
;	get_parameter				;
;						;
;	INPUT :	si(parameter list pointer)	;
;		dl(switch character)		;
;	OUTPUT:	di(input filename end pointer)	;
;	ERROR :	error_01, error_15		;
;	BREAK : flags, ax, bx, cx, si, di, bp	;
;						;
;-----------------------------------------------;

get_parameter:	mov	di, si
get_next_para:	call	skip_space
		cmp	al, dl			; switch character ?
		jnz	get_para_ret
		lodsb
		call	skip_space
		lodsb
		call	tolower
		cmp	al, 'a'
;		jz	para_mode
		jnz	not_para_a
		mov	al, 'r'
not_para_a:	cmp	al, 'r'
		jz	para_mode
		cmp	al, 'q'
		jz	para_q
		cmp	al, 's'
		jz	para_s
		cmp	al, 'o'
		jz	para_mode_o
		cmp	al, 'k'
		jz	para_keep
		cmp	al, 'h'
		jz	error_02
		xor	bl, bl
		cmp	al, 'm'
		jz	para_m
		inc	bl
		cmp	al, 'c'
		jz	para_os
		inc	bl
		cmp	al, '9'
		jz	para_os
		inc	bl
		cmp	al, 'u'
		jz	para_os
		inc	bl
		inc	bl
		cmp	al, '?'
		jz	para_os
		inc	bl
		cmp	al, '*'
		jz	para_os
		cmp	al, 'l'
		jz	para_l
		cmp	al, 'e'
		jz	para_e_n
		cmp	al, 'n'
		jz	para_n
		cmp	al, 'p'
		jz	para_prefix
		cmp	al, 'i'
		jz	para_i
		cmp	al, '@'
		jz	para_tag
		cmp	al, 't'
		jnz	error_01
		call	skip_space
		call	get_num
		cmp	bx, 1
		jnz	get_para_1
		mov	bx, default_title_length
get_para_1:	dec	bx
		xchg	bx, title_length
		or	bx, bx
		jz	get_next_para
		jmp	error_01

para_s:		call	skip_space
		cmp	al, dl
		jz	para_mode_default
		cmp	al, 0dh
		jz	para_mode_default
		lodsb
		call	tolower
		cmp	al, 's'
		jz	para_mode
		cmp	al, 'n'
		jz	para_mode
		cmp	al, '7'
		jz	para_mode
		cmp	al, '8'
		jz	para_mode
		cmp	al, 'o'
		jz	para_stdout
		jmp	error_01

para_q:		lodsb
		call	tolower
		cmp	al, 'u'
		jz	para_qu
		dec	si
		mov	al, 'q'
		jmp	para_mode

para_qu:	xchg	al, byte ptr qu_flag
		jmp	para_zero_check

para_mode_o:	call	skip_space
		cmp	al, dl
		jz	para_mode_o_1
		cmp	al, 0dh
		jz	para_mode_o_1
		lodsb
		call	tolower
		or	al, 80h
		cmp	al, 's' + 80h
		jz	para_mode
		cmp	al, '8' + 80h
		jz	para_mode
		jmp	error_01

para_mode_o_1:	mov	al, 'o' + 80h
		jmp	para_mode

para_mode_default:
		mov	al, default_bit_length
para_mode:	xchg	al, mode
		jmp	para_zero_check

para_stdout:	xchg	al, byte ptr stdout
		jmp	para_zero_check

para_v30:	xchg	byte ptr not_v30, al
		jmp	para_zero_check

para_keep:	lodsb
		call	tolower
		cmp	al, 'p'
		jnz	error_01
		xchg	byte ptr keep_flag, al
		jmp	para_zero_check

para_m:		lodsb
		call	tolower
		cmp	al, 'v'
		jz	para_mv
		dec	si
		cmp	al, 'a'
		jnz	para_os
		inc	si
		mov	bl, 4
para_os:	mov	al, 129
		mul	bl
		add	ax, offset msdos_path
		xchg	ax, bx
		mov	al, 0ffh
		xchg	[bx], al
		or	al, al
		jnz	error_01
		call	skip_space
		push	di
		inc	bx
		mov	di, bx
		mov	cx, 128d
copy_path_1:	lodsb
		dec	cl
		jcxz	error_01
		cmp	al, 0dh
		jz	copy_path_end
		cmp	al, dl
		jz	copy_path_end
		cmp	al, 9
		jz	copy_path_end
		cmp	al, 20h
		jz	copy_path_end
		cmp	al, 81h
		jc	copy_path_2
		cmp	al, 0a0h
		jc	copy_path_3
		cmp	al, 0e0h
		jc	copy_path_2
		cmp	al, 0fdh
		jc	copy_path_3
copy_path_2:	stosb
		jmp	copy_path_1

copy_path_3:	stosb
		lodsb
		dec	cl
		jcxz	error_01
		cmp	al, 40h
		jc	error_01
		stosb
		jmp	copy_path_1

copy_path_end:	dec	si
		inc	di
		inc	di
get_tail:	dec	di
		mov	al, [di]
		or	al, al
		jz	get_tail
		cmp	al, '\'
		jz	check_root
		cmp	al, '/'
		jz	check_root
		cmp	al, ':'
		jz	path_drivename
		cmp	word ptr [di-1], 0ff00h
		jz	para_os_end
		jmp	check_drivename_4
;
path_drivename:	mov	byte ptr [di+1], 0		; '$'
path_drivename_2:
		cmp	word ptr [di-3], 0ff00h
		jnz	error_15
		push	dx
		mov	dl, [di-1]
		push	si
		push	di
		cmp	byte ptr dos_version, 3
		jc	dos_2
		mov	ah, 60h
		mov	si, offset check_drive
		mov	[si], dl
		mov	di, offset work_fcb_3
		int	21h
		jc	error_15
		xor	ax, ax
		jmp	check_drivename_3

dos_2:		or	dl, 20h
		sub	dl, 60h
		jz	error_15
		mov	ah, 36h
		int	21h
check_drivename_3:
		pop	di
		pop	si
		pop	dx
		inc	ax
		jz	error_15
		jmp	para_os_end

check_root:	mov	ax, [di-2]
		cmp	ax, 0ff00h
		jz	para_os_end
		mov	byte ptr [di+1], 0		; '$'
		dec	di
		cmp	ah, ':'
		jz	path_drivename_2
check_drivename_4:
		inc	di
		mov	word ptr [di], 0
		push	di
		push	si
		push	dx
		mov	dx, bx
		mov	ax, 3d00h
		int	21h
		pop	dx
		pop	si
		pop	di
		jnc	error_15
		cmp	ax, 5
		jnz	error_15
		mov	byte ptr [di], '\'
para_os_end:	pop	di
		jmp	get_next_para

para_mv:	call	skip_space
		call	get_num
		or	bx, bx
		jz	error_25
		xchg	bx, mv_num
		or	bx, bx
		jz	get_next_para
		jmp	error_01

para_l:		lodsb
		call	tolower
		cmp	al, 'f'
		jnz	para_l_1
		xchg	al, lf_flag
		jmp	para_zero_check

para_l_1:	dec	si
		jmp	get_next_para

para_prefix:	xor	bl, bl
para_prefix_1:	call	skip_space
		cmp	al, dl
		jz	para_prefix_3
		cmp	al, 0dh
		jz	para_prefix_3
		lodsb
		cmp	al, '\'
		jnz	para_prefix_2
		@@get_hex2
para_prefix_2:	xor	ah, ah
		mov	bp, ax
		or	al, al
		jz	error_01
		xchg	byte ptr ds:[bp][offset prefix_table], al
		or	al, al
		jnz	error_01
		inc	bl
		jmp	para_prefix_1

para_prefix_3:	mov	al, bl
		or	al, al
		jz	error_01
		xchg	byte ptr prefix_count, al
		jmp	para_zero_check

para_n:		lodsb
		call	tolower
		cmp	al, 'v'
		jz	para_v30
		dec	si
para_e_n:	xchg	al, n_flag
para_zero_check:
		or	al, al
		jnz	error_01
		jmp	get_next_para

para_i:		lodsb
		call	tolower
		cmp	al, 't'
		jnz	error_01
		xchg	byte ptr it_flag, al
		jmp	para_zero_check

para_tag:	call	skip_space
		mov	cx, MAX_TAG
		push	di
		mov	di, offset tag
		cmp	byte ptr [di], 0
		jnz	error_01
copy_tag_1:	lodsb
		cmp	al, ' ' + 1
		jc	copy_tag_end
		cmp	al, dl
		jz	copy_tag_end
		cmp	al, ':'
		jz	copy_tag_end_0
		cmp	al, 81h
		jc	copy_tag_2
		cmp	al, 0a0h
		jc	copy_tag_3
		cmp	al, 0e0h
		jc	copy_tag_2
		cmp	al, 0fdh
		jc	copy_tag_3
copy_tag_2:	stosb
		loop	copy_tag_1
		jmp	error_01

copy_tag_3:	stosb
		dec	cx
		jz	error_01
		lodsb
		cmp	al, 40h
		jc	error_01
		stosb
		loop	copy_tag_1
		jmp	error_01

copy_tag_end_0:	inc	si
copy_tag_end:	mov	al, ':'
		stosb
		dec	si
		pop	di
		jmp	get_next_para

get_para_ret:	cmp	al, 0dh
		jnz	error_01
		ret



;-----------------------------------------------;
;						;
;	get_para_char				;
;						;
;	INPUT :	si (pointer)			;
;		bx (handle)			;
;	OUTPUT:	al (character)			;
;		si (next pointer)		;
;		flags (NC: ok)			;
;		      (CY: end of file)		;
;	ERROR :	error_38			;
;	BREAK : flags				;
;						;
;-----------------------------------------------;

get_para_char:	cmp	word ptr tag_work, si
		jnbe	get_para_char_1
		push	ax
		push	cx
		push	dx
		mov	ah, 3fh
		mov	cx, 73d*72d+1
		mov	dx, offset work_table2
		mov	si, dx
		int	21h
		jc	error_38
		add	dx, ax
		mov	word ptr tag_work, dx
		cmp	ax, 1
		pop	dx
		pop	cx
		pop	ax
		jc	get_para_char_3
get_para_char_1:
		lodsb
		cmp	al, 1ah
		jnz	get_para_char_2
		mov	al, 0dh
get_para_char_2:
		or	al, al		; clear CY
get_para_char_3:
		ret



;-----------------------------------------------;
;						;
;	end_msg					;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, bx, cx, dx		;
;						;
;-----------------------------------------------;

end_msg:	@@display	msg_rename_0
		mov	ax, word ptr store_count
		call	disp_dec
		mov	dx, offset msg_file_stored
		cmp	byte ptr mode, 'r'
		jz	end_msg_1
		cmp	byte ptr mode, 'q'
		jnz	end_msg_2
end_msg_1:	@@display	msg_file_restored
		mov	ax, word ptr restore_volume_count
		call	disp_dec
		mov	dx, offset msg_volume_restored
end_msg_2:	@@display	dx
		cmp	byte ptr abort_flag, 0
		jz	restore_break
		@@display	msg_aborted
;		jmp	restore_break



;-----------------------------------------------;
;						;
;	restore_break				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_39			;
;	BREAK : flags, ax, dx			;
;						;
;-----------------------------------------------;

restore_break:	mov	ax, 3301h
		mov	dl, byte ptr ctrl_c_check_flag
		int	21h
		inc	al
		jz	error_39
		ret



;-----------------------------------------------;
;						;
;	disp_dec				;
;						;
;	INPUT :	ax (number)			;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, bx, cx, dx		;
;						;
;-----------------------------------------------;

disp_dec:	mov	bx, ax
		mov	cx, 3
disp_dec_loop:	call	disp_dec_sub
		add	bx, bx
		mov	ax, bx
		add	bx, bx
		add	bx, bx
		add	bx, ax
		dec	cl
		jnz	disp_dec_loop
		or	ch, 1
		call	disp_dec_sub
		ret



;-----------------------------------------------;
;						;
;	disp_dec_sub				;
;						;
;	INPUT :	bx				;
;		ch				;
;	OUTPUT:	bx				;
;		ch				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dl			;
;						;
;-----------------------------------------------;

disp_dec_sub:	xor	al, al
disp_dec_sub_1:	cmp	bx, 1000d
		jc	disp_dec_sub_2
		inc	al
		sub	bx, 1000d
		jmp	disp_dec_sub_1

disp_dec_sub_2:	or	ch, al
		jz	disp_dec_sub_3
		add	al, '0'
		@@dispchr	al
disp_dec_sub_3:	ret



;-----------------------------------------------;
;						;
;	set_break_on				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dx			;
;						;
;-----------------------------------------------;

set_break_on:	mov	ax, 3300h
		int	21h
		mov	byte ptr ctrl_c_check_flag, dl
		mov	ax, 3301h
		mov	dl, 1
		int	21h
		ret
