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

Last change on this file since 52 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
Line 
1; File name     :   CgaSnow.asm
2; Project name  :   Assembly Library
3; Created date  :   8.10.2010
4; Last update   :   12.10.2010
5; Author        :   Tomi Tilli
6; Description   :   Functions for preventing CGA snow.
7
8; Section containing code
9SECTION .text
10
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
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
29    stc
30    ret
31ALIGN JUMP_ALIGN
32.CgaNotFound:
33    clc
34    ret
35
36
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;--------------------------------------------------------------------
42; CgaSnow_Stosb
43; CgaSnow_Stosw
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
55CgaSnow_Stosb:
56    call    LoadCgaStatusRegisterAddressToDXifCgaPresent
57    jz      SHORT .StosbWithoutWaitSinceUnknownPort
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
69CgaSnow_Stosw:
70    push    bx
71    call    LoadCgaStatusRegisterAddressToDXifCgaPresent
72    jz      SHORT .StoswWithoutWaitSinceUnknownPort
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;--------------------------------------------------------------------
86; CgaSnow_RepMovsb
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
98CgaSnow_RepMovsb:
99    call    LoadCgaStatusRegisterAddressToDXifCgaPresent
100    jz      SHORT .RepMovsbWithoutWaitSinceUnknownPort
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;--------------------------------------------------------------------
116; LoadCgaStatusRegisterAddressToDXifCgaPresent
117;   Parameters:
118;       DS:     BDA segment (zero)
119;   Returns:
120;       DX:     CGA Status Register Address
121;       ZF:     Set if CGA not present
122;               Cleared if CGA present
123;   Corrupts registers:
124;       Nothing
125;--------------------------------------------------------------------
126ALIGN JUMP_ALIGN
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:
133    ret
134
135
136%endif ; ELIMINATE_CGA_SNOW
Note: See TracBrowser for help on using the repository browser.