#include "zfile.h"
#include "flashrom.h"
+#include "debug.h"
#define FLASH_LOG 0
bool flash_active(void *fdv, uaecptr addr)
{
struct flashrom_data *fd = (struct flashrom_data*)fdv;
-
+ if (!fd)
+ return false;
return fd->state != 0;
}
int oldstate = fd->state;
uae_u32 addr2;
+ if (!fd)
+ return false;
#if FLASH_LOG
- write_log(_T("flash write %08x %02x\n"), addr, v);
+ write_log(_T("flash write %08x %02x (%d)\n"), addr, v, fd->state);
#endif
addr &= fd->mask;
addr2 = addr & 0xffff;
if (fd->state == 7) {
- fd->state = 0;
+ fd->state = 100;
if (addr >= fd->allocsize)
return false;
if (fd->rom[addr] != v)
}
// unlock
- if (addr2 == 0x5555 && fd->state == 0 && v == 0xaa)
+ if (addr2 == 0x5555 && fd->state <= 2 && v == 0xaa)
fd->state = 1;
if (addr2 == 0x2aaa && fd->state == 1 && v == 0x55)
fd->state = 2;
fd->state = 6;
if (addr2 == 0x5555 && fd->state == 6 && v == 0x10) {
memset(fd->rom, 0xff, fd->allocsize);
- fd->state = 0;
+ fd->state = 100;
fd->modified = 1;
#if FLASH_LOG
write_log(_T("flash chip erased\n"), addr);
int saddr = addr & ~0x3fff;
if (saddr < fd->allocsize)
memset(fd->rom + saddr, 0xff, 0x4000);
- fd->state = 0;
+ fd->state = 100;
fd->modified = 1;
#if FLASH_LOG
- write_log(_T("flash sector %d erased\n"), saddr / 0x4000);
+ write_log(_T("flash sector %d erased (%08x)\n"), saddr / 0x4000, addr);
#endif
return true;
}
struct flashrom_data *fd = (struct flashrom_data*)fdv;
uae_u8 v = 0xff;
+ if (!fd)
+ return 0;
+
#if FLASH_LOG
- write_log(_T("flash read %08x\n"), addr);
+ write_log(_T("flash read %08x (%d)\n"), addr, fd->state);
#endif
addr &= fd->mask;
if (a == 2)
return 0x00;
}
+
+ if (fd->state >= 100) {
+ v = fd->rom[addr] ^ 0x80;
+ fd->state++;
+ if (fd->state >= 110)
+ fd->state = 0;
+ return v;
+ }
+
fd->state = 0;
if (addr >= fd->allocsize)
return 0xff;
+
return fd->rom[addr];
}