#include #include #include #include "chameleon.h" static unsigned long __fastcall__ mmu_map(unsigned char slot, unsigned long addr) { unsigned long old; *(unsigned char*)MMUSLOT = slot; old = *(unsigned long*)MMUADDR0; *(unsigned long*)MMUADDR0 = addr; return old; } static unsigned char dotest1(unsigned long start, unsigned long len) { unsigned int pages = len / 0x1000; unsigned int i; gotoxy(0,3); cprintf("test 1 (00,55)"); gotoxy(20,3); cprintf("%08lx-%08lx", start, start+len-1); while(pages) { gotoxy(0,5); cprintf("testing: %08lx", start); __asm__("sei\nlda #$35\nsta $01"); mmu_map(MMUSLOT_C64RAME, start); memset(0xe000, 0x00, 0x1000); for (i = 0; i < 0x1000; ++i) { if((*(unsigned char*)(0xe000 + i)) != 0x00) { __asm__("lda #$36\nsta $01\ncli\n"); return 1; } } memset(0xe000, 0x55, 0x1000); for (i = 0; i < 0x1000; ++i) { if((*(unsigned char*)(0xe000 + i)) != 0x55) { __asm__("lda #$36\nsta $01\ncli\n"); return 1; } } __asm__("lda #$36\nsta $01\ncli\n"); start += 0x1000; --pages; } return 0; } static unsigned char dotest2(unsigned long start, unsigned long len) { unsigned int pages = len / 0x1000; unsigned int i; gotoxy(0,3); cprintf("test 2 (c5,ff)"); gotoxy(20,3); cprintf("%08lx-%08lx", start, start+len-1); while(pages) { gotoxy(0,5); cprintf("testing: %08lx", start); __asm__("sei\nlda #$35\nsta $01"); mmu_map(MMUSLOT_C64RAME, start); memset(0xe000, 0xc5, 0x1000); for (i = 0; i < 0x1000; ++i) { if((*(unsigned char*)(0xe000 + i)) != 0xc5) { __asm__("lda #$36\nsta $01\ncli\n"); return 1; } } memset(0xe000, 0xff, 0x1000); for (i = 0; i < 0x1000; ++i) { if((*(unsigned char*)(0xe000 + i)) != 0xff) { __asm__("lda #$36\nsta $01\ncli\n"); return 1; } } __asm__("lda #$36\nsta $01\ncli\n"); start += 0x1000; --pages; } return 0; } static unsigned char do_tests_for_range(unsigned long start, unsigned long len) { if(dotest1(start, len)) { return 1; } if(dotest2(start, len)) { return 1; } return 0; } unsigned int pass = 0; void main (void) { *(unsigned char*)CFGENA = CFGENA_ENABLE_CFG; /* enable config mode */ *(unsigned char*)CFGREG = CFGREG_MMU_ENABLE; /* enable MMU */ *(unsigned char*)CFGTUR = CFGTUR_ENABLE; /* enable turbo */ clrscr(); while(1) { gotoxy(0,0); cprintf("chameleon memtest v0.1 (pass %d)", pass); if(do_tests_for_range(RAMBASE_GEORAM, 0x00400000L)) break; /* 4MB */ if(do_tests_for_range(RAMBASE_REU, 0x01000000L)) break; /* 16 MB */ ++pass; } gotoxy(0,10); cprintf("FAIL"); while(1){}; }