home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c013 / 34.ddi / CCVECTOR / INSIGHT.100 / GETDOTS.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-11-26  |  38.9 KB  |  1,932 lines

  1. CCode        equ [bp+18]
  2. FileIndex    equ [bp+20]
  3. FileHandle    equ [bp+22]
  4. BitWidth    equ [bp+24]
  5. BitHeight    equ [bp+26]
  6.  
  7. public          _GetDOTS
  8.  
  9. recovery        segment    byte public 'CODE'
  10.         assume    cs:recovery, ds:recovery
  11.  
  12.  
  13. ;**************************************************************************
  14. ;                                                                         *
  15. ;                       External Entry Point                              *
  16. ;**************************************************************************
  17.  
  18. data_3        dw    80h            ; Data table (indexed access)
  19.  
  20.         db      60h, 00h, 60h, 00h, 60h, 00h, 60h, 00h
  21.         db    80h, 00h, 80h, 00h, 80h, 00h, 60h, 00h
  22.         db    80h, 00h, 60h, 00h, 80h, 00h, 80h, 00h
  23.         db    80h, 00h, 80h, 00h, 80h, 00h, 60h, 00h
  24.         db    60h, 00h, 60h, 00h, 60h, 00h, 60h, 00h
  25.         db    60h, 00h, 00h, 01h, 00h, 01h, 00h, 01h
  26.         db    00h, 01h, 00h, 01h, 80h, 00h, 00h, 01h
  27.         db    00h, 01h, 00h, 01h
  28.  
  29. Bit_Width    dw    0
  30. Bit_Height    dw    0
  31. data_7        dw    0
  32. data_8        dw    0
  33. File_Index    dw    0
  34. data_10        dw    0
  35. data_11        dw    0
  36. data_12        dw    0
  37.         db    0, 0
  38.  
  39. data_13        dw    0
  40. data_14        dw    0
  41.  
  42.  
  43. _GetDOTS    proc    far
  44.         push    bp
  45.         push    ds
  46.         push    es
  47.         push    si
  48.         push    di
  49.         push    bx
  50.         push    cx
  51.  
  52.         mov     bp,sp
  53.         mov     ax,CCode
  54.         mov    bx,100
  55.         div    bx
  56.         mov    bh,al
  57.         mov    bl,dl
  58.         add    bx,0a0a0h          ; hz code-->bx
  59.  
  60.         mov     cx,BitHeight          ; 3--height of font-->cx
  61.  
  62.         mov    ax,cs
  63.         mov    ds,ax                 ; ds = cs
  64.         mov    es,ax                 ; es = cs
  65.  
  66.         mov    data_51,0
  67.  
  68.         mov    dx,FileHandle         ; 4--handle number-->File_Handle
  69.         mov    File_Handle,dx
  70.  
  71.         mov     ax,BitWidth           ; 5--width of font-->ax
  72.  
  73.         mov     dx,FileIndex          ; 6--index number
  74.         xor    dh,dh
  75.         xchg    dx,bx                   ; -->bl = File index number
  76.                         ; HZ CODE --> dx
  77.  
  78.         mov    bp,0h                   ; when bp=1800h, hz reduce half size!
  79.         mov    si,1
  80.         mov    di,cx                   ; height of font-->cx-->di
  81.  
  82.         cld                ; Clear direction
  83.         or    dx,dx            ; Zero ? hz q&w=0?
  84.         jnz    loc_2            ; Jump if not zero ==> loc_2
  85.  
  86.         mov    bx,offset HZDOTs_OK
  87.  
  88. ; come from up & loc_22
  89. here:                                         ; Here are two output data.
  90.         mov dx,es                     ; 1--seg address of output buffer
  91.         mov ax,di                     ; 2--offset address of output buffer
  92.  
  93.         pop     cx
  94.         pop     bx
  95.         pop     di
  96.         pop     si
  97.         pop     es
  98.         pop     ds
  99.         pop     bp
  100.         retf                ; Routine  return
  101. _GetDOTS        endp
  102.  
  103.  
  104. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  105. loc_2:
  106.  
  107. ;!        push    ds                      ;! can delete!
  108. ;!        push    es                      ;! can delete!
  109. ;!        push    cs                      ;! can delete!
  110. ;!        pop    ds                      ;! can delete!
  111. ;!        push    cs                      ;! can delete!
  112. ;!        pop    es                      ;! can delete!
  113.  
  114.         or    ax,ax            ; Zero ? [width  of font=0]
  115.         jnz    loc_3            ; Jump if not zero
  116.         jmp    loc_22
  117. loc_3:
  118.         or    cx,cx            ; Zero ? [height of font=0]
  119.         jnz    loc_4            ; Jump if not zero
  120.         jmp    loc_22
  121. loc_4:
  122.         cmp    ax,Img_BufWH            ; ? [width  of font < 0x140 (320) ]
  123.         jb    loc_5            ; Jump if below
  124.         mov    ax,Img_BufWH
  125. loc_5:
  126.         cmp    cx,Img_BufWH            ; ? [height of font < 0x140 (320) ]
  127.         jb    loc_6            ; Jump if below
  128.         mov    cx,Img_BufWH
  129. loc_6:
  130.         test    bp,1800h                ; when bp=1800h, hz reduce half size!
  131.         jz    loc_7            ; Jump if zero
  132.         shr    ax,1            ; Shift w/zeros fill
  133. loc_7:
  134.         mov    Bit_Height,cx
  135.         mov    Bit_Width, ax
  136.         mov    data_7,si               ; data_7=? now is 1
  137.         mov    data_8,di               ; data_8=  height of font
  138.         mov    File_Index,bx
  139.  
  140.                                                 ; ? English char
  141.                 or    dh,dh            ; Zero ? HZ CODE's q code=0 ?
  142.         jnz    loc_8            ; Jump if not zero
  143.         jmp    short loc_12            ; ! short can delete!
  144.  
  145. loc_8:
  146.         sub    dx,0A0A0h
  147.         xor    ax,ax            ; Zero register
  148.         xor    cx,cx            ; Zero register
  149.         xor    bx,bx            ; Zero register
  150.  
  151.         dec    dh
  152.         dec    dl
  153.  
  154.         mov    al,dh
  155.         mov    cl,dl
  156.  
  157.         cmp    dh,0Fh
  158.  
  159.         jb    loc_9            ; Jump if below, hzcode q <15
  160.         sub    ax,0Fh
  161.         add    File_Index,1
  162.         jmp    short loc_10
  163.  
  164. loc_9:
  165.         mov    File_Index,0
  166. loc_10:
  167.         mov    bx,File_Index
  168.         shl    bx,1            ; Shift w/zeros fill
  169.         mov    bx,data_3[bx]           ; get current lib's source dots number
  170.         mov    data_13,bx              ; data_13= current lib's source dots number
  171.         mov    data_14,bx              ; data_14= current lib's source dots number
  172.  
  173.         mov    bx,5Eh                  ; every q is 94 hzs
  174.         mul    bx            ; dx:ax = reg * ax
  175.         add    ax,cx                   ; add hz's w code offset
  176.  
  177.  
  178.              ;▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  179.         call    sub_2                   ; =====> sub_2  UN COMPRESS!
  180.              ;▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  181.  
  182.         jc    loc_11            ; Jump if carry Set
  183.  
  184.              ;░░░░░░░░░░░░░░░░░
  185.         call    sub_4                   ; =====> sub_4  UN CROSS!
  186.              ;░░░░░░░░░░░░░░░░░
  187.  
  188.         jmp    short loc_18
  189.  
  190. loc_11:
  191.         mov    HZ_LAST_OK,0
  192.         jmp    short loc_18
  193.  
  194. loc_12:
  195.         cmp    bx,2
  196.         jb    loc_13            ; Jump if below
  197.         mov    File_Index,0
  198. loc_13:
  199.         sub    dl,21h            ; '!'
  200.         mov    cx,dx
  201.         mov    ax,File_Index
  202.         mov    bx,5Eh
  203.         mul    bx            ; dx:ax = reg * ax
  204.         add    ax,34Eh
  205.         add    ax,cx
  206.         mov    File_Index,0
  207.         mov    bx,data_3
  208.         mov    data_13,bx
  209.         push    ax
  210.         mov    ax,data_13
  211.         shr    ax,1            ; Shift w/zeros fill
  212.         mov    data_14,ax
  213.  
  214.         cmp    cl,7Eh            ; '~'
  215.         jbe    loc_14            ; Jump if below or =
  216.         pop    ax
  217.         jmp    short loc_15
  218.  
  219. loc_14:
  220.         pop    ax
  221.         call    sub_2
  222.  
  223.         jc    loc_15            ; Jump if carry Set
  224.         call    sub_4
  225.         jmp    short loc_16
  226.  
  227. loc_15:
  228.         mov    HZ_LAST_OK,0
  229. loc_16:
  230.         test    bp,8000h
  231.         jz    loc_17            ; Jump if zero
  232.         jmp    short loc_18
  233.  
  234. loc_17:
  235.         xor    dx,dx            ; Zero register
  236.         mov    ax,Bit_Width
  237.         shr    ax,1            ; Shift w/zeros fill
  238.         mov    Bit_Width,ax
  239.  
  240.  
  241. loc_18:
  242.         mov    ax,Bit_Width
  243.         add    ax,7
  244.         shr    ax,1            ; Shift w/zeros fill
  245.         shr    ax,1            ; Shift w/zeros fill
  246.         shr    ax,1            ; Shift w/zeros fill
  247.  
  248.         mov    si,offset HZ_LAST_OK
  249.         mov    bx,data_8
  250.         sub    bx,data_7
  251.         mov    data_19,bx
  252.         mov    bx,data_7
  253.         push    bp
  254.         mov    bp,1
  255.         call    sub_7                   ; =====> sub_7
  256.         pop    bp
  257.  
  258.         test    bp,1
  259.         jz    loc_19            ; Jump if zero
  260.  
  261.         call    sub_5                   ; =====> sub_5
  262. loc_19:
  263.         jmp    short loc_00        ; delay for I/O
  264.         nop
  265. loc_00:
  266.         mov    ax,Bit_Width
  267.         mov    cx,Bit_Height
  268.         test    bp,1
  269.         jnz    loc_20            ; Jump if not zero
  270.         mov    bx,offset HZDOTs_OK
  271.         jmp    short loc_21
  272.  
  273. loc_20:
  274.         mov    bx,offset HZ_LAST_OK
  275. loc_21:
  276.         mov    dx,ds
  277. loc_22:
  278.         mov    bp,ax
  279.         mov    di,bx
  280. ;        call    sub_22                  ; ?????
  281.         mov    si,offset HZDOTs_OK
  282.         mov    di,offset Img_Buffer
  283.         mov    Bit_Height,cx
  284.         mov    Bit_Width,bp
  285.         call    sub_1                   ; =====> sub_1
  286.  
  287. ;!        pop    es                      ;! can delete!
  288. ;!        pop    ds                      ;! can delete!
  289.  
  290.         jmp    here            ; Interrupt return
  291.  
  292.  
  293. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  294. ;**************************************************************************
  295. ;        SUBROUTINE  1                                                    *
  296. ;**************************************************************************
  297.  
  298. sub_1        proc    near
  299.         push    si
  300.         push    di
  301.         push    bp
  302.         push    dx
  303.         push    cx
  304.         push    bx
  305.         push    ax
  306.         mov    ax,Bit_Width
  307.         add    ax,7
  308.         mov    cl,8
  309.         div    cl            ; al, ah rem = ax/reg
  310.         mov    cl,al
  311.         mov    bp,Bit_Height
  312.         xor    ch,ch            ; Zero register
  313. loc_23:
  314.         xor    dx,dx            ; Zero register
  315. loc_24:
  316.         mov    ax,dx
  317.         push    cx
  318.         push    dx
  319.         xor    ch,ch            ; Zero register
  320.         mul    cx            ; dx:ax = reg * ax
  321.         pop    dx
  322.         pop    cx
  323.         push    cx
  324.         mov    cl,ch
  325.         xor    ch,ch            ; Zero register
  326.         add    ax,cx
  327.         pop    cx
  328.         mov    bx,ax
  329.         mov    al,[bx+si]
  330.         mov    [di],al
  331.         inc    di
  332.         inc    dx
  333.         cmp    dx,bp
  334.         jl    loc_24            ; Jump if <
  335.         inc    ch
  336.         cmp    ch,cl
  337.         jl    loc_23            ; Jump if <
  338.         pop    ax
  339.         pop    bx
  340.         pop    cx
  341.         pop    dx
  342.         pop    bp
  343.         pop    di
  344.         pop    si
  345.         retn
  346. sub_1        endp
  347.  
  348.  
  349. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  350. ;***********************************************************************
  351. ;   SUBROUTINE     2    read Chinese library file                      *
  352. ;***********************************************************************
  353.  
  354. sub_2        proc    near
  355.         cmp    ax,2040h            ; >=8000?
  356.         jb    loc_25            ; Jump if below
  357.         mov    ax,2040h                ; 1f40h
  358. loc_25:
  359.         push    ax
  360.         push    bx
  361.         push    cx
  362.         push    dx
  363.  
  364.         mov    cx,6
  365.         mul    cx            ; dx:ax = reg * ax
  366.         xor    cx,cx            ; Zero register
  367.  
  368.                 add     ax,100h
  369.                 mov    dx,ax
  370.  
  371.         mov    ah,42h            ; 'B'
  372.         mov    al,0
  373.         mov    bx,File_Handle
  374.         int    21h            ; DOS Services    ah=function 42h
  375.                         ;  move file ptr, bx=file handle
  376.                              ;   al=method,    cx,dx=offset
  377.         jc    loc_28            ; Jump if carry Set
  378.  
  379.         mov    ah,3Fh            ; '?'
  380.         mov    bx,File_Handle
  381.         mov    cx,6
  382.         mov    dx,offset HZDOTs_Address
  383.         int    21h            ; DOS Services    ah=function 3Fh
  384.                         ;  read file,     bx=file handle
  385.                         ;   cx=bytes to ds:dx buffer
  386.         jc    loc_28            ; Jump if carry Set
  387.  
  388.         cmp    HZDOTs_Length,0
  389.         je    loc_28            ; Jump if equal
  390.  
  391.                 mov    dx,HZDOTs_Address
  392.                 add     dx, 100h
  393.  
  394.                 mov    cx,HZDOTs_Address_B
  395.  
  396.                 mov    ah,42h            ; 'B'
  397.  
  398.         mov    al,0
  399.         mov    bx,File_Handle
  400.         int    21h            ; DOS Services  ah=function 42h
  401.                         ;  move file ptr, bx=file handle
  402.                         ;   al=method, cx,dx=offset
  403.         jc    loc_28            ; Jump if carry Set
  404.         mov    bx,File_Handle
  405.         mov    ah,3Fh            ; '?'
  406.         mov    cx,HZDOTs_Length
  407.         mov    dx,offset HZDOTs_Address; new is [HZDOTs_OK]
  408.         int    21h            ; DOS Services  ah=function 3Fh
  409.                         ;  read file, bx=file handle
  410.                         ;   cx=bytes to ds:dx buffer
  411.  
  412.  
  413. ;!              jnc    loc_26            ; Jump if carry=0
  414. ;!loc_26:
  415.  
  416.            mov    si,offset HZDOTs_Address
  417.            mov    di,offset HZDOTs_OK
  418.  
  419.            cmp    File_Index,16h          ; FONT No. 25 is unCompressed!
  420.  
  421.            jb    loc_27            ; Jump if below
  422.  
  423.            mov    cx,200h
  424.            rep    movsw            ; Rep when cx >0 Mov [si] to es:[di]
  425.            jmp    short loc_28
  426.  
  427. loc_27:
  428.                 call    sub_3                   ; Clear carry flag
  429.             clc
  430.  
  431.  
  432. loc_28:
  433.                 clc
  434.         pop    dx
  435.         pop    cx
  436.         pop    bx
  437.         pop    ax
  438.         retn
  439. sub_2        endp
  440.  
  441.  
  442. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  443. ;**************************************************************************
  444. ;            SUBROUTINE   3                                               *
  445. ;**************************************************************************
  446.  
  447. data_15        dw    0
  448. data_16        dw    0
  449.  
  450.  
  451.  
  452. sub_3        proc    near
  453.         push    bp
  454.         cld                ; Clear direction
  455.         mov    bx,cx
  456.         mov    cs:data_16,di
  457.         mov    cs:data_15,0
  458. loc_29:
  459.         lodsb                ; String [si] to al
  460.         dec    bx
  461.         test    al,80h
  462.         jz    loc_31            ; Jump if zero
  463.         test    al,40h            ; '@'
  464.         jnz    loc_30            ; Jump if not zero
  465.         jmp    loc_38
  466. loc_30:
  467.         push    ax
  468.         push    bx
  469.         mov    bx,cs:data_16
  470.         mov    ax,cs:data_15
  471.         mov    [bx],ax
  472.         mov    cs:data_16,di
  473.         inc    di
  474.         inc    di
  475.         pop    bx
  476.         pop    ax
  477.         mov    cs:data_15,0
  478.         mov    ah,al
  479.         lodsb                ; String [si] to al
  480.         dec    bx
  481.         and    ah,3Fh            ; '?'
  482.         shl    ax,1            ; Shift w/zeros fill
  483.         shr    al,1            ; Shift w/zeros fill
  484.         xchg    ah,al
  485.         mov    dx,ax
  486.         jmp    loc_56
  487. loc_31:
  488.         test    al,40h            ; '@'
  489.         jnz    loc_32            ; Jump if not zero
  490.         jmp    loc_50
  491. loc_32:
  492.         xor    ah,ah            ; Zero register
  493.         mov    bp,ax
  494.         and    bp,30h
  495.         and    al,0Fh
  496.         xor    cx,cx            ; Zero register
  497.         mov    cl,al
  498.         add    cs:data_15,cx
  499.  
  500. locloop_33:
  501.         lodsb                ; String [si] to al
  502.         dec    bx
  503.         mov    ah,al
  504.         and    ah,0Fh
  505.         shr    al,1            ; Shift w/zeros fill
  506.         shr    al,1            ; Shift w/zeros fill
  507.         shr    al,1            ; Shift w/zeros fill
  508.         shr    al,1            ; Shift w/zeros fill
  509.         or    bp,bp            ; Zero ?
  510.         jz    loc_34            ; Jump if zero
  511.         cmp    bp,10h
  512.         je    loc_35            ; Jump if equal
  513.         cmp    bp,20h
  514.         je    loc_36            ; Jump if equal
  515.         add    dl,al
  516.         sub    dh,ah
  517.         jmp    short loc_37
  518.  
  519. loc_34:
  520.         add    dl,al
  521.         add    dh,ah
  522.         jmp    short loc_37
  523.  
  524. loc_35:
  525.         sub    dl,al
  526.         add    dh,ah
  527.         jmp    short loc_37
  528.  
  529. loc_36:
  530.         sub    dl,al
  531.         sub    dh,ah
  532. loc_37:
  533.         mov    ax,dx
  534.         stosw                ; Store ax to es:[di]
  535.         loop    locloop_33        ; Loop if cx > 0
  536.  
  537.         jmp    loc_57
  538. loc_38:
  539.         xor    ah,ah            ; Zero register
  540.         mov    bp,ax
  541.         and    bp,30h
  542.         or    bp,bp            ; Zero ?
  543.         jz    loc_42            ; Jump if zero
  544.         cmp    bp,10h
  545.         je    loc_46            ; Jump if equal
  546.         lodsb                ; String [si] to al
  547.         dec    bx
  548.         mov    ah,al
  549.         lodsb                ; String [si] to al
  550.         dec    bx
  551.         xchg    ah,al
  552.         test    al,80h
  553.         jz    loc_39            ; Jump if zero
  554.         and    al,7Fh
  555.         sub    dl,al
  556.         jmp    short loc_40
  557.  
  558. loc_39:
  559.         add    dl,al
  560. loc_40:
  561.         test    ah,80h
  562.         jz    loc_41            ; Jump if zero
  563.         and    ah,7Fh
  564.         sub    dh,ah
  565.         jmp    loc_56
  566. loc_41:
  567.         add    dh,ah
  568.         jmp    loc_56
  569. loc_42:
  570.         and    al,0Fh
  571.         mov    ah,al
  572.         lodsb                ; String [si] to al
  573.         dec    bx
  574.         xchg    ah,al
  575.         test    al,8
  576.         jz    loc_43            ; Jump if zero
  577.         and    al,7
  578.         sub    dl,al
  579.         jmp    short loc_44
  580.  
  581. loc_43:
  582.         add    dl,al
  583. loc_44:
  584.         test    ah,80h
  585.         jz    loc_45            ; Jump if zero
  586.         and    ah,7Fh
  587.         sub    dh,ah
  588.         jmp    short loc_56
  589.  
  590. loc_45:
  591.         add    dh,ah
  592.         jmp    short loc_56
  593.  
  594. loc_46:
  595.         and    al,0Fh
  596.         mov    ah,al
  597.         lodsb                ; String [si] to al
  598.         dec    bx
  599.         test    al,80h
  600.         jz    loc_47            ; Jump if zero
  601.         and    al,7Fh
  602.         sub    dl,al
  603.         jmp    short loc_48
  604.         
  605. loc_47:
  606.         add    dl,al
  607. loc_48:
  608.         test    ah,8
  609.         jz    loc_49            ; Jump if zero
  610.         and    ah,7
  611.         sub    dh,ah
  612.         jmp    short loc_56
  613.         
  614. loc_49:
  615.         add    dh,ah
  616.         jmp    short loc_56
  617.         
  618. loc_50:
  619.         and    ax,3Fh
  620.         mov    cx,ax
  621.         add    cs:data_15,cx
  622.  
  623. locloop_51:
  624.         lodsb                ; String [si] to al
  625.         dec    bx
  626.         mov    ah,al
  627.         and    ah,0Fh
  628.         shr    al,1            ; Shift w/zeros fill
  629.         shr    al,1            ; Shift w/zeros fill
  630.         shr    al,1            ; Shift w/zeros fill
  631.         shr    al,1            ; Shift w/zeros fill
  632.         test    al,8
  633.         jz    loc_52            ; Jump if zero
  634.         and    al,7
  635.         sub    dl,al
  636.         jmp    short loc_53
  637.  
  638. loc_52:
  639.         add    dl,al
  640. loc_53:
  641.         test    ah,8
  642.         jz    loc_54            ; Jump if zero
  643.         and    ah,7
  644.         sub    dh,ah
  645.         jmp    short loc_55
  646.         
  647. loc_54:
  648.         add    dh,ah
  649. loc_55:
  650.         mov    ax,dx
  651.         stosw                ; Store ax to es:[di]
  652.         loop    locloop_51        ; Loop if cx > 0
  653.  
  654.         jmp    short loc_57
  655.         
  656. loc_56:
  657.         inc    cs:data_15
  658.         mov    ax,dx
  659.         stosw                ; Store ax to es:[di]
  660. loc_57:
  661.         test    bx,0FFFFh
  662.         jz    loc_58            ; Jump if zero
  663.         jmp    loc_29
  664. loc_58:
  665.         xor    ax,ax            ; Zero register
  666.         stosw                ; Store ax to es:[di]
  667.         mov    bx,cs:data_16
  668.         mov    ax,cs:data_15
  669.         mov    [bx],ax
  670.         pop    bp
  671.         retn
  672. sub_3        endp
  673.  
  674.  
  675.  
  676. ;**************************************************************************
  677. ;        SUBROUTINE  4 fill input buffer                                  *
  678. ;**************************************************************************
  679.  
  680. data_17        dw    0
  681.  
  682.  
  683. sub_4        proc    near
  684.         push    di
  685.         push    si
  686.         test    bp,1
  687.         jz    loc_59            ; Jump if zero
  688.         xor    dx,dx            ; Zero register
  689.         mov    ax,Bit_Height
  690.         mov    cx,18h
  691.         div    cx            ; ax,dx rem=dx:ax/reg
  692.         mov    data_17,0
  693.         or    dx,dx            ; Zero ?
  694.         jz    loc_59            ; Jump if zero
  695.         sub    cx,dx
  696.         mov    data_17,cx
  697. loc_59:
  698.         mov    si,offset HZDOTs_OK
  699.         mov    di,offset HZ_LAST_OK
  700. loc_60:
  701.         lodsw                ; String [si] to ax
  702.         or    ax,ax            ; Zero ?
  703.         jnz    loc_61            ; Jump if not zero
  704.         jmp    loc_74
  705. loc_61:
  706.         stosw                ; Store ax to es:[di]
  707.         mov    cx,ax
  708. loc_62:
  709.         xor    ax,ax            ; Zero register
  710.         lodsb                ; String [si] to al
  711.         cmp    ax,data_13
  712.         jb    loc_63            ; Jump if below
  713.         mov    ax,data_13
  714.         dec    ax
  715. loc_63:
  716.         push    ax
  717.         xor    ax,ax            ; Zero register
  718.         lodsb                ; String [si] to al
  719.         cmp    ax,data_13
  720.         jb    loc_64            ; Jump if below
  721.         mov    ax,data_13
  722.         dec    ax
  723. loc_64:
  724.         mov    bx,ax
  725.         pop    ax
  726.         test    bp,1000h
  727.         jz    loc_65            ; Jump if zero
  728.         shr    bx,1            ; Shift w/zeros fill
  729.         jmp    short loc_66
  730.         
  731. loc_65:
  732.         test    bp,800h
  733.         jz    loc_66            ; Jump if zero
  734.         shr    bx,1            ; Shift w/zeros fill
  735.         mov    dx,data_13
  736.         shr    dx,1            ; Shift w/zeros fill
  737.         add    bx,dx
  738. loc_66:
  739.         test    bp,8000h
  740.         jz    loc_71            ; Jump if zero
  741.         test    bp,4000h
  742.         jz    loc_68            ; Jump if zero
  743.         test    bp,2000h
  744.         jz    loc_67            ; Jump if zero
  745.         jmp    short loc_69
  746.         
  747. loc_67:
  748.         mov    dx,data_13
  749.         sub    dx,bx
  750.         dec    dx
  751.         mov    bx,ax
  752.         mov    ax,dx
  753.         mov    dx,data_13
  754.         sub    dx,data_14
  755.         add    bx,dx
  756.         jmp    short loc_71
  757.         
  758. loc_68:
  759.         test    bp,2000h
  760.         jz    loc_70            ; Jump if zero
  761. loc_69:
  762.         mov    dx,data_13
  763.         sub    dx,bx
  764.         dec    dx
  765.         mov    bx,dx
  766.         mov    dx,data_14
  767.         sub    dx,ax
  768.         dec    dx
  769.         mov    ax,dx
  770.         jmp    short loc_71
  771.         
  772. loc_70:
  773.         mov    dx,data_13
  774.         sub    dx,ax
  775.         dec    dx
  776.         mov    ax,bx
  777.         mov    bx,dx
  778. loc_71:
  779.         push    bx
  780.         mov    bx,Bit_Width
  781.         mul    bx            ; dx:ax = reg * ax
  782.         mov    bx,data_13
  783.         div    bx            ; ax,dx rem=dx:ax/reg
  784.         stosw                ; Store ax to es:[di]
  785.         pop    ax
  786.         mov    bx,Bit_Height
  787.         mul    bx            ; dx:ax = reg * ax
  788.         mov    bx,data_13
  789.         div    bx            ; ax,dx rem=dx:ax/reg
  790.         test    bp,1
  791.         jz    loc_72            ; Jump if zero
  792.         add    ax,data_17
  793. loc_72:
  794.         stosw                ; Store ax to es:[di]
  795.         dec    cx
  796.         jz    loc_73            ; Jump if zero
  797.         jmp    loc_62
  798. loc_73:
  799.         jmp    loc_60
  800. loc_74:
  801.         stosw                ; Store ax to es:[di]
  802.         pop    di
  803.         pop    si
  804.         retn
  805. sub_4        endp
  806.  
  807.  
  808.  
  809. ;**************************************************************************
  810. ;         SUBROUTINE  5                                                   *
  811. ;**************************************************************************
  812.  
  813. sub_5        proc    near
  814.         xor    dx,dx            ; Zero register
  815.         mov    ax,data_19
  816.         mov    cx,8
  817.         div    cx            ; ax,dx rem=dx:ax/reg
  818.         mov    data_11,dx
  819.         mov    data_10,ax
  820.         mov    cx,Bit_Width
  821.         add    cx,7
  822.         shr    cx,1            ; Shift w/zeros fill
  823.         shr    cx,1            ; Shift w/zeros fill
  824.         shr    cx,1            ; Shift w/zeros fill
  825.         mov    data_12,cx
  826.         mov    si,offset HZDOTs_OK
  827.         mov    di,offset HZ_LAST_OK
  828.  
  829. locloop_75:
  830.         push    cx
  831.         mov    cx,8
  832.  
  833. locloop_76:
  834.         push    si
  835.         push    cx
  836.         mov    dx,data_10
  837. loc_77:
  838.         or    dx,dx            ; Zero ?
  839.         jz    loc_78            ; Jump if zero
  840.         mov    cx,8
  841.         call    sub_6
  842.         inc    di
  843.         dec    dx
  844.         jmp    short loc_77
  845. loc_78:
  846.         mov    cx,data_11
  847.         or    cx,cx            ; Zero ?
  848.         jz    loc_79            ; Jump if zero
  849.         call    sub_6
  850.         inc    di
  851. loc_79:
  852.         pop    cx
  853.         pop    si
  854.         loop    locloop_76        ; Loop if cx > 0
  855.  
  856.         inc    si
  857.         pop    cx
  858.         loop    locloop_75        ; Loop if cx > 0
  859.  
  860.         retn
  861. sub_5        endp
  862.  
  863.  
  864. ;**************************************************************************
  865. ;           SUBROUTINE  6                                                 *
  866. ;**************************************************************************
  867.  
  868. sub_6        proc    near
  869.         or    cx,cx            ; Zero ?
  870.         jz    loc_ret_81        ; Jump if zero
  871.         mov    bx,cx
  872.  
  873. locloop_80:
  874.         shl    byte ptr [si],1        ; Shift w/zeros fill
  875.         rcl    byte ptr [di],1        ; Rotate thru carry
  876.         add    si,data_12
  877.         loop    locloop_80        ; Loop if cx > 0
  878.  
  879.         mov    cx,bx
  880.         xchg    ch,cl
  881.         mov    cl,8
  882.         sub    cl,ch
  883.         jz    loc_ret_81        ; Jump if zero
  884.         shl    byte ptr [di],cl    ; Shift w/zeros fill
  885.  
  886. loc_ret_81:
  887.         retn
  888. sub_6        endp
  889.  
  890. ;**************************************************************************
  891. ;        SUBROUTINE   7                                                   *
  892. ;**************************************************************************
  893.  
  894. data_18        dw    0
  895. data_19        dw    18h
  896. data_20        db    0, 0
  897. data_21        dw    0
  898. data_22        db    0
  899. data_23        db    0
  900. data_24        dw    0
  901. data_25        dw    0
  902.  
  903.  
  904. sub_7        proc    near
  905.         push    ax
  906.         push    bx
  907.         push    cx
  908.         push    dx
  909.         push    bp
  910.         push    di
  911.         push    es
  912.         push    cs
  913.         pop    es
  914.         cld                ; Clear direction
  915.         mov    cs:data_21,ax
  916.         mov    word ptr cs:data_20,bx
  917.         mov    cs:data_18,bp
  918.  
  919.         mov    di,offset HZDOTs_Address
  920.         mov    cx,Img_BufSize
  921.         xor    ax,ax            ; Zero register
  922.         rep    stosw            ; Rep when cx >0 Store ax to es:[di]
  923.  
  924.         mov    di,offset HZDOTs_OK
  925.         mov    cx,Img_BufSize
  926.         rep    stosb            ; Rep when cx >0 Store al to es:[di]
  927. loc_82:
  928.         xor    ax,ax            ; Zero register
  929.         lodsw                ; String [si] to ax
  930.         mov    cx,ax
  931.         cmp    cx,0
  932.         jne    loc_83            ; Jump if not equal
  933.         jmp    loc_101
  934. loc_83:
  935.         push    cx
  936.         push    si
  937.         cmp    cs:data_18,0
  938.         jne    loc_84            ; Jump if not equal
  939.         lodsb                ; String [si] to al
  940.         mov    cs:data_24,ax
  941.         lodsb                ; String [si] to al
  942.         mov    cs:data_25,ax
  943.         jmp    short loc_85
  944.         
  945. loc_84:
  946.         lodsw                ; String [si] to ax
  947.         mov    cs:data_24,ax
  948.         lodsw                ; String [si] to ax
  949.         mov    cs:data_25,ax
  950. loc_85:
  951.         dec    cx
  952.  
  953. locloop_86:
  954.         push    cx
  955.         mov    bx,cs:data_24
  956.         mov    dx,cs:data_25
  957.         cmp    cs:data_18,0
  958.         jne    loc_87            ; Jump if not equal
  959.         lodsb                ; String [si] to al
  960.         mov    di,ax
  961.         lodsb                ; String [si] to al
  962.         jmp    short loc_88
  963.         
  964. loc_87:
  965.         lodsw                ; String [si] to ax
  966.         mov    di,ax
  967.         lodsw                ; String [si] to ax
  968. loc_88:
  969.         push    si
  970.         mov    si,ax
  971.         xchg    si,di
  972.         mov    cs:data_24,si
  973.         mov    cs:data_25,di
  974.         call    sub_8
  975.         pop    si
  976.         pop    cx
  977.         jnc    loc_89            ; Jump if carry=0
  978.         loop    locloop_86        ; Loop if cx > 0
  979.  
  980.         pop    cx
  981.         pop    cx
  982.         jmp    short loc_82
  983. loc_89:
  984.         pop    si
  985.         pop    cx
  986.         cmp    cs:data_18,0
  987.         jne    loc_90            ; Jump if not equal
  988.         lodsb                ; String [si] to al
  989.         mov    bx,ax
  990.         lodsb                ; String [si] to al
  991.         mov    dx,ax
  992.         jmp    short loc_91
  993.         
  994. loc_90:
  995.         lodsw                ; String [si] to ax
  996.         mov    bx,ax
  997.         lodsw                ; String [si] to ax
  998.         mov    dx,ax
  999. loc_91:
  1000.         mov    cs:data_30,bx
  1001.         mov    cs:data_31,dx
  1002.         mov    cs:data_24,bx
  1003.         mov    cs:data_25,dx
  1004.         sub    dx,word ptr cs:data_20
  1005.         js    loc_92            ; Jump if sign=1
  1006.         cmp    dx,cs:data_19
  1007.         jae    loc_92            ; Jump if above or =
  1008.         mov    cs:data_22,1
  1009.         mov    cs:data_23,1
  1010. loc_92:
  1011.         dec    cx
  1012.  
  1013. locloop_93:
  1014.         push    cx
  1015.         mov    bx,cs:data_24
  1016.         mov    dx,cs:data_25
  1017.         xor    ax,ax            ; Zero register
  1018.         cmp    cs:data_18,0
  1019.         jne    loc_94            ; Jump if not equal
  1020.         lodsb                ; String [si] to al
  1021.         jmp    short loc_95
  1022.         
  1023. loc_94:
  1024.         lodsw                ; String [si] to ax
  1025. loc_95:
  1026.         mov    di,ax
  1027.         cmp    cs:data_18,0
  1028.         jne    loc_96            ; Jump if not equal
  1029.         lodsb                ; String [si] to al
  1030.         jmp    short loc_97
  1031.         
  1032. loc_96:
  1033.         lodsw                ; String [si] to ax
  1034. loc_97:
  1035.         push    si
  1036.         push    ds
  1037.         push    cs
  1038.         pop    ds
  1039.         mov    si,ax
  1040.         xchg    si,di
  1041.         mov    cs:data_24,si
  1042.         mov    cs:data_25,di
  1043.         call    sub_8
  1044.         jc    loc_98            ; Jump if carry Set
  1045.         call    sub_9
  1046. loc_98:
  1047.         pop    ds
  1048.         pop    si
  1049.         pop    cx
  1050.         loop    locloop_93        ; Loop if cx > 0
  1051.  
  1052.         push    ds
  1053.         push    si
  1054.         push    cs
  1055.         pop    ds
  1056.         mov    bx,cs:data_24
  1057.         mov    dx,cs:data_25
  1058.         mov    si,cs:data_30
  1059.         mov    di,cs:data_31
  1060.         call    sub_8
  1061.         jc    loc_99            ; Jump if carry Set
  1062.         call    sub_9
  1063. loc_99:
  1064.         cmp    cs:data_22,0
  1065.         je    loc_100            ; Jump if equal
  1066.         call    sub_13
  1067. loc_100:
  1068.         pop    si
  1069.         pop    ds
  1070.         mov    cs:data_22,0
  1071.         mov    cs:data_23,0
  1072.         jmp    loc_82
  1073. loc_101:
  1074.         call    sub_19
  1075.         push    cs
  1076.         pop    ds
  1077.         mov    si,offset HZDOTs_OK
  1078.         pop    es
  1079.         pop    di
  1080.         pop    bp
  1081.         pop    dx
  1082.         pop    cx
  1083.         pop    bx
  1084.         pop    ax
  1085.         retn
  1086. sub_7        endp
  1087.  
  1088.  
  1089. ;*************************************************************************
  1090. ;            SUBROUTINE    8                                             *
  1091. ;*************************************************************************
  1092.  
  1093. sub_8        proc    near
  1094.         push    bx
  1095.         push    si
  1096.         push    dx
  1097.         push    di
  1098.         mov    ax,word ptr cs:data_20
  1099.         xor    bp,bp            ; Zero register
  1100.         sub    dx,ax
  1101.         js    loc_102            ; Jump if sign=1
  1102.         cmp    dx,cs:data_19
  1103.         jb    loc_103            ; Jump if below
  1104.         or    bp,8000h
  1105. loc_102:
  1106.         sub    di,ax
  1107.         js    loc_108            ; Jump if sign=1
  1108.         cmp    di,cs:data_19
  1109.         jae    loc_109            ; Jump if above or =
  1110. loc_103:
  1111.         pop    di
  1112.         pop    dx
  1113.         push    dx
  1114.         push    di
  1115.         sub    di,dx
  1116.         jnz    loc_104            ; Jump if not zero
  1117.         or    bp,4
  1118. loc_104:
  1119.         js    loc_105            ; Jump if sign=1
  1120.         or    bp,1
  1121. loc_105:
  1122.         sub    si,bx
  1123.         jnz    loc_106            ; Jump if not zero
  1124.         or    bp,8
  1125. loc_106:
  1126.         js    loc_107            ; Jump if sign=1
  1127.         or    bp,2
  1128. loc_107:
  1129.         and    bp,0Fh
  1130.         push    bp
  1131.         and    bp,0Ch
  1132.         cmp    bp,0Ch
  1133.         pop    bp
  1134.         jz    loc_110            ; Jump if zero
  1135.         pop    di
  1136.         pop    dx
  1137.         pop    si
  1138.         pop    bx
  1139.         clc                ; Clear carry flag
  1140.         retn
  1141. loc_108:
  1142.         test    bp,8000h
  1143.         jnz    loc_103            ; Jump if not zero
  1144.         jmp    short loc_110
  1145.         
  1146. loc_109:
  1147.         test    bp,8000h
  1148.         jz    loc_103            ; Jump if zero
  1149. loc_110:
  1150.         pop    di
  1151.         pop    dx
  1152.         pop    si
  1153.         pop    bx
  1154.         stc                ; Set carry flag
  1155.         retn
  1156. sub_8        endp
  1157.  
  1158.  
  1159. ;**************************************************************************
  1160. ;            SUBROUTINE   9                                               *
  1161. ;**************************************************************************
  1162. data_26        db    0
  1163. data_27        dw    0
  1164. data_28        dw    0
  1165. data_29        dw    0
  1166.  
  1167.  
  1168. sub_9        proc    near
  1169.         test    bp,4
  1170.         jnz    loc_111            ; Jump if not zero
  1171.         test    bp,8
  1172.         jnz    loc_112            ; Jump if not zero
  1173.         jmp    short loc_117
  1174.         
  1175. loc_111:
  1176.         mov    ah,0
  1177.         call    sub_12
  1178.         mov    al,0
  1179.         or    ax,bp
  1180.         and    al,3
  1181.         mov    cx,6
  1182.         shl    al,cl            ; Shift w/zeros fill
  1183.         mov    data_26,al
  1184.         retn
  1185. loc_112:
  1186.         mov    ah,4
  1187.         call    sub_12
  1188.         sub    di,dx
  1189.         js    loc_114            ; Jump if sign=1
  1190. loc_113:
  1191.         dec    di
  1192.         jz    loc_ret_116        ; Jump if zero
  1193.         inc    dx
  1194.         mov    ah,4
  1195.         call    sub_14
  1196.         jmp    short loc_113
  1197. loc_114:
  1198.         neg    di
  1199. loc_115:
  1200.         dec    di
  1201.         jz    loc_ret_116        ; Jump if zero
  1202.         dec    dx
  1203.         mov    ah,4
  1204.         call    sub_14
  1205.         jmp    short loc_115
  1206.  
  1207. loc_ret_116:
  1208.         retn
  1209. loc_117:
  1210.         mov    data_27,si
  1211.         sub    data_27,bx
  1212.         jns    loc_118            ; Jump if not sign
  1213.         neg    data_27
  1214. loc_118:
  1215.         mov    data_28,di
  1216.         sub    data_28,dx
  1217.         jns    loc_119            ; Jump if not sign
  1218.         neg    data_28
  1219. loc_119:
  1220.         mov    cx,data_27
  1221.         cmp    cx,data_28
  1222.         jb    loc_125            ; Jump if below
  1223.         inc    cx
  1224.         shr    cx,1            ; Shift w/zeros fill
  1225.         mov    data_29,cx
  1226.         sub    si,bx
  1227.         jns    loc_120            ; Jump if not sign
  1228.         neg    si
  1229. loc_120:
  1230.         mov    cx,data_28
  1231.         cmp    cx,data_29
  1232.         jb    loc_121            ; Jump if below
  1233.         push    cx
  1234.         mov    ah,4
  1235.         call    sub_12
  1236.         mov    ah,4
  1237.         call    sub_10
  1238.         pop    cx
  1239.         sub    cx,data_27
  1240.         jmp    short loc_122
  1241.         
  1242. loc_121:
  1243.         push    cx
  1244.         mov    ah,0
  1245.         call    sub_12
  1246.         mov    ah,0
  1247.         call    sub_10
  1248.         pop    cx
  1249. loc_122:
  1250.         dec    si
  1251.         jz    loc_ret_124        ; Jump if zero
  1252.         add    cx,data_28
  1253.         test    cx,8000h
  1254.         jnz    loc_123            ; Jump if not zero
  1255.         cmp    cx,data_29
  1256.         jb    loc_123            ; Jump if below
  1257.         push    cx
  1258.         mov    ah,4
  1259.         call    sub_14
  1260.         mov    ah,4
  1261.         call    sub_10
  1262.         pop    cx
  1263.         sub    cx,data_27
  1264.         jmp    short loc_122
  1265. loc_123:
  1266.         push    cx
  1267.         mov    ah,0
  1268.         call    sub_14
  1269.         mov    ah,0
  1270.         call    sub_10
  1271.         pop    cx
  1272.         jmp    short loc_122
  1273.  
  1274. loc_ret_124:
  1275.         retn
  1276. loc_125:
  1277.         mov    cx,data_28
  1278.         xchg    cx,data_27
  1279.         xchg    cx,data_28
  1280.         inc    cx
  1281.         shr    cx,1            ; Shift w/zeros fill
  1282.         mov    data_29,cx
  1283.         sub    di,dx
  1284.         jns    loc_126            ; Jump if not sign
  1285.         neg    di
  1286. loc_126:
  1287.         mov    cx,data_28
  1288.         cmp    cx,data_29
  1289.         jb    loc_127            ; Jump if below
  1290.         push    cx
  1291.         mov    ah,4
  1292.         call    sub_12
  1293.         mov    ah,4
  1294.         call    sub_11
  1295.         pop    cx
  1296.         sub    cx,data_27
  1297.         jmp    short loc_128
  1298.         
  1299. loc_127:
  1300.         push    cx
  1301.         mov    ah,4
  1302.         call    sub_12
  1303.         mov    ah,0
  1304.         call    sub_11
  1305.         pop    cx
  1306. loc_128:
  1307.         dec    di
  1308.         jz    loc_ret_130        ; Jump if zero
  1309.         add    cx,data_28
  1310.         test    cx,8000h
  1311.         jnz    loc_129            ; Jump if not zero
  1312.         cmp    cx,data_29
  1313.         jb    loc_129            ; Jump if below
  1314.         push    cx
  1315.         mov    ah,4
  1316.         call    sub_14
  1317.         mov    ah,4
  1318.         call    sub_11
  1319.         pop    cx
  1320.         sub    cx,data_27
  1321.         jmp    short loc_128
  1322. loc_129:
  1323.         push    cx
  1324.         mov    ah,4
  1325.         call    sub_14
  1326.         mov    ah,0
  1327.         call    sub_11
  1328.         pop    cx
  1329.         jmp    short loc_128
  1330.  
  1331. loc_ret_130:
  1332.         retn
  1333. sub_9        endp
  1334.  
  1335.  
  1336. ;*************************************************************************
  1337. ;              SUBROUTINE   10                                           *
  1338. ;*************************************************************************
  1339.  
  1340. sub_10        proc    near
  1341.         test    bp,2
  1342.         jz    loc_131            ; Jump if zero
  1343.         inc    bx
  1344.         jmp    short loc_132
  1345.         
  1346. loc_131:
  1347.         dec    bx
  1348. loc_132:
  1349.         test    ah,4
  1350.         jz    loc_ret_134        ; Jump if zero
  1351.         test    bp,1
  1352.         jz    loc_133            ; Jump if zero
  1353.         inc    dx
  1354.         retn
  1355. loc_133:
  1356.         dec    dx
  1357.  
  1358. loc_ret_134:
  1359.         retn
  1360. sub_10        endp
  1361.  
  1362.  
  1363. ;**************************************************************************
  1364. ;            SUBROUTINE    11                                             *
  1365. ;**************************************************************************
  1366.  
  1367. sub_11        proc    near
  1368.         test    bp,1
  1369.         jz    loc_135            ; Jump if zero
  1370.         inc    dx
  1371.         jmp    short loc_136
  1372.         
  1373. loc_135:
  1374.         dec    dx
  1375. loc_136:
  1376.         test    ah,4
  1377.         jz    loc_ret_138        ; Jump if zero
  1378.         test    bp,2
  1379.         jz    loc_137            ; Jump if zero
  1380.         inc    bx
  1381.         retn
  1382. loc_137:
  1383.         dec    bx
  1384.  
  1385. loc_ret_138:
  1386.         retn
  1387. sub_11        endp
  1388.  
  1389.  
  1390. ;**************************************************************************
  1391. ;          SUBROUTINE  12                                                 *
  1392. ;**************************************************************************
  1393. data_30        dw    0
  1394. data_31        dw    0
  1395. data_32        db    0
  1396.  
  1397.  
  1398. sub_12        proc    near
  1399.         cmp    data_23,1
  1400.         jne    loc_139            ; Jump if not equal
  1401.         mov    data_30,bx
  1402.         mov    data_31,dx
  1403.         mov    al,0
  1404.         or    ax,bp
  1405.         and    al,3
  1406.         mov    cx,4
  1407.         shl    al,cl            ; Shift w/zeros fill
  1408.         or    ah,al
  1409.         shl    al,1            ; Shift w/zeros fill
  1410.         shl    al,1            ; Shift w/zeros fill
  1411.         or    ah,al
  1412.         mov    al,ah
  1413.         mov    data_32,al
  1414.         mov    data_26,al
  1415.         mov    data_23,0
  1416.         retn
  1417. loc_139:
  1418.         mov    al,0
  1419.         or    ax,bp
  1420.         and    al,3
  1421.         mov    cx,4
  1422.         shl    al,cl            ; Shift w/zeros fill
  1423.         push    ax
  1424.         and    data_26,0CFh
  1425.         or    data_26,al
  1426.         call    sub_14
  1427.         pop    ax
  1428.         shl    al,1            ; Shift w/zeros fill
  1429.         shl    al,1            ; Shift w/zeros fill
  1430.         and    data_26,3Fh        ; '?'
  1431.         or    data_26,al
  1432.         retn
  1433. sub_12        endp
  1434.  
  1435.  
  1436. ;**************************************************************************
  1437. ;           SUBROUTINE  13                                                *
  1438. ;**************************************************************************
  1439.  
  1440. sub_13        proc    near
  1441.         mov    bx,data_30
  1442.         mov    dx,data_31
  1443.         mov    ah,data_32
  1444.         and    ah,4
  1445.         mov    al,data_32
  1446.         and    al,30h            ; '0'
  1447.         and    data_26,0CFh
  1448.         or    data_26,al
  1449.         call    sub_14
  1450.         retn
  1451. sub_13        endp
  1452.  
  1453.  
  1454. ;**************************************************************************
  1455. ;          SUBROUTINE    14                                               *
  1456. ;**************************************************************************
  1457.  
  1458. data_33        db    0            ; Data table (indexed access)
  1459.         db     01h, 02h, 03h, 00h, 01h, 02h
  1460.         db     03h, 02h, 03h, 0Ah, 02h, 02h
  1461.         db     03h, 0Ah, 02h, 00h, 01h, 02h
  1462.         db     03h, 01h, 05h, 03h, 01h, 02h
  1463.         db     03h, 0Ah, 02h, 03h, 01h, 02h
  1464.         db     03h, 01h, 05h, 03h, 01h, 00h
  1465.         db     01h, 02h, 03h, 00h, 01h, 02h
  1466.         db     03h, 02h, 03h, 0Ah, 02h, 01h
  1467.         db     05h, 03h, 01h, 01h, 05h, 03h
  1468.         db     01h, 03h, 01h, 02h, 03h, 03h
  1469.         db     01h, 02h, 03h, 00h, 01h, 02h
  1470.         db     03h, 00h, 01h, 02h, 03h, 00h
  1471.         db     01h, 02h, 03h, 00h, 01h, 02h
  1472.         db     03h, 00h, 01h, 02h, 03h, 01h
  1473.         db     05h, 03h, 01h, 00h, 01h, 02h
  1474.         db     03h, 01h, 05h, 03h, 01h, 01h
  1475.         db     05h, 03h, 01h, 03h, 01h, 02h
  1476.         db     03h, 01h, 05h, 03h, 01h, 03h
  1477.         db     01h, 02h, 03h, 01h, 05h, 03h
  1478.         db     01h, 01h, 05h, 03h, 01h, 01h
  1479.         db     05h, 03h, 01h, 01h, 05h, 03h
  1480.         db     01h, 02h, 03h, 0Ah, 02h, 02h
  1481.         db     03h, 0Ah, 02h, 02h, 03h, 0Ah
  1482.         db     02h, 02h, 03h, 0Ah, 02h, 02h
  1483.         db     03h, 0Ah, 02h, 03h, 01h, 02h
  1484.         db     03h, 02h, 03h, 0Ah, 02h, 03h
  1485.         db     01h, 02h, 03h, 00h, 01h, 02h
  1486.         db     03h, 02h, 03h, 0Ah, 02h, 00h
  1487.         db     01h, 02h, 03h, 02h, 03h, 0Ah
  1488.         db     02h, 00h, 01h, 02h, 03h, 00h
  1489.         db     01h, 02h, 03h, 00h, 01h, 02h
  1490.         db     03h, 00h, 01h, 02h, 03h, 02h
  1491.         db     03h, 0Ah, 02h, 02h, 03h, 0Ah
  1492.         db     02h, 03h, 01h, 02h, 03h, 03h
  1493.         db     01h, 02h, 03h, 02h, 03h, 0Ah
  1494.         db     02h, 00h, 01h, 02h, 03h, 00h
  1495.         db     01h, 02h, 03h, 01h, 05h, 03h
  1496.         db     01h, 00h, 01h, 02h, 03h, 02h
  1497.         db     03h, 0Ah, 02h, 01h, 05h, 03h
  1498.         db     01h, 03h, 01h, 02h, 03h, 00h
  1499.         db     01h, 02h, 03h, 00h, 01h, 02h
  1500.         db     03h, 01h, 05h, 03h, 01h, 01h
  1501.         db     05h, 03h, 01h
  1502.  
  1503.  
  1504. sub_14        proc    near
  1505.         push    bx
  1506.         push    dx
  1507.         sub    dx,word ptr data_20
  1508.         js    loc_142            ; Jump if sign=1
  1509.         cmp    dx,cs:data_19
  1510.         jae    loc_142            ; Jump if above or =
  1511.         push    ax
  1512.         mov    ax,dx
  1513.         mul    data_21            ; ax = data * ax
  1514.         shl    ax,1            ; Shift w/zeros fill
  1515.         mov    cx,bx
  1516.         and    cx,3
  1517.         shr    bx,1            ; Shift w/zeros fill
  1518.         shr    bx,1            ; Shift w/zeros fill
  1519.         add    ax,bx
  1520.         shl    cx,1            ; Shift w/zeros fill
  1521.         mov    bx,ax
  1522.         pop    ax
  1523.         mov    al,byte ptr HZDOTs_Address[bx]
  1524.         shl    al,cl            ; Shift w/zeros fill
  1525.         and    al,0C0h
  1526.         rol    al,1            ; Rotate
  1527.         rol    al,1            ; Rotate
  1528.         or    al,ah
  1529.         call    sub_17
  1530.         push    bx
  1531.         xor    bh,bh            ; Zero register
  1532.         mov    bl,data_26
  1533.         mov    al,data_33[bx]
  1534.         pop    bx
  1535.         test    al,3
  1536.         jz    loc_141            ; Jump if zero
  1537.         test    al,4
  1538.         jnz    loc_143            ; Jump if not zero
  1539.         test    al,8
  1540.         jnz    loc_145            ; Jump if not zero
  1541. loc_140:
  1542.         call    sub_18
  1543. loc_141:
  1544.         pop    dx
  1545.         pop    bx
  1546.         retn
  1547. loc_142:
  1548.         mov    al,ah
  1549.         call    sub_17
  1550.         pop    dx
  1551.         pop    bx
  1552.         retn
  1553. loc_143:
  1554.         push    cx
  1555.         push    bx
  1556.         push    ax
  1557.         inc    cl
  1558.         inc    cl
  1559.         cmp    cl,8
  1560.         jne    loc_144            ; Jump if not equal
  1561.         mov    cl,0
  1562.         inc    bx
  1563. loc_144:
  1564.         mov    al,1
  1565.         call    sub_15
  1566.         pop    ax
  1567.         pop    bx
  1568.         pop    cx
  1569.         jmp    short loc_140
  1570. loc_145:
  1571.         push    cx
  1572.         push    bx
  1573.         push    ax
  1574.         dec    cl
  1575.         dec    cl
  1576.         jns    loc_146            ; Jump if not sign
  1577.         mov    cl,6
  1578.         dec    bx
  1579. loc_146:
  1580.         mov    al,2
  1581.         call    sub_16
  1582.         pop    ax
  1583.         pop    bx
  1584.         pop    cx
  1585.         jmp    short loc_140
  1586. sub_14        endp
  1587.  
  1588.  
  1589. ;**************************************************************************
  1590. ;            SUBROUTINE   15                                              *
  1591. ;**************************************************************************
  1592.  
  1593. data_34        dw    offset loc_147        ; Data table (indexed access)
  1594. data_35        dw    offset loc_150
  1595. data_36        dw    offset loc_149
  1596. data_37        dw    offset loc_147
  1597.  
  1598.  
  1599. sub_15        proc    near
  1600.         push    cx
  1601.         push    bx
  1602.         push    ax
  1603.         mov    al,byte ptr HZDOTs_Address[bx]
  1604.         shl    al,cl            ; Shift w/zeros fill
  1605.         and    al,0C0h
  1606.         rol    al,1            ; Rotate
  1607.         rol    al,1            ; Rotate
  1608.         push    bx
  1609.         xor    bh,bh            ; Zero register
  1610.         mov    bl,al
  1611.         shl    bx,1            ; Shift w/zeros fill
  1612.         jmp    word ptr cs:data_34[bx]    ;*4 entries
  1613.  
  1614. ;--------Indexed Entry Point ----------------------------------------------
  1615.  
  1616. loc_147:
  1617.         mov    al,1
  1618. loc_148:
  1619.         pop    bx
  1620.         call    sub_18
  1621.         jmp    short loc_152
  1622.         db    90h
  1623.  
  1624. ;----- Indexed Entry Point -------------------------------------------------
  1625.  
  1626. loc_149:
  1627.         mov    al,3
  1628.         jmp    short loc_148
  1629.  
  1630. ;----- Indexed Entry Point -----------------------------------------------─
  1631.  
  1632. loc_150:
  1633.         pop    bx
  1634.         inc    cl
  1635.         inc    cl
  1636.         cmp    cl,8
  1637.         jne    loc_151            ; Jump if not equal
  1638.         mov    cl,0
  1639.         inc    bx
  1640. loc_151:
  1641.         call    sub_15
  1642. loc_152:
  1643.         pop    ax
  1644.         pop    bx
  1645.         pop    cx
  1646.         retn
  1647. sub_15        endp
  1648.  
  1649.  
  1650. ;**************************************************************************
  1651. ;         SUBROUTINE  16                                                  *
  1652. ;**************************************************************************
  1653.  
  1654. data_38        dw    offset loc_153        ; Data table (indexed access)
  1655. data_39        dw    offset loc_155
  1656. data_40        dw    offset loc_156
  1657. data_41        dw    offset loc_153
  1658.  
  1659.  
  1660. sub_16        proc    near
  1661.         push    cx
  1662.         push    bx
  1663.         push    ax
  1664.         mov    al,byte ptr HZDOTs_Address[bx]
  1665.         shl    al,cl            ; Shift w/zeros fill
  1666.         and    al,0C0h
  1667.         rol    al,1            ; Rotate
  1668.         rol    al,1            ; Rotate
  1669.         push    bx
  1670.         xor    bh,bh            ; Zero register
  1671.         mov    bl,al
  1672.         shl    bx,1            ; Shift w/zeros fill
  1673.         jmp    word ptr cs:data_38[bx]    ;*4 entries
  1674.  
  1675. ;----- Indexed Entry Point -------------------------------------------------
  1676.  
  1677. loc_153:
  1678.         mov    al,2
  1679. loc_154:
  1680.         pop    bx
  1681.         call    sub_18
  1682.         jmp    short loc_152
  1683.  
  1684. ;----- Indexed Entry Point -------------------------------------------------
  1685.  
  1686. loc_155:
  1687.         mov    al,3
  1688.         jmp    short loc_154
  1689.  
  1690. ;----- Indexed Entry Point ------------------------------------------------
  1691.  
  1692. loc_156:
  1693.         pop    bx
  1694.         dec    cl
  1695.         dec    cl
  1696.         jns    loc_157            ; Jump if not sign
  1697.         mov    cl,6
  1698.         dec    bx
  1699. loc_157:
  1700.         call    sub_16
  1701.         pop    ax
  1702.         pop    bx
  1703.         pop    cx
  1704.         retn
  1705. sub_16        endp
  1706.  
  1707.  
  1708. ;**************************************************************************
  1709. ;           SUBROUTINE   17                                               *
  1710. ;**************************************************************************
  1711.  
  1712. sub_17        proc    near
  1713.         mov    ah,data_26
  1714.         and    ah,4
  1715.         shl    ah,1            ; Shift w/zeros fill
  1716.         or    al,ah
  1717.         and    data_26,0F0h
  1718.         or    data_26,al
  1719.         retn
  1720. sub_17        endp
  1721.  
  1722.  
  1723. ;**************************************************************************
  1724. ;          SUBROUTINE  18                                                 *
  1725. ;**************************************************************************
  1726.  
  1727. sub_18        proc    near
  1728.         mov    ah,al
  1729.         mov    al,byte ptr HZDOTs_Address[bx]
  1730.         rol    al,cl            ; Rotate
  1731.         shl    al,1            ; Shift w/zeros fill
  1732.         shl    al,1            ; Shift w/zeros fill
  1733.         shr    ax,1            ; Shift w/zeros fill
  1734.         shr    ax,1            ; Shift w/zeros fill
  1735.         ror    al,cl            ; Rotate
  1736.         mov    byte ptr HZDOTs_Address[bx],al
  1737.         retn
  1738. sub_18        endp
  1739.  
  1740.  
  1741. ;***************************************************************************
  1742. ;           SUBROUTINE    19                                               *
  1743. ;***************************************************************************
  1744.  
  1745. data_42        dw    offset loc_162        ; Data table (indexed access)
  1746. data_43        dw    offset loc_164
  1747. data_44        dw    offset loc_165
  1748. data_45        dw    offset loc_166
  1749.  
  1750.  
  1751. sub_19        proc    near
  1752.         xor    ax,ax            ; Zero register
  1753.         xor    bx,bx            ; Zero register
  1754.         push    cs
  1755.         push    cs
  1756.         pop    ds
  1757.         pop    es
  1758.         mov    si,offset HZDOTs_Address
  1759.         mov    di,offset HZDOTs_OK
  1760.         mov    dx,cs:data_19
  1761. loc_158:
  1762.         xor    bp,bp            ; Zero register
  1763.         mov    cx,data_21
  1764.  
  1765. locloop_159:
  1766.         push    cx
  1767.         mov    cx,2
  1768.  
  1769. locloop_160:
  1770.         push    cx
  1771.         mov    cx,4
  1772.         mov    al,[si]
  1773.  
  1774. locloop_161:
  1775.         shl    ax,1            ; Shift w/zeros fill
  1776.         shl    ax,1            ; Shift w/zeros fill
  1777.         mov    bl,ah
  1778.         shl    bx,1            ; Shift w/zeros fill
  1779.         jmp    word ptr cs:data_42[bx]    ;*4 entries
  1780.  
  1781. ;----- Indexed Entry Point ---------------------------------------------
  1782.  
  1783. loc_162:
  1784.         cmp    bp,0
  1785.         jne    loc_163            ; Jump if not equal
  1786.         clc                ; Clear carry flag
  1787.         jmp    short loc_167
  1788.         db    90h
  1789. loc_163:
  1790.         stc                ; Set carry flag
  1791.         jmp    short loc_167
  1792.         db    90h
  1793.  
  1794. ;----- Indexed Entry Point -----------------------------------------------─
  1795.  
  1796. loc_164:
  1797.         inc    bp
  1798.         stc                ; Set carry flag
  1799.         jmp    short loc_167
  1800.         db    90h
  1801.  
  1802. ;----- Indexed Entry Point ------------------------------------------------
  1803.  
  1804. loc_165:
  1805.         dec    bp
  1806.  
  1807. ;----- Indexed Entry Point ------------------------------------------------
  1808.  
  1809. loc_166:
  1810.         stc                ; Set carry flag
  1811. loc_167:
  1812.         rcl    byte ptr [di],1        ; Rotate thru carry
  1813.         xor    ah,ah            ; Zero register
  1814.         loop    locloop_161        ; Loop if cx > 0
  1815.  
  1816.         pop    cx
  1817.         inc    si
  1818.         loop    locloop_160        ; Loop if cx > 0
  1819.  
  1820.         pop    cx
  1821.         inc    di
  1822.         loop    locloop_159        ; Loop if cx > 0
  1823.  
  1824.         dec    dx
  1825.         jnz    loc_158            ; Jump if not zero
  1826.         retn
  1827. sub_19        endp
  1828.  
  1829.  
  1830. ;**************************************************************************
  1831. ;           SUBROUTINE  21  open file                                     *
  1832. ;**************************************************************************
  1833.  
  1834. data_49        dw    0
  1835. data_51        db    0                       ;! ?
  1836.  
  1837.  
  1838. sub_21        proc    near
  1839.         push    ax
  1840.         push    bx
  1841.         push    cx
  1842.         push    bp
  1843.         push    dx
  1844.         push    si
  1845.         push    di
  1846.         push    es
  1847.  
  1848.         mov    cs:data_51,0
  1849.         push    ds
  1850.         mov     ds,ax
  1851.         mov    ax,3D00h
  1852.         int    21h            ; DOS Services  ah=function 3Dh
  1853.         pop     ds            ;  open file, al=mode,name@ds:dx
  1854.         jc    loc_174            ; Jump if carry Set
  1855.         mov    File_Handle,ax
  1856.         jmp    short loc_175
  1857. loc_174:
  1858.         mov    ax,80h
  1859.         mov    File_Handle,ax
  1860.         stc                ; Set carry flag
  1861. loc_175:
  1862.         pop    es
  1863.         pop    di
  1864.         pop    si
  1865.         pop    dx
  1866.         pop    bp
  1867.         pop    cx
  1868.         pop    bx
  1869.         pop    ax
  1870.         retn
  1871. sub_21        endp
  1872.  
  1873.  
  1874. ;**************************************************************************
  1875. ;            SUBROUTINE  22     close file                                *
  1876. ;**************************************************************************
  1877.  
  1878. sub_22        proc    near
  1879.         push    ax
  1880.         push    bx
  1881.         push    cx
  1882.         push    dx
  1883.         mov    ah,3Eh            ; '>'
  1884.         mov    bx,cs:File_Handle
  1885.         cmp    bx,5
  1886.         jl    loc_176            ; Jump if <
  1887.         int    21h            ; DOS Services  ah=function 3Eh
  1888.                         ;  close file, bx=file handle
  1889. loc_176:
  1890.         pop    dx
  1891.         pop    cx
  1892.         pop    bx
  1893.         pop    ax
  1894.         retn
  1895. sub_22        endp
  1896.  
  1897.  
  1898. ;*************************************************************************
  1899. ; The following area is data buffer of the program.
  1900.  
  1901. File_Handle    dw    80h
  1902.  
  1903.  Img_BufSize     dw     16928                   ; 16928,  3f48H 368x368
  1904. ;Img_BufSize     dw     3200h                   ; 12800,  3200H 320x320, old
  1905. ;Img_BufSize     dw     2000h                   ; 8192,   2000H 256x256
  1906.  
  1907.  Img_BufWH       dw      170h                   ; 368x368
  1908. ;Img_BufWH       dw      140h                   ; 320x320
  1909. ;Img_BufWH       dw      100h                   ; 256x256
  1910.  
  1911.  
  1912. HZDOTs_OK        db     25600 dup(0)            ; Data table (indexed access)
  1913.                                                 ; size=25600, 6400H
  1914.  
  1915. HZDOTs_Address     dw    0            ; Data table (indexed access)
  1916. HZDOTs_Address_B dw    0
  1917. HZDOTs_Length     dw    0
  1918.                  db    16922 dup (0)           ; size=16200,  3f48H 360x360
  1919. ;                db     12794 dup (0)           ; size=12800,  3200H 320x320 old
  1920. ;                db     8186  dup (0)           ; size=8192,   2000H 256x256
  1921.  
  1922.  
  1923. Img_Buffer         db    16928 dup (0)               ; size=16200,  3f48H
  1924. ;Img_Buffer      db     8192  dup (0)           ; size=8192,   2000H 256x256
  1925.  
  1926. HZ_LAST_OK       db    2000 dup (0)            ; size=2000, 7D0
  1927.  
  1928.  
  1929.  
  1930. recovery    ends
  1931.         end
  1932.