home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / ms_dos / ish / ish200s / ish200s.lzh / MAKEISH.H < prev    next >
Text File  |  1990-03-27  |  26KB  |  1,274 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. ;    @@set_seq_number_and_copy_data        ;
  14. ;                        ;
  15. ;    INPUT :    NON                ;
  16. ;    OUTPUT:    al (vertical_frame_sequencde_number)
  17. ;        di (vertical_frame_pointer)    ;
  18. ;    ERROR :    NON                ;
  19. ;    BREAK :    flags, cx, si            ;
  20. ;                        ;
  21. ;                        ;
  22. ;-----------------------------------------------;
  23.  
  24. @@set_seq_number_and_copy_data    macro
  25.         mov    si, offset read_buffer
  26.         mov    di, offset work_table2
  27.         mov    al, 1
  28. set_seq_number_and_copy_data:
  29.         stosb
  30.         inc    al
  31.         mov    cx, para_66_60
  32.         rep    movsb
  33.         add    di, 2
  34.         cmp    al, byte ptr para_67_61
  35.         jb    set_seq_number_and_copy_data
  36.         endm
  37.  
  38.  
  39.  
  40. ;-----------------------------------------------;
  41. ;                        ;
  42. ;    @@make_vertical_sum            ;
  43. ;                        ;
  44. ;    INPUT :    al (sequence number)        ;
  45. ;        di (pointer to the vertical sum frame)
  46. ;    OUTPUT:    di (pointer to the slant sum frame)
  47. ;    ERROR :    NON                ;
  48. ;    BREAK :    flags, al, cx, si        ;
  49. ;                        ;
  50. ;                        ;
  51. ;-----------------------------------------------;
  52.  
  53. @@make_vertical_sum    macro
  54.         mov    si, offset work_table2 + 1
  55.         mov    cx, para_66_60
  56.         stosb
  57. make_sum1_1:    push    cx
  58.         lodsb
  59.         push    si
  60.         dec    si
  61.         mov    cx, para_65_59
  62. make_sum1_2:    add    si, para_69_63
  63.         add    al, [si]
  64.         loop    make_sum1_2
  65.         neg    al
  66.         stosb
  67.         pop    si
  68.         pop    cx
  69.         loop    make_sum1_1
  70.         add    di, 2
  71.         endm
  72.  
  73.  
  74.  
  75. ;-----------------------------------------------;
  76. ;                        ;
  77. ;    @@make_slant_sum            ;
  78. ;                        ;
  79. ;    INPUT :    di (pointer to the vertical sum frame)
  80. ;    OUTPUT:    NON                ;
  81. ;    ERROR :    NON                ;
  82. ;    BREAK :    flags, al, bx, cx, si, di    ;
  83. ;                        ;
  84. ;                        ;
  85. ;-----------------------------------------------;
  86.  
  87. @@make_slant_sum    macro
  88.         mov    cx, para_67_61
  89.         mov    al, byte ptr para_68_62
  90.         stosb
  91.         mov    si, offset work_table2
  92.         xor    bx, bx
  93. make_sum2_1:    push    si
  94.         push    bx
  95.         push    cx
  96.         xor    al, al
  97.         mov    cx, para_67_61
  98. make_sum2_2:    add    al, [bx+si]
  99.         add    si, para_69_63
  100.         inc    bx
  101.         cmp    bx, para_67_61
  102.         jb    make_sum2_3
  103.         xor    bx, bx
  104. make_sum2_3:    loop    make_sum2_2
  105.         neg    al
  106.         stosb
  107.         pop    cx
  108.         pop    bx
  109.         pop    si
  110.         inc    bx
  111.         loop    make_sum2_1
  112.         endm
  113.  
  114.  
  115.  
  116. ;-----------------------------------------------;
  117. ;                        ;
  118. ;    @@make_table_crc            ;
  119. ;                        ;
  120. ;    INPUT :    NON                ;
  121. ;    OUTPUT:    NON                ;
  122. ;    ERROR :    NON                ;
  123. ;    BREAK :    flags, ax, cx, dx, si        ;
  124. ;                        ;
  125. ;                        ;
  126. ;-----------------------------------------------;
  127.  
  128. @@make_table_crc    macro
  129.         mov    si, offset work_table2
  130.         mov    cx, para_68_62
  131.         mov    dx, offset crc_table
  132. make_table_crc_1:
  133.         push    cx
  134.         cmp    cx, 1
  135.         mov    cx, para_67_61
  136.         jnz    make_table_crc_3
  137.         cmp    mode, 'o' + 80h
  138.         jz    make_tabke_crc_2
  139.         inc    byte ptr [si]
  140.         jmp    make_table_crc_3
  141.  
  142. make_tabke_crc_2:
  143.         inc    cx
  144. make_table_crc_3:
  145.         @@crc_1
  146.         mov    [si], ax
  147.         lodsw
  148.         pop    cx
  149.         loop    make_table_crc_1
  150.         endm
  151.  
  152.  
  153.  
  154. ;-----------------------------------------------;
  155. ;                        ;
  156. ;    @@make_table                ;
  157. ;                        ;
  158. ;    INPUT :    NON                ;
  159. ;    OUTPUT:    NON                ;
  160. ;    ERROR :    NON                ;
  161. ;    BREAK :    flags, ax, bx, cx, dx, si, di    ;
  162. ;                        ;
  163. ;                        ;
  164. ;-----------------------------------------------;
  165.  
  166. @@make_table    macro
  167.         @@set_seq_number_and_copy_data
  168.         @@make_vertical_sum
  169.         @@make_slant_sum
  170.         @@make_table_crc
  171.         endm
  172.  
  173.  
  174.  
  175. ;-----------------------------------------------;
  176. ;                        ;
  177. ;    @@make_header                ;
  178. ;                        ;
  179. ;    INPUT :    si (input filename pointer)    ;
  180. ;    OUTPUT:    NON                ;
  181. ;    ERROR :    error_05, error_07        ;
  182. ;    BREAK :    flags, ax, bx, cx, dx, di    ;
  183. ;                        ;
  184. ;                        ;
  185. ;-----------------------------------------------;
  186.  
  187. @@make_header    macro
  188.         push    si
  189.         mov    di, offset work_table
  190.         mov    ax, 0        ; SEQ#(al) : 0
  191.                     ; TYPE(ah) : 0
  192.                     ; error_line_detect  : ccitt_crc
  193.                     ;     correct method : タテ_sum & ナナメ_sum
  194.                     ; total_error_detect : ccitt_crc
  195.         stosw
  196.         add    di, 4
  197.         cmp    mode, '7'
  198.         jz    jis7_1
  199.         cmp    mode, 's'
  200.         jz    sjis_1
  201.         cmp    mode, 's' + 80h
  202.         jz    sjis_1
  203.                     ; JIS8 or non-kana
  204.         mov    ax, 69d        ; number of character / line
  205.         stosw            ;     (include SEQ# and CRC)
  206.         mov    ax, 68d        ; number of line / block
  207.         stosw            ;     (include check sum)
  208.         cmp    mode, 'n'
  209.         jz    nonkana_1
  210.                     ; JIS8
  211.         mov    ax, 808h        ; source file (al) : 8-bits
  212.         stosw            ;    ish file (ah) : 8-bits
  213.         mov    si, offset parameter_jis8
  214.         jmp    copy_para
  215. ;
  216. nonkana_1:                ; non-kana
  217.         mov    ax, 0e10h    ; source file (al) : 8-bits
  218.         stosw            ;    ish file (ah) : 8-bits
  219.         mov    si, offset parameter_nonkana
  220.         jmp    copy_para
  221. ;
  222. jis7_1:                    ; JIS7
  223.         mov    ax, 63d        ; number of character / line
  224.         stosw            ;     (include SEQ# and CRC)
  225.         mov    ax, 62d        ; number of line / block
  226.         stosw            ;     (include check sum)
  227.         mov    ax, 0d10h    ; source file (al) : 16-bits
  228.         stosw            ;    ish file (ah) : 13-bits
  229.         mov    si, offset parameter_jis7
  230.         jmp    copy_para
  231. ;
  232. sjis_1:                    ; shift JIS
  233.         mov    ax, 73d        ; number of character / line
  234.         stosw            ;     (include SEQ# and CRC)
  235.         mov    ax, 72d        ; number of line / block
  236.         stosw            ;     (include check sum)
  237.         mov    ax, 0f10h    ; source file (al) : 16-bits
  238.         stosw            ;    ish file (ah) : 15-bits
  239.         mov    si, offset parameter_sjis
  240.  
  241. copy_para:    push    di
  242.         mov    di, offset para_81_80
  243.         mov    cx, 21d
  244.         rep    movsw
  245.         pop    di
  246.         pop    si
  247.         push    si
  248.         push    di
  249.         mov    ax, 2900h
  250.         mov    di, offset work_fcb
  251.         int    21h        ; parse file name
  252.         or    al, al
  253.         jnz    error_07
  254.         mov    si, di
  255.         pop    di
  256.         mov    cx, 11d
  257.         inc    si
  258.         rep    movsb
  259.         mov    al, os
  260.         mov    ah, 0ffh    ; all OSs
  261.         dec    al
  262.         jz    set_os
  263.         dec    ah        ; other OSs
  264.         dec    al
  265.         jz    set_os
  266.         mov    ah, 40h        ; Mac
  267.         dec    al
  268.         jz    set_os
  269.         mov    ah, 30h        ; UNIX
  270.         dec    al
  271.         jz    set_os
  272.         mov    ah, 20h        ; OS-9
  273.         dec    al
  274.         jz    set_os
  275.         mov    ah, 10h        ; CP/M
  276.         dec    al
  277.         jz    set_os
  278.         xor    ah, ah        ; MS-DOS
  279. set_os:        xor    al, al        ; genre(ジャンル) : 0 (not defined)
  280.                     ; (1-255:for automatic genre selection)
  281.         stosw            ; machine (ah) 
  282.         mov    ax, 0d00h
  283.         cmp    mode, 'o' + 80h
  284.         jz    set_auxiliary_type
  285.         inc    al        ; auxiliary type (al) : 1
  286.                     ;          ( 0 : old version )
  287. set_auxiliary_type:
  288.         cmp    word ptr mv_num, 0
  289.         jz    set_auxiliary_type_2
  290.         mov    ah, 1dh
  291. set_auxiliary_type_2:
  292.         stosw            ; ah = 000x1101b
  293.                     ;  time stamp is available
  294.                     ;  CRC-16 is available
  295.                     ;  CRC-32 is available
  296.         mov    ax, 5700h
  297.         mov    bx, read_handler
  298.         int    21h        ; get date & time of input file
  299.         jb    error_05
  300.         mov    ax, cx        ; time
  301.         stosw
  302.         mov    ax, dx        ; date
  303.         stosw
  304.         mov    cx, para_18_15    ; clear reserved area
  305.         xor    ax, ax
  306.         rep    stosw
  307.         @@set_difference_of_time
  308.         pop    si
  309.         endm
  310.  
  311.  
  312.  
  313. ;-----------------------------------------------;
  314. ;                        ;
  315. ;    @@make_header_title            ;
  316. ;                        ;
  317. ;    INPUT :    si (input file pointer)        ;
  318. ;    OUTPUT:    di (end of header title pointer);
  319. ;    ERROR :    error_10            ;
  320. ;    BREAK :    flags, ax, cx, dx, di        ;
  321. ;                        ;
  322. ;                        ;
  323. ;-----------------------------------------------;
  324.  
  325. @@make_header_title    macro
  326.         push    si
  327.         mov    di, offset header_title_buffer
  328.         mov    si, offset msg_header1_esc
  329.         cmp    byte ptr n_flag, 'e'
  330.         jz    escape_1
  331.         mov    si, offset msg_header1_non_esc
  332. escape_1:    call    movsb1
  333.         pop    si
  334.         push    si
  335.         push    di
  336.         mov    di, offset save_fname + 1
  337. ;        xor    cx, cx        ; now CX == 0
  338. save_fname_1:    lodsb
  339.         or    al, al
  340.         jz    save_fname_2
  341.         inc    cl
  342.         cmp    cl, 12d + 1
  343.         jnc    error_07
  344.         stosb
  345.         jmp    save_fname_1
  346.  
  347. save_fname_2:    pop    di
  348.         jcxz    error_07
  349.         mov    si, offset save_fname
  350.         mov    [si], cl
  351.         call    movsb1
  352.         mov    al, os
  353.         mov    si, offset msg_all_os
  354.         dec    al
  355.         jz    copy_os_name
  356.         dec    al
  357.         jz    copy_use_ish_msg
  358.         mov    si, offset msg_mac
  359.         dec    al
  360.         jz    copy_os_name
  361.         mov    si, offset msg_unix
  362.         dec    al
  363.         jz    copy_os_name
  364.         mov    si, offset msg_os9
  365.         dec    al
  366.         jz    copy_os_name
  367.         mov    si, offset msg_cpm
  368.         dec    al
  369.         jz    copy_os_name
  370.         mov    si, offset msg_ms_dos
  371. copy_os_name:    call    movsb1
  372. copy_use_ish_msg:
  373.         mov    si, offset msg_use_ish
  374.         call    movsb1
  375.         push    di
  376.         mov    si, offset arc_data
  377.         mov    di, offset work_fcb+9d
  378.         mov    cx, 6
  379.         xor    ax, ax
  380. copy_usr_archiver_msg:
  381.         push    di
  382.         add    si, ax
  383.         push    si
  384.         push    cx
  385.         mov    cx, 3
  386.         repz    cmpsb
  387.         pop    cx
  388.         pop    si
  389.         pop    di
  390.         pushf
  391.         add    si, 3
  392.         lodsb
  393.         cbw
  394.         popf
  395.         loopnz    copy_usr_archiver_msg
  396.         pop    di
  397.         jnz    copy_use_ish2_msg
  398.         mov    cx, ax
  399.         rep    movsb
  400. copy_use_ish2_msg:
  401.         mov    si, offset msg_use_ish2
  402.         mov    cx, 4
  403.         rep    movsb
  404.         mov    si, word ptr mv_num
  405.         or    si, si
  406.         jnz    calc_multi_volume_lines_1
  407.         mov    ax, word ptr work_table[2]
  408.         mov    dx, word ptr work_table[4]
  409.         call    calc_lines
  410.         jmp    make_header_title_1
  411.  
  412. calc_multi_volume_lines_1:
  413.         xor    ax, ax
  414.         xor    dx, dx
  415.         mov    cx, word ptr max_division
  416.         dec    cx
  417. calc_multi_volume_lines_2:
  418.         add    ax, si
  419.         adc    dx, 0
  420.         loop    calc_multi_volume_lines_2
  421.         add    ax, word ptr last_division_lines
  422.         adc    dx, 0
  423. make_header_title_1:
  424.         call    hex_to_dec
  425.         mov    si, offset msg_lines
  426.         mov    cx, 8
  427.         rep    movsb
  428.         mov    si, offset msg_header2_esc
  429.         cmp    byte ptr n_flag, 'e'
  430.         jz    escape_2
  431.         mov    si, offset msg_header2_non_esc
  432. escape_2:    call    movsb1
  433.         pop    si
  434.         endm
  435.  
  436.  
  437.  
  438. ;-----------------------------------------------;
  439. ;                        ;
  440. ;    @@check_ish_file            ;
  441. ;                        ;
  442. ;    INPUT :    si (input file pointer)        ;
  443. ;    OUTPUT:    NON                ;
  444. ;    ERROR :    error_08, error_18        ;
  445. ;    BREAK :    flags, ax, bl, cx, dx, si, di    ;
  446. ;                        ;
  447. ;                        ;
  448. ;-----------------------------------------------;
  449.  
  450. @@check_ish_file    macro
  451.         push    si
  452. find_extension:    lodsb
  453.         or    al, al
  454.         jz    change_extension_to_ish
  455.         cmp    al, '.'
  456.         jnz    find_extension
  457. change_extension_to_ish:
  458.         mov    di, si
  459.         dec    di
  460.         mov    si, offset ish_data
  461.         mov    cx, 5
  462.         rep    movsb
  463.         mov    di, offset work_fcb_2
  464.         mov    dx, di
  465.         mov    al, os
  466.         mov    si, offset all_os_path + 1
  467.         dec    al
  468.         jz    add_path
  469.         mov    si, offset other_os_path + 1
  470.         dec    al
  471.         jz    add_path
  472.         mov    si, offset mac_path + 1
  473.         dec    al
  474.         jz    add_path
  475.         mov    si, offset unix_path + 1
  476.         dec    al
  477.         jz    add_path
  478.         mov    si, offset os9_path + 1
  479.         dec    al
  480.         jz    add_path
  481.         mov    si, offset cpm_path + 1
  482.         dec    al
  483.         jz    add_path
  484.         mov    si, offset msdos_path +1
  485. add_path:    lodsb
  486.         or    al, al
  487.         jz    copy_ish_filename
  488.         stosb
  489.         jmp    add_path
  490. ;
  491. copy_ish_filename:
  492.         pop    si
  493. copy_ish_filename_1:
  494.         lodsb
  495.         stosb
  496.         or    al, al
  497.         jnz    copy_ish_filename_1
  498.         mov    cx, word ptr max_division
  499.         sub    di, 3
  500.         mov    word ptr ixx, di
  501.         jcxz    output_file_not_exist_check_1
  502.         mov    bl, 10d
  503. output_file_not_exist_check:
  504.         mov    ax, cx
  505.         div    bl
  506.         add    ax, 3030h
  507.         cmp    ah, '9'+1
  508.         jb    output_file_not_exist_check_0
  509.         add    ah, 'A' - ('9' + 1)
  510. output_file_not_exist_check_0:
  511.         mov    word ptr [di], ax
  512. output_file_not_exist_check_1:
  513.         mov    ax, 3d00h
  514.         int    21h        ; output_file already exist ?
  515.         jnb    error_18
  516.         cmp    ax, 2h
  517.         jnz    error_08
  518.         jcxz    output_file_not_exist_check_2
  519.         loop    output_file_not_exist_check
  520. output_file_not_exist_check_2:
  521.         endm
  522.  
  523.  
  524.  
  525. ;-----------------------------------------------;
  526. ;                        ;
  527. ;    @@calc_file_size            ;
  528. ;                        ;
  529. ;    INPUT :    ax (bytes/sector)        ;
  530. ;        di (end of header title pointer);
  531. ;    OUTPUT:    si, bx                ;
  532. ;    ERROR :    error_08, error_18        ;
  533. ;    BREAK :    flags, bx, cx, dx, si, bp    ;
  534. ;                        ;
  535. ;                        ;
  536. ;-----------------------------------------------;
  537.  
  538. @@calc_file_size    macro
  539.         push    ax
  540.         push    di
  541.         xor    bx, bx
  542.         xor    si, si
  543.         mov    ax, word ptr work_table[2]
  544.         mov    dx, word ptr work_table[4]
  545.         cmp    word ptr max_division, 0
  546.         jz    calc_file_size_0
  547.         xor    ax, ax
  548. calc_file_size_loop:
  549.         inc    ax
  550.         mov    word ptr current_division, ax
  551.         mov    save_count_low, 1
  552.         cmp    ax, word ptr max_division
  553.         mov    ax, word ptr work_table[40]
  554.         mov    dx, word ptr work_table[42]
  555.         jnz    calc_file_size_0_0
  556.         mov    ax, word ptr last_division_bytes_low
  557.         mov    dx, word ptr last_division_bytes_high
  558. calc_file_size_0_0:
  559.         push    si
  560.         push    ax
  561.         push    dx
  562.         call    calc_lines
  563.         pop    dx
  564.         pop    ax
  565.         pop    si
  566.         pop    di
  567.         pop    cx
  568.         push    cx
  569.         push    di
  570.         dec    cx
  571.         add    bx, cx
  572.         adc    si, 0
  573.         not    cx
  574.         and    bx, cx
  575. calc_file_size_0:
  576.         mov    cx, word ptr para_65_59
  577.         mov    word ptr para_A, cx
  578.         mov    cx, word ptr para_66_60
  579.         mov    word ptr para_B, cx
  580.         add    ax, 2
  581.         adc    dx, 0
  582.         call    trunc
  583.         mov    word ptr line1_h, dx
  584.         mov    word ptr line1_l, ax
  585.         push    dx
  586.         push    ax
  587.         call    trunc
  588.         mov    word ptr line2_h, dx
  589.         mov    word ptr line2_l, ax
  590.         cmp    byte ptr mode, 'o' + 80h
  591.         jnz    calc_file_size_1_0
  592.         add    bx, ax
  593.         add    si, dx
  594. calc_file_size_1_0:
  595.         add    ax, ax
  596.         adc    dx, dx
  597.         pop    cx
  598.         add    ax, cx
  599.         pop    cx
  600.         adc    dx, cx
  601.         mov    cx, para_81_80
  602. calc_file_size_1:
  603.         add    bx, ax
  604.         adc    si, dx
  605.         loop    calc_file_size_1
  606.         mov    dx, bx
  607.         mov    bx, offset encode_table_jis8
  608.         cmp    mode, '8'
  609.         jz    calc_file_size_2
  610.         cmp    mode, '8' + 80h
  611.         jz    calc_file_size_2
  612.         cmp    mode, 's'
  613.         jz    calc_file_size_2
  614.         cmp    mode, 's' + 80h
  615.         jz    calc_file_size_2
  616.         mov    bx, offset encode_table_jis7
  617. calc_file_size_2:
  618.         mov    al, byte ptr para_66_60
  619.         inc    al
  620.         xor    ah, ah
  621.         push    ax
  622.         xlat
  623.         mov    di, ax
  624.         pop    ax
  625.         inc    al
  626.         cmp    mode, 'o' + 80h
  627.         jz    calc_file_size_2_1
  628.         inc    al
  629. calc_file_size_2_1:
  630.         xlat
  631.         cmp    byte ptr [di][prefix_table], 0
  632.         jz    calc_file_size_3
  633.         add    dx, line2_l
  634.         adc    si, line2_h
  635. calc_file_size_3:
  636.         mov    di, ax
  637.         cmp    byte ptr [di][prefix_table], 0
  638.         jz    calc_file_size_5
  639.         add    dx, line2_l
  640.         adc    si, line2_h
  641. calc_file_size_5:
  642.         mov    di, offset prefix_table + '!'
  643.         cmp    mode, 80h
  644.         jc    calc_file_size_5_1
  645.         mov    di, offset prefix_table + '#'
  646. calc_file_size_5_1:
  647.         cmp    byte ptr [di], 0
  648.         jz    calc_file_size_5_2
  649.         add    dx, 3
  650.         adc    si, 0
  651. calc_file_size_5_2:
  652.         mov    ah, 1
  653.         mov    cx, line1_l
  654.         mov    bp, line1_h
  655.         inc    bp
  656. calc_file_size_7:
  657.         mov    al, ah
  658.         xlat
  659.         mov    di, ax
  660.         and    di, 0ffh
  661.         cmp    byte ptr [di][prefix_table], 0
  662.         jz    calc_file_size_8
  663.         add    dx, 1
  664.         adc    di, 0
  665. calc_file_size_8:
  666.         inc    ah
  667.         cmp    ah, byte ptr para_66_60
  668.         jbe    calc_file_size_9
  669.         mov    ah, 1
  670. calc_file_size_9:
  671.         loop    calc_file_size_7
  672.         dec    bp
  673.         jnz    calc_file_size_7
  674.         mov    bx, 80d * 3
  675.         cmp    mode, 80h
  676.         jb    calc_file_size_9_1
  677.         mov    bx, para_81$3_80$3_81$3
  678. calc_file_size_9_1:
  679.         add    bx, dx
  680.         adc    si, 0
  681.         pop    ax
  682.         push    ax
  683.         sub    ax, offset header_title_buffer
  684.         add    bx, ax
  685.         adc    si, 0
  686.         mov    cx, title_length
  687.         inc    cx
  688.         jz    calc_file_size_13
  689.         mov    ax, save_max_count_low
  690.         mov    dx, save_max_count_high
  691.         call    calc_order
  692.         add    al, 14d
  693.         cmp    word ptr max_division, 0
  694.         jz    calc_title_size_0
  695.         mov    di, ax
  696.         mov    ax, word ptr max_division
  697.         xor    dx, dx
  698.         call    calc_order
  699.         add    al, 9d
  700.         add    di, ax
  701.         mov    ax, word ptr current_division
  702.         xor    dx, dx
  703.         call    calc_order
  704.         add    ax, di
  705. calc_title_size_0:
  706.         add    al, save_fname
  707.         mov    dx, ax
  708. calc_title_size:
  709.         push    dx
  710.         mov    ax, save_count_low
  711.         mov    dx, save_count_high
  712.         add    ax, cx
  713.         adc    dx, 0
  714.         mov    save_count_low, ax
  715.         mov    save_count_high, dx
  716.         cmp    dx, save_max_count_high
  717.         jc    calc_file_size_11
  718.         jnz    calc_file_size_10
  719.         cmp    ax, save_max_count_low
  720.         jc    calc_file_size_11
  721. calc_file_size_10:
  722.         mov    ax, save_max_count_low
  723.         mov    dx, save_max_count_high
  724. calc_file_size_11:
  725.         call    calc_order
  726.         pop    dx
  727.         add    ax, dx
  728.         cmp    n_flag, 'e'
  729.         jz    calc_file_size_11_1
  730.         cmp    byte ptr prefix_table + '-', 0
  731.         jz    calc_file_size_12
  732.         jmp    calc_file_size_11_2
  733.  
  734. calc_file_size_11_1:
  735.         cmp    byte ptr prefix_table + 01bh, 0
  736.         jz    calc_file_size_12
  737. calc_file_size_11_2:
  738.         inc    ax
  739. calc_file_size_12:
  740.         add    bx, ax
  741.         adc    si, 0
  742.         mov    ax, save_count_high
  743.         cmp    ax, save_max_count_high
  744.         jc    calc_title_size
  745.         jnz    calc_file_size_13
  746.         mov    ax, save_count_low
  747.         cmp    ax, save_max_count_low
  748.         jc    calc_title_size
  749. calc_file_size_13:
  750.         cmp    n_flag, 'e'
  751.         jz    calc_file_size_13_1
  752.         cmp    byte ptr prefix_table + '<', 0
  753.         jz    calc_file_size_14
  754.         jmp    calc_file_size_13_2
  755.  
  756. calc_file_size_13_1:
  757.         cmp    byte ptr prefix_table + 01bh, 0
  758.         jz    calc_file_size_14
  759. calc_file_size_13_2:
  760.         add    bx, 1
  761.         adc    si, 0
  762. calc_file_size_14:
  763.         cmp    word ptr max_division, 0
  764.         jz    calc_file_size_14_3
  765.         mov    ax, save_max_count_low
  766.         mov    dx, save_max_count_high
  767.         call    calc_order
  768.         add    al, 29d
  769.         mov    di, ax
  770.         mov    ax, word ptr max_division
  771.         xor    dx, dx
  772.         call    calc_order
  773.         add    di, ax
  774.         mov    ax, word ptr current_division
  775.         xor    dx, dx
  776.         call    calc_order
  777.         add    ax, di
  778.         add    bx, ax
  779.         adc    si, 0
  780.         cmp    n_flag, 'e'
  781.         jz    calc_file_size_14_1
  782.         cmp    byte ptr prefix_table + '=', 0
  783.         jz    calc_file_size_14_3
  784.         jmp    calc_file_size_14_2
  785.  
  786. calc_file_size_14_1:
  787.         cmp    byte ptr prefix_table + 01bh, 0
  788.         jz    calc_file_size_14_3
  789. calc_file_size_14_2:
  790.         add    bx, 1
  791.         adc    si, 0
  792. calc_file_size_14_3:
  793.         xor    ax, ax
  794.         mov    save_count_low, ax
  795.         mov    save_count_high, ax
  796.         mov    ax, word ptr current_division
  797.         or    ax, ax
  798.         jz    calc_file_size_15
  799.         cmp    ax, word ptr max_division
  800.         jc    calc_file_size_loop
  801.         xor    ax, ax
  802.         mov    word ptr current_division, ax
  803. calc_file_size_15:
  804.         pop    di
  805.         pop    ax
  806.         endm
  807.  
  808.  
  809. ;-----------------------------------------------;
  810. ;                        ;
  811. ;    @@get_disk_free_space            ;
  812. ;                        ;
  813. ;    INPUT :    NON                ;
  814. ;    OUTPUT:    ax (bytes/sector)        ;
  815. ;        bx (free sectors)        ;
  816. ;    ERROR :    error_08            ;
  817. ;    BREAK :    flags, cx, dx, si, di        ;
  818. ;                        ;
  819. ;                        ;
  820. ;-----------------------------------------------;
  821.  
  822. @@get_disk_free_space    macro
  823.         mov    si, offset work_fcb_2
  824.         mov    ax, [si]
  825.         cmp    byte ptr dos_version, 3
  826.         jc    get_disk_free_space_1
  827.         mov    di, offset work_fcb_3
  828.         mov    ah, 60h
  829.         int    21h
  830.         mov    ax, word ptr work_fcb_3
  831. get_disk_free_space_1:
  832.         xor    dl, dl
  833.         cmp    ah, ':'
  834.         jnz    get_disk_free_space_2
  835.         or    al, 20h
  836.         sub    al, 60h
  837.         mov    dl, al
  838. get_disk_free_space_2:
  839.         mov    ah, 36h
  840.         int    21h
  841.         cmp    ax, 0ffffh
  842.         jz    error_08
  843.         mul    cx
  844.         endm
  845.  
  846.  
  847.  
  848. ;-----------------------------------------------;
  849. ;                        ;
  850. ;    @@cmp_dd                ;
  851. ;                        ;
  852. ;    cmpare double word (data1) - (data2)    ;
  853. ;                        ;
  854. ;    INPUT :    data1_high, data1_low        ;
  855. ;        data2_high, data2_low        ;
  856. ;    OUTPUT:    flags                ;
  857. ;        ( ZR: data1 == data2)        ;
  858. ;        ( CY: data1 <  data2)        ;
  859. ;    ERROR :    NON                ;
  860. ;    BREAK :    flags                ;
  861. ;                        ;
  862. ;                        ;
  863. ;-----------------------------------------------;
  864.  
  865. @@cmp_dd    macro    data1_high, data1_low, data2_high, data2_low
  866.         local    cmp_dd_ret
  867.         cmp    data1_high, data2_high
  868.         jnz    cmp_dd_ret
  869.         cmp    data1_low, data2_low
  870. cmp_dd_ret:
  871.         endm
  872.  
  873.  
  874.  
  875. ;-----------------------------------------------;
  876. ;                        ;
  877. ;    @@create_ish_file            ;
  878. ;                        ;
  879. ;    INPUT :    NON                ;
  880. ;    OUTPUT:    NON                ;
  881. ;    ERROR :    error_08            ;
  882. ;    BREAK :    flags, ax, cx, dx        ;
  883. ;                        ;
  884. ;                        ;
  885. ;-----------------------------------------------;
  886.  
  887. @@create_ish_file    macro
  888.         mov    ax, 3c00h
  889.         mov    dx, offset work_fcb_2
  890.         xor    cx, cx
  891.         int    21h        ; create output_file
  892.         jc    error_08
  893.         mov    write_handler, ax
  894.         endm
  895.  
  896.  
  897.  
  898. ;-----------------------------------------------;
  899. ;                        ;
  900. ;    @@write_header_title            ;
  901. ;                        ;
  902. ;    INPUT :    cx (end of header title pointer);
  903. ;    OUTPUT:    NON                ;
  904. ;    ERROR :    error_09, err or_33        ;
  905. ;    BREAK :    flags, ax, cx, dx, si, di, bp    ;
  906. ;                        ;
  907. ;-----------------------------------------------;
  908.  
  909. @@write_header_title    macro
  910.         mov    dx, offset header_title_buffer
  911.         sub    cx, dx
  912.         mov    word ptr header_title_length_save, cx
  913.         call    header_title_write
  914.         endm
  915.  
  916.  
  917.  
  918. ;-----------------------------------------------;
  919. ;                        ;
  920. ;    @@encode_table_data            ;
  921. ;                        ;
  922. ;    INPUT :    NON                ;
  923. ;    OUTPUT:    si (read pointer)        ;
  924. ;        di (write pointer)        ;
  925. ;    ERROR :    NON                ;
  926. ;    BREAK :    flags, ax, cx            ;
  927. ;                        ;
  928. ;-----------------------------------------------;
  929.  
  930. @@encode_table_data    macro
  931.         mov    si, offset work_table2
  932.         mov    di, offset write_buffer
  933.         mov    cx, para_68_62
  934. encode_table_1:    push    cx
  935.         cmp    cx, 1
  936.         jnz    encode_table_2
  937.         cmp    mode, 'o' + 80h
  938.         jnz    encode_table_2
  939.         call    encode_7bit_old
  940.         jmp    encode_table_3
  941.  
  942. encode_table_2:    call    word ptr encode_sub2
  943. encode_table_3:    pop    cx
  944.         mov    ax, offset cr_lf
  945.         stosw
  946.         loop    encode_table_1
  947.         endm
  948.  
  949.  
  950.  
  951. ;-----------------------------------------------;
  952. ;                        ;
  953. ;    @@encode_sum                ;
  954. ;                        ;
  955. ;    INPUT :    si (read pointer)        ;
  956. ;        di (write pointer)        ;
  957. ;    OUTPUT:    ax (write length)        ;
  958. ;    ERROR :    NON                ;
  959. ;    BREAK :    flags, bl, cx, si, di        ;
  960. ;                        ;
  961. ;                        ;
  962. ;-----------------------------------------------;
  963.  
  964. @@encode_sum    macro
  965.         mov    ax, read_length
  966.         cmp    ax, para_66$66?1_60$60?1
  967.         jnc    encode_sum_1
  968.         add    ax, 2
  969. encode_sum_1:    add    ax, para_65_59
  970.         mov    bl, byte ptr para_66_60
  971.         div    bl
  972.         mov    bl, byte ptr para_81_80
  973.         mul    bl
  974.         mov    di, offset write_buffer
  975.         add    di, ax
  976.         mov    si, para_81$66_80$60_write_buffer
  977.         mov    cx, para_81$2_80$2
  978.         cmp    mode, 'o' + 80h
  979.         jnz    encode_sum_2
  980.         inc    cx
  981. encode_sum_2:    add    ax, cx
  982.         rep    movsb
  983.         endm
  984.  
  985.  
  986.  
  987. ;-----------------------------------------------;
  988. ;                        ;
  989. ;    @@write_table_sub            ;
  990. ;                        ;
  991. ;    INPUT :    NON                ;
  992. ;    OUTPUT:    NON                ;
  993. ;    ERROR :    error_09, error_33        ;
  994. ;    BREAK :    flags, ax, cx, dx, si, di, bp    ;
  995. ;                        ;
  996. ;-----------------------------------------------;
  997.  
  998. @@write_table_sub    macro
  999.         mov    dx, offset write_buffer
  1000. write_table_sub_1:
  1001.         mov    cx, para_81_80
  1002.         sub    ax, cx
  1003.         jc    write_table_sub_ret
  1004.         cmp    ax, 1
  1005.         jnz    write_table_sub_2
  1006.         inc    cx
  1007. write_table_sub_2:
  1008.         push    ax
  1009.         push    cx
  1010.         push    dx
  1011.         call    ins_prefix
  1012.         call    write_2
  1013.         call    title0
  1014.         pop    dx
  1015.         pop    cx
  1016.         pop    ax
  1017.         add    dx, cx
  1018.         jmp    write_table_sub_1
  1019.  
  1020. write_table_sub_ret:
  1021.         endm
  1022.  
  1023.  
  1024.  
  1025. ;-----------------------------------------------;
  1026. ;                        ;
  1027. ;    @@write_table                ;
  1028. ;                        ;
  1029. ;    INPUT :    NON                ;
  1030. ;    OUTPUT:    NON                ;
  1031. ;    ERROR :    error_09, error_33        ;
  1032. ;    BREAK :    flags, ax, bl, cx, dx, si, di,    ;
  1033. ;        bp                ;
  1034. ;                        ;
  1035. ;                        ;
  1036. ;-----------------------------------------------;
  1037.  
  1038. @@write_table    macro
  1039.         @@encode_table_data
  1040.         @@encode_sum
  1041.         @@write_table_sub
  1042.         endm
  1043.  
  1044.  
  1045.  
  1046. ;-----------------------------------------------;
  1047. ;                        ;
  1048. ;    @@ish_main                ;
  1049. ;                        ;
  1050. ;    INPUT :    cx (end of header title pointer);
  1051. ;    OUTPUT:    NON                ;
  1052. ;    ERROR :    error_05. error_08, error_09,    ;
  1053. ;        err or_33, ?            ;
  1054. ;    BREAK :    flags, ax, bx, cx, dx, si, di,    ;
  1055. ;        bp                ;
  1056. ;                        ;
  1057. ;                        ;
  1058. ;-----------------------------------------------;
  1059.  
  1060. @@ish_main    macro
  1061.         @@write_header_title
  1062. ish_main_0:    call    make_header_title2_and_write
  1063.         call    write_header
  1064.         mov    ax, word ptr work_table[40]
  1065.         mov    word ptr current_division_length_low, ax
  1066.         mov    ax, word ptr work_table[42]
  1067.         mov    word ptr current_division_length_high, ax
  1068. ish_main:    mov    dx, offset read_buffer
  1069.         mov    cx, para_66$66_60$60
  1070.         cmp    mv_num, 0
  1071.         jz    ish_main_2
  1072.         cmp    word ptr current_division_length_high, 0
  1073.         jnz    ish_main_2
  1074.         cmp    cx, word ptr current_division_length_low
  1075.         jc    ish_main_2
  1076.         mov    cx, word ptr current_division_length_low
  1077. ish_main_2:    call    _read
  1078.         jc    error_05
  1079.         mov    cx, ax
  1080.         sub    word ptr current_division_length_low, ax
  1081.         sbb    word ptr current_division_length_high, 0
  1082.         xchg    read_length, ax
  1083.         mov    si, offset read_buffer
  1084.         mov    bx, para_66$66_60$60_read_buffer
  1085.         mov    bx, [bx]
  1086.         mov    dx, offset crc_table
  1087.         xchg    ax, bx
  1088.         cmp    bx, para_66$66?1_60$60?1
  1089.         jz    ish_main_1
  1090.         inc    bx
  1091.         jnz    not_begining
  1092.         mov    ax, 0ffffh
  1093. not_begining:    jcxz    skip_calc_crc
  1094.         @@crc_sub
  1095. skip_calc_crc:    mov    cx, para_66$66_60$60_read_buffer
  1096.         sub    cx, si
  1097.         jz    not_end_of_file
  1098.         not    ax
  1099. not_end_of_file:
  1100.         mov    di, si
  1101.         stosw
  1102.         jmp    fill_zero
  1103.  
  1104. ish_main_1:    mov    cx, para_66$66@1_60$60@1
  1105.         mov    di, si
  1106.         stosb
  1107. fill_zero:    xor    ax, ax
  1108.         rep    stosb
  1109.         @@make_table
  1110.         @@write_table
  1111.         mov    ax, read_length
  1112.         cmp    ax, para_66$66?1_60$60?1
  1113.         jnb    ish_main
  1114.         call    title2
  1115.         call    _write_close
  1116.         jc    error_09
  1117.  
  1118.         mov    ax, word ptr mv_num
  1119.         or    ax, ax
  1120.         jz    ish_main_ret
  1121. ;        cmp    word ptr title_count2, ax
  1122. ;        jnz    title_ret
  1123. ;        add    save_count_low, ax
  1124. ;        adc    save_count_high, 0
  1125.         inc    byte ptr work_table[1]
  1126.         mov    al, byte ptr max_division
  1127.         cmp    al, byte ptr work_table[1]
  1128.         jc    ish_main_ret
  1129.         jnz    ish_main_3
  1130.         mov    ax, word ptr last_division_lines
  1131.         mov    word ptr mv_num, ax
  1132. ish_main_3:    mov    si, word ptr ixx
  1133.         mov    ax, [si]
  1134.         inc    ah
  1135.         cmp    ah, '9' + 1
  1136.         jc    title_4
  1137.         add    ax, 0f601h
  1138.         cmp    al, '9' + 1
  1139.         jnz    title_4
  1140.         mov    al, 'a'
  1141. title_4:    mov    [si], ax
  1142.         cmp    byte ptr stdout, 0
  1143.         jnz    title_5
  1144.         mov    ax, 3c00h
  1145.         mov    dx, offset work_fcb_2
  1146.         xor    cx, cx
  1147.         int    21h        ; create output_file
  1148.         jc    error_08
  1149.         mov    write_handler, ax
  1150. title_5:
  1151. ;        call    disp_ish
  1152.         call    init_constants
  1153.         call    header_title_write
  1154.         jmp    ish_main_0
  1155.  
  1156. ish_main_ret:    mov    bx, read_handler
  1157.         mov    ah, 3eh            ; close input file
  1158.         int    21h
  1159.         jc    error_05
  1160.         mov    word ptr read_handler, 0
  1161.         endm
  1162.  
  1163.  
  1164.  
  1165. ;-----------------------------------------------;
  1166. ;                        ;
  1167. ;    @@calc_crc_of_inputfile            ;
  1168. ;                        ;
  1169. ;    INPUT :    NON                ;
  1170. ;    OUTPUT:    NON                ;
  1171. ;    ERROR :    error_05            ;
  1172. ;    BREAK :    flags, ax, bx, cx, dx, bp, di    ;
  1173. ;                        ;
  1174. ;                        ;
  1175. ;-----------------------------------------------;
  1176.  
  1177. @@calc_crc_of_inputfile    macro
  1178.         push    si
  1179.         mov    ax, word ptr work_table[2]
  1180.         mov    dx, word ptr work_table[4]
  1181.         cmp    word ptr max_division, 0
  1182.         jnz    calc_crc_of_inputfile_1
  1183.         mov    bx, word ptr read_handler
  1184.         call    calc_crc_of_file
  1185.         jc    error_05
  1186.         jmp    calc_crc_of_inputfile_4
  1187.  
  1188. calc_crc_of_inputfile_1:
  1189.         mov    word ptr length_low, ax
  1190.         mov    word ptr length_high, dx
  1191.         mov    ax, 0ffffh
  1192.         mov    dx, ax
  1193.         mov    bp, ax
  1194.         mov    word ptr current_division, 1
  1195. calc_crc_of_inputfile_2:
  1196.         mov    bx, word ptr work_table[40]
  1197.         mov    cx, word ptr work_table[42]
  1198.         sub    word ptr length_low, bx
  1199.         sbb    word ptr length_high, cx
  1200. calc_crc_of_inputfile_3:
  1201.         mov    word ptr length_of_file_low, bx
  1202.         mov    word ptr length_of_file_high, cx
  1203.         mov    di, 0ffffh
  1204.         mov    bx, word ptr read_handler
  1205.         @@calc_crc_of_file_sub    @@crc16_16_32_sub
  1206.         jc    error_05
  1207.         mov    bx, word ptr current_division
  1208.         add    bx, bx
  1209.         not    di
  1210.         mov    word ptr each_volume_crc16[bx-2], di
  1211.         shr    bx, 1
  1212.         inc    bx
  1213.         mov    word ptr current_division, bx
  1214.         cmp    bx, word ptr max_division
  1215.         jc    calc_crc_of_inputfile_2
  1216.         mov    bx, word ptr length_low
  1217.         mov    cx, word ptr length_high
  1218.         jz    calc_crc_of_inputfile_3
  1219.         not    ax
  1220.         not    dx
  1221.         not    bp
  1222. calc_crc_of_inputfile_4:
  1223.         mov    word ptr work_table[34], bp
  1224.         mov    word ptr work_table[36], ax
  1225.         mov    word ptr work_table[38], dx
  1226.         mov    ax, 4200h
  1227.         mov    bx, word ptr read_handler
  1228.         xor    cx, cx
  1229.         xor    dx, dx
  1230.         int    21h        ; move file pointer (rewind)
  1231.         jc    error_05
  1232.         pop    si
  1233.         endm
  1234.  
  1235.  
  1236.  
  1237. ;-----------------------------------------------;
  1238. ;                        ;
  1239. ;    @@make_ish_main                ;
  1240. ;                        ;
  1241. ;    INPUT :    NON                ;
  1242. ;    OUTPUT:    NON                ;
  1243. ;    ERROR :    ?                ;
  1244. ;    BREAK :    flags, ?            ;
  1245. ;                        ;
  1246. ;                        ;
  1247. ;-----------------------------------------------;
  1248.  
  1249. @@make_ish_main    macro
  1250.         @@make_header
  1251.         @@set_each_size
  1252.         @@make_header_title
  1253.         push    di
  1254.         cmp    byte ptr stdout, 0
  1255.         jnz    make_ish_main_1
  1256.         @@check_ish_file
  1257.         @@get_disk_free_space
  1258.         pop    di
  1259.         push    di
  1260.         push    bx
  1261.         @@calc_file_size
  1262.         pop    cx
  1263.         mul    cx
  1264.         @@cmp_dd    dx, ax, si, bx
  1265.         jc    error_16_2
  1266.         @@create_ish_file
  1267. make_ish_main_1:
  1268.         @@calc_crc_of_inputfile
  1269. ;        mov    word ptr file_block_length, 1 ;************
  1270. ;        call    disp_ish
  1271.         pop    cx
  1272.         @@ish_main
  1273.         endm
  1274.