📄 peripheral_test_memory.c
字号:
#include "peripheral_test.h"
#include "excalibur.h"
// Prototypes
void DoMemoryTest(void);
void DoRapidPeripheralWrites(void);
void DoRapidRAMWrites(void);
int test(char *memLow, char *memHigh, int start);
// Meat
void DoMemoryMenu(void)
{
char c;
menu:
MenuBegin("MEMORY MENU");
MenuEntry('a',"MemoryTest");
MenuEntry('b',"Rapid RAM Writes");
MenuEntry('c',"Rapid Peripheral Writes");
c = MenuEnd('a','c');
switch(c)
{
MenuCase('a',DoMemoryTest);
MenuCase('b',DoRapidRAMWrites);
MenuCase('c',DoRapidPeripheralWrites);
}
if(c != 'q')
goto menu;
}
void DoRapidRAMWrites(void)
{
long i;
printf("About to perform 10 million \"ST [%%g0],%%g1\" instructions...\n\n");
for(i = 0; i < 10000; i++)
Do1000STs();
#if 0
{
asm("
PFX %hi(0x60000)
MOVI %g4,%lo(0x60000)
PFX %xhi(0x60000)
MOVI %g4,%xlo(0x60000)
LD %g5,[%g4] ; ensure we're not actually changing memory
;
; Use macros to include 100 ST's.
;
.macro ST10 r1,r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
ST [%r1],%r2
.endm
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
ST10 %g4,%g5
");
} // for 10000
#endif
printf("Did 10,000,000 ST's.\n");
}
#define wrap 1025 // doesn't divide into power of 2, so address lines get flexed.
void DoMemoryTest(void)
{
char *memLow;
char *memHigh;
int start;
int result;
memLow = (char *)(sbrk(0) + 1000);
memHigh = ((char *)&start) - 1000;
printf("-----------------------------\n");
printf("Testing memory 0x%x - 0x%x\n",memLow,memHigh);
printf("-----------------------------\n");
for(start = 0; start < 256; start++)
{
if(rGetChar() == 27)
{
printf("Memory test aborted.\n");
return;
}
nr_pio_showhex(start);
printf("test %3d of 256... ",start);
result = test(memLow,memHigh,start);
printf("%s\n",result ? "passed" : "failed");
}
printf("Memory test done.\n");
}
int test(char *memLow, char *memHigh, int start)
{
int x;
char *memP;
// fill
x = start;
for(memP = memLow; memP < memHigh; memP++)
{
*memP = (char) x;
x ++;
if(x >= wrap)
x = 0;
}
// test
x = start;
for(memP = memLow; memP < memHigh; memP++)
{
if(*memP != (char) x)
return 0; // fail
x ++;
if(x >= wrap)
x = 0;
}
// pass
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -