Skip to content

Commit 46fe260

Browse files
authored
Merge pull request #280 from dgeelen/dgeelen/wrap_memory_accesses
On actual hardware, memory accesses seem to wrap.
2 parents 9669491 + ce3a211 commit 46fe260

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

simavr/sim/sim_core.c

Lines changed: 10 additions & 13 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) {
@@ -1440,5 +1439,3 @@ avr_flashaddr_t avr_run_one(avr_t * avr)
14401439

14411440
return new_pc;
14421441
}
1443-
1444-

0 commit comments

Comments
 (0)