source: xtideuniversalbios/trunk/Assembly_Library/Src/Util/Memory.asm@ 50

Last change on this file since 50 was 50, checked in by Tomi Tilli, 14 years ago

Changes to Assembly Library:
Removed Memory_ExchangeSSBPwithESDI since it obviously corrupted stack.
CGA detection is now only done once when initializing Display Context.
Moved File Library defines to File.inc.

File size: 4.6 KB
Line 
1; File name : Memory.asm
2; Project name : Assembly Library
3; Created date : 14.7.2010
4; Last update : 9.10.2010
5; Author : Tomi Tilli
6; Description : Functions for memory access.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; OPTIMIZE_STRING_OPERATION
13; Parameters
14; %1: Repeat instruction
15; %2: String instruction without size (for example MOVS and not MOVSB or MOVSW)
16; CX: Number of BYTEs to operate
17; DS:SI: Ptr to source data
18; ES:DI: Ptr to destination
19; Returns:
20; SI, DI: Updated by number of bytes operated
21; Corrupts registers:
22; Nothing
23;--------------------------------------------------------------------
24%macro OPTIMIZE_STRING_OPERATION 2
25 push cx
26
27 shr cx, 1 ; Operate with WORDs for performance
28 jcxz %%HandleRemainingByte
29 %1 %2w
30%%HandleRemainingByte:
31 jnc SHORT %%OperationCompleted
32 %2b
33
34ALIGN JUMP_ALIGN
35%%OperationCompleted:
36 pop cx
37%endmacro
38
39
40;--------------------------------------------------------------------
41; Memory_CopyCXbytesFromDSSItoESDI
42; Parameters
43; CX: Number of bytes to copy
44; DS:SI: Ptr to source data
45; ES:DI: Ptr to destination buffer
46; Returns:
47; SI, DI: Updated by number of bytes copied
48; Corrupts registers:
49; Nothing
50;--------------------------------------------------------------------
51ALIGN JUMP_ALIGN
52Memory_CopyCXbytesFromDSSItoESDI:
53 OPTIMIZE_STRING_OPERATION rep, movs
54 ret
55
56
57;--------------------------------------------------------------------
58; Memory_ZeroSSBPwithSizeInCX
59; Parameters
60; CX: Number of bytes to zero
61; SS:BP: Ptr to buffer to zero
62; Returns:
63; Nothing
64; Corrupts registers:
65; Nothing
66;--------------------------------------------------------------------
67ALIGN JUMP_ALIGN
68Memory_ZeroSSBPwithSizeInCX:
69 push es
70 push di
71 push ax
72 call Memory_CopySSBPtoESDI
73 call Memory_ZeroESDIwithSizeInCX
74 pop ax
75 pop di
76 pop es
77 ret
78
79;--------------------------------------------------------------------
80; Memory_ZeroESDIwithSizeInCX
81; Parameters
82; CX: Number of bytes to zero
83; ES:DI: Ptr to destination buffer
84; Returns:
85; DI: Updated by number of BYTEs stored
86; Corrupts registers:
87; AX
88;--------------------------------------------------------------------
89ALIGN JUMP_ALIGN
90Memory_ZeroESDIwithSizeInCX:
91 xor ax, ax
92 ; Fall to Memory_StoreCXbytesFromAccumToESDI
93
94;--------------------------------------------------------------------
95; Memory_StoreCXbytesFromAccumToESDI
96; Parameters
97; AX: Word to use to fill buffer
98; CX: Number of BYTEs to store
99; ES:DI: Ptr to destination buffer
100; Returns:
101; DI: Updated by number of BYTEs stored
102; Corrupts registers:
103; Nothing
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
106Memory_StoreCXbytesFromAccumToESDI:
107 OPTIMIZE_STRING_OPERATION rep, stos
108 ret
109
110
111;--------------------------------------------------------------------
112; Memory_ExchangeDSSIwithESDI
113; Parameters
114; Nothing
115; Returns:
116; DS:SI and ES:DI are exchanged.
117; Corrupts registers:
118; Nothing
119;--------------------------------------------------------------------
120ALIGN JUMP_ALIGN
121Memory_ExchangeDSSIwithESDI:
122 push ds
123 push es
124 pop ds
125 pop es
126 xchg si, di
127 ret
128
129
130;--------------------------------------------------------------------
131; Memory_CopySSBPtoESDI
132; Memory_CopySSBPtoDSSI
133; Memory_CopyESDItoDSSI
134; Parameters
135; Nothing
136; Returns:
137; Copies farm pointer to different segment/pointer register pair
138; Corrupts registers:
139; Nothing
140;--------------------------------------------------------------------
141ALIGN JUMP_ALIGN
142Memory_CopySSBPtoESDI:
143 push ss
144 pop es
145 mov di, bp
146 ret
147
148ALIGN JUMP_ALIGN
149Memory_CopySSBPtoDSSI:
150 push ss
151 pop ds
152 mov si, bp
153 ret
154
155ALIGN JUMP_ALIGN
156Memory_CopyESDItoDSSI:
157 push es
158 pop ds
159 mov si, di
160 ret
161
162
163;--------------------------------------------------------------------
164; Memory_SetZFifNullPointerInDSSI
165; Parameters
166; DS:SI: Far pointer
167; Returns:
168; ZF: Set if NULL pointer in DS:SI
169; Corrupts registers:
170; Nothing
171;--------------------------------------------------------------------
172ALIGN JUMP_ALIGN
173Memory_SetZFifNullPointerInDSSI:
174 push ax
175 mov ax, ds
176 or ax, si
177 pop ax
178 ret
179
180
181;--------------------------------------------------------------------
182; Memory_ReserveCXbytesFromStackToDSSI
183; Parameters
184; CX: Number of bytes to reserve
185; Returns:
186; DS:SI: Ptr to reserved buffer
187; Corrupts registers:
188; AX
189;--------------------------------------------------------------------
190ALIGN JUMP_ALIGN
191Memory_ReserveCXbytesFromStackToDSSI:
192 pop ax
193 push ss
194 pop ds
195 sub sp, cx
196 mov si, sp
197 jmp ax
Note: See TracBrowser for help on using the repository browser.