home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
ms_dos
/
ish
/
ish200s
/
makehsi.h
< prev
next >
Wrap
Text File
|
1990-06-14
|
36KB
|
1,722 lines
;
; 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