Skip to content

Commit

Permalink
Fix break/watch bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
jblang committed Jul 4, 2018
1 parent 72fc482 commit 53d2570
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 82 deletions.
38 changes: 38 additions & 0 deletions bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,44 @@ bus_stat bus_status()
return status;
}

/**
* Log the bus status
*/
void bus_log(bus_stat status)
{
printf_P(
PSTR("\t%04x %02x %c %s %s %s %s %s %s %s %s %s %s\n"),
status.addr,
status.data,
0x20 <= status.data && status.data <= 0x7e ? status.data : ' ',
#if (BOARD_REV < 3)
!FLAG(status.xflags, MREQ) ? "memrq" :
#else
!FLAG(status.flags, MREQ) ? "memrq" :
#endif
!FLAG(status.flags, IORQ) ? "iorq " : " ",

!FLAG(status.flags, RD) ? "rd " :
!FLAG(status.flags, WR) ? "wr " :
!FLAG(status.xflags, RFSH) ? "rfsh" : " ",
#if (BOARD_REV < 3)
!FLAG(status.flags, M1) ? "m1" : " ",
!FLAG(status.xflags, BUSRQ) ? "busrq" : " ",
!FLAG(status.xflags, BUSACK) ? "busack" : " ",
(!FLAG(status.flags, IORQ) && FLAG(status.flags, IOACK)) ? "wait" : " ",
!FLAG(status.flags, HALT) ? "halt" : " ",
#else
!FLAG(status.xflags, M1) ? "m1" : " ",
!FLAG(status.flags, BUSRQ) ? "busrq" : " ",
!FLAG(status.flags, BUSACK) ? "busack" : " ",
(!FLAG(status.flags, IORQ) && FLAG(status.flags, BUSRQ)) ? "wait" : " ",
!FLAG(status.xflags, HALT) ? "halt" : " ",
#endif
!FLAG(status.xflags, INTERRUPT) ? "int" : " ",
!FLAG(status.xflags, NMI) ? "nmi" : " ",
!FLAG(status.xflags, RESET) ? "reset" : " ");
}

/**
* Initialize the bus
*/
Expand Down
1 change: 1 addition & 0 deletions bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ void clk_stop(void);
uint8_t bus_master(void);
void bus_slave(void);
bus_stat bus_status(void);
void bus_log(bus_stat status);
void bus_init(void);

void mem_read(uint32_t addr, uint8_t * buf, uint16_t len);
Expand Down
2 changes: 1 addition & 1 deletion cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,7 @@ void cli_boot(int argc, char*argv[])
*/
void cli_bus(int argc, char *argv[])
{
z80_buslog(bus_status());
bus_log(bus_status());
}

/**
Expand Down
6 changes: 5 additions & 1 deletion iorq.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void (*dma_function)(void) = NULL;
/**
* Handle Z80 IO request
*/
void iorq_dispatch(void)
void iorq_dispatch(uint8_t logged)
{
cli();
switch (GET_ADDRLO) {
Expand Down Expand Up @@ -129,6 +129,10 @@ void iorq_dispatch(void)
SET_DATA(0xFF);
}
}
if (logged) {
bus_stat status = bus_status();
bus_log(status);
}
BUSRQ_LO;
#ifdef IOACK_OUTPUT
IOACK_LO;
Expand Down
8 changes: 5 additions & 3 deletions iorq.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@
* @file iorq.c I/O request handler
*/

#ifndef IORQ_H
#define IORQ_H
#ifndef IORQ_H
#define IORQ_H

void iorq_dispatch(void);
#include <stdint.h>

void iorq_dispatch(uint8_t logged);

extern void (*dma_function)(void);

Expand Down
108 changes: 32 additions & 76 deletions z80.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,56 +79,14 @@ void z80_run(void)
clk_run();
for(;;) {
if (!GET_IORQ)
iorq_dispatch();
iorq_dispatch(0);
if (++count == 0 && !GET_HALT)
break;
}
clk_stop();
CLK_LO;
}

/**
* Log the bus status
*/
void z80_buslog(bus_stat status)
{
printf_P(
PSTR("\t%04x %02x %c %s %s %s %s %s %s %s %s %s %s\n"),
status.addr,
status.data,
0x20 <= status.data && status.data <= 0x7e ? status.data : ' ',
#if (BOARD_REV < 3)
!FLAG(status.xflags, MREQ) ? "memrq" :
#else
!FLAG(status.flags, MREQ) ? "memrq" :
#endif
!FLAG(status.flags, IORQ) ? "iorq " : " ",

!FLAG(status.flags, RD) ? "rd " :
!FLAG(status.flags, WR) ? "wr " :
!FLAG(status.xflags, RFSH) ? "rfsh" : " ",
#if (BOARD_REV < 3)
!FLAG(status.flags, M1) ? "m1" : " ",
!FLAG(status.xflags, BUSRQ) ? "busrq" : " ",
!FLAG(status.xflags, BUSACK) ? "busack" : " ",
(!FLAG(status.flags, IORQ) && FLAG(status.flags, IOACK)) ? "wait" : " ",
!FLAG(status.flags, HALT) ? "halt" : " ",
#else
!FLAG(status.xflags, M1) ? "m1" : " ",
!FLAG(status.flags, BUSRQ) ? "busrq" : " ",
!FLAG(status.flags, BUSACK) ? "busack" : " ",
(!FLAG(status.flags, IORQ) && FLAG(status.flags, BUSRQ)) ? "wait" : " ",
!FLAG(status.xflags, HALT) ? "halt" : " ",
#endif
!FLAG(status.xflags, INTERRUPT) ? "int" : " ",
!FLAG(status.xflags, NMI) ? "nmi" : " ",
!FLAG(status.xflags, RESET) ? "reset" : " ");

// wait until output is fully transmitted to avoid
// interfering with z80_uart status for running program
uart_flush();
}

/**
* Do a single T cycle, optionally logging and breaking on the bus status
*/
Expand All @@ -139,72 +97,70 @@ uint8_t z80_tick()
uint8_t lastwr = GET_WR;

uint8_t logged = 0;
uint8_t brk = 0;

CLK_LO;
CLK_HI;

if (GET_IORQ && (ENABLED(watches, MEMRD) || ENABLED(breaks, MEMRD) ||
if (!GET_MREQ && (ENABLED(watches, MEMRD) || ENABLED(breaks, MEMRD) ||
ENABLED(watches, MEMWR) || ENABLED(breaks, MEMWR))) {
if (lastrd && !GET_RD) {
bus_stat status = bus_status();
if (!FLAG(status.xflags, MREQ)) {
if (logged = INRANGE(watches, MEMRD, status.addr))
z80_buslog(status);
if (INRANGE(breaks, MEMRD, status.addr)) {
printf_P(PSTR("memrd break at %04X\n"), status.addr);
uart_flush();
brk = 1;
}
if (logged = INRANGE(watches, MEMRD, status.addr)) {
bus_log(status);
uart_flush();
}
if (INRANGE(breaks, MEMRD, status.addr)) {
printf_P(PSTR("memrd break at %04X\n"), status.addr);
uart_flush();
return 1;
}
} else if (lastwr && !GET_WR) {
bus_stat status = bus_status();
if (!FLAG(status.xflags, MREQ)) {
if (logged = INRANGE(watches, MEMWR, status.addr))
z80_buslog(status);
if (INRANGE(breaks, MEMWR, status.addr)) {
printf_P(PSTR("memwr break at %04X\n"), status.addr);
uart_flush();
brk = 1;
};
if (logged = INRANGE(watches, MEMWR, status.addr)) {
bus_log(status);
uart_flush();
}
if (INRANGE(breaks, MEMWR, status.addr)) {
printf_P(PSTR("memwr break at %04X\n"), status.addr);
uart_flush();
return 1;
};
}
}

if (!GET_IORQ) {
if (lastrd && !GET_RD) {
if (logged = INRANGE(watches, IORD, GET_ADDRLO)) {
bus_stat status = bus_status();
z80_buslog(status);
}
logged = INRANGE(watches, IORD, GET_ADDRLO);
if (INRANGE(breaks, IORD, GET_ADDRLO)) {
printf_P(PSTR("iord break at %02X\n"), GET_ADDRLO);
uart_flush();
brk = 1;
return 1;
}
} else if (lastwr && !GET_WR) {
if (logged = INRANGE(watches, IOWR, GET_ADDRLO)) {
bus_stat status = bus_status();
z80_buslog(status);
}
logged = INRANGE(watches, IOWR, GET_ADDRLO);
if (INRANGE(breaks, IOWR, GET_ADDRLO)) {
printf_P(PSTR("iowr break at %02X\n"), GET_ADDRLO);
uart_flush();
brk = 1;
return 1;
}
}
}

if (ENABLED(watches, BUS) && !logged) {
bus_stat status = bus_status();
if (INRANGE(watches, BUS, status.addr))
z80_buslog(status);
if (INRANGE(watches, BUS, status.addr)) {
bus_log(status);
uart_flush();
}
}

if (!GET_IORQ)
iorq_dispatch();
if (!GET_IORQ) {
iorq_dispatch(logged);
if (logged)
uart_flush();
}

return brk;
return 0;
}

uint8_t disasmbrk = 0;
Expand Down
1 change: 0 additions & 1 deletion z80.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,5 @@ void z80_page(uint32_t p);
void z80_reset(uint32_t addr);
void z80_run(void);
void z80_debug(uint32_t cycles);
void z80_buslog(bus_stat status);

#endif

0 comments on commit 53d2570

Please sign in to comment.