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

Last change on this file since 50 was 50, checked in by aitotat, 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.