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

  1. ;
  2. ;               chpy.asm
  3. ;
  4. .286
  5. code            segment
  6.         org     100h
  7.         assume  cs:code, ds:code
  8. begin:          jmp     start
  9. ;
  10. CSMark          db      'CHCS 1.0'
  11. ;
  12. Psp             dw      ?
  13. Env             dw      ?
  14.         db      0
  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. dSize           dw      ?
  30. nPage           db      ?
  31. eSize           dw      ?
  32. pSize           dw      1504
  33. ;
  34. cPage           db      0
  35. cSize           dw      1504
  36. cPntr           dw      ?
  37. ;
  38. ;       ---------------------------------------
  39. ;
  40. PyName          db      '╞┤╥⌠╫╓┤╩', 0
  41. ;
  42. SpSm            db      'ichushvzh', 0dh, 0ah
  43. ChSp            db      'xiangmiongxuang'
  44.         db      'zang-ceng-wian-liao-ning-'
  45.         db      'mong-huan-wuai-'
  46.         db      'qai--san--gao--rei--den--'
  47.         db      'bia--fie--kin--yiu--pou--'
  48.         db      'bua--tue--vui--jun--ouo--'
  49.         db      'tve--'
  50.         db      'aa---ee---ii---oo---uu---'
  51.         db      'vv---', 0
  52. ;
  53. HiuseCC         db      "░▓▓╗┤╙╡─╢°╖╓╕÷║═▓·╝╢┐╔┴╦├╟"
  54.         db      "─Ω┼╖┼·╞≡╚╦╦∙╦√╩╟╒Γ╬╥╤º╥╗╘┌"
  55. ;
  56. HiCWord         db      "░┤╒╒▓┐╖╓▓╔╙├┤≤╝╥╢°╟╥╖╟│ú╣²╚Ñ"
  57.         db      "╗╣╩╟│ñ╞┌╛¡╣²┐╔╥╘┴ó╝┤├╗╙╨─π├╟"
  58.         db      "┼╖╓▐╞╒▒Θ╞Σ╓╨╚╧╬¬╦∙╥╘╦√├╟╩▒╝Σ"
  59.         db      "╓╨╣·╬╥├╟╨╟╞┌╥╗╕÷╫≈╙├"
  60. ;
  61. bAttr           db      70h          ;
  62. kAttr           db      0eh          ; ╩Σ╚δ┬δ╔½
  63. eAttr           db      04h          ; 1-0╨≥║┼╔½
  64. sAttr           db      00h          ; ═¼┬δ╫╓╔½
  65. nAttr           db      0eh          ; ':'╔½
  66. ;
  67. Int16           dd      ?
  68. ;
  69. SameNum         db      0
  70. SameOfs         db      0
  71. SamAddr         dd      ?
  72. KeyNum          db      0
  73. KeyBuf          db      13 dup(?)    ; ╝ⁿ┼╠╗║│σ╟°
  74. ;
  75. KeyMax          db      12
  76. ;
  77. ChSpNum         db      ?
  78. Keys            db      25 dup(?)
  79. ;
  80. CCs             db      65 dup(?)
  81. ;
  82. Codes           db      13 dup(?)
  83. ;
  84. W3Mode          db      0
  85. PySwitch        db      1
  86. ;
  87. PmtX            db      ?
  88. ;
  89. AutoPop         db      0
  90. ;
  91. CurPage         db      0
  92. CCNoMin         db      1
  93. CCNoMax         db      11
  94. ;
  95. CurCCNo         db      0            ; for CurPage >= 2
  96. ;
  97. PgFull          db      0
  98. ;
  99. inSrch          db      0            ; ─ú║²▓Θ╒╥▒Ω╓╛
  100. reSrch          db      0            ; ╖┤╧≥▓Θ╒╥▒Ω╓╛
  101. ;
  102. PyOnStr         db      '╚½╞┤╩Σ╚δ╘╩╨φ(╞⌠╢»╫┤╠¼)', 0
  103. PyOffStr        db      '╚½╞┤╩Σ╚δ╣╪▒╒', 0
  104. ;               -------------------------------
  105. KeyProc         proc    far
  106.         cmp     ax, 0ffffh
  107.         je      toSetKmode
  108.         jmp     TreatKey
  109. ;
  110. toSetKmode:     mov     cs:KeyNum, 0
  111.         mov     cs:SameNum, 0
  112.         cmp     bl, 0ffh
  113.         jne     qRetn
  114.         push    es
  115.         mov     ah, 49h
  116.         mov     es, cs:Psp
  117.         int     21h
  118.         pop     es
  119.         cmp     cs:nPage, 0
  120.         je      qRetn
  121.         mov     ah, 0ah
  122.         mov     dx, cs:xHandle
  123.         call    dword ptr cs:xEntry
  124. qRetn:          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.         or      al, al       ; Extend Keys
  133.         jz      kElse
  134.         cmp     al, '['      ; Last page
  135.         je      toPgBack
  136.         cmp     al, ','      ; Last page
  137.         je      toPgBack
  138.         cmp     al, ']'      ; Next page
  139.         je      toPgFore
  140.         cmp     al, '.'      ; Next page
  141.         je      toPgFore
  142.         cmp     al, 27h
  143.         je      toMatch
  144.         cmp     al, 'a'
  145.         jb      kElse
  146.         cmp     al, 'z'
  147.         jbe     toMatch
  148. ;
  149. kElse:          cmp     cs:KeyNum, 0
  150.         jne     kConte
  151.         retf
  152. kConte:         cmp     al, ' '
  153.         je      toSele
  154.         cmp     al, ';'
  155.         je      toSele
  156.         cmp     al, '0'
  157.         jb      kBeep
  158.         cmp     al, '9'
  159.         jbe     toSele
  160. kBeep:          mov     ax, 0e07h
  161.         int     10h
  162. toRetn:         jmp     kRetn
  163. ;
  164. toSele:         call    kSele
  165. toRet0:         retf
  166. ;
  167. toPgBack:       jmp     kPgBack
  168. ;
  169. toPgFore:       jmp     kPgFore
  170. ;
  171. toMatch:        mov     cs:CurPage, 0
  172.         mov     cs:CCNoMin, 1
  173.         mov     cs:CCNoMax, 11
  174.         mov     cs:inSrch, 0
  175.         mov     cs:reSrch, 0
  176.         jmp     kMatch
  177. ;
  178. toBack:         jmp     kBack
  179. ;
  180. toReset:        jmp     kReset
  181. ;
  182. kPgRetn:        jmp     kRetn
  183. ;
  184. kPgBack:        cmp     cs:KeyNum, 0
  185.         je      toRet0
  186.         cmp     cs:CurPage, 0
  187.         je      kPgRetn
  188.         mov     cs:reSrch, 1
  189.         dec     cs:CurPage
  190.         sub     cs:CCNoMin, 11
  191.         sub     cs:CCNoMax, 11
  192.         jmp     PgSet
  193. ;
  194. kPgFore:        cmp     cs:KeyNum, 0
  195.         je      toRet0
  196.         cmp     cs:PgFull, 1
  197.         jne     kPgRetn
  198.         inc     cs:CurPage
  199.         add     cs:CCNoMin, 11
  200.         add     cs:CCNoMax, 11
  201. ;
  202. PgSet:          dec     cs:KeyNum
  203.         mov     bl, cs:KeyNum
  204.         xor     bh, bh
  205.         mov     al, cs:KeyBuf[bx]
  206.         jmp     kMatch
  207. ;
  208. kBack:          cmp     cs:KeyNum, 0
  209.         je      kRet0
  210.         dec     cs:KeyNum
  211.         jz      kClear
  212.         dec     cs:KeyNum
  213.         mov     bl, cs:KeyNum
  214.         xor     bh, bh
  215.         mov     al, cs:KeyBuf[bx]
  216.         jmp     toMatch
  217. ;
  218. kReset:         cmp     cs:KeyNum, 0
  219.         je      kRet0
  220.         mov     cs:KeyNum, 0
  221. kClear:         mov     ah, 24h
  222.         int     16h
  223. kRetn:          xor     ax, ax
  224.         mov     cx, ax
  225. kRet0:          retf
  226. ;
  227. kMatch:         push    es
  228.         push    ds
  229.         push    di
  230.         push    si
  231.         push    cs
  232.         pop     ds
  233.         mov     inSrch, 0
  234.         mov     SameNum, 0
  235.         mov     PgFull, 0
  236.         mov     AutoPop, 0
  237.         mov     cPage, 0
  238.         xor     ah, ah
  239.         xor     bh, bh
  240.         mov     bl, KeyNum
  241.         cmp     bl, KeyMax
  242.         jb      kmCont0
  243.         xor     bl, bl
  244.         mov     KeyNum, 0
  245. kmCont0:        mov     word ptr KeyBuf[bx], ax
  246.         call    prKeys
  247.         inc     KeyNum
  248.         cmp     KeyNum, 2
  249.         jb      toKey1
  250.         je      toKey2
  251.         mov     cl, KeyNum
  252.         cmp     cl, KeyMax
  253.         jb      toKeyx
  254.         mov     AutoPop, 1
  255.         jmp     toKeyx
  256. ;
  257. toKey1:         call    kGetS01
  258.         jmp     kSxEnd
  259. ;
  260. toKey2:         lea     si, KeyBuf
  261.         call    kGetS02
  262.         jmp     kSxEnd
  263. ;
  264. toKeyx:         call    kGetS0x
  265. ;
  266. kSxEnd:         cmp     SameNum, 11
  267.         jne     SkipFull
  268.         mov     PgFull, 1
  269. SkipFull:       call    prSames
  270.         mov     cl, SameNum
  271.         mov     ch, 0
  272.         mov     al, KeyNum
  273.         cmp     al, KeyMax
  274.         jne     kS4Ex
  275.         inc     ch
  276.         cmp     cl, 1
  277.         jne     kS4Ex
  278.         mov     KeyNum, 0
  279.         mov     ah, 24h
  280.         int     16h
  281. kS4Ex:          pop     si
  282.         pop     di
  283.         pop     ds
  284.         pop     es
  285.         xor     ax, ax
  286.         retf
  287. KeyProc         endp
  288. ;
  289. ;               -------------------------------
  290. kGetS01         proc    near
  291.         mov     bl, byte ptr KeyBuf
  292.         cmp     bl, 27h
  293.         jne     kS01Conta
  294.         ret
  295. ;
  296. kS01Conta:      sub     bl, 'a'
  297.         xor     bh, bh
  298.         shl     bx, 1
  299.         mov     ax, word ptr HiuseCC[bx]
  300.         lea     si, CCs
  301.         mov     [si], ax
  302.         mov     byte ptr [si+2], 0
  303.         mov     ah, 0
  304.         call    AddSame
  305.         shl     bx, 1
  306.         mov     ax, word ptr HiCWord[bx]
  307.         mov     [si], ax
  308.         mov     ax, word ptr HiCWord[bx+2]
  309.         mov     [si+2], ax
  310.         mov     byte ptr [si+4], 0
  311.         mov     ah, 1
  312.         call    AddSame
  313.         ret
  314. kGetS01         endp
  315. ;               -------------------------------
  316. kGetS02         proc    near
  317. ;
  318. ;       IN:     ds:si = Keys
  319. ;
  320.         mov     CurCCNo, 0
  321.         cmp     byte ptr [si+2], 0
  322.         je      kS02Contx
  323.         ret
  324. ;
  325. kS02Contx:      mov     bx, [si]
  326.         sub     bx, 6060h              ; bh=K2,bl=K1
  327.         and     bx, 1f1fh
  328.         xchg    bh, bl                 ; bh=K1,bl=K2
  329.         mov     dh, bh
  330.         mov     cl, 3
  331.         ror     bx, cl
  332.         and     bx, 0e007h
  333.         or      bh, dh
  334.         lea     si, PyCode
  335.         lea     di, NextPy
  336.         cmp     nPage, 0
  337.         je      kS02Loop0
  338.         call    MapPage
  339.         lea     di, PyCode+1504
  340.         jmp     kS02Loop0
  341. ;
  342. kS02NextPage:   cmp     nPage, 0
  343.         je      kS02NextPy
  344.         inc     cPage
  345.         cmp     cPage, 8
  346.         ja      kS02NextPy
  347.         call    MapPage
  348.         lea     si, PyCode
  349. ;
  350. kS02Loop0:      cmp     si, di
  351.         jae     kS02NextPage
  352.         mov     dx, [si]
  353.         add     si, +2
  354.         mov     ah, dl
  355.         and     dl, 3
  356.         cmp     dx, bx
  357.         jne     kS02Loop0
  358.         mov     cl, 3
  359.         shr     ah, cl
  360. ;
  361.         cmp     CurPage, 2
  362.         jb      kS02VeriNo
  363.         or      ah, ah
  364.         jnz     kS02VeriNo
  365.         inc     CurCCNo
  366.         mov     ah, CurCCNo
  367.         add     ah, 30
  368. ;
  369. kS02VeriNo:     cmp     ah, CCNoMin
  370.         jb      kS02Loop0
  371.         cmp     ah, CCNoMax
  372.         ja      kS02Loop0
  373.         sub     ah, CCNoMin
  374. kS02toPush:     call    PushSam
  375.         jnc     kS02Loop0
  376.         jmp     kS02End
  377. ;
  378. kS02NextPy:     lea     si, NextPy
  379.         lea     di, PyEnd
  380.         cmp     nPage, 0
  381.         je      kS02Loop1
  382.         call    MapPage
  383.         lea     si, PyCode
  384.         mov     di, si
  385.         add     di, eSize
  386. ;
  387. kS02Loop1:      cmp     si, di
  388.         jae     kS02End
  389.         mov     dx, [si]
  390.         add     si, +4
  391.         mov     ah, dl
  392.         and     dl, 3
  393.         cmp     dx, bx
  394.         jne     kS02Loop1
  395.         mov     cl, 3
  396.         shr     ah, cl
  397. ;
  398.         cmp     CurPage, 2
  399.         jb      kS02NxtVeriNo
  400.         or      ah, ah
  401.         jnz     kS02NxtVeriNo
  402. ;
  403.         inc     CurCCNo
  404.         mov     ah, CurCCNo
  405.         add     ah, 30
  406. ;
  407. kS02NxtVeriNo:  cmp     ah, CCNoMin
  408.         jb      kS02Loop1
  409.         cmp     ah, CCNoMax
  410.         ja      kS02Loop1
  411.         sub     ah, CCNoMin
  412. kS02NxtPush:    mov     dx, [si-2]
  413.         push    si
  414.         lea     si, CCs
  415.         mov     [si], dx
  416.         mov     byte ptr [si+2], 0
  417.         call    AddSame
  418.         pop     si
  419.         jnc     kS02Loop1
  420. kS02End:        ret
  421. kGetS02         endp
  422. ;               -------------------------------
  423. kGetS0x         proc    near
  424.         cmp     KeyNum, 4
  425.         ja      kS0xSkip
  426.         cmp     byte ptr KeyBuf, 27h
  427.         je      kS0xTestSwitch
  428.         call    MatchUcWx
  429.         cmp     SameNum, 1
  430.         ja      kS0xEnd
  431. kS0xSkip:       call    ConvKeys
  432.         cmp     cl, 4
  433.         ja      kS0xEnd
  434.         mov     ChSpNum, cl
  435.         cmp     cl, 3
  436.         je      toMatchCW3
  437.         ja      toMatchCWx
  438.         lea     si, Keys
  439.         call    kGetS02
  440.         ret
  441. ;
  442. kS0xTestSwitch: cmp     byte ptr KeyBuf+1, 'o'
  443.         jne     kS0xEnd
  444.         cmp     KeyNum, 4
  445.         jb      kS0xTestPyOn
  446.         cmp     word ptr KeyBuf+2, 6666h
  447.         jne     kS0xEnd
  448.         mov     PySwitch, 0  ; KeyBuf[] = 'off
  449.         mov     KeyNum, 0
  450.         mov     KeyMax, 4
  451.         lea     si, PyOffStr
  452.         call    prStr
  453.         ret
  454. ;
  455. kS0xTestPyOn:   cmp     byte ptr KeyBuf+2, 'n'
  456.         jne     kS0xEnd
  457.         mov     PySwitch, 1  ; KeyBuf[] = 'on
  458.         mov     KeyNum, 0
  459.         mov     KeyMax, 12
  460.         lea     si, PyOnStr
  461.         call    prStr
  462.         ret
  463. ;
  464. toMatchCWx:     cmp     cl, 4
  465.         ja      kS0xErr
  466.         cmp     nPage, 0
  467.         je      kS0xSkipX
  468.         call    MapPage
  469. kS0xSkipX:      call    MatchCWx
  470. kS0xEnd:        ret
  471. ;
  472. kS0xErr:        mov     ax, 0e07h
  473.         int     10h
  474.         ret
  475. ;
  476. toMatchCW3:     cmp     nPage, 0
  477.         je      k0xSkipX
  478.         call    MapPage
  479. k0xSkipX:       call    MatchCW3
  480.         ret
  481. kGetS0x         endp
  482. ;               -------------------------------
  483. MatchCWx        proc    near
  484.         push    cs
  485.         pop     es
  486.         mov     ax, 3900h
  487.         pushf
  488.         call    dword ptr Int16
  489.         or      ax, ax
  490.         jz      WxCode0
  491.         jmp     WxEnd
  492. ;
  493. WxLoop0:        mov     ax, 3901h
  494.         pushf
  495.         call    dword ptr Int16
  496.         or      ax, ax
  497.         jz      WxCode0
  498.         jmp     WxEnd
  499. ;
  500. WxCode0:        call    EnCode1              ; dh = cc1, dl = cc2
  501.         cmp     al, byte ptr Keys
  502.         jne     WxLoop0
  503.         mov     word ptr Codes, ax
  504.         xchg    dh, dl
  505.         mov     word ptr CCs, dx     ; dl = cc1, dh = cc2
  506.         mov     ax, 3a00h
  507.         lea     bx, CCs+2
  508.         xchg    dh, dl
  509.         pushf
  510.         call    dword ptr Int16
  511.         or      ax, ax
  512.         jnz     WxLoop0
  513.         jmp     GetWxCo
  514. ;
  515. WxLoop1:        mov     ax, 3a01h
  516.         lea     bx, CCs+2
  517.         pushf
  518.         call    dword ptr Int16
  519.         or      ax, ax
  520.         jnz     WxLoop0
  521. GetWxCo:        call    CWEnCodes
  522.         jc      WxLoop1
  523.         lea     si, CCs
  524.         mov     ah, SameNum
  525.         call    AddSame
  526.         jmp     WxLoop1
  527. ;
  528. WxEnd:          ret
  529. MatchCWx        endp
  530. ;               -------------------------------
  531. MatchCW3        proc    near
  532. ;
  533.         push    cs
  534.         pop     es
  535.         mov     ax, 3900h
  536.         pushf
  537.         call    dword ptr Int16
  538.         or      ax, ax
  539.         jz      W3Code0
  540.         jmp     W3End
  541. ;
  542. W3Loop0:        mov     ax, 3901h
  543.         pushf
  544.         call    dword ptr Int16
  545.         or      ax, ax
  546.         jz      W3Code0
  547.         jmp     W3End
  548. ;
  549. W3Code0:        call    EnCode1              ; dh = cc1, dl = cc2
  550.         cmp     al, byte ptr KeyBuf
  551.         jne     W3Loop0
  552.         xchg    dh, dl
  553.         mov     word ptr CCs, dx     ; dl = cc1, dh = cc2
  554.         mov     ax, 3a00h
  555.         lea     bx, CCs+2
  556.         xchg    dh, dl
  557.         pushf
  558.         call    dword ptr Int16
  559.         or      ax, ax
  560.         jnz     W3Loop0
  561.         jmp     GetW3Co
  562. ;
  563. W3Loop1:        mov     ax, 3a01h
  564.         lea     bx, CCs+2
  565.         pushf
  566.         call    dword ptr Int16
  567.         or      ax, ax
  568.         jnz     W3Loop0
  569. GetW3Co:        cmp     cl, 2
  570.         jne     W3Loop1
  571.         call    CWEnCodes
  572.         jc      W3Loop1
  573.         lea     si, CCs
  574.         mov     ah, SameNum
  575.         call    AddSame
  576.         jmp     W3Loop1
  577. ;
  578. W3End:          ret
  579. MatchCW3        endp
  580. ;               -------------------------------
  581. MatchUcWx       proc    near
  582.         mov     ax, 3a03h
  583.         pushf
  584.         call    dword ptr Int16
  585.         or      ax, ax
  586.         jnz     noUsrLib     ; es:bx = &UsrWLib, cx = uLen
  587.         mov     si, bx
  588.         mov     di, bx
  589.         add     di, cx
  590.         mov     bx, word ptr KeyBuf
  591.         mov     dx, word ptr KeyBuf+2
  592.         cmp     KeyNum, 3
  593.         jne     kUcWxSkip
  594.         mov     dh, ' '
  595. kUcWxSkip:      push    ds
  596.         mov     ax, es
  597.         mov     ds, ax
  598.         push    cs
  599.         pop     es
  600.         cld
  601. kUcWxLoop:      cmp     si, di
  602.         jae     kUcWxEnd
  603.         lodsw
  604.         cmp     ax, bx
  605.         jne     kUcWxNext
  606.         lodsw
  607.         cmp     ax, dx
  608.         je      kUcWxFound
  609. kUcWxNext:      lodsb
  610.         cmp     al, 0ah
  611.         ja      kUcWxNext
  612.         jmp     kUcWxLoop
  613. ;
  614. kUcWxFound:     lea     di, CCs
  615.         mov     cx, 64
  616.         cld
  617. kUcWxLoop1:     lodsb
  618.         cmp     al, ' '
  619.         jb      kUcWxCont0
  620.         stosb
  621.         loop    kUcWxLoop1
  622. kUcWxCont0:     mov     byte ptr es:[di], 0
  623.         push    ds
  624.         push    si
  625.         push    cs
  626.         pop     ds
  627.         mov     ah, SameNum
  628.         lea     si, CCs
  629.         call    AddSame
  630.         pop     si
  631.         pop     ds
  632.         jmp     kUcWxLoop
  633. ;
  634. kUcWxEnd:       pop     ds
  635. noUsrLib:       ret
  636. MatchUcWx       endp
  637. ;               -------------------------------
  638. kSele           proc    near
  639. ;
  640. ;       Select Sames from Same[]
  641. ;
  642.         push    es
  643.         push    ds
  644.         push    si
  645.         push    di
  646.         push    cs
  647.         pop     ds
  648.         cmp     al, ' '
  649.         je      isDef
  650.         cmp     al, ';'
  651.         jne     ksSel
  652. isOne:          mov     al, '1'
  653. ksSel:          cmp     al, '0'
  654.         je      isTen
  655.         sub     al, '0'
  656.         jmp     ksCont0
  657. isDef:          mov     al, 0
  658.         jmp     ksCont0
  659. isTen:          mov     al, 10
  660. ksCont0:        cmp     AutoPop, 1
  661.         jne     ksCont1
  662.         inc     al
  663. ksCont1:        cmp     al, SameNum
  664.         jae     ksBeep
  665.         or      al, al
  666.         jz      ksSkip
  667.         mov     bl, al
  668.         xor     bh, bh
  669.         call    MovSame
  670. ksSkip:         mov     ah, 24h
  671.         int     16h
  672.         mov     AutoPop, 0
  673.         mov     KeyNum, 0
  674.         mov     cx, 0101h
  675. ksExit:         xor     ax, ax
  676.         pop     di
  677.         pop     si
  678.         pop     ds
  679.         pop     es
  680.         ret
  681. ;
  682. ksBeep:         mov     ax, 0e07h
  683.         int     10h
  684.         xor     cx, cx
  685.         jmp     ksExit
  686. kSele           endp
  687. ;               -------------------------------
  688. ConvKeys        proc    near
  689. ;
  690. ;       IN:     KeyBuf[] = Input Keys
  691. ;       OUT:    Keys[]   = ShuanPin Codes
  692. ;
  693.         push    si
  694.         push    di
  695.         lea     si, KeyBuf
  696.         lea     di, Keys
  697. ConvLoop:       call    GetPy1
  698.         cmp     byte ptr [si], 0
  699.         je      ConvEnd
  700.         call    GetPy2
  701.         cmp     byte ptr [si], 0
  702.         jne     ConvLoop
  703. ConvEnd:        mov     byte ptr [di], 0
  704.         sub     di, offset Keys
  705.         mov     cx, di
  706.         pop     di
  707.         pop     si
  708.         ret
  709. ConvKeys        endp
  710. ;               -------------------------------
  711. GetPy1          proc    near
  712. ;
  713. ;       IN:     ds:si = PyStr
  714. ;       OUT:    ds:di = Py1
  715. ;
  716.         cmp     byte ptr PySwitch, 1
  717.         je      Py1Again
  718.         mov     al, [si]
  719.         jmp     Py1End
  720. ;
  721. Py1Again:       mov     al, [si]
  722.         cmp     byte ptr [si+1], 'h'
  723.         jne     Py1Cont1
  724.         mov     dl, [si+2]
  725.         cmp     dl, 'a'
  726.         je      toSpPy1
  727.         cmp     dl, 'e'
  728.         je      toSpPy1
  729.         cmp     dl, 'i'
  730.         je      toSpPy1
  731.         cmp     dl, 'o'
  732.         je      toSpPy1
  733.         cmp     dl, 'u'
  734.         je      toSpPy1
  735.         cmp     dl, 'v'
  736.         je      toSpPy1
  737.         jmp     Py1Cont1
  738. ;
  739. toSpPy1:        cmp     al, 'c'
  740.         je      Py1toI
  741.         cmp     al, 's'
  742.         je      Py1toU
  743.         cmp     al, 'z'
  744.         jne     Py1Cont1
  745.         mov     al, byte ptr SpSm+6
  746.         jmp     Py1Cont0
  747. ;
  748. Py1toI:         mov     al, byte ptr SpSm
  749.         jmp     Py1Cont0
  750. ;
  751. Py1toU:         mov     al, byte ptr SpSm+3
  752. Py1Cont0:       add     si, +2
  753.         mov     [di], al
  754.         inc     di
  755.         ret
  756. ;
  757. toPy1Again:     inc     si
  758.         jmp     Py1Again
  759. ;
  760. Py1Cont1:       cmp     al, 27h
  761.         je      toPy1Again
  762.         cmp     al, 'a'
  763.         jne     Py1End
  764.         mov     dx, word ptr [si+1]
  765.         cmp     dl, 'n'
  766.         jne     Py1End
  767.         cmp     dh, 'g'
  768.         jne     Py1End
  769.         dec     si
  770. Py1End:         inc     si
  771.         mov     [di], al
  772.         inc     di
  773.         ret
  774. GetPy1          endp
  775. ;               -------------------------------
  776. GetPy2          proc    near
  777. ;
  778. ;       IN:     ds:si = PyStr
  779. ;       OUT:    ds:di = Py2
  780. ;
  781.         push    bx
  782.         cmp     byte ptr PySwitch, 1
  783.         jne     Py2Copy
  784.         mov     cx, 4
  785.         lea     bx, ChSp
  786. Py2Loop0:       mov     dl, [bx]
  787.         or      dl, dl
  788.         jnz     Py2Cont0
  789. Py2Copy:        mov     dl, [si]
  790.         mov     ax, 1
  791.         jmp     Py2End
  792. ;
  793. Py2Cont0:       push    si
  794.         push    cx
  795.         push    bx
  796. Py2Loop2:       inc     bx
  797.         mov     al, [bx]
  798.         cmp     al, '-'
  799.         je      isFound
  800.         mov     ah, [si]
  801.         inc     si
  802.         cmp     ah, al
  803.         jne     NextPy2
  804.         loop    Py2Loop2
  805. isFound:        mov     ax, 4
  806.         sub     ax, cx
  807.         pop     bx
  808.         pop     cx
  809.         pop     si
  810.         jmp     Py2End
  811. ;
  812. NextPy2:        pop     bx
  813.         pop     cx
  814.         pop     si
  815.         add     bx, +5
  816.         jmp     Py2Loop0
  817. ;
  818. toPy2Again:     inc     si
  819.         jmp     Py2Loop0
  820. ;
  821. Py2End:         cmp     dl, 27h
  822.         je      toPy2Again
  823.         mov     [di], dl
  824.         inc     di
  825.         add     si, ax
  826.         pop     bx
  827.         ret
  828. GetPy2          endp
  829. ;               -------------------------------
  830. MovSame         proc    near
  831. ;
  832. ;       Move Same[bx] to Same[0]
  833. ;       IN:     bx = Same No.
  834. ;
  835.         les     di, SamAddr
  836.         mov     bl, es:[di+bx]
  837.         xor     bh, bh
  838. mvLoop:         mov     al, es:[di+bx+10h]
  839.         mov     es:[di+10h], al
  840.         inc     di
  841.         or      al, al
  842.         jnz     mvLoop
  843.         ret
  844. MovSame         endp
  845. ;               -------------------------------
  846. GetAttr         proc    near
  847. ;
  848. ;       Get Prompt Line Attrs
  849. ;
  850.         push    ax
  851.         push    bx
  852.         push    cx
  853.         mov     ax, 1480h
  854.         int     10h
  855.         mov     bAttr, al
  856.         mov     kAttr, bh
  857.         mov     sAttr, bl
  858.         mov     nAttr, ch
  859.         mov     eAttr, cl
  860.         pop     cx
  861.         pop     bx
  862.         pop     ax
  863.         ret
  864. GetAttr         endp
  865. ;               -------------------------------
  866. ClrLine         proc    near
  867. ;
  868. ;       Clear Prompt Line
  869. ;
  870.         mov     ch, KeyNum
  871.         add     ch, 9
  872.         mov     cl, 20
  873.         cmp     ch, cl
  874.         jae     clSkip0
  875.         sub     cl, ch
  876.         xor     ch, ch
  877. clLoop1:        mov     ax, 1403h
  878.         mov     bl, bAttr
  879.         mov     dl, ' '
  880.         int     10h
  881.         loop    clLoop1
  882. clSkip0:        mov     ax, 1402h
  883.         mov     dl, 22
  884.         int     10h
  885.         mov     cx, 49
  886. clLoop2:        mov     ax, 1403h
  887.         mov     bl, bAttr
  888.         mov     dl, ' '
  889.         int     10h
  890.         loop    clLoop2
  891. clEnd:          mov     PmtX, 22
  892.         ret
  893. ClrLine         endp
  894. ;               -------------------------------
  895. prKeys          proc    near
  896. ;
  897. ;       Prompt Input Key
  898. ;
  899. ;       IN:     al = char
  900. ;               bl = KeyNum - 1
  901. ;
  902.         push    ax
  903.         call    GetAttr
  904.         mov     cl, al
  905.         mov     dl, bl
  906.         add     dl, 9
  907.         mov     ax, 1402h
  908.         int     10h
  909.         mov     ax, 1403h
  910.         mov     dl, cl
  911.         mov     bl, bAttr
  912.         or      bl, kAttr
  913.         int     10h
  914.         call    ClrLine
  915.         pop     ax
  916.         ret
  917. prKeys          endp
  918. ;               -------------------------------
  919. StrLen          proc    near
  920. ;
  921. ;       Calc String [si] Length:
  922. ;       IN:     ds:[si] = String
  923. ;       OUT:    cx = StrLen
  924. ;
  925.         push    bx
  926.         xor     bx, bx
  927. strLoop:        cmp     byte ptr [si+bx], 0
  928.         je      strEnd
  929.         inc     bl
  930.         jmp     strLoop
  931. ;
  932. strEnd:         mov     cx, bx
  933.         pop     bx
  934.         ret
  935. StrLen          endp
  936. ;               -------------------------------
  937. CalLen          proc    near
  938. ;
  939. ;       Calculate Can't Prompt the Sames in ds:[si]
  940. ;       IN:     ds:[si] = String
  941. ;       OUT:    cx = strlen
  942. ;               bl = new PmtX
  943. ;
  944.         call    StrLen
  945.         mov     bx, cx
  946.         add     bl, PmtX
  947.         add     bl, 2
  948.         cmp     inSrch, 1
  949.         jne     clSkip
  950.         add     bl, 4
  951. clSkip:         cmp     bl, 71
  952.         jae     NotPr
  953.         clc
  954.         ret
  955. NotPr:          stc
  956.         ret
  957. CalLen          endp
  958. ;               -------------------------------
  959. VeriPos         proc    near
  960. ;
  961. ;       Verify & adapt PmtX
  962. ;
  963. ;       IN:     ds:[si] = String of CCs
  964. ;
  965.         push    bx
  966.         push    cx
  967.         call    CalLen
  968.         mov     PmtX, bl
  969.         pop     cx
  970.         pop     bx
  971.         ret
  972. VeriPos         endp
  973. ;               -------------------------------
  974. prSame          proc    near
  975. ;
  976. ;       Print Same CC
  977. ;       IN:     ah      = Same No.
  978. ;               es:[si] = CCs
  979. ;
  980.         mov     cl, ah
  981.         cmp     ah, 0
  982.         jne     prCont0
  983.         mov     PmtX, 22
  984.         jmp     prPutCC
  985. ;
  986. prCont0:        inc     PmtX
  987.         mov     ax, 1402h
  988.         mov     dl, PmtX
  989.         int     10h
  990.         mov     ax, 1403h
  991.         mov     bl, bAttr
  992.         or      bl, eAttr
  993.         mov     dl, cl
  994.         cmp     dl, 10
  995.         je      is10
  996.         add     dl, '0'
  997.         jmp     prContx
  998. ;
  999. is10:           mov     dl, '0'
  1000. prContx:        int     10h
  1001.         inc     PmtX
  1002.         cmp     cl, 1
  1003.         jne     prPutCC
  1004.         mov     ax, 1403h
  1005.         mov     bl, bAttr
  1006.         or      bl, eAttr
  1007.         mov     dl, ';'
  1008.         int     10h
  1009.         inc     PmtX
  1010. ;
  1011. prPutCC:        mov     ax, 1402h
  1012.         mov     dl, PmtX
  1013.         int     10h
  1014.         push    si
  1015. prLoop:         cmp     PmtX, 71
  1016.         jae     prSameEnd
  1017.         mov     al, es:[si]
  1018.         inc     si
  1019.         or      al, al
  1020.         jz      prSameEnd
  1021.         mov     dl, al
  1022.         mov     ax, 1403h
  1023.         mov     bl, bAttr
  1024.         or      bl, sAttr
  1025.         int     10h
  1026.         inc     PmtX
  1027.         jmp     prLoop
  1028. ;
  1029. prSameEnd:      pop     si
  1030.         ret
  1031. prSame          endp
  1032. ;               -------------------------------
  1033. prSames         proc    near
  1034. ;
  1035. ;       Print All Sames in SameBuf
  1036. ;
  1037.         push    es
  1038.         push    si
  1039.         call    GetAttr
  1040.         xor     ch, ch
  1041.         mov     cl, SameNum
  1042.         or      cl, cl
  1043.         jz      psEnd
  1044.         cmp     AutoPop, 1
  1045.         jne     psSkip0
  1046.         dec     cl
  1047. psSkip0:        or      cl, cl
  1048.         jz      psEnd
  1049.         xor     ah, ah
  1050.         mov     al, AutoPop
  1051.         les     si, SamAddr
  1052. psLoop:         push    ax
  1053.         push    bx
  1054.         push    cx
  1055.         push    si
  1056.         xor     bh, bh
  1057.         mov     bl, ah
  1058.         add     bl, al
  1059.         mov     bl, es:[si+bx]
  1060.         add     bx, 10h
  1061.         add     si, bx
  1062.         call    prSame
  1063.         pop     si
  1064.         pop     cx
  1065.         pop     bx
  1066.         pop     ax
  1067.         inc     ah
  1068.         loop    psLoop
  1069. psEnd:          pop     si
  1070.         pop     es
  1071.         ret
  1072. prSames         endp
  1073. ;               -------------------------------
  1074. prStr           proc    near
  1075. ;
  1076. ;       IN:     ds:si = String
  1077. ;
  1078.         call    GetAttr
  1079.         mov     ax, 1402h
  1080.         mov     dl, 22
  1081.         int     10h
  1082. prStrLoop:      mov     dl, [si]
  1083.         inc     si
  1084.         or      dl, dl
  1085.         jz      prStrEnd
  1086.         mov     ax, 1403h
  1087.         mov     bl, bAttr
  1088.         or      bl, eAttr
  1089.         int     10h
  1090.         jmp     prStrLoop
  1091. ;
  1092. prStrEnd:       ret
  1093. prStr           endp
  1094. ;               -------------------------------
  1095. Encode1         proc    near
  1096. ;
  1097. ;       Get CC  Encode
  1098. ;       IN:     dx = CC  (dh = cc1; dl = cc2; )
  1099. ;       OUT:    ax = K2K1
  1100. ;
  1101.         push    bx
  1102.         mov     bx, dx
  1103.         and     bx, 7f7fh
  1104.         sub     bx, 3021h
  1105.         mov     al, 94
  1106.         cmp     nPage, 0
  1107.         je      retEncode1
  1108.         mov     ch, bh
  1109.         and     bh, 7
  1110.         shr     ch, 1
  1111.         shr     ch, 1
  1112.         shr     ch, 1
  1113.         cmp     ch, cPage
  1114.         je      retEncode1
  1115.         mov     cPage, ch
  1116.         call    MapPage
  1117. retEncode1:     mul     bh
  1118.         xor     bh, bh
  1119.         add     bx, ax          ; dx = c1*94 + c2
  1120.         shl     bx, 1
  1121.         mov     ax, word ptr PyCode[bx]
  1122.         jmp     MakeCode
  1123. ;
  1124. Encode1         endp
  1125. ;               -------------------------------
  1126. Encode2         proc    near
  1127. ;
  1128. ;       Get CC  Encode
  1129. ;       IN:     dx = CC  (dh = cc1; dl = cc2; )
  1130. ;       OUT:    ax = K2K1
  1131. ;
  1132.         push    bx
  1133.         mov     bx, dx
  1134.         and     bx, 7f7fh
  1135.         sub     bx, 3021h
  1136.         mov     al, 94
  1137.         mul     bh
  1138.         xor     bh, bh
  1139.         add     bx, ax          ; dx = c1*94 + c2
  1140.         shl     bx, 1
  1141.         cmp     nPage, 0
  1142.         jne     FromXMS
  1143.         mov     ax, word ptr PyCode[bx]
  1144.         jmp     MakeCode
  1145. ;
  1146. FromXMS:        call    ReadEncode
  1147.         mov     ax, word ptr TmpCode
  1148. ;
  1149. MakeCode:       mov     bh, ah
  1150.         and     bh, 1fh
  1151.         rol     ax, 1
  1152.         rol     ax, 1
  1153.         rol     ax, 1
  1154.         and     al, 1fh
  1155.         mov     ah, bh
  1156.         xchg    ah, al
  1157.         add     ax, 6060h
  1158.         pop     bx
  1159.         ret
  1160. Encode2         endp
  1161. ;               -------------------------------
  1162. CWEnCodes       proc    near
  1163. ;
  1164. ;       IN:     CCs = String
  1165. ;               cl  = CW Length
  1166. ;       OUT:    Codes = CWEnCodes
  1167. ;
  1168.         lea     si, CCs
  1169.         xor     ch, ch
  1170.         inc     cl
  1171.         cmp     cl, 2
  1172.         je      toTwo
  1173.         jb      notMatch
  1174.         cmp     cl, 3
  1175.         je      toThree
  1176. ;
  1177. ;       CCs >= 4:
  1178. ;
  1179.         dec     cx
  1180.         shl     cx, 1
  1181.         mov     bx, cx
  1182.         mov     dx, [si+bx]
  1183.         xchg    dh, dl
  1184.         call    EnCode2
  1185.         cmp     al, byte ptr Keys+3
  1186.         jne     notMatch
  1187. ;
  1188.         mov     dx, [si+2]
  1189.         xchg    dh, dl
  1190.         call    EnCode2
  1191.         cmp     al, byte ptr Keys+1
  1192.         jne     notMatch
  1193.         mov     dx, [si+4]
  1194.         xchg    dh, dl
  1195.         call    EnCode2
  1196.         cmp     al, byte ptr Keys+2
  1197.         jne     notMatch
  1198.         clc
  1199.         ret
  1200. ;
  1201. notMatch:       stc
  1202.         ret
  1203. ;
  1204. toTwo:          mov     al, byte ptr Codes+1
  1205.         cmp     al, byte ptr Keys+1
  1206.         jne     notMatch
  1207.         mov     dx, [si+2]
  1208.         xchg    dh, dl
  1209.         call    EnCode2
  1210.         cmp     ax, word ptr Keys+2
  1211.         jne     notMatch
  1212.         clc
  1213.         ret
  1214. ;
  1215. toThree:        cmp     W3Mode, 1
  1216.         jb      to3
  1217.         ja      to3e
  1218. ;
  1219. ;       W3Mode = 1:  Keys = '1123'
  1220. ;
  1221.         mov     al, byte ptr Codes+1
  1222.         cmp     al, byte ptr Keys+1
  1223.         jne     W3nMatch
  1224.         mov     dx, [si+2]
  1225.         xchg    dh, dl
  1226.         call    EnCode2
  1227.         cmp     al, byte ptr Keys+2
  1228.         jne     W3nMatch
  1229.         mov     dx, [si+3]
  1230.         xchg    dh, dl
  1231.         call    EnCode2
  1232.         cmp     al, byte ptr Keys+3
  1233.         jne     W3nMatch
  1234.         clc
  1235.         ret
  1236. ;
  1237. ;       W3Mode = 0:  Keys = '123 '
  1238. ;
  1239. to3:            cmp     ChSpNum, 3
  1240.         jne     W3nMatch
  1241.         mov     dx, [si+2]
  1242.         xchg    dh, dl
  1243.         call    EnCode2
  1244.         cmp     al, byte ptr Keys+1
  1245.         jne     W3nMatch
  1246.         mov     dx, [si+4]
  1247.         xchg    dh, dl
  1248.         call    EnCode2
  1249.         cmp     al, byte ptr Keys+2
  1250.         jne     W3nMatch
  1251.         clc
  1252.         ret
  1253. ;
  1254. ;       W3Mode = 2:  Keys = '1233'
  1255. ;
  1256. to3e:           mov     dx, [si+2]
  1257.         xchg    dh, dl
  1258.         call    EnCode2
  1259.         cmp     al, byte ptr Keys+1
  1260.         jne     W3nMatch
  1261.         mov     dx, [si+4]
  1262.         xchg    dh, dl
  1263.         call    EnCode2
  1264.         cmp     ax, word ptr Keys+2
  1265.         jne     W3nMatch
  1266.         clc
  1267.         ret
  1268. ;
  1269. W3nMatch:       stc
  1270.         ret
  1271. CWEnCodes       endp
  1272. ;               -------------------------------
  1273. PushSam proc    near
  1274. ;
  1275. ;       IN:     si = Offset of CODE TABLE
  1276. ;
  1277.         push    si
  1278.         push    ax
  1279.         call    GetCode
  1280.         lea     si, CCs
  1281.         mov     [si], ax
  1282.         mov     byte ptr [si+2], 0
  1283.         call    VeriPos
  1284.         pop     ax
  1285.         call    AddSame
  1286.         pop     si
  1287.         ret
  1288. PushSam         endp
  1289. ;               -------------------------------
  1290. GetCode         proc    near
  1291. ;
  1292. ;       IN:     si = offset of CODE TABLE
  1293. ;       OUT:    ax = GBcode
  1294. ;
  1295.         push    bx
  1296.         push    dx
  1297.         mov     ax, si
  1298.         sub     ax, offset PyCode
  1299.         dec     ax
  1300.         dec     ax
  1301.         shr     ax, 1
  1302.         mov     bl, 94
  1303.         div     bl
  1304.         add     ax, 2130h
  1305. ;
  1306.         mov     dl, cPage
  1307.         shl     dl, 1
  1308.         shl     dl, 1
  1309.         shl     dl, 1
  1310.         add     al, dl               ; 8 Qu / Page
  1311. ;
  1312.         or      ax, 8080h
  1313.         pop     dx
  1314.         pop     bx
  1315.         ret
  1316. GetCode         endp
  1317. ;               -------------------------------
  1318. AddSame         proc    near
  1319. ;
  1320. ;       IN:     [si] = Strings of CCs
  1321. ;
  1322.         cmp     SameNum, 11
  1323.         jae     asAbort
  1324.         cmp     PmtX, 71
  1325.         jae     asAbort
  1326.         push    es
  1327.         push    ax
  1328.         push    bx
  1329.         push    cx
  1330.         push    si
  1331.         push    di
  1332.         les     di, SamAddr
  1333.         xor     bh, bh
  1334.         mov     bl, ah
  1335.         cmp     SameNum, 0
  1336.         jne     asSkip
  1337. ;
  1338.         push    di
  1339.         push    bx
  1340.         mov     cx, 11
  1341.         xor     bx, bx
  1342. asLoop0:        mov     es:[di], bl
  1343.         add     bl, 16
  1344.         inc     di
  1345.         loop    asLoop0
  1346.         pop     bx
  1347.         pop     di
  1348. ;
  1349. asSkip:         mov     bl, es:[di+bx]
  1350.         mov     cl, bl
  1351. asLoop:         cld
  1352.         lodsb
  1353.         mov     es:[di+bx+10h], al
  1354.         or      al, al
  1355.         jz      asEnd
  1356.         inc     bl
  1357.         jmp     asLoop
  1358. ;
  1359. asEnd:          inc     SameNum
  1360.         add     cl, 16
  1361.         cmp     bl, cl
  1362.         jb      asSkipRePntr
  1363.         inc     bl
  1364.         mov     al, bl
  1365.         mov     bl, ah
  1366.         inc     bl
  1367.         mov     es:[bx], al
  1368. asSkipRePntr:   pop     di
  1369.         pop     si
  1370.         pop     cx
  1371.         pop     bx
  1372.         pop     ax
  1373.         pop     es
  1374.         clc
  1375.         ret
  1376. ;
  1377. asAbort:        mov     PgFull, 1
  1378.         stc
  1379.         ret
  1380. AddSame         endp
  1381. ;               -------------------------------
  1382. MapPage         proc    near
  1383. ;
  1384. ;       IN:     cPage = to be Mapped
  1385. ;
  1386.         pusha
  1387.         xor     ah, ah
  1388.         mov     al, cPage
  1389.         mov     cx, 1504
  1390.         mov     Count, cx
  1391.         mul     cx
  1392.         mov     word ptr sOffset, ax
  1393.         lea     ax, PyCode
  1394.         mov     word ptr dOffset, ax
  1395.         lea     si, xStruc
  1396.         mov     ah, 0bh
  1397.         call    dword ptr xEntry
  1398.         popa
  1399.         ret
  1400. ;
  1401. inPage          db      0
  1402. MapPage         endp
  1403. ;               -------------------------------
  1404. ReadEncode      proc    near
  1405. ;
  1406. ;       IN:     bx = offset
  1407. ;
  1408.         push    si
  1409.         mov     word ptr sOffset, bx
  1410.         mov     Count, 2
  1411.         lea     ax, TmpCode
  1412.         mov     word ptr dOffset, ax
  1413.         mov     ah, 0bh
  1414.         lea     si, xStruc
  1415.         call    dword ptr xEntry
  1416.         pop     si
  1417.         ret
  1418. ;
  1419. TmpCode         dw      3 dup(0)
  1420. ReadEncode      endp
  1421. ;               -------------------------------
  1422. ;
  1423.         db      'PY CODE:'
  1424. PyCode          db      6768*2 dup(?)
  1425. NextPy          db      (15976-6768*2) dup(?)
  1426. PyEnd           label   byte
  1427. ;
  1428. iFile           db      'chcs.ini', 0
  1429. ;
  1430. CHCSMark        db      13,10,9, 'CHCS'
  1431. ;
  1432. noCHCS          db      7, 'chpy: CHCS/CHIS no installed !'
  1433.         db      0dh,0ah, '$'
  1434. ReInst          db      'chpy: ╞┤╥⌠╩Σ╚δ╖¿╥╤╫░╚δ !', 0dh,0ah, '$'
  1435. BadVer          db      7, 'chpy: ░µ▒╛║┼▓╗╢╘', 0dh,0ah, '$'
  1436. ;
  1437. SpFileSuf       db      'sp.dat', 0
  1438. Path            db      88 dup(?)
  1439. NameOff         dw      ?
  1440. ChangeSp        db      0
  1441. ;
  1442. ;               -------------------------------
  1443. MoveToXMS       proc    near
  1444.         mov     dSize, 15976
  1445.         cmp     word ptr xEntry+2, 0
  1446.         jne     MToCont0
  1447. ;
  1448. SetNoXMS:       mov     nPage, 0
  1449.         mov     dx, dSize
  1450.         mov     pSize, dx
  1451.         mov     eSize, dx
  1452.         mov     cSize, dx
  1453.         mov     cPage, 0
  1454.         ret
  1455. ;
  1456. MToCont0:       mov     dx, dSize
  1457. ;                add     dx, 400
  1458.         test    dx, 03ffh
  1459.         jz      noInc
  1460.         add     dx, 400h
  1461. noInc:          mov     dl, dh
  1462.         xor     dh, dh
  1463.         shr     dx, 1
  1464.         shr     dx, 1
  1465. ;
  1466.         mov     ah, 9
  1467.         call    dword ptr xEntry
  1468.         cmp     bl, 0
  1469.         jne     SetNoXMS
  1470.         mov     xHandle, dx
  1471. ;
  1472.         mov     dHandle, dx
  1473.         mov     ax, dSize
  1474.         mov     Count, ax
  1475.         mov     sHandle, 0
  1476.         lea     ax, PyCode
  1477.         mov     word ptr sOffset, ax
  1478.         mov     ax, cs
  1479.         mov     word ptr sOffset+2, ax
  1480.         mov     word ptr dOffset, 0
  1481.         mov     word ptr dOffset+2, 0
  1482.         mov     ah, 0bh
  1483.         lea     si, xStruc
  1484.         call    dword ptr xEntry
  1485.         cmp     bl, 0
  1486.         je      MoveSucceed
  1487. ;
  1488.         mov     ah, 0ah
  1489.         mov     dx, xHandle
  1490.         call    dword ptr xEntry
  1491.         jmp     SetNoXMS
  1492. ;
  1493. MoveSucceed:    mov     Count, 1504
  1494.         mov     ax, xHandle
  1495.         mov     sHandle, ax
  1496.         mov     word ptr sOffset+2, 0
  1497.         lea     ax, PyCode
  1498.         mov     word ptr dOffset, ax
  1499.         mov     ax, cs
  1500.         mov     word ptr dOffset+2, ax
  1501.         mov     dHandle, 0
  1502. ;
  1503.         mov     bx, 1504
  1504.         mov     pSize, bx
  1505.         mov     cSize, bx
  1506.         mov     ax, dSize
  1507.         xor     dx, dx
  1508.         div     bx
  1509.         mov     nPage, al
  1510.         mov     eSize, dx
  1511.         mov     cPage, 0
  1512.         ret
  1513. MoveToXMS       endp
  1514. ;               -------------------------------
  1515. start:          mov     ax, ds
  1516.         mov     es, ax
  1517.         mov     Psp, ax
  1518.         mov     ax, ds:[2ch]
  1519.         mov     Env, ax
  1520. ;
  1521.         xor     si, si
  1522.         mov     ds, ax
  1523. iLoop0:         cmp     word ptr [si], 0
  1524.         je      iEnd0
  1525.         inc     si
  1526.         jmp     iLoop0
  1527. iEnd0:          add     si, +4
  1528.         lea     di, Path
  1529.         cld
  1530. iLoop1:         lodsb
  1531.         stosb
  1532.         or      al, al
  1533.         jz      iEnd1
  1534.         cmp     al, '\'
  1535.         jne     iLoop1
  1536.         mov     es:NameOff, di
  1537.         jmp     iLoop1
  1538. ;
  1539. iEnd1:          mov     ax, cs
  1540.         mov     ds, ax
  1541.         mov     di, NameOff
  1542. ;
  1543. ;               Treat Command Line Parameters:
  1544. ;
  1545.         mov     si, 81h
  1546. cmdLoop0:       mov     al, [si]
  1547.         inc     si
  1548.         cmp     al, ' '
  1549.         je      cmdLoop0
  1550.         cmp     al, 09h
  1551.         je      cmdLoop0
  1552.         cmp     al, '/'
  1553.         jne     CmdLineEnd
  1554.         mov     al, [si]
  1555.         inc     si
  1556.         and     al, 5fh
  1557.         cmp     al, 'P'
  1558.         jne     CmdLineEnd
  1559.         mov     al, [si]
  1560.         inc     si
  1561.         cmp     al, ':'
  1562.         jne     CmdLineEnd
  1563.         mov     cx, 8
  1564.         cld
  1565. iLoop2:         lodsb
  1566.         cmp     al, ' '
  1567.         jbe     iAddSuffix
  1568.         stosb
  1569.         loop    iLoop2
  1570. iAddSuffix:     lea     si, SpFileSuf
  1571.         mov     cx, 7
  1572.         cld
  1573.         rep     movsb
  1574.         mov     ChangeSp, 1
  1575. ;
  1576. CmdLineEnd:     mov     ax, 3f00h
  1577.         int     16h
  1578.         mov     di, bx
  1579.         lea     si, CHCSMark
  1580.         mov     cx, 5
  1581.         cld
  1582.         repz    cmpsb
  1583.         jz      iCont0
  1584.         lea     dx, noCHCS
  1585.         jmp     prError
  1586. ;
  1587. iCont0:         cmp     ax, 0100h
  1588.         je      iCont2
  1589.         lea     dx, BadVer
  1590.         jmp     prError
  1591. ;
  1592. iCont2:         mov     ax, 3516h
  1593.         int     21h
  1594.         mov     word ptr Int16, bx
  1595.         mov     word ptr Int16+2, es
  1596. ;
  1597. ;               Test XMS memory
  1598. ;
  1599.         mov     ax, 4300h
  1600.         int     2fh
  1601.         cmp     al, 80h
  1602.         jne     iNoXMS
  1603.         mov     ax, 4310h
  1604.         int     2fh
  1605.         mov     word ptr xEntry, bx
  1606.         mov     word ptr xEntry+2, es
  1607. ;
  1608. iNoXMS:         mov     ax, 3101h
  1609.         lea     bx, KeyProc
  1610.         lea     dx, PyName
  1611.         mov     di, Psp
  1612.         push    cs
  1613.         pop     es
  1614.         int     16h
  1615.         or      ax, ax
  1616.         jz      iCont1
  1617.         lea     dx, ReInst
  1618.         jmp     prError
  1619. ;
  1620. iCont1:         mov     word ptr SamAddr, bx
  1621.         mov     word ptr SamAddr+2, es
  1622. ;
  1623.         call    MoveToXMS
  1624. ;
  1625.         cmp     ChangeSp, 1
  1626.         jne     iCont3
  1627. ;
  1628.         lea     dx, Path
  1629.         mov     ax, 3d00h
  1630.         int     21h
  1631.         jc      iCont3
  1632.         mov     bx, ax
  1633.         mov     ah, 3fh
  1634.         lea     dx, SpSm
  1635.         mov     cx, 11 + 165
  1636.         int     21h
  1637.         mov     ah, 3eh
  1638.         int     21h
  1639. ;
  1640. iCont3:         mov     es, Env
  1641.         mov     ah, 49h
  1642.         int     21h
  1643. ;
  1644.         lea     dx, PyCode
  1645.         add     dx, pSize
  1646.         mov     cl, 4
  1647.         shr     dx, cl
  1648.         inc     dx
  1649.         mov     ax, 3100h
  1650.         int     21h
  1651. ;
  1652. prError:        mov     ah, 9
  1653.         int     21h
  1654.         mov     ax, 4cffh
  1655.         int     21h
  1656. ;               -------------------------------
  1657. code            ends
  1658.         end     begin
  1659.