home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / ms_dos / ish / ish200s / makehsi.asm < prev    next >
Assembly Source File  |  1990-06-14  |  20KB  |  950 lines

  1. ;
  2. ;        ish file converter for MS-DOS  Ver 2.00 (90/3/27)
  3. ;
  4. ;
  5. ;        Copyright (c) 1986, 1987, 1989, 1990  by  M. ishizuka
  6. ;        All rights reserved.
  7. ;
  8.  
  9.  
  10.  
  11. ;-----------------------------------------------;
  12. ;                        ;
  13. ;    seq_new                    ;
  14. ;                        ;
  15. ;    INPUT :    NON                ;
  16. ;    OUTPUT: NON                ;
  17. ;    ERROR :    error_14_2            ;
  18. ;    BREAK : flags, ?            ;
  19. ;                        ;
  20. ;-----------------------------------------------;
  21.  
  22. seq_new:    push    ax
  23.         mov    al, seq_old
  24.         inc    al
  25.         cmp    al, byte ptr para_67_61
  26.         jb    seq_new_3
  27.         cmp    al, byte ptr para_69_63
  28.         jb    seq_new_5
  29.         @@chk_table
  30.         cmp    word ptr end_length, 0
  31.         jnz    seq_new_exit
  32.         mov    al, 1
  33. seq_new_3:    cmp    word ptr end_length, 0
  34.         jnz    seq_new_6
  35.         push    ax
  36.         mov    ax, word ptr end_length2
  37.         or    ax, ax
  38.         jz    seq_new_3_1
  39.         add    ax, 2
  40.         cmp    ax, word ptr para_66$66_60$60
  41.         jbe    seq_new_3_2
  42.         mov    word ptr end_length2, 0
  43.         sub    ax, word ptr para_66$66_60$60
  44.         jmp    seq_new_3_2
  45.  
  46. seq_new_3_1:    mov    ax, word ptr para_66_60
  47.         sub    length_low, ax
  48.         sbb    length_high, 0d
  49.         pop    ax
  50.         jnc    seq_new_5
  51.         push    ax
  52.         mov    ah, byte ptr para_66_60
  53.         mul    ah
  54.         add    ax, word ptr length_low
  55.         inc    ax
  56.         mov    word ptr end_length2, ax
  57.         inc    ax
  58.         inc    ax
  59.         cmp    length_low, -2
  60.         jnc    seq_new_4_2
  61. seq_new_3_2:    mov    word ptr end_length, ax
  62.         pop    ax
  63.         push    ax
  64.         push    bx
  65.         push    cx
  66.         push    di
  67.         mov    bl, al
  68.         mov    ah, byte ptr para_69_63
  69.         mul    ah
  70.         mov    di, ax
  71.         add    di, offset work_table
  72. seq_new_4:    inc    bl
  73.         cmp    bl, byte ptr para_67_61
  74.         jnb    seq_new_4_1
  75.         mov    al, bl
  76.         stosb
  77.         xor    ax, ax
  78.         mov    cx, para_34_31
  79.         rep    stosw
  80.         jmp    seq_new_4
  81.  
  82. seq_new_4_1:    pop    di
  83.         pop    cx
  84.         pop    bx
  85. seq_new_4_2:    pop    ax
  86. seq_new_5:    mov    seq_old, al
  87.         @@increment_line_number
  88.         pop    ax
  89.         ret
  90.  
  91. seq_new_6:    mov    al, byte ptr para_67_61
  92.         jmp    seq_new_5
  93.  
  94. seq_new_exit:    pop    ax
  95.         pop    bx            ; pop return address
  96.         jmp    error_14_2
  97.  
  98.  
  99.  
  100. ;-----------------------------------------------;
  101. ;                        ;
  102. ;    restore_position            ;
  103. ;                        ;
  104. ;    INPUT :    NON                ;
  105. ;    OUTPUT: NON                ;
  106. ;    ERROR :    NON                ;
  107. ;    BREAK : flags, ax, si            ;
  108. ;                        ;
  109. ;-----------------------------------------------;
  110.  
  111. restore_position:
  112.         mov    si, save_pos
  113.         inc    si
  114.         cmp    byte ptr [si-1], 0ah
  115.         mov    save_pos, si
  116.         mov    ax, line_number_low_save
  117.         jnz    restore_position_1
  118.         inc    ax
  119. restore_position_1:
  120.         mov    line_number_low, ax
  121.         mov    line_number_low_save, ax
  122.         cmp    ax, 010000d
  123.         mov    ax, line_number_high_save
  124.         jnz    restore_position_2
  125.         mov    word ptr line_number_low, 0
  126.         mov    word ptr line_number_low_save, 0
  127.         inc    ax
  128. restore_position_2:
  129.         mov    line_number_high, ax
  130.         mov    line_number_high_save, ax
  131.         ret
  132.  
  133.  
  134.  
  135. ;-----------------------------------------------;
  136. ;                        ;
  137. ;    get_char                ;
  138. ;                        ;
  139. ;    INPUT :    si (get character pointer)    ;
  140. ;    OUTPUT: al (character)            ;
  141. ;        flags (NC: ok)            ;
  142. ;              (CY: end of file)        ;
  143. ;              (ZR: CR or LF)        ;
  144. ;        si (next pointer)        ;
  145. ;    ERROR :    error_05            ;
  146. ;    BREAK : flags                ;
  147. ;                        ;
  148. ;-----------------------------------------------;
  149.  
  150. get_char:    cmp    si, offset read_buffer + 1000h
  151. end_of_read_buffer equ    $-2
  152.         jnc    get_char_4
  153. get_char_1:    lodsb
  154.         cmp    al, 0ah
  155.         jnz    get_char_2
  156.         inc    line_number_low
  157.         cmp    line_number_low, 10000d
  158.         jnz    get_char_2
  159.         mov    line_number_low, 0
  160.         inc    line_number_high
  161. get_char_2:
  162. lf_flag_patch_2:
  163.         cmp    al, 0ah
  164.         jz    get_char_3
  165.         cmp    al, 0dh
  166. get_char_3:    clc
  167.         ret
  168.  
  169. get_char_4:    push    ax
  170.         push    bx
  171.         push    cx
  172.         push    dx
  173.         cmp    byte ptr lf_flag, 0
  174.         jz    get_char_5
  175.         push    di
  176.         mov    si, offset read_buffer + 0f00h
  177.         mov    di, offset pre_read_buffer
  178.         mov    cx, 256d / 2
  179.         rep    movsw
  180.         sub    word ptr save_pos, 1000h
  181.         pop    di
  182. get_char_5:    mov    dx, offset read_buffer
  183.         mov    cx, 1000h
  184.         call    _read
  185.         mov    si, offset read_buffer
  186.         jc    error_05
  187.         add    ax, si
  188.         mov    word ptr end_of_read_buffer, ax
  189.         cmp    ax, si
  190.         pop    dx
  191.         pop    cx
  192.         pop    bx
  193.         pop    ax
  194.         jnz    get_char_1
  195.         stc
  196.         ret
  197.  
  198.  
  199.  
  200. ;-----------------------------------------------;
  201. ;                        ;
  202. ;    _get_frame                ;
  203. ;                        ;
  204. ;    INPUT :    NON                ;
  205. ;    OUTPUT: ?                ;
  206. ;    ERROR :    ?                ;
  207. ;    BREAK : flags, ax, bx, cx, dx, si, di, bp, ?
  208. ;                        ;
  209. ;-----------------------------------------------;
  210.  
  211. _get_frame:    mov    si, offset read_buffer + 1000h
  212. save_si        equ    $-2
  213. get_frame:
  214. lf_flag_patch_1:
  215.         call    restore_position
  216.         @@get_char
  217.         mov    di, offset work_work
  218.         xor    dl, dl
  219.         cmp    al, '#'
  220.         jz    decode_7bit
  221.         cmp    al, '!'
  222.         jz    decode_13bit
  223.         cmp    byte ptr type_flag, 's'
  224.         jz    decode_15bit
  225.         cmp    al, '!'+80h
  226.         jz    decode_13bit
  227.         cmp    byte ptr type_flag, 0
  228.         jz    get_frame
  229.         cmp    byte ptr type_flag, '7'
  230.         jz    decode_13bit
  231.         cmp    byte ptr type_flag, 'n'
  232.         jz    decode_14bit
  233. decode_7bit:    @@decode_7bit
  234. get_frame_1:    @@crc_check
  235.         jnz    get_frame
  236. get_frame_2:    mov    word ptr save_si, si
  237.         dec    si
  238.         mov    save_pos, si
  239.         mov    si, line_number_low
  240.         mov    line_number_low_save, si
  241.         mov    si, line_number_high
  242.         mov    line_number_high_save, si
  243.         ret
  244.  
  245. decode_13bit:    @@decode_13bit
  246.         jmp    get_frame_1
  247.  
  248. decode_14bit:    @@decode_14bit
  249.         jmp    get_frame_1
  250.  
  251. decode_15bit:    @@decode_15bit
  252.         jmp    get_frame_1
  253.  
  254.  
  255.  
  256. ;-----------------------------------------------;
  257. ;                        ;
  258. ;    disp_number                ;
  259. ;                        ;
  260. ;    INPUT :    ax (number low word)        ;
  261. ;        dx (number high word)        ;
  262. ;    OUTPUT:    NON                ;
  263. ;    ERROR :    NON                ;
  264. ;    BREAK :    ax, dx, flags            ;
  265. ;                        ;
  266. ;-----------------------------------------------;
  267.  
  268. disp_number:    push    bx
  269.         push    cx
  270.         push    ax
  271.         push    dx
  272.         @@dispchr    '['
  273.         mov    dh, '0'
  274.         mov    cx, 2
  275. disp_number_1:    pop    ax
  276.         push    cx
  277.         mov    cx, 4
  278. next_digit:    mov    dl, '0'
  279. compare_num:    cmp    ax, 1000d
  280.         jc    disp_number_2
  281.         sub    ax, 1000d
  282.         inc    dl
  283.         jmp    compare_num
  284. ;
  285. disp_number_2:    cmp    dl, 30h
  286.         jnz    disp_number_3
  287.         cmp    dh, 30h
  288.         jz    disp_number_4
  289. disp_number_3:    push    ax
  290.         push    dx
  291.         @@dispchr    dl
  292.         pop    dx
  293.         pop    ax
  294. disp_number_4:    or    dh, dl
  295.         add    ax, ax
  296.         mov    bx, ax
  297.         add    ax, ax
  298.         add    ax, ax
  299.         add    ax, bx
  300.         loop    next_digit
  301.         pop    cx
  302.         loop    disp_number_1
  303.         @@display    msg_br2
  304.         pop    cx
  305.         pop    bx
  306.         ret
  307.  
  308.  
  309.  
  310. ;-----------------------------------------------;
  311. ;                        ;
  312. ;    disp_number2                ;
  313. ;                        ;
  314. ;    INPUT :    ax (number low word)        ;
  315. ;        dx (number high word)        ;
  316. ;        di (write buffer pointer)    ;
  317. ;    OUTPUT:    di (next write buffer pointer)    ;
  318. ;    ERROR :    NON                ;
  319. ;    BREAK :    ax, dx, flags            ;
  320. ;                        ;
  321. ;-----------------------------------------------;
  322.  
  323. disp_number2:    push    bx
  324.         push    cx
  325.         push    ax
  326.         push    dx
  327.         mov    dh, '0'
  328.         mov    cx, 2
  329. disp_number2_1:    pop    ax
  330.         push    cx
  331.         mov    cx, 4
  332. next_digit2:    mov    dl, '0'
  333. compare_num2:    cmp    ax, 1000d
  334.         jc    disp_number2_2
  335.         sub    ax, 1000d
  336.         inc    dl
  337.         jmp    compare_num2
  338. ;
  339. disp_number2_2:    cmp    dl, 30h
  340.         jnz    disp_number2_3
  341.         cmp    dh, 30h
  342.         jz    disp_number2_4
  343. disp_number2_3:    mov    [di], dl
  344.         inc    di
  345. disp_number2_4:    or    dh, dl
  346.         add    ax, ax
  347.         mov    bx, ax
  348.         add    ax, ax
  349.         add    ax, ax
  350.         add    ax, bx
  351.         loop    next_digit2
  352.         pop    cx
  353.         loop    disp_number2_1
  354.         pop    cx
  355.         pop    bx
  356.         ret
  357.  
  358.  
  359.  
  360. ;-----------------------------------------------;
  361. ;                        ;
  362. ;    disp_fname                ;
  363. ;                        ;
  364. ;    INPUT :    si                ;
  365. ;    OUTPUT:    NON                ;
  366. ;    ERROR :    NON                ;
  367. ;    BREAK :    ax, cx, dl, si            ;
  368. ;                        ;
  369. ;-----------------------------------------------;
  370.  
  371. disp_fname:    mov    cx, 12d
  372.         mov    ah, 0
  373. disp_fname_1:    call    lodsb_tolower_new
  374.         @@dispchr    al
  375.         loop    disp_fname_1
  376.         ret
  377.  
  378.  
  379.  
  380. ;-----------------------------------------------;
  381. ;                        ;
  382. ;    rename_extension            ;
  383. ;                        ;
  384. ;    INPUT :    al ('0': rename to 000..999)    ;
  385. ;           ('#': rename to #00..#99)    ;
  386. ;    OUTPUT:    NON                ;
  387. ;    ERROR :    ZR                ;
  388. ;    BREAK :    flags, al, cx, si, di        ;
  389. ;                        ;
  390. ;-----------------------------------------------;
  391.  
  392. rename_extension:
  393.         cmp    byte ptr renamed_flag, al
  394.         jz    increment_extension
  395.         @@rename_extension_to_000
  396.         or    al, al            ; clear ZR flag
  397.         ret
  398.  
  399. increment_extension:
  400.         @@increment_extension
  401.         ret
  402.  
  403.  
  404.  
  405. ;-----------------------------------------------;
  406. ;                        ;
  407. ;    cmpfile_or_outputfile_open        ;
  408. ;                        ;
  409. ;    INPUT :    NON                ;
  410. ;    OUTPUT:    ?                ;
  411. ;    ERROR :    skip_other_os_file, ?        ;
  412. ;    BREAK :    ?                ;
  413. ;                        ;
  414. ;-----------------------------------------------;
  415.  
  416. cmpfile_or_outputfile_open:
  417.         cmp    byte ptr _dta_id, 2
  418.         jz    cmpfile_or_outputfile_open_1
  419.         mov    ah, 1ah
  420.         mov    dx, offset _dta2
  421.         int    21h            ; set DTA
  422.         mov    byte ptr _dta_id, 2
  423. cmpfile_or_outputfile_open_1:
  424.         mov    byte ptr create_flag, 0
  425.         mov    al, byte ptr os
  426.         mov    bx, offset msdos_path
  427.         cmp    al, 10h
  428.         jc    check_os_4
  429.         mov    bx, offset cpm_path
  430.         cmp    al, 20h
  431.         jc    check_os_4
  432.         mov    bx, offset os9_path
  433.         cmp    al, 30h
  434.         jc    check_os_4
  435.         mov    bx, offset unix_path
  436.         cmp    al, 40h
  437.         jc    check_os_4
  438.         mov    bx, offset mac_path
  439.         cmp    al, 50h
  440.         jc    check_os_4
  441.         mov    bx, offset other_os_path
  442.         cmp    al, 0ffh
  443.         jc    check_os_4
  444.         mov    bx, offset all_os_path
  445. check_os_4:    cmp    byte ptr [bx], 0
  446.         jz    skip_other_os_file
  447.         mov    si, bx
  448.         inc    si
  449.         mov    di, offset work_fcb_2
  450. fname_copy:    lodsb
  451.         or    al, al
  452.         jz    add_fname
  453.         stosb
  454.         jmp    fname_copy
  455.  
  456. add_fname:    mov    si, offset work_fcb
  457.         mov    cx, 9d
  458.         rep    movsb
  459.         push    di
  460.         cmp    word ptr current_division, 0
  461.         jz    add_fname_1
  462.         mov    word ptr cmpfile_handler, 0
  463.         mov    word ptr [di], '?#'
  464.         mov    word ptr [di+2], '?'
  465.         add    word ptr fsize_low, INTERMEDIATE_HEADER_SIZE
  466.         adc    word ptr fsize_high, 0
  467.         mov    ah, 4eh
  468.         mov    dx, offset work_fcb_2
  469.         xor    cx, cx
  470.         int    21h            ; search first file
  471.         jc    add_fname_0
  472.         jmp    check_intermediate_ish_file_2
  473.  
  474. check_intermediate_ish_file_0:
  475.         mov    bx, word ptr cmpfile_handler
  476.         mov    ah, 3eh
  477.         int    21h            ; close file
  478.         jc    error_24
  479.         mov    word ptr cmpfile_handler, 0
  480. check_intermediate_ish_file_1:
  481.         mov    ah, 4fh
  482.         int    21h            ; search next file
  483.         jc    add_fname_0
  484. check_intermediate_ish_file_2:
  485.         mov    si, offset _dta2[15h]
  486.         lodsb
  487.         and    al, 1fh
  488.         jnz    check_intermediate_ish_file_1
  489.         cmp    byte ptr it_flag, 0
  490.         jnz    check_intermediate_ish_file_3
  491.         test    byte ptr date_time_flag, 1
  492.         jz    check_intermediate_ish_file_3
  493.         lodsw
  494.         cmp    ax, word ptr date_time_flag[1]
  495.         jnz    check_intermediate_ish_file_1
  496.         lodsw
  497.         cmp    ax, word ptr date_time_flag[3]
  498.         jnz    check_intermediate_ish_file_1
  499. check_intermediate_ish_file_3:
  500.         mov    si, offset _dta2[1ah]
  501.         lodsw
  502.         cmp    ax, word ptr fsize_low
  503.         jnz    check_intermediate_ish_file_1
  504.         lodsw
  505.         cmp    ax, word ptr fsize_high
  506.         jnz    check_intermediate_ish_file_1
  507.         mov    di, si
  508.         mov    cx, 9d
  509.         mov    al, '.'
  510.         repnz    scasb
  511.         jnz    error_24
  512.         mov    si, di
  513.         pop    di
  514.         push    di
  515.         lodsb
  516.         stosb
  517.         cmp    al, '#'
  518.         jnz    error_24
  519.         lodsw
  520.         stosw
  521.         sub    al, '0'
  522.         jb    check_intermediate_ish_file_1
  523.         cmp    al, 10d
  524.         jnb    check_intermediate_ish_file_1
  525.         sub    ah, '0'
  526.         jb    check_intermediate_ish_file_1
  527.         cmp    ah, 10d
  528.         jnb    check_intermediate_ish_file_1
  529.         movsb
  530.         mov    ax, 3d02h
  531.         mov    dx, offset work_fcb_2
  532.         int    21h
  533.         jc    error_24
  534.         mov    word ptr cmpfile_handler, ax
  535.         mov    bx, ax
  536.         mov    ax, 4200h
  537.         mov    dx, word ptr length_low_org
  538.         mov    cx, word ptr length_high_org
  539.         int    21h
  540.         jc    error_24
  541.         mov    dx, offset write_buffer
  542.         mov    cx, INTERMEDIATE_HEADER_SIZE
  543.         mov    si, dx
  544.         mov    ah, 3fh
  545.         int    21h
  546.         jc    error_24
  547.         mov    di, offset idblock
  548.         mov    cx, (offset idblock_header_copy_end - offset idblock) \
  549.                 / 2
  550.         repz    cmpsw
  551.         jnz    check_intermediate_ish_file_0
  552.         mov    cx, (offset idblock_volume_table_end - \
  553.                  offset idblock_volume_table) / 2
  554.         rep    movsw
  555.         lodsw
  556.         stosw
  557.         cmp    ax, length_low_org
  558.         jnz    check_intermediate_ish_file_0
  559.         lodsw
  560.         stosw
  561.         cmp    ax, length_high_org
  562.         jnz    check_intermediate_ish_file_0
  563.         @@mark_idblock_volume_table
  564.         mov    ax, word ptr cmpfile_handler
  565.         jnz    error_26
  566.         mov    word ptr cmpfile_handler, 0
  567.         mov    write_handler, ax
  568.         mov    byte ptr renamed_flag, '#'
  569.         jmp    disp_renamed_fname
  570.  
  571. add_fname_0:    cmp    ax, 12h
  572.         jnz    error_24
  573.         sub    word ptr fsize_low, INTERMEDIATE_HEADER_SIZE
  574.         sbb    word ptr fsize_high, 0
  575. add_fname_1:    pop    di
  576.         push    di
  577.         cmp    word ptr cmpfile_handler, 0
  578.         jnz    cmp_ng_2
  579.         mov    si, offset work_fcb[9d]
  580.         mov    cx, 4d
  581.         rep    movsb
  582.         mov    ah, 4eh
  583.         mov    cx, 1fh
  584.         mov    dx, offset work_fcb_2
  585. search_file:    int    21h
  586.         jb    file_not_found
  587.         cmp    byte ptr renamed_flag, '?'
  588.         jnz    make_cmp_table_2
  589.         mov    di, offset _dta2[1eh]
  590.         mov    al, '.'
  591.         mov    cx, 9d
  592.         repnz    scasb
  593.         jnz    cmp_ng_3
  594.         mov    si, di
  595.         xor    cx, cx
  596.         pop    di
  597.         push    di
  598.         lodsb
  599.         stosb
  600.         mov    bx, offset cmp_table_2
  601.         cmp    al, '#'
  602.         jz    make_cmp_table_1
  603.         sub    al, '0'
  604.         jb    cmp_ng_3
  605.         cmp    al, 10d
  606.         jnb    cmp_ng_3
  607.         mov    bx, offset cmp_table
  608.         cbw
  609.         add    ax, ax
  610.         add    ax, ax
  611.         mov    cx, ax
  612.         add    ax, ax
  613.         add    ax, ax
  614.         add    ax, ax
  615.         add    cx, ax
  616.         add    ax, ax
  617.         add    cx, ax
  618. make_cmp_table_1:
  619.         lodsw
  620.         stosw
  621.         sub    al, '0'
  622.         jb    cmp_ng_3
  623.         cmp    al, 10d
  624.         jnb    cmp_ng_3
  625.         sub    ah, '0'
  626.         jb    cmp_ng_3
  627.         cmp    ah, 10d
  628.         jnb    cmp_ng_3
  629.         add    al, al
  630.         add    ah, al
  631.         add    al, al
  632.         add    al, al
  633.         add    al, ah
  634.         mov    ah, 0
  635.         add    ax, cx
  636.         mov    cl, 8
  637.         div    cl
  638.         mov    cl, ah
  639.         cbw
  640.         add    bx, ax
  641.         mov    al, 1
  642.         shl    al, cl
  643.         or    byte ptr [bx], al
  644.         cmp    bx, offset cmp_table_2
  645.         jnb    cmp_ng_3
  646. make_cmp_table_2:
  647.         mov    si, offset _dta2[15h]
  648.         lodsb
  649.         and    al, 18h
  650.         jnz    cmp_ng_3
  651.         cmp    byte ptr it_flag, 0
  652.         jnz    not_date_time_cmp
  653.         test    byte ptr date_time_flag, 1
  654.         jz    not_date_time_cmp
  655.         lodsw
  656.         cmp    ax, word ptr date_time_flag[1]
  657.         jnz    cmp_ng_3
  658.         lodsw
  659.         cmp    ax, word ptr date_time_flag[3]
  660.         jnz    cmp_ng_3
  661. not_date_time_cmp:
  662.         mov    si, offset _dta2[1ah]
  663.         lodsw
  664.         cmp    ax, word ptr fsize_low
  665.         jnz    cmp_ng_3
  666.         lodsw
  667.         cmp    ax, word ptr fsize_high
  668.         jnz    cmp_ng_3
  669.         mov    ax, 3d00h
  670.         mov    dx, offset work_fcb_2
  671.         int    21h
  672.         jc    error_24
  673.         mov    word ptr cmpfile_handler, ax
  674.         test    byte ptr date_time_flag, 0ch
  675.         jz    disp_renamed_fname_0
  676.         mov    ax, word ptr fsize_low
  677.         mov    dx, word ptr fsize_high
  678.         mov    bx, word ptr cmpfile_handler
  679.         call    calc_crc_of_file
  680.         jc    error_05
  681.         test    byte ptr date_time_flag, 4d
  682.         jz    cmp_crc_32
  683.         cmp    bp, word ptr crc_16
  684.         jnz    cmp_ng_1
  685. cmp_crc_32:    test    byte ptr date_time_flag, 8d
  686.         cmp    ax, word ptr crc_32
  687.         jnz    cmp_ng_1
  688.         cmp    dx, word ptr crc_32[2]
  689.         jnz    cmp_ng_1
  690.         mov    ax, 4200h
  691.         xor    cx, cx
  692.         xor    dx, dx
  693.         int    21h        ; move file pointer (rewind)
  694.         jc    error_05
  695. disp_renamed_fname_0:
  696.         cmp    word ptr max_division, 0
  697.         mov    ax, word ptr cmpfile_handler
  698.         jnz    error_26
  699.         jmp    disp_renamed_fname
  700.  
  701. cmp_ng_1:    mov    bx, word ptr cmpfile_handler
  702.         mov    ah, 3eh
  703.         int    21h            ; close file
  704.         jc    error_24
  705. cmp_ng_2:    mov    word ptr cmpfile_handler, 0
  706. cmp_ng_3:    mov    ax, 4f3fh
  707.         cmp    byte ptr renamed_flag, al
  708.         jz    search_file
  709.         mov    byte ptr renamed_flag, al
  710.         mov    byte ptr work_fcb[9d], al
  711.         mov    word ptr work_fcb[10d], '??'
  712.         mov    di, offset cmp_table
  713.         mov    cx, (125d + 13d) /2
  714.         xor    ax, ax
  715.         rep    stosw
  716.         jmp    add_fname_1
  717.  
  718. file_not_found:    cmp    ax, 12h
  719.         jnz    error_08
  720.         cmp    byte ptr renamed_flag, '?'
  721.         jz    check_disk_free_space_0
  722.         cmp    word ptr max_division, 0
  723.         jnz    cmp_ng_3
  724.         jmp    check_disk_free_space_5
  725.  
  726. check_disk_free_space_0:
  727.         mov    di, offset cmp_table
  728.         mov    cx, 63d
  729.         cmp    word ptr max_division, 0
  730.         jz    check_disk_free_space_1
  731.         mov    cx, 7d
  732.         mov    di, offset cmp_table_2
  733. check_disk_free_space_1:
  734.         mov    si, di
  735.         mov    ax, 0ffffh
  736.         repz    scasw
  737.         jz    error_08
  738.         sub    di, 2
  739.         mov    ax, word ptr [di]
  740.         sub    di, si
  741.         mov    cx, 8ffh
  742. check_disk_free_space_2:
  743.         inc    cl
  744.         shr    ax, 1
  745.         jc    check_disk_free_space_2
  746.         mov    ax, di
  747.         mul    ch
  748.         xor    ch, ch
  749.         add    ax, cx
  750.         pop    di
  751.         push    di
  752.         mov    byte ptr [di], '#'
  753.         cmp    byte ptr max_division, 0
  754.         jnz    check_disk_free_space_4
  755.         cmp    ax, 1000d
  756.         jnb    error_08
  757.         mov    byte ptr [di], '0'
  758. check_disk_free_space_3:
  759.         cmp    ax, 100d
  760.         jb    check_disk_free_space_4
  761.         sub    ax, 100d
  762.         inc    byte ptr [di]
  763.         jmp    check_disk_free_space_3
  764.  
  765. check_disk_free_space_4:
  766.         inc    di
  767.         cmp    ax, 100d
  768.         jnb    error_08
  769.         mov    cl, 10d
  770.         div    cl
  771.         add    ax, 3030h
  772.         stosw
  773. check_disk_free_space_5:
  774.         cmp    word ptr max_division, 0
  775.         jz    check_disk_free_space
  776.         mov    byte ptr renamed_flag, '#'
  777.         add    word ptr fsize_low, INTERMEDIATE_HEADER_SIZE
  778.         adc    word ptr fsize_high, 0
  779.         xor    ax, ax
  780.         mov    di, offset idblock_volume_table
  781.         mov    cx, (offset idblock_volume_table_end - \
  782.                  offset idblock_volume_table ) / 2
  783.         rep    stosw
  784.         mov    ax, length_low_org
  785.         stosw
  786.         mov    ax, length_high_org
  787.         stosw
  788.         @@mark_idblock_volume_table
  789. check_disk_free_space:
  790.         mov    si, offset work_fcb_2
  791.         mov    ax, [si]
  792.         cmp    byte ptr dos_version, 3
  793.         jc    skip_subst_check
  794.         mov    di, offset work_fcb_3
  795.         mov    ah, 60h
  796.         int    21h
  797.         mov    ax, word ptr work_fcb_3
  798. skip_subst_check:
  799.         xor    dl, dl
  800.         cmp    ah, ':'
  801.         jnz    skip_get_drive_name    ; current drive
  802.         call    tolower
  803.         sub    al, 60h
  804.         mov    dl, al
  805. skip_get_drive_name:
  806.         mov    ah, 36h
  807.         int    21h        ; get disk free space
  808.         cmp    ax, 0ffffh
  809.         jz    error_08
  810.         mul    cx
  811.         mul    bx
  812.         sub    ax, word ptr fsize_low
  813.         sbb    dx, word ptr fsize_high
  814.         jc    error_16
  815.         mov    ah, 3ch
  816.         mov    dx, offset work_fcb_2
  817.         xor    cx, cx
  818.         int    21h        ; create restore file
  819.         jc    error_08
  820.         mov    write_handler, ax
  821.         mov    byte ptr create_flag, 0ffh
  822. disp_renamed_fname:
  823.         pop    si
  824.         cmp    byte ptr renamed_flag, 0
  825.         jz    disp_renamed_fname_2
  826.         lodsb
  827.         mov    byte ptr work_fcb[9d], al
  828.         lodsw
  829.         mov    word ptr work_fcb[10d], ax
  830. disp_renamed_fname_2:
  831.         cmp    current_division, 0
  832.         jz    disp_renamed_fname_1
  833.         mov    ax, 4200h
  834.         mov    bx, write_handler
  835.         mov    dx, word ptr division_offset_low
  836.         mov    cx, word ptr division_offset_high
  837.         int    21h        ; move file pointer (positioning)
  838.         jc    error_09
  839.         mov    ax, word ptr current_division_length_low
  840.         mov    word ptr fsize_low, ax
  841.         mov    word ptr length_low_org, ax
  842.         mov    ax, word ptr current_division_length_high
  843.         mov    word ptr fsize_high, ax
  844.         mov    word ptr length_high_org, ax
  845. disp_renamed_fname_1:
  846.         @@disp_renamed_fname
  847.         ret
  848.  
  849.  
  850.  
  851. ;-----------------------------------------------;
  852. ;                        ;
  853. ;    copy_fname_fcb_to_buffer        ;
  854. ;                        ;
  855. ;    INPUT :    ?                ;
  856. ;    OUTPUT:    ?                ;
  857. ;    ERROR :    ?                ;
  858. ;    BREAK :    ?                ;
  859. ;                        ;
  860. ;-----------------------------------------------;
  861.  
  862. copy_fname_fcb_to_buffer:
  863.         mov    cx, 8
  864.         mov    ah, 0
  865. copy_fname_fcb_to_buffer_1:
  866.         call    lodsb_tolower_new
  867.         cmp    al, ' '
  868.         jz    copy_fname_fcb_to_buffer_2
  869.         stosb
  870.         loop    copy_fname_fcb_to_buffer_1
  871.         inc    cx
  872. copy_fname_fcb_to_buffer_2:
  873.         dec    cx
  874.         add    si, cx
  875.         mov    cx, 4
  876.         mov    ah, 0
  877. copy_fname_fcb_to_buffer_3:
  878.         call    lodsb_tolower_new
  879.         cmp    al, ' '
  880.         jz    copy_fname_fcb_to_buffer_ret
  881.         stosb
  882.         loop    copy_fname_fcb_to_buffer_3
  883. copy_fname_fcb_to_buffer_ret:
  884.         ret
  885.  
  886.  
  887.  
  888. ;-----------------------------------------------;
  889. ;                        ;
  890. ;    disp_error_number            ;
  891. ;                        ;
  892. ;    INPUT :    NON                ;
  893. ;    OUTPUT:    NON                ;
  894. ;    ERROR :    NON                ;
  895. ;    BREAK :    flags, ax, dl, di        ;
  896. ;                        ;
  897. ;-----------------------------------------------;
  898.  
  899. disp_error_number:
  900.         mov    al, error_count
  901.         add    al, 30h
  902.         cmp    al, 30h
  903.         jnz    disp_error_number_1
  904.         mov    al, 'o'
  905.  
  906. ;-----------------------------------------------;
  907. ;                        ;
  908. ;    disp_error_number2            ;
  909. ;                        ;
  910. ;    INPUT :    NON                ;
  911. ;    OUTPUT:    NON                ;
  912. ;    ERROR :    NON                ;
  913. ;    BREAK :    flags, ax, dl, di        ;
  914. ;                        ;
  915. ;-----------------------------------------------;
  916.  
  917. disp_error_number2:
  918. disp_error_number_1:
  919.         mov    di, word ptr block_number_ptr
  920.         cmp    byte ptr [di], '.'
  921.         jz    disp_error_number_2
  922.         mov    si, word ptr block_number_begin
  923.         mov    di, si
  924.         inc    si
  925.         mov    cx, offset display_buffer[79]
  926.         sub    cx, di
  927.         rep    movsb
  928.         dec    word ptr block_number_ptr
  929. disp_error_number_2:
  930.         stosb
  931.         inc    word ptr block_number_ptr
  932.  
  933. ;-----------------------------------------------;
  934. ;                        ;
  935. ;    draw_display_buffer:            ;
  936. ;                        ;
  937. ;    INPUT :    NON                ;
  938. ;    OUTPUT:    NON                ;
  939. ;    ERROR :    NON                ;
  940. ;    BREAK :    ax, cx, dl, si, flags        ;
  941. ;                        ;
  942. ;-----------------------------------------------;
  943.  
  944. draw_display_buffer:
  945.         @@dispstr2    display_buffer, 80d
  946.         mov    cx, word ptr line_number_ptr
  947.         sub    cx, offset display_buffer - 1
  948.         @@dispstr2    display_buffer, cx
  949.         ret
  950.