X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fmemory.c;h=c5b2acf51c7384776af89fe6b60ad346e27bebcd;hb=8d9b71ab3848729da1cf90a38a599be0b08cbb5c;hp=fec85c1dbefc684beedf02954ee271baa8a4c5e9;hpb=593009d28f70be7e5deebc7a44c16e85c2574422;p=emu8051.git diff --git a/src/memory.c b/src/memory.c index fec85c1..c5b2acf 100644 --- a/src/memory.c +++ b/src/memory.c @@ -24,6 +24,7 @@ #include "common.h" #include "cpu8051.h" +#include "reg8051.h" #include "hexfile.h" #include "memory.h" #include "options.h" @@ -60,16 +61,17 @@ memory_init(void) m = &mem_infos[k]; if (m->size > m->max_size) { - log_fail_no_exit("Memory size invalid (max = %d)", - m->max_size); + log_err("Memory size invalid (max = %d)", m->max_size); exit(1); } m->buf = malloc(m->size); if (m->buf == NULL) { - log_fail_no_exit("%s", strerror(errno)); + log_err("%s", strerror(errno)); exit(1); } + + memset(m->buf, 0x00, m->size); } } @@ -98,6 +100,13 @@ memory_sfr_write8(unsigned long address, u_int8_t value) memory_write8(INT_MEM_ID, address, value); } +void +memory_sfr_write_dptr(u_int16_t value) +{ + memory_write8(INT_MEM_ID, _DPTRHIGH_, value >> 8); + memory_write8(INT_MEM_ID, _DPTRLOW_, (uint8_t) value); +} + u_int8_t memory_read8(enum mem_id_t id, unsigned long address) { @@ -117,6 +126,77 @@ memory_sfr_read8(unsigned long address) return memory_read8(INT_MEM_ID, address); } +u_int16_t +memory_sfr_read_dptr(void) +{ + return (memory_read8(INT_MEM_ID, _DPTRHIGH_) << 8) + + memory_read8(INT_MEM_ID, _DPTRLOW_); +} + +void +stack_push8(uint8_t value) +{ + uint8_t sp; + + sp = memory_read8(INT_MEM_ID, _SP_); + + memory_write8(INT_MEM_ID, ++sp, value); + memory_write8(INT_MEM_ID, _SP_, sp); /* Save new stack pointer */ +} + +void +stack_push16(uint16_t value) +{ + uint8_t sp; + + sp = memory_read8(INT_MEM_ID, _SP_); + + memory_write8(INT_MEM_ID, ++sp, (uint8_t) value); /* Write LSB */ + memory_write8(INT_MEM_ID, ++sp, value >> 8); /* Write MSB */ + memory_write8(INT_MEM_ID, _SP_, sp); /* Save new stack pointer */ +} + +uint8_t +stack_pop8(void) +{ + uint8_t sp; + uint8_t value; + + sp = memory_read8(INT_MEM_ID, _SP_); + + value = memory_read8(INT_MEM_ID, sp--); + memory_write8(INT_MEM_ID, _SP_, sp); /* Save new stack pointer */ + + return value; +} + +uint16_t +stack_pop16(void) +{ + uint8_t sp; + uint16_t value; + + sp = memory_read8(INT_MEM_ID, _SP_); + + value = memory_read8(INT_MEM_ID, sp--) << 8; /* Read MSB */ + value |= memory_read8(INT_MEM_ID, sp--); /* Read LSB */ + memory_write8(INT_MEM_ID, _SP_, sp); /* Save new stack pointer */ + + return value; +} + +/* Read a 16-bit address from PGM memory, starting at offset */ +uint16_t +pgm_read_addr16(uint16_t base) +{ + uint16_t addr; + + addr = memory_read8(PGM_MEM_ID, base) << 8; /* MSB */ + addr |= memory_read8(PGM_MEM_ID, base + 1); /* LSB */ + + return addr; +} + /* Dump memory */ void DumpMem(char *Address, char *Asize, int memory_id)