source: xtideuniversalbios/trunk/Assembly_Library/Src/Display/CgaSnow.asm @ 54

Last change on this file since 54 was 52, checked in by aitotat, 14 years ago

Changes to Assembly Library:
Completely rewritten line splitting (slower but no need to modify string).
Some changes to string processing functions.
Saved few bytes from CGA detection.

File size: 3.5 KB
RevLine 
[48]1; File name     :   CgaSnow.asm
2; Project name  :   Assembly Library
3; Created date  :   8.10.2010
[52]4; Last update   :   12.10.2010
[48]5; Author        :   Tomi Tilli
6; Description   :   Functions for preventing CGA snow.
7
8; Section containing code
9SECTION .text
10
[50]11;--------------------------------------------------------------------
12; CgaSnow_IsCgaPresent
13;   Parameters:
14;       DS:     BDA segment (zero)
15;   Returns:
16;       CF:     Set if CGA detected
17;               Cleared if CGA not detected
18;   Corrupts registers:
19;       AX
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22CgaSnow_IsCgaPresent:
23    cmp     WORD [BDA.wVidPort], CGA_STATUS_REGISTER - OFFSET_TO_CGA_STATUS_REGISTER
24    jne     SHORT .CgaNotFound
[52]25
26    ; All standard CGA modes use 25 rows but only EGA and later store it to BDA.
27    cmp     BYTE [BDA.bVidRows], 25
28    jge     SHORT .CgaNotFound
[50]29    stc
30    ret
31ALIGN JUMP_ALIGN
32.CgaNotFound:
33    clc
34    ret
[48]35
[50]36
[48]37; CGA snow preventing must be kept optional so unnecerrasy overhead
38; can be prevented when building program ment for non-CGA systems.
39%ifdef ELIMINATE_CGA_SNOW
40
41;--------------------------------------------------------------------
[49]42; CgaSnow_Stosb
43; CgaSnow_Stosw
[48]44;   Parameters:
45;       AL:     Character to output
46;       AH:     Attribute to output (CgaSnow_StoswWithoutCgaSnow only)
47;       DS:     BDA segment (zero)
48;       ES:DI:  Ptr to video memory where to output
49;   Returns:
50;       DI:     Incremented for next character
51;   Corrupts registers:
52;       AX, DX
53;--------------------------------------------------------------------
54ALIGN JUMP_ALIGN
[49]55CgaSnow_Stosb:
[50]56    call    LoadCgaStatusRegisterAddressToDXifCgaPresent
57    jz      SHORT .StosbWithoutWaitSinceUnknownPort
[48]58
59    mov     ah, al
60    cli             ; Interrupt request would mess up timing
61    WAIT_UNTIL_SAFE_CGA_WRITE
62    mov     al, ah
63.StosbWithoutWaitSinceUnknownPort:
64    stosb
65    sti
66    ret
67
68ALIGN JUMP_ALIGN
[49]69CgaSnow_Stosw:
[48]70    push    bx
[50]71    call    LoadCgaStatusRegisterAddressToDXifCgaPresent
72    jz      SHORT .StoswWithoutWaitSinceUnknownPort
[48]73
74    xchg    bx, ax
75    cli             ; Interrupt request would mess up timing
76    WAIT_UNTIL_SAFE_CGA_WRITE
77    xchg    ax, bx
78.StoswWithoutWaitSinceUnknownPort:
79    stosw
80    pop     bx
81    sti
82    ret
83
84
85;--------------------------------------------------------------------
[49]86; CgaSnow_RepMovsb
[48]87;   Parameters:
88;       CX:     Number of characters to copy
89;       DS:     BDA segment (zero)
90;       ES:SI:  Ptr to video memory where to read from
91;       ES:DI:  Ptr to video memory where to write to
92;   Returns:
93;       SI, DI: Updated for next character
94;   Corrupts registers:
95;       AX, CX, DX
96;--------------------------------------------------------------------
97ALIGN JUMP_ALIGN
[49]98CgaSnow_RepMovsb:
[50]99    call    LoadCgaStatusRegisterAddressToDXifCgaPresent
100    jz      SHORT .RepMovsbWithoutWaitSinceUnknownPort
[48]101
102.MovsbNextByte:
103    cli             ; Interrupt request would mess up timing
104    WAIT_UNTIL_SAFE_CGA_WRITE
105    eSEG    es
106    movsb
107    sti
108    loop    .MovsbNextByte
109    ret
110.RepMovsbWithoutWaitSinceUnknownPort:
111    eSEG_STR rep, es, movsb
112    ret
113
114
115;--------------------------------------------------------------------
[50]116; LoadCgaStatusRegisterAddressToDXifCgaPresent
[48]117;   Parameters:
118;       DS:     BDA segment (zero)
119;   Returns:
120;       DX:     CGA Status Register Address
[50]121;       ZF:     Set if CGA not present
122;               Cleared if CGA present
[48]123;   Corrupts registers:
124;       Nothing
125;--------------------------------------------------------------------
126ALIGN JUMP_ALIGN
[50]127LoadCgaStatusRegisterAddressToDXifCgaPresent:
128    test    BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_CGA
129    jz      SHORT .NoCgaDetected
130    mov     dx, CGA_STATUS_REGISTER
131ALIGN JUMP_ALIGN, ret
132.NoCgaDetected:
[48]133    ret
134
135
136%endif ; ELIMINATE_CGA_SNOW
Note: See TracBrowser for help on using the repository browser.