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

  1. ;
  2. ;               xcsvga.asm
  3. ;
  4. .286
  5. code            segment byte public 'CODE'
  6.         assume  cs:code, ds:code
  7. ;
  8. include         xcs.mac
  9. ;
  10.         extrn   OldInt08:dword
  11.         extrn   OldInt09:dword
  12.         extrn   OldInt10:dword
  13.         extrn   OldInt13:dword
  14.         extrn   OldInt16:dword
  15.         extrn   OldInt1c:dword
  16.         extrn   IntrBusy:byte
  17. ;
  18.         extrn   F8x8:dword
  19.         extrn   F8x14:dword
  20.         extrn   F8x16:dword
  21.         extrn   FPntr:dword
  22. ;
  23.         extrn   bAttr:byte
  24.         extrn   nAttr:byte
  25.         extrn   kAttr:byte
  26.         extrn   sAttr:byte
  27.         extrn   eAttr:byte
  28.         extrn   CurKey:word
  29.         extrn   LastKey:word
  30. ;
  31.         extrn   MyMode:byte
  32.         extrn   CurTextMode:byte
  33.         extrn   TextMode:byte
  34.         extrn   DispMode:byte
  35. ;
  36.         extrn   inColorText:byte
  37.         extrn   inGrCursor:byte
  38.         extrn   isTreatCC:byte
  39.         extrn   DisplayOpen:byte
  40.         extrn   ClockSwitch:byte
  41.         extrn   TimeOut:word
  42.         extrn   Author:byte
  43. ;
  44.         extrn   message:near
  45.         extrn   PushBackKeys:near
  46. ;
  47. COPY            equ     0
  48. opXOR           equ     18h
  49. ;
  50. Vi600x16        db      58h
  51. Vi768x16        db      5dh
  52. Vi400x256       db      5eh
  53. Vi480x256       db      5fh
  54. Vi600x256       db      5ch
  55. Vi768x256       db      0
  56.         db      0, 0
  57. ;
  58. VRamSEG         dw      0a000h
  59. VRamSEGOff      db      0
  60. TextVRamSEG     dw      0b800h
  61. TextPageMax     db      ?
  62. ChNumX          db      4fh
  63. XMax            db      50h
  64. YMax            db      18h
  65. XbMax           dw      640
  66. YbMax           dw      480
  67. YLimit          db      19h
  68. nHigh           db      12h
  69. cHigh           db      10h
  70. CursorEnd       db      0fh
  71. CursorStart     db      0eh
  72. ;XPos            db      ?
  73. ;YPos            db      ?
  74. ;XWrt            db      ?
  75. ;YWrt            db      ?
  76. PreColor        dw      ?
  77. ;
  78. CursorEnable    db      1
  79. DrawingCursor   db      0
  80. CursorActive    db      0
  81. in43Lines       db      0
  82. inScroll        db      0
  83. inScanText      db      0
  84. inTextStr       db      0
  85. inAddNext       db      0
  86. inSetVMode      db      0
  87. FullPmtLine     db      1
  88. inCCsecond      db      0
  89. isCCleft        db      0
  90. isCCcursor      db      0
  91. inPmtOpr        db      0
  92. ticker          db      10h
  93. WaitTime        db      0
  94. BiosWait        db      0
  95. int8Busy        db      0
  96. ;
  97. NopTime         dw      0
  98. TimeEnable      db      0
  99. PmtXPos         db      0
  100. ;
  101. FontBuf         db      36 dup(?)
  102. ;
  103. inFontA         db      ?
  104. inFontB         db      ?
  105. FSetA           db      ?
  106. FSetB           db      ?
  107. ;
  108. CurPage         db      ?
  109. DrawColor       db      7
  110. DrawType        db      0
  111. BitMask         db      0ffh
  112. ;
  113. first           db      ?
  114. attr            db      ?
  115. CurX            db      ?
  116. CurY            db      ?
  117. LastX           db      ?
  118. LastY           db      ?
  119. ;
  120. attr0           db      07h
  121. ;
  122. include         char.mac
  123. ;
  124. ScrBuf          dw      BUFSIZE dup(?)
  125. ScrType         db      BUFSIZE dup(?)
  126. ;
  127. ;
  128. ;       TabChar[ '' ...  ]
  129. ;       Offset = 10h
  130.         db      21h, 22h, 00h, 00h, 00h, 00h, 00h, 00h ; 10 - 17
  131.         db      28h, 24h, 21h, 22h, 00h, 00h, 28h, 24h ; 18 - 1f
  132. ;       Offset = 20h
  133. ;
  134. CharNumMax      dw      07d0h
  135. xy              dw      ?
  136. SavePos         dw      ?
  137. CurOfs          dw      ?
  138. R1              dw      ?
  139. R2              dw      ?
  140. R3              dw      ?
  141. R4              dw      ?
  142. ;
  143. ;       Offset = 30h
  144. ;
  145. VRamAddr        dw      32 dup(?)
  146. BufOfs          dw      32 dup(?)
  147. ;
  148. ;       Offset = b0h
  149. ;
  150. TabAttr         equ     $ - 00b0h
  151. ;               --------------------------------------------------
  152. ;               b7 = Double VertLine;  b6 = Double HoriLine
  153. ;               b5 = None           ;  b4 = Block Char
  154. ;               b3 = Down Attr      ;  b2 = Up Attr
  155. ;               b1 = Right Attr     ;  b0 = Left Attribute
  156. ;               --------------------------------------------------
  157. ;                       '░'   '▒'   '▓'                    b0 - b2
  158.         db      0dfh, 0dfh, 0dfh
  159. ;               --------------------------------------------------
  160. ;                       '│'   '┤'   '╡'   '╢'   '╖'   '╕'  b3 - b8
  161.         db      0ch,  0dh,  4dh,  8dh,  89h,  49h
  162. ;               --------------------------------------------------
  163. ;                       '╣'   '║'   '╗'   '╝'   '╜'   '╛'  b9 - be
  164.         db      0cdh, 8ch,  0c9h, 0c5h, 85h,  45h
  165. ;               --------------------------------------------------
  166. ;                       '┐'   '└'   '┴'   '┬'   '├'   '─'  bf - c4
  167.         db      09h,  06h,  07h,  0bh,  0eh,  03h
  168. ;               --------------------------------------------------
  169. ;                       '┼'   '╞'   '╟'   '╚'   '╔'   '╩'  c5 - ca
  170.         db      0fh,  4eh,  8eh,  0c6h, 0cah, 0c7h
  171. ;               --------------------------------------------------
  172. ;                       '╦'   '╠'   '═'   '╬'   '╧'   '╨'  cb - d0
  173.         db      0cbh, 0ceh, 43h,  0cfh, 47h,  87h
  174. ;               --------------------------------------------------
  175. ;                       '╤'   '╥'   '╙'   '╘'   '╒'   '╓'  d1 - d6
  176.         db      4bh,  8bh,  86h,  46h,  4ah,  8ah
  177. ;               --------------------------------------------------
  178. ;                       '╫'   '╪'   '┘'   '┌'              d7 - da
  179.         db      8fh,  4fh,  05h,  0ah
  180. ;               --------------------------------------------------
  181. ;                       '█'   '▄'   '▌'   '▐'   '▀'        db - df
  182.         db      0dfh, 0dfh, 1ch,  1ch,  0dfh
  183. ;               --------------------------------------------------
  184. ;
  185. AuthorStr       db      37h, 0e7h
  186.         db      0dh,6dh, 0afh,9bh, 0dbh,0abh, 0ceh,0cch
  187.         db      0dfh,8ch, 0dah,0dbh, 0fah,0cbh
  188.         db      5ch,0dch, 0bah,9bh, 0ebh,0bch
  189.         db      02h,02h, 56h,0e7h, 8fh,5ah, 0e7h,0a3h
  190.         db      82h,37h, 73h,03h, 23h,13h, 23h,92h
  191.         db      43h,23h, 33h,93h, 0d2h,33h, 23h,53h
  192.         db      02h,13h, 56h,0e7h, 0eeh,8ah, 37h,0e7h
  193. AuthorName      db      2ch,3bh, 0dah,0dbh, 0efh,4ch, 0,0
  194. ;
  195. color           db      0,9,1,0,9,1,1, 1,0,9,1,1
  196. ;
  197. TimeStr         db      '12:00:00'
  198. VerStr          db      'CHCS 1.0'
  199. ;
  200. TmpPos          dw      ?
  201. FontOprMark     db      0
  202. PmtFirst        db      ?
  203. PmtFirstX       db      ?
  204. ;               -------------------------------
  205. inBeep          proc    near
  206. ;
  207. ;       IN:     cx = Freq
  208. ;               bx = Time
  209. ;
  210.         mov     al, 0b6h
  211.         out     43h, al
  212.         mov     al, cl
  213.         out     42h, al
  214.         mov     al, ch
  215.         out     42h, al
  216.         in      al, 61h
  217.         mov     ah, al
  218.         or      al, 3
  219.         out     61h, al
  220. inBeepDelay:    mov     cx, 2801h
  221. inBeepLoop0:    loop    inBeepLoop0
  222.         dec     bx
  223.         jnz     inBeepDelay
  224.         mov     al, ah
  225.         out     61h, al
  226.         ret
  227. inBeep          endp
  228. ;               -------------------------------
  229. SwitchVRamSEG   proc    near
  230. ;
  231. ;       IN:     ah = 0 ... A0000-BFFFF 128K
  232. ;               ah = 1 ... A0000-AFFFF  64K
  233. ;               ah = 2 ... B0000-B7FFF  32K
  234. ;               ah = 3 ... B8000-BFFFF  32K
  235. ;
  236.         push    dx
  237.         and     ah, 3
  238.         shl     ah, 1
  239.         shl     ah, 1
  240.         or      ah, 1
  241.         mov     al, 06h
  242.         mov     dx, GCindex
  243.         out     dx, al
  244.         inc     dx
  245.         mov     al, ah
  246.         out     dx, al
  247.         pop     dx
  248.         ret
  249. SwitchVRamSEG   endp
  250. ;               -------------------------------
  251. ResetGC         proc    near
  252.         mov     dx, GCindex
  253.         mov     ax, 0005h
  254.         out     dx, ax
  255.         mov     al, 01h
  256.         out     dx, ax
  257.         ret
  258. ResetGC         endp
  259. ;               -------------------------------
  260. CalcVRamAddr    proc    near
  261. ;
  262. ;       IN:     dx = Pos
  263. ;       OUT:    es:di = VRamPntr
  264. ;
  265.         mov     cl, dh
  266.         xor     ch, ch
  267.         mov     di, cx
  268.         shl     di, 1
  269.         mov     di, VRamAddr[di]
  270.         cmp     dh, YMax
  271.         ja      isPmtAddr
  272. AddrCont0:      mov     cl, dl
  273.         add     di, cx
  274.         mov     es, VRamSEG
  275.         ret
  276. ;
  277. isPmtAddr:      add     di, 80*7
  278.         jmp     AddrCont0
  279. ;
  280. CalcVRamAddr    endp
  281. ;               -------------------------------
  282. inSetRegisters  proc    near
  283. ;
  284. ;       IN:     bh = DrawType
  285. ;               bl = DrawColor
  286. ;
  287.         mov     dx, GCindex
  288.         mov     al, 0
  289.         mov     ah, DrawColor
  290.         out     dx, ax
  291.         mov     ax, 0f01h
  292.         out     dx, ax
  293.         mov     ah, DrawType
  294.         mov     al, 03h
  295.         out     dx, ax
  296.         ret
  297. inSetRegisters  endp
  298. ;               -------------------------------
  299. inReRegisters   proc    near
  300.         mov     dx, GCindex
  301.         mov     ax, 0001h
  302.         out     dx, ax
  303.         mov     ax, 0ff08h
  304.         out     dx, ax
  305.         mov     ax, 0003h
  306.         out     dx, ax
  307.         ret
  308. inReRegisters   endp
  309. ;               -------------------------------
  310. CalcVRamOfs     proc    near
  311. ;
  312. ;       IN:     ax = y
  313. ;               cx = x
  314. ;       OUT:    es:di = VRamPntr
  315. ;               cl = SetBit
  316. ;
  317.         push    bx
  318.         xor     bh, bh
  319.         mov     bl, XMax
  320.         mul     bx
  321.         mov     di, ax
  322.         mov     ax, cx
  323.         xor     ch, ch
  324.         and     cl, 7
  325.         shr     ax, 1
  326.         shr     ax, 1
  327.         shr     ax, 1
  328.         add     di, ax
  329.         mov     ax, VRamSEG
  330.         mov     es, ax
  331.         pop     bx
  332.         ret
  333. CalcVRamOfs     endp
  334. ;               -------------------------------
  335. ScanLine        proc    near
  336. ;
  337. ;       IN:     bx = startx
  338. ;               cx = endx
  339. ;               dx = y
  340. ;
  341.         push    es
  342.         push    di
  343.         cmp     bx, cx
  344.         jbe     HLineNotSwap
  345.         mov     ax, bx
  346.         mov     bx, cx
  347.         mov     cx, ax
  348. HLineNotSwap:   cli
  349.         mov     di, dx
  350.         call    inSetRegisters
  351.         mov     ax, di
  352.         push    cx
  353.         mov     cx, bx
  354.         call    CalcVRamOfs
  355.         mov     al, cl
  356.         pop     cx
  357.         sub     cx, bx
  358.         inc     cx
  359.         or      al, al
  360.         je      SlComplete
  361.         mov     bx, 0ffh
  362.         push    cx
  363.         mov     cl, al
  364.         shr     bx, cl
  365.         pop     cx
  366.         xor     ah, ah
  367.         add     cx, ax
  368.         sub     cx, 8
  369.         jge     SlSetMask
  370.         neg     cx
  371.         shr     bx, cl
  372.         shl     bx, cl
  373.         xor     cx, cx
  374. SlSetMask:      mov     dx, GCindex
  375.         mov     al, 08h
  376.         mov     ah, bl
  377.         out     dx, ax
  378.         mov     al, es:[di]
  379.         cld
  380.         stosb
  381. SlComplete:     mov     bx, cx
  382.         cmp     cx, 8
  383.         jb      SlTailing
  384.         shr     cx, 1
  385.         shr     cx, 1
  386.         shr     cx, 1
  387.         mov     dx, GCindex
  388.         mov     ax, 0ff08h
  389.         out     dx, ax
  390.         mov     ax, 0ffffh
  391.         cld
  392.         rep     stosb
  393. SlTailing:      and     bx, 07h
  394.         je      SlDone
  395.         mov     ax, 0ffffh
  396.         mov     cl, bl
  397.         shr     ax, cl
  398.         xor     ah, 0ffh
  399.         mov     al, 08h
  400.         mov     dx, GCindex
  401.         out     dx, ax
  402.         mov     al, es:[di]
  403.         cld
  404.         stosb
  405. SlDone:         call    inReRegisters
  406.         sti
  407.         pop     di
  408.         pop     es
  409.         ret
  410. ScanLine        endp
  411. ;               -------------------------------
  412. VertLine        proc    near
  413. ;
  414. ;       IN:     bx = x0
  415. ;               cx = y0
  416. ;               dx = y
  417. ;
  418.         push    es
  419.         push    di
  420.         cmp     cx, dx
  421.         jbe     VLineNotSwap
  422.         mov     ax, cx
  423.         mov     cx, dx
  424.         mov     dx, ax
  425. VLineNotSwap:   cli
  426.         push    cx
  427.         push    dx
  428.         call    inSetRegisters
  429.         mov     ax, cx
  430.         mov     cx, bx
  431.         call    CalcVRamOfs
  432.         mov     al, 80h
  433.         or      cl, cl
  434.         je      VLineSkipShr
  435.         shr     al, cl
  436. VLineSkipShr:   mov     dx, GCindex
  437.         mov     ah, al
  438.         mov     al, 8
  439.         out     dx, ax
  440.         xor     dh, dh
  441.         mov     dl, ChNumX
  442.         pop     cx
  443.         pop     ax
  444.         sub     cx, ax
  445.         inc     cx
  446.         mov     al, 0ffh
  447.         cld
  448. VLineLoop:      mov     ah, es:[di]
  449.         stosb
  450.         add     di, dx
  451.         loop    VLineLoop
  452.         call    inReRegisters
  453.         sti
  454.         pop     di
  455.         pop     es
  456.         ret
  457. VertLine        endp
  458. ;               -------------------------------
  459. HMLine          proc    near
  460. ;
  461. ;       IN:     dx = y
  462. ;
  463.         cmp     MyMode, 1
  464.         jne     HMLineQuit
  465.         cmp     FullPmtLine, 1
  466.         jne     HMLineQuit
  467.         push    bx
  468.         push    dx
  469.         mov     cx, XbMax
  470.         xor     bx, bx
  471.         dec     cx
  472.         call    ScanLine
  473.         pop     dx
  474.         pop     bx
  475. HMLineQuit:     ret
  476. HMLine          endp
  477. ;
  478. y0              dw      455
  479. dy              dw      20
  480. ;               -------------------------------
  481. HalfFrame       proc    near
  482. ;
  483. ;       IN:     ah = 0  ... Left-Top Corner
  484. ;               ah = 1  ... Right-Bottom Corner
  485. ;               cx = x1 (pixels)
  486. ;               dx = x2 (pixels)
  487. ;
  488.         push    ax
  489.         push    cx
  490.         push    dx
  491.         mov     bx, cx
  492.         mov     cx, dx
  493.         mov     dx, y0
  494.         or      ah, ah
  495.         jz      isLTcorner
  496.         add     dx, dy
  497. isLTcorner:     call    ScanLine
  498.         pop     dx
  499.         pop     cx
  500.         pop     ax
  501. ;
  502.         push    cx
  503.         push    dx
  504.         mov     bx, dx
  505.         cmp     ah, 1
  506.         je      isRBcorner
  507.         mov     bx, cx
  508. isRBcorner:     mov     cx, y0
  509.         mov     dx, cx
  510.         add     dx, dy
  511.         call    VertLine
  512.         pop     dx
  513.         pop     cx
  514.         ret
  515. HalfFrame       endp
  516. ;               -------------------------------
  517. TradeButton     proc    near
  518.         cmp     FullPmtLine, 1
  519.         jne     MakeTradeQuit
  520.         or      IntrBusy, I16Busy
  521.         mov     cx, 4
  522.         mov     dx, 43
  523.         mov     y0, 456
  524.         mov     dy, 18
  525.         mov     ah, 1
  526.         mov     DrawColor, 0
  527.         call    HalfFrame
  528.         pusha
  529.         mov     bx, 7
  530.         mov     cx, 39
  531.         mov     dx, 471
  532.         call    ScanLine
  533.         popa
  534. ;
  535.         mov     al, 9
  536.         call    SetLnColor
  537.         mov     ah, 0
  538.         call    HalfFrame
  539.         pusha
  540.         mov     bx, 7
  541.         mov     cx, 39
  542.         mov     dx, 472
  543.         call    ScanLine
  544.         popa
  545.         mov     y0, 455
  546.         mov     dy, 20
  547.         and     IntrBusy, NOT I16Busy
  548. MakeTradeQuit:  ret
  549. TradeButton     endp
  550. ;               -------------------------------
  551. MakeButton      proc    near
  552. ;
  553. ;       IN:     dl = x1
  554. ;               dh = x2
  555. ;
  556.         cmp     MyMode, 1
  557.         jne     MakeButtonQuit
  558.         cmp     FullPmtLine, 1
  559.         jne     MakeButtonQuit
  560.         or      IntrBusy, I16Busy
  561.         push    ax
  562.         xor     ah, ah
  563.         mov     al, dl
  564.         mov     cl, 3
  565.         shl     ax, cl
  566.         add     ax, 6
  567.         mov     bx, ax
  568.         xor     ah, ah
  569.         mov     al, dh
  570.         shl     ax, cl
  571.         add     ax, 2
  572.         mov     dx, ax
  573.         mov     cx, bx
  574.         pop     ax
  575.         mov     DrawColor, 0
  576.         mov     ah, 0
  577.         call    HalfFrame
  578.         mov     al, 9
  579.         call    SetLnColor
  580.         mov     ah, 1
  581.         call    HalfFrame
  582.         and     IntrBusy, NOT I16Busy
  583. MakeButtonQuit: ret
  584. MakeButton      endp
  585. ;               -------------------------------
  586. SetBarColor     proc    near
  587. ;
  588. ;       IN:     al = origin color
  589. ;       OUT:    al = color
  590. ;
  591.         push    cx
  592.         mov     cl, 4
  593.         or      al, al
  594.         jz      toSetBarColor
  595.         cmp     al, 9
  596.         je      isHiBarColor
  597.         mov     al, bAttr
  598.         shr     al, cl
  599.         jmp     toSetBarColor
  600. isHiBarColor:   mov     al, bAttr
  601.         shr     al, cl
  602.         or      al, 8
  603. toSetBarColor:  mov     DrawColor, al
  604.         pop     cx
  605.         ret
  606. SetBarColor     endp
  607. ;               -------------------------------
  608. SetLnColor      proc    near
  609. ;
  610. ;       IN:     al = origin color
  611. ;       OUT:    al = color
  612. ;
  613.         push    cx
  614.         mov     cl, 4
  615.         or      al, al
  616.         jz      toSetLnColor
  617.         cmp     al, 9
  618.         je      isHiLnColor
  619.         mov     al, bAttr
  620.         shr     al, cl
  621.         jmp     toSetLnColor
  622. ;
  623. isHiLnColor:    mov     al, bAttr
  624.         shr     al, cl
  625.         or      al, al
  626.         jz      toSetLnColor
  627.         cmp     al, 6
  628.         je      toSetLnColor
  629.         or      al, 8
  630. toSetLnColor:   mov     DrawColor, al
  631.         pop     cx
  632.         ret
  633. SetLnColor      endp
  634. ;               -------------------------------
  635. MakeBottomBar   proc    near
  636.         cmp     MyMode, 1
  637.         jne     MakeBarQuit
  638.         cmp     FullPmtLine, 1
  639.         jne     MakeBarQuit
  640.         or      IntrBusy, I16Busy
  641.         mov     cx, 7
  642.         mov     bx, 0
  643.         mov     dx, 450
  644. MakeBarLoop0:   push    cx
  645.         mov     al, color[bx]
  646.         call    SetBarColor
  647.         call    HMLine
  648.         inc     dx
  649.         inc     bx
  650.         pop     cx
  651.         loop    MakeBarLoop0
  652.         add     dx, 18
  653. MakeBarLoop1:   mov     al, color[bx]
  654.  
  655.         call    SetBarColor
  656.         call    HMLine
  657.         inc     dx
  658.         inc     bx
  659.         cmp     dx, YbMax
  660.         jb      MakeBarLoop1
  661.         and     IntrBusy, NOT I16Busy
  662. MakeBarQuit:    ret
  663. MakeBottomBar   endp
  664. ;               -------------------------------
  665. FillBG          proc    near
  666. ;
  667. ;       IN:     bl = bg
  668. ;               cx = num
  669. ;               dx = Pos
  670. ;
  671.         push    bp
  672.         push    si
  673.         push    di
  674.         cmp     dl, XMax
  675.         jb      FillBGCont0
  676.         jmp     FillBGQuit
  677. FillBGCont0:    mov     ah, YMax
  678.         inc     ah
  679.         cmp     dh, ah
  680.         jbe     FillBGCont1
  681.         jmp     FillBGQuit
  682. FillBGCont1:    cli
  683.         push    dx
  684.         and     bl, 0fh
  685.         mov     ah, bl
  686.         xor     al, al
  687.         mov     dx, GCindex
  688.         out     dx, ax
  689.         mov     ax, 0f01h
  690.         out     dx, ax
  691.         pop     dx
  692.         mov     bx, cx
  693.         call    CalcVRamAddr
  694.         xor     dh, dh
  695.         mov     dl, nHigh
  696.         mov     bp, dx
  697.         mov     dl, XMax
  698.         mov     si, di
  699.         mov     ax, 0ffffh
  700. FillBGLoop:     mov     di, si
  701.         mov     cx, bx
  702.         cld
  703.         rep     stosb
  704.         add     si, dx
  705.         dec     bp
  706.         jne     FillBGLoop
  707.         call    ResetGC
  708.         sti
  709. FillBGQuit:     pop     di
  710.         pop     si
  711.         pop     bp
  712.         ret
  713. FillBG          endp
  714. ;               -------------------------------
  715. ConvCharAttr    proc    near
  716.         cmp     inPmtOpr, 1
  717.         je      ConvAttrEnd
  718.         cmp     ah, 0a0h
  719.         ja      SetCCAttr
  720.         cmp     al, ' '
  721.         jbe     ConvAttrEnd
  722.         cmp     al, '0'
  723.         jb      SetSymAttr
  724.         cmp     al, '9'
  725.         jbe     SetDigitAttr
  726.         cmp     al, 'A'
  727.         jb      SetSymAttr
  728.         cmp     al, 'Z'
  729.         jbe     SetUpperAttr
  730.         cmp     al, 'a'
  731.         jb      SetSymAttr
  732.         cmp     al, 'z'
  733.         jbe     ConvAttrEnd
  734.         cmp     al, 0b0h
  735.         jae     ConvAttrEnd
  736. ;
  737. SetSymAttr:     mov     cl, 3
  738.         test    bl, 08h
  739.         jnz     toConvAttr
  740.         dec     cl
  741.         jmp     toConvAttr
  742. ;
  743. SetDigitAttr:   mov     cl, 4
  744.         jmp     toConvAttr
  745. ;
  746. SetUpperAttr:   mov     cl, 1
  747.         jmp     toConvAttr
  748. ;               ║║╫╓╤╒╔½╫¬╗╗:
  749. SetCCAttr:      mov     cl, 5
  750.         test    bl, 08h
  751.         jz      toConvAttr
  752.         mov     ch, bl
  753.         and     ch, 0fh
  754.         mov     cl, 5
  755.         cmp     ch, 0fh
  756.         je      toConvAttr
  757.         inc     ch
  758.         jmp     ConvAttrVeri
  759. ;
  760. toConvAttr:     mov     ch, bl
  761.         and     ch, 0fh
  762. ;                add     ch, cl
  763.         sub     ch, cl
  764. ConvAttrVeri:   and     ch, 0fh
  765.         and     bl, 0f0h
  766.         mov     bh, bl
  767.         mov     cl, 4
  768.         shr     bh, cl
  769.         cmp     bh, ch
  770.         jne     ConvAttrSkip0
  771.         dec     ch
  772.         and     ch, 0fh
  773. ConvAttrSkip0:  or      bl, ch
  774. ConvAttrEnd:    ret
  775. ConvCharAttr    endp
  776. ;               -------------------------------
  777. SetAttr         proc    near
  778. ;
  779. ;       IN:     bl = attr
  780. ;               ax = char
  781. ;               es:di = VRamAddr
  782. ;
  783.         cmp     inColorText, 1
  784.         jne     SetAttrCont0
  785.         call    ConvCharAttr
  786. SetAttrCont0:   mov     cx, ax
  787.         mov     dx, GCindex
  788. ;
  789. comment @
  790.         mov     ah, bl
  791.         shr     ah, 1
  792.         shr     ah, 1
  793.         shr     ah, 1
  794.         shr     ah, 1
  795.         xor     al, al
  796.         out     dx, ax       ; Set Back Color
  797.         mov     ax, 0f01h
  798.         out     dx, ax       ; enable SET/RESET
  799.         mov     al, 0ffh
  800.         mov     es:[di], al  ; Write Back Color
  801.         mov     ax, 0001h
  802.         out     dx, ax       ; disable SET/RESET
  803.     @
  804.         mov     ah, bl
  805.         and     ah, 0fh
  806.         xor     al, al
  807.         out     dx, ax       ; Set Fore Color
  808.         mov     ax, 0305h
  809.         out     dx, ax       ; Set Write Mode 3
  810. ;
  811.         xor     bh, bh
  812.         shr     bl, 1
  813.         shr     bl, 1
  814.         shr     bl, 1
  815.         shr     bl, 1
  816.         add     bx, PreColor
  817. ;
  818.         mov     ah, es:[bx]  ; Load Back Color
  819.         mov     ax, cx
  820.         ret
  821. SetAttr         endp
  822. ;               -------------------------------
  823. inDrawC         proc    near
  824. ;
  825. ;       IN:     al = char
  826. ;               bl = attr
  827. ;               dx = Pos
  828. ;
  829.         cmp     dx, word ptr CurX
  830.         jne     inDrawCCont0
  831.         cmp     isCCcursor, 1
  832.         jne     inDrawCSkip0
  833.         cmp     CursorActive, 1
  834.         jne     inDrawCCont0
  835.         push    ax
  836.         push    bx
  837.         push    dx
  838.         inc     dl
  839.         mov     isCCcursor, 0
  840.         call    XorDrawCursor
  841.         pop     dx
  842.         pop     bx
  843.         pop     ax
  844. inDrawCSkip0:   mov     CursorActive, 0
  845. inDrawCCont0:   call    CalcVRamAddr
  846.         cli
  847.         mov     ah, bl
  848.         lea     bx, CharTable
  849.         xlat    CharTable
  850.         mov     bl, ah
  851.         xor     ah, ah
  852.         call    SetAttr
  853.         mov     ch, ah
  854.         mov     dh, ah
  855.         mov     bh, al
  856.         mov     bl, nHigh
  857.         mov     dl, ChNumX
  858.         mov     cl, cHigh
  859.         cmp     cl, 14
  860.         ja      Fmul16
  861.         jb      Fmul8
  862.         mul     cl
  863.         jmp     inDrawCCont1
  864. ;
  865. Fmul16:         shl     ax, 1
  866. Fmul8:          shl     ax, 1
  867.         shl     ax, 1
  868.         shl     ax, 1
  869. ;
  870. inDrawCCont1:   lds     si, FPntr
  871.         add     si, ax
  872.         cld
  873. inDrawCLoop0:   movsb
  874.         add     di, dx
  875.         loop    inDrawCLoop0
  876.         cmp     bl, 16
  877.         jbe     inDrawCEnd
  878.         mov     cl, bl
  879.         and     cl, 3
  880.         cmp     bh, 0b0h
  881.         jb      inDrawCReAX
  882.         cmp     bh, 0dfh
  883.         ja      inDrawCReAX
  884.         dec     si
  885.         dec     si
  886.         lodsw
  887.         jmp     inDrawCLoop1
  888. ;
  889. inDrawCReAX:    xor     ax, ax
  890. inDrawCLoop1:   stosb
  891.         xchg    ah, al
  892.         add     di, dx
  893.         loop    inDrawCLoop1
  894. inDrawCEnd:     mov     dx, GCindex
  895.         mov     ax, 0005h
  896.         out     dx, ax
  897. ;
  898.         mov     ax, cs
  899.         mov     ds, ax
  900.         sti
  901.         ret
  902. inDrawC         endp
  903. ;               -------------------------------
  904. LoadCFont       proc    near
  905. ;
  906. ;       IN:     dx = cchar
  907. ;       OUT:    [bx] = Dot Matrix
  908. ;
  909.         push    dx
  910.         push    ax
  911.         mov     dx, ax
  912.         mov     ax, cs
  913.         mov     es, ax
  914.         lea     bx, FontBuf
  915.         xor     cx, cx
  916.         mov     ah, 80h
  917.         pushf
  918.         call    dword ptr OldInt16
  919.         pop     dx
  920. ;
  921.         xor     ax, ax
  922.         cmp     dh, 0a9h
  923.         jne     LoadCFontSet
  924. ;
  925. isCCTable:      mov     ax, [bx+30]
  926. LoadCFontSet:   mov     [bx+32], ax
  927.         mov     [bx+34], ax
  928.         mov     ax, dx
  929.         pop     dx
  930.         ret
  931. LoadCFont       endp
  932. ;               -------------------------------
  933. inDrawCC        proc    near
  934.         cmp     dh, CurY
  935.         jne     inCCcont0
  936.         cmp     dl, CurX
  937.         ja      inCCcont0
  938.         inc     dl
  939.         cmp     dl, CurX
  940.         jb      inCCSkip0
  941.         mov     CursorActive, 0
  942. inCCSkip0:      dec     dl
  943. inCCcont0:      push    bx
  944.         call    LoadCFont
  945.         mov     si, bx
  946.         call    CalcVRamAddr
  947.         pop     bx
  948.         cli
  949.         call    SetAttr
  950.         xor     dh, dh
  951.         mov     dl, ChNumX
  952.         dec     dl
  953.         xor     ch, ch
  954.         mov     cl, nHigh
  955.         cld
  956. inCCLoop:       movsw
  957.         add     di, dx
  958.         loop    inCCLoop
  959.         mov     dx, GCindex
  960.         mov     ax, 0005h
  961.         out     dx, ax
  962.         sti
  963.         ret
  964. inDrawCC        endp
  965. ;               -------------------------------
  966. inDrawCC1       proc    near
  967.         cmp     dh, CurY
  968.         jne     inCC1Skip
  969.         cmp     dl, CurX
  970.         jne     inCC1Skip
  971.         mov     CursorActive, 0
  972. inCC1Skip:      push    bx
  973.         call    LoadCFont
  974.         mov     si, bx
  975.         call    CalcVRamAddr
  976.         pop     bx
  977.         cli
  978.         call    SetAttr
  979.         xor     dh, dh
  980.         mov     dl, ChNumX
  981.         xor     ch, ch
  982.         mov     cl, nHigh
  983.         cld
  984. inCC1Loop:      movsb
  985.         inc     si
  986.         add     di, dx
  987.         loop    inCC1Loop
  988.         mov     dx, GCindex
  989.         mov     ax, 0005h
  990.         out     dx, ax
  991.         sti
  992.         ret
  993. inDrawCC1       endp
  994. ;               -------------------------------
  995. inDrawCC2       proc    near
  996.         cmp     dh, CurY
  997.         jne     inCC2Skip
  998.         cmp     dl, CurX
  999.         jne     inCC2Skip
  1000.         mov     CursorActive, 0
  1001. inCC2Skip:      push    bx
  1002.         call    LoadCFont
  1003.         mov     si, bx
  1004.         call    CalcVRamAddr
  1005.         pop     bx
  1006.         cli
  1007.         call    SetAttr
  1008.         xor     dh, dh
  1009.         mov     dl, ChNumX
  1010.         xor     ch, ch
  1011.         mov     cl, nHigh
  1012.         cld
  1013. inCC2Loop:      inc     si
  1014.         movsb
  1015.         add     di, dx
  1016.         loop    inCC2Loop
  1017.         mov     dx, GCindex
  1018.         mov     ax, 0005h
  1019.         out     dx, ax
  1020.         sti
  1021.         ret
  1022. inDrawCC2       endp
  1023. ;               -------------------------------
  1024. CalcBufOfs      proc    near
  1025. ;
  1026. ;       IN:     dx = Pos
  1027. ;       OUT:    bx = y * XMax + x
  1028. ;
  1029.         xor     bh, bh
  1030.         mov     bl, dh
  1031.         shl     bx, 1
  1032.         mov     bx, BufOfs[bx]
  1033.         add     bl, dl
  1034.         adc     bh, 0
  1035.         ret
  1036. CalcBufOfs      endp
  1037. ;               -------------------------------
  1038. WriteScrBuf     proc    near
  1039. ;
  1040. ;       IN:     al = char
  1041. ;               bh = type
  1042. ;               bl = attr
  1043. ;               si = Offset
  1044. ;
  1045.         push    ax
  1046. ;                cmp     dh, YMax
  1047. ;                ja      SkipType
  1048.         mov     ScrType[si], bh
  1049. SkipType:       mov     ah, bl
  1050.         shl     si, 1
  1051.         mov     ScrBuf[si], ax
  1052. ;
  1053.         cmp     inScanText, 1
  1054.         je      WriteScrBufEnd
  1055.         cmp     TextMode, 1
  1056.         jne     WriteScrBufEnd
  1057. ;                cmp     dh, YMax
  1058. ;                ja      WriteScrBufEnd
  1059.         push    dx
  1060.         mov     dx, TextVRamSEG
  1061.         mov     es, dx
  1062.         pop     dx
  1063.         mov     es:[si], ax
  1064. WriteScrBufEnd: shr     si, 1
  1065.         pop     ax
  1066.         ret
  1067. WriteScrBuf     endp
  1068. ;               -------------------------------
  1069. PutC            proc    near
  1070. ;
  1071. ;       IN:     al = char
  1072. ;               bh = type
  1073. ;               dx = Pos
  1074. ;               si = Offset
  1075. ;
  1076.         call    WriteScrBuf
  1077.         call    inDrawC
  1078.         ret
  1079. PutC            endp
  1080. ;               -------------------------------
  1081. PutCC           proc    near
  1082. ;
  1083. ;       IN:     ax = cchar
  1084. ;               bh = attr1
  1085. ;               bl = attr2
  1086. ;               dx = Pos
  1087. ;               si = Offset
  1088. ;
  1089.         mov     cx, bx
  1090.         xchg    ah, al
  1091.         mov     bl, bh
  1092.         mov     bh, 1
  1093.         call    WriteScrBuf
  1094.         mov     bx, cx
  1095.         xchg    ah, al
  1096.         inc     si
  1097.         mov     bh, 2
  1098. ;
  1099.         cmp     inAddNext, 1
  1100.         jne     toScrBuf
  1101.         mov     inAddNext, 0
  1102.         cmp     dh, YMax
  1103.         ja      PutCC_0
  1104.         mov     ScrType[si], bh
  1105.         jmp     PutCC_0
  1106. ;
  1107. toScrBuf:       call    WriteScrBuf
  1108. PutCC_0:        mov     bx, cx
  1109.         cmp     dl, ChNumX
  1110.         jae     PutCC1_2
  1111.         cmp     bh, bl
  1112.         jne     PutCC1_2
  1113.         call    inDrawCC
  1114.         ret
  1115. ;
  1116. PutCC1_2:       push    ax
  1117.         push    bx
  1118.         push    dx
  1119.         mov     bl, bh
  1120.         call    inDrawCC1
  1121.         pop     dx
  1122.         pop     bx
  1123.         pop     ax
  1124.         inc     dl
  1125.         cmp     dl, XMax
  1126.         jb      PutCCSkip0
  1127.         inc     dh
  1128.         xor     dl, dl
  1129. PutCCSkip0:     call    inDrawCC2
  1130.         ret
  1131. PutCC           endp
  1132. ;               -------------------------------
  1133. CurToTab        proc    near
  1134. ;
  1135. ;       IN:     si = Offset for CurPos
  1136. ;               dx = Pos
  1137. ;
  1138.         push    es
  1139.         push    si
  1140.         push    dx
  1141.         shl     si, 1
  1142.         mov     ax, ScrBuf[si]
  1143.         shr     si, 1
  1144.         mov     bh, 88h
  1145.         mov     bl, ah
  1146.         call    WriteScrBuf
  1147.         call    inDrawC
  1148.         pop     dx
  1149.         pop     si
  1150.         pop     es
  1151.         ret
  1152. CurToTab        endp
  1153. ;               -------------------------------
  1154. LeftToTab       proc    near
  1155. ;
  1156. ;       IN:     al = Left MoveNum to Set
  1157. ;               dx = Pos
  1158. ;               si = Offset for CurPos
  1159. ;
  1160.         push    es
  1161.         push    si
  1162.         push    dx
  1163.         sub     dl, al
  1164.         xor     ah, ah
  1165.         sub     si, ax
  1166.         shl     si, 1
  1167.         mov     ax, ScrBuf[si]
  1168.         shr     si, 1
  1169.         mov     bh, 88h
  1170.         mov     bl, ah
  1171.         call    WriteScrBuf
  1172.         call    inDrawC
  1173.         pop     dx
  1174.         pop     si
  1175.         pop     es
  1176.         ret
  1177. LeftToTab       endp
  1178. ;               -------------------------------
  1179. RightToTab      proc    near
  1180. ;
  1181. ;       IN:     al = Right MoveNum to Set
  1182. ;               dx = Pos
  1183. ;               si = Offset for CurPos
  1184. ;
  1185.         push    es
  1186.         push    si
  1187.         push    dx
  1188.         add     dl, al
  1189.         xor     ah, ah
  1190.         add     si, ax
  1191.         shl     si, 1
  1192.         mov     ax, ScrBuf[si]
  1193.         shr     si, 1
  1194.         mov     bh, 88h
  1195.         mov     bl, ah
  1196.         call    WriteScrBuf
  1197.         call    inDrawC
  1198.         pop     dx
  1199.         pop     si
  1200.         pop     es
  1201.         ret
  1202. RightToTab      endp
  1203. ;               -------------------------------
  1204. TestMatchLR     proc    near
  1205. ;
  1206. ;       IN:     ah = left char
  1207. ;               al = current char
  1208. ;       OUT:    CF = 0 ... Matched
  1209. ;               CF = 1 ... noMatch
  1210. ;
  1211.         push    dx
  1212.         push    bx
  1213.         cmp     ah, 11h
  1214.         je      MatchLRc1
  1215.         xor     bh, bh
  1216.         mov     bl, al
  1217.         mov     dl, byte ptr [bx+TabAttr]
  1218.         test    dl, 01h
  1219.         jz      noMatchLR
  1220.         mov     bl, ah
  1221.         mov     dh, byte ptr [bx+TabAttr]
  1222.         test    dh, 02h
  1223.         jz      noMatchLR
  1224.         mov     bx, dx
  1225.         and     dx, 7070h
  1226.         cmp     dh, dl
  1227.         jne     noMatchLR
  1228.         test    dl, 10h
  1229.         jz      toTestUD               ; Not Block Char
  1230.         cmp     ah, al
  1231.         jne     noMatchLR
  1232. isMatchLR:      clc
  1233.         pop     bx
  1234.         pop     dx
  1235.         ret
  1236. ;
  1237. toTestUD:       test    bh, 0ch
  1238.         jz      isMatchLR
  1239.         test    bl, 0ch
  1240.         jz      isMatchLR
  1241. ;
  1242. MatchLRc1:      cmp     al, 0c4h
  1243.         je      isMatchLR
  1244.         cmp     al, 0cdh
  1245.         je      isMatchLR
  1246. ;
  1247. noMatchLR:      stc
  1248.         pop     bx
  1249.         pop     dx
  1250.         ret
  1251. TestMatchLR     endp
  1252. ;               -------------------------------
  1253. TestMatchUD     proc    near
  1254. ;
  1255. ;       IN:     al = current char
  1256. ;               ah = upper char
  1257. ;       OUT:    CF = 0 ... Matched
  1258. ;               CF = 1 ... noMatch
  1259. ;
  1260.         push    dx
  1261.         push    bx
  1262.         xor     bh, bh
  1263.         mov     bl, al
  1264.         mov     dl, byte ptr [bx+TabAttr]
  1265.         test    dl, 04h
  1266.         jz      noMatchUD
  1267.         mov     bl, ah
  1268.         mov     dh, byte ptr [bx+TabAttr]
  1269.         test    dh, 08h
  1270.         jz      noMatchUD
  1271.         and     dx, 0b0b0h
  1272.         cmp     dh, dl
  1273.         jne     noMatchUD
  1274.         test    dl, 10h
  1275.         jz      isMatchUD              ; Not Block Char
  1276.         cmp     ah, al
  1277.         jne     noMatchUD
  1278. isMatchUD:      clc
  1279.         pop     bx
  1280.         pop     dx
  1281.         ret
  1282. ;
  1283. noMatchUD:      cmp     ax, 1fd9h
  1284.         je      isMatchUD
  1285.         cmp     ax, 0bb1eh
  1286.         je      isMatchUD
  1287.         stc
  1288.         pop     bx
  1289.         pop     dx
  1290.         ret
  1291. TestMatchUD     endp
  1292. ;               -------------------------------
  1293. CheckUpper      proc    near
  1294. ;
  1295. ;       IN:     al = char
  1296. ;               si = Offset
  1297. ;               dx = Pos
  1298. ;
  1299.         push    si
  1300.         push    di
  1301.         or      dh, dh
  1302.         jz      toUpperChecked
  1303.         dec     dh
  1304.         xor     bh, bh
  1305.         mov     bl, XMax
  1306.         sub     si, bx
  1307.         mov     bh, ScrType[si]
  1308.         or      bh, bh
  1309.         jz      toUpperChecked
  1310.         cmp     bh, 83h
  1311.         ja      toUpperChecked
  1312.         push    si
  1313.         shl     si, 1
  1314.         mov     ah, byte ptr ScrBuf[si] ; upper char
  1315.         call    TestMatchUD
  1316.         pop     si
  1317.         jc      toUpperChecked
  1318.         cmp     bh, 2
  1319.         je      UpperChLeft
  1320.         jb      UpperChRight
  1321.         push    ax
  1322.         cmp     ScrType[si], 83h
  1323.         ja      UpperChanged
  1324.         mov     ScrType[si], 88h
  1325.         jmp     UpperChanged
  1326. ;
  1327. toUpperChecked: jmp     UpperChecked
  1328. ;
  1329. UpperChLeft:    cmp     al, 0b0h
  1330.         jb      SkipCheck12
  1331.         cmp     al, 0b2h
  1332.         ja      SkipCheck12
  1333.         shl     si, 1
  1334.         mov     cl, byte ptr ScrBuf[si-2]
  1335.         shr     si, 1
  1336.         cmp     cl, al
  1337.         jne     UpperChecked
  1338. SkipCheck12:    push    ax
  1339.         call    CurToTab
  1340.         or      dl, dl
  1341.         jz      UpperChanged
  1342.         cmp     ScrType[si-1], 1
  1343.         jne     UpperChanged
  1344.         mov     al, 01h
  1345.         call    LeftToTab
  1346.         mov     ScrType[si-1], 83h
  1347.         jmp     UpperChanged
  1348. ;
  1349. UpperChRight:   cmp     al, 0b0h
  1350.         jb      SkipCheck21
  1351.         cmp     al, 0b2h
  1352.         ja      SkipCheck21
  1353.         shl     si, 1
  1354.         mov     cl, byte ptr ScrBuf[si+2]
  1355.         shr     si, 1
  1356.         cmp     al, cl
  1357.         jne     UpperChecked
  1358. SkipCheck21:    push    ax
  1359.         call    CurToTab
  1360.         cmp     ScrType[si+1], 2
  1361.         jne     UpperChanged
  1362.         mov     al, 01h
  1363.         call    RightToTab
  1364.         mov     ScrType[si+1], 83h
  1365.         shl     si, 1
  1366.         mov     byte ptr ScrBuf[si+3], 00h
  1367.         shr     si, 1
  1368. UpperChanged:   pop     ax
  1369.         mov     al, ah
  1370.         call    CheckUpper
  1371. UpperChecked:   pop     di
  1372.         pop     si
  1373.         ret
  1374. CheckUpper      endp
  1375. ;               -------------------------------
  1376. TreatUpper      proc    near
  1377. ;
  1378. ;       IN:     si = Offset of CurPos
  1379. ;               dx = CurPos
  1380. ;
  1381.         push    si
  1382.         push    dx
  1383.         shl     si, 1
  1384.         mov     al, byte ptr ScrBuf[si]
  1385.         shr     si, 1
  1386.         call    CheckUpper
  1387.         pop     dx
  1388.         pop     si
  1389.         ret
  1390. TreatUpper      endp
  1391. ;               -------------------------------
  1392. MakeAuthorStrx  proc    near
  1393.         pusha
  1394.         push    es
  1395.         push    cs
  1396.         pop     es
  1397.         lea     si, AuthorStr
  1398.         lea     di, Author+1
  1399.         mov     cl, 4
  1400.         cld
  1401. MakeAuLoop0:    lodsw
  1402.         or      ax, ax
  1403.         jz      MakeAuEnd
  1404.         ror     ah, cl
  1405.         ror     al, cl
  1406.         xchg    ah, al
  1407.         stosw
  1408.         jmp     MakeAuLoop0
  1409. ;
  1410. MakeAuEnd:      pop     es
  1411.         popa
  1412.         ret
  1413. MakeAuthorStrx  endp
  1414. ;               -------------------------------
  1415. TreatFirst      proc    near
  1416.         cmp     TextMode, 1
  1417.         jne     TreatFirstQuit
  1418.         cmp     isTreatTab, 1
  1419.         je      TreatFirstCont0
  1420. TreatFirstQuit: ret
  1421. ;
  1422. TreatFirstCont0:mov     dx, xy
  1423.         cmp     dl, 2
  1424.         jb      TreatFirstQuit
  1425.         push    si
  1426.         push    di
  1427.         call    CalcBufOfs
  1428.         mov     si, bx
  1429.         mov     ah, first
  1430.         push    si
  1431.         shl     si, 1
  1432.         mov     bh, 2
  1433. TreatFirstLoop: mov     al, ah
  1434.         mov     ah, byte ptr ScrBuf[si-2] ; last char
  1435.         call    TestMatchLR
  1436.         jc      FirstNotMatch
  1437.         sub     si, 2
  1438.         dec     bh
  1439.         jnz     TreatFirstLoop
  1440.         pop     si
  1441.         cmp     dl, 3
  1442.         jb      FirstCh3
  1443.         cmp     ScrType[si-3], 1
  1444.         jne     FirstCh3
  1445.         mov     al, 03h
  1446.         call    LeftToTab
  1447. FirstCh3:       mov     al, 02h
  1448.         call    LeftToTab
  1449.         mov     al, 01h
  1450.         call    LeftToTab
  1451.         mov     ScrType[si], 88h
  1452.         jmp     FirstEnd
  1453. ;
  1454. FirstNotMatch:  pop     si
  1455. FirstEnd:       mov     first, 0
  1456.         pop     di
  1457.         pop     si
  1458.         ret
  1459. TreatFirst      endp
  1460. ;               -------------------------------
  1461. TestFirst       proc    near
  1462.         cmp     first, 0
  1463.         jne     toTestFirst
  1464.         ret
  1465. toTestFirst:    cmp     dx, xy
  1466.         je      toSkipFirst
  1467.         push    ax
  1468.         push    bx
  1469.         push    dx
  1470.         call    TreatFirst
  1471.         pop     dx
  1472.         pop     bx
  1473.         pop     ax
  1474. toSkipFirst:    mov     first, 0
  1475.         ret
  1476. TestFirst       endp
  1477. ;               -------------------------------
  1478. CheckCharType   proc    near
  1479. ;
  1480. ;       IN:     al = char
  1481. ;               bl = attr
  1482. ;               dl = x
  1483. ;               dh = y
  1484. ;               si = BufOfs
  1485. ;       OUT:    al = char
  1486. ;               bl = attr
  1487. ;               dl = x
  1488. ;               dh = y
  1489. ;               ah = 0 ... ascii
  1490. ;                  bh = type:
  1491. ;                  bh = 0 ... ASCII
  1492. ;                  bh = 80h  ... Not Identify, Table Char or CC
  1493. ;                  bh = 83h  ... Not Identify, Table Char or CC
  1494. ;                  bh = 86h  ... ASCII 10h--12h, 17h--1Bh
  1495. ;                  bh = 88h  ... Normal Table Char
  1496. ;               ah != 0 ... CChar
  1497. ;                  ax = cchar
  1498. ;                  bh = attr1
  1499. ;
  1500.         cmp     al, 0a0h
  1501.         ja      CheckCont0
  1502. ascii:          xor     bh, bh
  1503.         cmp     al, 1fh
  1504.         jbe     testAscii
  1505. isAscii:        xor     ah, ah
  1506.         cmp     ScrType[si+1], 2
  1507.         jne     isAsciiRet0
  1508.         cmp     inScanText, 1
  1509.         jne     isAsciiRet0
  1510. ;                mov     ScrType[si+1], 0
  1511.         shl     si, 1
  1512.         mov     byte ptr ScrBuf[si+3], 00h
  1513.         shr     si, 1
  1514. isAsciiRet0:    call    TestFirst
  1515.         ret
  1516. ;
  1517. CheckCont0:     cmp     al, 0ffh
  1518.         je      ascii
  1519.         mov     ah, bl
  1520.         push    ax
  1521.         push    si
  1522.         jmp     ContCheck
  1523. ;
  1524. testAscii:      cmp     al, 10h
  1525.         jb      isAscii
  1526.         cmp     al, 12h
  1527.         jb      isAsciiTab
  1528.         cmp     al, 17h
  1529.         jb      isAscii
  1530. isAsciiTab:     cmp     isTreatTab, 1
  1531.         jne     isAscii
  1532.         cmp     TextMode, 1
  1533.         jne     isAscii
  1534.         mov     ah, bl
  1535.         push    ax
  1536.         push    dx
  1537.         push    si
  1538.         call    CheckUpper
  1539.         call    TestFirst
  1540.         pop     si
  1541.         pop     dx
  1542.         pop     ax
  1543.         mov     bh, 86h
  1544.         mov     bl, ah
  1545.         xor     ah, ah
  1546.         ret
  1547. ;
  1548. ;
  1549. CheckTab:       or      dh, dh
  1550.         jz      CheckLast0
  1551.         xor     bh, bh
  1552.         mov     bl, XMax
  1553.         sub     si, bx
  1554.         cmp     ScrType[si], 80h
  1555.         jb      CheckLast
  1556.         push    si
  1557.         shl     si, 1
  1558.         mov     ah, byte ptr ScrBuf[si] ; upper char
  1559.         call    TestMatchUD
  1560.         pop     si
  1561.         jc      CheckLast
  1562.         add     si, bx
  1563.         jmp     isTabChar
  1564. ;
  1565. CheckLast:      add     si, bx
  1566. CheckLast0:     or      dx, dx
  1567.         jz      CheckNext
  1568.         mov     ch, ScrType[si-1]
  1569.         or      ch, ch
  1570.         jz      CheckNext
  1571.         cmp     ch, 86h
  1572.         jb      toCheckL4
  1573.         push    si
  1574.         shl     si, 1
  1575.         mov     ah, byte ptr ScrBuf[si-2] ; last char
  1576.         call    TestMatchLR
  1577.         pop     si
  1578.         jc      CheckNext
  1579.         jmp     isTabChar
  1580. ;
  1581. CheckNext:      mov     cl, ScrType[si+1]
  1582.         cmp     cl, 83h
  1583.         jb      toCheckL4
  1584.         push    si
  1585.         shl     si, 1
  1586.         mov     ah, al
  1587.         mov     al, byte ptr ScrBuf[si+2]
  1588.         call    TestMatchLR
  1589.         mov     al, ah
  1590.         pop     si
  1591.         jc      toCheckL4
  1592. ;
  1593. isTmpTab:       pop     si
  1594.         pop     ax
  1595.         mov     bh, 83h
  1596.         mov     bl, ah
  1597.         xor     ah, ah
  1598.         call    TestFirst
  1599.         ret
  1600. ;
  1601. trunChecked:    pop     si
  1602.         mov     al, bl
  1603. toChecked:      jmp     TabChecked
  1604. ;
  1605. toCheckL4:      cmp     dl, 3
  1606.         jb      toChecked
  1607.         or      ch, ch
  1608.         jz      toChecked
  1609.         mov     ah, al
  1610.         mov     bl, al
  1611.         push    si
  1612.         shl     si, 1
  1613.         mov     bh, 3
  1614. L4Loop:         mov     al, ah
  1615.         mov     ah, byte ptr ScrBuf[si-2]
  1616.         cmp     ah, 0b0h
  1617.         jb      trunChecked
  1618.         cmp     ah, 0dfh
  1619.         ja      trunChecked
  1620.         call    TestMatchLR
  1621.         jc      trunChecked
  1622.         sub     si, 2
  1623.         dec     bh
  1624.         jnz     L4Loop
  1625.         pop     si
  1626.         cmp     dl, 4
  1627.         jb      SkipChange
  1628.         cmp     ScrType[si-4], 1
  1629.         jne     SkipChange
  1630.         mov     al, 04h
  1631.         call    LeftToTab
  1632. SkipChange:     sub     si, 3
  1633.         sub     dl, 3
  1634.         call    CurToTab
  1635.         call    TreatUpper
  1636.         inc     dl
  1637.         inc     si
  1638.         call    CurToTab
  1639.         call    TreatUpper
  1640.         inc     dl
  1641.         inc     si
  1642.         call    CurToTab
  1643.         call    TreatUpper
  1644.         inc     dl
  1645.         inc     si
  1646.         jmp     toTab
  1647. ;
  1648. isTabChar:      push    dx
  1649.         call    CheckUpper
  1650.         pop     dx
  1651. toTab:          pop     si
  1652.         pop     ax
  1653. trunTab:        call    TestFirst
  1654.         mov     bh, 88h
  1655.         mov     bl, ah
  1656.         xor     ah, ah
  1657.         ret
  1658. ;
  1659. toAscii:        pop     si
  1660.         pop     ax
  1661.         mov     bh, 80h
  1662.         mov     bl, ah
  1663.         xor     ah, ah
  1664. ;
  1665.         cmp     ScrType[si+1], 1
  1666.         jne     toAsciiRet
  1667.         cmp     inScanText, 1
  1668.         jne     toAsciiRet
  1669.         cmp     dl, ChNumX
  1670.         je      toAsciiRet
  1671. ;                mov     ScrType[si+1], 0
  1672.         shl     si, 1
  1673.         mov     byte ptr ScrBuf[si+3], 00h
  1674.         shr     si, 1
  1675. toAsciiRet:     call    TestFirst
  1676.         mov     first, al
  1677.         mov     xy, dx
  1678.         ret
  1679. ;
  1680. ;
  1681. ContCheck:      cmp     al, 0b0h
  1682.         jb      TabChecked
  1683.         cmp     al, 0dfh
  1684.         ja      TabChecked
  1685.         cmp     TextMode, 1
  1686.         jne     TabChecked
  1687.         cmp     isTreatTab, 1
  1688.         jne     TabChecked
  1689.         jmp     CheckTab
  1690. ;
  1691. AddNext:        cmp     dl, ChNumX
  1692.         je      toAscii
  1693.         mov     bh, ScrType[si+1]
  1694.         cmp     bh, 1
  1695.         jbe     toAscii
  1696.         cmp     bh, 80h
  1697.         ja      toAscii
  1698.         mov     cl, al
  1699.         shl     si, 1
  1700.         mov     ax, ScrBuf[si+2] ; ah = attr2, al = cc2
  1701.         cmp     cl, 0feh
  1702.         jne     NextCont1
  1703.         cmp     al, 0b0h
  1704.         je      toTab
  1705. NextCont1:      pop     si
  1706.         pop     bx               ; bh = attr1, bl = cc1
  1707.         mov     cl, ah
  1708.         mov     ah, bl           ; ah = cc1
  1709.         mov     bl, cl           ; bl = attr2
  1710.         mov     inAddNext, 1
  1711. ;
  1712.         cmp     ScrType[si+2], 2
  1713.         jne     AddNextRet
  1714.         cmp     inScanText, 1
  1715.         jne     AddNextRet
  1716.         mov     cl, ChNumX
  1717.         sub     cl, dl
  1718.         cmp     cl, 2
  1719.         jb      AddNextRet
  1720. ;                mov     ScrType[si+2], 0
  1721.         shl     si, 1
  1722.         mov     byte ptr ScrBuf[si+5], 00h
  1723.         shr     si, 1
  1724. AddNextRet:     mov     cx, dx
  1725.         inc     cl
  1726.         cmp     cx, xy
  1727.         je      toReFirst
  1728.         call    TestFirst
  1729. toReFirst:      mov     first, 0
  1730.         ret
  1731. ;
  1732. TabChecked:     cmp     DispMode, 6
  1733.         jbe     tCont0
  1734.         cmp     first, 0
  1735.         je      trunAscii
  1736. tCont0:         or      dx, dx
  1737.         jz      AddNext
  1738.         cmp     inScanText, 1
  1739.         jne     TabSkipVR
  1740.         or      dl, dl
  1741.         jz      trunNext
  1742. TabSkipVR:      mov     ah, ScrType[si-1]
  1743.         or      ah, ah
  1744.         jz      trunNext
  1745.         cmp     ah, 83h
  1746.         ja      trunNext
  1747.         cmp     ah, 2
  1748.         jne     tConta
  1749.         cmp     ScrType[si-2], 1
  1750.         je      trunNext
  1751. ;
  1752. tConta:         shl     si, 1
  1753.         mov     bx, ScrBuf[si-2] ; bh = attr1, bl = cc1
  1754.         cmp     bl, 0feh
  1755.         jne     tContb
  1756.         cmp     al, 0b0h
  1757.         jne     tContb
  1758.         jmp     toTab
  1759. ;
  1760. trunAscii:      jmp     toAscii
  1761. ;
  1762. trunNext:       jmp     AddNext
  1763. ;
  1764. tContb:         pop     si
  1765.         pop     ax               ; ah = attr2, al = cc2
  1766.         mov     cl, ah
  1767.         mov     ah, bl           ; ah = cc1
  1768.         mov     bl, cl           ; bl = attr2
  1769.         or      dl, dl
  1770.         jnz     SkipEOL
  1771.         dec     dh
  1772.         mov     dl, XMax
  1773. SkipEOL:        dec     dl
  1774.         dec     si
  1775.         cmp     ah, al
  1776.         jne     toCCRet1
  1777.         cmp     dl, 2
  1778.         jb      toCCRet1
  1779.         cmp     word ptr ScrType[si+2], 8888h
  1780.         jne     toCCRet1
  1781.         cmp     al, 0b0h
  1782.         jb      toCCRet1
  1783.         je      toCCcont0
  1784.         cmp     al, 0b1h
  1785.         je      toCCcont0
  1786.         cmp     al, 0b2h
  1787.         je      toCCcont0
  1788.         cmp     al, 0c4h
  1789.         jb      toCCRet1
  1790.         je      toCCcont0
  1791.         cmp     al, 0cdh
  1792.         jne     toCCRet1
  1793. ;
  1794. toCCcont0:      shl     si, 1
  1795.         cmp     al, byte ptr ScrBuf[si+4]
  1796.         jne     toCCcont1
  1797.         cmp     al, byte ptr ScrBuf[si+6]
  1798.         jne     toCCcont1
  1799.         shr     si, 1
  1800.         mov     ScrType[si], 88h
  1801.         inc     dl
  1802.         inc     si
  1803.         xor     ah, ah
  1804.         mov     bh, 88h
  1805.         call    TestFirst
  1806.         ret
  1807. ;
  1808. toCCcont1:      shr     si, 1
  1809. toCCRet1:       cmp     ScrType[si+2], 2
  1810.         jne     toCCRetn
  1811.         cmp     inScanText, 1
  1812.         jne     toCCRetn
  1813.         mov     cl, ChNumX
  1814.         sub     cl, dl
  1815.         cmp     cl, 2
  1816.         jb      toCCRetn
  1817. ;                mov     ScrType[si+2], 0
  1818.         shl     si, 1
  1819.         mov     byte ptr ScrBuf[si+5], 00h
  1820.         shr     si, 1
  1821. toCCRetn:       call    TestFirst
  1822.         ret
  1823. CheckCharType   endp
  1824. ;               -------------------------------
  1825. PutChar         proc    near
  1826. ;
  1827. ;       IN:     al = char
  1828. ;               bl = attr
  1829. ;               dx = Pos
  1830. ;               si = BufOfs
  1831. ;
  1832.         mov     WaitTime, 0
  1833.         cmp     dh, YMax
  1834.         ja      PutCharRetn
  1835. ;              
  1836. PutCharLoop:    call    CheckCharType
  1837.         or      ah, ah
  1838.         jnz     PutCharToCC
  1839.         call    WriteScrBuf
  1840.         call    inDrawC
  1841.         ret
  1842. ;
  1843. PutCharToCC:    call    PutCC
  1844. PutCharRetn:    ret
  1845. ;
  1846. comment @
  1847. PutToVirScr:    cmp     dh, YLimit
  1848.         jae     PutCharRetn
  1849.         cmp     dh, YWrt
  1850.         jb      skipSetXYWrt
  1851.         je      skipSetYWrt
  1852.         mov     YWrt, dh
  1853.         mov     XWrt, 0
  1854.         jmp     skipSetXYWrt
  1855. ;
  1856. skipSetYWrt:    cmp     dl, XWrt
  1857.         jbe     skipSetXYWrt
  1858.         mov     XWrt, dl
  1859. skipSetXYWrt:   mov     bh, 0
  1860.         call    WriteScrBuf
  1861.         ret
  1862.     @
  1863. PutChar         endp
  1864. ;               -------------------------------
  1865. FillBlanks      proc    near
  1866. ;
  1867. ;        IN:    bl = attr
  1868. ;               cl = num
  1869. ;               dx = Pos
  1870. ;
  1871.         push    es
  1872.         shr     bl, 1
  1873.         shr     bl, 1
  1874.         shr     bl, 1
  1875.         shr     bl, 1
  1876.         xor     ch, ch
  1877.         call    FillBG
  1878.         pop     es
  1879.         ret
  1880. FillBlanks      endp
  1881. ;               -------------------------------
  1882. ClearArea       proc    near
  1883. ;
  1884. ;       IN:     al = Clear Lines
  1885. ;               bh = attr
  1886. ;               ch = top
  1887. ;               cl = left
  1888. ;               dx = right
  1889. ;
  1890.         push    es
  1891.         push    di
  1892.         push    bp
  1893.         push    ds
  1894.         pop     es
  1895.         xor     ah, ah
  1896.         mov     bp, ax
  1897.         mov     ah, al
  1898.         mov     al, dl
  1899.         cmp     first, 0
  1900.         je      ClearSkip0
  1901.         mov     dx, xy
  1902.         cmp     dh, ch
  1903.         jb      ClearSkip0
  1904.         add     ah, ch
  1905.         cmp     dh, ah
  1906.         ja      ClearSkip0
  1907.         cmp     dl, cl
  1908.         jb      ClearSkip0
  1909.         cmp     dl, al
  1910.         ja      ClearSkip0
  1911.         mov     first, 0
  1912. ClearSkip0:     mov     dx, cx
  1913.         push    dx
  1914.         sub     al, cl
  1915.         inc     al
  1916.         mov     cl, al
  1917.         mov     bl, bh
  1918.         mov     al, ch
  1919.         mov     dh, XMax
  1920.         mul     dh
  1921.         xor     dh, dh
  1922.         xor     ch, ch
  1923.         add     ax, dx
  1924.         pop     dx
  1925. ClearLoop:      push    cx
  1926.         push    bx
  1927.         push    dx
  1928.         push    ax
  1929.         push    ax
  1930.         push    cx
  1931.         lea     di, ScrBuf
  1932.         shl     ax, 1
  1933.         add     di, ax
  1934.         mov     ah, bh
  1935.         mov     al, 20h
  1936.         cld
  1937.         rep     stosw
  1938.         pop     cx
  1939.         pop     ax
  1940.         push    ax
  1941.         push    cx
  1942.         lea     di, ScrType
  1943.         add     di, ax
  1944.         xor     al, al
  1945.         cld
  1946.         rep     stosb
  1947.         pop     cx
  1948.         push    cx
  1949.         push    bx
  1950.         mov     bl, bh
  1951.         call    FillBlanks
  1952.         pop     bx
  1953.         pop     cx
  1954.         pop     ax
  1955.         cmp     TextMode, 1
  1956.         jne     ClearSkip1
  1957.         push    es
  1958.         shl     ax, 1
  1959.         mov     di, ax
  1960.         mov     ax, TextVRamSEG
  1961.         mov     es, ax
  1962.         mov     ah, bh
  1963.         mov     al, 20h
  1964.         cld
  1965.         rep     stosw
  1966.         pop     es
  1967. ClearSkip1:     xor     dh, dh
  1968.         mov     dl, XMax
  1969.         pop     ax
  1970.         add     ax, dx
  1971.         pop     dx
  1972.         pop     bx
  1973.         pop     cx
  1974.         inc     dh
  1975.         dec     bp
  1976.         jne     ClearLoop
  1977.         pop     bp
  1978.         pop     di
  1979.         pop     es
  1980.         ret
  1981. ClearArea       endp
  1982. ;               -------------------------------
  1983. PreColors       proc    near
  1984.         push    es
  1985.         push    di
  1986.         push    dx
  1987.         mov     ax, YbMax
  1988.         xor     cx, cx
  1989.         call    CalcVRamOfs  ; es:di = VRam Addr
  1990.         mov     PreColor, di
  1991.         mov     dx, GCindex
  1992.         mov     ax, 0f01h
  1993.         out     dx, ax       ; enable SET/RESET
  1994.         mov     cx, 16
  1995.         xor     bl, bl
  1996. PreColorLoop:   mov     ah, bl
  1997.         xor     al, al
  1998.         out     dx, ax       ; Set Back Color
  1999.         mov     al, 0ffh
  2000.         mov     es:[di], al  ; Write Back Color
  2001.         inc     bl
  2002.         inc     di
  2003.         loop    PreColorLoop
  2004.         mov     ax, 0001h
  2005.         out     dx, ax       ; disable SET/RESET
  2006.         pop     dx
  2007.         pop     di
  2008.         pop     es
  2009.         ret
  2010. PreColors       endp
  2011. ;               -------------------------------
  2012. LoadFontAB      proc    near
  2013.         mov     al, DispMode
  2014.         cmp     al, 0fh
  2015.         je      FontToEGA
  2016.         cmp     al, 10h
  2017.         je      FontToEGA
  2018.         mov     al, 4
  2019.         jmp     LoadFontTo
  2020. ;
  2021. FontToEGA:      mov     al, 1
  2022. LoadFontTo:     mov     ah, 11h
  2023.         mov     bl, 0
  2024.         call    EGAVGAFontOpr
  2025.         ret
  2026. LoadFontAB      endp
  2027. ;               -------------------------------
  2028. Clear           proc    near
  2029. ;
  2030. ;       IN:     bh = attr0
  2031. ;
  2032.         push    di
  2033.         mov     al, YMax
  2034. ;                mov     YWrt, al
  2035. ;                mov     XWrt, 0
  2036.         inc     al
  2037.         xor     cx, cx
  2038.         mov     dl, ChNumX
  2039.         push    bx
  2040.         call    ClearArea
  2041.         pop     ax
  2042.         mov     bx, CharNumMax
  2043.         mov     cx, BUFSIZE
  2044.         sub     cx, bx
  2045.         jbe     ClearRet0
  2046.         push    es
  2047.         shl     bx, 1
  2048.         lea     di, ScrBuf
  2049.         add     di, bx
  2050.         mov     dx, ds
  2051.         mov     es, dx
  2052.         mov     ah, attr0
  2053.         mov     al, 20h
  2054.         cld
  2055.         rep     stosw
  2056.         pop     es
  2057. ClearRet0:      pop     di
  2058.         ret
  2059. Clear           endp
  2060. ;               -------------------------------
  2061. ClearTextPage   proc    near
  2062.         push    di
  2063.         cmp     TextMode, 1
  2064.         jne     ClearXPageRetn
  2065.         xor     ch, ch
  2066.         mov     cl, TextPageMax
  2067.         dec     cl
  2068.         jz      ClearXPageRetn
  2069.         mov     bx, TextVRamSEG
  2070.         mov     ax, 100h
  2071. ClearXPageLoop: push    ax
  2072.         push    cx
  2073.         xor     di, di
  2074.         add     bx, ax
  2075.         mov     es, bx
  2076.         mov     ax, 0720h
  2077.         mov     cx, CharNumMax
  2078.         cld
  2079.         rep     stosw
  2080.         pop     cx
  2081.         pop     ax
  2082.         loop    ClearXPageLoop
  2083. ClearXPageRetn: pop     di
  2084.         ret
  2085. ClearTextPage   endp
  2086. ;               -------------------------------
  2087. GCenable        proc    near
  2088. ;
  2089. ;       IN:     ah = 00 ... Disable PAC
  2090. ;               ah = 20 ... Enable PAC
  2091. ;
  2092.         push    dx
  2093.         cli
  2094.         mov     dx, 3dah
  2095.         in      al, dx
  2096.         mov     dx, 3c0h
  2097.         mov     al, ah
  2098.         or      al, 0fh
  2099.         out     dx, al
  2100.         sti
  2101.         pop     dx
  2102.         ret
  2103. GCenable        endp
  2104. ;               -------------------------------
  2105. SetVGAStartAddr proc    near
  2106.         cmp     cs:TextMode, 1
  2107.         je      VGAStartCont0
  2108.         ret
  2109. VGAStartCont0:  push    ax
  2110.         push    dx
  2111.         mov     dx, GCindex
  2112.         mov     ax, 0106h
  2113.         out     dx, ax
  2114.         mov     dx, 3c4h
  2115.         mov     ax, 0404h
  2116.         out     dx, ax
  2117.         mov     ah, cs:VRamSEGOff
  2118.         or      ah, ah
  2119.         jz      VGAStartEnd0
  2120.         push    es
  2121.         xor     dx, dx
  2122.         mov     es, dx
  2123.         mov     al, 0ch
  2124.         mov     dx, es:[463h]
  2125.         pop     es
  2126.         out     dx, al
  2127.         inc     dx
  2128.         mov     al, ah
  2129.         out     dx, al
  2130. VGAStartEnd0:   pop     dx
  2131.         pop     ax
  2132.         ret
  2133. SetVGAStartAddr endp
  2134. ;               -------------------------------
  2135. DeterVGAStart   proc    near
  2136.         push    es
  2137.         push    ds
  2138.         mov     ax, 0a000h
  2139.         mov     ds, ax
  2140.         mov     ax, 0b000h
  2141.         mov     es, ax
  2142.         mov     word ptr es:[0f000h], 0
  2143.         mov     word ptr ds:[0f000h], 8888h
  2144.         cmp     word ptr es:[0f000h], 8888h
  2145.         mov     word ptr ds:[0f000h], 0
  2146.         pop     ds
  2147.         pop     es
  2148.         jne     NoStartOffset
  2149.         mov     VRamSEG, 0ae90h
  2150.         mov     VRamSEGOff, 0e9h
  2151.         mov     TextPageMax, 6
  2152.         call    SetVGAStartAddr
  2153.         ret
  2154. NoStartOffset:  mov     TextPageMax, 8
  2155.         ret
  2156. DeterVGAStart   endp
  2157. ;               -------------------------------
  2158. CalcCharNum     proc    near
  2159.         xor     ax, ax
  2160.         xor     bx, bx
  2161.         mov     cx, 32
  2162.         mov     dl, nHigh
  2163.         mov     dh, XMax
  2164. CalcNumLoop:    push    ax
  2165.         push    dx
  2166.         mul     dh
  2167.         mov     BufOfs[bx], ax   ; *= XMax
  2168.         xor     dh, dh
  2169.         mul     dx
  2170.         mov     VRamAddr[bx], ax ; *= nHigh
  2171.         pop     dx
  2172.         pop     ax
  2173.         inc     ax
  2174.         inc     bx
  2175.         inc     bx
  2176.         loop    CalcNumLoop
  2177.         dec     dh
  2178.         mov     ChNumX, dh   ; ChNumX = XMax - 1
  2179. ;
  2180.         xor     bh, bh
  2181.         mov     bl, YMax
  2182.         inc     bl
  2183.         shl     bx, 1
  2184.         mov     ax, BufOfs[bx]
  2185.         mov     CharNumMax, ax
  2186.         mov     al, YMax
  2187. ;
  2188. ;                mov     YWrt, al
  2189. ;                mov     XWrt, 0
  2190. ;                mov     ax, BUFSIZE
  2191. ;                div     byte ptr XMax
  2192. ;
  2193.         inc     al
  2194.         mov     byte ptr YLimit, al
  2195.         ret
  2196. CalcCharNum     endp
  2197. ;               -------------------------------
  2198. SetBiosMode     proc    near
  2199. ;
  2200. ;       IN:     al = Video Mode
  2201. ;
  2202.         xor     ah, ah
  2203.         and     al, 7fh
  2204.         pushf
  2205.         call    dword ptr OldInt10
  2206.         ret
  2207. SetBiosMode     endp
  2208. ;               -------------------------------
  2209. SetDispMode     proc    near
  2210. ;
  2211. ;       Int 10h Func 00h: Set Video Mode
  2212. ;       IN:     ah = 0
  2213. ;               al = vmode
  2214. ;
  2215.         push    di
  2216.         mov     CursorEnable, 0
  2217.         mov     TimeEnable, 0
  2218.         mov     inSetVMode, 1
  2219.         mov     FullPmtLine, 0
  2220.         mov     MyMode, 0
  2221.         xor     dx, dx
  2222.         mov     es, dx
  2223.         push    ax
  2224.         mov     bl, al
  2225.         call    GCenable
  2226.         mov     al, bl
  2227.         and     al, 7fh
  2228.         cmp     al, 2
  2229.         je      toCEmode
  2230.         cmp     al, 3
  2231.         je      toWhichText
  2232.         cmp     al, 6
  2233.         je      toCCmode
  2234.         jmp     toOld10Mode
  2235. ;
  2236. toCCmode:       mov     al, 12h
  2237.         call    SetBiosMode
  2238.         mov     VRamSEG, 0a000h
  2239.         mov     VRamSEGOff, 0
  2240.         mov     ah, 1
  2241.         call    SwitchVRamSEG
  2242.         mov     word ptr es:[44ch], 1000h
  2243.         mov     word ptr es:[44eh], 0
  2244.         mov     byte ptr es:[462h], 0
  2245.         mov     TextMode, 0
  2246.         jmp     VModeCont0
  2247. ;
  2248. toWhichText:    cmp     CurTextMode, 1
  2249.         jb      toCEmode
  2250.         je      toCCmode
  2251.         cmp     in43Lines, 1
  2252.         je      trunCEmode
  2253.         jmp     toOld10Mode
  2254. ;
  2255. trunCEmode:     mov     in43Lines, 0
  2256.         mov     CurTextMode, 0
  2257. ;
  2258. toCEmode:       mov     al, bl
  2259.         pushf
  2260.         call    dword ptr OldInt10
  2261.         push    word ptr es:[44ch]
  2262.         push    word ptr es:[44eh]
  2263.         push    word ptr es:[462h]
  2264.         mov     al, 12h
  2265.         call    SetBiosMode
  2266.         mov     ah, 0
  2267.         call    SwitchVRamSEG
  2268.         pop     ax
  2269.         mov     es:[462h], al
  2270.         pop     ax
  2271.         mov     word ptr es:[44eh], ax
  2272.         pop     word ptr es:[44ch]
  2273.         mov     bx, TextVRamSEG
  2274.         and     bx, 0b800h
  2275.         add     bx, ax
  2276.         mov     TextVRamSEG, bx
  2277.         xor     ah, ah
  2278.         call    GCenable
  2279.         mov     TextMode, 1
  2280.         call    DeterVGAStart
  2281. ;
  2282. VModeCont0:     mov     MyMode, 1
  2283.         mov     FullPmtLine, 1
  2284.         mov     nHigh, 18
  2285.         mov     cHigh, 16
  2286.         mov     XMax, 80
  2287.         mov     YMax, 24
  2288.         mov     XbMax, 640
  2289.         mov     YbMax, 480
  2290.         call    CalcCharNum
  2291.         pop     ax
  2292.         mov     dl, al
  2293.         and     al, 7fh
  2294.         mov     DispMode, al
  2295.         mov     es:[449h], al
  2296.         mov     al, XMax
  2297.         mov     es:[44ah], ax
  2298.         mov     di, 450h
  2299.         mov     cx, 8
  2300.         xor     ax, ax
  2301.         cld
  2302.         rep     stosw
  2303.         mov     byte ptr es:[484h], 18h
  2304.         mov     word ptr es:[485h], 10h
  2305.         call    PreColors
  2306.         mov     al, dl
  2307.         and     dl, 7fh
  2308.         cmp     dl, 3
  2309.         ja      toClear
  2310.         test    al, 80h
  2311.         jnz     VModeNoClear
  2312. toClear:        call    LoadFontAB
  2313.         mov     bh, attr0
  2314.         call    Clear
  2315.         jmp     VModeCont1
  2316. ;
  2317. VModeNoClear:   call    DrawScrBuf
  2318. ;
  2319. VModeCont1:     mov     cx, 0e0fh
  2320.         mov     es:[460h], cx
  2321.         mov     word ptr CursorEnd, cx
  2322.         call    SetVGAStartAddr
  2323.         call    MakeAuthorStrx
  2324.         call    message
  2325.         jmp     VModeRet0
  2326. ;
  2327. ;
  2328. toOld10Mode:    and     al, 7fh
  2329.         cmp     CurTextMode, 1
  2330.         jne     VModeCont2
  2331.         cmp     al, 12h
  2332.         jne     VModeCont2
  2333.         pop     ax
  2334.         and     al, 7fh
  2335.         push    ax
  2336.         jmp     toCCmode
  2337. ;
  2338. VModeCont2:     mov     TextMode, 0
  2339.         mov     DispMode, al
  2340.         mov     VRamSEG, 0a000h
  2341.         mov     VRamSEGOff, 0
  2342.         pop     ax
  2343.         call    SetBiosMode
  2344.         mov     al, DispMode
  2345.         cmp     al, 12h
  2346.         je      VModeToVGA
  2347.         cmp     al, 11h
  2348.         je      VModeToVGA
  2349.         cmp     al, 10h
  2350.         je      VModeToEGA
  2351.         cmp     al, 0fh
  2352.         je      VModeToEGA
  2353.         mov     MyMode, 0
  2354.         jmp     VModeRetn
  2355. ;
  2356. VModeToVGA:     mov     MyMode, 1
  2357.         mov     nHigh, 16
  2358.         mov     cHigh, 16
  2359.         mov     XMax, 80
  2360.         mov     YMax, 29
  2361.         mov     XbMax, 640
  2362.         mov     YbMax, 480
  2363.         jmp     VModeSetVars
  2364. ;
  2365. VModeToEGA:     mov     MyMode, 1
  2366.         mov     nHigh, 14
  2367.         mov     cHigh, 14
  2368.         mov     XMax, 80
  2369.         mov     YMax, 24
  2370.         mov     XbMax, 640
  2371.         mov     YbMax, 350
  2372. VModeSetVars:   mov     ah, 1
  2373.         call    SwitchVRamSEG
  2374.         call    CalcCharNum
  2375.         call    LoadFontAB
  2376.         call    PreColors
  2377.         mov     bh, attr0
  2378.         call    Clear
  2379. ;
  2380. VModeRet0:      call    ClearTextPage
  2381.         mov     ah, 20h
  2382.         call    GCenable
  2383.         mov     word ptr CurX, 0
  2384. VModeRetn:      mov     inSetVMode, 0
  2385.         mov     CursorActive, 0
  2386.         mov     CursorEnable, 1
  2387.         mov     TimeEnable, 1
  2388.         pop     di
  2389.         ret
  2390. SetDispMode     endp
  2391. ;               -------------------------------
  2392. NoCursor        proc    near
  2393.         push    ax
  2394.         push    bx
  2395.         push    cx
  2396.         push    dx
  2397.         call    HideCursor
  2398.         pop     dx
  2399.         pop     cx
  2400.         pop     bx
  2401.         pop     ax
  2402.         ret
  2403. NoCursor        endp
  2404. ;               -------------------------------
  2405. WriteTextScr    proc    near
  2406.         mov     al, CursorEnable
  2407.         mov     ah, TimeEnable
  2408.         push    ax
  2409.         mov     CursorEnable, 0
  2410.         mov     TimeEnable, 0
  2411.         push    es
  2412.         push    si
  2413.         push    di
  2414.         mov     cx, CharNumMax
  2415.         mov     ax, TextVRamSEG
  2416.         mov     es, ax
  2417.         lea     si, ScrBuf
  2418.         mov     di, 0
  2419.         cld
  2420.         rep     movsw
  2421.         pop     di
  2422.         pop     si
  2423.         pop     es
  2424. ;
  2425.         pop     ax
  2426.         mov     CursorEnable, al
  2427.         mov     TimeEnable, ah
  2428.         ret
  2429. WriteTextScr    endp
  2430. ;               -------------------------------
  2431. SaveTextScr     proc    near
  2432.         mov     al, CursorEnable
  2433.         mov     ah, TimeEnable
  2434.         push    ax
  2435.         mov     CursorEnable, 0
  2436.         mov     TimeEnable, 0
  2437.         push    es
  2438.         push    ds
  2439.         push    si
  2440.         push    di
  2441.         lea     di, ScrBuf
  2442.         push    ds
  2443.         pop     es
  2444.         mov     cx, CharNumMax
  2445.         mov     ax, TextVRamSEG
  2446.         mov     ds, ax
  2447.         mov     si, 0
  2448.         cld
  2449.         rep     movsw
  2450.         pop     di
  2451.         pop     si
  2452.         pop     ds
  2453.         pop     es
  2454. ;
  2455.         pop     ax
  2456.         mov     CursorEnable, al
  2457.         mov     TimeEnable, ah
  2458.         ret
  2459. SaveTextScr     endp
  2460. ;               -------------------------------
  2461. DrawScrBuf      proc    near
  2462.         cmp     inDrawScrBuf, 0
  2463.         je      dsCont0
  2464.         ret
  2465. ;
  2466. inDrawScrBuf    db      0
  2467. ;
  2468. dsCont0:        mov     inDrawScrBuf, 1
  2469.         call    SetVGAStartAddr
  2470.         call    MakeAuthorStrx
  2471.         mov     al, CursorEnable
  2472.         mov     ah, TimeEnable
  2473.         push    ax
  2474.         mov     CursorEnable, 0
  2475.         mov     TimeEnable, 0
  2476.         push    es
  2477.         push    si
  2478.         push    di
  2479.         lea     si, ScrBuf
  2480.         mov     cx, CharNumMax
  2481.         xor     dx, dx
  2482.         xor     bx, bx
  2483. DrawScrLoop:    push    dx
  2484.         push    cx
  2485.         push    bx
  2486.         push    si
  2487.         mov     ax, [si]
  2488.         mov     si, bx
  2489.         mov     bl, ah
  2490.         call    PutChar
  2491.         pop     si
  2492.         pop     bx
  2493.         pop     cx
  2494.         pop     dx
  2495.         inc     bx
  2496.         add     si, +2
  2497.         inc     dl
  2498.         cmp     dl, XMax
  2499.         jne     DrawScrSkip
  2500.         mov     dl, 0
  2501.         inc     dh
  2502. DrawScrSkip:    loop    DrawScrLoop
  2503.         pop     di
  2504.         pop     si
  2505.         pop     es
  2506. ;
  2507.         pop     ax
  2508.         mov     CursorEnable, al
  2509.         mov     TimeEnable, ah
  2510.         mov     inDrawScrBuf, 0
  2511.         ret
  2512. DrawScrBuf      endp
  2513. ;               -------------------------------
  2514. TreatPos        proc    near
  2515. ;
  2516. ;       IN:     al = 0 ... Save Pos
  2517. ;               al = 1 ... Restore Pos
  2518. ;
  2519.         xor     bx, bx
  2520.         mov     es, bx
  2521.         cmp     al, 1
  2522.         jb      toSavePos
  2523.         je      toRestorePos
  2524.         ret
  2525. toSavePos:      xor     ah, ah
  2526.         call    GetPos
  2527.         mov     TmpPos, dx
  2528.         ret
  2529. toRestorePos:   and     byte ptr es:[449h], 7fh
  2530.         mov     bh, CurPage
  2531.         mov     cx, 0e0fh
  2532.         call    SetCursorType
  2533.         mov     dx, TmpPos
  2534.         call    SetCursorPos
  2535.         ret
  2536. TreatPos        endp
  2537. ;               -------------------------------
  2538. VerifyConvert   proc    near
  2539. ;
  2540. ;       OUT:    CF = 0  ... Ok
  2541. ;               CF = 1  ... Not
  2542. ;
  2543.         test    IntrBusy, I10Busy
  2544.         jnz     VerifyConvNot
  2545. ;                cmp     DrawingCursor, 1
  2546. ;                je      VerifyConvNot
  2547.         cmp     DispMode, 3
  2548.         jne     VerifyConvNot
  2549.         clc
  2550.         ret
  2551. ;
  2552. VerifyConvNot:  stc
  2553.         ret
  2554. VerifyConvert   endp
  2555. ;               -------------------------------
  2556. VModeToCmode    proc    near
  2557. ;
  2558. ;       IN:     bh = 0 ... to CE
  2559. ;               bh = 1 ... to CC
  2560. ;
  2561.         call    VerifyConvert
  2562.         jnc     VMtoCmodeCont0
  2563.         ret
  2564. VMtoCmodeCont0: cmp     bh, CurTextMode
  2565.         jne     VMtoCmodeCont1
  2566.         ret
  2567. VMtoCmodeCont1: mov     CurTextMode, bh
  2568.         mov     al, 0
  2569.         call    TreatPos
  2570.         cmp     MyMode, 1
  2571.         je      VMtoCmodeSkip
  2572.         call    SaveTextScr
  2573. VMtoCmodeSkip:  mov     ax, 83h
  2574.         int     10h
  2575.         mov     al, 1
  2576.         call    TreatPos
  2577.         ret
  2578. VModeToCmode    endp
  2579. ;               -------------------------------
  2580. VModeToEmode    proc    near
  2581.         call    VerifyConvert
  2582.         jnc     toEmodeCont0
  2583.         ret
  2584. toEmodeCont0:   cmp     CurTextMode, 2
  2585.         jne     toEmodeCont1
  2586.         ret
  2587. toEmodeCont1:   mov     CurTextMode, 2
  2588.         mov     al, 0
  2589.         call    TreatPos
  2590.         mov     ax, 03h
  2591.         call    SetDispMode
  2592.         mov     ax, 1003h
  2593.         mov     bl, 0
  2594.         pushf
  2595.         call    dword ptr OldInt10
  2596.         call    WriteTextScr
  2597.         mov     al, 1
  2598.         call    TreatPos
  2599.         mov     dx, TmpPos
  2600.         mov     ah, 02h
  2601.         mov     bh, 0
  2602.         pushf
  2603.         call    dword ptr OldInt10
  2604.         and     IntrBusy, NOT I10Busy
  2605.         ret
  2606. VModeToEmode    endp
  2607. ;               -------------------------------
  2608. ConvertVMode    proc    near
  2609.         cmp     CurTextMode, 1
  2610.         ja      ConvToCEmode
  2611.         je      ConvToEmode
  2612.         mov     bh, 1
  2613.         call    VModeToCmode
  2614.         ret
  2615. ConvToEmode:    call    VModeToEmode
  2616.         ret
  2617. ConvToCEmode:   mov     bh, 0
  2618.         call    VModeToCmode
  2619.         ret
  2620. ConvertVMode    endp
  2621. ;               -------------------------------
  2622. CGACursorEmu    proc    near
  2623.         xor     ax, ax
  2624.         mov     es, ax
  2625.         mov     al, es:[487h]
  2626.         and     al, 1
  2627.         or      al, al
  2628.         jz      EmuCont0
  2629.         ret
  2630. EmuCont0:       mov     cx, es:[460h]
  2631.         mov     al, cl
  2632.         sub     al, ch
  2633.         cmp     cl, 07h
  2634.         ja      EmuSkipAddEnd
  2635.         shl     cl, 1
  2636.         inc     cl
  2637. EmuSkipAddEnd:  cmp     cl, nHigh
  2638.         jb      EmuSkipAdapt
  2639.         mov     cl, nHigh
  2640.         dec     cl
  2641. EmuSkipAdapt:   cmp     ch, 3
  2642.         ja      EmuAdaptCh
  2643.         shl     ch, 1
  2644.         ret
  2645. EmuAdaptCh:     mov     ch, cl
  2646.         sub     ch, al
  2647.         ret
  2648. CGACursorEmu    endp
  2649. ;               -------------------------------
  2650. SetCursorType   proc    near
  2651. ;
  2652. ;       Set Cursor Type:  Int10h -- ah = 1
  2653. ;               (Text Mode Only)
  2654. ;       IN:     ch = cursor start line
  2655. ;               cl = cursor end line
  2656. ;
  2657.         push    cx
  2658.         call    HideCursor
  2659.         pop     cx
  2660.         mov     ah, 1
  2661.         pushf
  2662.         call    dword ptr OldInt10
  2663.         call    CGACursorEmu
  2664.         mov     es:[460h], cx
  2665.         mov     word ptr CursorEnd, cx
  2666.         call    DrawCursor
  2667.         ret
  2668. SetCursorType   endp
  2669. ;               -------------------------------
  2670. VerifyPage      proc    near
  2671. ;
  2672. ;       IN:     bh = Text Page ( ah != 0 )
  2673. ;               es = 0
  2674. ;       OUT:    bh = CurPage ( ah = 0 )
  2675. ;               bh = Sele Page ( ah != 0 )
  2676. ;
  2677.         cmp     bh, CurPage
  2678.         jne     VeriPageCont
  2679.         ret
  2680. VeriPageCont:   or      ah, ah
  2681.         jz      toCurPage
  2682.         and     bh, 7
  2683.         cmp     bh, TextPageMax
  2684.         jae     toCurPage
  2685.         cmp     TextMode, 1
  2686.         jne     toCurPage
  2687.         ret
  2688. toCurPage:      mov     bh, CurPage
  2689.         ret
  2690. VerifyPage      endp
  2691. ;               -------------------------------
  2692. SetCursorPos    proc    near
  2693. ;
  2694. ;       Set Cursor Position:  Int10h -- ah = 2
  2695. ;       IN:     bh = Page (Text Mode Only)
  2696. ;               dx = Pos
  2697. ;
  2698.         push    bx
  2699.         xor     cx, cx
  2700.         mov     es, cx
  2701.         call    VerifyPage
  2702.         cmp     dl, XMax
  2703.         jae     SetPosRetn
  2704.         cmp     dh, YLimit
  2705.         jb      SetPosSkip
  2706.         mov     dh, YLimit
  2707.         dec     dh
  2708. SetPosSkip:     mov     bl, bh
  2709.         xor     bh, bh
  2710.         shl     bl, 1
  2711.         and     bl, 0fh
  2712.         mov     es:[bx+450h], dx
  2713. SetPosRetn:     pop     bx
  2714.         ret
  2715. SetCursorPos    endp
  2716. ;               -------------------------------
  2717. GetPos          proc    near
  2718. ;
  2719. ;       IN:     bh = Page ( ah != 0)
  2720. ;                         ( ah = 0, bh -> CurPage )
  2721. ;       OUT:    dx = Pos
  2722. ;               es = 0
  2723. ;               bh = Text Page
  2724. ;
  2725.         xor     dx, dx
  2726.         mov     es, dx
  2727.         call    VerifyPage
  2728.         push    bx
  2729.         mov     bl, bh
  2730.         xor     bh, bh
  2731.         shl     bx, 1
  2732.         and     bx, 000fh
  2733.         mov     dx, es:[bx+450h]
  2734.         pop     bx
  2735.         ret
  2736. GetPos          endp
  2737. ;               -------------------------------
  2738. GetCursor       proc    near
  2739. ;
  2740. ;       Get Current Cursor Pos & Type:  Int10h -- ah = 3
  2741. ;       IN :    bh = Page (Text Mode Only)
  2742. ;       OUT:    dx = Cursor Pos
  2743. ;               cx = Cursor Type
  2744. ;
  2745.         call    GetPos
  2746.         cmp     dh, YMax
  2747.         jbe     GetCursorRet0
  2748.         mov     dh, YMax
  2749. GetCursorRet0:  mov     cx, es:[460h]
  2750.         mov     [bp+10], dx
  2751.         mov     [bp+12], cx
  2752.         ret
  2753. GetCursor       endp
  2754. ;               -------------------------------
  2755. SelectPage      proc    near
  2756. ;
  2757. ;       Select Active Page for Text Mode:  ah = 05h
  2758. ;       IN:     al = Page
  2759. ;
  2760.         push    ax
  2761.         call    SetVGAStartAddr
  2762.         call    MakeAuthorStrx
  2763.         pop     ax
  2764.         mov     bh, al
  2765.         call    VerifyPage
  2766.         mov     al, bh
  2767.         cmp     al, CurPage
  2768.         jne     SelePageCont
  2769.         ret
  2770. SelePageCont:   cli
  2771.         push    ax
  2772.         mov     bx, TextVRamSEG
  2773.         and     bx, 0b800h
  2774.         add     bh, al
  2775.         mov     TextVRamSEG, bx
  2776.         call    SaveTextScr
  2777.         call    DrawScrBuf
  2778.         pop     bx
  2779.         xor     ax, ax
  2780.         mov     es, ax
  2781.         mov     bh, ah
  2782.         mov     es:[462h], bl
  2783.         mov     CurPage, bl
  2784.         mov     al, bl
  2785.         mov     cl, 4
  2786.         shl     al, cl
  2787.         mov     es:[44fh], al
  2788.         shl     bx, 1
  2789.         and     bx, 000fh
  2790.         sti
  2791.         ret
  2792. SelectPage      endp
  2793. ;               -------------------------------
  2794. ScrollUpDn      proc    near
  2795. ;
  2796. ;       Scroll Up/Down Screen:  ah = 6/7
  2797. ;       IN:     al = scroll line number (0 for all screen)
  2798. ;               bh = attr for fill blank lines
  2799. ;               ch = top
  2800. ;               cl = left
  2801. ;               dh = bottom
  2802. ;               dl = right
  2803. ;
  2804.         push    bp
  2805.         mov     bp, sp
  2806.         sub     sp, 10
  2807.         push    si
  2808.         push    di
  2809.         cmp     ch, dh
  2810.         jbe     ScrollCont0
  2811.         cmp     cl, dl
  2812.         jbe     ScrollCont0
  2813.         jmp     ScrollRetn
  2814. ;
  2815. ScrollCont0:    cmp     dh, YMax
  2816.         jbe     ScrollCont1
  2817.         mov     dh, YMax
  2818. ScrollCont1:    cmp     dl, XMax
  2819.         jb      ScrollCont2
  2820.         mov     dl, ChNumX
  2821. ScrollCont2:    mov     bl, dh
  2822.         sub     bl, ch
  2823.         inc     bl
  2824.         cmp     bl, al
  2825.         jae     ScrollCont3
  2826.         jmp     ScrollRetn
  2827. ;
  2828. ScrollCont3:    call    NoCursor
  2829.         cmp     bl, al
  2830.         je      ScrollClear0
  2831.         or      al, al
  2832.         jz      ScrollClear0
  2833.         mov     [bp-9], ah
  2834.         mov     [bp-1], al
  2835.         mov     [bp-2], bh
  2836.         sub     bl, al
  2837.         mov     [bp-8], bl
  2838.         mov     [bp-3], ch
  2839.         mov     [bp-4], cl
  2840.         mov     [bp-5], dh
  2841.         mov     [bp-6], dl
  2842.         mov     bl, dl
  2843.         sub     bl, cl
  2844.         inc     bl
  2845.         mov     [bp-7], bl
  2846.         jmp     ScrollLines
  2847. ;
  2848. ScrollClear0:   xor     al, al
  2849.         cmp     cx, 0
  2850.         jne     ClearLines
  2851.         mov     al, dl
  2852.         inc     al
  2853.         cmp     al, XMax
  2854.         jne     ClearLines
  2855.         cmp     dh, YMax
  2856.         jne     ClearLines
  2857.         call    Clear
  2858.         jmp     AreaCleared
  2859. ClearLines:     mov     al, dh
  2860.         sub     al, ch
  2861.         inc     al
  2862.         call    ClearArea
  2863. AreaCleared:    jmp     ScrollRetn
  2864. ;
  2865. nToScroll       db      32 dup(0)
  2866. ;
  2867. ScrollLines:    push    ds
  2868.         push    ds
  2869.         pop     es
  2870.         cmp     ah, 7
  2871.         je      SetDownPara
  2872.         mov     dl, cl
  2873.         mov     dh, ch
  2874.         add     dh, al
  2875.         call    CalcBufOfs
  2876.         push    bx
  2877.         lea     si, ScrBuf
  2878.         mov     di, si
  2879.         shl     bx, 1
  2880.         add     si, bx
  2881.         mov     dh, ch
  2882.         call    CalcBufOfs
  2883.         push    bx
  2884.         shl     bx, 1
  2885.         add     di, bx
  2886.         xor     dh, dh
  2887.         mov     dl, XMax
  2888.         jmp     ParaSetted
  2889. ;
  2890. SetDownPara:    mov     dl, cl
  2891.         mov     ch, dh
  2892.         sub     dh, al
  2893.         call    CalcBufOfs
  2894.         push    bx
  2895.         lea     si, ScrBuf
  2896.         mov     di, si
  2897.         shl     bx, 1
  2898.         add     si, bx
  2899.         mov     dh, ch
  2900.         call    CalcBufOfs
  2901.         push    bx
  2902.         shl     bx, 1
  2903.         add     di, bx
  2904.         xor     dh, dh
  2905.         mov     dl, XMax
  2906.         neg     dx
  2907. ParaSetted:     push    dx
  2908.         shl     dx, 1
  2909.         xor     ch, ch
  2910.         mov     cl, [bp-8]   ; high
  2911.         mov     ah, cl
  2912.         mov     cl, [bp-7]   ; width
  2913.         cld
  2914. MvScrBufLoop0:  push    di
  2915.         push    si
  2916.         push    cx
  2917.         xor     bh, bh
  2918.         mov     bl, [bp-8]   ; high
  2919.         sub     bl, ah
  2920.         mov     byte ptr cs:nToScroll[bx], 0
  2921.         push    ax
  2922. MvScrBufLoop1:  lodsw
  2923.         cmp     ax, es:[di]
  2924.         jne     StoreIt
  2925.         cmp     al, ' '
  2926.         jne     StoreIt
  2927.         add     di, +2
  2928.         jmp     SkipStore
  2929. ;
  2930. StoreIt:        stosw
  2931.         mov     al, [bp-7]   ; width
  2932.         sub     al, cl
  2933.         inc     al
  2934.         mov     byte ptr cs:nToScroll[bx], al
  2935. SkipStore:      loop    MvScrBufLoop1
  2936.         pop     ax
  2937.         pop     cx
  2938.         pop     si
  2939.         pop     di
  2940.         add     si, dx
  2941.         add     di, dx
  2942.         dec     ah
  2943.         jnz     MvScrBufLoop0
  2944. ;
  2945.         pop     dx
  2946.         lea     di, ScrType
  2947.         mov     si, di
  2948.         pop     ax
  2949.         add     di, ax
  2950.         pop     cx
  2951.         add     si, cx
  2952.         push    cx
  2953.         push    ax
  2954.         push    dx
  2955.         push    bp
  2956.         xor     ch, ch
  2957.         mov     cl, [bp-7]   ; width
  2958.         mov     bx, cx
  2959.         mov     cl, [bp-8]   ; high
  2960.         mov     bp, cx
  2961.         mov     ax, si
  2962. MvScrTypeLoop:  push    di
  2963.         mov     si, ax
  2964.         mov     cx, bx
  2965.         cld
  2966.         rep     movsb
  2967.         pop     di
  2968.         add     ax, dx
  2969.         add     di, dx
  2970.         dec     bp
  2971.         jne     MvScrTypeLoop
  2972.         pop     bp
  2973.         pop     dx
  2974.         pop     di
  2975.         pop     si
  2976.         push    dx
  2977.         cmp     TextMode, 1
  2978.         jne     ScrollScreen
  2979.         push    es
  2980.         push    ds
  2981.         push    bp
  2982.         shl     dx, 1
  2983.         shl     si, 1
  2984.         shl     di, 1
  2985.         xor     ch, ch
  2986.         mov     cl, [bp-7]   ; width
  2987.         mov     bx, cx
  2988.         mov     cl, [bp-8]   ; high
  2989.         mov     bp, cx
  2990.         mov     ax, TextVRamSEG
  2991.         mov     ds, ax
  2992.         mov     es, ax
  2993.         mov     ax, si
  2994. MvTextLoop:     push    di
  2995.         mov     si, ax
  2996.         mov     cx, bx
  2997.         cld
  2998.         rep     movsw
  2999.         pop     di
  3000.         add     ax, dx
  3001.         add     di, dx
  3002.         dec     bp
  3003.         jne     MvTextLoop
  3004.         pop     bp
  3005.         pop     ds
  3006.         pop     es
  3007. ;
  3008. ScrollScreen:   mov     bl, [bp-1]   ; lines
  3009.         mov     bh, [bp-2]   ; attr
  3010.         mov     dl, [bp-4]   ; left
  3011.         mov     dh, [bp-3]   ; top
  3012.         cmp     byte ptr [bp-9], 06h
  3013.         je      ScrollSkip0
  3014.         mov     dh, [bp-5]   ; bottom
  3015.         inc     dh
  3016. ScrollSkip0:    call    CalcVRamAddr
  3017.         xor     bh, bh
  3018.         mov     bl, [bp-1]   ; lines
  3019.         shl     bx, 1
  3020.         mov     ax, VRamAddr[bx]
  3021.         xor     bh, bh
  3022.         mov     bl, XMax
  3023.         cmp     byte ptr [bp-9], 06h
  3024.         je      ScrollSkip1
  3025.         sub     di, bx
  3026.         neg     ax
  3027. ScrollSkip1:    mov     si, di
  3028.         add     si, ax
  3029.         mov     dx, GCindex
  3030.         mov     ax, 0105h
  3031.         out     dx, ax
  3032.         mov     dx, bx
  3033.         pop     dx
  3034.         push    bp
  3035.         xor     bh, bh
  3036.         mov     bl, [bp-8]   ; high
  3037.         mov     bp, bx
  3038.         xor     bx, bx
  3039.         mov     al, nHigh
  3040.         mov     ah, al
  3041.         push    es
  3042.         pop     ds
  3043. ScrollVLoop0:   push    bx
  3044.         mov     al, ah
  3045.         xor     ch, ch
  3046.         mov     cl, cs:nToScroll[bx]
  3047.         mov     bx, cx
  3048. ScrollVLoop1:   push    di
  3049.         push    si
  3050.         mov     cx, bx
  3051.         cld
  3052.         rep     movsb
  3053.         pop     si
  3054.         pop     di
  3055.         add     si, dx
  3056.         add     di, dx
  3057.         dec     al
  3058.         jne     ScrollVLoop1
  3059.         pop     bx
  3060.         inc     bx
  3061.         dec     bp
  3062.         jne     ScrollVLoop0
  3063.         mov     dx, GCindex
  3064.         mov     ax, 0005h
  3065.         out     dx, ax
  3066.         pop     bp
  3067.         pop     ds
  3068.         cmp     byte ptr [bp-9], 6
  3069.         jne     SetDnClearPara
  3070.         mov     al, [bp-5]
  3071.         sub     al, [bp-1]
  3072.         inc     al
  3073.         mov     [bp-8],al
  3074.         jmp     ScrollClear
  3075. SetDnClearPara: mov     al, [bp-3]
  3076.         mov     [bp-8], al
  3077. ScrollClear:    mov     ch, [bp-8]
  3078.         mov     cl, [bp-4]
  3079.         mov     dl, [bp-6]
  3080.         mov     al, [bp-1]
  3081.         mov     bh, [bp-2]
  3082.         call    ClearArea
  3083. ScrollRetn:     pop     di
  3084.         pop     si
  3085.         mov     sp, bp
  3086.         pop     bp
  3087.         ret
  3088. ScrollUpDn      endp
  3089. ;               -------------------------------
  3090. GetVideo        proc    near
  3091. ;
  3092. ;       IN:     dx = Pos
  3093. ;       OUT:    al = char
  3094. ;               ah = attr
  3095. ;
  3096.         push    bx
  3097.         call    CalcBufOfs
  3098.         shl     bx, 1
  3099.         cmp     TextMode, 1
  3100.         jne     GetVideoScrBuf
  3101. ;
  3102.         mov     ax, TextVRamSEG
  3103.         mov     es, ax
  3104.         mov     ax, es:[bx]
  3105.         pop     bx
  3106.         ret
  3107. ;
  3108. GetVideoScrBuf: mov     ax, ScrBuf[bx]
  3109.         pop     bx
  3110.         ret
  3111. GetVideo        endp
  3112. ;               -------------------------------
  3113. GetCurVideo     proc    near
  3114.         xor     ah, ah
  3115.         call    GetPos
  3116.         call    GetVideo
  3117.         ret
  3118. GetCurVideo     endp
  3119. ;               -------------------------------
  3120. ReadVideo       proc    near
  3121. ;
  3122. ;       Read char & attr of CurPos: ah = 08h
  3123. ;       IN:     bh = page
  3124. ;       OUT:    al = char
  3125. ;               ah = attr
  3126. ;
  3127.         push    bx
  3128.         call    GetPos
  3129.         call    CalcBufOfs
  3130.         shl     bx, 1
  3131.         pop     dx
  3132.         cmp     TextMode, 1
  3133.         jne     GetFromScrBuf
  3134.         mov     ax, TextVRamSEG
  3135.         and     ax, 0b800h
  3136.         or      ah, dh
  3137.         mov     es, ax
  3138.         mov     ax, es:[bx]
  3139.         jmp     TransferIt
  3140. ;
  3141. GetFromScrBuf:  mov     ax, ScrBuf[bx]
  3142.         cmp     FullPmtLine, 1
  3143.         je      TransferIt
  3144.         xor     ah, ah
  3145. TransferIt:     mov     [bp+16], ax
  3146.         ret
  3147. ReadVideo       endp
  3148. ;               -------------------------------
  3149. PutOne          proc    near
  3150.         mov     BiosWait, 0
  3151.         call    GetPos
  3152.         cmp     bh, CurPage
  3153.         jne     OneCont0
  3154.         mov     cl, bl
  3155.         call    CalcBufOfs
  3156.         mov     si, bx
  3157.         mov     bl, cl
  3158. ;
  3159. PutChTo:        cmp     ah, 09h
  3160.         je      OneSkipGetAttr
  3161.         cmp     TextMode, 1
  3162.         je      OneGetFromVRam
  3163.         shl     si, 1
  3164.         mov     bl, byte ptr ScrBuf[si+1]
  3165.         shr     si, 1
  3166.         jmp     OneSkipGetAttr
  3167. ;
  3168. OneGetFromVRam: mov     cx, TextVRamSEG
  3169.         mov     es, cx
  3170.         shl     si, 1
  3171.         mov     bl, es:[si+1]
  3172.         shr     si, 1
  3173. OneSkipGetAttr: call    PutChar
  3174.         ret
  3175. ;
  3176. OneCont0:       mov     cx, TextVRamSEG
  3177.         and     cx, 0b800h
  3178.         add     ch, bh
  3179.         mov     es, cx
  3180.         mov     cx, bx
  3181.         call    CalcBufOfs
  3182.         mov     si, bx
  3183.         mov     bx, cx
  3184.         shl     si, 1
  3185.         cmp     ah, 09h
  3186.         jne     OnePutB
  3187.         mov     ah, bl
  3188.         mov     es:[si], ax
  3189.         ret
  3190. OnePutB:        mov     es:[si], al
  3191.         ret
  3192. PutOne          endp
  3193. ;               -------------------------------
  3194. PutStr          proc    near
  3195. ;
  3196. ;       Write char & attr at CurPos: ah = 09h
  3197. ;       Overwrite char    at CurPos: ah = 0Ah
  3198. ;       IN:     al = char
  3199. ;               bh = page
  3200. ;               bl = attr (ah = 09h)
  3201. ;               cx = write times
  3202. ;
  3203.         cmp     cx, 1
  3204.         ja      PutStrCont0
  3205.         jb      PutStrQuit
  3206.         call    PutOne
  3207. PutStrQuit:     ret
  3208. ;
  3209. PutStrCont0:    mov     BiosWait, 0
  3210.         call    GetPos
  3211.         push    bx
  3212.         call    CalcBufOfs
  3213.         mov     si, bx
  3214.         shl     si, 1
  3215.         pop     bx
  3216.         cmp     bh, CurPage
  3217.         jne     PutPagex
  3218. ;
  3219. PutCurLoop:     push    si
  3220.         push    dx
  3221.         push    cx
  3222.         push    bx
  3223.         push    ax
  3224. PutCurToScr:    cmp     ah, 09h
  3225.         je      PutCurSkip0
  3226.         mov     bl, byte ptr ScrBuf[si+1]
  3227. PutCurSkip0:    shr     si, 1
  3228.         call    PutChar
  3229. PutCurCont1:    pop     ax
  3230.         pop     bx
  3231.         pop     cx
  3232.         pop     dx
  3233.         pop     si
  3234.         add     si, +2
  3235.         inc     dl
  3236.         cmp     dl, XMax
  3237.         jne     PutCurSkip1
  3238.         xor     dl, dl
  3239.         inc     dh
  3240.         cmp     dh, YLimit
  3241.         jne     PutCurSkip1
  3242.         dec     dh
  3243. PutCurSkip1:    loop    PutCurLoop
  3244.         ret
  3245. ;
  3246. PutPagex:       mov     dx, TextVRamSEG
  3247.         and     dx, 0b800h
  3248.         add     dh, bh
  3249.         mov     es, dx
  3250. ;
  3251. PutStrLoop:     cmp     ah, 09h
  3252.         je      StrPutW
  3253.         mov     es:[si], al
  3254.         jmp     PutStrCont1
  3255. ;
  3256. StrPutW:        mov     ah, bl
  3257.         mov     es:[si], ax
  3258. ;              
  3259. PutStrCont1:    add     si, +2
  3260.         cmp     si, CharNumMax
  3261.         jb      PutStrSkip1
  3262.         dec     si
  3263.         dec     si
  3264. PutStrSkip1:    loop    PutStrLoop
  3265.         ret
  3266. PutStr          endp
  3267. ;               -------------------------------
  3268. VeriPoint       proc    near
  3269. ;
  3270. ;       IN:     cx = x
  3271. ;               dx = y
  3272. ;
  3273.         cmp     cx, XbMax
  3274.         jae     BadPoint
  3275. PutSkipRePx:    cmp     DispMode, 6
  3276.         ja      toVeriGrpPy
  3277.         cmp     dx, 450
  3278.         jae     BadPoint
  3279. PointOk:        clc
  3280.         ret
  3281. ;
  3282. toVeriGrpPy:    cmp     dx, YbMax
  3283.         jb      PointOk
  3284. BadPoint:       stc
  3285.         ret
  3286. VeriPoint       endp
  3287. ;               -------------------------------
  3288. PutPixel        proc    near
  3289. ;
  3290. ;       IN:     ah = 0ch
  3291. ;               al = color ( b7=1 -> XOR)
  3292. ;               cx = x
  3293. ;               dx = y
  3294. ;
  3295.         call    VeriPoint
  3296.         jc      PutPixelQuit
  3297.         push    word ptr DrawColor
  3298.         mov     bl, al
  3299.         and     bl, 0fh
  3300.         mov     DrawColor, bl
  3301.         mov     bh, COPY
  3302.         test    al, 80h
  3303.         jz      SkipSetXOR
  3304.         mov     bh, opXOR
  3305. SkipSetXOR:     mov     DrawType, bh
  3306.         mov     ax, dx
  3307.         call    CalcVRamOfs
  3308.         mov     ah, 80h
  3309.         or      cl, cl
  3310.         jz      PntSkipShr
  3311.         shr     ah, cl
  3312. PntSkipShr:     cli
  3313.         mov     dx, GCindex
  3314.         mov     al, 08h
  3315.         out     dx, ax
  3316.         call    inSetRegisters
  3317.         mov     al, 0ffh
  3318.         mov     ah, es:[di]
  3319.         stosb
  3320.         call    inReRegisters
  3321.         sti
  3322.         pop     word ptr DrawColor
  3323. PutPixelQuit:   ret
  3324. PutPixel        endp
  3325. ;               -------------------------------
  3326. ReadPixel       proc    near
  3327. ;
  3328. ;       IN:     ah = 0dh
  3329. ;               cx = x
  3330. ;               dx = y
  3331. ;       OUT:    al = color
  3332. ;
  3333.         call    VeriPoint
  3334.         jc      RdPixelQuit
  3335.         mov     ax, dx
  3336.         call    CalcVRamOfs
  3337.         mov     bh, 80h
  3338.         or      cl, cl
  3339.         jz      RdPixelSkip
  3340.         shr     bh, cl
  3341. RdPixelSkip:    cli
  3342.         mov     dx, GCindex
  3343.         mov     al, 04h
  3344.         out     dx, al
  3345.         inc     dx
  3346.         xor     bl, bl
  3347.         mov     cx, 4
  3348. RdPixelLoop:    shl     bl, 1
  3349.         mov     al, cl
  3350.         dec     al
  3351.         out     dx, al
  3352.         mov     ah, es:[di]
  3353.         and     ah, bh
  3354.         jz      RdPixelZero
  3355.         or      bl, 1
  3356. RdPixelZero:    loop    RdPixelLoop
  3357.         sti
  3358.         mov     [bp+16], bl
  3359. RdPixelQuit:    ret
  3360. ReadPixel       endp
  3361. ;               -------------------------------
  3362. ;TmpX            db      ?
  3363. ;TmpY            db      ?
  3364. ;TmpAttr         db      ?
  3365. ;               -------------------------------
  3366. MyScrollUp      proc    near
  3367.         push    bx
  3368.         push    dx
  3369.         call    GetVideo
  3370.         mov     bh, ah
  3371.         xor     cx, cx
  3372.         mov     dh, YMax
  3373.         mov     dl, ChNumX
  3374.         mov     ax, 0601h
  3375.         call    ScrollUpDn
  3376.         pop     dx
  3377.         pop     bx
  3378.         ret
  3379. ;
  3380. comment @
  3381.         cmp     inScroll, 0
  3382.         je      MyScrollCont0
  3383.         ret
  3384. ;
  3385. MyScrollCont0:  mov     inScroll, 1
  3386.         mov     dh, YWrt
  3387.         xor     dl, dl
  3388.         call    GetVideo
  3389.         mov     bh, ah
  3390.         mov     TmpAttr, bh
  3391.         xor     cx, cx
  3392.         mov     dh, YMax
  3393.         mov     dl, ChNumX
  3394. ;
  3395.         mov     al, YWrt
  3396.         sub     al, dh       ; scrollLines = YWrt-YMax;
  3397.         mov     YWrt, dh     ; YWrt = YMax
  3398.         push    ax
  3399. ;
  3400.         mov     ah, 06h
  3401.         call    ScrollUpDn
  3402. ;
  3403.         mov     bx, CharNumMax
  3404.         shl     bx, 1
  3405.         pop     ax
  3406.         mov     si, bx
  3407.         mov     dh, YMax
  3408.         sub     dh, al       ; dh = YMax-ScrollLines+1
  3409.         inc     dh
  3410.         xor     dl, dl       ; dx = (0, YMax-ScrollLines+1)
  3411.         mov     CursorEnable, 0
  3412.         call    CalcBufOfs
  3413.         jmp     skipy
  3414. ;
  3415. dloop:          push    dx
  3416.         push    bx
  3417.         push    si
  3418.         mov     ax, word ptr ScrBuf[si]
  3419.         mov     word ptr ScrBuf[si], 0720h ; clear
  3420.         mov     si, bx
  3421.         mov     bl, ah
  3422.         call    PutChar
  3423.         pop     si
  3424.         pop     bx
  3425.         pop     dx
  3426.         inc     bx
  3427.         add     si, +2
  3428.         inc     dl           ; x ++;
  3429.         cmp     dl, XMax
  3430.         jne     skipy        ; if (x == XMax) {
  3431.         mov     dl, 0        ;     x = 0;  y ++; }
  3432.         inc     dh
  3433. skipy:          cmp     dh, YMax
  3434.         jb      dloop
  3435.         cmp     dl, XWrt
  3436.         jb      dloop
  3437.         xor     ah, ah
  3438.         mov     inScroll, ah
  3439.         mov     XWrt, ah
  3440.         call    SetCursorPos
  3441.         mov     CursorEnable, 1
  3442.         ret
  3443.     @
  3444. MyScrollUp      endp
  3445. ;               -------------------------------
  3446. TtyChar         proc    near
  3447. ;
  3448. ;       Write Char, then Move Cursor Right: ah = 0Eh
  3449. ;       IN:  al = char
  3450. ;
  3451.         mov     bh, CurPage
  3452.         call    GetPos
  3453.         cmp     al, ' '
  3454.         jae     TtyToPut
  3455.         cmp     al, 7
  3456.         jne     TtyCont0
  3457. ;
  3458. ;                mov     cx, 0384h
  3459. ;                mov     bx, 8
  3460.         mov     cx, 0166h
  3461.         mov     bx, 2
  3462.         call    inBeep
  3463.         ret
  3464. ;
  3465. TtyCont0:       cmp     al, 8
  3466.         jne     TtyCont1
  3467.         cmp     dl, 0
  3468.         jne     TtyBackSp
  3469.         ret
  3470. TtyBackSp:      dec     dl
  3471.         call    SetCursorPos
  3472. ;                mov     al, 20h
  3473. ;                call    PutOne
  3474.         ret
  3475. ;
  3476. TtyCont1:       cmp     al, 0ah
  3477.         jne     TtyCont2
  3478.         inc     dh
  3479.         jmp     TtyRet0
  3480. ;
  3481. TtyCont2:       cmp     al, 0dh
  3482.         jne     TtyToPut
  3483.         xor     dl, dl
  3484.         jmp     TtyRet0
  3485. ;
  3486. TtyToPut:       push    dx
  3487.         mov     cl, bl
  3488.         call    CalcBufOfs
  3489.         mov     si, bx
  3490.         shl     bx, 1
  3491.         cmp     ah, 09h
  3492.         je      TtySkipAttr
  3493.         cmp     TextMode, 1
  3494.         je      TtyGetFromVRam
  3495.         mov     cl, byte ptr ScrBuf[bx+1]
  3496.         jmp     TtySkipAttr
  3497. ;
  3498. TtyGetFromVRam: mov     cx, TextVRamSEG
  3499.         mov     es, cx
  3500.         mov     cl, es:[bx+1]
  3501. TtySkipAttr:    mov     bl, cl
  3502.         call    PutChar
  3503.         pop     dx
  3504.         inc     dl
  3505.         mov     BiosWait, 0
  3506. ;
  3507. TtyRet0:        cmp     dl, XMax
  3508.         jb      TtyContw
  3509.         xor     dl, dl
  3510.         inc     dh
  3511. comment @
  3512. TtyCont3:       cmp     dh, YWrt
  3513.         jb      TtyContw
  3514.         je      TtyConty
  3515.         mov     YWrt, dh
  3516.         mov     XWrt, 0
  3517. TtyConty:       cmp     dl, XWrt
  3518.         jbe     TtyContw
  3519.         mov     XWrt, dl
  3520.     @
  3521. TtyContw:       cmp     dh, YLimit
  3522.         jb      TtyCont4
  3523.         dec     dh
  3524.         call    MyScrollUp
  3525. TtyCont4:       xor     ah, ah
  3526.         call    SetCursorPos
  3527. TtyCont5:       ret
  3528. TtyChar         endp
  3529. ;               -------------------------------
  3530. GetDispMode     proc    near
  3531. ;
  3532. ;       Get Display Mode: ah = 0Fh
  3533. ;       OUT:    ah = XMax
  3534. ;               al = DispMode
  3535. ;               bh = CurPage
  3536. ;
  3537.         xor     ax, ax
  3538.         mov     es, ax
  3539.         mov     al, es:[449h]
  3540.         mov     ah, XMax
  3541.         mov     bh, es:[462h]
  3542.         mov     [bp+15], bh
  3543.         mov     [bp+16], ax
  3544.         ret
  3545. GetDispMode     endp
  3546. ;               -------------------------------
  3547. EGAVGAFontOpr   proc    near
  3548. ;
  3549. ;       ah = 11h: EGA/VGA Font Operation
  3550. ;
  3551.         mov     FontOprMark, 0
  3552.         cmp     al, 10h
  3553.         jb      FontOprSkip0
  3554.         mov     FontOprMark, 10h
  3555. FontOprSkip0:   and     al, 0fh
  3556.         cmp     al, 4
  3557.         ja      FontOprQuit
  3558.         xor     ah, ah
  3559.         shl     ax, 1
  3560.         mov     si, ax
  3561.         jmp     word ptr cs:FontFunc[si]
  3562. ;
  3563. FontOprQuit:    jmp     FontOprRet0
  3564. ;
  3565. FontFunc        label   word
  3566.         dw      offset FontFunc0
  3567.         dw      offset FontFunc1
  3568.         dw      offset FontFunc2
  3569.         dw      offset FontFunc3
  3570.         dw      offset FontFunc4
  3571. ;
  3572. FontFunc0:      jmp     FontOprRet0
  3573. ;
  3574. FontFunc1:      or      bl, bl
  3575.         jnz     FFuncQuit
  3576.         mov     ax, word ptr F8x14
  3577.         mov     dx, word ptr F8x14+2
  3578.         mov     word ptr FPntr, ax
  3579.         mov     word ptr FPntr+2, dx
  3580.         mov     cHigh, 14
  3581. FFuncQuit:      jmp     FontOprRet0
  3582. ;
  3583. FontFunc2:      or      bl, bl
  3584.         jnz     FFuncQuit
  3585.         cmp     FontOprMark, 10h
  3586.         je      toAsciiText
  3587.         mov     ax, word ptr F8x8
  3588.         mov     dx, word ptr F8x8+2
  3589.         mov     word ptr FPntr, ax
  3590.         mov     word ptr FPntr+2, dx
  3591.         mov     cHigh, 8
  3592.         jmp     FontOprRet0
  3593. ;
  3594. toAsciiText:    push    bx
  3595.         and     IntrBusy, NOT I10Busy
  3596.         call    VModeToEmode
  3597.         pop     bx
  3598.         mov     ax, 1112h
  3599.         pushf
  3600.         call    dword ptr OldInt10
  3601.         mov     in43Lines, 1
  3602.         jmp     FontOprRet0
  3603. ;
  3604. FontFunc3:      jmp     FontOprRet0
  3605. ;
  3606. comment @
  3607.         mov     bh, bl
  3608.         mov     dl, bl
  3609.         and     dl, 3
  3610.         mov     FSetA, dl
  3611.         shr     bl, 1
  3612.         shr     bl, 1
  3613.         and     bl, 3
  3614.         mov     FSetB, bl
  3615.         mov     dx, 3c4h
  3616.         mov     al, 3
  3617.         mov     ah, bh
  3618.         out     dx, ax
  3619.         jmp     FontOprRet0
  3620.     @
  3621. ;
  3622. FontFunc4:      or      bl, bl
  3623.         jnz     FontOprRet0
  3624.         mov     ax, word ptr F8x16
  3625.         mov     dx, word ptr F8x16+2
  3626.         mov     word ptr FPntr, ax
  3627.         mov     word ptr FPntr+2, dx
  3628.         mov     cHigh, 16
  3629.         jmp     FontOprRet0
  3630. ;
  3631. FontOprRet0:    ret
  3632. EGAVGAFontOpr   endp
  3633. ;               -------------------------------
  3634. TextStr         proc    near
  3635. ;
  3636. ;       Put Text String:  ah = 13h
  3637. ;       IN:     cx = string length
  3638. ;               dx = start Pos
  3639. ;               es:di (es:bp) = Addr of string
  3640. ;               al = 0  ... bl = attr of string, keep cursor.
  3641. ;               al = 1  ... bl = attr of string, move cursor.
  3642. ;               al = 2  ... attr in string, keep cursor.
  3643. ;               al = 3  ... attr in string, move cursor.
  3644. ;
  3645.         mov     ah, bl
  3646.         push    es
  3647.         push    cx
  3648.         push    ax
  3649.         cmp     dl, XMax
  3650.         jb      TextStrSkip0
  3651.         mov     dl, ChNumX
  3652. TextStrSkip0:   cmp     dh, YMax
  3653.         jbe     TextStrSkip1
  3654.         mov     dh, YMax
  3655. TextStrSkip1:   pop     ax
  3656.         push    ax
  3657.         push    dx
  3658.         test    al, 01h
  3659.         jne     TextStrSkip2
  3660.         call    GetPos
  3661. TextStrSkip2:   mov     SavePos, dx
  3662.         mov     inTextStr, 1
  3663.         pop     dx
  3664.         mov     bh, CurPage
  3665.         call    SetCursorPos
  3666.         pop     ax
  3667.         pop     cx
  3668.         pop     es
  3669.         or      cx, cx
  3670.         jz      TextStrEnd
  3671. ;
  3672. TextStrLoop:    push    es
  3673.         push    di
  3674.         push    cx
  3675.         push    bx
  3676.         push    ax
  3677.         cmp     al, 02h
  3678.         mov     al, es:[di]
  3679.         jb      TextStrSkip3
  3680.         mov     ah, es:[di+1]
  3681. TextStrSkip3:   mov     bl, ah
  3682.         mov     ah, 09h
  3683.         call    TtyChar
  3684.         pop     ax
  3685.         pop     bx
  3686.         pop     cx
  3687.         pop     di
  3688.         pop     es
  3689.         inc     di
  3690.         cmp     al, 02h
  3691.         jb      TextStrSkip4
  3692.         inc     di
  3693. TextStrSkip4:   loop    TextStrLoop
  3694. ;
  3695. TextStrEnd:     mov     inTextStr, 0
  3696.         and     al, 01h
  3697.         jnz     TextStrSkip5
  3698.         mov     dx, SavePos
  3699.         call    SetCursorPos
  3700. TextStrSkip5:   ret
  3701. TextStr         endp
  3702. ;               -------------------------------
  3703. PromptOpr       proc    near
  3704. ;
  3705. ;       Prompt Line  Operation: ah = 14h / 20h
  3706. ;       IN:     al = 0, (10: ah=20h): Clear Prompt Line
  3707. ;               al = 1, (11: ah=20h):
  3708. ;               al = 2, (12: ah=20h): Move Pmt Pos:
  3709. ;                       dl = x
  3710. ;               al = 3, (13: ah=20h): Prompt Char:
  3711. ;                       dl = char
  3712. ;               al = 80h  : Get PmtLine Status
  3713. ;                       al = bAttr
  3714. ;                       bh = kAttr
  3715. ;                       bl = sAttr
  3716. ;                       ch = nAttr
  3717. ;                       cl = eAttr
  3718. ;               bl = attr ( ah = 14h or ah = 20h,al=10-13h )
  3719. ;               dl = x or char
  3720. ;
  3721.         cmp     al, 80h
  3722.         je      PmtOprAttrs
  3723.         cmp     MyMode, 1
  3724.         je      PmtOprCont0
  3725.         ret
  3726. ;
  3727. PmtOprAttrs:    mov     al, bAttr
  3728.         mov     bh, kAttr
  3729.         mov     bl, sAttr
  3730.         mov     ch, nAttr
  3731.         mov     cl, eAttr
  3732.         xor     ah, ah
  3733.         mov     [bp+16], ax
  3734.         mov     [bp+14], bx
  3735.         mov     [bp+12], cx
  3736.         ret
  3737. ;
  3738. PmtOprCont0:    mov     inPmtOpr, 1
  3739.         cmp     al, 4
  3740.         jae     PmtOprUse20h
  3741.         cmp     ah, 14h
  3742.         je      PmtOprContx
  3743.         mov     bl, sAttr
  3744.         and     bl, 0fh
  3745.         or      bl, bAttr
  3746.         jmp     PmtOprContx
  3747. ;
  3748. PmtOprUse20h:   cmp     ah, 20h
  3749.         jne     PmtOprQuit
  3750.         cmp     al, 10h
  3751.         jb      PmtOprQuit
  3752.         cmp     al, 14h
  3753.         jae     PmtOprQuit
  3754.         and     al, 03h
  3755. PmtOprContx:    xor     ah, ah
  3756.         shl     ax, 1
  3757.         mov     si, ax
  3758.         jmp     word ptr cs:PmtFunc[si]
  3759. ;
  3760. PmtOprQuit:     jmp     PmtOprRet0
  3761. ;
  3762. PmtFunc         label   word
  3763.         dw      offset PmtFunc0
  3764.         dw      offset PmtFunc1
  3765.         dw      offset PmtFunc2
  3766.         dw      offset PmtFunc3
  3767. ;
  3768. PmtFunc0:       mov     cl, 4
  3769.         shr     bl, cl
  3770.         xor     ch, ch
  3771.         mov     cl, XMax
  3772.         mov     dl, 0
  3773.         mov     dh, YMax
  3774.         cmp     FullPmtLine, 1
  3775.         jne     PmtOprSkip0
  3776.         inc     dh
  3777. PmtOprSkip0:    call    FillBG
  3778.         mov     PmtXPos, 0
  3779.         mov     al, bAttr
  3780.         mov     cl, 4
  3781.         shr     al, cl
  3782.         mov     DrawColor, al
  3783.         mov     dx, 455
  3784.         call    HMLine
  3785.         inc     dx
  3786.         call    HMLine
  3787.         add     dx, 19
  3788.         call    HMLine
  3789.         mov     PmtFirst, 0
  3790.         jmp     PmtOprRet0
  3791. ;
  3792. PmtFunc1:       cmp     cx, 1
  3793.         je      PmtFunc3
  3794.         mov     al, dl
  3795.         mov     dl, PmtXPos
  3796.         mov     dh, YMax
  3797.         cmp     FullPmtLine, 1
  3798.         jne     PmtOprSkip1
  3799.         inc     dh
  3800. PmtOprSkip1:    mov     ah, bl
  3801. PmtOprLoop1:    cmp     dl, XMax
  3802.         jae     PmtOpr1End
  3803.         push    ax
  3804.         push    cx
  3805.         push    dx
  3806.         mov     bl, ah
  3807.         call    inDrawC
  3808.         pop     dx
  3809.         pop     cx
  3810.         pop     ax
  3811.         inc     dl
  3812.         loop    PmtOprLoop1
  3813. PmtOpr1End:     cmp     dl, XMax
  3814.         jb      PmtOpr1Skip1
  3815.         xor     dl, dl
  3816. PmtOpr1Skip1:   mov     PmtXPos, dl
  3817.         jmp     PmtOprRet0
  3818. ;
  3819. PmtFunc2:       cmp     dl, XMax
  3820.         jb      PmtOprCont1
  3821.         jmp     PmtOprRet0
  3822. PmtOprCont1:    mov     PmtXPos, dl
  3823. PmtToRet0:      jmp     PmtOprRet0
  3824. ;
  3825. PmtFunc3:       mov     bh, dl
  3826.         mov     dl, PmtXPos
  3827.         cmp     dl, XMax
  3828.         jae     PmtToRet0
  3829.         mov     dh, YMax
  3830.         cmp     FullPmtLine, 1
  3831.         jne     PmtOprSkip2
  3832.         inc     dh
  3833. PmtOprSkip2:    cmp     bh, 0a1h
  3834.         jb      PmtOprToC
  3835.         cmp     PmtFirst, 0
  3836.         je      PmtOprSaveCC1
  3837.         dec     dl
  3838.         cmp     dl, PmtFirstX
  3839.         jne     PmtOprSaveCC1
  3840. ;
  3841.         mov     ah, PmtFirst
  3842.         mov     al, bh
  3843.         call    inDrawCC
  3844.         mov     PmtFirst, 0
  3845.         inc     PmtXPos
  3846.         jmp     PmtOprRet0
  3847. ;
  3848. PmtOprSaveCC1:  mov     PmtFirst, bh
  3849.         mov     dl, PmtXPos
  3850.         mov     PmtFirstX, dl
  3851.         inc     PmtXPos
  3852. toPmtOprVeri:   jmp     PmtOprVeriX
  3853. ;
  3854. PmtOprToC:      cmp     PmtFirst, 0
  3855.         jz      PmtOprPutC
  3856.         push    bx
  3857.         dec     dl
  3858.         mov     al, PmtFirst
  3859. ;               mov     bl, PmtAttr
  3860.         call    inDrawC
  3861.         mov     PmtFirst, 0
  3862.         pop     bx
  3863. PmtOprPutC:     cmp     bh, 8
  3864.         jne     PmtOprDrawC
  3865.         cmp     PmtXPos, 0
  3866.         ja      PmtOprDecX
  3867.         jmp     PmtOprRet0
  3868. ;
  3869. PmtOprDecX:     dec     PmtXPos
  3870.         dec     dl
  3871.         mov     al, ' '
  3872.         call    inDrawC
  3873.         jmp     PmtOprRet0
  3874. ;
  3875. PmtOprDrawC:    mov     al, bh
  3876.         call    inDrawC
  3877.         inc     PmtXPos
  3878. PmtOprVeriX:    mov     al, PmtXPos
  3879.         cmp     al, XMax
  3880.         jne     PmtOprRet0
  3881.         mov     PmtXPos, 0
  3882. PmtOprRet0:     mov     inPmtOpr, 0
  3883.         ret
  3884. PromptOpr       endp
  3885. ;               -------------------------------
  3886. NewInt1c        proc    far
  3887.         sti
  3888.         pushf
  3889.         call    dword ptr cs:OldInt1c
  3890.         test    cs:IntrBusy, I08Busy OR I1cBusy OR I09Busy OR I10Busy OR I16Busy OR KeyBusy
  3891.         jz      I1cCont0
  3892.         iret
  3893. ;
  3894. I1cCont0:       or      cs:IntrBusy, I1cBusy
  3895.         and     cs:IntrBusy, NOT I0cBusy
  3896.         pusha
  3897.         push    es
  3898.         push    ds
  3899.         mov     ax, cs
  3900.         mov     ds, ax
  3901. ;
  3902. comment @
  3903.         cmp     WaitTime, 1
  3904.         jb      I1cSkipScroll
  3905.         mov     dh, YWrt
  3906.         cmp     dh, YMax
  3907.         jbe     I1cSkipScroll
  3908.         call    MyScrollUp
  3909. ;
  3910. I1cSkipScroll:  
  3911.     @
  3912.         call    ScanTextScr
  3913. ;
  3914.         cmp     ticker, 18
  3915.         jne     I1cRet0
  3916.         mov     ax, NopTime
  3917.         cmp     ax, TimeOut
  3918.         jb      SkipClose
  3919.         cmp     TimeOut, 0
  3920.         je      SkipClose
  3921.         call    CloseDisplay
  3922. SkipClose:      cmp     ClockSwitch, 1
  3923.         jne     I1cRet0
  3924.         cmp     DisplayOpen, 1
  3925.         jne     I1cRet0
  3926.         test    IntrBusy, I09Busy OR I0cBusy OR I10Busy OR I16Busy OR KeyBusy
  3927.         jnz     I1cRet0
  3928.         cmp     TimeEnable, 1
  3929.         jne     I1cRet0
  3930.         call    DrawTime
  3931. ;
  3932. I1cRet0:        and     IntrBusy, NOT I1cBusy
  3933. I1cQuit:        pop     ds
  3934.         pop     es
  3935.         popa
  3936.         iret
  3937. NewInt1c        endp
  3938. ;               -------------------------------
  3939. OpenDisplay     proc    near
  3940.         push    ax
  3941.         push    bx
  3942.         mov     ax, 1200h
  3943.         mov     bl, 36h
  3944.         pushf
  3945.         call    dword ptr OldInt10
  3946.         mov     DisplayOpen, 1
  3947.         mov     NopTime, 0
  3948.         pop     bx
  3949.         pop     ax
  3950.         ret
  3951. OpenDisplay     endp
  3952. ;               -------------------------------
  3953. CloseDisplay    proc    near
  3954.         cmp     DisplayOpen, 1
  3955.         jne     CloseCRTExit
  3956.         mov     ax, 1201h
  3957.         mov     bl, 36h
  3958.         pushf
  3959.         call    dword ptr OldInt10
  3960.         mov     DisplayOpen, 0
  3961. CloseCRTExit:   ret
  3962. CloseDisplay    endp
  3963. ;               -------------------------------
  3964. NewInt13        proc    far
  3965.         sti
  3966.         pushf
  3967.         or      cs:IntrBusy, I13Busy
  3968.         call    dword ptr cs:OldInt13
  3969.  
  3970.         sti
  3971.         pushf
  3972.         and     cs:IntrBusy, NOT I13Busy
  3973.         popf
  3974.         retf    2
  3975. ;
  3976. comment @
  3977.         push    ax
  3978.         push    bp
  3979.         mov     bp, sp
  3980.         pushf
  3981.         pop     ax
  3982.         mov     [bp+08h], ax
  3983.         pop     bp
  3984.         pop     ax
  3985. ;
  3986.         and     cs:IntrBusy, NOT I13Busy
  3987.         iret
  3988.     @
  3989. ;
  3990. ;       STACK:  [SP+00] = bp;  [SP+02] = ax;
  3991. ;               [SP+04] = IP;  [SP+06] = CS;  [SP+08] = FLAGs;
  3992. ;
  3993. NewInt13        endp
  3994. ;               -------------------------------
  3995. XorDrawCursor   proc    near
  3996. ;
  3997. ;       IN:     dx = Pos
  3998. ;
  3999.         cmp     FullPmtLine, 1
  4000.         jne     XorDrawQuit
  4001.         cmp     CursorEnable, 0
  4002.         je      XorDrawQuit
  4003. ;                cmp     DrawingCursor, 1
  4004. ;                je      XorDrawQuit
  4005.         cmp     dh, YMax
  4006.         jbe     XorDrawCont0
  4007. XorDrawQuit:    ret
  4008. ;
  4009. XorDrawAbort:   mov     inCCsecond, 0
  4010.         jmp     XorDrawRet0
  4011. ;
  4012. XorDrawCont0:   push    di
  4013.         mov     DrawingCursor, 1
  4014.         mov     inCCsecond, 0
  4015.         call    CalcBufOfs
  4016.         cmp     CursorActive, 1
  4017.         je      XorDrawConts
  4018.         cmp     isTreatCC, 1
  4019.         jne     XorDrawSkip0
  4020.         cmp     word ptr ScrType[bx], 0201h
  4021.         jne     XorDrawSkip0
  4022.         mov     isCCcursor, 1
  4023.         jmp     XorDrawConts
  4024. ;
  4025. XorDrawSkip0:   mov     isCCcursor, 0
  4026. ;                cmp     CurKey, 0
  4027. ;                je      XorReSecond
  4028.         cmp     word ptr ScrType[bx-1], 0201h
  4029.         jne     XorReSecond
  4030.         mov     inCCsecond, 1
  4031.         jmp     XorDrawConts
  4032. XorReSecond:    ;mov     inCCsecond, 0
  4033. XorDrawConts:   call    CalcVRamAddr
  4034.         xor     ah, ah
  4035.         mov     al, XMax
  4036.         mov     cx, ax
  4037.         mov     bx, word ptr CursorEnd ; bh = start,bl = end
  4038.         cmp     bh, bl                 ; start > end ?
  4039.         ja      XorDrawAbort
  4040.         or      bl, bl                 ; end == 0 ?
  4041.         jz      XorDrawAbort
  4042.         or      bh, bh
  4043.         jz      XorDrawSkip1
  4044.         mul     bh
  4045.         add     di, ax
  4046. XorDrawSkip1:   cli
  4047.         mov     dx, GCindex
  4048.         mov     ax, 1803h
  4049.         out     dx, ax
  4050.         mov     dx, 3c4h
  4051.         mov     ax, 0f02h
  4052.         out     dx, ax
  4053.         mov     dx, cx
  4054.         dec     dx
  4055.         mov     cl, bl
  4056.         sub     cl, bh
  4057.         inc     cl
  4058.         xor     ch, ch
  4059.         mov     al, 0ffh
  4060.         mov     bx, cx
  4061.         push    di
  4062.         cld
  4063. XorDrawLoop0:   mov     ah, es:[di]
  4064.         stosb
  4065.         add     di, dx
  4066.         loop    XorDrawLoop0
  4067.         pop     di
  4068.         cmp     isCCcursor, 1
  4069.         jne     XorDrawSkip2
  4070.         inc     di
  4071.         mov     cx, bx
  4072. XorDrawLoop1:   mov     ah, es:[di]
  4073.         stosb
  4074.         add     di, dx
  4075.         loop    XorDrawLoop1
  4076. XorDrawSkip2:   mov     dx, GCindex
  4077.         mov     ax, 0003h
  4078.         out     dx, ax
  4079.         xor     CursorActive, 01h
  4080. XorDrawRet0:    sti
  4081.         mov     DrawingCursor, 0
  4082.         pop     di
  4083.         ret
  4084. XorDrawCursor   endp
  4085. ;               -------------------------------
  4086. SaveCurEnv      proc    near
  4087.         cmp     MyMode, 1
  4088.         je      SCECont0
  4089.         ret
  4090. ;
  4091. SCECont0:       push    es
  4092.         push    dx
  4093.         push    bx
  4094.         push    ax
  4095.         mov     isCCleft, 0
  4096.         mov     bh, CurPage
  4097.         call    GetPos
  4098.         mov     word ptr LastX, dx
  4099.         call    CalcBufOfs
  4100.         mov     ax, word ptr ScrType[bx-2]
  4101.         cmp     ax, 0201h
  4102.         jne     SaveCurSkip0
  4103.         mov     isCCleft, 1
  4104. SaveCurSkip0:   cmp     CurKey, DEL
  4105.         jne     SaveCurSkip1
  4106.         mov     R1, 0
  4107.         cmp     word ptr ScrType[bx], 0201h
  4108.         jne     SaveCurRet0
  4109.         shl     bx, 1
  4110.         mov     CurOfs, bx
  4111.         inc     bx
  4112.         inc     bx           ; bx -> CurX+1
  4113.         jmp     SaveCurCont1
  4114. ;
  4115. SaveCurSkip1:   dec     bx           ; bx -> CurX-2
  4116.         dec     bx
  4117.         shl     bx, 1
  4118.         mov     CurOfs, bx
  4119. SaveCurCont1:   cmp     TextMode, 1
  4120.         jne     SaveFromBuf
  4121. ;
  4122.         mov     ax, TextVRamSEG
  4123.         mov     es, ax
  4124.         mov     ax, es:[bx]
  4125.         mov     R1, ax
  4126.         mov     ax, es:[bx+2]
  4127.         mov     R2, ax
  4128. ;                mov     ax, es:[bx+4]
  4129. ;                mov     R3, ax
  4130. ;                jmp     SaveCurRet0
  4131. ;
  4132. SaveFromBuf:    mov     ax, ScrBuf[bx]
  4133.         mov     R1, ax
  4134.         mov     ax, ScrBuf[bx+2]
  4135.         mov     R2, ax
  4136. ;                mov     ax, ScrBuf[bx+4]
  4137. ;                mov     R3, ax
  4138. SaveCurRet0:    pop     ax
  4139.         pop     bx
  4140.         pop     dx
  4141.         pop     es
  4142.         ret
  4143. SaveCurEnv      endp
  4144. ;               -------------------------------
  4145. DrawCursor      proc    near
  4146.         cmp     CursorActive, 0
  4147.         jne     DrawCurQuit
  4148.         mov     dx, word ptr CurX
  4149.         call    XorDrawCursor
  4150.         call    AutoCCTreat
  4151. DrawCurQuit:    ret
  4152. DrawCursor      endp
  4153. ;               -------------------------------
  4154. HideCursor      proc    near
  4155.         cmp     CursorActive, 0
  4156.         je      HideCurQuit
  4157.         mov     dx, word ptr CurX
  4158.         call    XorDrawCursor
  4159. HideCurQuit:    ret
  4160. HideCursor      endp
  4161. ;               -------------------------------
  4162. MoveCursor      proc    near
  4163.         xor     ax, ax
  4164.         mov     es, ax
  4165.         call    GetPos
  4166.         cmp     dx, word ptr CurX
  4167.         jne     MovCurCont0
  4168.         mov     al, 0
  4169.         ret
  4170. ;
  4171. MovCurCont0:    push    dx
  4172.         call    HideCursor
  4173.         pop     dx
  4174.         cmp     CursorActive, 0
  4175.         jne     MovCurRet1
  4176.         mov     word ptr CurX, dx
  4177.         call    DrawCursor
  4178.         call    AutoCCTreat
  4179. MovCurRet1:     mov     al, 1
  4180.         ret
  4181. MoveCursor      endp
  4182. ;               -------------------------------
  4183. TestArrowKey    proc    near
  4184.         mov     bx, CurOfs
  4185.         mov     dx, word ptr LastX
  4186.         cmp     dl, 2
  4187.         jbe     ArrowOk
  4188.         cmp     dx, word ptr CurX
  4189.         je      toSamePos
  4190. ;
  4191.         mov     dx, ScrBuf[bx]
  4192.         cmp     dx, R1
  4193.         jne     ArrowQuit
  4194.         mov     dx, ScrBuf[bx+2]
  4195.         cmp     dx, R2
  4196.         jne     ArrowQuit
  4197. ;             
  4198. ArrowOk:        clc
  4199.         ret
  4200. ;
  4201. toSamePos:      mov     dx, ScrBuf[bx]
  4202.         cmp     dx, R1
  4203.         jne     ArrowOk
  4204.         mov     dx, ScrBuf[bx+2]
  4205.         cmp     dx, R2
  4206.         jne     ArrowOk
  4207. ArrowQuit:      stc
  4208.         ret
  4209. TestArrowKey    endp
  4210. ;               -------------------------------
  4211. AutoCCTreat     proc    near
  4212.         cmp     isTreatCC, 1
  4213.         jne     AutoQuit
  4214.         mov     ax, CurKey
  4215.         cmp     ax, 0
  4216.         je      AutoQuit
  4217.         xor     dx, dx
  4218.         mov     es, dx
  4219.         test    byte ptr es:[417h], 0fh
  4220.         jz      AutoCont0
  4221. AutoQuit:       ret
  4222. ;
  4223. AutoCont0:      cmp     ax, BsKey
  4224.         je      toAutoBs
  4225.         cmp     ax, DEL
  4226.         je      toAutoDEL
  4227. ;
  4228.         cmp     inCCsecond, 1
  4229.         jne     AutoQuit
  4230. ;
  4231.         cmp     ax, PGUP
  4232.         je      toAutoRepeat
  4233.         cmp     ax, PGDN
  4234.         je      toAutoRepeat
  4235. ;
  4236. ;                cmp     WaitTime, 1
  4237. ;                jb      AutoQuit
  4238. ;
  4239.         call    TestArrowKey
  4240.         jc      AutoQuit
  4241. ;
  4242.         cmp     ax, UP
  4243.         je      toAutoRepeat
  4244.         cmp     ax, DOWN
  4245.         je      toAutoRepeat
  4246.         cmp     ax, LEFT
  4247.         je      toAutoRepeat
  4248.         cmp     ax, RIGHT
  4249.         je      toRepeatIt
  4250.         ret
  4251. ;
  4252. toAutoBs:       cmp     isCCleft, 1
  4253.         jne     AutoQuit
  4254.         mov     dx, word ptr LastX
  4255.         cmp     dh, CurY
  4256.         jne     AutoQuit
  4257.         dec     dl
  4258.         cmp     dl, CurX
  4259.         jne     AutoQuit
  4260.         jmp     toRepeatIt
  4261. ;
  4262. toAutoDEL:      cmp     R1, 0
  4263.         je      DELQuit
  4264.         mov     bx, CurOfs
  4265. comment @
  4266. ;                cmp     TextMode, 1
  4267. ;                jne     CmpFromBuf
  4268. ;
  4269.         mov     ax, TextVRamSEG
  4270.         mov     es, ax
  4271.         mov     dx, es:[bx]
  4272.         cmp     dx, R1
  4273.         jne     DELQuit
  4274.         mov     dx, es:[bx+2]
  4275.         cmp     dx, R2
  4276.         je      toRepeatIt
  4277.         jmp     DELQuit
  4278. ;       @
  4279. CmpFromBuf:     mov     dx, ScrBuf[bx]
  4280.         cmp     dx, R1
  4281.         jne     DELQuit
  4282.         mov     dx, ScrBuf[bx+2]
  4283.         cmp     dx, R2
  4284.         je      toRepeatIt
  4285. DELQuit:        ret
  4286. ;
  4287. toAutoRepeat:   mov     ax, LEFT
  4288.         mov     CurKey, ax
  4289. toRepeatIt:     or      al, al
  4290.         jnz     isBsKey
  4291.         mov     al, 0e0h
  4292.         mov     CurKey, ax
  4293. isBsKey:        mov     ax, 1
  4294.         push    ax
  4295.         lea     ax, CurKey
  4296.         push    ax
  4297.         call    PushBackKeys
  4298.         pop     cx
  4299.         pop     cx
  4300.         mov     CurKey, 0
  4301.         ret
  4302. AutoCCTreat     endp
  4303. ;               -------------------------------
  4304. GetTimeStr      proc    near
  4305. ;
  4306. ;       OUT:    si = TimeStr
  4307. ;
  4308.         mov     ah, 02h
  4309.         int     1ah
  4310.         lea     si, TimeStr
  4311.         mov     al, cl
  4312.         mov     ah, cl
  4313.         mov     cl, 4
  4314.         shr     al, cl
  4315.         and     ah, 0fh
  4316.         add     ax, 3030h
  4317.         mov     [si+3], ax
  4318.         mov     al, ch
  4319.         mov     ah, ch
  4320.         shr     al, cl
  4321.         and     ah, 0fh
  4322.         add     ax, 3030h
  4323.         mov     [si], ax
  4324.         mov     al, dh
  4325.         mov     ah, dh
  4326.         shr     al, cl
  4327.         and     ah, 0fh
  4328.         add     ax, 3030h
  4329.         mov     [si+6], ax
  4330.         ret
  4331. GetTimeStr      endp
  4332. ;               -------------------------------
  4333. DrawTime        proc    near
  4334.         cmp     DispMode, 3
  4335.         je      DrawTimeCont0
  4336.         cmp     FullPmtLine, 1
  4337.         je      DrawTimeCont0
  4338.         ret
  4339. ;
  4340. DrawTimeCont0:  test    IntrBusy, I09Busy OR I10Busy OR I16Busy OR KeyBusy
  4341.         jz      DrawTimeCont1
  4342.         ret
  4343. ;
  4344. DrawTimeCont1:  dec     StrType
  4345.         jnz     toPutTime
  4346.         mov     StrType, 6
  4347.         lea     si, VerStr
  4348.         jmp     toPutVer
  4349. ;
  4350. toPutTime:      call    GetTimeStr
  4351. toPutVer:       cmp     MyMode, 1
  4352.         jne     PutTimeStr
  4353.         mov     cx, 8
  4354.         mov     dh, YMax
  4355.         inc     dh
  4356.         mov     dl, 72
  4357.         mov     inPmtOpr, 1
  4358. DrawTimeLoop:   test    IntrBusy, I09Busy OR I10Busy OR I16Busy OR KeyBusy
  4359.         jnz     toTimeRet0
  4360.         push    cx
  4361.         push    dx
  4362.         push    si
  4363.         mov     al, [si]
  4364.         mov     bl, eAttr
  4365.         or      bl, bAttr
  4366.         call    inDrawC
  4367.         pop     si
  4368.         pop     dx
  4369.         pop     cx
  4370.         inc     si
  4371.         inc     dl
  4372.         loop    DrawTimeLoop
  4373. toTimeRet0:     mov     inPmtOpr, 0
  4374.         ret
  4375. ;
  4376. StrType         db      6
  4377. ;
  4378. PutTimeStr:     mov     ax, TextVRamSEG
  4379.         mov     es, ax
  4380.         mov     bx, 72 * 2
  4381.         mov     ah, 4eh
  4382.         mov     cx, 8
  4383. PutTimeLoop:    mov     al, [si]
  4384.         mov     es:[bx], ax
  4385.         inc     si
  4386.         inc     bx
  4387.         inc     bx
  4388.         loop    PutTimeLoop
  4389. DrawTimeRet0:   ret
  4390. DrawTime        endp
  4391. ;               -------------------------------
  4392. NewInt08        proc    far
  4393.         pushf
  4394.         call    dword ptr cs:OldInt08
  4395.         sti
  4396.         test    cs:IntrBusy, NOT I13Busy
  4397.         jz      toNew08
  4398. i08Retn:        iret
  4399. ;
  4400. toNew08:        or      cs:IntrBusy, I08Busy
  4401.         pusha
  4402.         push    es
  4403.         push    ds
  4404.         push    cs
  4405.         pop     ds
  4406. ;
  4407. comment @
  4408.         cmp     WaitTime, 1
  4409.         jb      I1cSkipScroll
  4410.         mov     dh, YWrt
  4411.         cmp     dh, YMax
  4412.         jbe     I1cSkipScroll
  4413.         call    MyScrollUp
  4414. ;
  4415. I1cSkipScroll:  
  4416.     @
  4417.         inc     WaitTime
  4418.         inc     BiosWait
  4419.         dec     byte ptr ticker
  4420.         jnz     I08Cont1
  4421.         mov     byte ptr ticker, 20
  4422.         inc     NopTime
  4423. ;
  4424. I08Cont1:       ; cmp     WaitTime, 1
  4425.         ; jbe     I08Exit
  4426.         call    MoveCursor
  4427.         or      al, al
  4428.         jnz     I08Exit
  4429.         test    ticker, 3
  4430.         jnz     I08Exit
  4431.         cmp     DisplayOpen, 0
  4432.         je      I08Exit
  4433.         cmp     CursorActive, 0
  4434.         jne     I08HideCursor
  4435.         call    DrawCursor
  4436.         jmp     I08Exit
  4437. ;
  4438. I08HideCursor:  cmp     inGrCursor, 0
  4439.         je      I08Exit
  4440.         call    HideCursor
  4441. ;
  4442. I08Exit:        and     IntrBusy, NOT I08Busy
  4443.         pop     ds
  4444.         pop     es
  4445.         popa
  4446.         iret
  4447. NewInt08        endp
  4448. ;               -------------------------------
  4449. ScanTextScr     proc    near
  4450.         test    IntrBusy, NOT I1cBusy
  4451.         jnz     ScanTextQuit
  4452.         cmp     BiosWait, 1
  4453.         jb      ScanTextQuit
  4454.         cmp     TextMode, 1
  4455.         je      ScanTextCont0
  4456. ScanTextQuit:   ret
  4457. ;
  4458. ScanStart       dw      0
  4459. ;
  4460. ScanTextCont0:  mov     inScanText, 1
  4461.         mov     al, CursorEnable
  4462.         push    ax
  4463.         mov     CursorEnable, 0
  4464.         mov     ax, TextVRamSEG
  4465.         mov     es, ax
  4466.         mov     ax, ScanStart
  4467.         mov     di, ax
  4468.         lea     si, ScrBuf
  4469.         add     si, ax
  4470.         mov     cx, CharNumMax
  4471.         shr     ax, 1
  4472.         sub     cx, ax
  4473. ScanTextLoop:   cld
  4474.         repz    cmpsw
  4475.         jz      ScanTextRet0
  4476.         push    cx
  4477.         push    si
  4478.         push    di
  4479.         push    es
  4480.         sub     di, 2
  4481.         mov     ax, di
  4482.         shr     ax, 1
  4483.         mov     si, ax
  4484.         div     byte ptr XMax
  4485.         xchg    ah, al
  4486.         mov     dx, ax
  4487.         mov     ax, es:[di]
  4488.         mov     bl, ah
  4489.         call    PutChar
  4490.         pop     es
  4491.         pop     di
  4492.         pop     si
  4493.         pop     cx
  4494.         jcxz    ScanTextRet0
  4495. ;
  4496.         test    IntrBusy, NOT I1cBusy
  4497.         jnz     ScanAbort
  4498. ;
  4499.         mov     al, 00h
  4500.         out     21h, al
  4501.         in      al, 21h      ; ╢┴8259A IMR╓╨╢╧╞┴▒╬╝─┤µ╞≈
  4502.         mov     ah, al
  4503. ;
  4504.         mov     al, 0ah
  4505.         out     20h, al
  4506.         nop
  4507.         in      al, 20h      ; ╢┴8259A IRR╟δ╟≤╖■╬±╝─┤µ╞≈
  4508.         and     al, ah
  4509.         jz      ScanTextLoop
  4510. ScanAbort:      or      IntrBusy, I0cBusy
  4511.         jmp     ScanTextExit
  4512. ;
  4513. ScanTextRet0:   xor     di, di
  4514. ScanTextExit:   mov     ScanStart, di
  4515.         pop     ax
  4516.         mov     CursorEnable, al
  4517.         mov     inScanText, 0
  4518.         ret
  4519. ScanTextScr     endp
  4520. ;               -------------------------------
  4521. NewInt10        proc    far
  4522.         sti
  4523.         or      ah, ah
  4524.         jz      toNew10
  4525.         cmp     cs:MyMode, 1
  4526.         jne     toOld10
  4527.         cmp     ah, 30h
  4528.         jb      toNew10
  4529. ;
  4530. toOld10:        or      cs:IntrBusy, I10Busy
  4531.         pushf
  4532.         call    dword ptr cs:OldInt10
  4533. I10Retn:        and     cs:IntrBusy, NOT I10Busy
  4534.         iret
  4535. ;
  4536. toGCs:          cmp     al, 3
  4537.         jne     toOld10
  4538.         jmp     I10Retn
  4539. ;
  4540. toFont:         cmp     al, 20h
  4541.         jae     toOld10
  4542.         cmp     cs:TextMode, 1
  4543.         je      JmpNew10
  4544.         jmp     I10Retn
  4545. ;
  4546. VideoControl:   or      al, al
  4547.         jnz     I10Retn
  4548.         or      cs:IntrBusy, I10Busy
  4549.         iret
  4550. ;
  4551. toNew10:        cmp     ah, 10h
  4552.         jb      JmpNew10
  4553.         je      toGCs
  4554.         cmp     ah, 11h
  4555.         je      toFont
  4556.         cmp     ah, 2fh
  4557.         je      VideoControl
  4558. ;
  4559. JmpNew10:       or      cs:IntrBusy, I10Busy
  4560.         push    ax
  4561.         push    bx
  4562.         push    cx
  4563.         push    dx
  4564.         push    es
  4565.         push    ds
  4566.         push    si
  4567.         push    di
  4568.         push    bp
  4569.         mov     di, bp
  4570.         mov     bp, cs
  4571.         mov     ds, bp
  4572.         mov     bp, sp
  4573. ;
  4574.         cmp     DisplayOpen, 1
  4575.         je      I10Skip0
  4576.         call    OpenDisplay
  4577. I10Skip0:       push    ax
  4578.         mov     al, ah
  4579.         xor     ah, ah
  4580.         shl     ax, 1
  4581.         mov     si, ax
  4582.         pop     ax
  4583.         call    word ptr I10Entry[si]
  4584. ;
  4585. I10Ret0:        and     IntrBusy, NOT I10Busy
  4586.         pop     bp
  4587.         pop     di
  4588.         pop     si
  4589.         pop     ds
  4590.         pop     es
  4591.         pop     dx
  4592.         pop     cx
  4593.         pop     bx
  4594.         pop     ax
  4595.         iret
  4596. ;
  4597. VGAConfig:      call    SetVGAStartAddr
  4598.         jmp     toOldInt10
  4599. ;
  4600. VGAStatus:      call    SetVGAStartAddr
  4601. ;
  4602. toOldInt10:     pop     cx
  4603.         pop     bp
  4604.         pop     di
  4605.         pop     si
  4606.         pop     ds
  4607.         pop     es
  4608.         pop     dx
  4609.         pop     cx
  4610.         pop     bx
  4611.         pop     ax
  4612.         jmp     toOld10
  4613. ;
  4614. I10Entry        label   word
  4615.         dw      offset SetDispMode     ; 00
  4616.         dw      offset SetCursorType   ; 01
  4617.         dw      offset SetCursorPos    ; 02
  4618.         dw      offset GetCursor       ; 03
  4619.         dw      offset toOldInt10      ; 04
  4620.         dw      offset SelectPage      ; 05
  4621.         dw      offset ScrollUpDn      ; 06
  4622.         dw      offset ScrollUpDn      ; 07
  4623.         dw      offset ReadVideo       ; 08
  4624.         dw      offset PutStr          ; 09
  4625.         dw      offset PutStr          ; 0A
  4626.         dw      offset toOldInt10      ; 0B
  4627.         dw      offset PutPixel        ; 0C
  4628.         dw      offset ReadPixel       ; 0D
  4629.         dw      offset TtyChar         ; 0E
  4630.         dw      offset GetDispMode     ; 0F
  4631.         dw      offset toOldInt10      ; 10
  4632.         dw      offset EGAVGAFontOpr   ; 11
  4633.         dw      offset toOldInt10      ; 12
  4634.         dw      offset TextStr         ; 13
  4635.         dw      offset PromptOpr       ; 14
  4636.         dw      5 dup(offset toOldInt10)
  4637.         dw      offset VGAConfig       ; 1A
  4638.         dw      offset VGAStatus       ; 1B
  4639.         dw      4 dup(offset toOldInt10)
  4640.         dw      offset PromptOpr       ; 20
  4641.         dw      15 dup(offset toOldInt10)
  4642. ;
  4643. NewInt10        endp
  4644. ;
  4645.         public  NewInt08
  4646.         public  NewInt10
  4647.         public  NewInt13
  4648.         public  NewInt1c
  4649.         public  inBeep
  4650.         public  MakeButton
  4651.         public  MakeBottomBar
  4652.         public  VModeToCmode
  4653.         public  VModeToEmode
  4654.         public  ConvertVMode
  4655.         public  PromptOpr
  4656.         public  DrawScrBuf
  4657.         public  SaveCurEnv
  4658.         public  OpenDisplay
  4659.         public  CloseDisplay
  4660.         public  VRamSEG
  4661.         public  NopTime
  4662.         public  TextVRamSEG
  4663.         public  ScrBuf
  4664.         public  AuthorStr
  4665.         public  AuthorName
  4666.         public  TradeButton
  4667.         public  Vi600x16
  4668.         public  CharTable
  4669.         public  isTreatTab
  4670. ;
  4671. code            ends
  4672.         end
  4673.