/* * Apple // emulator for Linux: Glue file prologue for Intel 386 * * Copyright 1994 Alexander Jean-Claude Bottema * Copyright 1995 Stephen Lee * Copyright 1997, 1998 Aaron Culliney * Copyright 1998, 1999, 2000 Michael Deutschmann * * This software package is subject to the GNU General Public License * version 2 or later (your choice) as published by the Free Software * Foundation. * * THERE ARE NO WARRANTIES WHATSOEVER. * */ #define __ASSEMBLY__ #include "apple2.h" #include "misc.h" #include "cpu.h" #define GLUE_FIXED_READ(func,address) \ E(func) movb SN(address)(%edi),%al; \ ret; #define GLUE_FIXED_WRITE(func,address) \ E(func) movb %al,SN(address)(%edi); \ ret; #define GLUE_BANK_MAYBEREAD(func,pointer) \ E(func) testl $SS_CXROM, SN(softswitches); \ jnz 1f; \ call *SN(pointer); \ ret; \ 1: addl SN(pointer),%edi; \ movb (%edi),%al; \ subl SN(pointer),%edi; \ ret; #define GLUE_BANK_READ(func,pointer) \ E(func) addl SN(pointer),%edi; \ movb (%edi),%al; \ subl SN(pointer),%edi; \ ret; #define GLUE_BANK_WRITE(func,pointer) \ E(func) addl SN(pointer),%edi; \ movb %al,(%edi); \ subl SN(pointer),%edi; \ ret; #define GLUE_BANK_MAYBEWRITE(func,pointer) \ E(func) addl SN(pointer),%edi; \ cmpl $0,SN(pointer); \ jz 1f; \ movb %al,(%edi); \ 1: ret; // TODO FIXME : implement CDECL prologue/epilogues... #define GLUE_C_WRITE(func) \ E(func) pushl %eax; \ pushl XY_Regs_32; \ pushl FF_Reg; \ pushl SP_Reg; \ pushl PC_Reg_E; \ andl $0xff,%eax; \ pushl %eax; \ pushl EffectiveAddr_E; \ call SN(c_##func); \ popl %edx; /* dummy */ \ popl %edx; /* dummy */ \ popl PC_Reg_E; \ popl SP_Reg; \ popl FF_Reg; \ popl XY_Regs_32; \ popl %eax; \ ret; // TODO FIXME : implement CDECL prologue/epilogues... #define _GLUE_C_READ(func, ...) \ E(func) pushl XY_Regs_32; \ pushl FF_Reg; \ pushl SP_Reg; \ pushl PC_Reg_E; \ pushl EffectiveAddr_E; \ call SN(c_##func); \ popl %edx; /* dummy */ \ popl PC_Reg_E; \ popl SP_Reg; \ popl FF_Reg; \ popl XY_Regs_32; \ __VA_ARGS__ \ ret; // TODO FIXME : implement CDECL prologue/epilogues... #define GLUE_C_READ(FUNC) _GLUE_C_READ(FUNC) #define GLUE_C_READ_ALTZP(FUNC) _GLUE_C_READ(FUNC, \ pushl %eax; \ andl $0xFFFF, SP_Reg; \ movl SN(base_stackzp), %eax; \ subl $SN(apple_ii_64k), %eax; \ orl %eax, SP_Reg; \ popl %eax; \ )