home *** CD-ROM | disk | FTP | other *** search
/ Popular Software (Premium Edition) / mycd.iso / DICT / DFKC / ZWH / CHCS / XIS.ASM < prev    next >
Encoding:
Assembly Source File  |  1998-01-12  |  42.5 KB  |  2,103 lines

  1. ;
  2. ;               xis.asm
  3. ;
  4. .286
  5. code            segment
  6.         org     100h
  7.         assume  cs:code, ds:code
  8. begin:          jmp     init
  9. ;
  10. Mark            db      'CHCS 1.0'
  11. ;
  12. Psp             dw      ?
  13. Env             dw      ?
  14.         db      ?
  15. ;
  16. ;               ---------------------------------------
  17. ;
  18. xHandle         dw      ?
  19. xEntry          dd      0
  20. ;               ------------------------------------------------
  21. xStruc          label   word
  22. Count           dw      ?                    ; Transfer Bytes
  23.         dw      0
  24. sHandle         dw      ?                    ; Source Handle
  25. sOffset         dd      ?                    ; Source Offset
  26. dHandle         dw      ?                    ; Destinate Handle
  27. dOffset         dd      ?                    ; Destinate Offset
  28. ;               ------------------------------------------------
  29. xStruc2         label   word
  30. Count2          dw      ?                    ; Transfer Bytes
  31.         dw      0
  32. sHandle2        dw      ?                    ; Source Handle
  33. sOffset2        dd      ?                    ; Source Offset
  34. dHandle2        dw      ?                    ; Destinate Handle
  35. dOffset2        dd      ?                    ; Destinate Offset
  36. ;               ------------------------------------------------
  37. dSize           dw      ?
  38. nPage           db      ?
  39. eSize           dw      ?
  40. pSize           dw      1128
  41. ;
  42. cPage           db      0
  43. cSize           dw      1128
  44. cPntr           dw      ?
  45. CodeEnd         dw      ?
  46. ;
  47. ;               ---------------------------------------
  48. ;
  49. CCs             dw      32 dup(?)
  50. Keys            db      12 dup(?)
  51. ;
  52. ;
  53. bAttr           db      70h                  ;
  54. kAttr           db      0eh                  ; ╩Σ╚δ┬δ╔½
  55. eAttr           db      04h                  ; 1-0╨≥║┼╔½
  56. sAttr           db      00h                  ; ═¼┬δ╫╓╔½
  57. nAttr           db      0eh                  ; ':'╔½
  58. ;
  59. Current         db      ?
  60. tmp             db      ?
  61. KTable          db      8 dup(0)
  62. Fname           db      8*16 dup(0)
  63. NameOff         dw      ?
  64. Path            db      88 dup(0)
  65. Handle          dw      ?
  66. ;
  67. Int16           dd      ?
  68. ;
  69. SameNum         db      0
  70. SameOfs         db      0
  71. SamAddr         dd      ?
  72. KeyNum          db      0
  73. KeyBuf          db      12 dup(?)            ; ╝ⁿ┼╠╗║│σ╟°
  74. ;
  75. PmtX            db      ?
  76. ;
  77. AutoPop         db      0
  78. ;
  79. KeyEnd          db      0
  80. TabOff          dw      ?
  81. ;
  82. pgSize          dw      11
  83. pageMin         dw      0
  84. pageMax         dw      10
  85. sameCnt         dw      0
  86. sameMax         dw      0
  87. ;
  88. inSrch          db      0                    ; ─ú║²▓Θ╒╥▒Ω╓╛
  89. reSrch          db      0                    ; ╖┤╧≥▓Θ╒╥▒Ω╓╛
  90. ;
  91. ;               ---------------------------------------
  92. ;
  93. KeyProc         proc    far
  94. ;
  95. ;       IN:     ax = 0ffffh
  96. ;               bh = KeyNo
  97. ;                  bl = 0ffh: Unload the KeyNo Encode
  98. ;                  bl != 0ffh: Set KeyMode to KeyNo
  99. ;               ax != 0ffffh: Keyboard Key
  100. ;
  101.         cmp     ax, 0ffffh
  102.         je      toSetKmode
  103.         jmp     TreatKey
  104. toSetKmode:     cmp     bl, 10h
  105.         je      inExit
  106.         mov     cs:KeyNum, 0
  107.         mov     cs:KeyEnd, 0
  108.         mov     cs:SameNum, 0
  109.         cmp     bl, 0ffh
  110.         je      unLoad
  111. ;               call    sKmode
  112. inExit:         jmp     kRetn
  113. ;
  114. unLoad:         push    es
  115.         mov     ah, 49h
  116.         mov     es, cs:Psp
  117.         int     21h
  118.         pop     es
  119.         cmp     cs:nPage, 0
  120.         je      unExit
  121.         mov     ah, 0ah
  122.         mov     dx, cs:xHandle
  123.         call    dword ptr cs:xEntry
  124. unExit:         jmp     kRetn
  125. ;
  126. TreatKey:       cmp     al, 08h              ; Backspace
  127.         je      toBack
  128.         cmp     al, 0dh              ; Enter
  129.         je      toReset
  130.         cmp     al, 1bh              ; Escape
  131.         je      toReset
  132.         cmp     al, ' '              ; Space bar
  133.         je      toSpace
  134.         or      al, al               ; Extend Keys
  135.         jz      kElse
  136.         cmp     al, cs:WildKey
  137.         je      toMatch
  138.         push    es
  139.         push    di
  140.         push    cs
  141.         pop     es
  142.         lea     di, cs:KeyTab
  143.         mov     cx, 112
  144.         cld
  145.         repne   scasb
  146.         pop     di
  147.         pop     es
  148.         mov     cx, 0
  149.         jz      toMatch
  150.         cmp     al, '['              ; Last page
  151.         je      toPgBack
  152.         cmp     al, ','              ; Last page
  153.         je      toPgBack
  154.         cmp     al, ']'              ; Next page
  155.         je      toPgFore
  156.         cmp     al, '.'              ; Next page
  157.         je      toPgFore
  158. ;
  159. kElse:          cmp     cs:KeyNum, 0
  160.         jne     kConte
  161.         retf
  162. kConte:         cmp     al, ';'
  163.         je      toSele
  164.         cmp     al, '0'
  165.         jb      kBeep
  166.         cmp     al, '9'
  167.         jbe     toSele
  168. kBeep:          mov     ax, 0e07h
  169.         int     10h
  170. toRetn:         jmp     kRetn
  171. ;
  172. toSele:         call    kSele
  173. toRet0:         retf
  174. ;
  175. toSpace:        jmp     kSpace
  176. ;
  177. toReset:        jmp     kReset
  178. ;
  179. toBack:         cmp     cs:KeyEnd, 1
  180.         je      toReset
  181.         jmp     kBack
  182. ;
  183. toPgBack:       jmp     kPgBack
  184. ;
  185. toPgFore:       jmp     kPgFore
  186. ;
  187. toMatch:        cmp     cs:KeyEnd, 0
  188.         je      toMatchCont1
  189.         cmp     al, ';'
  190.         je      toSele
  191.         cmp     al, '0'
  192.         jb      toMatchCont0
  193.         cmp     al, '9'
  194.         jbe     toSele
  195. toMatchCont0:   mov     cs:AutoPop, 1
  196. toMatchCont1:   mov     cs:inSrch, 0
  197.         mov     cs:reSrch, 0
  198.         mov     cs:pageMin, 0
  199.         mov     cs:pageMax, 10
  200.         jmp     kMatch
  201. ;
  202. kSpace:         cmp     cs:KeyNum, 0
  203.         je      toRet0
  204.         jmp     toSele
  205. ;
  206. kPgBack:        cmp     cs:KeyNum, 0
  207.         je      toRet0
  208.         cmp     cs:pageMin, 0
  209.         je      toRetn
  210.         mov     cs:reSrch, 1
  211.         mov     bx, cs:pgSize
  212.         sub     cs:pageMin, bx
  213.         sub     cs:pageMax, bx
  214.         jmp     PgSet
  215. ;
  216. kPgFore:        cmp     cs:KeyNum, 0
  217.         je      kRet0
  218.         mov     cs:reSrch, 0
  219.         mov     bx, cs:pageMax
  220.         cmp     bx, cs:sameMax
  221.         jae     kRetn
  222.         mov     bx, cs:pgSize
  223.         add     cs:pageMin, bx
  224.         add     cs:pageMax, bx
  225. PgSet:          dec     cs:KeyNum
  226.         mov     bl, cs:KeyNum
  227.         xor     bh, bh
  228.         mov     al, cs:KeyBuf[bx]
  229.         jmp     kMatch
  230. ;
  231. kBack:          cmp     cs:KeyNum, 0
  232.         je      kRet0
  233.         dec     cs:KeyNum
  234.         jz      kClear
  235.         dec     cs:KeyNum
  236.         mov     bl, cs:KeyNum
  237.         xor     bh, bh
  238.         mov     al, cs:KeyBuf[bx]
  239.         jmp     toMatch
  240. ;
  241. kReset:         cmp     cs:KeyNum, 0
  242.         je      kRet0
  243.         mov     cs:KeyNum, 0
  244. kClear:         mov     cs:KeyEnd, 0
  245.         mov     ah, 24h
  246.         int     16h
  247. kRetn:          xor     ax, ax
  248.         mov     cx, ax
  249. kRet0:          retf
  250. ;
  251. kMatch:         push    es
  252.         push    ds
  253.         push    di
  254.         push    si
  255.         push    cs
  256.         pop     ds
  257.  
  258.         mov     cPage, 0
  259.         mov     inSrch, 0
  260.         mov     sameCnt, 0
  261.         mov     KeyEnd, 0
  262.         mov     pgSize, 11
  263.         xor     bh, bh
  264.         mov     bl, KeyNum
  265.         cmp     bl, 4
  266.         jb      kmCont0
  267.         xor     bx, bx
  268. kmCont0:        mov     KeyBuf[bx], al
  269.         call    prKeys
  270.         inc     KeyNum
  271.         cmp     KeyNum, 4
  272.         je      kGetS4
  273.         ja      kToS4
  274. ;
  275. kTo123:         mov     SameNum, 0
  276.         mov     AutoPop, 0
  277. kSr123:         call    Key123
  278.         xor     ch, ch
  279.         cmp     AutoPop, 1
  280.         jne     kToEx
  281.         mov     cx, 0101h
  282.         jmp     k4Exit
  283. kToEx:          jmp     kS4Ex
  284. ;
  285. kToS4:          mov     KeyNum, 1
  286.         cmp     SameNum, 1
  287.         jbe     kTo123
  288.         mov     SameNum, 0
  289.         mov     AutoPop, 1
  290.         jmp     kSr123
  291. ;
  292. kGetS4:         mov     KeyEnd, 1
  293.         mov     SameNum, 0
  294.         mov     AutoPop, 0
  295. k4Srch:         lea     bx, KeyBuf
  296.         mov     ax, [bx]
  297.         mov     dx, [bx+2]
  298.         mov     ch, WildKey
  299.         cmp     al, ch
  300.         je      SetSrch
  301.         cmp     ah, ch
  302.         je      SetSrch
  303.         cmp     dl, ch
  304.         je      SetSrch
  305.         cmp     dh, ch
  306.         je      SetSrch
  307.         jmp     kS4Srch
  308. ;
  309. SetSrch:        mov     inSrch, 1
  310.         mov     pgSize, 6
  311. ;
  312. kS4Srch:        call    MatchUcWx
  313.         cmp     SameNum, 1
  314.         jb      kS4Skip
  315.         jmp     SkipCW4
  316. ;
  317. kS4Skip:        lea     si, CodeTab
  318.         lea     di, NextTab
  319.         cmp     nPage, 0
  320.         je      kS4Loop
  321.         call    MapPage
  322.         lea     di, CodeTab+1128
  323.         jmp     kS4Loop
  324. ;
  325. k4toNext:       jmp     k4Next
  326. ;
  327. k4NextPage:     cmp     nPage, 0
  328.         je      k4toNext
  329.         inc     cPage
  330.         cmp     cPage, 23
  331.         ja      k4toNext
  332.         call    MapPage
  333.         lea     si, CodeTab
  334. ;
  335. kS4Loop:        cmp     si, di
  336.         jae     k4NextPage
  337.         mov     bx, [si]
  338.         add     si, +2
  339.         mov     cl, [si]
  340.         add     si, +2
  341.         and     bx, 7f7fh
  342.         cmp     al, bl
  343.         je      kS4S2
  344.         cmp     al, ch               ; ch = WildKey
  345.         jne     kS4Loop
  346. kS4S2:          cmp     ah, bh
  347.         je      kS4S3
  348.         cmp     ah, ch
  349.         jne     kS4Loop
  350. kS4S3:          and     cl, 7fh
  351.         cmp     dl, cl
  352.         je      kS4S4
  353.         cmp     dl, ch
  354.         jne     kS4Loop
  355. kS4S4:          cmp     dh, [si-1]
  356.         je      kS4Ok
  357.         cmp     dh, ch
  358.         jne     kS4Loop
  359. kS4Ok:          inc     sameCnt
  360.         mov     bx, sameCnt
  361.         cmp     bx, pageMin
  362.         jbe     kS4Loop
  363.         call    PushSam
  364.         jmp     kS4Loop
  365. ;
  366. ;               Match Next Encode :
  367. ;
  368. k4Next:         mov     di, CodeEnd
  369.         cmp     nPage, 0
  370.         je      n4Loop
  371.         call    MapPage
  372.         lea     si, CodeTab
  373.         mov     bl, cPage
  374.         cmp     bl, nPage
  375.         jb      n4Loop
  376.         lea     di, CodeTab
  377.         add     di, eSize
  378.         jmp     n4Loop
  379. ;
  380. n4NextPage:     cmp     nPage, 0
  381.         je      kS4End
  382.         inc     cPage
  383.         call    MapPage
  384.         lea     si, CodeTab
  385.         mov     bl, cPage
  386.         cmp     bl, nPage
  387.         jb      n4Loop
  388.         ja      kS4End
  389.         mov     di, si
  390.         add     di, eSize
  391. ;
  392. n4Loop:         cmp     si, di
  393.         jae     n4NextPage
  394.         mov     bx, [si]
  395.         add     si, 2
  396.         mov     cl, [si]
  397.         add     si, 4
  398.         and     bx, 7f7fh
  399.         cmp     al, bl
  400.         je      n4S2
  401.         cmp     al, ch               ; ch = WildKey
  402.         jne     n4Loop
  403. n4S2:           cmp     ah, bh
  404.         je      n4S3
  405.         cmp     ah, ch
  406.         jne     n4Loop
  407. n4S3:           and     cl, 7fh
  408.         cmp     dl, cl
  409.         je      n4S4
  410.         cmp     dl, ch
  411.         jne     n4Loop
  412. n4S4:           cmp     dh, [si-3]
  413.         je      n4Ok
  414.         cmp     dh, ch
  415.         jne     n4Loop
  416. n4Ok:           call    AddNext
  417.         jmp     n4Loop
  418.  
  419. kS4End:         mov     bx, sameCnt
  420.         mov     sameMax, bx
  421. ;
  422.         cmp     SameNum, 1
  423.         ja      SkipCW4
  424.         call    MatchW4
  425. SkipCW4:        cmp     inSrch, 1
  426.         je      kS4pSam
  427.         cmp     SameNum, 1
  428.         jb      kS4Exit
  429.         ja      kS4Beep
  430.         mov     KeyNum, 0
  431.         mov     KeyEnd, 0
  432.         mov     cx, 0101h
  433.         mov     ah, 24h
  434.         int     16h
  435.         jmp     k4Exit
  436. ;
  437. kS4Beep:        mov     ax, 0e07h
  438.         int     10h
  439. kS4pSam:        call    prSames
  440. kS4Exit:        mov     ch, 1
  441. kS4Ex:          mov     cl, SameNum
  442. k4Exit:         pop     si
  443.         pop     di
  444.         pop     ds
  445.         pop     es
  446.         xor     ax, ax
  447.         retf
  448. KeyProc         endp
  449. ;               --------------------------------
  450. MatchW4         proc    near
  451.         push    cs
  452.         pop     es
  453.         mov     ax, 3900h
  454.         pushf
  455.         call    dword ptr Int16
  456.         or      ax, ax
  457.         jz      W4Code0
  458.         jmp     W4End
  459. ;
  460. W4Loop0:        mov     ax, 3901h
  461.         pushf
  462.         call    dword ptr Int16
  463.         or      ax, ax
  464.         jz      W4Code0
  465.         jmp     W4End
  466. ;
  467. W4Code0:        call    EnCode1              ; dh = cc1, dl = cc2
  468.         cmp     al, byte ptr KeyBuf
  469.         jne     W4Loop0
  470.         mov     word ptr Keys, ax
  471.         xchg    dh, dl
  472.         mov     word ptr CCs, dx     ; dl = cc1, dh = cc2
  473.         mov     ax, 3a00h
  474.         lea     bx, CCs+2
  475.         xchg    dh, dl
  476.         pushf
  477.         call    dword ptr Int16
  478.         or      ax, ax
  479.         jnz     W4Loop0
  480.         mov     ah, Keys+1
  481.         cmp     ah, KeyBuf+1
  482.         jne     GetW4Co1
  483.         jmp     GetW4Co
  484. ;
  485. W4Loop1:        mov     ax, 3a01h
  486.         lea     bx, CCs+2
  487.         pushf
  488.         call    dword ptr Int16
  489.         or      ax, ax
  490.         jnz     W4Loop0
  491. GetW4Co:        call    CWEnCodes
  492.         jc      W4Loop1
  493.         lea     si, CCs
  494.         call    AddSame
  495.         jmp     W4Loop1
  496. ;
  497. W4Loop2:        mov     ax, 3a01h
  498.         lea     bx, CCs+2
  499.         pushf
  500.         call    dword ptr Int16
  501.         or      ax, ax
  502.         jnz     W4Loop0
  503. GetW4Co1:       cmp     cl, 2
  504.         jbe     W4Loop2
  505.         call    CWEnCodes
  506.         jc      W4Loop2
  507.         lea     si, CCs
  508.         call    AddSame
  509.         jmp     W4Loop1
  510. ;
  511. W4End:          ret
  512. ;
  513. MatchW4         endp
  514. ;               --------------------------------
  515. MatchUcWx       proc    near
  516.         push    ax
  517.         push    cx
  518.         push    dx
  519.         mov     ax, 3a03h
  520.         pushf
  521.         call    dword ptr Int16
  522.         or      ax, ax
  523.         jnz     noUsrLib     ; es:bx = &UsrWLib, cx = uLen
  524.         mov     si, bx
  525.         mov     di, bx
  526.         add     di, cx
  527.         mov     bx, word ptr KeyBuf
  528.         mov     dx, word ptr KeyBuf+2
  529.         cmp     KeyNum, 3
  530.         jne     kUcWxSkip
  531.         mov     dh, ' '
  532. kUcWxSkip:      push    ds
  533.         mov     ax, es
  534.         mov     ds, ax
  535.         push    cs
  536.         pop     es
  537.         cld
  538. kUcWxLoop:      cmp     si, di
  539.         jae     kUcWxEnd
  540.         lodsw
  541.         cmp     ax, bx
  542.         jne     kUcWxNext
  543.         lodsw
  544.         cmp     ax, dx
  545.         je      kUcWxFound
  546. kUcWxNext:      lodsb
  547.         cmp     al, 0ah
  548.         ja      kUcWxNext
  549.         jmp     kUcWxLoop
  550. ;
  551. kUcWxFound:     lea     di, CCs
  552.         mov     cx, 64
  553.         cld
  554. kUcWxLoop1:     lodsb
  555.         cmp     al, ' '
  556.         jb      kUcWxCont0
  557.         stosb
  558.         loop    kUcWxLoop1
  559. kUcWxCont0:     mov     byte ptr es:[di], 0
  560.         push    ds
  561.         push    si
  562.         push    cs
  563.         pop     ds
  564.         mov     ah, SameNum
  565.         lea     si, CCs
  566.         call    AddSame
  567.         pop     si
  568.         pop     ds
  569.         jmp     kUcWxLoop
  570. ;
  571. kUcWxEnd:       pop     ds
  572. noUsrLib:       pop     dx
  573.         pop     cx
  574.         pop     ax
  575.         ret
  576. MatchUcWx       endp
  577. ;               --------------------------------
  578. kSele           proc    near
  579. ;
  580. ;               Select Sames from Same[]
  581. ;
  582. ;
  583.         push    es
  584.         push    ds
  585.         push    si
  586.         push    di
  587.         push    cs
  588.         pop     ds
  589. ;
  590.         cmp     al, ' '
  591.         jne     kSContx
  592.         cmp     KeyEnd, 1
  593.         je      isDef
  594.         cmp     sameNum, 1
  595.         jbe     isDef
  596.         mov     KeyEnd, 1
  597.         mov     KeyNum, 4
  598.         jmp     ksBeep
  599. ;
  600. kSContx:        cmp     al, ';'
  601.         jne     ksSel
  602. isOne:          mov     al, '1'
  603. ksSel:          cmp     al, '0'
  604.         je      isTen
  605.         sub     al, '0'
  606.         jmp     ksCont0
  607. isDef:          mov     al, 0
  608.         jmp     ksCont0
  609. isTen:          mov     al, 10
  610. ksCont0:        cmp     al, SameNum
  611.         jae     ksBeep
  612.         add     al, AutoPop
  613.         or      al, al
  614.         jz      ksSkip
  615.         mov     bl, al
  616.         xor     bh, bh
  617.         call    MovSame
  618. ksSkip:         mov     ah, 24h
  619.         int     16h
  620.         mov     AutoPop, 0
  621.         mov     sameNum, 0
  622.         mov     KeyNum, 0
  623.         mov     KeyEnd, 0
  624.         mov     cx, 0101h
  625. ksExit:         xor     ax, ax
  626.         pop     di
  627.         pop     si
  628.         pop     ds
  629.         pop     es
  630.         ret
  631. ;
  632. ksBeep:         mov     ax, 0e07h
  633.         int     10h
  634.         xor     cx, cx
  635.         jmp     ksExit
  636. kSele           endp
  637. ;               --------------------------------
  638. MovSame         proc    near
  639. ;
  640. ;               Move Same[bx] to Same[0]
  641. ;       IN:     bx = Same No.
  642. ;
  643.         les     di, SamAddr
  644.         mov     bl, es:[di+bx]
  645.         xor     bh, bh
  646. mvLoop:         mov     al, es:[di+bx+10h]
  647.         mov     es:[di+10h], al
  648.         inc     di
  649.         or      al, al
  650.         jnz     mvLoop
  651.         ret
  652. MovSame         endp
  653. ;               --------------------------------
  654. GetAttr         proc    near
  655. ;
  656. ;               Get Prompt Line Attrs
  657. ;
  658.         push    ax
  659.         push    bx
  660.         push    cx
  661.         mov     ax, 1480h
  662.         int     10h
  663.         mov     bAttr, al
  664.         mov     kAttr, bh
  665.         mov     sAttr, bl
  666.         mov     nAttr, ch
  667.         mov     eAttr, cl
  668.         pop     cx
  669.         pop     bx
  670.         pop     ax
  671.         ret
  672. GetAttr         endp
  673. ;               --------------------------------
  674. ClrLine         proc    near
  675. ;
  676. ;               Clear Prompt Line
  677. ;
  678.         mov     ch, KeyNum
  679.         add     ch, 9
  680.         mov     cl, 20
  681.         sub     cl, ch
  682.         xor     ch, ch
  683. clLoop1:        mov     ax, 1403h
  684.         mov     bl, bAttr
  685.         mov     dl, ' '
  686.         int     10h
  687.         loop    clLoop1
  688.         mov     ax, 1402h
  689.         mov     dl, 22
  690.         int     10h
  691.         mov     cx, 49
  692. clLoop2:        mov     ax, 1403h
  693.         mov     bl, bAttr
  694.         mov     dl, ' '
  695.         int     10h
  696.         loop    clLoop2
  697. clEnd:          mov     PmtX, 22
  698.         ret
  699. ClrLine         endp
  700. ;               --------------------------------
  701. prKeys          proc    near
  702. ;
  703. ;               Prompt Input Key
  704. ;
  705. ;       IN:     al = char
  706. ;               bl = KeyNum - 1
  707. ;
  708.         push    ax
  709.         call    GetAttr
  710.         mov     cl, al
  711.         mov     dl, bl
  712.         add     dl, 9
  713.         mov     ax, 1402h
  714.         int     10h
  715.         mov     ax, 1403h
  716.         mov     dl, cl
  717.         mov     bl, bAttr
  718.         or      bl, kAttr
  719.         int     10h
  720.         call    ClrLine
  721.         pop     ax
  722.         ret
  723. prKeys          endp
  724. ;               --------------------------------
  725. StrLen          proc    near
  726. ;
  727. ;               Calc String [si] Length:
  728. ;       IN:     ds:[si] = String
  729. ;       OUT:    cx = StrLen
  730. ;
  731.         push    bx
  732.         xor     bx, bx
  733. strLoop:        cmp     byte ptr [si+bx], 0
  734.         je      strEnd
  735.         inc     bl
  736.         jmp     strLoop
  737. ;
  738. strEnd:         mov     cx, bx
  739.         pop     bx
  740.         ret
  741. StrLen          endp
  742. ;               --------------------------------
  743. CalLen          proc    near
  744. ;
  745. ;               Calculate Can't Prompt the Sames in ds:[si]
  746. ;       IN:     ds:[si] = String
  747. ;       OUT:    cx = strlen
  748. ;               bl = new PmtX
  749. ;
  750.         call    StrLen
  751.         mov     bx, cx
  752.         add     bl, PmtX
  753.         add     bl, 2
  754.         cmp     inSrch, 1
  755.         jne     clSkip
  756.         add     bl, 4
  757. clSkip:         cmp     bl, 71
  758.         jae     NotPr
  759.         clc
  760.         ret
  761. NotPr:          stc
  762.         ret
  763. CalLen          endp
  764. ;               --------------------------------
  765. VeriPos         proc    near
  766. ;
  767. ;               Verify & adapt PmtX
  768. ;
  769. ;       IN:     ds:[si] = String of CCs
  770. ;
  771.         push    bx
  772.         push    cx
  773.         call    CalLen
  774.         mov     PmtX, bl
  775.         pop     cx
  776.         pop     bx
  777.         ret
  778. VeriPos         endp
  779. ;               --------------------------------
  780. prSame          proc    near
  781. ;
  782. ;               Print Same CC
  783. ;       IN:     ah      = Same No.
  784. ;               es:[si] = CCs
  785. ;
  786.         mov     cl, ah
  787.         cmp     ah, 0
  788.         jne     prCont0
  789.         mov     PmtX, 22
  790.         jmp     prPutCC
  791. ;
  792. prCont0:        inc     PmtX
  793.         mov     ax, 1402h
  794.         mov     dl, PmtX
  795.         int     10h
  796.         mov     ax, 1403h
  797.         mov     bl, bAttr
  798.         or      bl, eAttr
  799.         mov     dl, cl
  800.         cmp     dl, 10
  801.         je      is10
  802.         add     dl, '0'
  803.         jmp     prContx
  804. ;
  805. is10:           mov     dl, '0'
  806. prContx:        int     10h
  807.         inc     PmtX
  808.         cmp     cl, 1
  809.         jne     prPutCC
  810.         mov     ax, 1403h
  811.         mov     bl, bAttr
  812.         or      bl, eAttr
  813.         mov     dl, ';'
  814.         int     10h
  815.         inc     PmtX
  816. ;
  817. prPutCC:        mov     ax, 1402h
  818.         mov     dl, PmtX
  819.         int     10h
  820.         push    si
  821. prLoop:         cmp     PmtX, 71
  822.         jb      prConto
  823.         jmp     prEnd
  824. ;
  825. prConto:        mov     al, es:[si]
  826.         inc     si
  827.         or      al, al
  828.         jz      prEnd
  829.         mov     dl, al
  830.         mov     ax, 1403h
  831.         mov     bl, bAttr
  832.         or      bl, sAttr
  833.         int     10h
  834.         inc     PmtX
  835.         jmp     prLoop
  836. ;
  837. prEnd:          pop     si
  838.         ret
  839. prSame          endp
  840. ;               --------------------------------
  841. prSames         proc    near
  842. ;
  843. ;               Print All Sames in SameBuf
  844. ;
  845.         cmp     inSrch, 1
  846.         jne     prSContx
  847.         ret
  848. ;
  849. prSContx:       push    es
  850.         push    si
  851.         call    GetAttr
  852.         xor     ch, ch
  853.         mov     cl, SameNum
  854.         cmp     AutoPop, 1
  855.         jne     psSkip0
  856.         dec     cl
  857. psSkip0:        or      cl, cl
  858.         jz      psEnd
  859.         xor     ah, ah
  860.         mov     al, AutoPop
  861.         les     si, SamAddr
  862. psLoop:         push    ax
  863.         push    bx
  864.         push    cx
  865.         push    si
  866.         xor     bh, bh
  867.         mov     bl, ah
  868.         add     bl, al
  869.         mov     bl, es:[si+bx]
  870.         add     bx, 10h
  871.         add     si, bx
  872.         call    prSame
  873.         pop     si
  874.         pop     cx
  875.         pop     bx
  876.         pop     ax
  877.         inc     ah
  878.         loop    psLoop
  879. psEnd:          pop     si
  880.         pop     es
  881.         ret
  882. prSames         endp
  883. ;               --------------------------------
  884. Encode1         proc    near
  885. ;
  886. ;               Get CC  Encode
  887. ;       IN:     dx = CC  (dh = cc1; dl = cc2; )
  888. ;       OUT:    ax = K2K1
  889. ;
  890.         push    bx
  891.         mov     bx, dx
  892.         and     bx, 7f7fh
  893.         sub     bx, 3021h
  894.         cmp     nPage, 0
  895.         je      retEncode1
  896. ;
  897.         xor     ah, ah
  898.         mov     al, bh
  899.         mov     ch, 3
  900.         div     ch
  901.         mov     ch, al
  902.         mov     bh, ah
  903. ;
  904.         cmp     ch, cPage
  905.         je      retEncode1
  906.         mov     cPage, ch
  907.         call    MapPage
  908. retEncode1:     mov     al, 94
  909.         mul     bh
  910.         xor     bh, bh
  911.         add     bx, ax          ; dx = c1*94 + c2
  912.         shl     bx, 1
  913.         shl     bx, 1
  914.         mov     ax, word ptr CodeTab[bx]
  915.         and     ax, 7f7fh
  916.         pop     bx
  917.         ret
  918. Encode1         endp
  919. ;               --------------------------------
  920. Encode2         proc    near
  921. ;
  922. ;               Get CC  Encode
  923. ;       IN:     dx = CC  (dh = cc1; dl = cc2; )
  924. ;       OUT:    ax = K2K1
  925. ;
  926.         push    bx
  927.         mov     bx, dx
  928.         and     bx, 7f7fh
  929.         sub     bx, 3021h
  930.         mov     al, 94
  931.         mul     bh
  932.         xor     bh, bh
  933.         add     bx, ax          ; dx = c1*94 + c2
  934.         shl     bx, 1
  935.         shl     bx, 1
  936.         cmp     nPage, 0
  937.         jne     FromXMS
  938.         mov     ax, word ptr CodeTab[bx]
  939.         and     ax, 7f7fh
  940.         pop     bx
  941.         ret
  942. ;
  943. FromXMS:        call    ReadEncode
  944.         mov     ax, word ptr TmpCode
  945.         and     ax, 7f7fh
  946.         pop     bx
  947.         ret
  948. Encode2         endp
  949. ;               --------------------------------
  950. CWEnCodes       proc    near
  951. ;
  952. ;       IN:     CCs = String
  953. ;       OUT:    Keys = CWEnCodes
  954. ;
  955.         lea     si, CCs
  956.         xor     ch, ch
  957.         inc     cl
  958.         cmp     cl, 2
  959.         je      toTwo
  960.         jb      notMatch
  961.         cmp     cl, 3
  962.         je      toThree
  963. ;
  964. ;       CCs >= 4:
  965. ;
  966.         dec     cx
  967.         shl     cx, 1
  968.         mov     bx, cx
  969.         mov     dx, [si+bx]
  970.         xchg    dh, dl
  971.         call    EnCode2
  972.         cmp     al, byte ptr KeyBuf+3
  973.         jne     notMatch
  974. ;
  975.         mov     dx, [si+2]
  976.         xchg    dh, dl
  977.         call    EnCode2
  978.         cmp     al, byte ptr KeyBuf+1
  979.         jne     notMatch
  980.         mov     dx, [si+4]
  981.         xchg    dh, dl
  982.         call    EnCode2
  983.         cmp     al, byte ptr KeyBuf+2
  984.         jne     notMatch
  985.         clc
  986.         ret
  987. ;
  988. notMatch:       stc
  989.         ret
  990. ;
  991. toTwo:          mov     al, byte ptr Keys+1
  992.         cmp     al, byte ptr KeyBuf+1
  993.         jne     notMatch
  994.         mov     dx, [si+2]
  995.         xchg    dh, dl
  996.         call    EnCode2
  997.         cmp     ax, word ptr KeyBuf+2
  998.         jne     notMatch
  999.         clc
  1000.         ret
  1001. ;
  1002. toThree:        cmp     W3Mode, 1
  1003.         jb      to3
  1004.         ja      to3e
  1005. ;
  1006. ;       W3Mode = 1:  Keys = '1123'
  1007. ;
  1008.         mov     al, byte ptr Keys+1
  1009.         cmp     al, byte ptr KeyBuf+1
  1010.         jne     W3nMatch
  1011.         mov     dx, [si+2]
  1012.         xchg    dh, dl
  1013.         call    EnCode2
  1014.         cmp     al, byte ptr KeyBuf+2
  1015.         jne     W3nMatch
  1016.         mov     dx, [si+3]
  1017.         xchg    dh, dl
  1018.         call    EnCode2
  1019.         cmp     al, byte ptr KeyBuf+3
  1020.         jne     W3nMatch
  1021.         clc
  1022.         ret
  1023. ;
  1024. ;       W3Mode = 0:  Keys = '123 '
  1025. ;
  1026. to3:            cmp     KeyNum, 3
  1027.         jne     W3nMatch
  1028.         mov     dx, [si+2]
  1029.         xchg    dh, dl
  1030.         call    EnCode2
  1031.         cmp     al, byte ptr KeyBuf+1
  1032.         jne     W3nMatch
  1033.         mov     dx, [si+4]
  1034.         xchg    dh, dl
  1035.         call    EnCode2
  1036.         cmp     al, byte ptr KeyBuf+2
  1037.         jne     W3nMatch
  1038.         clc
  1039.         ret
  1040. ;
  1041. ;       W3Mode = 2:  Keys = '1233'
  1042. ;
  1043. to3e:           mov     dx, [si+2]
  1044.         xchg    dh, dl
  1045.         call    EnCode2
  1046.         cmp     al, byte ptr KeyBuf+1
  1047.         jne     W3nMatch
  1048.         mov     dx, [si+4]
  1049.         xchg    dh, dl
  1050.         call    EnCode2
  1051.         cmp     ax, word ptr KeyBuf+2
  1052.         jne     W3nMatch
  1053.         clc
  1054.         ret
  1055. ;
  1056. W3nMatch:       stc
  1057.         ret
  1058. CWEnCodes       endp
  1059. ;               --------------------------------
  1060. Key123          proc    near
  1061. ;
  1062. ;               Matches Simple Encoded CCs
  1063. ;
  1064.         mov     inSrch, 0
  1065.         cmp     KeyNum, 1
  1066.         je      kGetH1
  1067.         cmp     KeyNum, 2
  1068.         je      kGetH2
  1069.         jmp     kGetH3
  1070. ;
  1071. kH2No:          xor     ax, ax
  1072.         mov     ch, 1
  1073.         xor     cl, cl
  1074.         ret
  1075. ;
  1076. kGetH1:         lea     bx, KeyBuf
  1077.         mov     al, [bx]
  1078.         mov     dl, WildKey
  1079.         cmp     al, dl
  1080.         je      kH2No
  1081.         sub     al, ' '
  1082.         and     al, 7fh
  1083.         xor     ah, ah
  1084.         mov     bx, ax
  1085.         shl     bx, 1
  1086.         mov     ax, word ptr OneTab[bx]
  1087.         cmp     ah, 0a1h
  1088.         jb      kH2No
  1089.         cmp     al, 0a1h
  1090.         jb      kH2No
  1091.         lea     si, CCs
  1092.         mov     [si], ax
  1093.         mov     byte ptr [si+2], 0
  1094.         mov     ah, 0
  1095.         push    es
  1096.         push    ds
  1097.         pop     es
  1098.         call    prSame
  1099.         pop     es
  1100.         call    AddSame
  1101.         xor     ax, ax
  1102.         mov     cx, 0101h
  1103.         ret
  1104. ;
  1105. kGetH2:         lea     bx, KeyBuf
  1106.         mov     ax, [bx]
  1107.         mov     ch, WildKey
  1108.         cmp     al, ch
  1109.         je      k2SetSrch
  1110.         cmp     ah, ch
  1111.         je      k2SetSrch
  1112.         jmp     k2Srch
  1113. ;
  1114. k2SetSrch:      mov     inSrch, 1
  1115.         mov     pgSize, 6
  1116. k2Srch:         lea     si, CodeTab
  1117.         lea     di, NextTab
  1118.         cmp     nPage, 0
  1119.         je      kH2Loop
  1120.         call    MapPage
  1121.         lea     di, CodeTab+1128
  1122.         jmp     kH2Loop
  1123. ;
  1124. k2NextPage:     cmp     nPage, 0
  1125.         je      kH2End
  1126.         inc     cPage
  1127.         cmp     cPage, 23
  1128.         ja      kH2End
  1129.         call    MapPage
  1130.         lea     si, CodeTab
  1131. ;
  1132. kH2Loop:        cmp     si, di
  1133.         jae     k2NextPage
  1134.         mov     bx, [si]
  1135.         add     si, +4
  1136.         and     bl, 7fh
  1137.         cmp     al, ch               ; first is WildKey ?
  1138.         je      h2Cont0
  1139.         cmp     al, bl               ; first key equals ?
  1140.         jne     kH2Loop
  1141. h2Cont0:        test    bh, 80h
  1142.         jz      kH2Loop
  1143.         cmp     ah, ch               ; second is WildKey ?
  1144.         je      h2Cont1
  1145.         and     bh, 7fh
  1146.         cmp     ah, bh               ; second key equals ?
  1147.         jne     kH2Loop
  1148. h2Cont1:        inc     sameCnt
  1149.         mov     bx, sameCnt
  1150.         cmp     bx, pageMin
  1151.         jbe     kH2Loop
  1152.         call    PushSam
  1153.         jmp     kH2Loop
  1154. ;
  1155. kH2End:         mov     bx, sameCnt
  1156.         mov     sameMax, bx
  1157. ;
  1158.         call    prSames
  1159.         xor     ax, ax
  1160.         mov     cl, SameNum
  1161.         mov     ch, 01h
  1162.         ret
  1163. ;
  1164. kGetH3:         lea     bx, KeyBuf
  1165.         mov     ax, [bx]
  1166.         mov     dl, [bx+2]
  1167.         mov     ch, WildKey
  1168.         cmp     al, ch
  1169.         je      k3SetSrch
  1170.         cmp     ah, ch
  1171.         je      k3SetSrch
  1172.         cmp     dl, ch
  1173.         je      k3SetSrch
  1174.         jmp     k3sSrch
  1175. ;
  1176. k3SetSrch:      mov     inSrch, 1
  1177.         mov     pgSize, 6
  1178.         jmp     k3sSkip
  1179. ;
  1180. k3sSrch:        call    MatchUcWx
  1181.         cmp     SameNum, 1
  1182.         jb      k3sSkip
  1183.         jmp     SkipW3
  1184. ;
  1185. k3sSkip:        lea     si, CodeTab
  1186.         lea     di, NextTab
  1187.         cmp     nPage, 0
  1188.         je      kH3Loop
  1189.         call    MapPage
  1190.         lea     di, CodeTab+1128
  1191.         jmp     kH3Loop
  1192. ;
  1193. k3NextPage:     cmp     nPage, 0
  1194.         je      k3Next
  1195.         inc     cPage
  1196.         cmp     cPage, 23
  1197.         ja      k3Next
  1198.         call    MapPage
  1199.         lea     si, CodeTab
  1200. ;
  1201. kH3Loop:        cmp     si, di
  1202.         jae     k3NextPage
  1203.         mov     bx, [si]
  1204.         add     si, +2
  1205.         mov     cl, [si]
  1206.         add     si, +2
  1207.         and     bx, 7f7fh
  1208.         cmp     al, ch
  1209.         je      h3Cont0
  1210.         cmp     al, bl
  1211.         jne     kH3Loop
  1212. h3Cont0:        cmp     ah, ch
  1213.         je      h3Cont1
  1214.         cmp     ah, bh
  1215.         jne     kH3Loop
  1216. h3Cont1:        cmp     byte ptr [si-1], ' '
  1217.         je      h3Cont2
  1218.         test    cl, 80h
  1219.         jz      kH3Loop
  1220. h3Cont2:        cmp     dl, ch
  1221.         je      kH3Ok
  1222.         and     cl, 7fh
  1223.         cmp     dl, cl
  1224.         jne     kH3Loop
  1225. kH3Ok:          inc     sameCnt
  1226.         mov     bx, sameCnt
  1227.         cmp     bx, pageMin
  1228.         jbe     kH3Loop
  1229.         call    PushSam
  1230.         jmp     kH3Loop
  1231. ;
  1232. k3Next:         mov     di, CodeEnd
  1233.         cmp     nPage, 0
  1234.         je      n3Loop
  1235.         call    MapPage
  1236.         lea     si, CodeTab
  1237.         cmp     nPage, 23
  1238.         ja      n3Loop
  1239.         mov     di, si
  1240.         add     di, eSize
  1241.         jmp     n3Loop
  1242. ;
  1243. n3NextPage:     cmp     nPage, 0
  1244.         je      kH3End
  1245.         inc     cPage
  1246.         mov     bl, cPage
  1247.         cmp     bl, nPage
  1248.         ja      kH3End
  1249.         call    MapPage
  1250.         lea     si, CodeTab
  1251.         mov     bl, cPage
  1252.         cmp     bl, nPage
  1253.         jb      n3Loop
  1254.         mov     di, si
  1255.         add     di, eSize
  1256. ;
  1257. n3Loop:         cmp     si, di
  1258.         jae     n3NextPage
  1259.         mov     bx, [si]
  1260.         add     si, +2
  1261.         mov     cl, [si]
  1262.         add     si, +4
  1263.         and     bx, 7f7fh
  1264.         cmp     al, ch
  1265.         je      n3Cont0
  1266.         cmp     al, bl
  1267.         jne     n3Loop
  1268. n3Cont0:        cmp     ah, ch
  1269.         je      n3Cont1
  1270.         cmp     ah, bh
  1271.         jne     n3Loop
  1272. n3Cont1:        cmp     byte ptr [si-3], ' '
  1273.         je      n3Cont2
  1274.         test    cl, 80h
  1275.         jz      n3Loop
  1276. n3Cont2:        cmp     dl, ch
  1277.         je      nH3Ok
  1278.         and     cl, 7fh
  1279.         cmp     dl, cl
  1280.         jne     n3Loop
  1281. nH3Ok:          call    AddNext
  1282.         jmp     n3Loop
  1283. ;
  1284. kH3End:         mov     bx, sameCnt
  1285.         mov     sameMax, bx
  1286. ;
  1287.         cmp     SameNum, 1
  1288.         ja      SkipW3
  1289.         cmp     W3Mode, 0
  1290.         jne     SkipW3
  1291.         call    MatchW3
  1292. SkipW3:         call    prSames
  1293.         mov     ch, 1
  1294.         mov     cl, SameNum
  1295.         ret
  1296. Key123          endp
  1297. ;               --------------------------------
  1298. AddNext         proc    near
  1299. ;
  1300. ;       IN:     ds:[si] = NextCC
  1301. ;
  1302.         inc     sameCnt
  1303.         mov     bx, sameCnt
  1304.         cmp     bx, pageMin
  1305.         jbe     noAddIt
  1306.         push    si
  1307.         push    ax
  1308.         mov     ax, [si-2]
  1309.         sub     si, 6
  1310.         mov     TabOff, si
  1311.         lea     si, CCs
  1312.         mov     [si], ax
  1313.         mov     byte ptr [si+2], 0
  1314.         call    VeriPos
  1315.         call    AddSame
  1316.         pop     ax
  1317.         pop     si
  1318. noAddIt:        ret
  1319. AddNext         endp
  1320. ;               --------------------------------
  1321. MatchW3         proc    near
  1322. ;
  1323.         push    cs
  1324.         pop     es
  1325.         mov     ax, 3900h
  1326.         pushf
  1327.         call    dword ptr Int16
  1328.         or      ax, ax
  1329.         jz      W3Code0
  1330.         jmp     W3End
  1331. ;
  1332. W3Loop0:        mov     ax, 3901h
  1333.         pushf
  1334.         call    dword ptr Int16
  1335.         or      ax, ax
  1336.         jz      W3Code0
  1337.         jmp     W3End
  1338. ;
  1339. W3Code0:        call    EnCode1              ; dh = cc1, dl = cc2
  1340.         cmp     al, byte ptr KeyBuf
  1341.         jne     W3Loop0
  1342.         xchg    dh, dl
  1343.         mov     word ptr CCs, dx     ; dl = cc1, dh = cc2
  1344.         mov     ax, 3a00h
  1345.         lea     bx, CCs+2
  1346.         xchg    dh, dl
  1347.         pushf
  1348.         call    dword ptr Int16
  1349.         or      ax, ax
  1350.         jnz     W3Loop0
  1351.         jmp     GetW3Co
  1352. ;
  1353. W3Loop1:        mov     ax, 3a01h
  1354.         lea     bx, CCs+2
  1355.         pushf
  1356.         call    dword ptr Int16
  1357.         or      ax, ax
  1358.         jnz     W3Loop0
  1359. GetW3Co:        cmp     cl, 2
  1360.         jne     W3Loop1
  1361.         call    CWEnCodes
  1362.         jc      W3Loop1
  1363.         lea     si, CCs
  1364.         call    AddSame
  1365.         jmp     W3Loop1
  1366. ;
  1367. W3End:          ret
  1368. MatchW3         endp
  1369. ;               --------------------------------
  1370. PushSam         proc    near
  1371. ;
  1372. ;       IN:     si = Offset of CODE TABLE
  1373. ;
  1374.         push    ax
  1375.         push    si
  1376.         call    GetCode
  1377.         sub     si, 4
  1378.         mov     TabOff, si
  1379.         lea     si, CCs
  1380.         mov     [si], ax
  1381.         mov     byte ptr [si+2], 0
  1382.         call    VeriPos
  1383.         call    AddSame
  1384.         pop     si
  1385.         pop     ax
  1386.         ret
  1387. PushSam         endp
  1388. ;               --------------------------------
  1389. GetCode         proc    near
  1390. ;
  1391. ;       IN:     si = offset of CODE TABLE
  1392. ;       OUT:    ax = GBcode
  1393. ;
  1394.         push    bx
  1395.         push    dx
  1396.         mov     ax, si
  1397.         sub     ax, offset CodeTab
  1398.         dec     ax
  1399.         dec     ax
  1400.         shr     ax, 1
  1401.         shr     ax, 1
  1402.         mov     bl, 94
  1403.         div     bl
  1404.         add     ax, 2130h
  1405. ;
  1406.         mov     dl, cPage
  1407.         add     al, dl
  1408.         shl     dl, 1
  1409.         add     al, dl               ; 3 Qu / Page
  1410. ;
  1411.         or      ax, 8080h
  1412.         pop     dx
  1413.         pop     bx
  1414.         ret
  1415. GetCode         endp
  1416. ;               --------------------------------
  1417. prEncode        proc    near
  1418. ;
  1419. ;       IN:     es:si = Offset of CODE TABLE
  1420. ;               ah = sameNo
  1421. ;
  1422.         pusha
  1423.         push    es
  1424.         push    cs
  1425.         pop     es
  1426.         mov     dl, ah
  1427.         shl     dl, 1                
  1428.         shl     dl, 1
  1429.         shl     dl, 1
  1430.         add     dl, 21
  1431.         cmp     ah, 1
  1432.         jne     prECont0
  1433.         dec     dl
  1434. prECont0:       mov     PmtX, dl
  1435.         lea     si, CCs
  1436.         call    prSame
  1437.         mov     si, TabOff
  1438. ;
  1439.         mov     ax, [si]
  1440.         mov     dx, [si+2]
  1441.         and     ax, 7f7fh
  1442.         and     dx, 7f7fh
  1443. ;
  1444.         push    dx
  1445.         mov     cx, ax
  1446.         mov     ax, 1403h
  1447.         mov     bl, bAttr
  1448.         or      bl, kAttr
  1449. ;
  1450.         mov     dl, cl
  1451.         pusha
  1452.         int     10h
  1453.         popa
  1454.         inc     PmtX
  1455. ;
  1456.         mov     dl, ch
  1457.         pusha
  1458.         int     10h
  1459.         popa
  1460.         inc     PmtX
  1461. ;
  1462.         pop     dx
  1463.         mov     cx, dx
  1464.         pusha
  1465.         int     10h
  1466.         popa
  1467.         inc     PmtX
  1468. ;
  1469.         mov     dl, ch
  1470.         int     10h
  1471.         inc     PmtX
  1472. ;
  1473.         pop     es
  1474.         popa
  1475.         ret
  1476. prEncode        endp
  1477. ;               --------------------------------
  1478. AddSame         proc    near
  1479. ;
  1480. ;       IN:     [si] = Strings of CCs
  1481. ;
  1482.         mov     ax, pgSize
  1483.         cmp     SameNum, al
  1484.         jae     asAbort
  1485.         cmp     PmtX, 71
  1486.         jae     asAbort
  1487.         push    es
  1488.         push    ax
  1489.         push    bx
  1490.         push    cx
  1491.         push    di
  1492.         push    si
  1493.         les     di, SamAddr
  1494.         cmp     SameNum, 0
  1495.         jne     asSkip
  1496.         mov     cx, 11
  1497.         xor     bx, bx
  1498.         mov     al, 0
  1499. asLoop0:        mov     es:[di+bx], al
  1500.         add     al, 16
  1501.         inc     bl
  1502.         loop    asLoop0
  1503. asSkip:         xor     bh, bh
  1504.         mov     bl, SameNum
  1505.         add     bl, AutoPop
  1506.         mov     bl, es:[di+bx]
  1507.         mov     cl, bl
  1508. asLoop:         cld
  1509.         lodsb
  1510.         mov     es:[di+bx+10h], al
  1511.         or      al, al
  1512.         jz      asEnd
  1513.         inc     bl
  1514.         jmp     asLoop
  1515. ;
  1516. asEnd:          inc     SameNum
  1517.         add     cl, 16
  1518.         cmp     bl, cl
  1519.         jb      asSkipRePntr
  1520.         inc     bl
  1521.         mov     al, bl
  1522.         mov     bl, ah
  1523.         inc     bl
  1524.         mov     es:[bx], al
  1525. asSkipRePntr:   pop     si
  1526.         cmp     inSrch, 1
  1527.         jne     asSkipPr
  1528.         mov     ah, sameNum
  1529.         dec     ah
  1530.         call    prEncode
  1531. asSkipPr:       pop     di
  1532.         pop     cx
  1533.         pop     bx
  1534.         pop     ax
  1535.         pop     es
  1536.         clc
  1537.         ret
  1538. asAbort:        stc
  1539.         ret
  1540. AddSame         endp
  1541. ;               -------------------------------
  1542. MapPage         proc    near
  1543. ;
  1544. ;       IN:     cPage = to be Mapped
  1545. ;
  1546.         pusha
  1547.         xor     ah, ah
  1548.         mov     al, cPage
  1549.         mov     cx, 1128
  1550.         mul     cx
  1551.         mov     word ptr sOffset, ax
  1552.         lea     si, xStruc
  1553.         mov     ah, 0bh
  1554.         call    dword ptr xEntry
  1555.         popa
  1556.         ret
  1557. ;
  1558. inPage          db      0
  1559. MapPage         endp
  1560. ;               -------------------------------
  1561. ReadEncode      proc    near
  1562. ;
  1563. ;       IN:     bx = offset
  1564. ;
  1565.         push    si
  1566.         mov     word ptr sOffset2, bx
  1567.         mov     ah, 0bh
  1568.         lea     si, xStruc2
  1569.         call    dword ptr xEntry
  1570.         pop     si
  1571.         ret
  1572. ;
  1573. TmpCode         dw      3 dup(0)
  1574. ReadEncode      endp
  1575. ;
  1576. ;               -------------------------------
  1577. ;
  1578. CSVer           db      16 dup(?)
  1579. EName           db      8  dup(?)
  1580. CodeLen         db      ?
  1581. ;
  1582. ;       W3Mode  = 0 ... One Code for every CC
  1583. ;               = 1 ... Two Codes for First CC
  1584. ;               = 2 ... Two Codes for End CC
  1585. ;
  1586. W3Mode          db      ?
  1587. ;
  1588. KeyTab          db      112 dup(?)
  1589. OneTab          db      224 dup(?)
  1590. ;
  1591. WildKey         db      '?'
  1592.         db      ?
  1593.         db      (400 - 364) dup(?)
  1594. ;
  1595. ;               -------------------------------
  1596. ;
  1597. CodeTab         db      27072 dup(?)         ; 6768 * 4
  1598. NextTab         db      3200 dup(?)          ; 800 * 4
  1599. ;
  1600.         dw      0ffffh
  1601. HdMark          db      'Encodes ended', 1ah
  1602. ;
  1603. ;               -------------------------------
  1604. ;
  1605. sKmode          proc    near
  1606. ;
  1607. ;       Set Current Key Mode to:
  1608. ;
  1609. ;       IN:     bh = kmode
  1610. ;
  1611.         push    es
  1612.         push    ds
  1613.         mov     ax, cs
  1614.         mov     ds, ax
  1615.         mov     byte ptr KeyNum, 0
  1616.         mov     byte ptr KeyEnd, 0
  1617.         mov     byte ptr SameNum, 0
  1618.         cmp     bh, 2
  1619.         jb      sRetn
  1620.         cmp     bh, 7
  1621.         jbe     sCont0
  1622. sRetn:          mov     ax, 8080h
  1623.         jmp     sExit
  1624. ;
  1625. sCont0:         mov     bl, bh
  1626.         xor     bh, bh
  1627.         cmp     bl, KTable[bx]
  1628.         jne     sRetn
  1629.         mov     tmp, bl
  1630.         mov     cl, 4
  1631.         shl     bx, cl
  1632.         lea     si, Fname               ; Get File
  1633.         add     si, bx
  1634.         mov     di, NameOff
  1635.         mov     ax, cs
  1636.         mov     ds, ax
  1637.         mov     es, ax
  1638.         mov     cx, 13
  1639.         cld
  1640.         rep     movsb                   ; Make Path
  1641.         mov     ax, 3d00h
  1642.         lea     dx, Path
  1643.         int     21h
  1644.         jc      sFail
  1645.         mov     Handle, ax
  1646.         mov     bx, ax
  1647.         mov     ah, 3fh
  1648.         mov     cx, 400 + 27072 + 3200
  1649.         lea     dx, CSVer
  1650.         int     21h
  1651.         jc      sFail
  1652.         and     al, 0feh
  1653.         lea     bx, CSVer
  1654.         add     bx, ax
  1655. ;
  1656.         sub     ax, 400
  1657.         mov     dSize, ax
  1658. ;
  1659.         mov     word ptr [bx], 0ffffh
  1660.         add     bx, +2
  1661.         mov     CodeEnd, bx
  1662. ;
  1663.         mov     al, tmp
  1664.         mov     Current, al
  1665.         mov     ah, 3eh
  1666.         mov     bx, Handle
  1667.         int     21h
  1668.         push    cs
  1669.         pop     es
  1670.         lea     si, Mark
  1671.         lea     di, CSVer
  1672.         mov     cx, 8
  1673.         cld
  1674.         repz    cmpsb
  1675.         jnz     BadDat
  1676. ;
  1677.         call    MoveToXMS
  1678. ;
  1679.         xor     ax, ax
  1680. sExit:          pop     ds
  1681.         pop     es
  1682.         ret
  1683. ;
  1684. BadDat:         lea     dx, BadFile
  1685.         mov     ah, 09h
  1686.         int     21h
  1687. ;
  1688. sFail:          mov     ax, 8080h
  1689.         jmp     sExit
  1690. ;
  1691. sKmode          endp
  1692. ;               -------------------------------
  1693. MoveToXMS       proc    near
  1694. ;
  1695.         cmp     word ptr xEntry+2, 0
  1696.         jne     MToCont0
  1697. ;
  1698. SetNoXMS:       mov     nPage, 0
  1699.         mov     dx, dSize
  1700.         mov     pSize, dx
  1701.         mov     eSize, dx
  1702.         mov     cSize, dx
  1703.         mov     cPage, 0
  1704.         ret
  1705. ;
  1706. MToCont0:       mov     dx, dSize
  1707.         test    dx, 03ffh
  1708.         jz      noInc
  1709.         add     dx, 400h
  1710. noInc:          mov     dl, dh
  1711.         xor     dh, dh
  1712.         shr     dx, 1
  1713.         shr     dx, 1
  1714. ;
  1715.         mov     ah, 9
  1716.         call    dword ptr xEntry
  1717.         cmp     bl, 0
  1718.         jne     SetNoXMS
  1719.         mov     xHandle, dx
  1720. ;
  1721.         mov     dHandle, dx
  1722.         mov     ax, dSize
  1723.         mov     Count, ax
  1724.         mov     sHandle, 0
  1725.         lea     ax, CodeTab
  1726.         mov     word ptr sOffset, ax
  1727.         mov     ax, cs
  1728.         mov     word ptr sOffset+2, ax
  1729.         mov     word ptr dOffset, 0
  1730.         mov     word ptr dOffset+2, 0
  1731.         mov     ah, 0bh
  1732.         lea     si, xStruc
  1733.         call    dword ptr xEntry
  1734.         cmp     bl, 0
  1735.         je      MoveSucceed
  1736. ;
  1737.         mov     ah, 0ah
  1738.         mov     dx, xHandle
  1739.         call    dword ptr xEntry
  1740.         jmp     SetNoXMS
  1741. ;
  1742. MoveSucceed:    mov     Count, 1128
  1743.         mov     Count2, 4
  1744. ;
  1745.         mov     ax, xHandle
  1746.         mov     sHandle, ax
  1747.         mov     sHandle2, ax
  1748. ;
  1749.         mov     word ptr sOffset+2, 0
  1750.         mov     word ptr sOffset2+2, 0
  1751. ;
  1752.         lea     ax, CodeTab
  1753.         mov     word ptr dOffset, ax
  1754.         lea     ax, TmpCode
  1755.         mov     word ptr dOffset2, ax
  1756. ;
  1757.         mov     ax, cs
  1758.         mov     word ptr dOffset+2, ax
  1759.         mov     word ptr dOffset2+2, ax
  1760. ;
  1761.         mov     dHandle, 0
  1762.         mov     dHandle2, 0
  1763. ;
  1764.         mov     bx, 1128
  1765.         lea     ax, CodeTab+1128
  1766.         mov     CodeEnd, ax
  1767.         mov     pSize, bx
  1768.         mov     cSize, bx
  1769.         mov     ax, dSize
  1770.         xor     dx, dx
  1771.         div     bx
  1772.         mov     nPage, al
  1773.         mov     eSize, dx
  1774.         mov     cPage, 0
  1775.         ret
  1776. MoveToXMS       endp
  1777. ;
  1778. ;               -------------------------------
  1779. ;
  1780. iFile           db      'chcs.ini', 0
  1781. ;
  1782. kmode0          db      ?
  1783. firstk          db      0
  1784. ;
  1785. ChcsMark        db      13,10,9, 'CHCS'
  1786. noCHCS          db      7, 'xis: CHCS/CHIS not installed !', 0dh,0ah, '$'
  1787. BadVer          db      7, 'xis: ░µ▒╛║┼▓╗╢╘', 0dh,0ah, '$'
  1788. BadFile         db      7, 'xis: ▒α┬δ╬─╝■╕±╩╜┤φ╗≥░µ▒╛║┼▓╗╢╘', 0dh,0ah, '$'
  1789. ;
  1790. ;               --------------------------------
  1791. ;
  1792. init:           mov     ax, 3f00h
  1793.         int     16h
  1794.         mov     di, bx
  1795.         lea     si, ChcsMark
  1796.         mov     cx, 5
  1797.         cld
  1798.         repz    cmpsb
  1799.         jz      iCont00
  1800.         lea     dx, noCHCS
  1801.         jmp     PrError
  1802. ;
  1803. iCont00:        cmp     ax, 0100h
  1804.         je      iCont01
  1805.         lea     dx, BadVer
  1806.         jmp     PrError
  1807. ;
  1808. iCont01:        mov     ax, cs
  1809.         mov     ds, ax
  1810.         mov     es, ax
  1811.         mov     Psp, ax
  1812.         mov     ax, cs:[2ch]
  1813.         mov     Env, ax
  1814.         xor     si, si
  1815.         mov     ds, ax
  1816. iLoop0:         cmp     word ptr [si], 0
  1817.         je      iEnd0
  1818.         inc     si
  1819.         jmp     iLoop0
  1820. iEnd0:          add     si, +4
  1821.         lea     di, Path
  1822.         cld
  1823. iLoop1:         lodsb
  1824.         stosb
  1825.         or      al, al
  1826.         jz      iEnd1
  1827.         cmp     al, '\'
  1828.         jne     iLoop1
  1829.         mov     es:NameOff, di
  1830.         jmp     iLoop1
  1831. iEnd1:          mov     ax, cs
  1832.         mov     ds, ax
  1833.         mov     di, NameOff
  1834.         lea     si, iFile
  1835.         cld
  1836. iLoop2:         lodsb
  1837.         stosb
  1838.         cmp     al, 0
  1839.         jne     iLoop2
  1840. ;
  1841. ;       Test XMS memory
  1842. ;
  1843.         mov     ax, 4300h
  1844.         int     2fh
  1845.         cmp     al, 80h
  1846.         jne     iNoXMS
  1847.         mov     ax, 4310h
  1848.         int     2fh
  1849.         mov     word ptr xEntry, bx
  1850.         mov     word ptr xEntry+2, es
  1851. ;
  1852. ;               Treat Command Line Parameters:
  1853. ;
  1854. iNoXMS:         mov     si, 81h
  1855. cmdLoop0:       mov     al, [si]
  1856.         inc     si
  1857.         cmp     al, ' '
  1858.         je      cmdLoop0
  1859.         cmp     al, 09h
  1860.         je      cmdLoop0
  1861.         or      al, 20h
  1862.         cmp     al, 'f'
  1863.         jne     noCmd
  1864. cmdLoop1:       mov     al, [si]
  1865.         inc     si
  1866.         cmp     al, ' '
  1867.         je      cmdLoop1
  1868.         cmp     al, 09h
  1869.         je      cmdLoop1
  1870.         cmp     al, '3'
  1871.         jb      noCmd
  1872.         cmp     al, '8'
  1873.         ja      noCmd
  1874.         sub     al, '1'
  1875.         xor     bh, bh
  1876.         mov     bl, al
  1877.         mov     byte ptr KTable[bx], al
  1878.         mov     tmp, al
  1879.         mov     kmode0, al
  1880. cmdLoop2:       mov     al, [si]
  1881.         inc     si
  1882.         cmp     al, ' '
  1883.         je      cmdLoop2
  1884.         cmp     al, 09h
  1885.         je      cmdLoop2
  1886.         cmp     al, '='
  1887.         jne     noCmd
  1888. cmdLoop3:       mov     al, [si]
  1889.         inc     si
  1890.         cmp     al, ' '
  1891.         je      cmdLoop3
  1892.         cmp     al, 09h
  1893.         je      cmdLoop3
  1894.         or      al, 20h
  1895.         cmp     al, 'a'
  1896.         jb      noCmd
  1897.         cmp     al, 'z'
  1898.         ja      noCmd
  1899. cmdLoop4:       dec     si
  1900.         xor     bh, bh
  1901.         mov     bl, tmp
  1902.         mov     cl, 4
  1903.         shl     bx, cl
  1904.         lea     di, Fname
  1905.         add     di, bx
  1906.         mov     cx, 16
  1907.         push    cs
  1908.         pop     es
  1909.         cld
  1910. cmdLoop5:       lodsb
  1911.         cmp     al, ' '
  1912.         jbe     noCmd
  1913.         stosb
  1914.         loop    cmdLoop5
  1915. ;
  1916. noCmd:          push    cs
  1917.         pop     es
  1918.         mov     ax, 3d00h
  1919.         lea     dx, iFile            ; use CurDir chcs.ini
  1920.         int     21h
  1921.         jnc     iCont8
  1922. ;
  1923.         mov     ax, 3d00h
  1924.         lea     dx, Path             ; use ChcsSys chcs.ini
  1925.         int     21h
  1926.         jnc     iCont8
  1927.         jmp     iTest
  1928. ;
  1929. iCont8:         mov     Handle, ax
  1930.         mov     bx, ax
  1931.         mov     ah, 3fh
  1932.         lea     dx, Buffer
  1933.         mov     cx, 0400h
  1934.         int     21h
  1935.         lea     si, Buffer
  1936.         mov     bx, ax
  1937.         mov     word ptr [si+bx], 1a1ah        ; Set File End Mark
  1938.         mov     ah, 3eh
  1939.         mov     bx, Handle
  1940.         int     21h
  1941. ;
  1942. iLoop3:         mov     al, [si]
  1943.         cmp     al, '#'
  1944.         je      iLoop4
  1945.         cmp     al, 0dh
  1946.         je      NxtLine
  1947.         cmp     al, 0ah
  1948.         je      NxtLine
  1949.         cmp     al, 1ah
  1950.         jne     iCont0
  1951. toCont4:        jmp     iTest
  1952. NxtLine:        inc     si
  1953.         jmp     iLoop3
  1954. ;
  1955. iLoop4:         inc     si
  1956.         mov     al, [si]
  1957.         cmp     al, 1ah
  1958.         je      toCont4
  1959.         cmp     al, 0dh
  1960.         je      NxtLine
  1961.         cmp     al, 0ah
  1962.         je      NxtLine
  1963.         jmp     iLoop4
  1964. iSpace0:        inc     si
  1965.         mov     al, [si]
  1966. iCont0:         cmp     al, ' '
  1967.         je      iSpace0
  1968.         cmp     al, 09h
  1969.         je      iSpace0
  1970.         cmp     al, 'F'
  1971.         je      iCont1
  1972.         cmp     al, 'f'
  1973.         je      iCont1
  1974.         jmp     iLoop4                  ; Skip This Line
  1975. iCont1:         cmp     tmp, 0
  1976.         jne     iLoop4
  1977.         inc     si
  1978.         mov     al, [si]
  1979.         cmp     al, '3'
  1980.         jb      iLoop4
  1981.         cmp     al, '8'
  1982.         ja      iLoop4
  1983.         sub     al, '1'
  1984.         xor     bh, bh
  1985.         mov     bl, al
  1986.         mov     KTable[bx], al
  1987.         mov     tmp, al
  1988.         mov     kmode0, al
  1989. iSpace1:        inc     si
  1990.         mov     al, [si]
  1991.         cmp     al, ' '
  1992.         je      iSpace1
  1993.         cmp     al, 09h
  1994.         je      iSpace1
  1995.         cmp     al, '='
  1996.         je      iCont2
  1997.         jmp     iLoop4
  1998. ;
  1999. iCont2:         inc     si
  2000.         mov     al, [si]
  2001.         cmp     al, ' '
  2002.         je      iCont2
  2003.         cmp     al, 09h
  2004.         je      iCont2
  2005. ;
  2006.         xor     bh, bh
  2007.         mov     bl, tmp
  2008.         mov     cl, 4
  2009.         shl     bx, cl
  2010.         lea     di, Fname
  2011.         add     di, bx
  2012.         mov     cx, 16
  2013. iLoop5:         lodsb
  2014.         cmp     al, ' '
  2015.         jbe     toNxtl
  2016.         stosb
  2017.         dec     cx
  2018.         jz      toNxtl
  2019.         jmp     iLoop5
  2020. toNxtl:         jmp     iLoop3
  2021. ;
  2022. iTest:          mov     ax, 3516h
  2023.         int     21h
  2024.         mov     word ptr Int16, bx
  2025.         mov     word ptr Int16+2, es
  2026. ;
  2027.         lea     bx, KTable
  2028.         mov     cx, 8
  2029. iLoop6:         cmp     byte ptr [bx], 0
  2030.         jne     iTSR
  2031.         inc     bx
  2032.         loop    iLoop6
  2033. ;
  2034. iQuit:          mov     ax, 4c00h
  2035.         int     21h
  2036. iTSR:           mov     bh, kmode0
  2037.         call    sKmode               ; Load Default
  2038.         or      ax, ax
  2039.         jnz     iQuit
  2040.         mov     ah, 31h
  2041.         mov     al, kmode0
  2042.         lea     bx, KeyProc
  2043.         lea     dx, EName
  2044.         mov     di, Psp
  2045.         push    cs
  2046.         pop     es
  2047.         int     16h
  2048.         or      ax, ax
  2049.         jnz     iQuit
  2050.         mov     word ptr SamAddr, bx
  2051.         mov     word ptr SamAddr+2, es
  2052.         mov     es, Env
  2053.         mov     ah, 49h
  2054.         int     21h                  ; Free Environment
  2055. ;
  2056.         mov     ax, Psp
  2057.         dec     ax
  2058.         mov     es, ax
  2059.         mov     di, 11
  2060.         mov     al, '@'
  2061.         cld
  2062.         stosb
  2063.         lea     si, FName
  2064.         mov     bl, kmode0
  2065.         xor     bh, bh
  2066.         mov     cl, 4
  2067.         shl     bx, cl
  2068.         add     si, bx
  2069.         mov     cx, 4
  2070.         cld
  2071. adLoop:         lodsb
  2072.         cmp     al, '.'
  2073.         je      adEnd
  2074.         cmp     al, 'a'
  2075.         jb      skipConv
  2076.         cmp     al, 'z'
  2077.         ja      skipConv
  2078.         and     al, 5fh              ; toUpper
  2079. skipConv:       stosb
  2080.         loop    adLoop
  2081.         jmp     tsrCont
  2082. ;
  2083. adEnd:          xor     al, al
  2084.         stosb
  2085. ;
  2086. tsrCont:        mov     dx, CodeEnd
  2087.         mov     cl, 4
  2088.         shr     dx, cl
  2089.         inc     dx
  2090.         mov     ax, 3100h
  2091.         int     21h
  2092. ;
  2093. PrError:        mov     ah, 09h
  2094.         int     21h
  2095.         mov     ax, 4cffh
  2096.         int     21h
  2097. ;
  2098.         db      8 dup(0)
  2099. Buffer          db      'XIS Ver 1.20', 0, '$'
  2100. ;
  2101. code            ends
  2102.         end     begin
  2103.