]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/z80-if.c
5 * | Z180-Sig | AVR-Port | Dir | Special Function |
6 * +------------+---------------+-------+-----------------------+
17 * | A10 | PC 2 | O | |
18 * | A11 | PC 3 | O | |
19 * | A12 | PC 4 | O | |
20 * | A13 | PC 5 | O | |
21 * | A14 | PC 6 | O | |
22 * | A15 | PC 7 | O | |
23 * | A16 | PE 2 | O | |
24 * | A17 | PE 3 | O | |
25 * | A18 | PE 4 | O | |
26 * | D0 | PF 0 | I/O | |
27 * | D1 | PF 1 | I/O | |
28 * | D2 | PF 2 | I/O | |
29 * | D3 | PF 3 | I/O | |
30 * | D4 | PF 4 | I/O | |
31 * | D5 | PF 5 | I/O | |
32 * | D6 | PF 6 | I/O | |
33 * | D7 | PF 7 | I/O | |
36 * | MREQ | PD 4 | O | |
37 * | RST | PD 5 | O | |
38 * | BUSREQ | PD 7 | O | |
39 * | BUSACK | PD 6 | I | |
40 * | IOCS1 | PE 5 | I | |
44 * | | P | | af1 USART1_TX |
45 * | | P | | af1 USART1_RX |
46 * | | P |JTDI | remap SPI1_NSS' |
47 * | | P |JTDO | remap SPI1_SCK' |
48 * | | P |JTRST | remap SPI1_MISO' |
49 * | | P | | remap SPI1_MOSI' |
50 * | | P | | af1 OSC32 |
51 * | | P | | af1 OSC32 |
57 #include <util/delay.h>
63 /* Number of array elements */
64 #define NELEMS(x) (sizeof x/sizeof *x)
67 #define CONCAT(x,y) x ## y
68 #define EVALUATOR(x,y) CONCAT(x,y)
70 #define GPIO_(X) CONCAT(GPIO, X)
81 } __attribute__((__packed__
));
83 #define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
94 #define P_BUSREQ PORTD
96 #define DDR_BUSREQ DDRD
97 #define P_BUSACK PORTD
99 #define DDR_BUSACK DDRD
100 //#define P_HALT PORTA
102 #define P_IOCS1 PORTE
104 #define DDR_IOCS1 DDRE
105 //#define P_NMI PORTB
126 //#define ADB_PORT PORTE
133 #define ADp1_PORT GPIOA
135 #define ADp2_OFS ADp1_WIDTH
138 #define ADp2_PORT GPIOC
140 #define ADp3_OFS (ADp2_OFS+ADp2_WIDTH)
142 #define ADp3_SHIFT 10
143 #define ADp3_PORT GPIOC
145 #define ADunbuff1_WIDTH 1
146 #define ADunbuff1_SHIFT 8
147 #define ADunbuff1_PORT GPIOA
149 #define ADunbuff2_WIDTH 2
150 #define ADunbuff2_SHIFT 6
151 #define ADunbuff2_PORT GPIOC
153 #define ADunbuff3_WIDTH 3
154 #define ADunbuff3_SHIFT 10
155 #define ADunbuff3_PORT GPIOC
160 #define DB_PORT GPIOB
163 #define Z80_O_MREQ SBIT(P_MREQ, 4)
164 #define Z80_O_RD SBIT(P_RD, 3)
165 #define Z80_O_WR SBIT(P_WR, 2)
166 #define Z80_O_BUSREQ SBIT(P_BUSREQ, 7)
167 //#define Z80_O_NMI SBIT(P_NMI, )
168 #define Z80_O_RST SBIT(P_RST, 5)
169 #define Z80_I_BUSACK SBIT(P_BUSACK, 6)
170 //#define Z80_I_HALT SBIT(P_HALT, )
172 void z80_busreq(level_t level
)
174 Z80_O_BUSREQ
= level
;
177 void z80_reset(level_t level
)
183 void z80_reset_pulse(void)
191 int z80_stat_halt(void)
198 #define MASK(n) ((1<<(n))-1)
199 #define SMASK(w,s) (MASK(w) << (s))
203 /*--------------------------------------------------------------------------*/
208 * A0..A6, A8..A13 are buffered. No need to disable.
209 * A7, A14..A18: set to input.
212 static void z80_setup_adrbus_tristate(void)
218 PIN_ADB
= P_ADB
& MASK(ADB_WIDTH
) << ADB_SHIFT
;
219 DDR_ADB
= DDR_ADB
& ~(MASK(ADB_WIDTH
) << ADB_SHIFT
);
223 static void z80_setup_adrbus_active(void)
227 DDR_ADB
= DDR_ADB
| (MASK(ADB_WIDTH
) << ADB_SHIFT
);
232 static void z80_setup_dbus_in(void)
238 static void z80_setup_dbus_out(void)
244 void z80_setaddress(uint32_t addr
)
246 addr_t x
; x
.l
= addr
;
250 PIN_ADB
= ((x
.b
[2] << ADB_SHIFT
) ^ P_ADB
) & MASK(ADB_WIDTH
) << ADB_SHIFT
;
253 void z80_setup_bus(void)
259 DDR_BUSREQ
|= _BV(BUSREQ
);
262 // DDR_NMI |= _BV(NMI);
267 DDR_MREQ
|= _BV(MREQ
) | _BV(RD
) | _BV(WR
);
269 DDR_BUSACK
&= ~_BV(BUSACK
);
270 P_BUSACK
&= ~_BV(BUSACK
);
272 DDR_IOCS1
&= ~_BV(IOCS1
);
273 P_IOCS1
&= ~_BV(IOCS1
);
276 //while(Z80_I_BUSACK == 1);
278 z80_setup_adrbus_tristate();
282 void z80_request_bus(void)
285 while(Z80_I_BUSACK
== 1);
286 z80_setup_adrbus_active();
289 void z80_release_bus(void)
292 z80_setup_adrbus_tristate();
294 while(Z80_I_BUSACK
== 0);
297 void z80_write(uint32_t addr
, uint8_t data
)
299 z80_setaddress(addr
);
302 z80_setup_dbus_out();
308 uint8_t z80_read(uint32_t addr
)
312 z80_setaddress(addr
);
325 void z80_memset(uint32_t addr
, uint8_t data
, uint32_t length
)
327 z80_setup_dbus_out();
330 z80_setaddress(addr
++);
338 void z80_write_block(uint8_t *src
, uint32_t dest
, uint32_t length
)
342 z80_setup_dbus_out();
345 z80_setaddress(dest
++);
355 0179' rx.bs_mask: ds 1 ; (buf_len - 1)
356 017A' rx.in_idx: ds 1 ;
357 017B' rx.out_idx: ds 1 ;
358 017C' rx.buf: ds rx.buf_len ;
359 018B' rx.buf_end equ $-1 ; last byte (start+len-1)
361 018C' tx.bs_mask: ds 1 ; (buf_len - 1)
362 018D' tx.in_idx: ds 1 ;
363 018E' tx.out_idx: ds 1 ;
364 018F' tx.buf: ds tx.buf_len ;
365 019E' tx.buf_end equ $-1 ; last byte
369 typedef struct __attribute__((packed
)) {
378 #define FIFO_BUFSIZE_MASK -3
379 #define FIFO_INDEX_IN -2
380 #define FIFO_INDEX_OUT -1
388 } fifo_dsc
[NUM_FIFOS
];
391 void z80_memfifo_init(const fifo_t f
, uint32_t adr
)
394 DBG_P(2, "z80_memfifo_init: %i, %lx\n", f
, adr
);
396 fifo_dsc
[f
].base
= adr
;
400 fifo_dsc
[f
].mask
= z80_read(adr
+ FIFO_BUFSIZE_MASK
);
401 fifo_dsc
[f
].idx_in
= z80_read(adr
+ FIFO_INDEX_IN
);
402 fifo_dsc
[f
].idx_out
= z80_read(adr
+ FIFO_INDEX_OUT
);
408 int z80_memfifo_is_empty(const fifo_t f
)
412 if (fifo_dsc
[f
].base
!= 0) {
414 uint32_t adr
= fifo_dsc
[f
].base
+ FIFO_INDEX_IN
;
420 rc
= idx
== fifo_dsc
[f
].idx_out
;
426 int z80_memfifo_is_full(const fifo_t f
)
430 if (fifo_dsc
[f
].base
!= 0) {
432 rc
= ((fifo_dsc
[f
].idx_in
+ 1) & fifo_dsc
[f
].mask
)
433 == z80_read(fifo_dsc
[f
].base
+FIFO_INDEX_OUT
);
439 uint8_t z80_memfifo_getc(const fifo_t f
)
443 while (z80_memfifo_is_empty(f
))
447 idx
= fifo_dsc
[f
].idx_out
;
448 rc
= z80_read(fifo_dsc
[f
].base
+idx
);
449 fifo_dsc
[f
].idx_out
= ++idx
& fifo_dsc
[f
].mask
;
450 z80_write(fifo_dsc
[f
].base
+FIFO_INDEX_OUT
, fifo_dsc
[f
].idx_out
);
457 void z80_memfifo_putc(fifo_t f
, uint8_t val
)
461 while (z80_memfifo_is_full(f
))
465 idx
= fifo_dsc
[f
].idx_in
;
466 z80_write(fifo_dsc
[f
].base
+idx
, val
);
467 fifo_dsc
[f
].idx_in
= ++idx
& fifo_dsc
[f
].mask
;
468 z80_write(fifo_dsc
[f
].base
+FIFO_INDEX_IN
, fifo_dsc
[f
].idx_in
);
472 /*--------------------------------------------------------------------------*/
476 //uint8_t idx_out, idx_in;
481 /*--------------------------------------------------------------------------*/
485 static void tim1_setup(void)
487 RCC_APB2RSTR
|= RCC_APB2RSTR_TIM1RST
;
488 RCC_APB2RSTR
&= ~RCC_APB2RSTR_TIM1RST
;
494 /* | TIM_SMCR_ETF_CK_INT_N_2 */
499 TIM1_DIER
= TIM_DIER_TDE
;
503 | TIM_CCMR1_OC1M_FORCE_LOW
504 | TIM_CCMR1_CC1S_OUT
;
506 TIM1_SMCR
|= TIM_SMCR_SMS_TM
;
511 /*--------------------------------------------------------------------------*/
513 void z80_setup_msg_fifo(void)
515 // gpio_set_mode(P_BUSACK, GPIO_MODE_INPUT,
516 // GPIO_CNF_INPUT_FLOAT, GPIO_BUSACK | GPIO_IOCS1);
520 // msg_fifo.count = NELEMS(msg_fifo.buf);
527 void z80_init_msg_fifo(uint32_t addr
)
530 DBG_P(1, "z80_init_msg_fifo: %lx\n", addr
);
533 z80_write(addr
+FIFO_INDEX_OUT
, z80_read(addr
+FIFO_INDEX_IN
));
535 msg_fifo
.base
= addr
;
539 int z80_msg_fifo_getc(void)
543 if (msg_fifo
.count
!= (NELEMS(msg_fifo
.buf
) /*- DMA1_CNDTR4 */ )) {
544 c
= msg_fifo
.buf
[msg_fifo
.count
];
545 if (++msg_fifo
.count
== NELEMS(msg_fifo
.buf
))
548 if (msg_fifo
.base
!= 0) {
550 z80_write(msg_fifo
.base
+FIFO_INDEX_OUT
, msg_fifo
.count
);