diff options
author | Leo C | 2018-09-06 15:39:49 +0200 |
---|---|---|
committer | Leo C | 2018-09-06 15:39:49 +0200 |
commit | 1e5609bf0dfb390b0d62651cbd979e0ee21184fe (patch) | |
tree | a50d1a2123f6de6d02b937d2e2577dc99d922ff7 /avr/z80-if.c | |
parent | e9d96859cfcfe170c0025e427fd9934728395dc2 (diff) | |
download | z180-stamp-1e5609bf0dfb390b0d62651cbd979e0ee21184fe.zip |
new command: memsize. new function z80_memsize_detect().
Diffstat (limited to 'avr/z80-if.c')
-rw-r--r-- | avr/z80-if.c | 33 |
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); |