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

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