summaryrefslogtreecommitdiff
path: root/sux.h
diff options
context:
space:
mode:
Diffstat (limited to 'sux.h')
-rw-r--r--sux.h33
1 files changed, 28 insertions, 5 deletions
diff --git a/sux.h b/sux.h
index f3eb222..5abb29c 100644
--- a/sux.h
+++ b/sux.h
@@ -49,6 +49,13 @@ extern int get_key(WINDOW *scr);
extern void io(uint64_t address, uint8_t rw);
extern void init_scr();
+
+static inline void *memcopy(void *dst, void *src, size_t n) {
+ uint8_t *d = dst, *s = src;
+ for (; n; *d++ = *s++, n--);
+ return dst;
+}
+
static inline uint64_t read_value(struct sux *cpu, uint64_t reg, uint64_t address, uint8_t size, uint8_t inc_clk, uint8_t check_io) {
#if (IO || debug) && !branch
#if keypoll
@@ -61,18 +68,34 @@ static inline uint64_t read_value(struct sux *cpu, uint64_t reg, uint64_t addres
pthread_mutex_unlock(&mutex);
#endif
#endif
- size = (size > 7) ? 7 : size;
- uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8));
#if getclk
cpu->clk += inc_clk;
#endif
- return (reg & ~mask) | (*(uint64_t *)(addr+address) & mask);
+ size = (size > 7) ? 7 : size;
+ #if 1
+ if (size < 7) {
+ uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8));
+ return (reg & ~mask) | (*(uint64_t *)(addr+address) & mask);
+ } else {
+ return *(uint64_t *)(addr+address);
+ }
+ #else
+ return *(uint64_t *)memcopy(&reg, addr+address, size+1);
+ #endif
}
static inline void write_value(struct sux *cpu, uint64_t value, uint64_t address, uint8_t size, uint8_t inc_clk, uint8_t check_io) {
size = (size > 7) ? 7 : size;
- uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8));
- *(uint64_t *)(addr+address) = (*(uint64_t *)(addr+address) & ~mask) | (value & mask);
+ #if 1
+ if (size < 7) {
+ uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8));
+ *(uint64_t *)(addr+address) = (*(uint64_t *)(addr+address) & ~mask) | (value & mask);
+ } else {
+ *(uint64_t *)(addr+address) = value;
+ }
+ #else
+ memcopy(addr+address, &value, size+1);
+ #endif
#if (IO || debug) && !branch
#if keypoll
pthread_mutex_lock(&mutex);