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

Last change on this file since 318 was 223, checked in by krille_n_@…, 13 years ago

Changes:

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