]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/z180-stamp-avr.c
6 //#include <avr/power.h>
7 //#include <avr/pgmspace.h>
8 //#include <avr/interrupt.h>
9 //#include <util/atomic.h>
10 //#include <avr/sleep.h>
20 #define const const __flash
21 #include "../z180/hdrom.h"
27 #define ESCCHAR ('^'-0x40)
29 #define S_10MS_TO (1<<0)
32 volatile int_fast8_t timeout_1s
;
33 volatile uint_least8_t Stat
;
36 /****************************************************************/
45 //#define ADB_PORT GPIOE
47 #define MASK(n) ((1<<(n))-1)
48 #define SMASK(w,s) (MASK(w) << (s))
58 void z80_setaddress(uint32_t addr
)
65 PIN_ADB
= ((x
.b
[2] << ADB_SHIFT
) ^ P_ADB
) & MASK(ADB_WIDTH
) << ADB_SHIFT
;
69 /****************************************************************/
71 /*--------------------------------------------------------------------------*/
74 void sys_tick_handler(void)
76 static int_fast8_t tick_10ms
= 0;
77 static int_fast16_t count_ms
= 0;
89 /* Drive timer procedure of low level disk I/O module */
94 if (count_ms
== 1000) {
104 /*--------------------------------------------------------------------------*/
106 static uint32_t z80_sram_cmp(uint32_t addr
, uint32_t length
, uint8_t wval
, int inc
)
109 int_fast8_t errors
= 0;
111 DBG_P(1, "SRAM: Check %#.5x byte... ", length
);
113 if ((rval
= z80_read(addr
)) != wval
) {
115 printf("\nSRAM: Address W R\n" \
119 printf(" %.5lx %.2x %.2x\n", addr
, wval
, rval
);
133 static void z80_sram_fill(uint32_t addr
, int length
, uint8_t startval
, int inc
)
135 printf("SRAM: Write %#.5x byte... ", length
); //fflush(stdout);
137 z80_write(addr
, startval
);
145 void z80_sram_fill_string(uint32_t addr
, int length
, const char *text
)
148 const char *p
= text
;
151 z80_write(addr
++, c
= *p
++);
158 uint32_t z80_sram_cmp_string(uint32_t addr
, int length
, const char *text
)
161 const char *p
= text
;
165 if (z80_read(addr
) != c
)
174 const char * const qbfox
= "Zhe quick brown fox jumps over the lazy dog!";
175 const char * const qbcat
= "Zhe quick brown fox jumps over the lazy cat!";
179 uint8_t z80_get_byte(uint32_t adr
)
184 data
= z80_read(adr
),
191 /*--------------------------------------------------------------------------*/
193 static void do_10ms(void)
197 /*--------------------------------------------------------------------------*/
201 uint8_t sub_min
, sub_max
;
202 void (*func
)(uint8_t, int, uint8_t *);
205 uint32_t msg_to_addr(uint8_t *msg
)
212 addr
.as8
[0] = msg
[0];
213 addr
.as8
[1] = msg
[1];
214 addr
.as8
[2] = msg
[2];
220 void do_msg_ini_msgfifo(uint8_t subf
, int len
, uint8_t * msg
)
222 (void)subf
; (void)len
;
224 z80_init_msg_fifo(msg_to_addr(msg
));
228 void do_msg_ini_memfifo(uint8_t subf
, int len
, uint8_t * msg
)
232 z80_memfifo_init(subf
- 1, msg_to_addr(msg
));
236 void do_msg_char_out(uint8_t subf
, int len
, uint8_t * msg
)
245 const FLASH
struct msg_item z80_messages
[] =
248 0, 0, /* sub fct nr. from, to */
249 &do_msg_ini_msgfifo
},
252 &do_msg_ini_memfifo
},
256 { 0xff, /* end mark */
265 void do_message(int len
, uint8_t *msg
)
267 uint8_t fct
, sub_fct
;
275 while (fct
!= z80_messages
[i
].fct
)
278 if (z80_messages
[i
].fct
== 0xff) {
279 DBG_P(1, "do_message: Unknown function: %i, %i\n",
281 return; /* TODO: unknown message # */
284 while (fct
== z80_messages
[i
].fct
) {
285 if (sub_fct
>= z80_messages
[i
].sub_min
&& sub_fct
<= z80_messages
[i
].sub_max
)
290 if (z80_messages
[i
].fct
!= fct
) {
291 DBG_P(1, "do_message: Unknown sub function: %i, %i\n",
293 return; /* TODO: unknown message sub# */
296 (z80_messages
[i
].func
)(sub_fct
, len
, msg
);
301 DBG_P(1, "do_message: to few arguments (%i); this shouldn't happen!\n", len
);
307 #define CTRBUF_LEN 256
309 void check_msg_fifo(void)
312 static int_fast8_t state
;
313 static int msglen
,idx
;
314 static uint8_t buffer
[CTRBUF_LEN
];
316 while (state
!= 3 && (ch
= z80_msg_fifo_getc()) >= 0) {
318 case 0: /* wait for start of message */
325 case 1: /* get msg len */
326 if (ch
> 0 && ch
<= CTRBUF_LEN
) {
332 case 2: /* get message */
341 do_message(msglen
, buffer
);
347 void z80_load_mem(void)
350 uint32_t sec_base
= hdrom_start
;
352 DBG_P(1, "Loading z80 memory... \n");
354 while (sec
< hdrom_sections
) {
355 DBG_P(2, " From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n",
357 hdrom_address
[sec
]+hdrom_length_of_sections
[sec
] - 1,
358 hdrom_length_of_sections
[sec
]);
360 z80_write_block((unsigned char *) &hdrom
[sec_base
], /* src */
361 hdrom_address
[sec
], /* dest */
362 hdrom_length_of_sections
[sec
]); /* len */
363 sec_base
+=hdrom_length_of_sections
[sec
];
367 /*--------------------------------------------------------------------------*/
371 int_fast8_t state
= 0;
374 // setvbuf(stdout, NULL, _IONBF, 0);
376 // printf("\n(STM32F100+HD64180)_stamp Tester\n");
377 printf("\n(ATMEGA1281+HD64180)_stamp Tester\n");
379 DBG_P(1, "z80_setup_bus... ");
380 z80_setup_msg_fifo();
385 DBG_P(1, "Get bus... ");
389 DBG_P(1, "got it!\n");
391 z80_memset(0, 0x76, 0x80000);
392 //z80_sram_fill(0, 512 * 1024, 0x76, 0);
393 z80_sram_cmp(0, (uint32_t)512 * 1024, 0x76, 0);
397 DBG_P(1, "Bus released!\n");
400 DBG_P(1, "Reset released!\n");
405 if (Stat
& S_10MS_TO
) {
411 if ((ch
= serial_getc()) >= 0) {
416 /* TODO: Timer starten */
418 z80_memfifo_putc(fifo_out
, ch
);
429 z80_memfifo_putc(fifo_out
, ch
);