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

Last change on this file since 612 was 602, checked in by Krister Nordvall, 5 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
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for memory access.
3
[376]4;
[445]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[445]12;
[376]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
[445]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[445]18;
[376]19
[41]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
[46]24; OPTIMIZE_STRING_OPERATION
[41]25; Parameters
[592]26; %1: String instruction without size (only MOVS and STOS is supported)
[46]27; CX: Number of BYTEs to operate
[592]28; DS:SI: Ptr to source data (for MOVS)
[46]29; ES:DI: Ptr to destination
[41]30; Returns:
[592]31; CF: Cleared
32; CX: Zero
[46]33; SI, DI: Updated by number of bytes operated
34; Corrupts registers:
[41]35; Nothing
[46]36;--------------------------------------------------------------------
[592]37%macro OPTIMIZE_STRING_OPERATION 1
38 shr cx, 1
39 rep %1w
40 eRCL_IM cx, 1
41 rep %1b
[46]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:
[592]52; CF: Cleared
[46]53; SI, DI: Updated by number of bytes copied
[41]54; Corrupts registers:
[46]55; Nothing
[41]56;--------------------------------------------------------------------
[592]57%ifndef EXCLUDE_FROM_XUB
[41]58ALIGN JUMP_ALIGN
[46]59Memory_CopyCXbytesFromDSSItoESDI:
[592]60 push cx
61 OPTIMIZE_STRING_OPERATION movs
62 pop cx
[46]63 ret
[131]64%endif
[41]65
[46]66
[41]67;--------------------------------------------------------------------
[46]68; Memory_ZeroSSBPwithSizeInCX
[41]69; Parameters
[46]70; CX: Number of bytes to zero
[41]71; SS:BP: Ptr to buffer to zero
72; Returns:
73; Nothing
74; Corrupts registers:
[592]75; CX
[41]76;--------------------------------------------------------------------
[489]77%ifdef INCLUDE_MENU_LIBRARY
[41]78ALIGN JUMP_ALIGN
[46]79Memory_ZeroSSBPwithSizeInCX:
[50]80 push es
81 push di
[41]82 push ax
[105]83 call Registers_CopySSBPtoESDI
[46]84 call Memory_ZeroESDIwithSizeInCX
[41]85 pop ax
[50]86 pop di
87 pop es
[41]88 ret
[489]89%endif
[41]90
[526]91
[41]92;--------------------------------------------------------------------
[46]93; Memory_ZeroESDIwithSizeInCX
[41]94; Parameters
[46]95; CX: Number of bytes to zero
96; ES:DI: Ptr to destination buffer
[41]97; Returns:
[50]98; DI: Updated by number of BYTEs stored
[41]99; Corrupts registers:
[592]100; AX, CX
[41]101;--------------------------------------------------------------------
102ALIGN JUMP_ALIGN
[46]103Memory_ZeroESDIwithSizeInCX:
[41]104 xor ax, ax
[46]105 ; Fall to Memory_StoreCXbytesFromAccumToESDI
[41]106
107;--------------------------------------------------------------------
[46]108; Memory_StoreCXbytesFromAccumToESDI
[41]109; Parameters
110; AX: Word to use to fill buffer
[46]111; CX: Number of BYTEs to store
112; ES:DI: Ptr to destination buffer
[41]113; Returns:
[50]114; DI: Updated by number of BYTEs stored
[41]115; Corrupts registers:
[592]116; CX
[41]117;--------------------------------------------------------------------
[46]118Memory_StoreCXbytesFromAccumToESDI:
[592]119 OPTIMIZE_STRING_OPERATION stos
[41]120 ret
121
122
123;--------------------------------------------------------------------
[602]124; Memory_ReserveCLbytesFromStackToDSSI
[41]125; Memory_ReserveCXbytesFromStackToDSSI
126; Parameters
[602]127; CL/CX: Number of bytes to reserve
[41]128; Returns:
129; DS:SI: Ptr to reserved buffer
130; Corrupts registers:
131; AX
132;--------------------------------------------------------------------
[592]133%ifndef EXCLUDE_FROM_XUB
[41]134ALIGN JUMP_ALIGN
[602]135Memory_ReserveCLbytesFromStackToDSSI:
136 xor ch, ch
[41]137Memory_ReserveCXbytesFromStackToDSSI:
138 pop ax
139 push ss
140 pop ds
141 sub sp, cx
142 mov si, sp
143 jmp ax
[194]144%endif
[440]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
[445]154; ZF: Set if result is zero
155; Cleared if result is non-zero
[440]156; Corrupts registers:
157; CX
158;--------------------------------------------------------------------
[580]159%ifndef EXCLUDE_FROM_XTIDECFG OR NO_ATAID_VALIDATION
[440]160ALIGN JUMP_ALIGN
161Memory_SumCXbytesFromESSItoAL:
162 push si
[445]163 dec si
[440]164 xor al, al
165ALIGN JUMP_ALIGN
166.AddNextByteToAL:
[445]167 inc si
[440]168 add al, [es:si]
169 loop .AddNextByteToAL
170 pop si
171 ret
[445]172%endif
Note: See TracBrowser for help on using the repository browser.