/*
+ * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
*/
#include "common.h"
-//#include <avr/power.h>
-//#include <avr/pgmspace.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 "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;
}
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;
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;
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:
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_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
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)
};
-
-
-