4 #include <util/delay.h>
8 /* initialize bus arbitration pins */
11 /* /INT, /RESET, /BUSREQ, /WAIT, CLOCK as HIGH outputs */
12 BUSDDR |= (1 << INT) | (1 << RESET) | (1 << BUSREQ) | (1 << WAIT) | (1 << CLOCK);
13 BUSPORT |= (1 << INT) | (1 << RESET) | (1 << BUSREQ) | (1 << WAIT) | (1 << CLOCK);
15 /* /BUSACK as input with pullups */
16 BUSDDR &= ~(1 << BUSACK);
17 BUSPORT |= (1 << BUSACK);
19 /* initialize clock on OC0B */
24 TCCR0A = (1 << COM0B0) | (1 << WGM01);
27 /* reset Z80, get bus, wait until we got it */
28 BUSPORT &= ~((1 << RESET) | (1 << BUSREQ));
30 BUSPORT |= (1 << RESET);
31 while(BUSPIN & (1 << BUSACK));
34 /* acquire memory bus from Z80, blocking */
35 /* NOTE: disables DRAM refresh! */
38 BUSPORT &= ~(1 << BUSREQ); /* request bus */
39 while(BUSPIN & (1 << BUSACK)); /* wait until acquired */
42 /* return memory bus to Z80, blocking */
45 BUSPORT |= (1 << BUSREQ); /* release bus */
46 while(!(BUSPIN & (1 << BUSACK))); /* wait until released */
49 /* activate autowait: /WAIT activates on /SEL0 */
52 BUSPORT |= (1 << WAIT);
56 /* release autowait: /WAIT gets released immediately */
59 BUSPORT &= ~(1 << WAIT);
62 /* reset Z80 and devices */
65 BUSPORT &= ~(1 << RESET);
67 BUSPORT |= (1 << RESET);