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

Last change on this file since 620 was 602, checked in by Krister Nordvall, 6 years ago

Changes:

  • SerDrive: Fixed a bug that prevented use of 3.5" 720 KB floppy disk images.
  • Also added support for Microsoft DMF (Distribution Media Format) floppy disk images.
  • XTIDECFG / Library: Minor size optimizations. Added a new macro (SKIP1B) as part of that.
  • BIOS: A small size optimization (2 bytes) to MODULE_8BIT_IDE_ADVANCED that is enabled only when USE_NEC_V is defined.
File size: 4.6 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for memory access.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; OPTIMIZE_STRING_OPERATION
25; Parameters
26; %1: String instruction without size (only MOVS and STOS is supported)
27; CX: Number of BYTEs to operate
28; DS:SI: Ptr to source data (for MOVS)
29; ES:DI: Ptr to destination
30; Returns:
31; CF: Cleared
32; CX: Zero
33; SI, DI: Updated by number of bytes operated
34; Corrupts registers:
35; Nothing
36;--------------------------------------------------------------------
37%macro OPTIMIZE_STRING_OPERATION 1
38 shr cx, 1
39 rep %1w
40 eRCL_IM cx, 1
41 rep %1b
42%endmacro
43
44
45;--------------------------------------------------------------------
46; Memory_CopyCXbytesFromDSSItoESDI
47; Parameters
48; CX: Number of bytes to copy
49; DS:SI: Ptr to source data
50; ES:DI: Ptr to destination buffer
51; Returns:
52; CF: Cleared
53; SI, DI: Updated by number of bytes copied
54; Corrupts registers:
55; Nothing
56;--------------------------------------------------------------------
57%ifndef EXCLUDE_FROM_XUB
58ALIGN JUMP_ALIGN
59Memory_CopyCXbytesFromDSSItoESDI:
60 push cx
61 OPTIMIZE_STRING_OPERATION movs
62 pop cx
63 ret
64%endif
65
66
67;--------------------------------------------------------------------
68; Memory_ZeroSSBPwithSizeInCX
69; Parameters
70; CX: Number of bytes to zero
71; SS:BP: Ptr to buffer to zero
72; Returns:
73; Nothing
74; Corrupts registers:
75; CX
76;--------------------------------------------------------------------
77%ifdef INCLUDE_MENU_LIBRARY
78ALIGN JUMP_ALIGN
79Memory_ZeroSSBPwithSizeInCX:
80 push es
81 push di
82 push ax
83 call Registers_CopySSBPtoESDI
84 call Memory_ZeroESDIwithSizeInCX
85 pop ax
86 pop di
87 pop es
88 ret
89%endif
90
91
92;--------------------------------------------------------------------
93; Memory_ZeroESDIwithSizeInCX
94; Parameters
95; CX: Number of bytes to zero
96; ES:DI: Ptr to destination buffer
97; Returns:
98; DI: Updated by number of BYTEs stored
99; Corrupts registers:
100; AX, CX
101;--------------------------------------------------------------------
102ALIGN JUMP_ALIGN
103Memory_ZeroESDIwithSizeInCX:
104 xor ax, ax
105 ; Fall to Memory_StoreCXbytesFromAccumToESDI
106
107;--------------------------------------------------------------------
108; Memory_StoreCXbytesFromAccumToESDI
109; Parameters
110; AX: Word to use to fill buffer
111; CX: Number of BYTEs to store
112; ES:DI: Ptr to destination buffer
113; Returns:
114; DI: Updated by number of BYTEs stored
115; Corrupts registers:
116; CX
117;--------------------------------------------------------------------
118Memory_StoreCXbytesFromAccumToESDI:
119 OPTIMIZE_STRING_OPERATION stos
120 ret
121
122
123;--------------------------------------------------------------------
124; Memory_ReserveCLbytesFromStackToDSSI
125; Memory_ReserveCXbytesFromStackToDSSI
126; Parameters
127; CL/CX: Number of bytes to reserve
128; Returns:
129; DS:SI: Ptr to reserved buffer
130; Corrupts registers:
131; AX
132;--------------------------------------------------------------------
133%ifndef EXCLUDE_FROM_XUB
134ALIGN JUMP_ALIGN
135Memory_ReserveCLbytesFromStackToDSSI:
136 xor ch, ch
137Memory_ReserveCXbytesFromStackToDSSI:
138 pop ax
139 push ss
140 pop ds
141 sub sp, cx
142 mov si, sp
143 jmp ax
144%endif
145
146
147;--------------------------------------------------------------------
148; Memory_SumCXbytesFromESSItoAL
149; Parameters
150; CX: Number of bytes to sum (0=65536)
151; ES:SI: Ptr to buffer containing the bytes to sum
152; Returns:
153; AL: Sum of bytes
154; ZF: Set if result is zero
155; Cleared if result is non-zero
156; Corrupts registers:
157; CX
158;--------------------------------------------------------------------
159%ifndef EXCLUDE_FROM_XTIDECFG OR NO_ATAID_VALIDATION
160ALIGN JUMP_ALIGN
161Memory_SumCXbytesFromESSItoAL:
162 push si
163 dec si
164 xor al, al
165ALIGN JUMP_ALIGN
166.AddNextByteToAL:
167 inc si
168 add al, [es:si]
169 loop .AddNextByteToAL
170 pop si
171 ret
172%endif
Note: See TracBrowser for help on using the repository browser.