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

Last change on this file since 373 was 369, checked in by gregli@…, 13 years ago

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 3.4 KB
RevLine 
[48]1; Project name : Assembly Library
2; Description : Functions for preventing CGA snow.
3
4; Section containing code
5SECTION .text
6
[50]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;--------------------------------------------------------------------
[369]17ALIGN DISPLAY_JUMP_ALIGN
[50]18CgaSnow_IsCgaPresent:
19 cmp WORD [BDA.wVidPort], CGA_STATUS_REGISTER - OFFSET_TO_CGA_STATUS_REGISTER
20 jne SHORT .CgaNotFound
[52]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
[50]25 stc
26 ret
[369]27ALIGN DISPLAY_JUMP_ALIGN
[50]28.CgaNotFound:
29 clc
30 ret
[48]31
[50]32
[162]33; CGA snow prevention must be kept optional to avoid unnecessary
34; overhead when building programs meant for non-CGA systems.
[48]35%ifdef ELIMINATE_CGA_SNOW
36
37;--------------------------------------------------------------------
[49]38; CgaSnow_Stosb
39; CgaSnow_Stosw
[48]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;--------------------------------------------------------------------
[369]50ALIGN DISPLAY_JUMP_ALIGN
[49]51CgaSnow_Stosb:
[50]52 call LoadCgaStatusRegisterAddressToDXifCgaPresent
53 jz SHORT .StosbWithoutWaitSinceUnknownPort
[48]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
[369]64ALIGN DISPLAY_JUMP_ALIGN
[49]65CgaSnow_Stosw:
[48]66 push bx
[50]67 call LoadCgaStatusRegisterAddressToDXifCgaPresent
68 jz SHORT .StoswWithoutWaitSinceUnknownPort
[48]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
[162]76 sti
[48]77 pop bx
78 ret
79
80
81;--------------------------------------------------------------------
[49]82; CgaSnow_RepMovsb
[48]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;--------------------------------------------------------------------
[369]93ALIGN DISPLAY_JUMP_ALIGN
[49]94CgaSnow_RepMovsb:
[50]95 call LoadCgaStatusRegisterAddressToDXifCgaPresent
96 jz SHORT .RepMovsbWithoutWaitSinceUnknownPort
[48]97
98.MovsbNextByte:
99 cli ; Interrupt request would mess up timing
100 WAIT_UNTIL_SAFE_CGA_WRITE
[223]101 es movsb
[48]102 sti
103 loop .MovsbNextByte
104 ret
105.RepMovsbWithoutWaitSinceUnknownPort:
106 eSEG_STR rep, es, movsb
107 ret
108
109
110;--------------------------------------------------------------------
[50]111; LoadCgaStatusRegisterAddressToDXifCgaPresent
[48]112; Parameters:
113; DS: BDA segment (zero)
114; Returns:
115; DX: CGA Status Register Address
[50]116; ZF: Set if CGA not present
117; Cleared if CGA present
[48]118; Corrupts registers:
119; Nothing
120;--------------------------------------------------------------------
[369]121ALIGN DISPLAY_JUMP_ALIGN
[50]122LoadCgaStatusRegisterAddressToDXifCgaPresent:
123 test BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_CGA
124 jz SHORT .NoCgaDetected
125 mov dx, CGA_STATUS_REGISTER
[369]126ALIGN DISPLAY_JUMP_ALIGN, ret
[50]127.NoCgaDetected:
[48]128 ret
129
130
131%endif ; ELIMINATE_CGA_SNOW
Note: See TracBrowser for help on using the repository browser.