All pastes #414579 Raw Edit

Untitled

public text v1 · immutable
#414579 ·published 2007-03-29 03:16 UTC
rendered paste body
#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 */;\