]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/z80-if.c
Command 'go <startaddr>' works now
[z180-stamp.git] / avr / z80-if.c
index 207aed14ec29fe32ed65f406198e02545979ccf7..ab8e293e2612c1ad315612886f7162a8a4f91c16 100644 (file)
@@ -2,7 +2,7 @@
  *
  * Pin assignments
  *
- * | Z180-Sig  |   AVR-Port    | Dir   |   Special Function    |
+ * | Z180-Sig  |   AVR-Port    | Dir   |   Special Function    |
  * +------------+---------------+-------+-----------------------+
  * |   A0      | PA    0       |  O    |                       |
  * |   A1      | PA    1       |  O    |                       |
@@ -55,6 +55,7 @@
 
 #include <avr/io.h>
 #include <util/delay.h>
+#include <util/atomic.h>
 #include <stdio.h>
 #include "debug.h"
 #include "z80-if.h"
@@ -137,32 +138,6 @@ struct bits {
 //#define Z80_I_HALT   SBIT(P_HALT, )
 
 
-void z80_busreq(level_t level)
-{
-       Z80_O_BUSREQ = level;
-}
-
-void z80_reset(level_t level)
-{
-       Z80_O_RST = level;
-}
-
-
-void z80_reset_pulse(void)
-{
-       Z80_O_RST = 0;
-       _delay_us(10);
-       Z80_O_RST = 1;
-}
-
-#if 0
-int z80_stat_halt(void)
-{
-       return Z80_I_HALT;
-}
-#endif
-
-
 #define MASK(n)        ((1<<(n))-1)
 #define SMASK(w,s) (MASK(w) << (s))
 
@@ -173,7 +148,9 @@ typedef union {
        uint16_t w[2];
        uint8_t b[4];
 } addr_t;
+
+
+static zstate_t zstate;
 
 /*--------------------------------------------------------------------------*/
 
@@ -241,23 +218,215 @@ void z80_setup_bus(void)
 
        z80_setup_addrbus_tristate();
        z80_setup_dbus_in();
+
+       zstate = RESET;
+//     Stat &= ~S_Z180_RUNNING;
 }
 
 /*--------------------------------------------------------------------------*/
+#if 0
+       switch (zstate) {
+       case RESET:
+               break;
+       case RESET_AQRD:
+               break;
+       case RUN:
+               break;
+       case RUN_AQRD:
+               break;
+       }
+#endif
+/*--------------------------------------------------------------------------*/
+
+#if 0
+void z80_busreq(level_t level)
+{
+       Z80_O_BUSREQ = level;
+}
+
+int z80_stat_reset(void)
+{
+//     return Z80_O_RESET;
+}
+
+int z80_stat_halt(void)
+{
+       return Z80_I_HALT;
+}
+#endif
+
+
+zstate_t z80_runstate(void)
+{
+       return zstate;
+}
+
+void z80_reset(void)
+{
+#if DEBUG
+       zstate_t old = zstate;
+#endif
+       z80_setup_dbus_in();
+       z80_setup_addrbus_tristate();
+       Z80_O_RST = 0;
+       Z80_O_BUSREQ = 1;
+       zstate = RESET;
+
+       debug("z80_reset: state: %02x --> %02x\n", old, zstate);
+}
+
+void z80_reset_pulse(void)
+{
+#if DEBUG
+       zstate_t old = zstate;
+#endif
+       switch (zstate) {
+       case RESET:
+       case RESET_AQRD:
+               break;
+
+       case RUN:
+       case RUN_AQRD:
+               Z80_O_RST = 0;
+               _delay_us(10);
+               Z80_O_RST = 1;
+               break;
+       }
+
+       debug("z80_reset_pulse: state: %02x --> %02x\n", old, zstate);
+}
 
 void z80_request_bus(void)
 {
-       Z80_O_BUSREQ = 0;
-       while(Z80_I_BUSACK == 1);
-       z80_setup_addrbus_active();
+#if DEBUG
+       zstate_t old = zstate;
+#endif
+
+       switch (zstate) {
+       case RESET:
+               Z80_O_BUSREQ = 0;
+               Z80_O_RST = 1;
+               while(Z80_I_BUSACK == 1)
+                       ;
+               z80_setup_addrbus_active();
+               zstate = RESET_AQRD;
+               break;
+
+       case RESET_AQRD:
+               break;
+
+       case RUN:
+               Z80_O_BUSREQ = 0;
+               while(Z80_I_BUSACK == 1);
+               z80_setup_addrbus_active();
+               zstate = RUN_AQRD;
+               break;
+
+       case RUN_AQRD:
+               break;
+       }
+       debug("z80_request_bus: state: %02x --> %02x\n", old, zstate);
 }
 
 void z80_release_bus(void)
+{
+#if DEBUG
+       zstate_t old = zstate;
+#endif
+       switch (zstate) {
+       case RESET:
+               break;
+       case RESET_AQRD:
+               z80_setup_dbus_in();
+               z80_setup_addrbus_tristate();
+               Z80_O_RST = 0;
+               Z80_O_BUSREQ = 1;
+               zstate = RESET;
+               break;
+       case RUN:
+               break;
+       case RUN_AQRD:
+               z80_setup_dbus_in();
+               z80_setup_addrbus_tristate();
+               Z80_O_BUSREQ = 1;
+               zstate = RUN;
+               break;
+       }
+
+       debug("z80_release_bus: state: %02x --> %02x\n", old, zstate);
+}
+
+/*
+ * Do nothing, if we have the bus allready
+ *
+ * return previous state
+ */
+zstate_t z80_request_bus_save(void)
+{
+       zstate_t state;
+       
+       state = z80_runstate();
+       if (!(state & ZST_ACQUIRED))
+               z80_request_bus();
+
+       return state;
+}              
+
+/*
+ * Do nothing, if we had the bus before
+ */
+void z80_release_bus_save(zstate_t prev)
+{
+       if (!(prev & ZST_ACQUIRED))
+               z80_release_bus();
+}              
+
+void z80_run(void)
+{
+#if DEBUG
+       zstate_t old = zstate;
+#endif
+       switch (zstate) {
+       case RESET:
+               Z80_O_RST = 1;
+               zstate = RUN;
+               break;
+
+       case RESET_AQRD:
+               z80_setup_dbus_in();
+               z80_setup_addrbus_tristate();
+               Z80_O_RST = 0;
+               _delay_us(10);
+               Z80_O_RST = 1;
+               z80_setup_addrbus_active();
+               zstate = RUN_AQRD;
+               break;
+
+       case RUN:
+               break;
+       case RUN_AQRD:
+               break;
+       }
+
+       debug("z80_run: state: %02x --> %02x\n", old, zstate);
+}
+
+void z80_busreq_hpulse(void)
 {
        z80_setup_dbus_in();
        z80_setup_addrbus_tristate();
-       Z80_O_BUSREQ = 1;
-       //while(Z80_I_BUSACK == 0);
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               Z80_O_BUSREQ = 1;
+               Z80_O_BUSREQ = 1;       /* 2 AVR clock cycles */
+               Z80_O_BUSREQ = 0;       /* 2 AVR clock cycles */
+       }
+
+       if (zstate & ZST_ACQUIRED) {
+               while(Z80_I_BUSACK == 1)
+                       ;
+               z80_setup_addrbus_active();
+       }
 }
 
 /*--------------------------------------------------------------------------*/
@@ -456,6 +625,9 @@ void z80_memfifo_putc(fifo_t f, uint8_t val)
 }
 
 /*--------------------------------------------------------------------------*/
+/*
+       TODO: Rewrite msg_fifo routines for AVR
+*/
 
 static struct {
        uint32_t base;