]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/z180-serv.c
Add unique id to fifos
[z180-stamp.git] / avr / z180-serv.c
index 56852cb4e4bb29e484cd63548a345a5b6ce60a52..ce264ae76ed8e691e0fb886f28df70e1a068e87e 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include "common.h"
 #include "debug.h"
 #include "z180-serv.h"
 
-
-
 /*--------------------------------------------------------------------------*/
 
 
 uint8_t z80_get_byte(uint32_t adr)
 {
        uint8_t data;
-       
+
        z80_bus_cmd(Request);
        data = z80_read(adr);
        z80_bus_cmd(Release);
-       
+
        return data;
 }
 
@@ -51,6 +52,25 @@ uint32_t msg_to_addr(uint8_t *msg)
 }
 
 
+static int msg_xmit_header(uint8_t func, uint8_t subf, int len)
+{
+       z80_memfifo_putc(fifo_msgout, 0xAE);
+       z80_memfifo_putc(fifo_msgout, len+2);
+       z80_memfifo_putc(fifo_msgout, func);
+       z80_memfifo_putc(fifo_msgout, subf);
+
+       return 0;
+}
+
+int msg_xmit(uint8_t func, uint8_t subf, int len, uint8_t *msg)
+{
+       msg_xmit_header(func, subf, len);
+       while (len--)
+               z80_memfifo_putc(fifo_msgout, *msg++);
+
+       return 0;
+}
+
 void do_msg_ini_memfifo(uint8_t subf, int len, uint8_t * msg)
 {
        (void)len;
@@ -67,6 +87,15 @@ void do_msg_char_out(uint8_t subf, int len, uint8_t * msg)
                putchar(*msg++);
 }
 
+/* echo message */
+void do_msg_echo(uint8_t subf, int len, uint8_t * msg)
+{
+       (void)subf;
+
+       /* send re-echo */
+       msg_xmit(1, 3, len, msg);
+}
+
 
 const FLASH struct msg_item z80_messages[] =
 {
@@ -76,6 +105,9 @@ const FLASH struct msg_item z80_messages[] =
        { 1,
          1, 1,
          do_msg_char_out},
+       { 1,
+         2, 2,
+         do_msg_echo},
        { 0xff,                         /* end mark */
          0, 0,
          0},
@@ -101,12 +133,12 @@ void do_message(int len, uint8_t *msg)
                                                fct, sub_fct);
                                return; /* TODO: unknown message # */
                        }
-               
+
                        ++i;
                }
 
                while (fct == z80_messages[i].fct) {
-                       if (sub_fct >= z80_messages[i].sub_min && 
+                       if (sub_fct >= z80_messages[i].sub_min &&
                                        sub_fct <= z80_messages[i].sub_max )
                                break;
                        ++i;
@@ -141,7 +173,7 @@ void check_msg_fifo(void)
        while ((ch = z80_memfifo_getc(fifo_msgin)) >= 0) {
                switch (state) {
                case 0:         /* wait for start of message */
-                       if (ch == 0x81) {
+                       if (ch == 0xAE) { /* TODO: magic number */
                                msglen = 0;
                                idx = 0;
                                state = 1;
@@ -169,15 +201,15 @@ void check_msg_fifo(void)
 int msg_handling(int state)
 {
        uint8_t pending;
-       
-       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+
+       ATOMIC_BLOCK(ATOMIC_FORCEON) {
                pending = (Stat & S_MSG_PENDING) != 0;
                Stat &= ~S_MSG_PENDING;
        }
-               
+
        if (pending) {
                switch (state) {
-               case 0:
+               case 0:                 /* need init */
                        z80_bus_cmd(Request);
                        uint32_t addr = z80_read(0x40) +
                                ((uint16_t) z80_read(0x41) << 8) +
@@ -188,7 +220,7 @@ int msg_handling(int state)
                                state = 1;
                        }
                        break;
-               case 1:
+               case 1:                 /* awaiting messages */
                        check_msg_fifo();
                        break;
                }
@@ -196,37 +228,14 @@ int msg_handling(int state)
 
        return state;
 }
-       
-
-int console_handling(int state)
-{
-       int ch;
-       uint8_t pending;
-       
-       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
-               pending = (Stat & S_CON_PENDING) != 0;
-               Stat &= ~S_CON_PENDING;
-       }
-               
-       if (pending) {
-               while ((ch = z80_memfifo_getc(fifo_conout)) >= 0) {
-                       putchar(ch);
-               }
-       }
-
-       return state;
-}
-       
-
 
 
 static int handle_msg_handling;
 
 void setup_z180_serv(void)
 {
-               
+
        handle_msg_handling = bg_register(msg_handling, 0);
-//     bg_register(console_handling, 0);
 }
 
 void restart_z180_serv(void)
@@ -236,28 +245,14 @@ void restart_z180_serv(void)
        z80_write(0x41, 0);
        z80_write(0x42, 0);
        z80_bus_cmd(Release);
-               
+
+       for (int i = 0; i < NUM_FIFOS; i++)
+               z80_memfifo_init(i, 0);
        bg_setstat(handle_msg_handling, 0);
 }
 
 /*--------------------------------------------------------------------------*/
 
-#if 0
-void dump_mem(const FLASH uint8_t *addr, uint32_t len)
-{
-       DBG_P(1, "hdrom dump:");
-       while (len) {
-               DBG_P(1, "\n    %.5x:", addr);
-               for (unsigned i = 0; i<16; i++)
-                       DBG_P(1, " %.2x", *addr++);
-               len -= len > 16 ? 16 : len;
-       }
-       DBG_P(1, "\n");
-}
-#endif
-/*--------------------------------------------------------------------------*/
-
-
 const FLASH uint8_t iniprog[] = {
        0xAF,                   // xor     a
        0xED, 0x39, 0x36,       // out0    (rcr),a         ;disable  DRAM refresh
@@ -295,18 +290,15 @@ const FLASH uint8_t test1[] = {
        0x21, 0x1E, 0x00,  //   ld      hl,dmclrt       ;load DMA registers
        0x06, 0x08,        //   ld      b,dmct_e-dmclrt
        0x0E, 0x20,        //   ld      c,sar0l
-       0xED, 0x93,        //   otimr   
+       0xED, 0x93,        //   otimr
        0x3E, 0xC3,        //   ld      a,0c3h          ;dst +1, src +1, burst
        0xED, 0x39, 0x31,  //   out0    (dmode),a       ;
-       0x3E, 0x62,        //   ld      a,062h          ;enable dma0, 
+       0x3E, 0x62,        //   ld      a,062h          ;enable dma0,
        0xED, 0x39, 0x30,  //cl_1:      out0    (dstat),a       ;copy 64k
        0x18, 0xFB,        //   jr      cl_1            ;
-       0x00, 0x00,        //dmclrt:    dw      0               ;src (inc) 
+       0x00, 0x00,        //dmclrt:    dw      0               ;src (inc)
        0x00,              //   db      0               ;src
        0x00, 0x00,        //   dw      0               ;dst (inc),
        0x00,              //   db      0               ;dst
        0x00, 0x00,        //   dw      0               ;count (64k)
 };
-
-
-