diff --git a/tests/berrscan/Makefile b/tests/berrscan/Makefile new file mode 100644 index 0000000..c51818e --- /dev/null +++ b/tests/berrscan/Makefile @@ -0,0 +1,16 @@ +PROJECT=berrscan + +BASE=m68k-atari-mint- +GCC=${BASE}gcc + +berrscan.prg: berrscan.c + $(GCC) -Os -s -o $@ $< + +sttest: berrscan.prg + hatari -d . berrscan.prg + +install: berrscan.prg + mcopy -o -i ../test.st berrscan.prg ::/ + +get: + mcopy -o -i ../test.st ::/berrscan.log ./berrscan.log diff --git a/tests/berrscan/berrscan.c b/tests/berrscan/berrscan.c new file mode 100644 index 0000000..9d5cfdc --- /dev/null +++ b/tests/berrscan/berrscan.c @@ -0,0 +1,92 @@ +#include +#include + +// http://mikro.naprvyraz.sk/docs/Memory%20Maps/HARDWARE.TXT + +// read byte test. Returns 1 on bus error +char test_rb(void *adr); + +asm ( + "_test_rb: move.l 4(sp),a0\n\t" // address + " movem.l d1-d2,-(sp)\n\t" // save registers + " move.l sp, d1\n\t" // save stack pointer + " st.b d0\n\t" + " move.l 8,d2\n\t" + " move.l #berr,8\n\t" + " move.b (a0),d3\n\t" + " clr.b d0\n\t" + "berr: move.l d2,8\n\t" + " move.l d1,sp\n\t" + " movem.l (sp)+,d1-d2\n\t" + " rts\n\t" + ); + +// read word test. Returns 1 on bus error +char test_rw(void *adr); + +asm ( + "_test_rw: move.l 4(sp),a0\n\t" // address + " movem.l d1-d2,-(sp)\n\t" // save registers + " move.l sp, d1\n\t" // save stack pointer + " st.b d0\n\t" + " move.l 8,d2\n\t" + " move.l #berr2,8\n\t" + " move.w (a0),d3\n\t" + " clr.b d0\n\t" + "berr2: move.l d2,8\n\t" + " move.l d1,sp\n\t" + " movem.l (sp)+,d1-d2\n\t" + " rts\n\t" + ); + +char *acc[8] = { // WOE + "any", // 000 + "odd byte and word", // 001 + "even byte and word", // 010 + "word", // 011 + "byte", // 100 + "odd byte", // 101 + "even byte", // 110 + "no" // 111 +}; + +int main(void) { + // do various sanity tests + long usp = Super(0l); + + FILE *file; + file = fopen("berrscan.log", "w+"); + if(!file) { + printf("unable to open log file\n"); + getchar(); + return 1; + } + + fprintf(file, "Access ranges:\n"); + // check bus error ranges + unsigned long start = 0xFF8000; + unsigned long i, j = start; + unsigned char last_state = 0; + for(i=start;i<0x1000000;i+=2) { + unsigned char berr_e = test_rb((void*)i); + unsigned char berr_o = test_rb((void*)(i+1)); + unsigned char berr_w = test_rw((void*)i); + unsigned char state = + (berr_e?0x01:0x00)|(berr_o?0x02:0x00)|(berr_w?0x04:0x00); + + if((state != last_state) && (i!=start)) { + fprintf(file, "from %lx to %lx: %s\n", j, i-1, acc[last_state]); + j = i; + } + last_state = state; + } + + if(j != i) + fprintf(file, "from %lx to %lx: %s\n", j, i-1, acc[last_state]); + + fclose(file); + + Super(usp); + + return 0; +} diff --git a/tests/berrscan/berrscan.prg b/tests/berrscan/berrscan.prg new file mode 100755 index 0000000..880399f Binary files /dev/null and b/tests/berrscan/berrscan.prg differ