summaryrefslogtreecommitdiff
path: root/sux.h
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2020-08-31 11:25:19 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2020-08-31 11:25:19 -0400
commit385a621b9487456c3167f204b02cb0ea0752191d (patch)
treef8646458ea5b1b49af192d162ed0713c73c6cca6 /sux.h
parent4ed07ca38b99abdca750c6612c512f30965f1714 (diff)
- Optimized the memory read/write functions a bit more.
- Added a memcopy() function, for later on.
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);