X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fmemory.c;h=c5b2acf51c7384776af89fe6b60ad346e27bebcd;hb=8d9b71ab3848729da1cf90a38a599be0b08cbb5c;hp=f8753d36a9f965ce35b5a2588bb79b501fc3e06c;hpb=c2ef73ab945d0c668e000aef58a1ad227d8910c1;p=emu8051.git diff --git a/src/memory.c b/src/memory.c index f8753d3..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" @@ -69,6 +70,8 @@ memory_init(void) log_err("%s", strerror(errno)); exit(1); } + + memset(m->buf, 0x00, m->size); } } @@ -97,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) { @@ -116,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)