diff options
author | Leo C | 2014-10-23 02:25:00 +0200 |
---|---|---|
committer | Leo C | 2014-10-23 02:25:00 +0200 |
commit | 89adce76dd02f2076ec6de1c6b434bc1f29512f4 (patch) | |
tree | 33badc10f344a4648a41dee78b0a7ea24ae36144 /avr/z180-serv.c | |
parent | 6a4e9540b950d871ea8fa072b195490a231b251d (diff) | |
download | z180-stamp-89adce76dd02f2076ec6de1c6b434bc1f29512f4.zip |
working host communication, new command: connect
Diffstat (limited to 'avr/z180-serv.c')
-rw-r--r-- | avr/z180-serv.c | 122 |
1 files changed, 92 insertions, 30 deletions
diff --git a/avr/z180-serv.c b/avr/z180-serv.c index c920326..2dbac65 100644 --- a/avr/z180-serv.c +++ b/avr/z180-serv.c @@ -4,14 +4,15 @@ #include "common.h" //#include <avr/power.h> //#include <avr/pgmspace.h> -//#include <util/atomic.h> +#include <util/atomic.h> //#include <avr/sleep.h> //#include <string.h> - +#include "background.h" #include "debug.h" #include "serial.h" #include "z80-if.h" +#include "z180-serv.h" @@ -23,7 +24,7 @@ uint8_t z80_get_byte(uint32_t adr) uint8_t data; z80_bus_cmd(Request); - data = z80_read(adr), + data = z80_read(adr); z80_bus_cmd(Release); return data; @@ -53,19 +54,12 @@ uint32_t msg_to_addr(uint8_t *msg) return addr.as32; } -void do_msg_ini_msgfifo(uint8_t subf, int len, uint8_t * msg) -{ - (void)subf; (void)len; - - z80_init_msg_fifo(msg_to_addr(msg)); -} - void do_msg_ini_memfifo(uint8_t subf, int len, uint8_t * msg) { (void)len; - z80_memfifo_init(subf - 1, msg_to_addr(msg)); + z80_memfifo_init(subf, msg_to_addr(msg)); } @@ -81,10 +75,7 @@ void do_msg_char_out(uint8_t subf, int len, uint8_t * msg) const FLASH struct msg_item z80_messages[] = { { 0, /* fct nr. */ - 0, 0, /* sub fct nr. from, to */ - do_msg_ini_msgfifo}, - { 0, - 1, 2, + 1, 3, /* sub fct nr. from, to */ do_msg_ini_memfifo}, { 1, 1, 1, @@ -108,17 +99,19 @@ void do_message(int len, uint8_t *msg) sub_fct = *msg++; len -= 2; - while (fct != z80_messages[i].fct) + while (fct != z80_messages[i].fct) { + if (z80_messages[i].fct == 0xff) { + DBG_P(1, "do_message: Unknown function: %i, %i\n", + fct, sub_fct); + return; /* TODO: unknown message # */ + } + ++i; - - if (z80_messages[i].fct == 0xff) { - DBG_P(1, "do_message: Unknown function: %i, %i\n", - fct, sub_fct); - return; /* TODO: unknown message # */ } while (fct == z80_messages[i].fct) { - if (sub_fct >= z80_messages[i].sub_min && sub_fct <= z80_messages[i].sub_max ) + if (sub_fct >= z80_messages[i].sub_min && + sub_fct <= z80_messages[i].sub_max ) break; ++i; } @@ -149,7 +142,7 @@ void check_msg_fifo(void) static int msglen,idx; static uint8_t buffer[CTRBUF_LEN]; - while (state != 3 && (ch = z80_msg_fifo_getc()) >= 0) { + while ((ch = z80_memfifo_getc(fifo_msgin)) >= 0) { switch (state) { case 0: /* wait for start of message */ if (ch == 0x81) { @@ -167,18 +160,89 @@ void check_msg_fifo(void) break; case 2: /* get message */ buffer[idx++] = ch; - if (idx == msglen) - state = 3; + if (idx == msglen) { + do_message(msglen, buffer); + state = 0; + } + break; + } + } +} + + +int msg_handling(int state) +{ + uint8_t pending; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + pending = (Stat & S_MSG_PENDING) != 0; + Stat &= ~S_MSG_PENDING; + } + + if (pending) { + switch (state) { + case 0: + z80_bus_cmd(Request); + uint32_t addr = z80_read(0x40) + + ((uint16_t) z80_read(0x41) << 8) + + ((uint32_t) z80_read(0x42) << 16); + z80_bus_cmd(Release); + if (addr != 0) { + z80_memfifo_init(fifo_msgin, addr); + state = 1; + } + break; + case 1: + check_msg_fifo(); break; } } - if (state == 3) { - do_message(msglen, buffer); - state = 0; + 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) +{ + z80_bus_cmd(Request); + z80_write(0x40, 0); + z80_write(0x41, 0); + z80_write(0x42, 0); + z80_bus_cmd(Release); + + bg_setstat(handle_msg_handling, 0); +} /*--------------------------------------------------------------------------*/ @@ -250,5 +314,3 @@ const FLASH uint8_t test1[] = { -// check_msg_fifo(); - |