;
;		ish file converter for MS-DOS  Ver 2.00 (90/3/27)
;
;
;		Copyright (c) 1986, 1987, 1989, 1990  by  M. ishizuka
;		All rights reserved.
;



;-----------------------------------------------;
;						;
;	@@set_seq_number_and_copy_data		;
;						;
;	INPUT :	NON				;
;	OUTPUT:	al (vertical_frame_sequencde_number)
;		di (vertical_frame_pointer)	;
;	ERROR :	NON				;
;	BREAK :	flags, cx, si			;
;						;
;						;
;-----------------------------------------------;

@@set_seq_number_and_copy_data	macro
		mov	si, offset read_buffer
		mov	di, offset work_table2
		mov	al, 1
set_seq_number_and_copy_data:
		stosb
		inc	al
		mov	cx, para_66_60
		rep	movsb
		add	di, 2
		cmp	al, byte ptr para_67_61
		jb	set_seq_number_and_copy_data
		endm



;-----------------------------------------------;
;						;
;	@@make_vertical_sum			;
;						;
;	INPUT :	al (sequence number)		;
;		di (pointer to the vertical sum frame)
;	OUTPUT:	di (pointer to the slant sum frame)
;	ERROR :	NON				;
;	BREAK :	flags, al, cx, si		;
;						;
;						;
;-----------------------------------------------;

@@make_vertical_sum	macro
		mov	si, offset work_table2 + 1
		mov	cx, para_66_60
		stosb
make_sum1_1:	push	cx
		lodsb
		push	si
		dec	si
		mov	cx, para_65_59
make_sum1_2:	add	si, para_69_63
		add	al, [si]
		loop	make_sum1_2
		neg	al
		stosb
		pop	si
		pop	cx
		loop	make_sum1_1
		add	di, 2
		endm



;-----------------------------------------------;
;						;
;	@@make_slant_sum			;
;						;
;	INPUT :	di (pointer to the vertical sum frame)
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, al, bx, cx, si, di	;
;						;
;						;
;-----------------------------------------------;

@@make_slant_sum	macro
		mov	cx, para_67_61
		mov	al, byte ptr para_68_62
		stosb
		mov	si, offset work_table2
		xor	bx, bx
make_sum2_1:	push	si
		push	bx
		push	cx
		xor	al, al
		mov	cx, para_67_61
make_sum2_2:	add	al, [bx+si]
		add	si, para_69_63
		inc	bx
		cmp	bx, para_67_61
		jb	make_sum2_3
		xor	bx, bx
make_sum2_3:	loop	make_sum2_2
		neg	al
		stosb
		pop	cx
		pop	bx
		pop	si
		inc	bx
		loop	make_sum2_1
		endm



;-----------------------------------------------;
;						;
;	@@make_table_crc			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx, dx, si		;
;						;
;						;
;-----------------------------------------------;

@@make_table_crc	macro
		mov	si, offset work_table2
		mov	cx, para_68_62
		mov	dx, offset crc_table
make_table_crc_1:
		push	cx
		cmp	cx, 1
		mov	cx, para_67_61
		jnz	make_table_crc_3
		cmp	mode, 'o' + 80h
		jz	make_tabke_crc_2
		inc	byte ptr [si]
		jmp	make_table_crc_3

make_tabke_crc_2:
		inc	cx
make_table_crc_3:
		@@crc_1
		mov	[si], ax
		lodsw
		pop	cx
		loop	make_table_crc_1
		endm



;-----------------------------------------------;
;						;
;	@@make_table				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON				;
;	BREAK :	flags, ax, bx, cx, dx, si, di	;
;						;
;						;
;-----------------------------------------------;

@@make_table	macro
		@@set_seq_number_and_copy_data
		@@make_vertical_sum
		@@make_slant_sum
		@@make_table_crc
		endm



;-----------------------------------------------;
;						;
;	@@make_header				;
;						;
;	INPUT :	si (input filename pointer)	;
;	OUTPUT:	NON				;
;	ERROR :	error_05, error_07		;
;	BREAK :	flags, ax, bx, cx, dx, di	;
;						;
;						;
;-----------------------------------------------;

@@make_header	macro
		push	si
		mov	di, offset work_table
		mov	ax, 0		; SEQ#(al) : 0
					; TYPE(ah) : 0
					; error_line_detect  : ccitt_crc
					;     correct method : ÀÃ_sum & ÅÅÒ_sum
					; total_error_detect : ccitt_crc
		stosw
		add	di, 4
		cmp	mode, '7'
		jz	jis7_1
		cmp	mode, 's'
		jz	sjis_1
		cmp	mode, 's' + 80h
		jz	sjis_1
					; JIS8 or non-kana
		mov	ax, 69d		; number of character / line
		stosw			;     (include SEQ# and CRC)
		mov	ax, 68d		; number of line / block
		stosw			;     (include check sum)
		cmp	mode, 'n'
		jz	nonkana_1
					; JIS8
		mov	ax, 808h		; source file (al) : 8-bits
		stosw			;    ish file (ah) : 8-bits
		mov	si, offset parameter_jis8
		jmp	copy_para
;
nonkana_1:				; non-kana
		mov	ax, 0e10h	; source file (al) : 8-bits
		stosw			;    ish file (ah) : 8-bits
		mov	si, offset parameter_nonkana
		jmp	copy_para
;
jis7_1:					; JIS7
		mov	ax, 63d		; number of character / line
		stosw			;     (include SEQ# and CRC)
		mov	ax, 62d		; number of line / block
		stosw			;     (include check sum)
		mov	ax, 0d10h	; source file (al) : 16-bits
		stosw			;    ish file (ah) : 13-bits
		mov	si, offset parameter_jis7
		jmp	copy_para
;
sjis_1:					; shift JIS
		mov	ax, 73d		; number of character / line
		stosw			;     (include SEQ# and CRC)
		mov	ax, 72d		; number of line / block
		stosw			;     (include check sum)
		mov	ax, 0f10h	; source file (al) : 16-bits
		stosw			;    ish file (ah) : 15-bits
		mov	si, offset parameter_sjis

copy_para:	push	di
		mov	di, offset para_81_80
		mov	cx, 21d
		rep	movsw
		pop	di
		pop	si
		push	si
		push	di
		mov	ax, 2900h
		mov	di, offset work_fcb
		int	21h		; parse file name
		or	al, al
		jnz	error_07
		mov	si, di
		pop	di
		mov	cx, 11d
		inc	si
		rep	movsb
		mov	al, os
		mov	ah, 0ffh	; all OSs
		dec	al
		jz	set_os
		dec	ah		; other OSs
		dec	al
		jz	set_os
		mov	ah, 40h		; Mac
		dec	al
		jz	set_os
		mov	ah, 30h		; UNIX
		dec	al
		jz	set_os
		mov	ah, 20h		; OS-9
		dec	al
		jz	set_os
		mov	ah, 10h		; CP/M
		dec	al
		jz	set_os
		xor	ah, ah		; MS-DOS
set_os:		xor	al, al		; genre(¼Þ¬ÝÙ) : 0 (not defined)
					; (1-255:for automatic genre selection)
		stosw			; machine (ah) 
		mov	ax, 0d00h
		cmp	mode, 'o' + 80h
		jz	set_auxiliary_type
		inc	al		; auxiliary type (al) : 1
					;		  ( 0 : old version )
set_auxiliary_type:
		cmp	word ptr mv_num, 0
		jz	set_auxiliary_type_2
		mov	ah, 1dh
set_auxiliary_type_2:
		stosw			; ah = 000x1101b
					;  time stamp is available
					;  CRC-16 is available
					;  CRC-32 is available
		mov	ax, 5700h
		mov	bx, read_handler
		int	21h		; get date & time of input file
		jb	error_05
		mov	ax, cx		; time
		stosw
		mov	ax, dx		; date
		stosw
		mov	cx, para_18_15	; clear reserved area
		xor	ax, ax
		rep	stosw
		@@set_difference_of_time
		pop	si
		endm



;-----------------------------------------------;
;						;
;	@@make_header_title			;
;						;
;	INPUT :	si (input file pointer)		;
;	OUTPUT:	di (end of header title pointer);
;	ERROR :	error_10			;
;	BREAK :	flags, ax, cx, dx, di		;
;						;
;						;
;-----------------------------------------------;

@@make_header_title	macro
		push	si
		mov	di, offset header_title_buffer
		mov	si, offset msg_header1_esc
		cmp	byte ptr n_flag, 'e'
		jz	escape_1
		mov	si, offset msg_header1_non_esc
escape_1:	call	movsb1
		pop	si
		push	si
		push	di
		mov	di, offset save_fname + 1
;		xor	cx, cx		; now CX == 0
save_fname_1:	lodsb
		or	al, al
		jz	save_fname_2
		inc	cl
		cmp	cl, 12d + 1
		jnc	error_07
		stosb
		jmp	save_fname_1

save_fname_2:	pop	di
		jcxz	error_07
		mov	si, offset save_fname
		mov	[si], cl
		call	movsb1
		mov	al, os
		mov	si, offset msg_all_os
		dec	al
		jz	copy_os_name
		dec	al
		jz	copy_use_ish_msg
		mov	si, offset msg_mac
		dec	al
		jz	copy_os_name
		mov	si, offset msg_unix
		dec	al
		jz	copy_os_name
		mov	si, offset msg_os9
		dec	al
		jz	copy_os_name
		mov	si, offset msg_cpm
		dec	al
		jz	copy_os_name
		mov	si, offset msg_ms_dos
copy_os_name:	call	movsb1
copy_use_ish_msg:
		mov	si, offset msg_use_ish
		call	movsb1
		push	di
		mov	si, offset arc_data
		mov	di, offset work_fcb+9d
		mov	cx, 6
		xor	ax, ax
copy_usr_archiver_msg:
		push	di
		add	si, ax
		push	si
		push	cx
		mov	cx, 3
		repz	cmpsb
		pop	cx
		pop	si
		pop	di
		pushf
		add	si, 3
		lodsb
		cbw
		popf
		loopnz	copy_usr_archiver_msg
		pop	di
		jnz	copy_use_ish2_msg
		mov	cx, ax
		rep	movsb
copy_use_ish2_msg:
		mov	si, offset msg_use_ish2
		mov	cx, 4
		rep	movsb
		mov	si, word ptr mv_num
		or	si, si
		jnz	calc_multi_volume_lines_1
		mov	ax, word ptr work_table[2]
		mov	dx, word ptr work_table[4]
		call	calc_lines
		jmp	make_header_title_1

calc_multi_volume_lines_1:
		xor	ax, ax
		xor	dx, dx
		mov	cx, word ptr max_division
		dec	cx
calc_multi_volume_lines_2:
		add	ax, si
		adc	dx, 0
		loop	calc_multi_volume_lines_2
		add	ax, word ptr last_division_lines
		adc	dx, 0
make_header_title_1:
		call	hex_to_dec
		mov	si, offset msg_lines
		mov	cx, 8
		rep	movsb
		mov	si, offset msg_header2_esc
		cmp	byte ptr n_flag, 'e'
		jz	escape_2
		mov	si, offset msg_header2_non_esc
escape_2:	call	movsb1
		pop	si
		endm



;-----------------------------------------------;
;						;
;	@@check_ish_file			;
;						;
;	INPUT :	si (input file pointer)		;
;	OUTPUT:	NON				;
;	ERROR :	error_08, error_18		;
;	BREAK :	flags, ax, bl, cx, dx, si, di	;
;						;
;						;
;-----------------------------------------------;

@@check_ish_file	macro
		push	si
find_extension:	lodsb
		or	al, al
		jz	change_extension_to_ish
		cmp	al, '.'
		jnz	find_extension
change_extension_to_ish:
		mov	di, si
		dec	di
		mov	si, offset ish_data
		mov	cx, 5
		rep	movsb
		mov	di, offset work_fcb_2
		mov	dx, di
		mov	al, os
		mov	si, offset all_os_path + 1
		dec	al
		jz	add_path
		mov	si, offset other_os_path + 1
		dec	al
		jz	add_path
		mov	si, offset mac_path + 1
		dec	al
		jz	add_path
		mov	si, offset unix_path + 1
		dec	al
		jz	add_path
		mov	si, offset os9_path + 1
		dec	al
		jz	add_path
		mov	si, offset cpm_path + 1
		dec	al
		jz	add_path
		mov	si, offset msdos_path +1
add_path:	lodsb
		or	al, al
		jz	copy_ish_filename
		stosb
		jmp	add_path
;
copy_ish_filename:
		pop	si
copy_ish_filename_1:
		lodsb
		stosb
		or	al, al
		jnz	copy_ish_filename_1
		mov	cx, word ptr max_division
		sub	di, 3
		mov	word ptr ixx, di
		jcxz	output_file_not_exist_check_1
		mov	bl, 10d
output_file_not_exist_check:
		mov	ax, cx
		div	bl
		add	ax, 3030h
		cmp	ah, '9'+1
		jb	output_file_not_exist_check_0
		add	ah, 'A' - ('9' + 1)
output_file_not_exist_check_0:
		mov	word ptr [di], ax
output_file_not_exist_check_1:
		mov	ax, 3d00h
		int	21h		; output_file already exist ?
		jnb	error_18
		cmp	ax, 2h
		jnz	error_08
		jcxz	output_file_not_exist_check_2
		loop	output_file_not_exist_check
output_file_not_exist_check_2:
		endm



;-----------------------------------------------;
;						;
;	@@calc_file_size			;
;						;
;	INPUT :	ax (bytes/sector)		;
;		di (end of header title pointer);
;	OUTPUT:	si, bx				;
;	ERROR :	error_08, error_18		;
;	BREAK :	flags, bx, cx, dx, si, bp	;
;						;
;						;
;-----------------------------------------------;

@@calc_file_size	macro
		push	ax
		push	di
		xor	bx, bx
		xor	si, si
		mov	ax, word ptr work_table[2]
		mov	dx, word ptr work_table[4]
		cmp	word ptr max_division, 0
		jz	calc_file_size_0
		xor	ax, ax
calc_file_size_loop:
		inc	ax
		mov	word ptr current_division, ax
		mov	save_count_low, 1
		cmp	ax, word ptr max_division
		mov	ax, word ptr work_table[40]
		mov	dx, word ptr work_table[42]
		jnz	calc_file_size_0_0
		mov	ax, word ptr last_division_bytes_low
		mov	dx, word ptr last_division_bytes_high
calc_file_size_0_0:
		push	si
		push	ax
		push	dx
		call	calc_lines
		pop	dx
		pop	ax
		pop	si
		pop	di
		pop	cx
		push	cx
		push	di
		dec	cx
		add	bx, cx
		adc	si, 0
		not	cx
		and	bx, cx
calc_file_size_0:
		mov	cx, word ptr para_65_59
		mov	word ptr para_A, cx
		mov	cx, word ptr para_66_60
		mov	word ptr para_B, cx
		add	ax, 2
		adc	dx, 0
		call	trunc
		mov	word ptr line1_h, dx
		mov	word ptr line1_l, ax
		push	dx
		push	ax
		call	trunc
		mov	word ptr line2_h, dx
		mov	word ptr line2_l, ax
		cmp	byte ptr mode, 'o' + 80h
		jnz	calc_file_size_1_0
		add	bx, ax
		add	si, dx
calc_file_size_1_0:
		add	ax, ax
		adc	dx, dx
		pop	cx
		add	ax, cx
		pop	cx
		adc	dx, cx
		mov	cx, para_81_80
calc_file_size_1:
		add	bx, ax
		adc	si, dx
		loop	calc_file_size_1
		mov	dx, bx
		mov	bx, offset encode_table_jis8
		cmp	mode, '8'
		jz	calc_file_size_2
		cmp	mode, '8' + 80h
		jz	calc_file_size_2
		cmp	mode, 's'
		jz	calc_file_size_2
		cmp	mode, 's' + 80h
		jz	calc_file_size_2
		mov	bx, offset encode_table_jis7
calc_file_size_2:
		mov	al, byte ptr para_66_60
		inc	al
		xor	ah, ah
		push	ax
		xlat
		mov	di, ax
		pop	ax
		inc	al
		cmp	mode, 'o' + 80h
		jz	calc_file_size_2_1
		inc	al
calc_file_size_2_1:
		xlat
		cmp	byte ptr [di][prefix_table], 0
		jz	calc_file_size_3
		add	dx, line2_l
		adc	si, line2_h
calc_file_size_3:
		mov	di, ax
		cmp	byte ptr [di][prefix_table], 0
		jz	calc_file_size_5
		add	dx, line2_l
		adc	si, line2_h
calc_file_size_5:
		mov	di, offset prefix_table + '!'
		cmp	mode, 80h
		jc	calc_file_size_5_1
		mov	di, offset prefix_table + '#'
calc_file_size_5_1:
		cmp	byte ptr [di], 0
		jz	calc_file_size_5_2
		add	dx, 3
		adc	si, 0
calc_file_size_5_2:
		mov	ah, 1
		mov	cx, line1_l
		mov	bp, line1_h
		inc	bp
calc_file_size_7:
		mov	al, ah
		xlat
		mov	di, ax
		and	di, 0ffh
		cmp	byte ptr [di][prefix_table], 0
		jz	calc_file_size_8
		add	dx, 1
		adc	di, 0
calc_file_size_8:
		inc	ah
		cmp	ah, byte ptr para_66_60
		jbe	calc_file_size_9
		mov	ah, 1
calc_file_size_9:
		loop	calc_file_size_7
		dec	bp
		jnz	calc_file_size_7
		mov	bx, 80d * 3
		cmp	mode, 80h
		jb	calc_file_size_9_1
		mov	bx, para_81$3_80$3_81$3
calc_file_size_9_1:
		add	bx, dx
		adc	si, 0
		pop	ax
		push	ax
		sub	ax, offset header_title_buffer
		add	bx, ax
		adc	si, 0
		mov	cx, title_length
		inc	cx
		jz	calc_file_size_13
		mov	ax, save_max_count_low
		mov	dx, save_max_count_high
		call	calc_order
		add	al, 14d
		cmp	word ptr max_division, 0
		jz	calc_title_size_0
		mov	di, ax
		mov	ax, word ptr max_division
		xor	dx, dx
		call	calc_order
		add	al, 9d
		add	di, ax
		mov	ax, word ptr current_division
		xor	dx, dx
		call	calc_order
		add	ax, di
calc_title_size_0:
		add	al, save_fname
		mov	dx, ax
calc_title_size:
		push	dx
		mov	ax, save_count_low
		mov	dx, save_count_high
		add	ax, cx
		adc	dx, 0
		mov	save_count_low, ax
		mov	save_count_high, dx
		cmp	dx, save_max_count_high
		jc	calc_file_size_11
		jnz	calc_file_size_10
		cmp	ax, save_max_count_low
		jc	calc_file_size_11
calc_file_size_10:
		mov	ax, save_max_count_low
		mov	dx, save_max_count_high
calc_file_size_11:
		call	calc_order
		pop	dx
		add	ax, dx
		cmp	n_flag, 'e'
		jz	calc_file_size_11_1
		cmp	byte ptr prefix_table + '-', 0
		jz	calc_file_size_12
		jmp	calc_file_size_11_2

calc_file_size_11_1:
		cmp	byte ptr prefix_table + 01bh, 0
		jz	calc_file_size_12
calc_file_size_11_2:
		inc	ax
calc_file_size_12:
		add	bx, ax
		adc	si, 0
		mov	ax, save_count_high
		cmp	ax, save_max_count_high
		jc	calc_title_size
		jnz	calc_file_size_13
		mov	ax, save_count_low
		cmp	ax, save_max_count_low
		jc	calc_title_size
calc_file_size_13:
		cmp	n_flag, 'e'
		jz	calc_file_size_13_1
		cmp	byte ptr prefix_table + '<', 0
		jz	calc_file_size_14
		jmp	calc_file_size_13_2

calc_file_size_13_1:
		cmp	byte ptr prefix_table + 01bh, 0
		jz	calc_file_size_14
calc_file_size_13_2:
		add	bx, 1
		adc	si, 0
calc_file_size_14:
		cmp	word ptr max_division, 0
		jz	calc_file_size_14_3
		mov	ax, save_max_count_low
		mov	dx, save_max_count_high
		call	calc_order
		add	al, 29d
		mov	di, ax
		mov	ax, word ptr max_division
		xor	dx, dx
		call	calc_order
		add	di, ax
		mov	ax, word ptr current_division
		xor	dx, dx
		call	calc_order
		add	ax, di
		add	bx, ax
		adc	si, 0
		cmp	n_flag, 'e'
		jz	calc_file_size_14_1
		cmp	byte ptr prefix_table + '=', 0
		jz	calc_file_size_14_3
		jmp	calc_file_size_14_2

calc_file_size_14_1:
		cmp	byte ptr prefix_table + 01bh, 0
		jz	calc_file_size_14_3
calc_file_size_14_2:
		add	bx, 1
		adc	si, 0
calc_file_size_14_3:
		xor	ax, ax
		mov	save_count_low, ax
		mov	save_count_high, ax
		mov	ax, word ptr current_division
		or	ax, ax
		jz	calc_file_size_15
		cmp	ax, word ptr max_division
		jc	calc_file_size_loop
		xor	ax, ax
		mov	word ptr current_division, ax
calc_file_size_15:
		pop	di
		pop	ax
		endm


;-----------------------------------------------;
;						;
;	@@get_disk_free_space			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	ax (bytes/sector)		;
;		bx (free sectors)		;
;	ERROR :	error_08			;
;	BREAK :	flags, cx, dx, si, di		;
;						;
;						;
;-----------------------------------------------;

@@get_disk_free_space	macro
		mov	si, offset work_fcb_2
		mov	ax, [si]
		cmp	byte ptr dos_version, 3
		jc	get_disk_free_space_1
		mov	di, offset work_fcb_3
		mov	ah, 60h
		int	21h
		mov	ax, word ptr work_fcb_3
get_disk_free_space_1:
		xor	dl, dl
		cmp	ah, ':'
		jnz	get_disk_free_space_2
		or	al, 20h
		sub	al, 60h
		mov	dl, al
get_disk_free_space_2:
		mov	ah, 36h
		int	21h
		cmp	ax, 0ffffh
		jz	error_08
		mul	cx
		endm



;-----------------------------------------------;
;						;
;	@@cmp_dd				;
;						;
;	cmpare double word (data1) - (data2)	;
;						;
;	INPUT :	data1_high, data1_low		;
;		data2_high, data2_low		;
;	OUTPUT:	flags				;
;		( ZR: data1 == data2)		;
;		( CY: data1 <  data2)		;
;	ERROR :	NON				;
;	BREAK :	flags				;
;						;
;						;
;-----------------------------------------------;

@@cmp_dd	macro	data1_high, data1_low, data2_high, data2_low
		local	cmp_dd_ret
		cmp	data1_high, data2_high
		jnz	cmp_dd_ret
		cmp	data1_low, data2_low
cmp_dd_ret:
		endm



;-----------------------------------------------;
;						;
;	@@create_ish_file			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_08			;
;	BREAK :	flags, ax, cx, dx		;
;						;
;						;
;-----------------------------------------------;

@@create_ish_file	macro
		mov	ax, 3c00h
		mov	dx, offset work_fcb_2
		xor	cx, cx
		int	21h		; create output_file
		jc	error_08
		mov	write_handler, ax
		endm



;-----------------------------------------------;
;						;
;	@@write_header_title			;
;						;
;	INPUT :	cx (end of header title pointer);
;	OUTPUT:	NON				;
;	ERROR :	error_09, err or_33		;
;	BREAK :	flags, ax, cx, dx, si, di, bp	;
;						;
;-----------------------------------------------;

@@write_header_title	macro
		mov	dx, offset header_title_buffer
		sub	cx, dx
		mov	word ptr header_title_length_save, cx
		call	header_title_write
		endm



;-----------------------------------------------;
;						;
;	@@encode_table_data			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	si (read pointer)		;
;		di (write pointer)		;
;	ERROR :	NON				;
;	BREAK :	flags, ax, cx			;
;						;
;-----------------------------------------------;

@@encode_table_data	macro
		mov	si, offset work_table2
		mov	di, offset write_buffer
		mov	cx, para_68_62
encode_table_1:	push	cx
		cmp	cx, 1
		jnz	encode_table_2
		cmp	mode, 'o' + 80h
		jnz	encode_table_2
		call	encode_7bit_old
		jmp	encode_table_3

encode_table_2:	call	word ptr encode_sub2
encode_table_3:	pop	cx
		mov	ax, offset cr_lf
		stosw
		loop	encode_table_1
		endm



;-----------------------------------------------;
;						;
;	@@encode_sum				;
;						;
;	INPUT :	si (read pointer)		;
;		di (write pointer)		;
;	OUTPUT:	ax (write length)		;
;	ERROR :	NON				;
;	BREAK :	flags, bl, cx, si, di		;
;						;
;						;
;-----------------------------------------------;

@@encode_sum	macro
		mov	ax, read_length
		cmp	ax, para_66$66?1_60$60?1
		jnc	encode_sum_1
		add	ax, 2
encode_sum_1:	add	ax, para_65_59
		mov	bl, byte ptr para_66_60
		div	bl
		mov	bl, byte ptr para_81_80
		mul	bl
		mov	di, offset write_buffer
		add	di, ax
		mov	si, para_81$66_80$60_write_buffer
		mov	cx, para_81$2_80$2
		cmp	mode, 'o' + 80h
		jnz	encode_sum_2
		inc	cx
encode_sum_2:	add	ax, cx
		rep	movsb
		endm



;-----------------------------------------------;
;						;
;	@@write_table_sub			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_09, error_33		;
;	BREAK :	flags, ax, cx, dx, si, di, bp	;
;						;
;-----------------------------------------------;

@@write_table_sub	macro
		mov	dx, offset write_buffer
write_table_sub_1:
		mov	cx, para_81_80
		sub	ax, cx
		jc	write_table_sub_ret
		cmp	ax, 1
		jnz	write_table_sub_2
		inc	cx
write_table_sub_2:
		push	ax
		push	cx
		push	dx
		call	ins_prefix
		call	write_2
		call	title0
		pop	dx
		pop	cx
		pop	ax
		add	dx, cx
		jmp	write_table_sub_1

write_table_sub_ret:
		endm



;-----------------------------------------------;
;						;
;	@@write_table				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_09, error_33		;
;	BREAK :	flags, ax, bl, cx, dx, si, di,	;
;		bp				;
;						;
;						;
;-----------------------------------------------;

@@write_table	macro
		@@encode_table_data
		@@encode_sum
		@@write_table_sub
		endm



;-----------------------------------------------;
;						;
;	@@ish_main				;
;						;
;	INPUT :	cx (end of header title pointer);
;	OUTPUT:	NON				;
;	ERROR :	error_05. error_08, error_09,	;
;		err or_33, ?			;
;	BREAK :	flags, ax, bx, cx, dx, si, di,	;
;		bp				;
;						;
;						;
;-----------------------------------------------;

@@ish_main	macro
		@@write_header_title
ish_main_0:	call	make_header_title2_and_write
		call	write_header
		mov	ax, word ptr work_table[40]
		mov	word ptr current_division_length_low, ax
		mov	ax, word ptr work_table[42]
		mov	word ptr current_division_length_high, ax
ish_main:	mov	dx, offset read_buffer
		mov	cx, para_66$66_60$60
		cmp	mv_num, 0
		jz	ish_main_2
		cmp	word ptr current_division_length_high, 0
		jnz	ish_main_2
		cmp	cx, word ptr current_division_length_low
		jc	ish_main_2
		mov	cx, word ptr current_division_length_low
ish_main_2:	call	_read
		jc	error_05
		mov	cx, ax
		sub	word ptr current_division_length_low, ax
		sbb	word ptr current_division_length_high, 0
		xchg	read_length, ax
		mov	si, offset read_buffer
		mov	bx, para_66$66_60$60_read_buffer
		mov	bx, [bx]
		mov	dx, offset crc_table
		xchg	ax, bx
		cmp	bx, para_66$66?1_60$60?1
		jz	ish_main_1
		inc	bx
		jnz	not_begining
		mov	ax, 0ffffh
not_begining:	jcxz	skip_calc_crc
		@@crc_sub
skip_calc_crc:	mov	cx, para_66$66_60$60_read_buffer
		sub	cx, si
		jz	not_end_of_file
		not	ax
not_end_of_file:
		mov	di, si
		stosw
		jmp	fill_zero

ish_main_1:	mov	cx, para_66$66@1_60$60@1
		mov	di, si
		stosb
fill_zero:	xor	ax, ax
		rep	stosb
		@@make_table
		@@write_table
		mov	ax, read_length
		cmp	ax, para_66$66?1_60$60?1
		jnb	ish_main
		call	title2
		call	_write_close
		jc	error_09

		mov	ax, word ptr mv_num
		or	ax, ax
		jz	ish_main_ret
;		cmp	word ptr title_count2, ax
;		jnz	title_ret
;		add	save_count_low, ax
;		adc	save_count_high, 0
		inc	byte ptr work_table[1]
		mov	al, byte ptr max_division
		cmp	al, byte ptr work_table[1]
		jc	ish_main_ret
		jnz	ish_main_3
		mov	ax, word ptr last_division_lines
		mov	word ptr mv_num, ax
ish_main_3:	mov	si, word ptr ixx
		mov	ax, [si]
		inc	ah
		cmp	ah, '9' + 1
		jc	title_4
		add	ax, 0f601h
		cmp	al, '9' + 1
		jnz	title_4
		mov	al, 'a'
title_4:	mov	[si], ax
		cmp	byte ptr stdout, 0
		jnz	title_5
		mov	ax, 3c00h
		mov	dx, offset work_fcb_2
		xor	cx, cx
		int	21h		; create output_file
		jc	error_08
		mov	write_handler, ax
title_5:
;		call	disp_ish
		call	init_constants
		call	header_title_write
		jmp	ish_main_0

ish_main_ret:	mov	bx, read_handler
		mov	ah, 3eh			; close input file
		int	21h
		jc	error_05
		mov	word ptr read_handler, 0
		endm



;-----------------------------------------------;
;						;
;	@@calc_crc_of_inputfile			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_05			;
;	BREAK :	flags, ax, bx, cx, dx, bp, di	;
;						;
;						;
;-----------------------------------------------;

@@calc_crc_of_inputfile	macro
		push	si
		mov	ax, word ptr work_table[2]
		mov	dx, word ptr work_table[4]
		cmp	word ptr max_division, 0
		jnz	calc_crc_of_inputfile_1
		mov	bx, word ptr read_handler
		call	calc_crc_of_file
		jc	error_05
		jmp	calc_crc_of_inputfile_4

calc_crc_of_inputfile_1:
		mov	word ptr length_low, ax
		mov	word ptr length_high, dx
		mov	ax, 0ffffh
		mov	dx, ax
		mov	bp, ax
		mov	word ptr current_division, 1
calc_crc_of_inputfile_2:
		mov	bx, word ptr work_table[40]
		mov	cx, word ptr work_table[42]
		sub	word ptr length_low, bx
		sbb	word ptr length_high, cx
calc_crc_of_inputfile_3:
		mov	word ptr length_of_file_low, bx
		mov	word ptr length_of_file_high, cx
		mov	di, 0ffffh
		mov	bx, word ptr read_handler
		@@calc_crc_of_file_sub	@@crc16_16_32_sub
		jc	error_05
		mov	bx, word ptr current_division
		add	bx, bx
		not	di
		mov	word ptr each_volume_crc16[bx-2], di
		shr	bx, 1
		inc	bx
		mov	word ptr current_division, bx
		cmp	bx, word ptr max_division
		jc	calc_crc_of_inputfile_2
		mov	bx, word ptr length_low
		mov	cx, word ptr length_high
		jz	calc_crc_of_inputfile_3
		not	ax
		not	dx
		not	bp
calc_crc_of_inputfile_4:
		mov	word ptr work_table[34], bp
		mov	word ptr work_table[36], ax
		mov	word ptr work_table[38], dx
		mov	ax, 4200h
		mov	bx, word ptr read_handler
		xor	cx, cx
		xor	dx, dx
		int	21h		; move file pointer (rewind)
		jc	error_05
		pop	si
		endm



;-----------------------------------------------;
;						;
;	@@make_ish_main				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	?				;
;	BREAK :	flags, ?			;
;						;
;						;
;-----------------------------------------------;

@@make_ish_main	macro
		@@make_header
		@@set_each_size
		@@make_header_title
		push	di
		cmp	byte ptr stdout, 0
		jnz	make_ish_main_1
		@@check_ish_file
		@@get_disk_free_space
		pop	di
		push	di
		push	bx
		@@calc_file_size
		pop	cx
		mul	cx
		@@cmp_dd	dx, ax, si, bx
		jc	error_16_2
		@@create_ish_file
make_ish_main_1:
		@@calc_crc_of_inputfile
;		mov	word ptr file_block_length, 1 ;************
;		call	disp_ish
		pop	cx
		@@ish_main
		endm
