Untitled
public text v1 · immutable#define execute_store_builder(store_type, store_op, load_op) ;\
;\
execute_store_u##store_type: ;\
stmdb sp!, { lr } /* save lr */;\
b ext_store_u##store_type ;\
str r2, [reg_base, #REG_PC] /* write out PC */;\
tst r0, #0xF0000000 /* make sure address is in range */;\
bne ext_store_u##store_type /* if not do ext store */;\
;\
ldr r2, 1f /* r2 = memory_map_write */;\
mov lr, r0, lsr #15 /* lr = page index of address */;\
ldr r2, [r2, lr, lsl #2] /* r0 = memory page */;\
;\
cmp r2, #0 /* see if map is ext */;\
beq ext_store_u##store_type /* if so do ext store */;\
;\
mov r0, r0, lsl #17 /* isolate bottom 15 bits in top */;\
mov r0, r0, lsr #17 /* like performing and 0x7FFF */;\
store_op r1, [r2, r0] /* store result */;\
;\
sub r2, r2, #0x8000 ;\
load_op r0, [r2, r0] /* check code flag */;\
;\
cmp r0, #0 /* see if it's 0 */;\
ldmeqia sp!, { pc } /* if so, can return */;\
;\
add sp, sp, #4 /* take lr off of stack */;\
b smc_write /* perform smc write */;\
;\
1: ;\
.word memory_map_write ;\
;\
ext_store_u##store_type: ;\
ldmia sp!, { lr } /* pop lr off of stack */;\
call_c_function(write_memory##store_type) ;\
b write_epilogue /* handle additional write stuff */;\