134 lines
2.8 KiB
C
134 lines
2.8 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <gigatron/sys.h>
|
|
#include <gigatron/console.h>
|
|
|
|
|
|
char has_expander;
|
|
char has_512krom;
|
|
char has_64k;
|
|
char has_128k;
|
|
char has_512k;
|
|
int memsize;
|
|
|
|
#define videoModeB (*(char*)0xa)
|
|
#define hSysArgs4 (*(char*)(0x8000u+(unsigned)&sysArgs4))
|
|
|
|
#define VERBOSE 1
|
|
|
|
void probe_ram()
|
|
{
|
|
has_expander = (ctrlBits_v5 != 0);
|
|
has_512krom = (videoModeB ^ 0xfc ==0xfc);
|
|
has_64k = (memSize == 0);
|
|
|
|
// double check expander (reset memory detection bug)
|
|
if (has_expander) {
|
|
SYS_ExpanderControl(0x3c); // set bank 0
|
|
hSysArgs4 = sysArgs4 ^ 0xaa;
|
|
if (hSysArgs4 != sysArgs4)
|
|
has_expander = 0;
|
|
hSysArgs4 = sysArgs4 ^ 0xaa;
|
|
SYS_ExpanderControl(0x7c); // back to default
|
|
}
|
|
|
|
// check for 128k
|
|
if (has_expander) {
|
|
SYS_ExpanderControl(0xbc); // set bank 2
|
|
hSysArgs4 = sysArgs4 ^ 0xaa;
|
|
if (hSysArgs4 != sysArgs4)
|
|
has_128k = 1;
|
|
hSysArgs4 = sysArgs4 ^ 0xaa;
|
|
SYS_ExpanderControl(0x7c); // back to default
|
|
}
|
|
// check for 512k
|
|
if (has_expander && has_512krom) { // only!
|
|
SYS_ExpanderControl(0xf8f0); // select bank 15
|
|
hSysArgs4 = 0xaa;
|
|
SYS_ExpanderControl(0x58f0); // select bank 5
|
|
hSysArgs4 = 0x55;
|
|
SYS_ExpanderControl(0xf8f0); // select bank 15
|
|
has_512k = (hSysArgs4 == 0xaa);
|
|
SYS_ExpanderControl(0x00f0); // back to default
|
|
}
|
|
|
|
if (has_512k)
|
|
memsize = 512;
|
|
else if (has_128k)
|
|
memsize = 128;
|
|
else if (has_64k)
|
|
memsize = 64;
|
|
else
|
|
memsize = memSize / 4;
|
|
}
|
|
|
|
|
|
#define blksize 64
|
|
|
|
void fill_upper(char seed, int bank)
|
|
{
|
|
register unsigned int i;
|
|
for (i=0x8000; i!=0; i += blksize) {
|
|
register char v = seed ^ (i >> 4) ^ bank;
|
|
memset((char*)i, v, blksize);
|
|
}
|
|
}
|
|
|
|
void test_upper(char seed, int bank)
|
|
{
|
|
register unsigned int i, j;
|
|
for (i=0x8000; i!=0; i += blksize) { // too slow
|
|
register char v = seed ^ (i >> 4) ^ bank;
|
|
register char *p = (char*)i;
|
|
for (j=blksize; j; j--,p++)
|
|
if (*p != v)
|
|
cprintf("\n\t[err %04x @bank%d] ", p, bank);
|
|
}
|
|
}
|
|
|
|
void set_bank(char bank)
|
|
{
|
|
if (has_512k && (bank == 0 || bank >= 4)) {
|
|
// map desired bank onto classic bank 0
|
|
SYS_ExpanderControl(0x00f0 | ((bank & 15) << 12));
|
|
bank = 0;
|
|
}
|
|
if (has_expander) {
|
|
// set classic bank
|
|
SYS_ExpanderControl(0x3c | ((bank & 3) << 6));
|
|
}
|
|
}
|
|
|
|
|
|
void test(int seed)
|
|
{
|
|
register int bank;
|
|
cprintf("- Not testing bank 0");
|
|
if (memsize > 32) {
|
|
cprintf("\n- Filling bank: ");
|
|
for (bank = 1; (bank << 5) < memsize; bank++) {
|
|
cprintf("\b\b\b\b%4d", bank);
|
|
set_bank(bank);
|
|
fill_upper(seed, bank);
|
|
}
|
|
cprintf("\n- Testing bank: ");
|
|
for (bank = 1; (bank << 5) < memsize; bank++) {
|
|
cprintf("\b\b\b\b%4d", bank);
|
|
set_bank(bank);
|
|
test_upper(seed, bank);
|
|
}
|
|
}
|
|
cprintf("\n", bank);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
probe_ram();
|
|
cprintf("Expansion : %s\n", (has_expander) ? "yes" : "no");
|
|
cprintf("Memory size: %dK\n\n", memsize);
|
|
test(0xaa);
|
|
test(0x55);
|
|
cprintf("Done\n");
|
|
return 0;
|
|
}
|