summaryrefslogtreecommitdiff
path: root/avr/z80-if.c
diff options
context:
space:
mode:
authorLeo C2018-09-06 15:39:49 +0200
committerLeo C2018-09-06 15:39:49 +0200
commit1e5609bf0dfb390b0d62651cbd979e0ee21184fe (patch)
treea50d1a2123f6de6d02b937d2e2577dc99d922ff7 /avr/z80-if.c
parente9d96859cfcfe170c0025e427fd9934728395dc2 (diff)
downloadz180-stamp-1e5609bf0dfb390b0d62651cbd979e0ee21184fe.zip
new command: memsize. new function z80_memsize_detect().
Diffstat (limited to 'avr/z80-if.c')
-rw-r--r--avr/z80-if.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/avr/z80-if.c b/avr/z80-if.c
index 6183849..6d83172 100644
--- a/avr/z80-if.c
+++ b/avr/z80-if.c
@@ -463,6 +463,39 @@ void z80_setaddress(uint32_t addr)
PIN_ADB = (((addr >> 16) << ADB_SHIFT) ^ P_ADB) & MASK(ADB_WIDTH) << ADB_SHIFT;
}
+int32_t z80_memsize_detect(void)
+{
+ const uint8_t PATTERN_1 = 0x55;
+ const uint8_t PATTERN_2 = ~PATTERN_1;
+ uint32_t addr;
+
+ if (!(z80_bus_cmd(Request) & ZST_ACQUIRED))
+ return -EBUSTO;
+
+ uint8_t ram_0 = z80_read(0);
+ uint8_t ram_1 = z80_read(1);
+
+ z80_write(0, ram_0 ^ 0xff);
+ z80_write(1, ram_1);
+ if ((z80_read(0) ^ ram_0) != 0xff) {
+ addr = 0;
+ } else {
+ z80_write(0, PATTERN_1);
+ for (addr=1; addr < CONFIG_SYS_RAMSIZE_MAX; addr <<= 1) {
+ uint8_t ram_i = z80_read(addr);
+ z80_write(addr, PATTERN_2);
+ if (z80_read(0) != PATTERN_1 || z80_read(addr) != PATTERN_2)
+ break;
+ z80_write(addr, ram_i);
+ }
+ }
+
+ z80_write(0, ram_0);
+ z80_bus_cmd(Release);
+
+ return addr;
+}
+
void z80_write(uint32_t addr, uint8_t data)
{
z80_setaddress(addr);