]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/z80-if.c
new command: memsize. new function z80_memsize_detect().
[z180-stamp.git] / avr / z80-if.c
index 618384950874db2abd9ae8e70ac33ee7dbcfac84..6d831724dbb2cbc718a03282159eb3bcf48327dd 100644 (file)
@@ -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);