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

  1. ;
  2. ;       int9.asm
  3. ;
  4. .286
  5. code            segment byte public 'CODE'
  6.         assume  cs:code, ds:code
  7. ;
  8. include         xcs.mac
  9. ;
  10.         extrn   ChcsPsp:word
  11.         extrn   ChcsEnv:word
  12. ;
  13.         extrn   OldInt08:dword
  14.         extrn   OldInt09:dword
  15.         extrn   OldInt10:dword
  16.         extrn   OldInt13:dword
  17.         extrn   OldInt16:dword
  18.         extrn   OldInt1c:dword
  19. ;
  20.         extrn   NewInt08:far
  21.         extrn   NewInt10:far
  22.         extrn   NewInt13:far
  23.         extrn   NewInt1c:far
  24. ;
  25.         extrn   inBeep:near
  26.         extrn   ConvertVMode:near
  27.         extrn   VModeToCmode:near
  28.         extrn   VModeToEmode:near
  29.         extrn   PromptOpr:near
  30.         extrn   DrawScrBuf:near
  31.         extrn   MakeButton:near
  32.         extrn   TradeButton:near
  33.         extrn   MakeBottomBar:near
  34.         extrn   OpenDisplay:near
  35.         extrn   SaveCurEnv:near
  36. ;
  37.         extrn   IntrBusy:byte
  38.         extrn   inOld16:byte
  39. ;
  40.         extrn   KeyinProc:dword
  41.         extrn   ISentries:dword
  42. ;
  43.         extrn   wHas:byte
  44.         extrn   uHas:byte
  45.         extrn   prHas:byte
  46.         extrn   prFontHas:byte
  47. ;
  48.         extrn   wProc:dword
  49.         extrn   uProc:dword
  50.         extrn   wLen:word
  51.         extrn   uLen:word
  52. ;
  53.         extrn   mode:byte
  54.         extrn   QuHao:byte
  55. ;
  56.         extrn   c:word
  57.         extrn   Int9Buf:byte
  58.         extrn   pushin:word
  59.         extrn   popout:word
  60.         extrn   int9in:byte
  61. ;
  62.         extrn   FHname:byte
  63.         extrn   ModeMSG:byte
  64.         extrn   KeyMSG:byte
  65.         extrn   SysMSG:byte
  66.         extrn   DispMSG:byte
  67.         extrn   DigMSG:byte
  68.         extrn   PadMSG:byte
  69.         extrn   dStr:byte
  70.         extrn   sym:byte
  71.         extrn   sch1:byte
  72.         extrn   sch2:byte
  73.         extrn   ScanCode:byte
  74.         extrn   PadCode:byte
  75.         extrn   KeyCode:byte
  76.         extrn   TradeMark:byte
  77.         extrn   Author:byte
  78.         extrn   AuName:byte
  79.         extrn   AuthorStr:byte
  80.         extrn   AuthorName:byte
  81.         extrn   Numb:byte
  82.         extrn   StrQu:byte
  83.         extrn   AttrStr:byte
  84.         extrn   Arrow:byte
  85.         extrn   TmpBuffer:word
  86.         extrn   TmpCount:word
  87.         extrn   inCommand:byte
  88.         extrn   inPrompt:byte
  89.         extrn   KeyEnd:byte
  90.         extrn   d1:byte
  91.         extrn   d2:byte
  92.         extrn   PmtNo:byte
  93.         extrn   mark:byte
  94.         extrn   oldkmode:byte
  95.         extrn   tmpmode:byte
  96.         extrn   kmodeBusy:byte
  97.         extrn   reCommand:byte
  98.         extrn   SymMark:byte
  99.         extrn   pntr:byte
  100.         extrn   cPntr:word
  101. ;
  102.         extrn   KeyNum:byte
  103.         extrn   KeyBuf:byte
  104.         extrn   SameNum:byte
  105.         extrn   SameBuf:byte
  106.         extrn   CurKey:word
  107.         extrn   LastKey:word
  108.         extrn   cc1:byte
  109.         extrn   cc2:byte
  110.         extrn   CtrlShift:byte
  111.         extrn   Int9Treated:byte
  112. ;
  113.         extrn   pmtx:byte
  114.         extrn   tmpattr:byte
  115.         extrn   pmtxmax:byte
  116.         extrn   bAttr:byte
  117.         extrn   nAttr:byte
  118.         extrn   kAttr:byte
  119.         extrn   sAttr:byte
  120.         extrn   eAttr:byte
  121. ;
  122.         extrn   MyMode:byte
  123.         extrn   TextMode:byte
  124.         extrn   CurTextMode:byte
  125.         extrn   DispMode:byte
  126.         extrn   VRamSEG:word
  127. ;
  128.         extrn   inColorText:byte
  129.         extrn   inGrCursor:byte
  130.         extrn   isTreatCC:byte
  131.         extrn   isTreatTab:byte
  132.         extrn   DisplayOpen:byte
  133.         extrn   ClockSwitch:byte
  134.         extrn   TimeOut:word
  135.         extrn   NopTime:word
  136. ;
  137. ;               ----------------------------
  138. beep            proc    near
  139.         mov     cx, 0166h
  140.         mov     bx, 2
  141.         call    inBeep
  142.         ret
  143. beep            endp
  144. ;               ----------------------------
  145. promptc         proc    near
  146. ;
  147. ;       IN:     dl = char
  148. ;
  149.         push    si
  150.         or      IntrBusy, I16Busy
  151.         mov     ax, 1403h
  152.         mov     bl, tmpattr
  153.         and     bl, 0fh
  154.         or      bl, bAttr
  155.         call    PromptOpr
  156.         inc     pmtx
  157.         and     IntrBusy, NOT I16Busy
  158.         pop     si
  159.         ret
  160. promptc         endp
  161. ;               ----------------------------
  162. inPmtClear      proc    near
  163.         push    si
  164.         or      IntrBusy, I16Busy
  165.         mov     ax, 1400h
  166.         mov     bl, bAttr
  167.         call    PromptOpr
  168.         mov     pmtx, 0
  169.         and     IntrBusy, NOT I16Busy
  170.         pop     si
  171.         ret
  172. inPmtClear      endp
  173. ;               ----------------------------
  174. PmtC            proc    near
  175. ;
  176. ;       IN:     dl = char
  177. ;
  178.         cmp     dl, 0dh
  179.         jne     PmtCCont0
  180.         call    inPmtClear
  181.         ret
  182. ;
  183. PmtCCont0:      cmp     dl, '~'
  184.         jne     PmtCCont1
  185.         mov     mark, 1
  186.         ret
  187. ;
  188. PmtCCont1:      cmp     byte ptr mark, 0
  189.         je      PmtCPutIt
  190.         cmp     dl, '1'
  191.         jbe     PmtCCont2
  192.         cmp     dl, '9'
  193.         ja      PmtCCont2
  194.         sub     dl, '0'
  195.         jmp     PmtCSetIt
  196. ;
  197. PmtCCont2:      cmp     dl, 'e'
  198.         je      PmtCSetEC
  199.         cmp     dl, 'k'
  200.         je      PmtCSetKC
  201.         cmp     dl, 'n'
  202.         je      PmtCSetNC
  203.         cmp     dl, 's'
  204.         je      PmtCSetSC
  205.         ret
  206. ;
  207. PmtCSetEC:      mov     dl, eAttr
  208.         jmp     PmtCSetIt
  209. PmtCSetKC:      mov     dl, kAttr
  210.         jmp     PmtCSetIt
  211. PmtCSetNC:      mov     dl, nAttr
  212.         jmp     PmtCSetIt
  213. PmtCSetSC:      mov     dl, sAttr
  214. PmtCSetIt:      mov     tmpattr, dl
  215.         mov     mark, 0
  216.         ret
  217. ;
  218. PmtCPutIt:      mov     al, pmtx
  219.         cmp     al, pmtxmax
  220.         jae     PmtCRet0
  221.         call    promptc
  222. PmtCRet0:       ret
  223. PmtC            endp
  224. ;               ----------------------------
  225. PmtMove         proc    near
  226. ;
  227. ;       IN:     dl = x
  228. ;
  229.         cmp     dl, pmtxmax
  230.         jae     PmtMoveRetn
  231.         push    si
  232.         or      IntrBusy, I16Busy
  233.         mov     pmtx, dl
  234.         mov     ax, 1402h
  235.         call    PromptOpr
  236.         and     IntrBusy, NOT I16Busy
  237.         pop     si
  238. PmtMoveRetn:    ret
  239. PmtMove         endp
  240. ;               ----------------------------
  241. PmtClear        proc    near
  242. ;
  243. ;       IN:     dl = x
  244. ;
  245.         mov     al, sAttr
  246.         mov     tmpattr, al
  247.         push    dx
  248.         call    PmtMove
  249.         pop     dx
  250.         push    dx
  251. PmtClearLoop:   cmp     dl, pmtxmax
  252.         jae     PmtClearEnd
  253.         push    dx
  254.         mov     dl, ' '
  255.         call    promptc
  256.         pop     dx
  257.         inc     dl
  258.         jmp     PmtClearLoop
  259. PmtClearEnd:    pop     dx
  260.         call    PmtMove
  261.         ret
  262. PmtClear        endp
  263. ;               ----------------------------
  264. PmtCh           proc    near
  265. ;
  266. ;       IN:     dl = char
  267. ;
  268.         mov     al, kAttr
  269.         mov     tmpattr, al
  270.         call    promptc
  271.         ret
  272. PmtCh           endp
  273. ;               ----------------------------
  274. PmtS            proc    near
  275. ;
  276. ;       IN:     [bp+4] = Str
  277. ;
  278.         push    bp
  279.         mov     bp, sp
  280.         push    si
  281.         mov     si, word ptr [bp+4]
  282. PmtSLoop:       mov     dl, [si]
  283.         or      dl, dl
  284.         jz      PmtSEnd
  285.         call    PmtC
  286.         inc     si
  287.         jmp     PmtSLoop
  288. ;
  289. PmtSEnd:        pop     si
  290.         pop     bp
  291.         ret
  292. PmtS            endp
  293. ;               ----------------------------
  294. PmtFuHao        proc    near
  295.         cmp     QuHao, 10
  296.         jae     PmtFuHao10
  297.         mov     al, QuHao
  298.         dec     al
  299.         mov     bl, 9
  300.         mul     bl
  301.         add     ax, offset FHName
  302.         push    ax
  303.         call    PmtS
  304.         pop     cx
  305.         ret
  306. ;
  307. PmtFuHao10:     mov     al, QuHao
  308.         add     al, 38
  309.         mov     byte ptr StrQu+5, al
  310.         lea     ax, StrQu
  311.         push    ax
  312.         call    PmtS
  313.         pop     cx
  314.         ret
  315. PmtFuHao        endp
  316. ;               ----------------------------
  317. MakeInBox       proc    near
  318.         mov     dl, 8
  319.         mov     dh, 21
  320.         call    MakeButton
  321.         mov     dl, 21
  322.         mov     dh, 71
  323.         call    MakeButton
  324.         ret
  325. MakeInBox       endp
  326. ;               ----------------------------
  327. message         proc    near
  328.         mov     inPrompt, 0
  329.         call    MakeBottomBar
  330.         call    inPmtClear
  331.         cmp     byte ptr mode.kmode, 9
  332.         jne     MsgKmode
  333. ;
  334.         lea     ax, TradeMark
  335.         push    ax
  336.         call    PmtS
  337.         pop     cx
  338.         call    TradeButton
  339.         cmp     DispMode, 6
  340.         jb      MsgCont2
  341.         je      MsgCmode
  342. ;
  343.         cmp     DispMode, 12h
  344.         jne     MsgCont1
  345.         cmp     CurTextMode, 0
  346.         je      MsgCont1
  347.         mov     al, 3
  348.         jmp     MsgPmtS
  349. ;
  350. MsgCmode:       mov     al, 2
  351.         jmp     MsgPmtS
  352. ;
  353. MsgCont1:       mov     al, 4
  354.         jmp     MsgPmtS
  355. ;
  356. MsgCont2:       mov     al, CurTextMode
  357. MsgPmtS:        mov     dl, 15
  358.         mul     dl
  359.         add     ax, offset ModeMSG
  360.         push    ax
  361.         call    PmtS
  362.         pop     cx
  363. ;
  364.         mov     dl, 19
  365.         call    PmtMove
  366.         lea     ax, Author
  367.         push    ax
  368.         call    PmtS
  369.         pop     cx
  370. ;
  371.         mov     dl, 18
  372.         mov     dh, 71
  373.         call    MakeButton
  374.         jmp     MessageRet0
  375. ;
  376. MsgKmode:       mov     al, nAttr
  377.         mov     tmpattr, al
  378.         mov     al, byte ptr mode.kmode
  379.         cmp     al, 8
  380.         je      MsgFuHao
  381.         mov     dl, ISstrucSize
  382.         mul     dl
  383.         add     ax, offset ISentries
  384.         push    ax
  385.         call    PmtS
  386.         pop     cx
  387.         jmp     MsgColon
  388. ;
  389. MsgFuHao:       call    PmtFuHao
  390. MsgColon:       call    MakeInBox
  391. ;
  392. MessageRet0:    mov     KeyNum, 0
  393.         mov     SameNum, 0
  394.         mov     d1, 0
  395.         ret
  396. message         endp
  397. ;               ----------------------------
  398. MakeAuthorStr   proc    near
  399.         pusha
  400.         push    es
  401.         push    cs
  402.         pop     es
  403.         lea     si, AuthorStr
  404.         lea     di, Author+1
  405.         mov     cl, 4
  406.         cld
  407. MakeAuLoop0:    lodsw
  408.         or      ax, ax
  409.         jz      MakeAuEnd
  410.         ror     ah, cl
  411.         ror     al, cl
  412.         xchg    ah, al
  413.         stosw
  414.         jmp     MakeAuLoop0
  415. ;
  416. MakeAuEnd:      pop     es
  417.         popa
  418.         ret
  419. MakeAuthorStr   endp
  420. ;               ----------------------------
  421. CmdPrompt       proc    near
  422.         mov     inPrompt, 1
  423.         mov     al, PmtNo
  424.         or      al, al
  425.         jz      CmdPmtKmode
  426.         cmp     al, 2
  427.         jb      toPmtDigit
  428.         je      toPmtPad
  429.         cmp     al, 4
  430.         jb      toPmtSys
  431.         je      toPmtDisp
  432.         mov     inPrompt, 0
  433.         ret
  434. ;
  435. toPmtDigit:     jmp     CmdPmtDigit
  436. toPmtPad:       jmp     CmdPmtPad
  437. toPmtSys:       jmp     CmdPmtSys
  438. toPmtDisp:      jmp     CmdPmtDisp
  439. ;
  440. CmdPmtKmode:    cmp     byte ptr mode.kmode, 9
  441.         jne     CmdNotAscii
  442.         mov     byte ptr KeyMSG+11, 'k'
  443.         jmp     toPmtKey
  444. ;
  445. CmdNotAscii:    mov     byte ptr KeyMSG+11, 'e'
  446. toPmtKey:       lea     ax, KeyMSG
  447.         push    ax
  448.         call    PmtS
  449.         pop     cx
  450.         mov     cx, 9
  451.         xor     dh, dh
  452. CmdKeyLoop:     push    cx
  453.         push    dx
  454.         mov     al, dh
  455.         mov     bl, ISstrucSize
  456.         mul     bl
  457.         mov     bx, ax
  458.         cmp     byte ptr ISentries[bx+11], 'Y'
  459.         jne     NotPmtKey
  460.         cmp     dh, byte ptr mode.kmode
  461.         jne     NotPmtCur
  462.         mov     byte ptr AttrStr+2, 'k'
  463.         jmp     CmdPmtCont0
  464. NotPmtCur:      mov     byte ptr AttrStr+2, 'e'
  465. CmdPmtCont0:    mov     al, dh
  466.         add     al, '1'
  467.         mov     byte ptr AttrStr+4, al
  468.         lea     ax, AttrStr
  469.         push    dx
  470.         push    ax
  471.         call    PmtS
  472.         pop     cx
  473.         pop     dx
  474.         cmp     dh, 8
  475.         je      CmdPmtFuhao
  476.         mov     al, dh
  477.         mov     bl, ISstrucSize
  478.         mul     bl
  479.         add     ax, offset ISentries
  480.         push    ax
  481.         call    PmtS
  482.         pop     cx
  483.         jmp     NotPmtKey
  484. ;
  485. CmdPmtFuhao:    mov     al, sAttr
  486.         mov     tmpattr, al
  487.         call    PmtFuHao
  488. NotPmtKey:      pop     dx
  489.         pop     cx
  490.         inc     dh
  491.         loop    CmdKeyLoop
  492.         mov     dl, 6
  493.         mov     dh, 71
  494.         call    MakeButton
  495.         jmp     CmdPmtRet0
  496. ;
  497. CmdPmtDigit:    mov     al, byte ptr mode.dmode
  498.         shl     al, 1
  499.         shl     al, 1
  500.         shl     al, 1
  501.         add     al, 16
  502.         xor     ah, ah
  503.         push    ax
  504.         lea     bx, DigMSG
  505.         push    bx
  506.         add     bx, ax
  507.         mov     byte ptr [bx], 'k'
  508.         call    PmtS
  509.         pop     bx
  510.         pop     ax
  511.         add     bx, ax
  512.         mov     byte ptr [bx], 'e'
  513.         mov     dl, 10
  514.         mov     dh, 71
  515.         call    MakeButton
  516.         jmp     CmdPmtRet0
  517. ;
  518. CmdPmtPad:      mov     al, byte ptr mode.pmode
  519.         shl     al, 1
  520.         mov     ah, al
  521.         shl     al, 1
  522.         shl     al, 1
  523.         add     al, ah
  524.         add     al, 16
  525.         xor     ah, ah
  526.         push    ax
  527.         lea     bx, PadMSG
  528.         push    bx
  529.         add     bx, ax
  530.         mov     byte ptr [bx], 'k'
  531.         call    PmtS
  532.         pop     bx
  533.         pop     ax
  534.         add     bx, ax
  535.         mov     byte ptr [bx], 'e'
  536.         mov     dl, 10
  537.         mov     dh, 71
  538.         call    MakeButton
  539.         jmp     CmdPmtRet0
  540. ;
  541. CmdPmtSys:      lea     bx, SysMSG
  542.         cmp     byte ptr mode.smode, 1 ; ▒Ω╡π:
  543.         jne     toEBiaoDian
  544.         mov     ax, 0d0d6h             ; '╓╨'
  545.         jmp     toSetBiaoDian
  546. toEBiaoDian:    mov     ax, 0a2d3h             ; '╬≈'
  547. toSetBiaoDian:  mov     [bx+18], ax
  548.         cmp     ClockSwitch, 1         ; ╩▒╓╙:
  549.         jne     toNoClock
  550.         mov     ax, 0aabfh             ; '┐¬'
  551.         jmp     toSetClock
  552. toNoClock:      mov     ax, 0d8b9h             ; '╣╪'
  553. toSetClock:     mov     [bx+36], ax
  554.         cmp     isTreatCC, 1           ; ╒√╫╓┤ª└φ:
  555.         jne     toNotTreatCC
  556.         mov     ax, 0aabfh             ; '┐¬'
  557.         jmp     toSetTreatCC
  558. toNotTreatCC:   mov     ax, 0d8b9h             ; '╣╪'
  559. toSetTreatCC:   mov     [bx+78], ax
  560.         cmp     isTreatTab, 1          ; ▒φ╕±╩╢▒≡:
  561.         jne     toNotTreatTab
  562.         mov     ax, 0aabfh             ; '┐¬'
  563.         jmp     toSetTreatTab
  564. toNotTreatTab:  mov     ax, 0d8b9h             ; '╣╪'
  565. toSetTreatTab:  mov     [bx+62], ax
  566.         lea     ax, SysMSG
  567.         push    ax
  568.         call    PmtS
  569.         pop     cx
  570.         mov     dl, 8
  571.         mov     dh, 71
  572.         call    MakeButton
  573.         jmp     CmdPmtRet0
  574. ;
  575. CmdPmtDisp:     lea     ax, DispMSG
  576.         push    ax
  577.         call    PmtS
  578.         pop     cx
  579.         mov     dl, 8
  580.         mov     dh, 71
  581.         call    MakeButton
  582. ;
  583. CmdPmtRet0:     cmp     pmtx, 64
  584.         jae     CmdPmtRetn
  585.         lea     ax, Arrow
  586.         push    ax
  587.         call    PmtS
  588.         pop     cx
  589. CmdPmtRetn:     ret
  590. CmdPrompt       endp
  591. ;               ----------------------------
  592. SetKmode        proc    near
  593. ;
  594. ;       IN:     tmpmode = to be setted
  595. ;
  596.         cmp     kmodeBusy,0
  597.         jz      SetKmodeCont0
  598.         mov     al, 0
  599.         ret
  600. SetKmodeCont0:  mov     kmodeBusy, 1
  601.         mov     al, byte ptr mode.kmode
  602.         mov     oldkmode, al
  603.         mov     al, tmpmode
  604.         cmp     al, 9
  605.         jbe     SetKmodeCont1
  606.         jmp     SetKmodeRetn
  607. ;
  608. SetKmodeCont1:  cmp     al, byte ptr mode.kmode
  609.         jne     SetKmodeContx
  610.         jmp     SetKmodeOk
  611. ;
  612. SetKmodeContx:  mov     dl, ISstrucSize
  613.         mul     dl
  614.         mov     bx, ax
  615.         cmp     byte ptr ISentries[bx+11], 'Y'
  616.         je      SetKmodeCont2
  617.         jmp     SetKmodeRetn
  618. ;
  619. SetKmodeCont2:  cli
  620.         mov     al, tmpmode
  621.         mov     byte ptr mode.kmode, al
  622.         mov     dx, word ptr ISentries[bx+14]
  623.         mov     ax, word ptr ISentries[bx+12]
  624.         mov     word ptr KeyinProc+2, dx
  625.         mov     word ptr KeyinProc, ax
  626.         sti
  627.         mov     ax, 0ffffh
  628.         mov     bh, tmpmode
  629.         call    dword ptr KeyinProc
  630.         or      ax, ax
  631.         jz      SetKmodeOk
  632.         cli
  633.         mov     al, oldkmode
  634.         mov     byte ptr mode.kmode, al
  635.         mov     dl, ISstrucSize
  636.         mul     dl
  637.         mov     bx, ax
  638.         mov     ax, word ptr ISentries[bx+12]
  639.         mov     dx, word ptr ISentries[bx+14]
  640.         mov     word ptr KeyinProc+2, dx
  641.         mov     word ptr KeyinProc, ax
  642.         sti
  643. ;
  644. SetKmodeRetn:   mov     byte ptr kmodeBusy, 0
  645.         mov     al, 0
  646.         ret
  647. ;
  648. SetKmodeOk:     cmp     oldkmode, 8
  649.         jne     SetKmodeRet0
  650.         cmp     tmpmode, 8
  651.         jne     SetKmodeRet0
  652.         inc     QuHao
  653.         cmp     QuHao, 16
  654.         jb      SetKmodeRet0
  655.         mov     QuHao, 1
  656. ;
  657. SetKmodeRet0:   mov     kmodeBusy, 0
  658.         mov     al, 1
  659.         ret
  660. SetKmode        endp
  661. ;               ----------------------------
  662. GetChar         proc    near
  663.         cmp     inCommand, 0
  664.         je      GetChSkip0
  665.         cmp     inPrompt, 0
  666.         jne     GetChSkip1
  667.         mov     PmtNo, 0
  668.         call    CmdPrompt
  669.         jmp     GetChSkip1
  670. ;
  671. GetChSkip0:     cmp     inPrompt, 1
  672.         jne     GetChSkip1
  673.         call    message
  674. GetChSkip1:     cli
  675.         mov     bx, popout
  676.         cmp     bx, pushin
  677.         jne     GetChCont0
  678.         xor     ax, ax
  679.         sti
  680.         ret
  681. ;
  682. GetChCont0:     lea     dx, Int9Buf
  683.         mov     ax, [bx]
  684.         mov     cx, dx
  685.         add     dx, 62
  686.         cmp     bx, dx
  687.         je      ResetBuf
  688.         inc     bx
  689.         inc     bx
  690.         jmp     GetChSaveIt
  691. ;
  692. ResetBuf:       mov     bx, cx
  693. GetChSaveIt:    mov     popout, bx
  694.         mov     word ptr c, ax
  695.         sti
  696.         cmp     inCommand, 0
  697.         jne     TreatCommand
  698.         ret
  699. ;
  700. TreatCommand:   cmp     al, 0e0h
  701.         jne     ComCont0
  702.         xor     al, al
  703. ComCont0:       or      al, al
  704.         jz      ComCont1
  705.         mov     dh, ah
  706.         xor     ah, ah
  707. ComCont1:       cmp     ax, UP
  708.         je      PmtLast
  709.         cmp     ax, DOWN
  710.         je      PmtNext
  711.         jmp     ComCont2
  712. ;
  713. PmtLast:        cmp     PmtNo, 0
  714.         je      toPmtNo4
  715.         dec     PmtNo
  716.         jmp     PmtMSG
  717. toPmtNo4:       mov     PmtNo, 4
  718.         jmp     PmtMSG
  719. PmtNext:        cmp     PmtNo, 4
  720.         je      toPmtNo0
  721.         inc     PmtNo
  722.         jmp     PmtMSG
  723. toPmtNo0:       mov     PmtNo, 0
  724. PmtMSG:         call    CmdPrompt
  725.         xor     ax, ax
  726.         mov     c, ax
  727.         ret
  728. ;
  729. ComCont2:       mov     reCommand, 0
  730.         cmp     ax, F1
  731.         jb      ComCont3
  732.         cmp     ax, F10
  733.         ja      ComCont3
  734.         sub     ax, F1
  735.         mov     tmpmode, ah
  736.         cmp     ah, 8
  737.         jne     SkipSetRe
  738.         mov     reCommand, 1
  739. SkipSetRe:      call    SetKmode
  740.         jmp     Setted
  741. ;
  742. toSetDmode:     sub     al, '0'
  743.         mov     byte ptr mode.dmode, al
  744.         jmp     Setted
  745. ;
  746. toSetPmode:     sub     al, '0'
  747.         mov     byte ptr mode.pmode, al
  748.         jmp     Setted
  749. ;
  750. ComCont3:       cmp     al, '0'
  751.         jb      toEnd
  752.         cmp     al, '8'
  753.         ja      toSetSw
  754.         cmp     dh, 0bh
  755.         jbe     toSetDmode
  756.         cmp     al, '5'
  757.         jbe     toSetPmode
  758. toEnd:          jmp     Setted
  759. ;
  760. toRevSmode:     xor     byte ptr mode.smode, 01h
  761.         jmp     Setted
  762. ;
  763. toCCmode:       mov     bh, 1
  764.         call    VModeToCmode
  765.         jmp     Setted
  766. ;
  767. toRevCursor:    xor     inGrCursor, 01h
  768.         jmp     Setted
  769. ;
  770. toRevClock:     xor     ClockSwitch, 01h
  771.         jmp     Setted
  772. ;
  773. toRevColor:     xor     inColorText, 01h
  774.         call    DrawScrBuf
  775.         jmp     Setted
  776. ;
  777. toConvVMode:    call    ConvertVMode
  778.         cmp     CurTextMode, 2
  779.         jne     toEnd
  780.         jmp     ExitComm
  781. ;
  782. toSetSw:        or      al, 20h
  783.         cmp     al, 'b'
  784.         je      toRevSmode
  785.         cmp     al, 'h'
  786.         je      toCCmode
  787.         cmp     al, 'g'
  788.         je      toRevCursor
  789.         cmp     al, 'k'
  790.         je      toRevClock
  791.         cmp     al, 'c'
  792.         je      toRevColor
  793.         cmp     al, 'm'
  794.         je      toConvVMode
  795.         cmp     al, 'o'
  796.         je      toSetnAttr
  797.         cmp     al, 'p'
  798.         je      toSetkAttr
  799.         cmp     al, 'r'
  800.         je      toCEmode
  801.         cmp     al, 's'
  802.         je      toRedraw
  803.         cmp     al, 't'
  804.         je      toSetTab
  805.         cmp     al, 'y'
  806.         je      toEmode
  807.         cmp     al, 'z'
  808.         je      toRevCCsw
  809.         cmp     al, '{'
  810.         je      toSeteAttr
  811.         cmp     al, '}'
  812.         je      toSetsAttr
  813.         cmp     al, '|'
  814.         je      toSetbAttr
  815.         jmp     Setted
  816. ;
  817. toSetnAttr:     mov     al, nAttr
  818.         inc     al
  819.         and     al, 0fh
  820.         mov     nAttr, al
  821.         mov     reCommand, 1
  822.         jmp     Setted
  823. ;
  824. toSetkAttr:     mov     al, kAttr
  825.         inc     al
  826.         and     al, 0fh
  827.         mov     kAttr, al
  828.         mov     reCommand, 1
  829.         jmp     Setted
  830. ;
  831. toCEmode:       mov     bh, 0
  832.         call    VModeToCmode
  833.         jmp     Setted
  834. ;
  835. toRedraw:       cmp     TextMode, 1
  836.         jne     Setted
  837.         call    DrawScrBuf
  838.         jmp     Setted
  839. ;
  840. toSetTab:       xor     isTreatTab, 01h
  841.         jmp     toRedraw
  842. ;
  843. toEmode:        call    VModeToEmode
  844.         jmp     ExitComm
  845. ;
  846. toRevCCsw:      xor     isTreatCC, 01h
  847.         jmp     toRedraw
  848. ;
  849. toSeteAttr:     mov     al, eAttr
  850.         inc     al
  851.         and     al, 0fh
  852.         mov     eAttr, al
  853.         mov     reCommand, 1
  854.         jmp     Setted
  855. ;
  856. toSetsAttr:     mov     al, sAttr
  857.         inc     al
  858.         and     al, 0fh
  859.         mov     sAttr, al
  860.         mov     reCommand, 1
  861.         jmp     Setted
  862. ;
  863. toSetbAttr:     mov     al, bAttr
  864.         add     al, 10h
  865.         and     al, 70h
  866.         mov     bAttr, al
  867.         mov     reCommand, 1
  868.         jmp     Setted
  869. ;
  870. Setted:         call    message
  871. ExitComm:       cmp     reCommand, 0
  872.         jne     SkipReinCmd
  873.         mov     inCommand, 0
  874. SkipReinCmd:    xor     ax, ax
  875.         mov     c, ax
  876.         ret
  877. GetChar         endp
  878. ;               ----------------------------
  879. inPushBackKeys  proc    near
  880. ;
  881. ;       IN:     si = PushStr (include ScanCode)
  882. ;               cx = num
  883. ;       OUT:    cx = Num of Keys Left
  884. ;
  885.         push    di
  886.         push    si
  887.         cli
  888.         xor     ax, ax
  889.         mov     es, ax
  890.         mov     bh, 4
  891.         mov     bl, es:[41ch]
  892. iPushKeysLoop:  mov     di, bx
  893.         cmp     bl, 3ch
  894.         jae     iPushReset
  895.         inc     bl
  896.         inc     bl
  897.         jmp     iTestBuf
  898. ;
  899. iPushReset:     mov     bl, 1eh
  900. iTestBuf:       cmp     bl, es:[41ah]
  901.         je      iPushKeysRet0
  902.         cld
  903.         movsw
  904.         mov     es:[41ch], bl
  905.         loop    iPushKeysLoop
  906. iPushKeysRet0:  pop     si
  907.         pop     di
  908.         ret
  909. inPushBackKeys  endp
  910. ;               ----------------------------
  911. PushBackStr     proc    near
  912. ;
  913. ;       IN:     [bp+4] = Str (no ScanCode)
  914. ;               [bp+6] = num
  915. ;
  916.         push    bp
  917.         mov     bp, sp
  918.         push    es
  919.         push    di
  920.         push    si
  921.         cli
  922.         mov     si, [bp+4]
  923.         mov     cx, [bp+6]
  924.         mov     ax, 64
  925.         sub     ax, TmpCount
  926.         or      cx, cx
  927.         jz      PushStrCont0
  928.         cmp     cx, ax
  929.         jbe     PushStrCont2
  930. PushStrCont0:   mov     cx, ax
  931. ;
  932. PushStrCont2:   mov     ch, cl
  933.         xor     cl, cl
  934.         lea     bx, TmpBuffer
  935.         mov     ax, TmpCount
  936.         shl     ax, 1
  937.         add     bx, ax
  938. PushStrLoop:    mov     al, [si]
  939.         or      al, al
  940.         jz      toPushStr
  941.         xor     ah, ah
  942.         mov     [bx], ax
  943.         inc     cl
  944.         inc     si
  945.         add     bx, +2
  946.         dec     ch
  947.         jnz     PushStrLoop
  948. toPushStr:      xor     ch, ch
  949.         add     cx, TmpCount
  950. ;
  951. PushEntry:      xor     ch, ch
  952.         or      cl, cl
  953.         jz      PushStrRetn
  954.         push    cx
  955.         lea     si, TmpBuffer
  956.         mov     di, si
  957.         call    inPushBackKeys
  958.         mov     TmpCount, cx
  959.         pop     ax
  960.         or      cx, cx
  961.         jz      PushStrRetn
  962.         push    cs
  963.         pop     es
  964.         sub     ax, cx
  965.         shl     ax, 1
  966.         add     si, ax
  967.         cld
  968.         rep     movsw
  969. PushStrRetn:    sti
  970.         pop     si
  971.         pop     di
  972.         pop     es
  973.         pop     bp
  974.         ret
  975. PushBackStr     endp
  976. ;               ----------------------------
  977. PushBackKeys    proc    near
  978. ;
  979. ;       IN:     [bp+4] = Keys Str (Include Scan Codes)
  980. ;               [bp+6] = Num
  981. ;
  982.         push    bp
  983.         mov     bp, sp
  984.         push    es
  985.         push    di
  986.         push    si
  987.         cli
  988.         mov     si, [bp+4]
  989.         mov     cx, [bp+6]
  990.         mov     ax, 64
  991.         sub     ax, TmpCount
  992.         or      cx, cx
  993.         jz      PushKeysCont0
  994.         cmp     cx, ax
  995.         jbe     PushKeysCont2
  996. PushKeysCont0:  mov     cx, ax
  997. ;
  998. PushKeysCont2:  mov     ch, cl
  999.         xor     cl, cl
  1000.         lea     bx, TmpBuffer
  1001.         mov     ax, TmpCount
  1002.         shl     ax, 1
  1003.         add     bx, ax
  1004. PushKeysLoop:   mov     ax, [si]
  1005.         or      ax, ax
  1006.         jz      toPushKeys
  1007.         mov     [bx], ax
  1008.         inc     cl
  1009.         add     si, +2
  1010.         add     bx, +2
  1011.         dec     ch
  1012.         jnz     PushKeysLoop
  1013. toPushKeys:     xor     ch, ch
  1014.         add     cx, TmpCount
  1015.         jmp     PushEntry
  1016. PushBackKeys    endp
  1017. ;               ----------------------------
  1018. PushBackLefts   proc    near
  1019.         cmp     TmpCount, 0
  1020.         jne     PushLeftsCont
  1021.         ret
  1022. ;
  1023. PushLeftsCont:  push    bp
  1024.         push    es
  1025.         push    di
  1026.         push    si
  1027.         cli
  1028.         mov     cx, TmpCount
  1029.         jmp     PushEntry
  1030. PushBackLefts   endp
  1031. ;               ----------------------------
  1032. TreatD1         proc    near
  1033. ;
  1034. ;       IN:     [bp+4] = limit
  1035. ;
  1036.         push    bp
  1037.         mov     bp, sp
  1038.         cmp     byte ptr d1, 0
  1039.         jne     D1Skip0
  1040.         cmp     byte ptr c.key, '0'
  1041.         jne     D1Skip1
  1042.         mov     al, 10
  1043.         jmp     D1Cont0
  1044. ;
  1045. D1Skip1:        mov     al, byte ptr c.key
  1046.         sub     al, '0'
  1047. D1Cont0:        mov     byte ptr d1, al
  1048.         xor     ah, ah
  1049.         cmp     ax, word ptr [bp+4]
  1050.         jbe     D1Cont1
  1051.         mov     al, 1
  1052.         jmp     D1Ret0
  1053. ;
  1054. D1Cont1:        mov     dl, 9
  1055.         call    PmtMove
  1056.         mov     cx, 12
  1057. D1Loop0:        push    cx
  1058.         mov     dl, ' '
  1059.         call    PmtCh
  1060.         pop     cx
  1061.         loop    D1Loop0
  1062.         mov     dl, 9
  1063.         call    PmtMove
  1064.         mov     dl, byte ptr c.key
  1065.         call    PmtCh
  1066.         mov     al, 0
  1067.         jmp     D1Retn
  1068. ;
  1069. D1Skip0:        cmp     byte ptr c.key, ' '
  1070.         jne     D1Cont2
  1071.         mov     al, 1
  1072.         jmp     D1Ret0
  1073. ;
  1074. D1Cont2:        mov     bl, byte ptr c.key
  1075.         sub     bl, '0'
  1076.         mov     byte ptr d2, bl
  1077.         mov     al, d1
  1078.         mov     dl, 10
  1079.         mul     dl
  1080.         add     al, bl
  1081.         mov     byte ptr d1, al
  1082.         mov     al, 1
  1083. D1Ret0:         mov     dl, 9
  1084.         call    PmtMove
  1085.         mov     dl, ' '
  1086.         call    PmtCh
  1087. D1Retn:         pop     bp
  1088.         ret
  1089. TreatD1         endp
  1090. ;               ----------------------------
  1091. TreatDigit      proc    near
  1092.         push    bp
  1093.         mov     bp, sp
  1094.         mov     word ptr c, ax
  1095.         cmp     d1, 0
  1096.         je      TrDigCont0
  1097.         cmp     byte ptr c.key, ' '
  1098.         jne     TrDigCont0
  1099.         cmp     byte ptr mode.dmode, 5
  1100.         jb      TrDigCont0
  1101.         jmp     TrDigCont1
  1102. ;
  1103. TrDigCont0:     cmp     byte ptr mode.dmode, 0
  1104.         je      TrDigQuit
  1105.         cmp     byte ptr c.scan, 0bh
  1106.         ja      TrDigQuit
  1107.         cmp     byte ptr c.key, '0'
  1108.         jb      TrDigQuit
  1109.         cmp     byte ptr c.key, '9'
  1110.         jbe     TrDigCont1
  1111. TrDigQuit:      mov     d1, 0
  1112.         mov     ax, word ptr c
  1113.         xor     cx, cx
  1114.         jmp     TrDigRetn
  1115.  
  1116. TrDigCont1:     mov     bl, byte ptr mode.dmode
  1117.         dec     bl
  1118.         cmp     bl, 7
  1119.         jbe     TrDigCont2
  1120.         jmp     TrDigRetn
  1121. ;
  1122. TrDigCont2:     xor     bh, bh
  1123.         shl     bx, 1
  1124.         jmp     word ptr cs:DEntry[bx]
  1125. ;
  1126. DEntry          label   word
  1127.         dw      offset D1Entry
  1128.         dw      offset D2Entry
  1129.         dw      offset D3Entry
  1130.         dw      offset D4Entry
  1131.         dw      offset D5Entry
  1132.         dw      offset D6Entry
  1133.         dw      offset D7Entry
  1134.         dw      offset D8Entry
  1135. ;
  1136. D1Entry:        mov     cc1, 0a3h
  1137.         mov     al, byte ptr c.key
  1138.         add     al, 128
  1139.         mov     cc2, al
  1140.         jmp     TrDigCont3
  1141. ;
  1142. D2Entry:
  1143. D3Entry:        mov     al, byte ptr c.key
  1144.         sub     al, '0'
  1145.         shl     al, 1
  1146.         xor     bh, bh
  1147.         mov     bl, al
  1148.         cmp     byte ptr mode.dmode, 2
  1149.         je      D23Skip0
  1150.         add     bl, 20
  1151. D23Skip0:       mov     ax, word ptr dStr[bx]
  1152.         mov     cc1, al
  1153.         mov     cc2, ah
  1154.         jmp     TrDigCont3
  1155. D4Entry:
  1156. D5Entry:        mov     cc1, 0a2h
  1157.         mov     al, byte ptr c.key
  1158.         cmp     al, '0'
  1159.         jne     D45Skip0
  1160.         mov     al, 10
  1161.         jmp     D45Cont0
  1162. D45Skip0:       sub     al, '0'
  1163. D45Cont0:       push    ax
  1164.         cmp     byte ptr mode.dmode, 4
  1165.         jne     D45toD5
  1166.         mov     al, 0d8h
  1167.         jmp     D45Cont1
  1168. D45toD5:        mov     al, 0e4h
  1169. D45Cont1:       pop     dx
  1170.         add     dl, al
  1171.         mov     byte ptr cc2, dl
  1172.         jmp     TrDigCont3
  1173. D6Entry:
  1174. D7Entry:        mov     ax, 2
  1175.         push    ax
  1176.         call    TreatD1
  1177.         pop     cx
  1178.         or      al, al
  1179.         jnz     D67Cont0
  1180.         jmp     TrDigAbort
  1181. ;
  1182. D67Cont0:       cmp     byte ptr d1, 20
  1183.         jbe     D67Cont1
  1184.         mov     al, byte ptr d1
  1185.         mov     ah, 0
  1186.         mov     bl, 10
  1187.         div     bl
  1188.         mov     byte ptr d1, al
  1189. D67Cont1:       mov     byte ptr cc1, 0a2h
  1190.         mov     al, byte ptr d1
  1191.         cmp     byte ptr mode.dmode, 6
  1192.         jne     D67toD7
  1193.         add     al, 0c4h
  1194.         jmp     D67Cont2
  1195. ;
  1196. D67toD7:        add     al, 0b0h
  1197. D67Cont2:       mov     byte ptr cc2, al
  1198.         jmp     TrDigCont3
  1199. ;
  1200. D8Entry:        mov     ax, 1
  1201.         push    ax
  1202.         call    TreatD1
  1203.         pop     cx
  1204.         or      al, al
  1205.         jnz     D8Cont0
  1206.         jmp     TrDigAbort
  1207. ;
  1208. D8Cont0:        cmp     byte ptr d1, 12
  1209.         jbe     D8Skip0
  1210.         mov     al, byte ptr d1
  1211.         mov     ah, 0
  1212.         mov     bl, 10
  1213.         div     bl
  1214.         mov     byte ptr d1, al
  1215. D8Skip0:        mov     byte ptr cc1, 0a2h
  1216.         mov     al, byte ptr d1
  1217.         add     al, 0f0h
  1218.         mov     byte ptr cc2, al
  1219. ;
  1220. TrDigCont3:     mov     byte ptr d1, 0
  1221.         call    ResetSameBuf
  1222.         call    AddSame
  1223.         mov     cx, 0101h
  1224.         xor     ax, ax
  1225.         jmp     TrDigRetn
  1226. ;
  1227. TrDigAbort:     xor     cx, cx
  1228.         xor     ax, ax
  1229. TrDigRetn:      pop     bp
  1230.         ret
  1231. TreatDigit      endp
  1232. ;               ----------------------------
  1233. TreatSym        proc    near
  1234.         push    bp
  1235.         mov     bp, sp
  1236.         mov     word ptr c, ax
  1237.         cmp     byte ptr mode.smode, 1
  1238.         je      TrSymCont0
  1239.         xor     cx, cx
  1240.         jmp     TrSymRetn
  1241. ;
  1242. TrSymCont0:     lea     bx, sch1
  1243.         xor     cx, cx
  1244. SymLoop0:       mov     dl, [bx]
  1245.         or      dl, dl
  1246.         jz      TrSymCont1
  1247.         cmp     al, dl
  1248.         je      SymMatch0
  1249.         inc     cl
  1250.         inc     bx
  1251.         jmp     SymLoop0
  1252. SymMatch0:      jmp     TrSymRet0
  1253. ;
  1254. TrSymCont1:     xor     cx, cx
  1255.         lea     bx, sch2
  1256. SymLoop1:       mov     dl, [bx]
  1257.         or      dl, dl
  1258.         jz      Sym2No
  1259.         cmp     al, dl
  1260.         je      SymMatch1
  1261.         inc     bx
  1262.         inc     cl
  1263.         cmp     cl, 6
  1264.         jb      SymLoop1
  1265. Sym2No:         mov     ax, word ptr c
  1266.         xor     cx, cx
  1267.         jmp     TrSymRetn
  1268. SymMatch1:      mov     ch, cl
  1269.         mov     dl, 01h
  1270.         shl     dl, cl
  1271.         test    SymMark, dl
  1272.         jz      isQuote1
  1273.         not     dl
  1274.         and     SymMark, dl
  1275.         mov     bl, ch
  1276.         shl     bl, 1
  1277.         add     bl, 27
  1278.         mov     cl, bl
  1279.         jmp     TrSymRet0
  1280. ;
  1281. isQuote1:       mov     ch, cl
  1282.         mov     dl, 1
  1283.         shl     dl, cl
  1284.         or      SymMark, dl
  1285.         mov     bl, cl
  1286.         shl     bl, 1
  1287.         add     bl, 26
  1288.         mov     cl, bl
  1289. ;
  1290. TrSymRet0:      push    cx
  1291.         call    ResetSameBuf
  1292.         pop     cx
  1293.         mov     bl, cl
  1294.         xor     bh, bh
  1295.         shl     bx, 1
  1296.         mov     ax, word ptr sym[bx]
  1297.         mov     cc1, al
  1298.         mov     cc2, ah
  1299.         call    AddSame
  1300.         xor     ax, ax
  1301.         mov     cx, 0101h
  1302. TrSymRetn:      pop     bp
  1303.         ret
  1304. TreatSym        endp
  1305. ;               ----------------------------
  1306. TreatPad        proc    near
  1307.         push    bp
  1308.         mov     bp, sp
  1309.         push    si
  1310.         mov     word ptr c, ax
  1311.         cmp     byte ptr mode.kmode, 9
  1312.         je      TrPadQuit
  1313.         cmp     byte ptr mode.pmode, 0
  1314.         jne     TrPadCont0
  1315. TrPadQuit:      xor     cx, cx
  1316.         jmp     TrPadRetn
  1317. ;
  1318. TrPadCont0:     lea     si, KeyCode
  1319.         lea     bx, ScanCode
  1320.         xor     cl, cl
  1321. PadLoop0:       mov     al, [si]
  1322.         mov     ah, [bx]
  1323.         cmp     ax, word ptr c
  1324.         je      toPadMatch0
  1325.         inc     si
  1326.         inc     bx
  1327.         inc     cl
  1328.         cmp     cl, 15
  1329.         jb      PadLoop0
  1330.         mov     ax, word ptr c
  1331.         xor     cx, cx
  1332.         jmp     TrPadRetn
  1333. ;
  1334. toPadMatch0:    cmp     byte ptr mode.pmode, 5
  1335.         jne     TrPadCont1
  1336.         mov     ax, word ptr c
  1337.         call    TreatDigit
  1338.         jmp     TrPadRetn
  1339. ;
  1340. TrPadCont1:     push    cx
  1341.         call    ResetSameBuf
  1342.         mov     al, byte ptr mode.pmode
  1343.         dec     al
  1344.         xor     ah, ah
  1345.         mov     bl, 30
  1346.         mul     bl
  1347.         mov     si, ax
  1348.         add     si, offset PadCode
  1349.         pop     bx
  1350.         xor     bh, bh
  1351.         shl     bx, 1
  1352.         mov     ax, word ptr [si+bx]
  1353.         mov     cc1, al
  1354.         mov     cc2, ah
  1355.         call    AddSame
  1356.         xor     ax, ax
  1357.         mov     cx, 0101h
  1358. ;
  1359. TrPadRetn:      pop     si
  1360.         pop     bp
  1361.         ret
  1362. TreatPad        endp
  1363. ;               ----------------------------
  1364. Ascii           proc    near
  1365.         xor     cx, cx
  1366.         inc     ax
  1367.         jz      AsciiCont0
  1368.         dec     ax
  1369. AsciiCont0:     mov     word ptr c, ax
  1370.         retf
  1371. Ascii           endp
  1372. ;               ----------------------------
  1373. ResetSameBuf    proc    near
  1374.         mov     SameNum, 0
  1375.         mov     cx, 11
  1376.         lea     bx, SameBuf
  1377.         xor     al, al
  1378. ReSameLoop:     mov     byte ptr [bx], al
  1379.         add     al, 16
  1380.         inc     bx
  1381.         loop    ReSameLoop
  1382.         ret
  1383. ResetSameBuf    endp
  1384. ;               ----------------------------
  1385. AddSame         proc    near
  1386.         xor     bh, bh
  1387.         mov     bl, SameNum
  1388.         mov     bl, SameBuf[bx]
  1389.         add     bl, 16
  1390.         mov     al, cc1
  1391.         mov     ah, cc2
  1392.         mov     word ptr SameBuf[bx], ax
  1393.         mov     byte ptr SameBuf[bx+2], 0
  1394.         inc     SameNum
  1395.         ret
  1396. AddSame         endp
  1397. ;               ----------------------------
  1398. DispSames       proc    near
  1399.         mov     dl, 22
  1400.         call    PmtMove
  1401.         xor     cl, cl
  1402. dSameLoop:      cmp     cl, SameNum
  1403.         jae     dSameEnd
  1404.         cmp     cl, 10
  1405.         jae     dSameEnd
  1406.         push    cx
  1407.         mov     al, cl
  1408.         add     al, '0'
  1409.         cmp     byte ptr SameNum, 9
  1410.         jne     dSameSkip0
  1411.         inc     al
  1412. dSameSkip0:     mov     byte ptr Numb+3, al
  1413.         mov     ax, offset Numb
  1414.         push    cx
  1415.         push    ax
  1416.         call    PmtS
  1417.         pop     ax
  1418.         pop     bx
  1419.         xor     bh, bh
  1420.         mov     bl, SameBuf[bx]
  1421.         add     bl, 16
  1422.         lea     dx, SameBuf
  1423.         add     dx, bx
  1424.         push    dx
  1425.         call    PmtS
  1426.         pop     dx
  1427.         pop     cx
  1428.         inc     cl
  1429.         jmp     dSameLoop
  1430. dSameEnd:       ret
  1431. DispSames       endp
  1432. ;               ----------------------------
  1433. ClrLine         proc    near
  1434.         or      IntrBusy, I16Busy
  1435.         mov     ch, KeyNum
  1436.         add     ch, 9
  1437.         mov     cl, 70
  1438.         sub     cl, ch
  1439.         xor     ch, ch
  1440. ClrLoop0:       mov     ax, 1403h
  1441.         mov     bl, bAttr
  1442.         mov     dl, ' '
  1443.         int     10h
  1444.         loop    ClrLoop0
  1445.         mov     pmtx, 22
  1446.         call    MakeInBox
  1447.         and     IntrBusy, NOT I16Busy
  1448.         ret
  1449. ClrLine         endp
  1450. ;               ----------------------------
  1451. prKeys          proc    near
  1452.         or      IntrBusy, I16Busy
  1453.         push    ax
  1454.         mov     ax, 1402h
  1455.         mov     dl, 9
  1456.         int     10h
  1457.         mov     cl, KeyNum
  1458.         inc     cl
  1459.         xor     bx, bx
  1460. prKeyLoop:      push    bx
  1461.         push    cx
  1462.         mov     ax, 1403h
  1463.         mov     dl, KeyBuf[bx]
  1464.         mov     bl, kAttr
  1465.         and     bl, 0fh
  1466.         or      bl, bAttr
  1467.         int     10h
  1468.         pop     cx
  1469.         pop     bx
  1470.         inc     bx
  1471.         loop    prKeyLoop
  1472.         call    ClrLine
  1473.         pop     ax
  1474.         and     IntrBusy, NOT I16Busy
  1475.         ret
  1476. prKeys          endp
  1477. ;               ----------------------------
  1478. TreatKeys       proc    near
  1479.         push    bp
  1480.         mov     bp, sp
  1481.         test    IntrBusy, I10Busy OR KeyBusy
  1482.         jz      TrKeysCont0
  1483. TrKeysQuit:     jmp     TrKeysRetn
  1484. ;
  1485. TrKeysCont0:    or      IntrBusy, KeyBusy
  1486. TrKeysLoop:     call    PushBackLefts
  1487.         call    GetChar
  1488.         or      ax, ax
  1489.         jnz     TrKeysContc
  1490.         jmp     TrKeysAbort
  1491. ;
  1492. TrKeysContc:    push    es
  1493.         xor     dx, dx
  1494.         mov     es, dx
  1495.         test    byte ptr es:[417h], 40h
  1496.         pop     es
  1497.         jnz     TrKeysContk
  1498.         call    TreatPad
  1499.         cmp     cx, 0101h
  1500.         je      TrKeysPushStr
  1501.         or      ax, ax
  1502.         jz      TrKeysCont1
  1503.         call    dword ptr KeyinProc
  1504.         cmp     cx, 0101h
  1505.         je      TrKeysPushStr
  1506.         or      ax, ax
  1507.         jz      TrKeysCont1
  1508.         call    TreatDigit
  1509.         cmp     cx, 0101h
  1510.         je      TrKeysPushStr
  1511.         or      ax, ax
  1512.         jz      TrKeysCont1
  1513.         call    TreatSym
  1514.         cmp     cx, 0101h
  1515.         je      TrKeysPushStr
  1516.         or      ax, ax
  1517.         jz      TrKeysCont1
  1518. ;
  1519. TrKeysContk:    cmp     ax, 0ffffh
  1520.         je      TrKeysContx
  1521.         jmp     TrKeysPushIt
  1522. ;
  1523. TrKeysCont1:    cmp     ch, 1
  1524.         jne     TrKeysCont2
  1525.         mov     KeyEnd, 1
  1526.         cmp     cl, 1
  1527.         ja      TrKeysCont2
  1528.         jb      TrKeysCont3
  1529.         xor     ax, ax
  1530. TrKeysPushStr:  push    ax
  1531.         xor     ax, ax
  1532.         push    ax
  1533.         mov     ax, offset SameBuf+16
  1534.         push    ax
  1535.         call    PushBackStr
  1536.         pop     cx
  1537.         pop     cx
  1538.         pop     ax
  1539.         or      ax, ax
  1540.         jnz     TrKeysNext
  1541.         jmp     TrKeysContx
  1542. ;
  1543. TrKeysNext:     mov     KeyEnd, 0
  1544.         jmp     TrKeysContc
  1545. ;
  1546. TrKeysPushIt:   mov     word ptr c, ax
  1547.         mov     ax, 1
  1548.         push    ax
  1549.         mov     ax, offset c
  1550.         push    ax
  1551.         call    PushBackKeys
  1552.         pop     cx
  1553.         pop     cx
  1554.         jmp     TrKeysContx
  1555. ;
  1556. TrKeysCont2:    mov     SameNum, cl
  1557.         jmp     TrKeysLoop
  1558. ;
  1559. TrKeysCont3:    call    beep
  1560. TrKeysContx:    mov     KeyEnd, 0
  1561.         jmp     TrKeysLoop
  1562. ;
  1563. TrKeysAbort:    and     IntrBusy, NOT KeyBusy
  1564. TrKeysRetn:     pop     bp
  1565.         ret
  1566. TreatKeys       endp
  1567. ;               ----------------------------
  1568. NewInt09        proc    far
  1569.         sti
  1570.         test    cs:IntrBusy, I09Busy
  1571.         jz      toNew09
  1572.         jmp     dword ptr cs:OldInt09
  1573. ;
  1574. toNew09:        pusha
  1575.         push    es
  1576.         push    ds
  1577.         mov     ax, cs
  1578.         mov     ds, ax
  1579. ;
  1580. I09toNew:       or      IntrBusy, I09Busy
  1581.         mov     NopTime, 0
  1582.         cmp     DisplayOpen, 0
  1583.         jne     I09Skip0
  1584.         call    OpenDisplay
  1585. I09Skip0:       xor     ax, ax
  1586.         mov     es, ax
  1587.         mov     bl, es:[41ch]
  1588.         mov     byte ptr int9in, bl
  1589.         mov     al, es:[417h]
  1590.         and     al, 07h
  1591.         mov     CtrlShift, al
  1592.         pushf
  1593.         call    dword ptr OldInt09
  1594.         cli
  1595.         mov     bl, es:[41ch]
  1596.         cmp     bl, es:[41ah]
  1597.         je      I09TestCmd
  1598.         cmp     bl, byte ptr int9in
  1599.         je      I09TestCmd
  1600.         mov     bh, 04h
  1601.         cmp     bl, 1eh
  1602.         jbe     I09RePntr
  1603.         dec     bl
  1604.         dec     bl
  1605.         jmp     I09Cont0
  1606. ;
  1607. I09TestCmd:     cmp     CtrlShift, 5
  1608.         jb      I09toRet0
  1609.         mov     al, es:[417h]
  1610.         and     al, 07h
  1611.         cmp     al, 5
  1612.         jae     I09toRet0
  1613.         xor     inCommand, 01h
  1614. I09toRet0:      jmp     I09Ret0
  1615. ;
  1616. I09RePntr:      mov     bl, 3ch
  1617. ;
  1618. I09Cont0:       mov     ax, es:[bx]
  1619.         cmp     inCommand, 1
  1620.         je      I09Cont2
  1621.         mov     cx, ax
  1622.         cmp     cl, 08h
  1623.         je      I09SaveCur
  1624.         cmp     cl, 0e0h
  1625.         jne     I09SkipR
  1626.         xor     cl, cl
  1627. I09SkipR:       cmp     cx, UP
  1628.         jb      I09Cont1
  1629.         cmp     cx, DEL
  1630.         ja      I09Cont1
  1631. I09SaveCur:     mov     CurKey, cx
  1632.         call    SaveCurEnv
  1633.         jmp     I09Contx
  1634. ;
  1635. I09Cont1:       mov     CurKey, 0
  1636. ;
  1637. I09Contx:       cmp     MyMode, 1
  1638.         jne     I09toRet0
  1639.         cmp     byte ptr mode.kmode, 9
  1640.         je      I09toRet0
  1641. I09Cont2:       mov     es:[41ch], bl
  1642.         mov     bx, pushin
  1643.         lea     dx, Int9Buf
  1644.         mov     cx, dx
  1645.         add     dx, 62
  1646.         cmp     bx, dx
  1647.         je      I09ReBuf
  1648.         mov     dx, bx
  1649.         inc     dx
  1650.         inc     dx
  1651.         jmp     I09TestBuf
  1652. ;
  1653. I09ReBuf:       mov     dx, cx
  1654. I09TestBuf:     cmp     dx, popout
  1655.         je      I09BufOver
  1656.         mov     [bx], ax
  1657.         mov     pushin, dx
  1658.         jmp     I09Ret0
  1659. ;
  1660. I09BufOver:     call    beep
  1661. ;
  1662. I09Ret0:        and     IntrBusy, NOT I09Busy
  1663. I09Retn:        sti
  1664.         cmp     inOld16, 1
  1665.         jne     I09SkipKeys
  1666.         call    TreatKeys
  1667. I09SkipKeys:    pop     ds
  1668.         pop     es
  1669.         popa
  1670.         iret
  1671. NewInt09        endp
  1672. ;               ----------------------------
  1673. GetCurKmode     proc    near
  1674. ;
  1675. ;       OUT:    ah = 0
  1676. ;               al = kmode (0 - 9)
  1677. ;               bh = dmode
  1678. ;               bl = smode
  1679. ;               ch = pmode
  1680. ;
  1681.         xor     ah, ah
  1682.         mov     al, byte ptr mode.kmode
  1683.         mov     bh, byte ptr mode.dmode
  1684.         mov     bl, byte ptr mode.smode
  1685.         mov     ch, byte ptr mode.pmode
  1686.         mov     [bp+16], ax
  1687.         mov     [bp+14], bx
  1688.         mov     [bp+12], cx
  1689.         ret
  1690. GetCurKmode     endp
  1691. ;               ----------------------------
  1692. InstallKeyProc  proc    near
  1693. ;
  1694. ;       IN:     al = kmode(1 -- 7)
  1695. ;               es:bx = KeyProc Entry
  1696. ;               es:dx = EName Str
  1697. ;               di = psp
  1698. ;       OUT:
  1699. ;               Ok) ah = 0;  es:bx = &SameBuf
  1700. ;               Fail) ah != 0;
  1701. ;
  1702.         cmp     al, 1
  1703.         jb      InsKeyRetn
  1704.         cmp     al, 7
  1705.         ja      InsKeyRetn
  1706.         push    ax
  1707.         push    bx
  1708.         mov     bl, ISstrucSize
  1709.         mul     bl
  1710.         mov     si, ax
  1711.         add     si, offset ISentries
  1712.         cmp     byte ptr [si+11], 0
  1713.         pop     bx
  1714.         pop     ax
  1715.         jne     InsKeyRetn
  1716.         mov     [si+14], es
  1717.         mov     [si+12], bx
  1718.         xor     bh, bh
  1719.         mov     bl, 'Y'
  1720.         mov     [si+11], bl
  1721.         mov     [si+ 9], di
  1722.         mov     [si+ 8], bh
  1723.         mov     cx, 4
  1724.         mov     bx, dx
  1725. InsKeyLoop:     mov     ax, es:[bx]
  1726.         mov     [si], ax
  1727.         add     bx, 2
  1728.         add     si, 2
  1729.         loop    InsKeyLoop
  1730.         xor     ax, ax
  1731. InsKeyRet0:     mov     [bp+16], ax
  1732.         lea     bx, SameBuf
  1733.         mov     [bp+14], bx
  1734.         mov     ax, ds
  1735.         mov     [bp+ 8], ax  ; es:bx = Addr of SameBuf[]
  1736.         ret
  1737. ;
  1738. InsKeyRetn:     mov     ax, 8080h
  1739.         mov     [bp+16], ax
  1740.         ret
  1741. InstallKeyProc  endp
  1742. ;               ----------------------------
  1743. SetCurKmode     proc    near
  1744. ;
  1745. ;       IN:     ah = 32h
  1746. ;               al = 0 ... Set Kmode
  1747. ;               al = 1 ... Set Dmode
  1748. ;               al = 2 ... Set Smode
  1749. ;               al = 3 ... Set Pmode
  1750. ;               bh = mode value
  1751. ;       OUT:    Ok) ah = 0
  1752. ;               no) ah != 0
  1753. ;
  1754.         cmp     al, 0
  1755.         je      goSetKmode
  1756.         cmp     al, 1
  1757.         je      goSetDmode
  1758.         cmp     al, 2
  1759.         je      goSetSmode
  1760.         cmp     al, 3
  1761.         je      goSetPmode
  1762.         jmp     SetCurRetn
  1763. ;
  1764. goSetDmode:     cmp     bh, 8
  1765.         ja      SetCurRetn
  1766.         mov     byte ptr mode.dmode, bh
  1767.         jmp     SetCurRet0
  1768. ;
  1769. goSetSmode:     cmp     bh, 1
  1770.         ja      SetCurRetn
  1771.         mov     byte ptr mode.smode, bh
  1772.         jmp     SetCurRet0
  1773. ;
  1774. goSetPmode:     cmp     bh, 5
  1775.         ja      SetCurRetn
  1776.         mov     byte ptr mode.pmode, bh
  1777.         jmp     SetCurRet0
  1778. ;
  1779. goSetKmode:     mov     byte ptr tmpmode, bh
  1780.         call    SetKmode
  1781.         or      al, al
  1782.         je      SetCurRetn
  1783.         call    message
  1784. SetCurRet0:     xor     ax, ax
  1785. SetCurExit:     mov     [bp+16], ax
  1786.         ret
  1787. ;
  1788. SetCurRetn:     mov     ax, 8080h
  1789.         jmp     SetCurExit
  1790. SetCurKmode     endp
  1791. ;               ----------------------------
  1792. GetEncode       proc    near
  1793.         ret
  1794. GetEncode       endp
  1795. ;               ----------------------------
  1796. InstallWLib     proc    near
  1797. ;
  1798. ;       IN:     ah = 3ch
  1799. ;               al = 0 ... Standard WORDLib
  1800. ;               al = 1 ... User Def WORDLib
  1801. ;               cx = Lib Length
  1802. ;               es:bx = Lib Address
  1803. ;       OUT:    ax = 0 ... Ok
  1804. ;               ax != 0 .. Fail
  1805. ;
  1806.         cmp     al, 1
  1807.         jb      toInsStdWLib
  1808.         je      toInsUsrWLib
  1809.         jmp     InsWLibRetn
  1810. ;
  1811. toInsStdWLib:   cmp     wHas, 0
  1812.         jne     InsWLibRetn
  1813.         mov     wLen, cx
  1814.         mov     word ptr wProc, bx
  1815.         mov     word ptr wProc+2, es
  1816.         mov     wHas, 1
  1817.         jmp     InsWLibRet0
  1818. toInsUsrWLib:   cmp     uHas, 0
  1819.         jne     InsWLibRetn
  1820.         mov     uLen, cx
  1821.         mov     word ptr uProc, bx
  1822.         mov     word ptr uProc+2, es
  1823.         mov     uHas, 1
  1824. InsWLibRet0:    xor     ax, ax
  1825. InsWLibExit:    mov     [bp+16], ax
  1826.         ret
  1827. InsWLibRetn:    mov     ax, 8080h
  1828.         jmp     InsWLibExit
  1829. InstallWLib     endp
  1830. ;               ----------------------------
  1831. GetWordCC1      proc    near
  1832. ;
  1833. ;       IN:     ah = 39h
  1834. ;               al = 0 ... Get WLib First CC
  1835. ;               al = 1 ... Get WLib Next  CC
  1836. ;       OUT:    ah = 0 ... Ok
  1837. ;                    dx = CC
  1838. ;               ah != 0 .. Fail
  1839. ;                    dx = 0
  1840. ;
  1841.         cmp     cs:wHas, 1
  1842.         jne     toCCRetn
  1843.         cmp     al, 1
  1844.         ja      toCCRetn
  1845. ;
  1846.         call    dword ptr cs:wProc
  1847.         iret
  1848. ;
  1849. toCCRetn:       mov     ax, 8080h
  1850.         iret
  1851. GetWordCC1      endp
  1852. ;               ----------------------------
  1853. GetWord         proc    near
  1854. ;
  1855. ;       IN:     ah = 3ah
  1856. ;               al = 0 ... Get First WORD of Specify CC
  1857. ;                  dx = CC
  1858. ;               al = 1 ... Get Next
  1859. ;               al = 2 ... Get StdCWLib Addr
  1860. ;               al = 3 ... Get UsrCWLib Addr
  1861. ;                  
  1862. ;               es:bx = buffer
  1863. ;       OUT:    ah = 0    ... Ok
  1864. ;                  es:bx = CCWord String
  1865. ;                  cx = CC Num
  1866. ;               ah != 80h ... Fail
  1867. ;               es:bx = &StdCWlib (IN: al = 2)
  1868. ;               es:bx = &UsrCWlib (IN: al = 3)
  1869. ;               cx    = CWLibLen (IN: al = 2/3)
  1870. ;
  1871.         cmp     al, 3
  1872.         je      toUsrAddr
  1873.         ja      toCWRetn
  1874. ;
  1875.         cmp     cs:wHas, 1
  1876.         jne     toCWRetn
  1877.         call    dword ptr cs:wProc
  1878.         iret
  1879. ;
  1880. toUsrAddr:      cmp     cs:uHas, 1
  1881.         jne     toCWRetn
  1882.         call    dword ptr cs:uProc
  1883.         iret
  1884. ;
  1885. toCWRetn:       mov     ax, 8080h
  1886.         iret
  1887. GetWord         endp
  1888. ;               ----------------------------
  1889. unLoadKey       proc    near
  1890. ;
  1891. ;       IN:     ah = 34h
  1892. ;               al = kmode(1 -- 7)
  1893. ;       OUT:    ah = 0  ... Ok
  1894. ;               ah != 0 ... Fail
  1895. ;
  1896.         cmp     al, 1
  1897.         jb      UnInsKeyRetn
  1898.         cmp     al, 7
  1899.         jbe     UnInsKeyCont0
  1900. UnInsKeyRetn:   mov     ax, 8080h
  1901.         jmp     UnInsKeyExit
  1902. ;
  1903. UnInsKeyCont0:  mov     tmpmode, al
  1904.         mov     bl, ISstrucSize
  1905.         mul     bl
  1906.         lea     si, ISentries
  1907.         add     si, ax
  1908.         cmp     byte ptr [si+11], 'Y'
  1909.         je      UnInsKeyCont1
  1910.         jmp     UnInsKeyRetn
  1911. ;
  1912. UnInsKeyCont1:  mov     byte ptr [si+11], 0
  1913.         mov     ax, 0ffffh
  1914.         mov     bl, 0ffh
  1915.         mov     bh, tmpmode
  1916.         call    dword ptr [si+12]
  1917. ;
  1918. UnInsKeyCont3:  mov     al, tmpmode
  1919.         cmp     al, byte ptr mode.kmode
  1920.         jne     UnInsKeyRet0
  1921.         mov     tmpmode, 9
  1922.         call    SetKmode
  1923.         call    message
  1924. UnInsKeyRet0:   xor     ax, ax
  1925. UnInsKeyExit:   ret
  1926. unLoadKey       endp
  1927. ;               ----------------------------
  1928. UnInsKeyProc    proc    near
  1929.         call    unLoadKey
  1930.         mov     [bp+16], ax
  1931.         ret
  1932. UnInsKeyProc    endp
  1933. ;               ----------------------------
  1934. FreeStWord      proc    near
  1935.         mov     ax, 3e00h
  1936.         call    dword ptr wProc
  1937.         mov     wHas, 0
  1938.         ret
  1939. FreeStWord      endp
  1940. ;               ----------------------------
  1941. FreeUsrWord     proc    near
  1942.         mov     ax, 3e01h
  1943.         call    dword ptr uProc
  1944.         mov     uHas, 0
  1945.         ret
  1946. FreeUsrWord     endp
  1947. ;               ----------------------------
  1948. UnInstallWLib   proc    near
  1949. ;
  1950. ;       IN:     ah = 3eh
  1951. ;               al = 0 ... uninstall StdWLib
  1952. ;               al = 1 ... uninstall UsrWLib
  1953. ;       OUT:    ax = 0 ... Ok
  1954. ;               ax != 0 .. Fail
  1955. ;
  1956.         cmp     al, 1
  1957.         ja      UnInsWRetn
  1958.         je      UnInsUsrWLib
  1959.         cmp     wHas, 1
  1960.         jne     UnInsWRetn
  1961.         call    dword ptr wProc
  1962.         mov     wHas, 0
  1963.         jmp     UnInsWRet0
  1964. ;
  1965. UnInsUsrWLIb:   cmp     uHas, 1
  1966.         jne     UnInsWRetn
  1967.         call    dword ptr uProc
  1968.         mov     uHas, 0
  1969. UnInsWRet0:     xor     ax, ax
  1970. UnInsWExit:     mov     [bp+16], ax
  1971.         ret
  1972. ;
  1973. UnInsWRetn:     mov     ax, 8080h
  1974.         jmp     UnInsWExit
  1975. UnInstallWLib   endp
  1976. ;               ----------------------------
  1977. quit            proc    near
  1978. ;
  1979. ;       IN:     ah = 81h
  1980. ;
  1981.         xor     ax, ax
  1982.         mov     es, ax
  1983.         mov     bx, cs
  1984.         mov     cx, es:[20h]           ; Int 08h
  1985.         mov     dx, es:[22h]
  1986.         cmp     dx, seg NewInt08
  1987.         je      QuitCont0
  1988. toQuitRetn:     mov     ax, 8080h
  1989.         jmp     QuitExit
  1990. ;
  1991. QuitCont0:      cmp     cx, offset NewInt08
  1992.         jne     toQuitRetn
  1993.         mov     cx, es:[24h]
  1994.         mov     dx, es:[26h]           ; Int 09h
  1995.         cmp     cx, offset NewInt09
  1996.         jne     toQuitRetn
  1997.         cmp     dx, seg NewInt09
  1998.         jne     toQuitRetn
  1999.         mov     cx, es:[40h]
  2000.         mov     dx, es:[42h]
  2001.         cmp     cx, offset NewInt10
  2002.         jne     toQuitRetn
  2003.         cmp     dx, seg NewInt10
  2004.         jne     toQuitRetn
  2005.         mov     cx, es:[4ch]
  2006.         mov     dx, es:[4eh]
  2007.         cmp     cx, offset NewInt13
  2008.         jne     toQuitRetn
  2009.         cmp     dx, seg NewInt13
  2010.         jne     toQuitRetn
  2011.         mov     cx, es:[58h]
  2012.         mov     dx, es:[5ah]
  2013.         cmp     cx, offset NewInt16
  2014.         jne     toQuitRetn
  2015.         cmp     dx, seg NewInt16
  2016.         jne     toQuitRetn
  2017.         mov     cx, es:[70h]
  2018.         mov     dx, es:[72h]
  2019.         cmp     cx, offset NewInt1c
  2020.         jne     toQuitRetn
  2021.         cmp     dx, seg NewInt1c
  2022.         jne     toQuitRetn
  2023.         push    ds
  2024.         cli
  2025.         lds     dx, cs:OldInt08
  2026.         mov     ax, 2508h
  2027.         int     21h
  2028.         lds     dx, cs:OldInt09
  2029.         mov     ax, 2509h
  2030.         int     21h
  2031.         lds     dx, cs:OldInt10
  2032.         mov     ax, 2510h
  2033.         int     21h
  2034.         lds     dx, cs:OldInt13
  2035.         mov     ax, 2513h
  2036.         int     21h
  2037.         lds     dx, cs:OldInt16
  2038.         mov     ax, 2516h
  2039.         int     21h
  2040.         lds     dx, cs:OldInt1c
  2041.         mov     ax, 251ch
  2042.         int     21h
  2043.         sti
  2044.         pop     ds
  2045.         cmp     wHas, 0
  2046.         je      QuitSkip0
  2047.         call    FreeStWord
  2048. QuitSkip0:      cmp     uHas, 0
  2049.         je      QuitSkip1
  2050.         call    FreeUsrWord
  2051. QuitSkip1:      mov     cl, 1
  2052.         lea     bx, ISentries
  2053. QuitLoop0:      cmp     cl, 7
  2054.         ja      QuitCont1
  2055.         add     bx, 16
  2056.         inc     cl
  2057.         cmp     byte ptr [bx+11], 'Y'
  2058.         jne     QuitLoop0
  2059.         push    bx
  2060.         push    cx
  2061.         mov     ah, 34h
  2062.         mov     al, cl
  2063.         dec     al
  2064.         call    unLoadKey
  2065.         pop     cx
  2066.         pop     bx
  2067.         jmp     QuitLoop0
  2068. ;
  2069. QuitCont1:      cmp     prHas, 0
  2070.         je      QuitCont2
  2071.         mov     ah, 81h
  2072.         int     17h
  2073. ;
  2074. QuitCont2:      mov     es, ChcsEnv
  2075.         mov     ah, 49h
  2076.         int     21h
  2077.         mov     es, ChcsPsp
  2078.         mov     ah, 49h
  2079.         int     21h
  2080.         mov     ah, 81h
  2081.         int     16h
  2082.         call    VModeToEmode
  2083.         xor     ax, ax
  2084. QuitExit:       mov     [bp+16], ax
  2085.         ret
  2086. quit            endp
  2087. ;               ----------------------------
  2088. ClockControl    proc    near
  2089. ;
  2090. ;       IN:     ah = 29h
  2091. ;               al = 0 ... Clock On
  2092. ;               al = 1 ... Clock Off
  2093. ;               al = 2 ... Get Clock Status
  2094. ;
  2095.         cmp     al, 1
  2096.         jb      toClockOn
  2097.         je      toClockOff
  2098.         cmp     al, 2
  2099.         ja      ClockRet0
  2100.         mov     al, ClockSwitch
  2101.         xor     al, 01h
  2102.         xor     ah, ah
  2103.         jmp     ClockRet0
  2104. ;
  2105. toClockOn:      mov     ClockSwitch, 1
  2106.         xor     ax, ax
  2107.         jmp     ClockRet0
  2108. ;
  2109. toClockOff:     mov     ClockSwitch, 0
  2110.         xor     ax, ax
  2111. ClockRet0:      mov     [bp+16], ax
  2112.         ret
  2113. ClockControl    endp
  2114. ;               ----------------------------
  2115. GetVersion      proc    near
  2116. ;
  2117. ;       IN:     ax = 3f00h
  2118. ;       OUT:    ah = 0
  2119. ;               al = version
  2120. ;               es:bx = Message
  2121. ;
  2122.         mov     ax, 0100h
  2123.         mov     dx, cs
  2124.         lea     bx, ver
  2125.         mov     [bp+16], ax
  2126.         mov     [bp+14], bx
  2127.         mov     [bp+ 8], dx
  2128.         ret
  2129. ;
  2130. ver             db      0dh, 0ah, 9
  2131.         db      'CHCS │╔╚╗┬δ╓╨╬─╧╡═│ Ver 1.0░µ'
  2132.         db      0dh, 0ah, 9
  2133.         db      'Copyright (c) 1993,1994 │┬╜¡─■'
  2134.         db      0dh, 0ah, '$'
  2135. GetVersion      endp
  2136. ;               ----------------------------
  2137. GetSysStatus    proc    near
  2138. ;
  2139. ;       IN:     ax = 3f01h
  2140. ;       OUT:    ah.b0 = Lpr Driver
  2141. ;               ah.b1 = wch Driver
  2142. ;               al    = DispMode
  2143. ;               bh    = CurTextMode
  2144. ;               bl.b0 = inGrCursor
  2145. ;               bl.b1 = ClockSwitch
  2146. ;               bl.b2 = isTreatCC
  2147. ;               bl.b3 = inTreatTab
  2148. ;               si    = VRamSEG
  2149. ;
  2150.         mov     al, DispMode
  2151.         mov     bh, CurTextMode
  2152.         mov     bl, inGrCursor
  2153.         mov     ah, ClockSwitch
  2154.         mov     cl, 1
  2155.         shl     ah, cl
  2156.         or      bl, ah
  2157.         mov     ah, isTreatCC
  2158.         inc     cl
  2159.         shl     ah, cl
  2160.         or      bl, ah
  2161.         mov     ah, isTreatTab
  2162.         inc     cl
  2163.         shl     ah, cl
  2164.         or      bl, ah
  2165.         mov     ah, wHas
  2166.         inc     cl
  2167.         shl     ah, cl
  2168.         or      bl, ah
  2169.         mov     ah, uHas
  2170.         inc     cl
  2171.         shl     ah, cl
  2172.         or      bl, ah
  2173.         mov     ah, prFontHas
  2174.         inc     cl
  2175.         shl     ah, cl
  2176.         or      bl, ah
  2177.         mov     ah, prHas
  2178.         inc     cl
  2179.         shl     ah, cl
  2180.         or      bl, ah
  2181.         xor     ah, ah
  2182.         mov     [bp+16], ax
  2183.         mov     [bp+14], bx
  2184.         mov     ax, VRamSEG
  2185.         mov     [bp+ 4], ax
  2186.         ret
  2187. GetSysStatus    endp
  2188. ;               ----------------------------
  2189. SysControl      proc    near
  2190. ;
  2191. ;       IN:     ax = 3F10h
  2192. ;               bh = 0 ... VMode Control
  2193. ;                  bl = 0 ... Set VMode to CE mode
  2194. ;                  bl = 1 ... Set VMode to C mode
  2195. ;                  bl = 2 ... Set VMode to E mode
  2196. ;               bh = 1 ... Cursor Control
  2197. ;                  bl = 0 ... Click Cursor
  2198. ;                  bl = 1 ... Static Cursor
  2199. ;               bh = 2 ... Clock Control
  2200. ;                  bl = 0 ... Clock Off
  2201. ;                  bl = 1 ... Clock On
  2202. ;               bh = 3 ... TreatCC Control
  2203. ;                  bl = 0 ... TreatCC Off
  2204. ;                  bl = 1 ... TreatCC On
  2205. ;               bh = 4 ... TreatTab Control
  2206. ;                  bl = 0 ... TreatTab Off
  2207. ;                  bl = 1 ... TreatTab On
  2208. ;
  2209.         mov     ax, bx
  2210.         cmp     bh, 0
  2211.         je      SysCtrlVMode
  2212.         cmp     bl, 1
  2213.         ja      SysCtrlRetn
  2214.         cmp     bh, 1
  2215.         je      SysCtrlCursor
  2216.         cmp     bh, 2
  2217.         je      SysCtrlClock
  2218.         cmp     bh, 3
  2219.         je      SysCtrlTrCC
  2220.         cmp     bh, 4
  2221.         je      SysCtrlTab
  2222. SysCtrlRetn:    ret
  2223. ;
  2224. SysCtrlVMode:   cmp     al, 2
  2225.         ja      SysCtrlRetn
  2226.         je      SysToEmode
  2227.         mov     bh, al
  2228.         call    VModeToCmode
  2229.         ret
  2230. ;
  2231. SysToEmode:     call    VModeToEmode
  2232.         ret
  2233. ;
  2234. SysCtrlCursor:  mov     inGrCursor, al
  2235.         ret
  2236. ;
  2237. SysCtrlClock:   mov     ClockSwitch, al
  2238.         ret
  2239. ;
  2240. SysCtrlTrCC:    mov     isTreatCC, al
  2241.         ret
  2242. ;
  2243. SysCtrlTab:     mov     isTreatTab, al
  2244.         ret
  2245. SysControl      endp
  2246. ;               ----------------------------
  2247. CcsSysControl   proc    near
  2248. ;
  2249. ;       IN:     ah = 3fh
  2250. ;               al = 00h ... Get CCS Version
  2251. ;               al = 01h ... Get CCS System Status
  2252. ;               al = 10h ... CCS System Control
  2253. ;
  2254.         cmp     al, 0
  2255.         jne     toSysStatus
  2256.         call    GetVersion
  2257.         ret
  2258. ;
  2259. toSysStatus:    cmp     al, 01h
  2260.         jne     toSysCtrl
  2261.         call    GetSysStatus
  2262.         ret
  2263. ;
  2264. toSysCtrl:      cmp     al, 10h
  2265.         jne     CcsSysQuit
  2266.         call    SysControl
  2267. CcsSysQuit:     ret
  2268. CcsSysControl   endp
  2269. ;               ----------------------------
  2270. NewInt16        proc    far
  2271.         sti
  2272.         cmp     ah, 39h
  2273.         je      toKeyCC
  2274.         cmp     ah, 3ah
  2275.         je      toCWord
  2276.         cmp     ah, 81h
  2277.         je      I16Cont0
  2278.         cmp     ah, 20h
  2279.         jb      toPushLefts
  2280.         cmp     ah, 40h
  2281.         jb      I16Cont0
  2282. goOld16:        jmp     dword ptr cs:OldInt16
  2283. ;
  2284. toPushLefts:    pusha
  2285.         push    ds
  2286.         push    cs
  2287.         pop     ds
  2288.         call    TreatKeys
  2289.         pop     ds
  2290.         popa
  2291.         test    ah, 0fh
  2292.         jnz     goOld16
  2293.         mov     cs:inOld16, 1
  2294.         pushf
  2295.         call    dword ptr cs:OldInt16
  2296.         mov     cs:inOld16, 0
  2297.         iret
  2298. ;
  2299. toKeyCC:        jmp     GetWordCC1
  2300. ;
  2301. toCWord:        jmp     GetWord
  2302. ;
  2303. trunOld16:      pop     cx
  2304. toOld16:        pop     bp
  2305.         pop     di
  2306.         pop     si
  2307.         pop     ds
  2308.         pop     es
  2309.         pop     dx
  2310.         pop     cx
  2311.         pop     bx
  2312.         pop     ax
  2313.         jmp     dword ptr cs:OldInt16
  2314. ;
  2315. I16Cont0:       push    ax
  2316.         push    bx
  2317.         push    cx
  2318.         push    dx
  2319.         push    es
  2320.         push    ds
  2321.         push    si
  2322.         push    di
  2323.         push    bp
  2324.         push    cs
  2325.         pop     ds
  2326.         mov     bp, sp
  2327.         cmp     ah, 81h
  2328.         je      toQuitXCS
  2329.         cmp     ah, 30h
  2330.         jae     toNew16
  2331.         cmp     ah, 24h
  2332.         je      toRePmtLine
  2333.         cmp     ah, 29h
  2334.         je      toClockCtrl
  2335.         jmp     toOld16
  2336. ;
  2337. toRePmtLine:    call    message
  2338.         jmp     I16Retn
  2339. ;
  2340. toClockCtrl:    call    ClockControl
  2341.         jmp     I16Retn
  2342. ;
  2343. toQuitXCS:      call    quit
  2344.         jmp     I16Retn
  2345. ;
  2346. ;
  2347. toNew16:        push    ax
  2348.         mov     al, ah
  2349.         xor     ah, ah
  2350.         sub     al, 30h
  2351.         shl     ax, 1
  2352.         mov     si, ax
  2353.         pop     ax
  2354.         call    word ptr cs:I16Entry[si]
  2355. I16Retn:        pop     bp
  2356.         pop     di
  2357.         pop     si
  2358.         pop     ds
  2359.         pop     es
  2360.         pop     dx
  2361.         pop     cx
  2362.         pop     bx
  2363.         pop     ax
  2364.         iret
  2365. ;
  2366. I16Entry        label   word
  2367.         dw      offset GetCurKmode     ; 30
  2368.         dw      offset InstallKeyProc  ; 31
  2369.         dw      offset SetCurKmode     ; 32
  2370.         dw      offset GetEncode       ; 33
  2371.         dw      offset UnInsKeyProc    ; 34
  2372.         dw      offset trunOld16       ; 35
  2373.         dw      offset trunOld16       ; 36
  2374.         dw      offset trunOld16       ; 37
  2375.         dw      offset trunOld16       ; 38
  2376.         dw      offset GetWordCC1      ; 39
  2377.         dw      offset GetWord         ; 3A
  2378.         dw      offset trunOld16       ; 3B
  2379.         dw      offset InstallWLib     ; 3C
  2380.         dw      offset trunOld16       ; 3D
  2381.         dw      offset UnInstallWLib   ; 3E
  2382.         dw      offset CcsSysControl   ; 3F
  2383. ;
  2384. NewInt16        endp
  2385. ;               ----------------------------
  2386. code            ends
  2387. ;
  2388.         public  NewInt09
  2389.         public  NewInt16
  2390.         public  message
  2391.         public  ResetSameBuf
  2392.         public  AddSame
  2393.         public  prKeys
  2394.         public  PushBackKeys
  2395.         public  PushBackStr
  2396.         public  Ascii
  2397.         public  beep
  2398.         public  DispSames
  2399.         public  ver
  2400.         public  MakeAuthorStr
  2401. ;
  2402.         end
  2403.