gigatron/rom/Compilers/glcc/stuff/tst/TSTmem.c
2025-01-28 19:17:01 +03:00

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;
}