www.pudn.com > zsnes117b-src.zip > fxemu2.mac


;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) 
; 
;This program is free software; you can redistribute it and/or 
;modify it under the terms of the GNU General Public License 
;as published by the Free Software Foundation; either 
;version 2 of the License, or (at your option) any later 
;version. 
; 
;This program is distributed in the hope that it will be useful, 
;but WITHOUT ANY WARRANTY; without even the implied warranty of 
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
;GNU General Public License for more details. 
; 
;You should have received a copy of the GNU General Public License 
;along with this program; if not, write to the Free Software 
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 
 
 
 
 
 
 
 
 
%macro FETCHPIPE 0 
;    mov edx,[SfxPBR] 
;    mov edx,[SfxMemTable+edx*4] 
;    mov edx,[SfxCPB] 
;    mov edx,[SfxR15] 
    mov cl,[ebp] 
%endmacro 
 
%macro UpdateR14 0 
;    mov edx,[SfxROMBR] 
;    mov edx,[SfxMemTable+edx*4] 
    mov eax,[SfxCROM] 
;    and dword[SfxR14],0FFFFh 
    add eax,[SfxR14] 
    mov [SfxRomBuffer],eax 
%endmacro 
 
%macro UpdateR15 0 
    mov ebp,[SfxCPB] 
    add ebp,[SfxR15] 
%endmacro 
 
%macro CLRFLAGS 0 
  ;and dword [SfxSFR],0FFFFh-0100h-0200h-1000h  ; Clear ALT1,ALT2 and B Flags 
;  xor ch,ch 
;  mov dword [SfxB],0         ; Clear B Flag 
;  mov esi,SfxR0 
;  mov edi,SfxR0 
%endmacro 
 
%macro TORN 1   ; V 
   FETCHPIPE 
   mov edi, SfxR0+%1*4 
   inc ebp                ; Increase program counter 
   call [FxTable+ecx*4] 
   mov edi,SfxR0 
   ret 
%endmacro 
 
%macro WITH 1  ; Verified. 
   FETCHPIPE 
   mov esi,SfxR0+%1*4 
   mov edi,SfxR0+%1*4 
   mov dword [SfxB],1 
   inc ebp                ; Increase program counter 
   call [FxTablec+ecx*4] 
   mov esi,SfxR0 
   mov edi,SfxR0 
   mov dword [SfxB],0         ; Clear B Flag 
   ret 
%endmacro 
 
%macro STWRN 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   mov ebx,[SfxRAMMem] 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   add dword [SfxLastRamAdr],ebx    ; Save last ram address 
   mov edx,[esi]            ; Read Source 
   FETCHPIPE 
   mov [ebx+eax],dl         ; Store Word 
   xor eax,1 
   inc ebp                ; Increase program counter 
   mov [ebx+eax],dh         ; Store Word 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro STBRN 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   FETCHPIPE 
   add eax,[SfxRAMMem] 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   mov ebx,[esi]            ; Read Source 
   mov byte [eax],bl         ; Store Byte 
   CLRFLAGS 
   inc ebp                ; Increase program counter 
   ret 
%endmacro 
 
%macro LDWRN 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   mov ebx,[SfxRAMMem] 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   FETCHPIPE 
   mov dl,[ebx+eax]         ; Store Word 
   add dword [SfxLastRamAdr],ebx    ; Save last ram address 
   xor eax,1 
   and edx,0FFFFh 
   inc ebp                ; Increase program counter 
   mov dh,[ebx+eax]         ; Store Word 
   mov [edi],edx            ; Read Source 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro LDBRN 1  ; V 
   mov eax,[SfxR0+%1*4]             ; Read register 
   FETCHPIPE 
   add eax,[SfxRAMMem] 
   xor ebx,ebx 
   mov dword [SfxLastRamAdr],eax    ; Save last ram address 
   mov bl,[eax]                     ; Read Byte 
   inc ebp                ; Increase program counter 
   mov [edi],ebx            ; Store Result 
   CLRFLAGS 
   ret 
%endmacro 
 
;   test byte[SfxPOR],01h 
;   jnz .nozerocheck 
;   test byte[SfxPOR],02h 
;   jz .nodither 
 
; **** Can pre-calculate [SfxSCBR] << 10 + [sfxramdata] 
; Pre-calculate fxbit values from color register 
 
%macro drawpix4b 0 
   and [eax],edx 
   and [eax+16],edx 
   xor edx,0FFFFFFFFh 
   mov ebx,[fxbit01pcal] 
   and ebx,edx 
   or [eax], ebx 
   and edx,[fxbit23pcal] 
   or [eax+16], edx 
%endmacro 
 
%macro drawpix4bd 0 
   and [eax],edx 
   and [eax+16],edx 
   xor edx,0FFFFFFFFh 
   mov ebx,[fxbit45pcal] 
   and ebx,edx 
   or [eax], ebx 
   and edx,[fxbit67pcal] 
   or [eax+16], edx 
%endmacro 
 
%macro drawpix2b 0 
   and [eax],edx 
   xor edx,0FFFFFFFFh 
   and edx,[fxbit01pcal] 
   or [eax], edx 
%endmacro 
 
%macro drawpix2bd 0 
   and [eax],edx 
   xor edx,0FFFFFFFFh 
   and edx,[fxbit45pcal] 
   or [eax], edx 
%endmacro 
 
%macro drawpix8b 0 
   and [eax],edx 
   and [eax+16],edx 
   and [eax+32],edx 
   and [eax+48],edx 
   xor edx,0FFFFFFFFh 
   mov ebx,[fxbit01pcal] 
   and ebx,edx 
   or [eax], ebx 
   mov ebx,[fxbit23pcal] 
   and ebx,edx 
   or [eax+16], ebx 
   mov ebx,[fxbit45pcal] 
   and ebx,edx 
   or [eax+32], ebx 
   and edx,[fxbit67pcal] 
   or [eax+48], edx 
%endmacro 
 
%macro drawpix8bd 0 
   and [eax],edx 
   and [eax+16],edx 
   and [eax+32],edx 
   and [eax+48],edx 
   xor edx,0FFFFFFFFh 
   mov ebx,[fxbit45pcal] 
   and ebx,edx 
   or [eax], ebx 
   mov ebx,[fxbit67pcal] 
   and ebx,edx 
   or [eax+16], ebx 
   mov ebx,[fxbit01pcal] 
   and ebx,edx 
   or [eax+32], ebx 
   and edx,[fxbit23pcal] 
   or [eax+48], edx 
%endmacro 
 
%macro plotb 5 
   shl eax,%3 
   and ebx,07h 
   add ebx,ebx 
   add eax,ebx 
   add eax,[SCBRrel] 
   mov bl,[SfxR1] 
   mov edx,[fxxand+ebx*4] 
   %2 
%endmacro 
 
%macro plotbz 5 
   shl eax,%3 
   and ebx,07h 
   add ebx,ebx 
   add eax,ebx 
   add eax,[SCBRrel] 
   mov bl,[SfxR1] 
   mov edx,[fxxand+ebx*4] 
   test byte[SfxCOLR],%5 
   jz .nodraw 
   %2 
%endmacro 
 
%macro plotbd 5 
   shl eax,%3 
   and ebx,07h 
   add ebx,ebx 
   add eax,ebx 
   add eax,[SCBRrel] 
   mov bl,[SfxR1] 
   mov edx,[fxxand+ebx*4] 
   mov bl,[SfxR1] 
   xor bl,[SfxR2] 
   test bl,01h 
   jz near .nodither4b 
   %4 
   inc word [SfxR1] 
   %1 
.nodither4b 
   %2 
%endmacro 
 
%macro plotbzd 5 
   shl eax,%3 
   and ebx,07h 
   add ebx,ebx 
   add eax,ebx 
   add eax,[SCBRrel] 
   mov bl,[SfxR1] 
   mov edx,[fxxand+ebx*4] 
   test byte[SfxCOLR],%5 
   jz near .nodraw 
   mov bl,[SfxR1] 
   xor bl,[SfxR2] 
   test bl,01h 
   jz .nodither4b 
   %4 
   inc word [SfxR1] 
   %1 
.nodither4b 
   %2 
%endmacro 
 
%macro plotlines4b 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 ret, drawpix4b, 5, drawpix4bd, 0Fh 
.nodraw 
   inc word [SfxR1] 
   ret 
%endmacro 
 
%macro plotlines4bb 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 FXReturn, drawpix4b, 5, drawpix4bd, 0Fh 
.nodraw 
   inc word [SfxR1] 
   FXReturn 
%endmacro 
 
%macro plotlines2b 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 ret, drawpix2b, 4, drawpix2bd, 03h 
.nodraw 
   inc word [SfxR1] 
   ret 
%endmacro 
 
%macro plotlines2bb 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 FXReturn, drawpix2b, 4, drawpix2bd, 03h 
.nodraw 
   inc word [SfxR1] 
   FXReturn 
%endmacro 
 
%macro plotlines8b 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 ret, drawpix8b, 6, drawpix8bd, 0FFh 
.nodraw 
   inc word [SfxR1] 
   ret 
%endmacro 
 
%macro plotlines8bb 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 FXReturn, drawpix8b, 6, drawpix8bd, 0FFh 
.nodraw 
   inc word [SfxR1] 
   FXReturn 
%endmacro 
 
%macro plotlines8bl 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 ret, drawpix8b, 6, drawpix8bd, 0Fh 
.nodraw 
   inc word [SfxR1] 
   ret 
%endmacro 
 
%macro plotlines8bbl 1 
   mov ebx,[SfxR2] 
   FETCHPIPE 
   mov bh,[SfxR1] 
   mov eax,[sfxclineloc] 
   inc ebp 
   mov eax,[eax+ebx*4] 
   cmp eax,0FFFFFFFFh 
   je near .nodraw 
   %1 FXReturn, drawpix8b, 6, drawpix8bd, 0Fh 
.nodraw 
   inc word [SfxR1] 
   FXReturn 
%endmacro 
 
%macro ADDRN 1  ; V 
   mov eax, [esi]    ; Read Source 
   mov ebx, [SfxR0+%1*4] 
   FETCHPIPE 
   add ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro ADCRN 1  ; V 
   FETCHPIPE 
   mov eax, [esi]    ; Read Source 
   mov ebx, [SfxR0+%1*4] 
   shr byte[SfxCarry],1 
   adc ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro ADIRN 1  ; V 
   mov eax, [esi]    ; Read Source 
   FETCHPIPE 
   add ax,%1 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro ADCIRN 1 ; V 
   FETCHPIPE 
   mov eax, [esi]    ; Read Source 
   shr byte[SfxCarry],1 
   adc ax,%1 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   mov [SfxSignZero],eax 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro SUBRN 1  ; V 
   mov eax,[esi]    ; Read Source 
   mov ebx,[SfxR0+%1*4] 
   FETCHPIPE 
   sub ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   inc ebp                   ; Increase program counter 
   mov [edi],eax                        ; Write Destination 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro SBCRN 1  ; V 
   FETCHPIPE 
   mov eax,[esi]    ; Read Source 
   mov ebx,[SfxR0+%1*4] 
   cmp byte[SfxCarry],1 
   sbb ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro SUBIRN 1 ; V 
   mov eax,[esi]    ; Read Source 
   FETCHPIPE 
   sub ax,%1 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   inc ebp                ; Increase program counter 
   mov [edi],eax      ; Write Destination 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro CMPRN 1  ; V 
   mov eax,[esi]    ; Read Source 
   mov ebx,[SfxR0+%1*4] 
   FETCHPIPE 
   sub ax,bx 
   seto byte[SfxOverflow] 
   setc byte[SfxCarry] 
   xor byte[SfxCarry],1 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   inc ebp                ; Increase program counter 
   ret 
%endmacro 
 
%macro ANDRN 1  ; V 
   mov eax,[esi]            ; Read Source 
   mov ebx,[SfxR0+%1*4]             ; Read RN 
   FETCHPIPE 
   and eax,ebx 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro BICRN 1  ; V 
   mov ebx,[SfxR0+%1*4]             ; Read RN 
   mov eax,[esi]            ; Read Source 
   xor ebx,0FFFFh 
   FETCHPIPE 
   and eax,ebx 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro ANDIRN 1 ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   and eax,%1 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro BICIRN 1 ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   and eax,%1 
   inc ebp 
   mov dword [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro MULTRN 1 ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,byte [SfxR0+%1*4]      ; Read RN 
   FETCHPIPE 
   imul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro UMULTRN 1        ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,byte [SfxR0+%1*4]      ; Read RN 
   FETCHPIPE 
   mul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro MULTIRN 1        ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,%1                  ; Read RN 
   FETCHPIPE 
   imul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro UMULTIRN 1       ; V 
   mov al,byte [esi]     ; Read Source 
   mov bl,%1                  ; Read RN 
   FETCHPIPE 
   mul bl 
   inc ebp 
   and eax,0FFFFh 
   mov [SfxSignZero],eax 
   mov [edi],eax            ; Write Destination 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro LINK 1   ; Verified. 
   mov eax,ebp 
   sub eax,[SfxCPB] 
   add eax,%1 
   FETCHPIPE 
   mov word [SfxR11],ax 
   CLRFLAGS 
   inc ebp 
   ret 
%endmacro 
 
%macro JMPRN 1  ; V 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4]             ; Read RN 
   mov ebp,[SfxCPB] 
   add ebp,eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro LJMPRN 1 ; V 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4] 
   and eax,07Fh 
   mov byte[SfxPBR],al 
;   mov byte[fxtrace+eax],1 
   mov eax,[SfxMemTable+eax*4] 
   mov [SfxCPB],eax 
   mov ebp,eax 
   add ebp,[esi]             ; Read RN 
   mov dword [SfxCacheActive],0 
   push ecx 
   call FxOp02 
   pop ecx 
   dec ebp 
   ret 
%endmacro 
 
%macro IBTRN 1  ; V 
   movsx eax,byte[ebp] 
   mov cl,[ebp+1] 
   add ebp,2 
   mov [SfxR0+%1*4],ax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro LMSRN 1  ; Verified. 
   xor eax,eax 
   mov al,[ebp] 
   add eax,eax 
   inc ebp 
   add eax,[SfxRAMMem] 
   mov cl,[ebp] 
   mov dword [SfxLastRamAdr],eax 
   mov ebx,[eax]              ; Read word from ram 
   inc ebp 
   mov [SfxR0+%1*4],bx              ; Write data 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro SMSRN 1  ; Verified. 
   xor eax,eax 
   mov al,[ebp] 
   inc ebp 
   add eax,eax 
   mov cl,[ebp] 
   add eax,[SfxRAMMem] 
   mov ebx,[SfxR0+%1*4]              ; Read data 
   mov dword [SfxLastRamAdr],eax 
   inc ebp 
   mov [eax],bx              ; Write word to ram 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro FROMRN 1 ; V 
   FETCHPIPE 
   mov esi,SfxR0+%1*4 
   inc ebp                ; Increase program counter 
   call [FxTable+ecx*4] 
   mov esi,SfxR0 
   ret 
%endmacro 
 
%macro ORRN 1   ; V 
   mov eax,[esi]            ; Read Source 
   mov ebx,[SfxR0+%1*4]             ; Read 
   FETCHPIPE 
   or eax,ebx 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro XORRN 1  ; V 
   mov eax,[esi]            ; Read Source 
   mov ebx,[SfxR0+%1*4]             ; Read 
   FETCHPIPE 
   xor eax,ebx 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro ORI 1    ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   or eax,%1 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro XORI 1   ; V 
   mov eax,[esi]            ; Read Source 
   FETCHPIPE 
   xor eax,%1 
   inc ebp 
   mov [edi],eax            ; Write DREG 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro INCRN 1  ; Verified 
   inc word[SfxR0+%1*4] 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4]            ; Read Source 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   inc ebp 
   ret 
%endmacro 
 
%macro DECRN 1  ; Verified 
   dec word[SfxR0+%1*4] 
   FETCHPIPE 
   mov eax,[SfxR0+%1*4]            ; Read Source 
   mov [SfxR0+%1*4],eax 
   mov [SfxSignZero],eax 
   CLRFLAGS 
   inc ebp 
   ret 
%endmacro 
 
%macro IWTRN 1  ; aka LEA       ; Verified. 
   mov eax,[ebp] 
   mov cl,[ebp+2] 
   and eax,0FFFFh 
   add ebp,3 
   mov [SfxR0+%1*4],eax 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro LMRN 1   ; Verified! 
   xor eax,eax 
   mov cl,[ebp+2] 
   mov ax,[ebp] 
   mov ebx,[SfxRAMMem] 
   mov [SfxLastRamAdr],eax 
   add [SfxLastRamAdr],ebx 
   mov dl,[eax+ebx] 
   xor eax,1 
   add ebp,3 
   mov dh,[eax+ebx] 
   mov word [SfxR0+%1*4],dx         ; Store Word 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro SMRN 1   ; Verified 
   mov ebx,[SfxR0+%1*4] 
   mov eax,[ebp] 
   mov cl,[ebp+2] 
   and eax,0FFFFh 
   mov dx,bx 
   mov ebx,[SfxRAMMem] 
   mov [SfxLastRamAdr],eax 
   add [SfxLastRamAdr],ebx 
   mov [eax+ebx],dl 
   xor eax,1 
   add ebp,3 
   mov [eax+ebx],dh 
   CLRFLAGS 
   ret 
%endmacro 
 
%macro PackEsiEdi 0 
   mov eax,[SfxSREG] 
   shl eax,2 
   add eax,SfxR0 
   mov esi,eax 
   mov eax,[SfxDREG] 
   shl eax,2 
   add eax,SfxR0 
   mov edi,eax 
   mov eax,[SfxRAMBR] 
   shl eax,16 
   add eax,[sfxramdata] 
   mov dword [SfxRAMMem],eax 
%endmacro 
 
%macro UnPackEsiEdi 0 
   mov eax,esi 
   sub eax,SfxR0 
   shr eax,2 
   mov [SfxSREG],eax 
   mov eax,edi 
   sub eax,SfxR0 
   shr eax,2 
   mov [SfxDREG],eax 
%endmacro