;
;		ish file converter for MS-DOS  Ver 2.00 (90/3/27)
;
;
;		Copyright (c) 1986, 1987, 1989, 1990  by  M. ishizuka
;		All rights reserved.
;



;-----------------------------------------------;
;						;
;	@@mark_idblock_volume_table		;
;						;
;	INPUT :	NON				;
;	OUTPUT:	ZR (ok)				;
;		NZ (already restored)		;
;	ERROR :	NON				;
;	BREAK :	flags, ax, bx, cl, dx, si	;
;						;
;-----------------------------------------------;

@@mark_idblock_volume_table	macro
		xor	dx, dx
		mov	ax, word ptr current_division
		dec	ax
		mov	bx, 8d
		div	bx
		mov	si, ax
		add	si, offset idblock_volume_table
		mov	cl, dl
		mov	al, 1
		shl	al, cl
		mov	ah, byte ptr [si]
		xor	byte ptr [si], al
		and	al, ah
		endm



;-----------------------------------------------;
;						;
;	@@rename_intermediate_file		;
;						;
;	INPUT :	?
;	OUTPUT:	?
;	ERROR :	?
;	BREAK :	?
;						;
;-----------------------------------------------;

@@rename_intermediate_file	macro
		@@display	msg_rename_1
		push	es
		mov	ax, ds
		mov	es, ax
		mov	si, offset work_fcb_2
		mov	di, offset work_fcb_3
		mov	dx, si
rename_intermediate_file_1:
		lodsb
		stosb
		or	al, al
		jnz	rename_intermediate_file_1
		mov	si, word ptr idblock_header_copy[18]
		mov	al, byte ptr idblock_header_copy[20]
		mov	bx, di
		mov	byte ptr renamed_flag, 0
rename_intermediate_file_2:
		mov	word ptr [bx - 4], si
		mov	byte ptr [bx - 2], al
		mov	di, offset work_fcb_3
		mov	ah, 56h
		int	21h
		mov	di, offset msg_rename
		jnc	rename_intermediate_file_3
		mov	al, '0'
		call	rename_extension
		mov	si, word ptr work_fcb[9]
		mov	al, byte ptr work_fcb[11]
		jnz	rename_intermediate_file_2
		mov	di, offset msg_cannot_rename
rename_intermediate_file_3:
		pop	es
		@@display	di
		mov	si, offset work_fcb_3
		mov	ah, 0
rename_intermediate_file_5:
		call	lodsb_tolower_new
		cmp	al, ' '
		jz	rename_intermediate_file_5
		or	al, al
		jz	rename_intermediate_file_6
		@@dispchr	al
		jmp	rename_intermediate_file_5

rename_intermediate_file_6:
		@@dispchr	"'"
		or	al, al		; clear CY flag
rename_intermediate_file_ret:
		endm



;-----------------------------------------------;
;						;
;	@@get_header_frame			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	flags				;
;		( ZR: OK )			;
;	ERROR :	go_next, ?			;
;	BREAK :	cx, si, di, ?			;
;						;
;-----------------------------------------------;

@@get_header_frame	macro
skip_the_same_header_frame:
		call	_get_frame
		jc	go_next
		mov	si, offset work_work
		mov	di, offset work_work2
		mov	cx, 63d
		repz	cmpsb
		jz	skip_the_same_header_frame
		cmp	work_work, 0		; check sequence number = 0
		endm



;-----------------------------------------------;
;						;
;	@@header_save				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	cx, si, di			;
;						;
;-----------------------------------------------;

@@header_save	macro
		mov	cx, 63d
		mov	si, offset work_work
		mov	di, offset work_work2
		rep	movsb
		endm



;-----------------------------------------------;
;						;
;	@@disp_os				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	ax, dl				;
;						;
;-----------------------------------------------;

@@disp_os	macro
		mov	al, '('
		stosb
		mov	al, work_work + 25d
		mov	old_style, al
		mov	al, work_work + 24d
		mov	dl, 'm'
		cmp	al, 10h
		jc	disp_os
		mov	dl, 'c'
		cmp	al, 20h
		jc	disp_os
		mov	dl, '9'
		cmp	al, 30h
		jc	disp_os
		mov	dl, 'u'
		cmp	al, 40h
		jc	disp_os
		mov	dl, 'm'
		cmp	al, 50h
		jnc	disp_os_not_mac
		mov	al, dl
		stosb
		mov	dl, 'a'
		jmp	disp_os

disp_os_not_mac:
		mov	dl, '?'
		cmp	al, 0ffh
		jc	disp_os
		mov	dl, '*'
disp_os:	mov	al, dl
		stosb
		mov	ax, ' )'
		stosw
		endm



;-----------------------------------------------;
;						;
;	@@disp_division				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx, dx, di		;
;						;
;-----------------------------------------------;

@@disp_division	macro
		cmp	word ptr current_division, 0
		jz	disp_division_skip
		mov	di, word ptr save_fname2_ptr
		dec	di
		mov	al, '<'
		stosb
		mov	ax, word ptr current_division
		xor	dx, dx
		call	hex_to_dec
		mov	al, '/'
		stosb
		mov	ax, word ptr max_division
		xor	dx, dx
		call	hex_to_dec
		mov	ax,' >'
		stosw
		mov	word ptr save_fname2_ptr, di
		mov	ax, ' :'
		stosw
		mov	cx, di
		sub	cx, offset display_buffer
		@@dispstr2	display_buffer, cx
disp_division_skip:
		endm



;-----------------------------------------------;
;						;
;	@@disp_restore_fname			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx, dx, si, di	;
;						;
;-----------------------------------------------;

@@disp_restore_fname	macro
		mov	si, offset work_work[2]
		mov	di, offset idblock_header_copy
		mov	cx, 42d
		rep	movsb
		mov	si, offset work_work[26d]
		mov	di, offset date_time_flag
		mov	cx, 20d / 2
		rep	movsw
		mov	si, offset work_work + 12d
		call	check_filename
		mov	di, offset work_fcb
		mov	cx, 4
		rep	movsw
		mov	al, '.'
		stosb
		mov	cx, 3
		rep	movsb
		mov	si, offset work_fcb
		mov	di, offset display_buffer
		mov	al, 0dh
		stosb
		mov	byte ptr renamed_flag, 0
		mov	al, '['
		stosb
		mov	ax, line_number_low
		mov	dx, line_number_high
		call	disp_number2
		mov	ax, ' ]'
		stosw
		call	copy_fname_fcb_to_buffer
		@@disp_os
		mov	word ptr save_fname2_ptr, di
		mov	ax, ' :'
		stosw
		mov	cx, di
		sub	cx, offset display_buffer
		@@dispstr2	display_buffer, cx
		endm



;-----------------------------------------------;
;						;
;	@@disp_input_fname2			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK : flags, ax, dx, si		;
;						;
;-----------------------------------------------;

@@disp_input_fname2	macro
		cmp	byte ptr stdin, 0
		jnz	disp_input_fname2_2
		mov	si, offset save_input_filename
		mov	ah, 0
disp_input_fname2_1:
		call	lodsb_tolower_new
		or	al, al
		jz	disp_input_fname2_ret
		push	ax
		@@dispchr_stdout	al
		pop	ax
		jmp	disp_input_fname2_1

disp_input_fname2_2:
		@@display_stdout	msg_stdin2
disp_input_fname2_ret:
		endm



;-----------------------------------------------;
;						;
;	@@disp_restore_fname2			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	al, cx, dx, si, di		;
;						;
;-----------------------------------------------;

@@disp_restore_fname2	macro
		@@display_stdout	msg_resfname2_1
		mov	dx, offset work_work3
		mov	si, offset work_fcb
		mov	di, dx
		call	copy_fname_fcb_to_buffer
		mov	al, '$'
		stosb
		@@display_stdout	dx
		@@display_stdout	msg_resfname2_2
		mov	al, work_work + 24d
		mov	dl, 'm'
		cmp	al, 10h
		jc	disp_os_2
		mov	dl, 'c'
		cmp	al, 20h
		jc	disp_os_2
		mov	dl, '9'
		cmp	al, 30h
		jc	disp_os_2
		mov	dl, 'u'
		cmp	al, 40h
		jc	disp_os_2
		mov	dl, 'm'
		cmp	al, 50h
		jnc	disp_os_not_mac_2
		mov	al, dl
		@@dispchr_stdout	dl
		mov	dl, 'a'
		jmp	disp_os_2

disp_os_not_mac_2:
		mov	dl, '?'
		cmp	al, 0ffh
		jc	disp_os_2
		mov	dl, '*'
disp_os_2:	@@dispchr_stdout	dl
		mov	dx, offset msg_resfname2_3
		cmp	word ptr current_division, 0
		jz	disp_restore_fname2_1
		@@display_stdout	msg_resfname2_5
		mov	di, offset work_work3
		mov	al, ' '
		stosb
		mov	ax, word ptr current_division
		xor	dx, dx
		call	hex_to_dec
		mov	al, '/'
		stosb
		mov	ax, word ptr max_division
		xor	dx, dx
		call	hex_to_dec
		mov	al, '$'
		stosb
		@@display_stdout	work_work3
		mov	dx, offset msg_resfname2_6
disp_restore_fname2_1:
		@@display_stdout	dx
		@@disp_input_fname2
		@@display_stdout	msg_resfname2_4
		endm



;-----------------------------------------------;
;						;
;	@@check_header				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_12			;
;	BREAK :	ax, cx, si, di			;
;						;
;-----------------------------------------------;

@@check_header	macro
		mov	si, offset work_work
		lodsw
		xchg	ah, al
		cmp	ax, MAX_DIVISION_NUMBER
		ja	error_12
		mov	word ptr current_division, ax
		mov	word ptr max_division, ax
		mov	ax, [si+8]
		push	si
		mov	si, offset parameter_jis8
		mov	cl, '8'
		cmp	ax, 808h
		jz	check_header_1
		mov	si, offset parameter_sjis
		mov	cl, 's'
		cmp	ax, 0f10h
		jz	check_header_1
		mov	si, offset parameter_jis7
		mov	cl, '7'
		cmp	ax, 0d10h
		jz	check_header_1
		mov	si, offset parameter_nonkana
		mov	cl, 'n'
		cmp	ax, 0e10h
		jnz	error_12
check_header_1:	mov	type_flag, cl
		mov	di, offset para_81_80
		mov	cx, 21d
		rep	movsw
		mov	ax, word ptr work_work[34]
		cmp	word ptr current_division, 0
		jz	check_header_2
		mov	ax, word ptr work_work[44]
check_header_2:	mov	word ptr crc_check, ax
		pop	si
		lodsw
		mov	length_low_org, ax
		sub	ax, 1
		mov	length_low, ax
		lodsw
		mov	length_high_org, ax
		sbb	ax, 0
		mov	length_high, ax
		lodsw
		cmp	ax, para_69_63
		jnz	error_12
		lodsw
		cmp	ax, para_68_62
		jnz	error_12
		cmp	word ptr current_division, 0
		jz	check_header_6
		mov	si, offset idblock_volume_table
		mov	cx, (offset idblock_volume_table_end - \
			     offset idblock_volume_table) / 2
		xor	ax, ax
		rep	stosw
;		xor	cx, cx
		mov	ax, word ptr length_low_org
		mov	dx, word ptr length_high_org
		add	ax, 1
		adc	dx, 0
check_header_3:	inc	cx
		sub	ax, word ptr current_division_length_low
		sbb	dx, word ptr current_division_length_high
		jnc	check_header_3
		add	ax, word ptr current_division_length_low
		adc	dx, current_division_length_high
		mov	word ptr max_division, cx
		cmp	cx, current_division
		jnz	check_header_4
		sub	ax, 1
		sbb	dx, 0
		mov	word ptr current_division_length_low, ax
		mov	word ptr current_division_length_high, dx
check_header_4:
		dec	cx
		jz	error_12
		cmp	cx, MAX_DIVISION_NUMBER
		jnc	error_12
		mov	ax, word ptr current_division_length_low
		mov	dx, word ptr current_division_length_high
		sub	ax, 1
		sbb	dx, 0
		mov	word ptr length_low, ax
		mov	word ptr length_high, dx
		mov	ax, word ptr idblock_header_copy[40 - 2]
		mov	dx, word ptr idblock_header_copy[42 - 2]
		mov	word ptr division_offset_low, 0
		mov	word ptr division_offset_high, 0
		mov	cx, word ptr current_division
		dec	cx
		jz	check_header_6
check_header_5:	add	word ptr division_offset_low, ax
		adc	word ptr division_offset_high, dx
		loop	check_header_5
check_header_6:
		endm



;-----------------------------------------------;
;						;
;	@@rename_extension_to_000		;
;						;
;	INPUT :	al ('0': rename to 000..999)	;
;		   ('#': rename to #00..#99)	;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	NON				;
;						;
;-----------------------------------------------;

@@rename_extension_to_000	macro
		mov	renamed_flag, al
		mov	byte ptr work_fcb[9], al
		mov	word ptr work_fcb[10], '00'
		endm



;-----------------------------------------------;
;						;
;	@@increment_extension			;
;						;
;	INPUT :	al ('0': rename to 000..999)	;
;		   ('#': rename to #00..#99)	;
;	OUTPUT:	NON				;
;	ERROR :	ZR				;
;	BREAK :	flags, al, cx, si, di		;
;						;
;-----------------------------------------------;

@@increment_extension	macro
		mov	si, offset work_fcb + 11
		mov	di, si
		std
		mov	cx, 3
		cmp	al, '0'
		jz	increment_extension_1
		dec	cl
increment_extension_1:
		lodsb
		inc	al
		cmp	al, '9'+1
		jnz	increment_extension_2
		mov	al, '0'
increment_extension_2:
		stosb
		loopz	increment_extension_1
		cld
		endm



;-----------------------------------------------;
;						;
;	@@check_skip_and_create_restore_file	;
;						;
;	INPUT :	NON				;
;	OUTPUT:	di				;
;	ERROR :	error_08, error_11, error_17,	;
;		skip_this_file,			;
;		disp_restore_fname		;
;	BREAK :	flags, ax, bx, cx, dx, si	;
;						;
;-----------------------------------------------;

@@check_skip_and_create_restore_file	macro
		mov	al, work_work + 24d
		mov	bx, offset msdos_path
		cmp	al, 10h
		jc	check_skip
		mov	bx, offset cpm_path
		cmp	al, 20h
		jc	check_skip
		mov	bx, offset os9_path
		cmp	al, 30h
		jc	check_skip
		mov	bx, offset unix_path
		cmp	al, 40h
		jc	check_skip
		mov	bx, offset mac_path
		cmp	al, 50h
		jc	check_skip
		mov	bx, offset other_os_path
		cmp	al, 0ffh
		jc	check_skip
		mov	bx, offset all_os_path
check_skip:	cmp	byte ptr [bx], 0
;		jz	skip_other_os_file
		jnz	not_skip
skip_other_os_file:
		@@display	msg_other_os
		jmp	skip_this_file

not_skip:	cmp	mode, 'q'
		jnz	check_os_3
		mov	di, offset display_length[2]
		cmp	word ptr current_division, 0
		jz	check_skip_and_create_0
		mov	ax, word ptr current_division_length_low
		mov	dx, word ptr current_division_length_high
		call	hex_to_dec
		mov	al, '/'
		stosb
check_skip_and_create_0:
		mov	ax, word ptr work_work[2]
		mov	dx, word ptr work_work[4]
		call	hex_to_dec
		mov	byte ptr [di], '$'
		@@display	display_length
		@@display	msg_bytes
		mov	dx, offset msg_ext
		cmp	byte ptr shell_escape, 0
		jz	read_answer_0
		mov	dx, offset msg_ext_2
read_answer_0:	@@display	dx
read_answer:	@@int21_8
		call	tolower
		cmp	byte ptr shell_escape, 0
		jz	read_answer_1
		cmp	al, '!'
		jnz	read_answer_1
		call	restore_break
		mov	dx, offset shell
		mov	bx, offset para_block
		mov	ax, ds
		mov	word ptr para_block[4h], ax
		mov	word ptr para_block[8h], ax
		mov	word ptr para_block[0ch], ax
		mov	ax, 4b00h
		int	21h
		jnc	read_answer_0_1
		@@display	msg_cannot_exec_shell
read_answer_0_1:
		mov	byte ptr _dta_id, 0
		call	set_break_on
		jmp	disp_restore_fname

read_answer_1:	cmp	al, 'n'
;		jz	answer_yn
		jz	skip_this_file
		cmp	al, 'q'
		jz	error_17
		cmp	al, 'y'
		jz	answer_yn
		cmp	al, 'r'
		jz	change_mode
		cmp	al, 'a'
		jnz	read_answer
		mov	al, 'r'		; make 'a' to 'r'
change_mode:	mov	mode, al
answer_yn:
;		push	ax
;		@@display	msg_ext_era
;		pop	ax
;		cmp	al, 'n'
;		jz	skip_this_file
		mov	cx, word ptr save_fname2_ptr
		sub	cx, offset display_buffer - 2
		@@dispstr2	display_buffer, cx
check_os_3:	mov	al, work_work + 24d
		mov	byte ptr os, al
		mov	ax, word ptr work_work[2]
		mov	word ptr fsize_low, ax
		mov	ax, word ptr work_work[4]
		mov	word ptr fsize_high, ax
		cmp	byte ptr stdout, 0
		jnz	check_skip_and_create_1
		call	cmpfile_or_outputfile_open
		jmp	check_skip_and_create_skip

check_skip_and_create_1:
		cmp	current_division, 0
		jz	check_skip_and_create_2
		mov	ax, word ptr current_division_length_low
		mov	word ptr fsize_low, ax
		mov	word ptr length_low_org, ax
		mov	ax, word ptr current_division_length_high
		mov	word ptr fsize_high, ax
		mov	word ptr length_high_org, ax
check_skip_and_create_2:
		@@disp_restore_fname2
		mov	di, word ptr save_fname2_ptr
check_skip_and_create_skip:
		endm



;-----------------------------------------------;
;						;
;	@@disp_periods				;
;						;
;	INPUT :	di				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx, dx, si, di	;
;						;
;-----------------------------------------------;

@@disp_periods	macro
		mov	si, offset msg_br5
		movsb
		movsw
		mov	word ptr line_number_ptr, di
		movsw
		mov	ax, word ptr para_65_59
		mov	word ptr para_A, ax
		mov	ax, word ptr para_66_60
		mov	word ptr para_B, ax
		mov	ax, word ptr fsize_low
		mov	dx, word ptr fsize_high
		add	ax, 2
		adc	dx, 0
		call	trunc
		push	ax
		push	dx
		call	trunc
		pop	si
		pop	bp
		push	ax
		push	dx
		add	ax, ax
		adc	dx, dx
		add	ax, bp
		adc	dx, si
		call	hex_to_dec
		mov	ax, ' )'
		stosw
		pop	dx
		pop	cx
		or	dx, dx
		jz	disp_periods_1
		mov	cx, 80d
disp_periods_1:	mov	ax, 80d + offset display_buffer
		sub	ax, di
		cmp	cx, ax
		jc	disp_periods_2
		mov	cx, ax
disp_periods_2:	mov	word ptr block_number_ptr, di
		mov	word ptr block_number_begin, di
		mov	al, '.'
		rep	stosb
		mov	cx, 80d + offset display_buffer
		sub	cx, di
		mov	al, ' '
		rep	stosb
		call	draw_display_buffer
		endm



;-----------------------------------------------;
;						;
;	@@disp_periods2				;
;						;
;	INPUT :	di				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx, dx, si, di	;
;						;
;-----------------------------------------------;

@@disp_periods2	macro
		mov	si, di
		mov	cx, 3
disp_periods2_1:
		lodsb
		cmp	al, '0'
		jc	disp_periods2_2
		cmp	al, '9' + 1
		jc	disp_periods2_3
disp_periods2_2:
		loop	disp_periods2_1
		jmp	disp_periods2_ret

disp_periods2_3:
		std
disp_periods2_4:
		push	cx
		mov	si, offset display_buffer[79]
		mov	al, [si]
		cmp	al, ' '
		jz	disp_periods2_5
		cmp	al, '.'
		jnz	disp_periods2_6
disp_periods2_5:
		mov	cx, si
		sub	cx, di
		push	di
		mov	di, si
		dec	si
		rep	movsb
		pop	di
		pop	cx
		inc	word ptr block_number_begin
		inc	word ptr block_number_ptr
		inc	word ptr line_number_ptr
		loop	disp_periods2_4
		jmp	disp_periods2_8

disp_periods2_6:
		cld
		mov	si, word ptr line_number_ptr
disp_periods2_7:
		lodsb
		cmp	al, ' '
		jnz	disp_periods2_7
		mov	cx, si
		dec	si
		sub	cx, di
		pop	bp
		push	di
		mov	di, si
		add	di, bp
		std
		rep	movsb
		pop	di
		add	word ptr block_number_begin, bp
		add	word ptr line_number_ptr, bp
disp_periods2_8:
		cld
		mov	si, offset msg_br5
		movsb
		movsw
disp_periods2_ret:
		call	draw_display_buffer
		endm



;-----------------------------------------------;
;						;
;	@@increment_line_number			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, al, cx, si, di		;
;						;
;-----------------------------------------------;

@@increment_line_number	macro
		mov	si, word ptr line_number_ptr
increment_line_number_1:
		mov	al, [si]
		cmp	al, '0'
		jb	increment_line_number_2
		cmp	al, '9' + 1
		jnb	increment_line_number_2
		inc	al
		cmp	al, '9' + 1
		jb	increment_line_number_7
		mov	al, '0'
		mov	[si], al
		dec	si
		jmp	increment_line_number_1

increment_line_number_2:
		mov	di, offset display_buffer[79]
		mov	al, [di]
		cmp	al, ' '
		jz	increment_line_number_4
		cmp	al, '.'
		jz	increment_line_number_4
		xor	cx, cx
		mov	al, ' '
		mov	di, si
increment_line_number_3:
		inc	cx
		scasb
		jnz	increment_line_number_3
		jmp	increment_line_number_5

increment_line_number_4:
		mov	cx, di
		sub	cx, si
increment_line_number_5:
		mov	si, di
		dec	si
		dec	cx
		std
		rep	movsb
		cld
		mov	byte ptr [di], '1'
		inc	word ptr line_number_ptr
		inc	word ptr block_number_begin
		inc	word ptr block_number_ptr
		call	draw_display_buffer
		jmp	increment_line_number_ret

increment_line_number_7:
		mov	[si], al
		cmp	qu_flag, 0
		jnz	increment_line_number_ret
		mov	cx, word ptr line_number_ptr
		sub	cx, si
		inc	cx
		push	cx
disp_line_number_now:
		@@dispchr	08h
		loop	disp_line_number_now
		pop	cx
		@@dispstr2	si, cx
increment_line_number_ret:
		endm



;-----------------------------------------------;
;						;
;	@@disp_renamed_fname			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_08, error_11, error_17,	;
;		skip_this_file			;
;	BREAK :	flags, ax, bx, cx, dx, si, di	;
;						;
;-----------------------------------------------;

@@disp_renamed_fname	macro
		mov	di, word ptr save_fname2_ptr
		cmp	cmpfile_handler, 0
		mov	ax, ' ?'
		jnz	disp_renamed_fname_skip
		cmp	renamed_flag, 0		; if extension is not renamed
		jz	disp_renamed_fname_ret	; then skip
		mov	ax, ' >'
disp_renamed_fname_skip:
		stosw
		mov	si, offset work_fcb
		call	copy_fname_fcb_to_buffer
disp_renamed_fname_ret:
		endm



;-----------------------------------------------;
;						;
;	@@make_table2				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	?
;	BREAK :	flags, ax, bx, cx, dx, si
;						;
;-----------------------------------------------;

@@make_table2	macro
make_table2:	mov	ax, line_number_low
		mov	line_save_low, ax
		mov	ax, line_number_high
		mov	line_save_high, ax
		call	_get_frame
		jc	make_table2_3
		mov	si, offset work_work
		lodsb
make_table2_1:	cmp	al, seq_old
		jnz	not_duplicate
		or	al, al
		jnz	make_table2
		push	si
		push	di
		mov	si, offset work_work
		mov	di, offset work_work2
		mov	cx, 63d
		repz	cmpsb
		pop	di
		pop	si
		jz	make_table2
not_duplicate:	cmp	al, byte ptr para_69_63
		jnz	make_table2_2
		mov	cx, para_66_60
		mov	ah, 0 - (offset sum_1_to_61)
		cmp	byte ptr type_flag, '7'
		jz	calc_slant_sum
		mov	ah, 0 - (offset sum_1_to_71)
		cmp	byte ptr type_flag, 's'
		jz	calc_slant_sum
		mov	ah, 0 - (offset sum_1_to_67)
calc_slant_sum:	lodsb
		sub	ah, al
		loop	calc_slant_sum
		mov	[si], ah
		mov	al, byte ptr para_68_62
make_table2_2:	call	seq_new
		cmp	al, seq_old
		jz	seq_ok
		mov	ah, error_count
		mov	bl, ah
		add	bl, bl
		add	bl, bl
		add	bl, ah
		xor	bh, bh
		add	bx, offset error_seq
		inc	ah
		mov	error_count, ah
		cmp	ah, 3
		mov	ah, seq_old
		mov	byte ptr [bx], ah
		pushf
		push	ax
		mov	ax, line_save_low
		inc	ax
		cmp	ax, 10000d
		jnz	line_number_save_1
		inc	line_save_high
		xor	ax, ax
line_number_save_1:
		mov	line_save_low, ax
		mov	word ptr [bx+1], ax
		mov	ax, line_save_high
		mov	word ptr [bx+3], ax
		pop	ax
		popf
		jb	make_table2_2
		jmp	error_14

make_table2_3:	mov	al, 0ffh
		jmp	make_table2_2

seq_ok:		mov	cx, para_69_63
		mov	si, offset work_work
		mov	di, offset work_table
		cmp	al, byte ptr para_68_62
		jnz	not_slant_line
		inc	si
not_slant_line:	dec	ax
		mul	cl
		add	di, ax
		rep	movsb
		cmp	word ptr end_length, 0
		jz	make_table2
		mov	al, byte ptr seq_old
		cmp	al, byte ptr para_68_62
		jz	make_table2_2
		jmp	make_table2

;make_table2_4:	
;		mov	al, 0ffh
;		call	seq_new
;		jmp	make_table2
		endm



;-----------------------------------------------;
;						;
;	@@two_line_errors			;
;						;
;	INPUT :	al (error line's sequence number)
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, bx, cx, dx, si	;
;						;
;-----------------------------------------------;

@@two_line_errors	macro
		mov	si, offset work_table
		mov	dl, al
		dec	al
		mov	dh, byte ptr para_69_63
		mul	dh
		add	ax, si
		mov	word ptr line2, ax
		mov	al, error_seq
		push	ax
		sub	dl, al
		dec	al
		mul	dh
		add	si, ax
		mov	word ptr line1, si
		pop	ax
		mov	[si], al
		xor	dh, dh
		mov	cx, para_67_61
		xor	bx, bx
two_line_errors_1:
		push	cx
		push	si
		xor	al, al
		mov	cx, para_68_62
two_line_errors_2:
		add	al, [si+bx]
		add	si, para_69_63
		cmp	si, para_69$68_63$62_work_table
		jb	two_line_errors_3
		sub	si, para_69$68_63$62
		dec	bx
two_line_errors_3:
		inc	bx
		cmp	bx, para_67_61
		jb	two_line_errors_4
		xor	bx, bx
two_line_errors_4:
		loop	two_line_errors_2
		add	bx, dx
		cmp	bx, para_67_61
		jb	two_line_errors_5
		sub	bx, para_67_61
two_line_errors_5:
		sub	[bx][8000h], al
line2		equ	$-2
		xor	al, al
		mov	cx, para_67_61
		mov	si, offset work_table
two_line_errors_6:	add	al, [si+bx]
		add	si, para_69_63
		loop	two_line_errors_6
		sub	[bx][8000h], al
line1	equ	$-2
		pop	si
		pop	cx
		loop	two_line_errors_1
		endm



;-----------------------------------------------;
;						;
;	@@one_line_error			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, bx, cx, si		;
;						;
;-----------------------------------------------;

@@one_line_error	macro
		mov	si, offset work_table +1
		mov	al, error_seq
		dec	al
		mov	ah, byte ptr para_69_63
		mul	ah
		mov	word ptr line3, ax
		mov	cx, para_66_60
one_line_error_1:
		push	cx
		xor	bx, bx
		mov	cx, para_67_61
		xor	al, al
one_line_error_2:
		add	al, [si+bx]
		add	bx, para_69_63
		loop	one_line_error_2
		sub	[si][8000h], al
line3		equ	$-2
		inc	si
		pop	cx
		loop	one_line_error_1
		endm



;-----------------------------------------------;
;						;
;	@@correct_errors			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, bx, cx, dx, si	;
;						;
;-----------------------------------------------;

@@correct_errors	macro
		mov	al, error_count
		or	al, al
		jz	correct_complete
		dec	al
		jz	one_line_error
		mov	al, error_seq[5]
		cmp	al, byte ptr para_68_62
		jz	one_line_error
		@@two_line_errors
		jmp	correct_complete

one_line_error:	@@one_line_error

correct_complete:
		endm



;-----------------------------------------------;
;						;
;	@@com_cmpfile_cx			;
;						;
;	INPUT :	cx (compare byte count)		;
;	OUTPUT:	flags				;
;		( ZR : compare OK )		;
;	ERROR :	NON				;
;	BREAK :	si, di, flags			;
;						;
;-----------------------------------------------;

@@cmp_cmpfile_cx	macro
		push	cx
		mov	si, offset write_buffer
		mov	di, offset cmp_buffer
		repz	cmpsb
		pop	cx
		endm



;-----------------------------------------------;
;						;
;	@@cmp_old_and_new_sub			;
;						;
;	INPUT :	cx (compare byte count)		;
;	OUTPUT:	flags				;
;		( ZR : compare OK )		;
;	ERROR :	NON				;
;	BREAK :	cx, si, di, flags		;
;						;
;-----------------------------------------------;

@@cmp_old_and_new_sub	macro
		mov	si, offset work_table
		mov	di, offset cmp_buffer
		repz	cmpsb
		endm



;-----------------------------------------------;
;						;
;	@@cmp_oldcmpfile_and_newcmpfile		;
;						;
;	INPUT :	?				;
;	OUTPUT:	?				;
;	ERROR :	?				;
;	BREAK :	?				;
;						;
;-----------------------------------------------;

@@cmp_oldcmpfile_and_newcmpfile	macro
		push	cx
		mov	ax, word ptr cmp_done_low
		mov	dx, word ptr cmp_done_high
cmp_old_and_new_1:
		mov	cx, 1000h
		sub	ax, cx
		sbb	dx, 0
		jnc	cmp_old_and_new_2
		add	cx, ax
		jz	cmp_old_and_new_ret
		xor	ax, ax
		xor	dx, dx
cmp_old_and_new_2:
		push	ax
		push	dx
		push	cx
		@@read_cmpfile_cx
		pop	cx
		push	cx
		@@read_oldcmpfile_cx
		pop	cx
		@@cmp_old_and_new_sub
		pop	dx
		pop	ax
		jz	cmp_old_and_new_1
cmp_old_and_new_ret:
		pop	cx
		endm



;-----------------------------------------------;
;						;
;	@@copy_cmpfile_to_outputfile		;
;						;
;	INPUT :	?				;
;	OUTPUT:	?				;
;	ERROR :	?				;
;	BREAK :	?				;
;						;
;-----------------------------------------------;

@@copy_cmpfile_to_outputfile	macro
		mov	ax, word ptr cmp_done_low
		mov	dx, word ptr cmp_done_high
copy_cmpfile_to_outputfile_1:
		mov	cx, 1000h
		sub	ax, cx
		sbb	dx, 0
		jnc	copy_cmpfile_to_outputfile_2
		add	cx, ax
		jz	copy_cmpfile_to_outputfile_ret
		xor	ax, ax
		xor	dx, dx
copy_cmpfile_to_outputfile_2:
		push	ax
		push	dx
		push	cx
		@@read_oldcmpfile_cx
		pop	cx
		mov	dx, offset work_table
		call	write_2
		pop	dx
		pop	ax
		jz	copy_cmpfile_to_outputfile_1
copy_cmpfile_to_outputfile_ret:
		endm



;-----------------------------------------------;
;						;
;	@@close_cmpfile				;
;						;
;	INPUT :	bx (handler)			;
;	OUTPUT:	NON				;
;	ERROR :	error_24			;
;	BREAK :	ax, flags			;
;						;
;-----------------------------------------------;

@@close_cmpfile	macro
		mov	ah, 3eh
		int	21h
		jc	error_24
		endm



;-----------------------------------------------;
;						;
;	@@close_newcmpfile			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_24			;
;	BREAK :	ax, bx, flags			;
;						;
;-----------------------------------------------;

@@close_newcmpfile	macro
		mov	bx, word ptr cmpfile_handler
		@@close_cmpfile
		endm



;-----------------------------------------------;
;						;
;	@@close_oldcmpfile			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_24			;
;	BREAK :	ax, bx, flags			;
;						;
;-----------------------------------------------;

@@close_oldcmpfile	macro
		mov	bx, word ptr cmpfile_handler2
		@@close_cmpfile
		endm



;-----------------------------------------------;
;						;
;	@@read_cmpfile_cx			;
;						;
;	INPUT :	cx (compare byte count)		;
;	OUTPUT:	NON				;
;	ERROR :	error_24			;
;	BREAK :	ax, bx, dx, flags		;
;						;
;-----------------------------------------------;

@@read_cmpfile_cx	macro
		mov	ah, 3fh
		mov	bx, word ptr cmpfile_handler
		mov	dx, offset cmp_buffer
		int	21h
		jc	error_24
		cmp	ax, cx
		jnz	error_24
		endm



;-----------------------------------------------;
;						;
;	@@read_oldcmpfile_cx			;
;						;
;	INPUT :	cx (compare byte count)		;
;	OUTPUT:	NON				;
;	ERROR :	error_24			;
;	BREAK :	ax, bx, dx, flags		;
;						;
;-----------------------------------------------;

@@read_oldcmpfile_cx	macro
		mov	ah, 3fh
		mov	bx, word ptr cmpfile_handler2
		mov	dx, offset work_table
		int	21h
		jc	error_24
		cmp	ax, cx
		jnz	error_24
		endm



;-----------------------------------------------;
;						;
;	@@rewind_oldcmpfile			;
;						;
;	INPUT :	cx (compare byte count)		;
;	OUTPUT:	NON				;
;	ERROR :	error_24			;
;	BREAK :	ax, bx, dx, flags		;
;						;
;-----------------------------------------------;

@@rewind_oldcmpfile	macro
		mov	ax, 4200h
		mov	bx, word ptr cmpfile_handler2
		xor	cx, cx
		xor	dx, dx
		int	21h
		jc	error_24
		endm



;-----------------------------------------------;
;						;
;	@@compare_file_cx			;
;						;
;	INPUT :	cx (compare byte count)		;
;	OUTPUT:	flags				;
;		( ZR : compare OK )		;
;	ERROR :	error_24, ?			;
;	BREAK :	?				;
;						;
;-----------------------------------------------;

@@compare_file_cx	macro
compare_file_cx_1:
		@@read_cmpfile_cx
		@@cmp_cmpfile_cx
		jz	compare_file_cx_ret
		mov	ax, word ptr cmpfile_handler
		mov	word ptr cmpfile_handler2, ax
compare_file_cx_2:
		push	cx
		@@rewind_oldcmpfile
		call	cmpfile_or_outputfile_open
		@@disp_periods2
		pop	cx
		cmp	word ptr cmpfile_handler, 0
		jz	compare_file_not_found
		@@cmp_oldcmpfile_and_newcmpfile
		jz	compare_file_cx_3
		@@close_newcmpfile
		jmp	compare_file_cx_2

compare_file_cx_3:
		@@close_oldcmpfile
		jmp	compare_file_cx_1

compare_file_not_found:
		push	cx
		@@copy_cmpfile_to_outputfile
		pop	cx
compare_file_cx_ret:
		endm



;-----------------------------------------------;
;						;
;	@@write_buffer_from_table		;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_13, ?
;	BREAK :	flags, ax, bx, cx, dx, si, di, bp, ?
;						;
;-----------------------------------------------;

@@write_buffer_from_table	macro
		mov	cx, para_66_60
		mov	si, offset work_table + 1
		mov	di, offset write_buffer
write_buffer_from_table_1:
		push	cx
		mov	cx, para_33_30
		rep	movsw
		add	si, 3
		pop	cx
		loop	write_buffer_from_table_1
		mov	bp, word ptr crc
		mov	ax, word ptr crc_32
		mov	dx, word ptr crc_32[2]
		mov	si, offset write_buffer
		mov	cx, word ptr end_length2
		or	cx, cx
		jnz	write_buffer_from_table_2
		cmp	word ptr end_length, 0
		jnz	calc_crc_2
		mov	cx, para_66$66_60$60
write_buffer_from_table_2:
		cmp	byte ptr crc_flag, 0	; calculating crc or not
		jz	calc_crc_1		; if already calculating
						;  then skip
		mov	byte ptr crc_flag, 0
		mov	ax, 0ffffh
		mov	dx, ax
		mov	bp, ax
calc_crc_1:	@@crc16_32_sub
		mov	word ptr crc, bp
		mov	word ptr crc_32, ax
		mov	word ptr crc_32[2], dx
		cmp	word ptr end_length, 0
		jz	calc_crc_4
calc_crc_2:	cmp	word ptr end_length, 1
		jnz	calc_crc_2_1
		dec	si
calc_crc_2_1:	not	bp
		cmp	bp, word ptr [si]
		jnz	error_13
		mov	cx, 1000h
		cmp	word ptr max_division, 0
		jnz	calc_crc_3
		mov	ch, 4
		test	byte ptr date_time_flag, 8
		jz	calc_crc_3
		cmp	ax, word ptr crc_32
		jnz	error_28_0
		cmp	dx, word ptr crc_32[2]
		jnz	error_28_0
		mov	cl, 2
calc_crc_3:	test	byte ptr date_time_flag, ch
		jz	calc_crc_4
		cmp	bp, word ptr crc_check
		jnz	error_27_0
		mov	cl, 1
calc_crc_4:	mov	cx, word ptr end_length2
		or	cx, cx
		jnz	write_buffer_from_table_3
		cmp	word ptr end_length, 0
		jnz	write_buffer_from_table_4
		mov	cx, para_66$66_60$60
write_buffer_from_table_3:
		lodsb
		mov	byte ptr save_data, al
		cmp	word ptr cmpfile_handler, 0
		jz	write_buffer_from_table_3_1
		@@compare_file_cx
		add	word ptr cmp_done_low, cx
		adc	word ptr cmp_done_high, 0
		cmp	word ptr cmpfile_handler, 0
		jnz	write_buffer_from_table_4
write_buffer_from_table_3_1:
		call	write
write_buffer_from_table_4:
		cmp	word ptr end_length, 0
		jz	write_buffer_from_table_5
		cmp	word ptr cmpfile_handler, 0
		pushf
		mov	byte ptr restore_ok, 0ffh
		call	_write_close
		jb	error_09
		popf
		mov	dx, offset msg_same_of_hsi
		jnz	cmp_file_2
		inc	word ptr restore_count
		mov	dx, offset msg_ok_of_hsi
		cmp	word ptr max_division, 0
		jz	cmp_file_2
		dec	word ptr restore_count
		inc	word ptr restore_volume_count
		mov	dx, offset msg_ok_of_hsi2
cmp_file_2:	@@display	dx
write_buffer_from_table_5:
		mov	byte ptr error_count, 0
		endm



;-----------------------------------------------;
;						;
;	@@write_buffer_from_table2		;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	?
;	BREAK :	flags, ax, bx, cx, dx, si, di, ?
;						;
;-----------------------------------------------;

@@write_buffer_from_table2	macro
		mov	cx, para_66_60
		mov	si, offset work_table + 1
		mov	di, offset write_buffer
write_buffer_from_table2_1:
		push	cx
		mov	cx, para_33_30
		rep	movsw
		add	si, 3
		pop	cx
		loop	write_buffer_from_table2_1
		mov	si, offset write_buffer
		mov	dx, offset crc_table
		mov	cx, word ptr end_length2
		or	cx, cx
		jnz	write_buffer_from_table2_3
		cmp	word ptr end_length, 0
		jnz	write_buffer_from_table_4
		mov	cx, para_66$66_60$60
write_buffer_from_table2_3:
		call	write
write_buffer_from_table2_4:
		endm



;-----------------------------------------------;
;						;
;	@@chk_table				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	?				;
;	BREAK :	flags, ?			;
;						;
;-----------------------------------------------;

@@chk_table	macro
		call	disp_error_number
		@@correct_errors
		@@write_buffer_from_table
		endm



;-----------------------------------------------;
;						;
;	@@crc_check				;
;						;
;	INPUT :	bl (slant frame's sequence number)
;		cx (byte count)			;
;	OUTPUT:	flag				;
;		( ZR: crc check OK )		;
;	ERROR :	NON				;
;	BREAK :	flags, ax, bx, cx, dx		;
;						;
;-----------------------------------------------;

@@crc_check	macro
		push	si
		mov	si, offset work_work
		mov	dx, offset crc_table
		mov	ax, 0ffffh
		cmp	byte ptr [si], bl
		jnz	crc_check_1
		inc	cx
crc_check_1:	@@crc_sub
		cmp	ax, offset ccitt_crc_check
		pop	si
		endm



;-----------------------------------------------;
;						;
;	@@make_hsi_main				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	go_next, ?			;
;	BREAK :	?				;
;						;
;-----------------------------------------------;

@@make_hsi_main	macro
make_hsi_main:	mov	word ptr work_work2, 0ffffh
make_hsi_next:	mov	byte ptr type_flag, 0	; 0 = undetermmined
						; else = '7', '8', 's', 'n'
		mov	word ptr cmp_done_low, 0
		mov	word ptr cmp_done_high, 0
		mov	byte ptr restore_ok, 0
		mov	sp, offset end_of_stack
		@@get_header_frame
		jnz	make_hsi_main
header_save:	mov	sp, offset end_of_stack
		mov	byte ptr crc_flag, 0ffh	; not calculating crc
		mov	word ptr end_length, 0
		mov	word ptr end_length2, 0
		@@header_save
disp_restore_fname:
		@@disp_restore_fname
		@@get_local_time
		@@check_header
		@@disp_division
		@@check_skip_and_create_restore_file
		@@disp_periods
		mov	byte ptr seq_old, 0
		mov	byte ptr error_count, 0
		@@make_table2			; loop forever
		endm
