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