home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
ms_dos
/
ish
/
ish200s
/
ish200s.lzh
/
MAKEHSI.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-03-27
|
20KB
|
950 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.
;
;-----------------------------------------------;
; ;
; seq_new ;
; ;
; INPUT : NON ;
; OUTPUT: NON ;
; ERROR : error_14_2 ;
; BREAK : flags, ? ;
; ;
;-----------------------------------------------;
seq_new: push ax
mov al, seq_old
inc al
cmp al, byte ptr para_67_61
jb seq_new_3
cmp al, byte ptr para_69_63
jb seq_new_5
@@chk_table
cmp word ptr end_length, 0
jnz seq_new_exit
mov al, 1
seq_new_3: cmp word ptr end_length, 0
jnz seq_new_6
push ax
mov ax, word ptr end_length2
or ax, ax
jz seq_new_3_1
add ax, 2
cmp ax, word ptr para_66$66_60$60
jbe seq_new_3_2
mov word ptr end_length2, 0
sub ax, word ptr para_66$66_60$60
jmp seq_new_3_2
seq_new_3_1: mov ax, word ptr para_66_60
sub length_low, ax
sbb length_high, 0d
pop ax
jnc seq_new_5
push ax
mov ah, byte ptr para_66_60
mul ah
add ax, word ptr length_low
inc ax
mov word ptr end_length2, ax
inc ax
inc ax
cmp length_low, -2
jnc seq_new_4_2
seq_new_3_2: mov word ptr end_length, ax
pop ax
push ax
push bx
push cx
push di
mov bl, al
mov ah, byte ptr para_69_63
mul ah
mov di, ax
add di, offset work_table
seq_new_4: inc bl
cmp bl, byte ptr para_67_61
jnb seq_new_4_1
mov al, bl
stosb
xor ax, ax
mov cx, para_34_31
rep stosw
jmp seq_new_4
seq_new_4_1: pop di
pop cx
pop bx
seq_new_4_2: pop ax
seq_new_5: mov seq_old, al
@@increment_line_number
pop ax
ret
seq_new_6: mov al, byte ptr para_67_61
jmp seq_new_5
seq_new_exit: pop ax
pop bx ; pop return address
jmp error_14_2
;-----------------------------------------------;
; ;
; restore_position ;
; ;
; INPUT : NON ;
; OUTPUT: NON ;
; ERROR : NON ;
; BREAK : flags, ax, si ;
; ;
;-----------------------------------------------;
restore_position:
mov si, save_pos
inc si
cmp byte ptr [si-1], 0ah
mov save_pos, si
mov ax, line_number_low_save
jnz restore_position_1
inc ax
restore_position_1:
mov line_number_low, ax
mov line_number_low_save, ax
cmp ax, 010000d
mov ax, line_number_high_save
jnz restore_position_2
mov word ptr line_number_low, 0
mov word ptr line_number_low_save, 0
inc ax
restore_position_2:
mov line_number_high, ax
mov line_number_high_save, ax
ret
;-----------------------------------------------;
; ;
; get_char ;
; ;
; INPUT : si (get character pointer) ;
; OUTPUT: al (character) ;
; flags (NC: ok) ;
; (CY: end of file) ;
; (ZR: CR or LF) ;
; si (next pointer) ;
; ERROR : error_05 ;
; BREAK : flags ;
; ;
;-----------------------------------------------;
get_char: cmp si, offset read_buffer + 1000h
end_of_read_buffer equ $-2
jnc get_char_4
get_char_1: lodsb
cmp al, 0ah
jnz get_char_2
inc line_number_low
cmp line_number_low, 10000d
jnz get_char_2
mov line_number_low, 0
inc line_number_high
get_char_2:
lf_flag_patch_2:
cmp al, 0ah
jz get_char_3
cmp al, 0dh
get_char_3: clc
ret
get_char_4: push ax
push bx
push cx
push dx
cmp byte ptr lf_flag, 0
jz get_char_5
push di
mov si, offset read_buffer + 0f00h
mov di, offset pre_read_buffer
mov cx, 256d / 2
rep movsw
sub word ptr save_pos, 1000h
pop di
get_char_5: mov dx, offset read_buffer
mov cx, 1000h
call _read
mov si, offset read_buffer
jc error_05
add ax, si
mov word ptr end_of_read_buffer, ax
cmp ax, si
pop dx
pop cx
pop bx
pop ax
jnz get_char_1
stc
ret
;-----------------------------------------------;
; ;
; _get_frame ;
; ;
; INPUT : NON ;
; OUTPUT: ? ;
; ERROR : ? ;
; BREAK : flags, ax, bx, cx, dx, si, di, bp, ?
; ;
;-----------------------------------------------;
_get_frame: mov si, offset read_buffer + 1000h
save_si equ $-2
get_frame:
lf_flag_patch_1:
call restore_position
@@get_char
mov di, offset work_work
xor dl, dl
cmp al, '#'
jz decode_7bit
cmp al, '!'
jz decode_13bit
cmp byte ptr type_flag, 's'
jz decode_15bit
cmp al, '!'+80h
jz decode_13bit
cmp byte ptr type_flag, 0
jz get_frame
cmp byte ptr type_flag, '7'
jz decode_13bit
cmp byte ptr type_flag, 'n'
jz decode_14bit
decode_7bit: @@decode_7bit
get_frame_1: @@crc_check
jnz get_frame
get_frame_2: mov word ptr save_si, si
dec si
mov save_pos, si
mov si, line_number_low
mov line_number_low_save, si
mov si, line_number_high
mov line_number_high_save, si
ret
decode_13bit: @@decode_13bit
jmp get_frame_1
decode_14bit: @@decode_14bit
jmp get_frame_1
decode_15bit: @@decode_15bit
jmp get_frame_1
;-----------------------------------------------;
; ;
; disp_number ;
; ;
; INPUT : ax (number low word) ;
; dx (number high word) ;
; OUTPUT: NON ;
; ERROR : NON ;
; BREAK : ax, dx, flags ;
; ;
;-----------------------------------------------;
disp_number: push bx
push cx
push ax
push dx
@@dispchr '['
mov dh, '0'
mov cx, 2
disp_number_1: pop ax
push cx
mov cx, 4
next_digit: mov dl, '0'
compare_num: cmp ax, 1000d
jc disp_number_2
sub ax, 1000d
inc dl
jmp compare_num
;
disp_number_2: cmp dl, 30h
jnz disp_number_3
cmp dh, 30h
jz disp_number_4
disp_number_3: push ax
push dx
@@dispchr dl
pop dx
pop ax
disp_number_4: or dh, dl
add ax, ax
mov bx, ax
add ax, ax
add ax, ax
add ax, bx
loop next_digit
pop cx
loop disp_number_1
@@display msg_br2
pop cx
pop bx
ret
;-----------------------------------------------;
; ;
; disp_number2 ;
; ;
; INPUT : ax (number low word) ;
; dx (number high word) ;
; di (write buffer pointer) ;
; OUTPUT: di (next write buffer pointer) ;
; ERROR : NON ;
; BREAK : ax, dx, flags ;
; ;
;-----------------------------------------------;
disp_number2: push bx
push cx
push ax
push dx
mov dh, '0'
mov cx, 2
disp_number2_1: pop ax
push cx
mov cx, 4
next_digit2: mov dl, '0'
compare_num2: cmp ax, 1000d
jc disp_number2_2
sub ax, 1000d
inc dl
jmp compare_num2
;
disp_number2_2: cmp dl, 30h
jnz disp_number2_3
cmp dh, 30h
jz disp_number2_4
disp_number2_3: mov [di], dl
inc di
disp_number2_4: or dh, dl
add ax, ax
mov bx, ax
add ax, ax
add ax, ax
add ax, bx
loop next_digit2
pop cx
loop disp_number2_1
pop cx
pop bx
ret
;-----------------------------------------------;
; ;
; disp_fname ;
; ;
; INPUT : si ;
; OUTPUT: NON ;
; ERROR : NON ;
; BREAK : ax, cx, dl, si ;
; ;
;-----------------------------------------------;
disp_fname: mov cx, 12d
mov ah, 0
disp_fname_1: call lodsb_tolower_new
@@dispchr al
loop disp_fname_1
ret
;-----------------------------------------------;
; ;
; rename_extension ;
; ;
; INPUT : al ('0': rename to 000..999) ;
; ('#': rename to #00..#99) ;
; OUTPUT: NON ;
; ERROR : ZR ;
; BREAK : flags, al, cx, si, di ;
; ;
;-----------------------------------------------;
rename_extension:
cmp byte ptr renamed_flag, al
jz increment_extension
@@rename_extension_to_000
or al, al ; clear ZR flag
ret
increment_extension:
@@increment_extension
ret
;-----------------------------------------------;
; ;
; cmpfile_or_outputfile_open ;
; ;
; INPUT : NON ;
; OUTPUT: ? ;
; ERROR : skip_other_os_file, ? ;
; BREAK : ? ;
; ;
;-----------------------------------------------;
cmpfile_or_outputfile_open:
cmp byte ptr _dta_id, 2
jz cmpfile_or_outputfile_open_1
mov ah, 1ah
mov dx, offset _dta2
int 21h ; set DTA
mov byte ptr _dta_id, 2
cmpfile_or_outputfile_open_1:
mov byte ptr create_flag, 0
mov al, byte ptr os
mov bx, offset msdos_path
cmp al, 10h
jc check_os_4
mov bx, offset cpm_path
cmp al, 20h
jc check_os_4
mov bx, offset os9_path
cmp al, 30h
jc check_os_4
mov bx, offset unix_path
cmp al, 40h
jc check_os_4
mov bx, offset mac_path
cmp al, 50h
jc check_os_4
mov bx, offset other_os_path
cmp al, 0ffh
jc check_os_4
mov bx, offset all_os_path
check_os_4: cmp byte ptr [bx], 0
jz skip_other_os_file
mov si, bx
inc si
mov di, offset work_fcb_2
fname_copy: lodsb
or al, al
jz add_fname
stosb
jmp fname_copy
add_fname: mov si, offset work_fcb
mov cx, 9d
rep movsb
push di
cmp word ptr current_division, 0
jz add_fname_1
mov word ptr cmpfile_handler, 0
mov word ptr [di], '?#'
mov word ptr [di+2], '?'
add word ptr fsize_low, INTERMEDIATE_HEADER_SIZE
adc word ptr fsize_high, 0
mov ah, 4eh
mov dx, offset work_fcb_2
xor cx, cx
int 21h ; search first file
jc add_fname_0
jmp check_intermediate_ish_file_2
check_intermediate_ish_file_0:
mov bx, word ptr cmpfile_handler
mov ah, 3eh
int 21h ; close file
jc error_24
mov word ptr cmpfile_handler, 0
check_intermediate_ish_file_1:
mov ah, 4fh
int 21h ; search next file
jc add_fname_0
check_intermediate_ish_file_2:
mov si, offset _dta2[15h]
lodsb
and al, 1fh
jnz check_intermediate_ish_file_1
cmp byte ptr it_flag, 0
jnz check_intermediate_ish_file_3
test byte ptr date_time_flag, 1
jz check_intermediate_ish_file_3
lodsw
cmp ax, word ptr date_time_flag[1]
jnz check_intermediate_ish_file_1
lodsw
cmp ax, word ptr date_time_flag[3]
jnz check_intermediate_ish_file_1
check_intermediate_ish_file_3:
mov si, offset _dta2[1ah]
lodsw
cmp ax, word ptr fsize_low
jnz check_intermediate_ish_file_1
lodsw
cmp ax, word ptr fsize_high
jnz check_intermediate_ish_file_1
mov di, si
mov cx, 9d
mov al, '.'
repnz scasb
jnz error_24
mov si, di
pop di
push di
lodsb
stosb
cmp al, '#'
jnz error_24
lodsw
stosw
sub al, '0'
jb check_intermediate_ish_file_1
cmp al, 10d
jnb check_intermediate_ish_file_1
sub ah, '0'
jb check_intermediate_ish_file_1
cmp ah, 10d
jnb check_intermediate_ish_file_1
movsb
mov ax, 3d02h
mov dx, offset work_fcb_2
int 21h
jc error_24
mov word ptr cmpfile_handler, ax
mov bx, ax
mov ax, 4200h
mov dx, word ptr length_low_org
mov cx, word ptr length_high_org
int 21h
jc error_24
mov dx, offset write_buffer
mov cx, INTERMEDIATE_HEADER_SIZE
mov si, dx
mov ah, 3fh
int 21h
jc error_24
mov di, offset idblock
mov cx, (offset idblock_header_copy_end - offset idblock) \
/ 2
repz cmpsw
jnz check_intermediate_ish_file_0
mov cx, (offset idblock_volume_table_end - \
offset idblock_volume_table) / 2
rep movsw
lodsw
stosw
cmp ax, length_low_org
jnz check_intermediate_ish_file_0
lodsw
stosw
cmp ax, length_high_org
jnz check_intermediate_ish_file_0
@@mark_idblock_volume_table
mov ax, word ptr cmpfile_handler
jnz error_26
mov word ptr cmpfile_handler, 0
mov write_handler, ax
mov byte ptr renamed_flag, '#'
jmp disp_renamed_fname
add_fname_0: cmp ax, 12h
jnz error_24
sub word ptr fsize_low, INTERMEDIATE_HEADER_SIZE
sbb word ptr fsize_high, 0
add_fname_1: pop di
push di
cmp word ptr cmpfile_handler, 0
jnz cmp_ng_2
mov si, offset work_fcb[9d]
mov cx, 4d
rep movsb
mov ah, 4eh
mov cx, 1fh
mov dx, offset work_fcb_2
search_file: int 21h
jb file_not_found
cmp byte ptr renamed_flag, '?'
jnz make_cmp_table_2
mov di, offset _dta2[1eh]
mov al, '.'
mov cx, 9d
repnz scasb
jnz cmp_ng_3
mov si, di
xor cx, cx
pop di
push di
lodsb
stosb
mov bx, offset cmp_table_2
cmp al, '#'
jz make_cmp_table_1
sub al, '0'
jb cmp_ng_3
cmp al, 10d
jnb cmp_ng_3
mov bx, offset cmp_table
cbw
add ax, ax
add ax, ax
mov cx, ax
add ax, ax
add ax, ax
add ax, ax
add cx, ax
add ax, ax
add cx, ax
make_cmp_table_1:
lodsw
stosw
sub al, '0'
jb cmp_ng_3
cmp al, 10d
jnb cmp_ng_3
sub ah, '0'
jb cmp_ng_3
cmp ah, 10d
jnb cmp_ng_3
add al, al
add ah, al
add al, al
add al, al
add al, ah
mov ah, 0
add ax, cx
mov cl, 8
div cl
mov cl, ah
cbw
add bx, ax
mov al, 1
shl al, cl
or byte ptr [bx], al
cmp bx, offset cmp_table_2
jnb cmp_ng_3
make_cmp_table_2:
mov si, offset _dta2[15h]
lodsb
and al, 18h
jnz cmp_ng_3
cmp byte ptr it_flag, 0
jnz not_date_time_cmp
test byte ptr date_time_flag, 1
jz not_date_time_cmp
lodsw
cmp ax, word ptr date_time_flag[1]
jnz cmp_ng_3
lodsw
cmp ax, word ptr date_time_flag[3]
jnz cmp_ng_3
not_date_time_cmp:
mov si, offset _dta2[1ah]
lodsw
cmp ax, word ptr fsize_low
jnz cmp_ng_3
lodsw
cmp ax, word ptr fsize_high
jnz cmp_ng_3
mov ax, 3d00h
mov dx, offset work_fcb_2
int 21h
jc error_24
mov word ptr cmpfile_handler, ax
test byte ptr date_time_flag, 0ch
jz disp_renamed_fname_0
mov ax, word ptr fsize_low
mov dx, word ptr fsize_high
mov bx, word ptr cmpfile_handler
call calc_crc_of_file
jc error_05
test byte ptr date_time_flag, 4d
jz cmp_crc_32
cmp bp, word ptr crc_16
jnz cmp_ng_1
cmp_crc_32: test byte ptr date_time_flag, 8d
cmp ax, word ptr crc_32
jnz cmp_ng_1
cmp dx, word ptr crc_32[2]
jnz cmp_ng_1
mov ax, 4200h
xor cx, cx
xor dx, dx
int 21h ; move file pointer (rewind)
jc error_05
disp_renamed_fname_0:
cmp word ptr max_division, 0
mov ax, word ptr cmpfile_handler
jnz error_26
jmp disp_renamed_fname
cmp_ng_1: mov bx, word ptr cmpfile_handler
mov ah, 3eh
int 21h ; close file
jc error_24
cmp_ng_2: mov word ptr cmpfile_handler, 0
cmp_ng_3: mov ax, 4f3fh
cmp byte ptr renamed_flag, al
jz search_file
mov byte ptr renamed_flag, al
mov byte ptr work_fcb[9d], al
mov word ptr work_fcb[10d], '??'
mov di, offset cmp_table
mov cx, (125d + 13d) /2
xor ax, ax
rep stosw
jmp add_fname_1
file_not_found: cmp ax, 12h
jnz error_08
cmp byte ptr renamed_flag, '?'
jz check_disk_free_space_0
cmp word ptr max_division, 0
jnz cmp_ng_3
jmp check_disk_free_space_5
check_disk_free_space_0:
mov di, offset cmp_table
mov cx, 63d
cmp word ptr max_division, 0
jz check_disk_free_space_1
mov cx, 7d
mov di, offset cmp_table_2
check_disk_free_space_1:
mov si, di
mov ax, 0ffffh
repz scasw
jz error_08
sub di, 2
mov ax, word ptr [di]
sub di, si
mov cx, 8ffh
check_disk_free_space_2:
inc cl
shr ax, 1
jc check_disk_free_space_2
mov ax, di
mul ch
xor ch, ch
add ax, cx
pop di
push di
mov byte ptr [di], '#'
cmp byte ptr max_division, 0
jnz check_disk_free_space_4
cmp ax, 1000d
jnb error_08
mov byte ptr [di], '0'
check_disk_free_space_3:
cmp ax, 100d
jb check_disk_free_space_4
sub ax, 100d
inc byte ptr [di]
jmp check_disk_free_space_3
check_disk_free_space_4:
inc di
cmp ax, 100d
jnb error_08
mov cl, 10d
div cl
add ax, 3030h
stosw
check_disk_free_space_5:
cmp word ptr max_division, 0
jz check_disk_free_space
mov byte ptr renamed_flag, '#'
add word ptr fsize_low, INTERMEDIATE_HEADER_SIZE
adc word ptr fsize_high, 0
xor ax, ax
mov di, offset idblock_volume_table
mov cx, (offset idblock_volume_table_end - \
offset idblock_volume_table ) / 2
rep stosw
mov ax, length_low_org
stosw
mov ax, length_high_org
stosw
@@mark_idblock_volume_table
check_disk_free_space:
mov si, offset work_fcb_2
mov ax, [si]
cmp byte ptr dos_version, 3
jc skip_subst_check
mov di, offset work_fcb_3
mov ah, 60h
int 21h
mov ax, word ptr work_fcb_3
skip_subst_check:
xor dl, dl
cmp ah, ':'
jnz skip_get_drive_name ; current drive
call tolower
sub al, 60h
mov dl, al
skip_get_drive_name:
mov ah, 36h
int 21h ; get disk free space
cmp ax, 0ffffh
jz error_08
mul cx
mul bx
sub ax, word ptr fsize_low
sbb dx, word ptr fsize_high
jc error_16
mov ah, 3ch
mov dx, offset work_fcb_2
xor cx, cx
int 21h ; create restore file
jc error_08
mov write_handler, ax
mov byte ptr create_flag, 0ffh
disp_renamed_fname:
pop si
cmp byte ptr renamed_flag, 0
jz disp_renamed_fname_2
lodsb
mov byte ptr work_fcb[9d], al
lodsw
mov word ptr work_fcb[10d], ax
disp_renamed_fname_2:
cmp current_division, 0
jz disp_renamed_fname_1
mov ax, 4200h
mov bx, write_handler
mov dx, word ptr division_offset_low
mov cx, word ptr division_offset_high
int 21h ; move file pointer (positioning)
jc error_09
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
disp_renamed_fname_1:
@@disp_renamed_fname
ret
;-----------------------------------------------;
; ;
; copy_fname_fcb_to_buffer ;
; ;
; INPUT : ? ;
; OUTPUT: ? ;
; ERROR : ? ;
; BREAK : ? ;
; ;
;-----------------------------------------------;
copy_fname_fcb_to_buffer:
mov cx, 8
mov ah, 0
copy_fname_fcb_to_buffer_1:
call lodsb_tolower_new
cmp al, ' '
jz copy_fname_fcb_to_buffer_2
stosb
loop copy_fname_fcb_to_buffer_1
inc cx
copy_fname_fcb_to_buffer_2:
dec cx
add si, cx
mov cx, 4
mov ah, 0
copy_fname_fcb_to_buffer_3:
call lodsb_tolower_new
cmp al, ' '
jz copy_fname_fcb_to_buffer_ret
stosb
loop copy_fname_fcb_to_buffer_3
copy_fname_fcb_to_buffer_ret:
ret
;-----------------------------------------------;
; ;
; disp_error_number ;
; ;
; INPUT : NON ;
; OUTPUT: NON ;
; ERROR : NON ;
; BREAK : flags, ax, dl, di ;
; ;
;-----------------------------------------------;
disp_error_number:
mov al, error_count
add al, 30h
cmp al, 30h
jnz disp_error_number_1
mov al, 'o'
;-----------------------------------------------;
; ;
; disp_error_number2 ;
; ;
; INPUT : NON ;
; OUTPUT: NON ;
; ERROR : NON ;
; BREAK : flags, ax, dl, di ;
; ;
;-----------------------------------------------;
disp_error_number2:
disp_error_number_1:
mov di, word ptr block_number_ptr
cmp byte ptr [di], '.'
jz disp_error_number_2
mov si, word ptr block_number_begin
mov di, si
inc si
mov cx, offset display_buffer[79]
sub cx, di
rep movsb
dec word ptr block_number_ptr
disp_error_number_2:
stosb
inc word ptr block_number_ptr
;-----------------------------------------------;
; ;
; draw_display_buffer: ;
; ;
; INPUT : NON ;
; OUTPUT: NON ;
; ERROR : NON ;
; BREAK : ax, cx, dl, si, flags ;
; ;
;-----------------------------------------------;
draw_display_buffer:
@@dispstr2 display_buffer, 80d
mov cx, word ptr line_number_ptr
sub cx, offset display_buffer - 1
@@dispstr2 display_buffer, cx
ret