#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 */;\