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

Last change on this file since 53 was 52, checked in by Tomi Tilli, 15 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: 4.8 KB
RevLine 
[41]1; File name : Memory.asm
2; Project name : Assembly Library
3; Created date : 14.7.2010
[52]4; Last update : 11.10.2010
[41]5; Author : Tomi Tilli
6; Description : Functions for memory access.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
[46]12; OPTIMIZE_STRING_OPERATION
[41]13; Parameters
[46]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
[41]19; Returns:
[46]20; SI, DI: Updated by number of bytes operated
21; Corrupts registers:
[41]22; Nothing
[46]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
[41]48; Corrupts registers:
[46]49; Nothing
[41]50;--------------------------------------------------------------------
51ALIGN JUMP_ALIGN
[46]52Memory_CopyCXbytesFromDSSItoESDI:
53 OPTIMIZE_STRING_OPERATION rep, movs
54 ret
[41]55
[46]56
[41]57;--------------------------------------------------------------------
[46]58; Memory_ZeroSSBPwithSizeInCX
[41]59; Parameters
[46]60; CX: Number of bytes to zero
[41]61; SS:BP: Ptr to buffer to zero
62; Returns:
63; Nothing
64; Corrupts registers:
65; Nothing
66;--------------------------------------------------------------------
67ALIGN JUMP_ALIGN
[46]68Memory_ZeroSSBPwithSizeInCX:
[50]69 push es
70 push di
[41]71 push ax
[50]72 call Memory_CopySSBPtoESDI
[46]73 call Memory_ZeroESDIwithSizeInCX
[41]74 pop ax
[50]75 pop di
76 pop es
[41]77 ret
78
79;--------------------------------------------------------------------
[46]80; Memory_ZeroESDIwithSizeInCX
[41]81; Parameters
[46]82; CX: Number of bytes to zero
83; ES:DI: Ptr to destination buffer
[41]84; Returns:
[50]85; DI: Updated by number of BYTEs stored
[41]86; Corrupts registers:
87; AX
88;--------------------------------------------------------------------
89ALIGN JUMP_ALIGN
[46]90Memory_ZeroESDIwithSizeInCX:
[41]91 xor ax, ax
[46]92 ; Fall to Memory_StoreCXbytesFromAccumToESDI
[41]93
94;--------------------------------------------------------------------
[46]95; Memory_StoreCXbytesFromAccumToESDI
[41]96; Parameters
97; AX: Word to use to fill buffer
[46]98; CX: Number of BYTEs to store
99; ES:DI: Ptr to destination buffer
[41]100; Returns:
[50]101; DI: Updated by number of BYTEs stored
[41]102; Corrupts registers:
103; Nothing
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
[46]106Memory_StoreCXbytesFromAccumToESDI:
107 OPTIMIZE_STRING_OPERATION rep, stos
[41]108 ret
109
110
111;--------------------------------------------------------------------
112; Memory_ExchangeDSSIwithESDI
113; Parameters
114; Nothing
115; Returns:
[50]116; DS:SI and ES:DI are exchanged.
[41]117; Corrupts registers:
118; Nothing
119;--------------------------------------------------------------------
120ALIGN JUMP_ALIGN
121Memory_ExchangeDSSIwithESDI:
122 push ds
123 push es
124 pop ds
125 pop es
[50]126 xchg si, di
[41]127 ret
128
129
130;--------------------------------------------------------------------
131; Memory_CopySSBPtoESDI
[50]132; Memory_CopySSBPtoDSSI
[52]133; Memory_CopyDSSItoESDI
[50]134; Memory_CopyESDItoDSSI
[41]135; Parameters
136; Nothing
137; Returns:
[50]138; Copies farm pointer to different segment/pointer register pair
[41]139; Corrupts registers:
140; Nothing
141;--------------------------------------------------------------------
142ALIGN JUMP_ALIGN
143Memory_CopySSBPtoESDI:
144 push ss
145 pop es
146 mov di, bp
147 ret
148
[50]149ALIGN JUMP_ALIGN
150Memory_CopySSBPtoDSSI:
151 push ss
152 pop ds
153 mov si, bp
154 ret
[41]155
[50]156ALIGN JUMP_ALIGN
[52]157Memory_CopyDSSItoESDI:
158 push ds
159 pop es
160 mov di, si
161 ret
162
163ALIGN JUMP_ALIGN
[50]164Memory_CopyESDItoDSSI:
165 push es
166 pop ds
167 mov si, di
168 ret
169
170
[41]171;--------------------------------------------------------------------
172; Memory_SetZFifNullPointerInDSSI
173; Parameters
174; DS:SI: Far pointer
175; Returns:
176; ZF: Set if NULL pointer in DS:SI
177; Corrupts registers:
178; Nothing
179;--------------------------------------------------------------------
180ALIGN JUMP_ALIGN
181Memory_SetZFifNullPointerInDSSI:
182 push ax
183 mov ax, ds
184 or ax, si
185 pop ax
186 ret
187
188
189;--------------------------------------------------------------------
190; Memory_ReserveCXbytesFromStackToDSSI
191; Parameters
192; CX: Number of bytes to reserve
193; Returns:
194; DS:SI: Ptr to reserved buffer
195; Corrupts registers:
196; AX
197;--------------------------------------------------------------------
198ALIGN JUMP_ALIGN
199Memory_ReserveCXbytesFromStackToDSSI:
200 pop ax
201 push ss
202 pop ds
203 sub sp, cx
204 mov si, sp
205 jmp ax
Note: See TracBrowser for help on using the repository browser.