/*
*/
-#include <stdio.h>
#include <libopencmsis/core_cm3.h>
#include <libopencm3/cm3/nvic.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/timer.h>
+#include <stdio.h>
+
#define ODR 0x0c
#define IDR 0x08
#include "debug.h"
#include "serial.h"
#include "z80-if.h"
-#include "hdrom.h"
-
+#include "../z180/hdrom.h"
#define ESCCHAR ('^'-0x40)
void sys_tick_handler(void)
{
- static int tick_10ms = 0;
- static int count_ms = 0;
+ static int_fast8_t tick_10ms = 0;
+ static int_fast16_t count_ms = 0;
- int i;
+ int_fast8_t i;
++tick_10ms;
if (tick_10ms == 10)
/*--------------------------------------------------------------------------*/
-static uint32_t z80_sram_cmp(uint32_t addr, int length, uint8_t wval, int inc)
+static uint32_t z80_sram_cmp(uint32_t addr, uint32_t length, uint8_t wval, int inc)
{
uint8_t rval;
- int errors = 0;
+ int_fast8_t errors = 0;
- DBG_P(1, "SRAM: Check %#.5x byte... ", length);
+ DBG_P(1, "SRAM: Check 0x%.5lX byte... ", length);
while (length--) {
if ((rval = z80_read(addr)) != wval) {
if (errors == 0) {
#endif
+/*--------------------------------------------------------------------------*/
+
uint8_t z80_get_byte(uint32_t adr)
{
uint8_t data;
}
}
+struct msg_item {
+ uint8_t fct;
+ uint8_t sub_min, sub_max;
+ void (*func)(uint8_t, int, uint8_t *);
+};
+
static
-void do_msg_init(int len, uint8_t* msg)
+uint32_t msg_to_addr(uint8_t *msg)
{
- uint8_t sub_fct;
-
- if (len > 0) {
- len--;
- switch (sub_fct = *msg++) {
- case 0:
- case 1:
- case 2:
- if (len == 3) {
- uint32_t fifoadr = 0;
- while (len--)
- fifoadr = (fifoadr << 8) + msg[len];
- if (sub_fct == 0)
- z80_init_msg_fifo(fifoadr);
- else
- z80_memfifo_init(sub_fct - 1, fifoadr);
- } else {
- /* garbage from z180 */
- }
- break;
- default:
- /* garbage from z180 */
- break;
- }
- }
+ uint32_t addr = msg[0] | (msg[1] << 8) | ((uint32_t)msg[2] << 16);
+
+ return addr;
+
}
static
-void do_msg_char(int len, uint8_t* msg)
+void do_msg_ini_msgfifo(uint8_t subf, int len, uint8_t * msg)
{
- uint8_t sub_fct;
-
- if (len > 0) {
- len--;
- switch (sub_fct = *msg++) {
- case 1: /* console output */
- while (len--)
- putchar(*msg++);
- break;
- }
- }
+ (void)subf; (void)len;
+
+ z80_init_msg_fifo(msg_to_addr(msg));
+}
+
+
+static
+void do_msg_ini_memfifo(uint8_t subf, int len, uint8_t * msg)
+{
+ (void)len;
+
+ z80_memfifo_init(subf - 1, msg_to_addr(msg));
+}
+
+
+static
+void do_msg_char_out(uint8_t subf, int len, uint8_t * msg)
+{
+ (void)subf;
+
+ while (len--)
+ putchar(*msg++);
}
+
+static
+const struct msg_item z80_messages[] =
+{
+ { 0, /* fct nr. */
+ 0, 0, /* sub fct nr. from, to */
+ &do_msg_ini_msgfifo},
+ { 0,
+ 1, 2,
+ &do_msg_ini_memfifo},
+ { 1,
+ 1, 1,
+ &do_msg_char_out},
+ { 0xff, /* end mark */
+ 0, 0,
+ 0},
+
+};
+
+
+
+
static
void do_message(int len, uint8_t *msg)
{
- uint8_t sub_fct;
+ uint8_t fct, sub_fct;
+ int_fast8_t i = 0;
- if (len > 0) {
- len--;
- switch (*msg++) {
- case 0: /* init functions */
- do_msg_init(len, msg);
- break;
- case 1: /* character i/o functions */
- do_msg_char(len, msg);
- break;
- default:
- /* no more functions definded yet*/
- break;
+ if (len >= 2) {
+ fct = *msg++;
+ sub_fct = *msg++;
+ len -= 2;
+
+ while (fct != z80_messages[i].fct)
+ ++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 )
+ break;
+ ++i;
+ }
+
+ if (z80_messages[i].fct != fct) {
+ DBG_P(1, "do_message: Unknown sub function: %i, %i\n",
+ fct, sub_fct);
+ return; /* TODO: unknown message sub# */
}
+
+ (z80_messages[i].func)(sub_fct, len, msg);
+
+
} else {
- /* shoudn't happen */
+ /* TODO: error */
+ DBG_P(1, "do_message: to few arguments (%i); this shouldn't happen!\n", len);
}
}
-#define CTRBUF_LEN 20
-static void check_msg_fifo(void)
+#define CTRBUF_LEN 256
+
+static
+void check_msg_fifo(void)
{
int ch;
- static int state;
+ static int_fast8_t state;
static int msglen,idx;
static uint8_t buffer[CTRBUF_LEN];
void z80_load_mem(void)
{
-
-DBG_P(1, "Loading z80 memory... \n");
-
unsigned sec = 0;
uint32_t sec_base = hdrom_start;
+ DBG_P(1, "Loading z80 memory... \n");
+
while (sec < hdrom_sections) {
DBG_P(2, " From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n",
hdrom_address[sec],
int main(void)
{
- //uint32_t led_state = LED_BLUE_PIN;
- //uint32_t rc;
- //uint8_t startval = 0;
- //int count;
- int state = 0;
+ int_fast8_t state = 0;
int ch;
clock_setup();
z80_memset(0, 0x76, 0x80000);
//z80_sram_fill(0, 512 * 1024, 0x76, 0);
- z80_sram_cmp(0, 512 * 1024, 0x76, 0);
+ z80_sram_cmp(0, (uint32_t)512 * 1024, 0x76, 0);
z80_load_mem();
z80_reset(LOW);