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

Last change on this file since 56 was 52, checked in by Tomi Tilli, 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.