X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fmemory.c;h=c5b2acf51c7384776af89fe6b60ad346e27bebcd;hb=8d9b71ab3848729da1cf90a38a599be0b08cbb5c;hp=057af5660fb0f10f4321c3bd830a40c289406eab;hpb=3615ed71ecaa97d539debdf803fa5f3ea21e4a1e;p=emu8051.git diff --git a/src/memory.c b/src/memory.c index 057af56..c5b2acf 100644 --- a/src/memory.c +++ b/src/memory.c @@ -70,6 +70,8 @@ memory_init(void) log_err("%s", strerror(errno)); exit(1); } + + memset(m->buf, 0x00, m->size); } } @@ -131,6 +133,70 @@ memory_sfr_read_dptr(void) 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)