;
;		ish file converter for MS-DOS  Ver 2.00 (90/3/27)
;
;
;		Copyright (c) 1986, 1987, 1989, 1990  by  M. ishizuka
;		All rights reserved.
;



;-----------------------------------------------;
;						;
;	title0					;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	NON, ?				;
;	BREAK :	flags, ax, cx, dx, si, di, ?	;
;						;
;-----------------------------------------------;

title0:		inc	word ptr title_count
		inc	word ptr title_count2
		mov	ax, title_count
		sub	ax, title_length
		jnz	title_ret
title2:		cmp	title_length, 0ffffh
		jz	title_ret
		xchg	ax, title_count
		or	ax, ax
		jz	title_ret
		inc	ax
		push	ax
		mov	si, offset msg_title_esc1
		cmp	byte ptr n_flag, 'e'
		jz	title_1
		mov	si, offset msg_title_non_esc1
title_1:	mov	di, offset work_work
		call	movsb1
		mov	si, offset save_fname
		call	movsb1
		cmp	word ptr mv_num, 0
		jz	title_3
		mov	si, offset msg_header6
		call	movsb1
		mov	al, byte ptr work_table[1]
		xor	ah, ah
		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
title_3:	mov	ax, '( '
		stosw
		pop	si
		mov	ax, save_count_low
		add	ax, si
		mov	dx, save_count_high
		adc	dx, 0
		mov	save_count_low, ax
		mov	save_count_high, dx
		call	hex_to_dec
		mov	al, '/'
		stosb
		mov	ax, mv_num
		xor	dx, dx
		or	ax, ax
		jnz	title_1_1
		mov	ax, save_max_count_low
		mov	dx, save_max_count_high
title_1_1:	call	hex_to_dec
		mov	si, offset msg_title_esc2
		cmp	byte ptr n_flag, 'e'
		jz	title_2
		mov	si, offset msg_title_non_esc2
title_2:	call	movsb1
		mov	cx, di
		mov	dx, offset work_work
		sub	cx, dx
		call	ins_prefix
		call	write_2
		inc	word ptr title_count2
title_ret:		ret



;-----------------------------------------------;
;						;
;	ins_prefix				;
;						;
;	INPUT :	cx (length of frame)		;
;		dx (start of frame)		;
;	OUTPUT:	cx (length of frame)		;
;		dx (start of frame)		;
;	ERROR :	NON				;
;	BREAK :	flags, ax, si, bp		;
;						;
;-----------------------------------------------;

ins_prefix:	cmp	byte ptr prefix_count, 0
		jz	ins_prefix_ret
		mov	si, dx
		mov	al, [si]
		xor	ah, ah
		mov	bp, ax
		cmp	byte ptr ds:[bp][offset prefix_table], 0
		jz	ins_prefix_ret
		dec	dx
		inc	cx
		mov	al, byte ptr prefix_count
		mov	[si-1], al
ins_prefix_ret:	ret



;-----------------------------------------------;
;						;
;	write_header				;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	?				;
;	BREAK :	flags, ?			;
;						;
;						;
;-----------------------------------------------;

write_header:	mov	bl, byte ptr work_table[1]
		or	bl, bl
		jz	write_header_0
		xor	bh, bh
		add	bx, bx
		mov	ax, word ptr each_volume_crc16[bx-2]
		mov	word ptr work_table[44], ax
write_header_0:	mov	si, offset work_table
		mov	cx, 61d
		test	byte ptr mode, 80h
		jz	write_header_0_1
		mov	cx, 67d
write_header_0_1:
		mov	dx, offset crc_table
		push	si
		@@crc_1			; calculate crc
		mov	[si], ax
		pop	si
		mov	di, offset write_buffer
;		call	word ptr encode_sub1
		test	byte ptr mode, 80h
		jz	write_header_0_2
		call	encode_7bit
		jmp	write_header_0_3

write_header_0_2:
		call	encode_13bit
write_header_0_3:
		mov	ax, offset cr_lf
		stosw
;		sub	di, offset write_buffer
;		mov	para_81_80_81, di
		mov	cx, 3
write_header_1:	push	cx
		test	byte ptr mode, 80h
		mov	cx, 80d
		jz	write_header_2
		inc	cl
write_header_2:	mov	dx, offset write_buffer
		call	ins_prefix
		call	write_2
		call	title0
		pop	cx
		loop	write_header_1
wh_ret:		ret



;-----------------------------------------------;
;						;
;	make_header_title2_and_write		;
;						;
;	INPUT :	si (input file pointer)		;
;	OUTPUT:	di (end of header title pointer);
;	ERROR :	error_10			;
;	BREAK :	flags, ax, cx, di		;
;						;
;						;
;-----------------------------------------------;

make_header_title2_and_write:
		cmp	word ptr mv_num, 0
		jz	wh_ret
		mov	di, offset write_buffer
		mov	si, offset msg_header1_esc
		cmp	byte ptr n_flag, 'e'
		jnz	mh2_escape_1
		call	movsb1
mh2_escape_1:	mov	si, offset msg_header3
		call	movsb1
		call	movsb1
		mov	al, byte ptr work_table[1]
		xor	ah, ah
		xor	dx, dx
		call	hex_to_dec
		mov	al, '/'
		stosb
		mov	ax, word ptr max_division
		xor	dx, dx
		call	hex_to_dec
		mov	si, offset msg_header4
		call	movsb1
		mov	ax, word ptr mv_num
		xor	dx, dx
		call	hex_to_dec
		mov	si, offset msg_header5
		call	movsb1
		mov	si, offset msg_header2_esc
		cmp	byte ptr n_flag, 'e'
		jz	mh2_escape_2
		mov	si, offset msg_header2_non_esc2
mh2_escape_2:	call	movsb1
		mov	cx, di
		mov	dx, offset write_buffer
		sub	cx, dx
		call	ins_prefix
		call	write_2
		jmp	title0



;-----------------------------------------------;
;						;
;	header_title_write			;
;						;
;	INPUT :	NON				;
;	OUTPUT:	NON				;
;	ERROR :	error_09, error_33		;
;	BREAK :	flags, ax, cx, dx, si, di, bp	;
;						;
;-----------------------------------------------;

header_title_write:
		mov	dx, offset header_title_buffer
		mov	cx, word ptr header_title_length_save
		call	ins_prefix
		call	write_2
		jmp	title0



;-----------------------------------------------;
;						;
;	calc_lines				;
;						;
;	INPUT :	ax (length low)			;
;		dx (length high)		;
;	OUTPUT:	ax (lines low word)		;
;		dx (lines high word)		;
;	ERROR :	NON				;
;	BREAK :	flags, si, bp			;
;						;
;						;
;-----------------------------------------------;

calc_lines:	mov	si, word ptr para_65_59
		mov	word ptr para_A, si
		mov	si, word ptr para_66_60
		mov	word ptr para_B, si
		add	ax, 2
		adc	dx, 0
		call	trunc
		push	dx
		push	ax
		call	trunc
		add	ax, ax
		adc	dx, dx
		add	ax, 4
		adc	dx, 0
		pop	si
		add	ax, si
		pop	si
		adc	dx, si
calc_lines_2:	mov	si, title_length
		cmp	si, 0ffffh
		jz	calc_lines_3
		mov	para_B, si
		dec	si
		mov	para_A, si
		push	dx
		push	ax
		call	trunc
		pop	si
		add	ax, si
		pop	si
		adc	dx, si
calc_lines_3:	mov	save_max_count_low, ax
		mov	save_max_count_high, dx
		ret
