home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l040 / 13.ddi / RTLCRT.ZIP / CRT.ASM next >
Encoding:
Assembly Source File  |  1992-10-28  |  12.4 KB  |  947 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *    Turbo Pascal Runtime Library Version 6.0    *
  5. ; *    CRT Interface Unit                *
  6. ; *                            *
  7. ; *    Copyright (C) 1988,91 Borland International    *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    CRT
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. ; Coordinate record
  16.  
  17. X        EQU    (BYTE PTR 0)
  18. Y        EQU    (BYTE PTR 1)
  19.  
  20. ; BIOS workspace equates
  21.  
  22. CrtMode        EQU    (BYTE PTR 49H)
  23. CrtWidth    EQU    (BYTE PTR 4AH)
  24. Cursor        EQU    (WORD PTR 50H)
  25. Addr6845    EQU    (WORD PTR 63H)
  26. Timer        EQU    (DWORD PTR 6CH)
  27. CrtInfo        EQU    (BYTE PTR 87H)
  28. CrtRows        EQU    (BYTE PTR 84H)
  29.  
  30. DATA    SEGMENT    WORD PUBLIC
  31.  
  32. ; Externals
  33.  
  34.     EXTRN    CheckBreak:BYTE,CheckEOF:BYTE,DirectVideo:BYTE
  35.     EXTRN    CheckSnow:BYTE,LastMode:WORD,TextAttr:BYTE
  36.     EXTRN    WindMin:WORD,WindMax:WORD,Seg0040:WORD
  37.     EXTRN    SegB000:WORD,SegB800:WORD
  38.  
  39.     IF DPMIVersion
  40.     EXTRN    RealModeRegs:BYTE
  41.     ENDIF
  42.  
  43. ; Local workspace
  44.  
  45. DelayCnt    DW    ?
  46. CurCrtSize    DW    ?
  47. NormAttr    DB    ?
  48. ScanCode    DB    ?
  49. BreakFlag    DB    ?
  50.  
  51. DATA    ENDS
  52.  
  53. CODE    SEGMENT    BYTE PUBLIC
  54.  
  55.     ASSUME    CS:CODE,DS:DATA
  56.  
  57. ; Externals
  58.  
  59.     EXTRN    Break:NEAR
  60.  
  61. ; Publics
  62.  
  63.     PUBLIC    Initialize,TextMode,Window,ClrScr,ClrEol,InsLine
  64.     PUBLIC    DelLine,GotoXY,WhereX,WhereY,TextColor,TextBackground
  65.     PUBLIC    LowVideo,HighVideo,NormVideo,Delay,Sound,NoSound
  66.     PUBLIC    KeyPressed,ReadKey,AssignCrt
  67.  
  68. ; One-time initialization
  69.  
  70. Initialize:
  71.  
  72.     MOV    AH,0FH
  73.     CALL    Video
  74.     CMP    AL,7
  75.     JE    @@1
  76.     CMP    AL,3
  77.     JBE    @@1
  78.     MOV    AX,3
  79.     CALL    CrtInit
  80. @@1:    CALL    CrtSetup
  81.     MOV    AH,8
  82.     XOR    BH,BH
  83.     CALL    Video
  84.     MOV    AL,AH
  85.     AND    AL,7FH
  86.     MOV    NormAttr,AL
  87.     MOV    TextAttr,AL
  88.     XOR    AX,AX
  89.     MOV    CheckEOF,AL
  90.     MOV    ScanCode,AL
  91.     MOV    BreakFlag,AL
  92.     INC    AX
  93.     MOV    CheckBreak,AL
  94.     MOV    ES,Seg0040
  95.     MOV    DI,OFFSET Timer
  96.     MOV    BL,ES:[DI]
  97. @@2:    CMP    BL,ES:[DI]
  98.     JE    @@2
  99.     MOV    BL,ES:[DI]
  100.     MOV    AX,-28
  101.     CWD
  102.     CALL    DelayLoop
  103.     NOT    AX
  104.     NOT    DX
  105.     MOV    CX,55
  106.     DIV    CX
  107.     MOV    DelayCnt,AX
  108.     IF DPMIVersion
  109.     MOV    AX,dpmiGetRMCB
  110.     MOV    SI,OFFSET CtrlBreak
  111.     MOV    DI,OFFSET RealModeRegs
  112.     PUSH    DS
  113.     POP    ES
  114.     PUSH    CS
  115.     POP    DS
  116.     INT    DPMI
  117.     PUSH    ES
  118.     POP    DS
  119.     MOV    AX,dpmiSetRealInt
  120.     MOV    BL,1BH
  121.     INT    DPMI
  122.     ELSE
  123.     PUSH    DS
  124.     PUSH    CS
  125.     POP    DS
  126.     MOV    DX,OFFSET CtrlBreak
  127.     MOV    AX,dosSetInt*256+1BH
  128.     INT    DOS
  129.     POP    DS
  130.     ENDIF
  131.     RET
  132.  
  133. ; Initialize CRT
  134. ; In    AL = Requested mode
  135. ;    AH = Requested font
  136.  
  137. CrtInit:
  138.  
  139.     MOV    ES,Seg0040
  140.     AND    ES:CrtInfo,0FEH
  141.     CMP    AL,7
  142.     JE    @@1
  143.     CMP    AL,4
  144.     JB    @@1
  145.     MOV    AL,3
  146. @@1:    PUSH    AX
  147.     MOV    AH,0
  148.     CALL    Video
  149.     POP    AX
  150.     OR    AH,AH
  151.     JE    @@2
  152.     MOV    AX,1112H
  153.     MOV    BL,0
  154.     CALL    Video
  155.     MOV    AX,1130H
  156.     MOV    BH,0
  157.     MOV    DL,0
  158.     CALL    Video
  159.     CMP    DL,42
  160.     JNE    @@2
  161.     OR    ES:CrtInfo,1
  162.     MOV    AX,100H
  163.     MOV    CX,600H
  164.     CALL    Video
  165.     MOV    AH,12H
  166.     MOV    BL,20H
  167.     CALL    Video
  168. @@2:    RET
  169.  
  170. ; Setup CRT variables according to selected mode
  171.  
  172. CrtSetup:
  173.  
  174.     MOV    AH,0FH
  175.     CALL    Video
  176.     PUSH    AX
  177.     MOV    AX,1130H
  178.     MOV    BH,0
  179.     MOV    DL,0
  180.     CALL    Video
  181.     POP    AX
  182.     MOV    CL,0
  183.     OR    DL,DL
  184.     JNE    @@1
  185.     MOV    DL,24
  186.     CMP    AL,3
  187.     JA    @@1
  188.     MOV    CL,1
  189. @@1:    MOV    DH,DL
  190.     MOV    DL,AH
  191.     DEC    DL
  192.     MOV    AH,0
  193.     CMP    DH,24
  194.     JBE    @@2
  195.     MOV    AH,1
  196. @@2:    MOV    LastMode,AX
  197.     MOV    CurCrtSize,DX
  198.     MOV    CheckSnow,CL
  199.     MOV    DirectVideo,1
  200.     XOR    AX,AX
  201.     MOV    WindMin,AX
  202.     MOV    WindMax,DX
  203.     RET
  204.  
  205. ; Ctrl-Break interrupt handler
  206.  
  207. CtrlBreak:
  208.  
  209.     IF DPMIVersion
  210.     CMP    ES:CheckBreak,0
  211.     JE    @@1
  212.     MOV    ES:BreakFlag,1
  213. @@1:    CLD
  214.     LODSW
  215.     MOV    ES:[DI].realIP,AX
  216.     LODSW
  217.     MOV    ES:[DI].realCS,AX
  218.     LODSW
  219.     MOV    ES:[DI].realFlags,AX
  220.     ADD    ES:[DI].realSP,6
  221.     ELSE
  222.     PUSH    AX
  223.     PUSH    DS
  224.     MOV    AX,SEG DATA
  225.     MOV    DS,AX
  226.     CMP    CheckBreak,0
  227.     JE    @@1
  228.     MOV    BreakFlag,1
  229. @@1:    POP    DS
  230.     POP    AX
  231.     ENDIF
  232.     IRET
  233.  
  234. ; Check for Ctrl-Break
  235.  
  236. BreakCheck:
  237.  
  238.     CMP    BreakFlag,0
  239.     JNE    @@1
  240.     RET
  241. @@1:    MOV    BreakFlag,0
  242. @@2:    MOV    AH,1
  243.     INT    16H
  244.     JE    @@3
  245.     MOV    AH,0
  246.     INT    16H
  247.     JMP    @@2
  248. @@3:    MOV    AL,'^'
  249.     CALL    WriteChar
  250.     MOV    AL,'C'
  251.     CALL    WriteChar
  252.     CALL    WriteCrLf
  253.     JMP    Break
  254.  
  255. ; Set CRT text mode
  256.  
  257. TextMode:
  258.  
  259.     MOV    BX,SP
  260.     MOV    AX,SS:[BX+4]
  261.     CALL    CrtInit
  262.     CALL    CrtSetup
  263.     MOV    AL,NormAttr
  264.     MOV    TextAttr,AL
  265.     RETF    2
  266.  
  267. ; Define output window
  268.  
  269. Window:
  270.  
  271.     MOV    BX,SP
  272.     MOV    DL,SS:[BX+10]
  273.     MOV    DH,SS:[BX+8]
  274.     MOV    CL,SS:[BX+6]
  275.     MOV    CH,SS:[BX+4]
  276.     CMP    DL,CL
  277.     JA    @@1
  278.     CMP    DH,CH
  279.     JA    @@1
  280.     DEC    DL
  281.     JS    @@1
  282.     DEC    DH
  283.     JS    @@1
  284.     DEC    CL
  285.     CMP    CL,CurCrtSize.X
  286.     JA    @@1
  287.     DEC    CH
  288.     CMP    CH,CurCrtSize.Y
  289.     JA    @@1
  290.     MOV    WindMin,DX
  291.     MOV    WindMax,CX
  292.     CALL    SetCursor
  293. @@1:    RETF    8
  294.  
  295. ; Clear screen
  296.  
  297. ClrScr:
  298.  
  299.     MOV    AX,6*256
  300.     MOV    BH,TextAttr
  301.     MOV    CX,WindMin
  302.     MOV    DX,WindMax
  303.     CALL    Video
  304.     MOV    DX,WindMin
  305.     CALL    SetCursor
  306.     RETF
  307.  
  308. ; Clear to end-of-line
  309.  
  310. ClrEol:
  311.  
  312.     CALL    GetCursor
  313.     MOV    AX,6*256
  314.     MOV    BH,TextAttr
  315.     MOV    CX,DX
  316.     MOV    DL,WindMax.X
  317.     CALL    Video
  318.     RETF
  319.  
  320. ; Insert line
  321.  
  322. InsLine:
  323.  
  324.     MOV    AX,7*256+1
  325.     JMP    SHORT InsDelLine
  326.  
  327. ; Delete line
  328.  
  329. DelLine:
  330.  
  331.     MOV    AX,6*256+1
  332.  
  333. InsDelLine:
  334.  
  335.     PUSH    AX
  336.     CALL    GetCursor
  337.     POP    AX
  338.     MOV    BH,TextAttr
  339.     MOV    CL,WindMin.X
  340.     MOV    CH,DH
  341.     MOV    DX,WindMax
  342.     CMP    CH,DH
  343.     JNE    @@1
  344.     XOR    AL,AL
  345. @@1:    CALL    Video
  346.     RETF
  347.  
  348. ; Position cursor
  349.  
  350. GotoXY:
  351.  
  352.     MOV    BX,SP
  353.     MOV    DL,SS:[BX+6]
  354.     MOV    DH,SS:[BX+4]
  355.     DEC    DL
  356.     ADD    DL,WindMin.X
  357.     JC    @@1
  358.     CMP    DL,WindMax.X
  359.     JA    @@1
  360.     DEC    DH
  361.     ADD    DH,WindMin.Y
  362.     JC    @@1
  363.     CMP    DH,WindMax.Y
  364.     JA    @@1
  365.     CALL    SetCursor
  366. @@1:    RETF    4
  367.  
  368. ; Return cursor X coordinate
  369.  
  370. WhereX:
  371.  
  372.     CALL    GetCursor
  373.     MOV    AL,DL
  374.     SUB    AL,WindMin.X
  375.     INC    AL
  376.     RETF
  377.  
  378. ; Return cursor Y coordinate
  379.  
  380. WhereY:
  381.  
  382.     CALL    GetCursor
  383.     MOV    AL,DH
  384.     SUB    AL,WindMin.Y
  385.     INC    AL
  386.     RETF
  387.  
  388. ; Set text color (color modes)
  389.  
  390. TextColor:
  391.  
  392.     MOV    BX,SP
  393.     MOV    AL,SS:[BX+4]
  394.     TEST    AL,0F0H
  395.     JE    @@1
  396.     AND    AL,0FH
  397.     OR    AL,80H
  398. @@1:    AND    TextAttr,70H
  399.     OR    TextAttr,AL
  400.     RETF    2
  401.  
  402. ; Set text background (color modes)
  403.  
  404. TextBackground:
  405.  
  406.     MOV    BX,SP
  407.     MOV    AL,SS:[BX+4]
  408.     AND    AL,7
  409.     MOV    CL,4
  410.     SHL    AL,CL
  411.     AND    TextAttr,8FH
  412.     OR    TextAttr,AL
  413.     RETF    2
  414.  
  415. ; Select low intensity
  416.  
  417. LowVideo:
  418.  
  419.     AND    TextAttr,0F7H
  420.     RETF
  421.  
  422. ; Select high intensity
  423.  
  424. HighVideo:
  425.  
  426.     OR    TextAttr,8
  427.     RETF
  428.  
  429. ; Select normal intensity
  430.  
  431. NormVideo:
  432.  
  433.     MOV    AL,NormAttr
  434.     MOV    TextAttr,AL
  435.     RETF
  436.  
  437. ; Delay specified number of milliseconds
  438.  
  439. Delay:
  440.  
  441.     MOV    BX,SP
  442.     MOV    CX,SS:[BX+4]
  443.     JCXZ    @@2
  444.     MOV    ES,Seg0040
  445.     XOR    DI,DI
  446.     MOV    BL,ES:[DI]
  447. @@1:    MOV    AX,DelayCnt
  448.     XOR    DX,DX
  449.     CALL    DelayLoop
  450.     LOOP    @@1
  451. @@2:    RETF    2
  452.  
  453. ; Delay one timer tick or by CX iterations
  454.  
  455. DelayLoop:
  456.  
  457. @@1:    SUB    AX,1
  458.     SBB    DX,0
  459.     JC    @@2
  460.     CMP    BL,ES:[DI]
  461.     JE    @@1
  462. @@2:    RET
  463.  
  464. ; Start sound generator
  465.  
  466. Sound:
  467.  
  468.     MOV    BX,SP
  469.     MOV    BX,SS:[BX+4]
  470.     MOV    AX,34DDH
  471.     MOV    DX,0012H
  472.     CMP    DX,BX
  473.     JNC    @@2
  474.     DIV    BX
  475.     MOV    BX,AX
  476.     IN    AL,61H
  477.     TEST    AL,3
  478.     JNZ    @@1
  479.     OR    AL,3
  480.     OUT    61H,AL
  481.     MOV    AL,0B6H
  482.     OUT    43H,AL
  483. @@1:    MOV    AL,BL
  484.     OUT    42H,AL
  485.     MOV    AL,BH
  486.     OUT    42H,AL
  487. @@2:    RETF    2
  488.  
  489. ; Turn off sound generator
  490.  
  491. NoSound:
  492.  
  493.     IN    AL,61H
  494.     AND    AL,0FCH
  495.     OUT    61H,AL
  496.     RETF
  497.  
  498. ; Return true if key is available
  499.  
  500. KeyPressed:
  501.  
  502.     CMP    ScanCode,0
  503.     JNE    @@1
  504.     MOV    AH,1
  505.     INT    16H
  506.     MOV    AL,0
  507.     JE    @@2
  508. @@1:    MOV    AL,1
  509. @@2:    RETF
  510.  
  511. ; Read character from keyboard
  512. ; Out    AL = Character
  513.  
  514. ReadKey:
  515.  
  516.     MOV    AL,ScanCode
  517.     MOV    ScanCode,0
  518.     OR    AL,AL
  519.     JNE    @@1
  520.     XOR    AH,AH
  521.     INT    16H
  522.     OR    AL,AL
  523.     JNE    @@1
  524.     MOV    ScanCode,AH
  525.     OR    AH,AH
  526.     JNE    @@1
  527.     MOV    AL,'C'-64
  528. @@1:    CALL    BreakCheck
  529.     RETF
  530.  
  531. ; Assign CRT to textfile
  532.  
  533. AssignCrt:
  534.  
  535.     MOV    BX,SP
  536.     PUSH    DS
  537.     LDS    DI,SS:[BX+4]
  538.     MOV    [DI].fMode,fmClosed
  539.     MOV    [DI].fBufSize,128
  540.     LEA    AX,[DI].fBuffer
  541.     MOV    [DI].fBufPtr.ofs,AX
  542.     MOV    [DI].fBufPtr.seg,DS
  543.     MOV    [DI].fOpenProc.ofs,OFFSET CrtOpen
  544.     MOV    [DI].fOpenProc.seg,CS
  545.     MOV    [DI].fName,0
  546.     POP    DS
  547.     RETF    4
  548.  
  549. ; CRT file open procedure
  550.  
  551. CrtOpen:
  552.  
  553.     MOV    BX,SP
  554.     PUSH    DS
  555.     LDS    DI,SS:[BX+4]
  556.     MOV    AX,OFFSET CrtRead
  557.     MOV    BX,OFFSET CrtReturn
  558.     MOV    CX,BX
  559.     CMP    [DI].fMode,fmInput
  560.     JE    @@1
  561.     MOV    [DI].fMode,fmOutput
  562.     MOV    AX,OFFSET CrtWrite
  563.     MOV    BX,AX
  564. @@1:    MOV    [DI].fInOutProc.ofs,AX
  565.     MOV    [DI].fInOutProc.seg,CS
  566.     MOV    [DI].fFlushProc.ofs,BX
  567.     MOV    [DI].fFlushProc.seg,CS
  568.     MOV    [DI].fCloseProc.ofs,CX
  569.     MOV    [DI].fCloseProc.seg,CS
  570.     XOR    AX,AX
  571.     POP    DS
  572.     RETF    4
  573.  
  574. ; CRT file read procedure
  575.  
  576. CrtRead:
  577.  
  578.     ARG    FileP,DWORD,1
  579.  
  580.     ENTRY    FAR
  581.     LES    DI,FileP
  582.     MOV    DX,ES:[DI].fBufSize
  583.     DEC    DX
  584.     DEC    DX
  585.     MOV    SI,ES:[DI].fBufPos
  586.     LES    DI,ES:[DI].fBufPtr
  587.     XOR    BX,BX
  588. @@1:    MOV    ScanCode,0
  589.     PUSH    CS
  590.     CALL    ReadKey
  591.     MOV    CX,1
  592.     CMP    AL,bs
  593.     JE    @@2
  594.     CMP    AL,'S'-64
  595.     JE    @@2
  596.     CMP    AL,'D'-64
  597.     JE    @@3
  598.     DEC    CX
  599.     CMP    AL,esc
  600.     JE    @@2
  601.     CMP    AL,'A'-64
  602.     JE    @@2
  603.     CMP    AL,'F'-64
  604.     JE    @@3
  605.     CMP    AL,eof
  606.     JE    @@4
  607.     CMP    AL,cr
  608.     JE    @@5
  609.     CMP    AL,' '
  610.     JB    @@1
  611.     CMP    BX,DX
  612.     JE    @@1
  613.     MOV    ES:[DI+BX],AL
  614.     INC    BX
  615.     CALL    WriteChar
  616.     CMP    BX,SI
  617.     JBE    @@1
  618.     MOV    SI,BX
  619.     JMP    @@1
  620. @@2:    OR    BX,BX
  621.     JE    @@1
  622.     MOV    AL,bs
  623.     CALL    WriteChar
  624.     MOV    AL,' '
  625.     CALL    WriteChar
  626.     MOV    AL,bs
  627.     CALL    WriteChar
  628.     DEC    BX
  629.     LOOP    @@2
  630.     JMP    @@1
  631. @@3:    CMP    BX,SI
  632.     JE    @@1
  633.     MOV    AL,ES:[DI+BX]
  634.     CMP    AL,' '
  635.     JB    @@1
  636.     CALL    WriteChar
  637.     INC    BX
  638.     LOOP    @@3
  639.     JMP    @@1
  640. @@4:    CMP    CheckEOF,0
  641.     JE    @@1
  642.     MOV    ES:[DI+BX],AL
  643.     INC    BX
  644.     JMP    SHORT @@6
  645. @@5:    CALL    WriteCrLf
  646.     MOV    WORD PTR ES:[DI+BX],cr+lf*256
  647.     INC    BX
  648.     INC    BX
  649. @@6:    LES    DI,FileP
  650.     XOR    AX,AX
  651.     MOV    ES:[DI].fBufPos,AX
  652.     MOV    ES:[DI].fBufEnd,BX
  653.     EXIT
  654.  
  655. ; CRT file write procedure
  656.  
  657. CrtWrite:
  658.  
  659.     MOV    BX,SP
  660.     LES    DI,SS:[BX+4]
  661.     MOV    CX,ES:[DI].fBufPos
  662.     SUB    ES:[DI].fBufPos,CX
  663.     JCXZ    @@3
  664.     LES    DI,ES:[DI].fBufPtr
  665.     CMP    DirectVideo,0
  666.     JNE    @@2
  667. @@1:    MOV    AL,ES:[DI]
  668.     CALL    WriteChar
  669.     INC    DI
  670.     LOOP    @@1
  671.     JMP    SHORT @@3
  672. @@2:    CALL    WriteString
  673. @@3:    CALL    BreakCheck
  674.     XOR    AX,AX
  675.     RETF    4
  676.  
  677. ; CRT file no-op procedure
  678.  
  679. CrtReturn:
  680.  
  681.     XOR    AX,AX
  682.     RETF    4
  683.  
  684. ; Write CR/LF on CRT
  685. ; Uses    AX
  686.  
  687. WriteCrLf:
  688.  
  689.     MOV    AL,cr
  690.     CALL    WriteChar
  691.     MOV    AL,lf
  692.  
  693. ; Write character on CRT
  694. ; In    AL = Character
  695. ; Uses    AX
  696.  
  697. WriteChar:
  698.  
  699.     PUSH    BX
  700.     PUSH    CX
  701.     PUSH    DX
  702.     PUSH    ES
  703.     PUSH    AX
  704.     CALL    GetCursor
  705.     POP    AX
  706.     CMP    AL,bell
  707.     JE    @@1
  708.     CMP    AL,bs
  709.     JE    @@2
  710.     CMP    AL,cr
  711.     JE    @@3
  712.     CMP    AL,lf
  713.     JE    @@4
  714.     MOV    AH,9
  715.     MOV    BL,TextAttr
  716.     XOR    BH,BH
  717.     MOV    CX,1
  718.     PUSH    DX
  719.     CALL    Video
  720.     POP    DX
  721.     INC    DL
  722.     CMP    DL,WindMax.X
  723.     JBE    @@5
  724.     MOV    DL,WindMin.X
  725.     JMP    SHORT @@4
  726. @@1:    MOV    AH,14
  727.     CALL    Video
  728.     JMP    SHORT @@5
  729. @@2:    CMP    DL,WindMin.X
  730.     JE    @@5
  731.     DEC    DL
  732.     JMP    SHORT @@5
  733. @@3:    MOV    DL,WindMin.X
  734.     JMP    SHORT @@5
  735. @@4:    CALL    LineFeed
  736. @@5:    CALL    SetCursor
  737.     POP    ES
  738.     POP    DX
  739.     POP    CX
  740.     POP    BX
  741.     RET
  742.  
  743. ; Do line-feed operation
  744. ; In    DX = Cursor position
  745. ; Uses    AX,BX
  746.  
  747. LineFeed:
  748.  
  749.     INC    DH
  750.     CMP    DH,WindMax.Y
  751.     JBE    @@1
  752.     DEC    DH
  753.     PUSH    CX
  754.     PUSH    DX
  755.     MOV    AX,6*256+1
  756.     MOV    BH,TextAttr
  757.     MOV    CX,WindMin
  758.     MOV    DX,WindMax
  759.     CALL    Video
  760.     POP    DX
  761.     POP    CX
  762. @@1:    RET
  763.  
  764. ; Get cursor position
  765. ; Out    DX = Cursor position
  766. ; Uses    AX,BX,CX,DX,ES
  767.  
  768. GetCursor:
  769.  
  770.     MOV    AH,3
  771.     XOR    BH,BH
  772.     JMP    Video
  773.  
  774. ; Set cursor position
  775. ; In    DX = Cursor position
  776. ; Uses    AX,BX,CX,DX,ES
  777.  
  778. SetCursor:
  779.  
  780.     MOV    AH,2
  781.     XOR    BH,BH
  782.     JMP    Video
  783.  
  784. ; Write character string directly to CRT
  785. ; In    CX    = Character count
  786. ;    DX    = Position
  787. ;    ES:DI = String pointer
  788. ; Uses    AX,BX,CX,DX,SI,DI,ES
  789.  
  790. WriteString:
  791.  
  792.     PUSH    DS
  793.     MOV    DS,Seg0040
  794.     MOV    DX,DS:Cursor
  795.     POP    DS
  796.     MOV    BX,DX
  797.     MOV    SI,DI
  798. @@1:    MOV    AL,ES:[DI]
  799.     CMP    AL,bell
  800.     JE    @@2
  801.     CMP    AL,bs
  802.     JE    @@3
  803.     CMP    AL,lf
  804.     JE    @@4
  805.     CMP    AL,cr
  806.     JE    @@5
  807.     INC    DI
  808.     INC    DL
  809.     CMP    DL,WindMax.X
  810.     JBE    @@8
  811.     CALL    DirectWrite
  812.     CALL    LineFeed
  813.     MOV    DL,WindMin.X
  814.     JMP    SHORT @@7
  815. @@2:    CALL    DirectWrite
  816.     PUSH    CX
  817.     PUSH    DX
  818.     MOV    AX,14*256+bell
  819.     CALL    Video
  820.     POP    DX
  821.     POP    CX
  822.     JMP    SHORT @@6
  823. @@3:    CALL    DirectWrite
  824.     CMP    DL,WindMin.X
  825.     JE    @@6
  826.     DEC    DL
  827.     JMP    SHORT @@6
  828. @@4:    CALL    DirectWrite
  829.     CALL    LineFeed
  830.     JMP    SHORT @@6
  831. @@5:    CALL    DirectWrite
  832.     MOV    DL,WindMin.X
  833. @@6:    INC    DI
  834. @@7:    MOV    SI,DI
  835.     MOV    BX,DX
  836. @@8:    LOOP    @@1
  837.     CALL    DirectWrite
  838.     PUSH    DS
  839.     MOV    DS,Seg0040
  840.     MOV    DS:Cursor,DX
  841.     MOV    AL,DH
  842.     MUL    DS:CrtWidth
  843.     XOR    DH,DH
  844.     ADD    AX,DX
  845.     MOV    CX,AX
  846.     MOV    DX,DS:Addr6845
  847.     MOV    AL,14
  848.     OUT    DX,AL
  849.     JMP    SHORT $+2
  850.     MOV    AL,CH
  851.     INC    DX
  852.     OUT    DX,AL
  853.     JMP    SHORT $+2
  854.     DEC    DX
  855.     MOV    AL,15
  856.     OUT    DX,AL
  857.     JMP    SHORT $+2
  858.     MOV    AL,CL
  859.     INC    DX
  860.     OUT    DX,AL
  861.     POP    DS
  862.     RET
  863.  
  864. ; Do pending direct write string
  865. ; In    BX    = Cursor position
  866. ;    ES:SI = String start address
  867. ;    ES:DI = String end address
  868. ; Uses    AX,BX,SI
  869.  
  870. DirectWrite:
  871.  
  872.     CMP    SI,DI
  873.     JE    @@8
  874.     PUSH    CX
  875.     PUSH    DX
  876.     PUSH    DI
  877.     PUSH    DS
  878.     PUSH    ES
  879.     MOV    CX,DI
  880.     SUB    CX,SI
  881.     PUSH    DS
  882.     MOV    DS,Seg0040
  883.     MOV    AL,BH
  884.     MUL    DS:CrtWidth
  885.     XOR    BH,BH
  886.     ADD    AX,BX
  887.     SHL    AX,1
  888.     MOV    DI,AX
  889.     MOV    DX,DS:Addr6845
  890.     ADD    DX,6
  891.     CMP    DS:CrtMode,7
  892.     POP    DS
  893.     MOV    AX,SegB800
  894.     JNE    @@1
  895.     MOV    AX,SegB000
  896. @@1:    MOV    BL,CheckSnow
  897.     MOV    BH,TextAttr
  898.     PUSH    ES
  899.     POP    DS
  900.     MOV    ES,AX
  901.     CLD
  902.     OR    BL,BL
  903.     JE    @@5
  904. @@2:    LODSB
  905.     MOV    BL,AL
  906. @@3:    IN    AL,DX
  907.     TEST    AL,1
  908.     JNE    @@3
  909.     CLI
  910. @@4:    IN    AL,DX
  911.     TEST    AL,1
  912.     JE    @@4
  913.     MOV    AX,BX
  914.     STOSW
  915.     STI
  916.     LOOP    @@2
  917.     JMP    SHORT @@7
  918. @@5:    MOV    AH,BH
  919. @@6:    LODSB
  920.     STOSW
  921.     LOOP    @@6
  922. @@7:    POP    ES
  923.     POP    DS
  924.     POP    DI
  925.     POP    DX
  926.     POP    CX
  927. @@8:    RET
  928.  
  929. ; Save registers and call BIOS video routine
  930.  
  931. Video:
  932.  
  933.     PUSH    SI
  934.     PUSH    DI
  935.     PUSH    BP
  936.     PUSH    ES
  937.     INT    10H
  938.     POP    ES
  939.     POP    BP
  940.     POP    DI
  941.     POP    SI
  942.     RET
  943.  
  944. CODE    ENDS
  945.  
  946.     END
  947.