]>
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 unsigned int to_counter
;
38 /****************************************************************/
47 //#define ADB_PORT GPIOE
49 #define MASK(n) ((1<<(n))-1)
50 #define SMASK(w,s) (MASK(w) << (s))
60 /*--------------------------------------------------------------------------*/
62 /*---------------------------------------------------------*/
63 /* 1000Hz timer interrupt generated by OC1A */
64 /*---------------------------------------------------------*/
66 ISR(TIMER1_COMPA_vect
)
68 static int_fast8_t tick_10ms
;
69 // static int_fast16_t count_ms;
79 /* Drive timer procedure of low level disk I/O module */
86 if (count_ms
== 1000) {
97 /*--------------------------------------------------------------------------*/
99 static uint32_t z80_sram_cmp(uint32_t addr
, uint32_t length
, uint8_t wval
, int inc
)
102 int_fast8_t errors
= 0;
104 DBG_P(1, "SRAM: Check 0x%.5lx byte... ", length
);
106 if ((rval
= z80_read(addr
)) != wval
) {
108 DBG_P(1, "\nSRAM: Address W R\n" \
109 " ------------------\n");
116 DBG_P(1, " 0x%.5lx 0x%.2x 0x%.2x\n", addr
, wval
, rval
);
126 static void z80_sram_fill(uint32_t addr
, uint32_t length
, uint8_t startval
, int inc
)
128 printf("SRAM: Write 0x%.5lx byte... ", length
);
130 z80_write(addr
, startval
);
139 void z80_sram_fill_string(uint32_t addr
, int length
, const char *text
)
142 const char *p
= text
;
145 z80_write(addr
++, c
= *p
++);
152 uint32_t z80_sram_cmp_string(uint32_t addr
, int length
, const char *text
)
155 const char *p
= text
;
159 if (z80_read(addr
) != c
)
168 const char * const qbfox
= "Zhe quick brown fox jumps over the lazy dog!";
169 const char * const qbcat
= "Zhe quick brown fox jumps over the lazy cat!";
173 uint8_t z80_get_byte(uint32_t adr
)
178 data
= z80_read(adr
),
185 /*--------------------------------------------------------------------------*/
187 static void do_10ms(void)
193 /*--------------------------------------------------------------------------*/
197 uint8_t sub_min
, sub_max
;
198 void (*func
)(uint8_t, int, uint8_t *);
201 uint32_t msg_to_addr(uint8_t *msg
)
208 addr
.as8
[0] = msg
[0];
209 addr
.as8
[1] = msg
[1];
210 addr
.as8
[2] = msg
[2];
216 void do_msg_ini_msgfifo(uint8_t subf
, int len
, uint8_t * msg
)
218 (void)subf
; (void)len
;
220 z80_init_msg_fifo(msg_to_addr(msg
));
224 void do_msg_ini_memfifo(uint8_t subf
, int len
, uint8_t * msg
)
228 z80_memfifo_init(subf
- 1, msg_to_addr(msg
));
232 void do_msg_char_out(uint8_t subf
, int len
, uint8_t * msg
)
241 const FLASH
struct msg_item z80_messages
[] =
244 0, 0, /* sub fct nr. from, to */
252 { 0xff, /* end mark */
261 void do_message(int len
, uint8_t *msg
)
263 uint8_t fct
, sub_fct
;
271 while (fct
!= z80_messages
[i
].fct
)
274 if (z80_messages
[i
].fct
== 0xff) {
275 DBG_P(1, "do_message: Unknown function: %i, %i\n",
277 return; /* TODO: unknown message # */
280 while (fct
== z80_messages
[i
].fct
) {
281 if (sub_fct
>= z80_messages
[i
].sub_min
&& sub_fct
<= z80_messages
[i
].sub_max
)
286 if (z80_messages
[i
].fct
!= fct
) {
287 DBG_P(1, "do_message: Unknown sub function: %i, %i\n",
289 return; /* TODO: unknown message sub# */
292 (z80_messages
[i
].func
)(sub_fct
, len
, msg
);
297 DBG_P(1, "do_message: to few arguments (%i); this shouldn't happen!\n", len
);
303 #define CTRBUF_LEN 256
305 void check_msg_fifo(void)
308 static int_fast8_t state
;
309 static int msglen
,idx
;
310 static uint8_t buffer
[CTRBUF_LEN
];
312 while (state
!= 3 && (ch
= z80_msg_fifo_getc()) >= 0) {
314 case 0: /* wait for start of message */
321 case 1: /* get msg len */
322 if (ch
> 0 && ch
<= CTRBUF_LEN
) {
328 case 2: /* get message */
337 do_message(msglen
, buffer
);
343 /*--------------------------------------------------------------------------*/
345 void dump_mem(const __flash
uint8_t *addr
, uint32_t len
)
347 DBG_P(1, "hdrom dump:");
349 DBG_P(1, "\n %.5x:", addr
);
350 for (unsigned i
= 0; i
<16; i
++)
351 DBG_P(1, " %.2x", *addr
++);
352 len
-= len
> 16 ? 16 : len
;
357 /*--------------------------------------------------------------------------*/
359 void z80_load_mem(void)
362 uint32_t sec_base
= hdrom_start
;
364 DBG_P(1, "Loading z80 memory... \n");
366 while (sec
< hdrom_sections
) {
367 DBG_P(2, " From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n",
369 hdrom_address
[sec
]+hdrom_length_of_sections
[sec
] - 1,
370 hdrom_length_of_sections
[sec
]);
372 z80_write_block((const __flash
unsigned char *) &hdrom
[sec_base
], /* src */
373 hdrom_address
[sec
], /* dest */
374 hdrom_length_of_sections
[sec
]); /* len */
375 sec_base
+=hdrom_length_of_sections
[sec
];
380 /*--------------------------------------------------------------------------*/
382 void z80_dump_mem(uint32_t addr
, uint32_t len
)
384 DBG_P(1, "Memory dump:");
386 DBG_P(1, "\n %.5lx:", addr
);
387 for (unsigned i
= 0; i
<16; i
++)
388 DBG_P(1, " %.2x", z80_read(addr
++));
389 len
-= len
> 16 ? 16 : len
;
394 /*--------------------------------------------------------------------------*/
407 /* Disable JTAG Interface regardless of the JTAGEN fuse setting. */
411 /* disable unused periphels */
412 PRR0
= _BV(PRTIM2
) | _BV(PRTIM0
) | _BV(PRADC
);
413 PRR1
= _BV(PRTIM5
) | _BV(PRTIM4
) | _BV(PRTIM3
) |
414 _BV(PRUSART3
) | _BV(PRUSART2
) | _BV(PRUSART1
);
416 /* disable analog comparator */
426 OCR1A
= F_CPU
/ 8 / 1000 - 1; // Timer1: 1000Hz interval (OC1A)
428 TIMSK1
= _BV(OCIE1A
); // Enable TC1.oca interrupt
431 const __flash
uint8_t iniprog
[] = {
433 0xED, 0x39, 0x36, // out0 (rcr),a ;disable DRAM refresh
434 0x3E, 0x30, // ld a,030h
435 0xED, 0x39, 0x32 //out0 (dcntl),a ;0 mem, max i/0 wait states
438 const __flash
uint8_t sertest
[] = {
440 0xED, 0x39, 0x36, // out0 (rcr),a ;disable DRAM refresh
441 0x3E, 0x30, // ld a,030h
442 0xED, 0x39, 0x32, // out0 (dcntl),a ;0 mem, max i/0 wait states
443 0x3E, 0x80, // ld a,M_MPBT ;no MP, PS=10, DR=16, SS=0
444 0xED, 0x39, 0x03, // out0 (cntlb1),a
445 0x3E, 0x64, // ld a,M_RE + M_TE + M_MOD2 ;
446 0xED, 0x39, 0x01, // out0 (cntla1),a
447 0x3E, 0x00, // ld a,0
448 0xED, 0x39, 0x05, // out0 (stat1),a ;Enable rx interrupts
449 0xED, 0x38, 0x05, //l0:in0 a,(stat1)
450 0xE6, 0x80, // and 80h
451 0x28, 0xF9, // jr z,l0
452 0xED, 0x00, 0x09, // in0 b,(rdr1)
453 0xED, 0x38, 0x05, //l1:in0 a,(stat1)
454 0xE6, 0x02, // and 02h
455 0x28, 0xF9, // jr z,l1
456 0xED, 0x01, 0x07, // out0 (tdr1),b
460 const __flash
uint8_t test1
[] = {
462 0xED, 0x39, 0x36, // out0 (rcr),a ;disable DRAM refresh
463 0x3E, 0x30, // ld a,030h
464 0xED, 0x39, 0x32, // out0 (dcntl),a ;0 mem, max i/0 wait states
465 0x21, 0x1E, 0x00, // ld hl,dmclrt ;load DMA registers
466 0x06, 0x08, // ld b,dmct_e-dmclrt
467 0x0E, 0x20, // ld c,sar0l
469 0x3E, 0xC3, // ld a,0c3h ;dst +1, src +1, burst
470 0xED, 0x39, 0x31, // out0 (dmode),a ;
471 0x3E, 0x62, // ld a,062h ;enable dma0,
472 0xED, 0x39, 0x30, //cl_1: out0 (dstat),a ;copy 64k
473 0x18, 0xFB, // jr cl_1 ;
474 0x00, 0x00, //dmclrt: dw 0 ;src (inc)
476 0x00, 0x00, // dw 0 ;dst (inc),
478 0x00, 0x00, // dw 0 ;count (64k)
484 int_fast8_t state
= 0;
492 printf_P(PSTR("\n(ATMEGA1281+HD64180)_stamp Tester\n"));
494 DBG_P(1, "z80_setup_bus... ");
495 z80_setup_msg_fifo();
499 DBG_P(1, "Get bus... ");
500 /* Now done via S_Z180_RUNNING
505 DBG_P(1, "got it!\n");
507 // z80_sram_fill(0, (uint32_t)512 * 1024, 0x00, 3);
508 // z80_sram_cmp(0, (uint32_t)512 * 1024, 0x00, 3);
509 // z80_dump_mem(0, 0x400);
511 z80_memset(0, 0x76, 0x80000);
512 // z80_memset(0, 0x00, 0x80000);
513 // z80_write_block(test1, 0, sizeof(test1));
515 // z80_dump_mem(0, 0x100);
517 // z80_sram_cmp(0, (uint32_t)512 * 1024, 0x76, 0);
520 // z80_write(0, 0x76);
521 // z80_dump_mem(0, 0x200);
524 /* Now done via S_Z180_RUNNING
528 DBG_P(1, "Bus released!\n");
530 DBG_P(1, "Reset released!\n");
536 if (Stat
& S_10MS_TO
) {
542 if ((ch
= serial_getc()) >= 0) {
547 /* TODO: Timer starten */
549 // z80_memfifo_putc(fifo_out, ch);
564 z80_dump_mem(0, 0x2d20);
570 z80_dump_mem(0x80000-0x4000, 0x800);
571 z80_dump_mem(0x80000-0x200, 0x200);
577 // z80_memfifo_putc(fifo_out, ch);