2015-02-15 19:10:27 +00:00
|
|
|
/*
|
|
|
|
* Apple // emulator for *nix
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "misc.h"
|
|
|
|
#include "cpu-regs.h"
|
|
|
|
|
|
|
|
#define GLUE_BANK_MAYBEREAD(func,pointer) \
|
|
|
|
ENTRY(func) ldr r1, SYM(softswitches); \
|
|
|
|
ldr r0, [r1]; \
|
2015-02-22 05:04:44 +00:00
|
|
|
ldr r1, SYM(pointer); \
|
2015-02-15 19:10:27 +00:00
|
|
|
tst r0, $SS_CXROM; \
|
2015-03-09 19:31:37 +00:00
|
|
|
bne 1f; \
|
2015-03-09 19:32:40 +00:00
|
|
|
push {r0, EffectiveAddr, PC_Reg, /*SP_Reg, F_Reg, Y_Reg, X_Reg, A_Reg,*/ lr}; \
|
2015-02-19 07:08:16 +00:00
|
|
|
ldr r1, [r1]; \
|
|
|
|
blx r1; \
|
2015-03-09 19:32:40 +00:00
|
|
|
pop {r0, EffectiveAddr, PC_Reg, /*SP_Reg, F_Reg, Y_Reg, X_Reg, A_Reg,*/ pc}; \
|
2015-03-09 19:31:37 +00:00
|
|
|
1: ldr r1, [r1]; \
|
|
|
|
ldrb r0, [r1, EffectiveAddr]; \
|
|
|
|
mov pc, lr;
|
|
|
|
|
2015-02-15 19:10:27 +00:00
|
|
|
|
|
|
|
#define GLUE_BANK_READ(func,pointer) \
|
|
|
|
ENTRY(func) ldr r1, SYM(pointer); \
|
2015-02-19 07:08:16 +00:00
|
|
|
ldr r1, [r1]; \
|
2015-02-15 19:10:27 +00:00
|
|
|
ldrb r0, [r1, EffectiveAddr]; \
|
2015-02-19 07:08:16 +00:00
|
|
|
mov pc, lr;
|
2015-02-15 19:10:27 +00:00
|
|
|
|
|
|
|
#define GLUE_BANK_WRITE(func,pointer) \
|
|
|
|
ENTRY(func) ldr r1, SYM(pointer); \
|
2015-02-19 07:08:16 +00:00
|
|
|
ldr r1, [r1]; \
|
2015-02-15 19:10:27 +00:00
|
|
|
strb r0, [r1, EffectiveAddr]; \
|
2015-02-19 07:08:16 +00:00
|
|
|
mov pc, lr;
|
2015-02-15 19:10:27 +00:00
|
|
|
|
|
|
|
#define GLUE_BANK_MAYBEWRITE(func,pointer) \
|
|
|
|
ENTRY(func) ldr r1, SYM(pointer); \
|
2015-02-19 07:08:16 +00:00
|
|
|
ldr r1, [r1]; \
|
2015-03-09 19:32:07 +00:00
|
|
|
teq r1, #0; \
|
2015-02-19 07:08:16 +00:00
|
|
|
strneb r0, [r1, EffectiveAddr]; \
|
|
|
|
mov pc, lr;
|
2015-02-15 19:10:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
#define GLUE_C_WRITE(func) \
|
2015-03-09 19:32:40 +00:00
|
|
|
ENTRY(func) push {r0, EffectiveAddr, PC_Reg, /*SP_Reg, F_Reg, Y_Reg, X_Reg, A_Reg,*/ lr}; \
|
2015-02-22 05:04:44 +00:00
|
|
|
and r0, r0, #0xff; \
|
2015-02-15 19:10:27 +00:00
|
|
|
mov r1, r0; \
|
|
|
|
mov r0, EffectiveAddr; \
|
|
|
|
bl CALL(c_##func); \
|
2015-03-09 19:32:40 +00:00
|
|
|
pop {r0, EffectiveAddr, PC_Reg, /*SP_Reg, F_Reg, Y_Reg, X_Reg, A_Reg,*/ pc};
|
2015-02-15 19:10:27 +00:00
|
|
|
|
2015-02-19 07:08:16 +00:00
|
|
|
#define GLUE_C_READ(func) \
|
2015-03-09 19:32:40 +00:00
|
|
|
ENTRY(func) push {EffectiveAddr, PC_Reg, /*SP_Reg, F_Reg, Y_Reg, X_Reg, A_Reg,*/ lr}; \
|
2015-02-15 19:10:27 +00:00
|
|
|
mov r0, EffectiveAddr; \
|
|
|
|
bl CALL(c_##func); \
|
2015-03-09 19:32:40 +00:00
|
|
|
pop {EffectiveAddr, PC_Reg, /*SP_Reg, F_Reg, Y_Reg, X_Reg, A_Reg,*/ pc};
|
2015-02-15 19:10:27 +00:00
|
|
|
|
2015-02-19 07:08:16 +00:00
|
|
|
#define GLUE_C_READ_ALTZP(FUNC) GLUE_C_READ(FUNC)
|
2015-02-15 19:10:27 +00:00
|
|
|
|