Skip to content

Commit b91f456

Browse files
committed
On actual hardware, memory accesses seem to wrap.
1 parent 1b2dd11 commit b91f456

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

simavr/sim/sim_core.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,11 @@ _avr_flash_read16le(
124124
void avr_core_watch_write(avr_t *avr, uint16_t addr, uint8_t v)
125125
{
126126
if (addr > avr->ramend) {
127-
AVR_LOG(avr, LOG_ERROR, FONT_RED
128-
"CORE: *** Invalid write address "
129-
"PC=%04x SP=%04x O=%04x Address %04x=%02x out of ram\n"
130-
FONT_DEFAULT,
131-
avr->pc, _avr_sp_get(avr), _avr_flash_read16le(avr, avr->pc), addr, v);
132-
crash(avr);
127+
AVR_LOG(avr, LOG_WARNING,
128+
"CORE: *** Wrapping write address "
129+
"PC=%04x SP=%04x O=%04x v=%02x Address %04x %% %04x --> %04x\n",
130+
avr->pc, _avr_sp_get(avr), _avr_flash_read16le(avr, avr->pc), v, addr, (avr->ramend+1), addr % (avr->ramend+1));
131+
addr = addr % (avr->ramend+1);
133132
}
134133
if (addr < 32) {
135134
AVR_LOG(avr, LOG_ERROR, FONT_RED
@@ -161,12 +160,12 @@ void avr_core_watch_write(avr_t *avr, uint16_t addr, uint8_t v)
161160
uint8_t avr_core_watch_read(avr_t *avr, uint16_t addr)
162161
{
163162
if (addr > avr->ramend) {
164-
AVR_LOG(avr, LOG_ERROR, FONT_RED
165-
"CORE: *** Invalid read address "
166-
"PC=%04x SP=%04x O=%04x Address %04x out of ram (%04x)\n"
163+
AVR_LOG(avr, LOG_WARNING,
164+
"CORE: *** Wrapping read address "
165+
"PC=%04x SP=%04x O=%04x Address %04x %% %04x --> %04x\n"
167166
FONT_DEFAULT,
168-
avr->pc, _avr_sp_get(avr), _avr_flash_read16le(avr, avr->pc), addr, avr->ramend);
169-
crash(avr);
167+
avr->pc, _avr_sp_get(avr), _avr_flash_read16le(avr, avr->pc), addr, (avr->ramend+1), addr % (avr->ramend+1));
168+
addr = addr % (avr->ramend+1);
170169
}
171170

172171
if (avr->gdb) {

0 commit comments

Comments
 (0)