Merged Marco's Pi2 changes

Used overclock config;-
kernel_address=0x1f00000

arm_freq=1000
core_freq=500
sdram_freq=450
over_voltage=2
force_turbo=1
boot_delay=1
temp_limit=80
This commit is contained in:
Stephen White 2020-01-25 13:44:00 +11:00
parent 899ed08033
commit 37154feb0d
3 changed files with 145 additions and 92 deletions

View file

@ -25,7 +25,7 @@ else ifeq ($(strip $(RASPPI)),1+)
ARCH ?= -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -DRPIBPLUS=1
CFLAGS += -DRPIBPLUS=1 -DRASPPI=1
else ifeq ($(strip $(RASPPI)),2)
ARCH ?= -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -marm -DRPI2=1
ARCH ?= -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -marm -DRPI2=1 -DEXPERIMENTALZERO=1
CFLAGS += -DRPI2=1
else ifeq ($(strip $(RASPPI)),3)
ARCH ?= -march=armv8-a+crc -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -marm -DRPI3=1

View file

@ -20,7 +20,9 @@
#define USE_HW_MAILBOX
// Indicates we want to make active use of multiple cores
#if defined(RPI3)
#define USE_MULTICORE
#endif
// Needs to match kernel_old setting in config.txt
//#define KERNEL_OLD

View file

@ -120,6 +120,9 @@ bool USBKeyboardDetected = false;
//bool resetWhileEmulating = false;
bool selectedViaIECCommands = false;
u16 pc;
#if defined(RPI2)
u32 clockCycles1MHz;
#endif
#if not defined(EXPERIMENTALZERO)
SpinLock core0RefreshingScreen;
@ -265,6 +268,14 @@ void InitialiseHardware()
RPI_PropertyInit();
RPI_PropertyAddTag(TAG_SET_CLOCK_RATE, ARM_CLK_ID, MaxClk);
RPI_PropertyProcess();
#if defined(RPI2)
// Enable clock cycle counter
asm volatile ("mcr p15,0,%0,c9,c12,0" :: "r" (0b0001));
asm volatile ("mcr p15,0,%0,c9,c12,1" :: "r" ((1 << 31)));
clockCycles1MHz = MaxClk / 1000000;
#endif
}
void InitialiseLCD()
@ -762,7 +773,7 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
int headSoundFreqCounter = 0;
// const int headSoundFreq = 833; // 1200Hz = 1/1200 * 10^6;
const int headSoundFreq = 1000000 / options.SoundOnGPIOFreq(); // 1200Hz = 1/1200 * 10^6;
unsigned char oldHeadDir;
unsigned char oldHeadDir = 0;
int resetCount = 0;
bool refreshOutsAfterCPUStep = true;
unsigned numberOfImages = diskCaddy.GetNumberOfImages();
@ -793,8 +804,6 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
IEC_Bus::LetSRQBePulledHigh();
ctBefore = read32(ARM_SYSTIMER_CLO);
//resetWhileEmulating = false;
selectedViaIECCommands = false;
@ -802,11 +811,37 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
// 0x42c02586 = maniac_mansion_s1[lucasfilm_1989](ntsc).g64
// 0x18651422 = aliens[electric_dreams_1987].g64
// 0x2a7f4b77 = zak_mckracken_boot[activision_1988](manual)(!).g64
if (hash == 0x42c02586 || hash == 0x18651422 || hash == 0x2a7f4b77)
// 0x97732c3e = maniac_mansion_s1[activision_1987](!).g64
if (hash == 0x42c02586 || hash == 0x18651422 || hash == 0x2a7f4b77 || hash == 0x97732c3e)
{
refreshOutsAfterCPUStep = false;
}
// Quickly get through 1541's self test code.
// This will make the emulated 1541 responsive to commands asap.
// During this time we don't need to set outputs.
while (cycleCount < FAST_BOOT_CYCLES)
{
IEC_Bus::ReadEmulationMode1541();
pi1541.m6502.SYNC();
pi1541.m6502.Step();
pi1541.Update();
cycleCount++;
}
// Self test code done. Begin realtime emulation.
#if defined(RPI2)
asm volatile ("mrc p15,0,%0,c9,c13,0" : "=r" (ctBefore));
#else
ctBefore = read32(ARM_SYSTIMER_CLO);
#endif
while (exitReason == EXIT_UNKNOWN)
{
if (refreshOutsAfterCPUStep)
@ -830,8 +865,6 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
pi1541.m6502.Step(); // If the CPU reads or writes to the VIA then clk and data can change
if (cycleCount >= FAST_BOOT_CYCLES) // cycleCount is used so we can quickly get through 1541's self test code. This will make the emulated 1541 responsive to commands asap. During this time we don't need to set outputs.
{
//To artificialy delay the outputs later into the phi2's cycle (do this on future Pis that will be faster and perhaps too fast)
//read32(ARM_SYSTIMER_CLO); //Each one of these is > 100ns
//read32(ARM_SYSTIMER_CLO);
@ -842,16 +875,18 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
IEC_Bus::RefreshOuts1541(); // Now output all outputs.
IEC_Bus::OutputLED = pi1541.drive.IsLEDOn();
#if defined(RPI3)
if (IEC_Bus::OutputLED ^ oldLED)
{
SetACTLed(IEC_Bus::OutputLED);
oldLED = IEC_Bus::OutputLED;
}
#endif
#if not defined(EXPERIMENTALZERO)
// Do head moving sound
unsigned char headDir = pi1541.drive.GetLastHeadDirection();
if (headDir ^ oldHeadDir) // Need to start a new sound?
if (headDir != oldHeadDir) // Need to start a new sound?
{
oldHeadDir = headDir;
if (options.SoundOnGPIO())
@ -867,7 +902,6 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
#endif
}
IEC_Bus::ReadGPIOUserInput(3);
@ -900,13 +934,12 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
exitReason = EXIT_AUTOLOAD;
}
if (cycleCount < FAST_BOOT_CYCLES) // cycleCount is used so we can quickly get through 1541's self test code. This will make the emulated 1541 responsive to commands asap.
{
cycleCount++;
ctAfter = read32(ARM_SYSTIMER_CLO);
}
else
#if defined(RPI2)
do // Sync to the 1MHz clock
{
asm volatile ("mrc p15,0,%0,c9,c13,0" : "=r" (ctAfter));
} while ((ctAfter - ctBefore) < clockCycles1MHz);
#else
do // Sync to the 1MHz clock
{
ctAfter = read32(ARM_SYSTIMER_CLO);
@ -918,13 +951,12 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
//DEBUG_LOG("!");
}
} while (ctAfter == ctBefore);
}
#endif
ctBefore = ctAfter;
if (!refreshOutsAfterCPUStep)
{
IEC_Bus::ReadEmulationMode1541();
if (cycleCount >= FAST_BOOT_CYCLES) // cycleCount is used so we can quickly get through 1541's self test code. This will make the emulated 1541 responsive to commands asap. During this time we don't need to set outputs.
IEC_Bus::RefreshOuts1541(); // Now output all outputs.
}
#if not defined(EXPERIMENTALZERO)
@ -947,11 +979,18 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
if (nextDisk)
{
pi1541.drive.Insert(diskCaddy.PrevDisk());
#if defined(EXPERIMENTALZERO)
diskCaddy.Update();
#endif
}
else if (prevDisk)
{
pi1541.drive.Insert(diskCaddy.NextDisk());
#if defined(EXPERIMENTALZERO)
diskCaddy.Update();
#endif
}
#if not defined(EXPERIMENTALZERO)
else if (inputMappings->directDiskSwapRequest != 0)
{
for (caddyIndex = 0; caddyIndex < numberOfImagesMax; ++caddyIndex)
@ -968,6 +1007,7 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser)
}
inputMappings->directDiskSwapRequest = 0;
}
#endif
}
}
return exitReason;
@ -986,7 +1026,7 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
int headSoundFreqCounter = 0;
// const int headSoundFreq = 833; // 1200Hz = 1/1200 * 10^6;
const int headSoundFreq = 1000000 / options.SoundOnGPIOFreq(); // 1200Hz = 1/1200 * 10^6;
unsigned int oldTrack;
unsigned int oldTrack = 0;
int resetCount = 0;
unsigned numberOfImages = diskCaddy.GetNumberOfImages();
@ -1014,7 +1054,11 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
IEC_Bus::port = pi1581.CIA.GetPortB();
pi1581.Reset(); // will call IEC_Bus::Reset();
#if defined(RPI2)
asm volatile ("mrc p15,0,%0,c9,c13,0" : "=r" (ctBefore));
#else
ctBefore = read32(ARM_SYSTIMER_CLO);
#endif
//resetWhileEmulating = false;
selectedViaIECCommands = false;
@ -1023,9 +1067,10 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
while (exitReason == EXIT_UNKNOWN)
{
IEC_Bus::ReadEmulationMode1581();
for (int cycle2MHz = 0; cycle2MHz < 2; ++cycle2MHz)
{
IEC_Bus::ReadEmulationMode1581();
if (pi1581.m6502.SYNC()) // About to start a new instruction.
{
pc = pi1581.m6502.GetPC();
@ -1047,14 +1092,14 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
IEC_Bus::RefreshOuts1581(); // Now output all outputs.
//if (cycleCount >= FAST_BOOT_CYCLES) // cycleCount is used so we can quickly get through 1541's self test code. This will make the emulated 1541 responsive to commands asap. During this time we don't need to set outputs.
{
IEC_Bus::OutputLED = pi1581.IsLEDOn();
#if defined(RPI3)
if (IEC_Bus::OutputLED ^ oldLED)
{
SetACTLed(IEC_Bus::OutputLED);
oldLED = IEC_Bus::OutputLED;
}
#endif
#if not defined(EXPERIMENTALZERO)
// Do head moving sound
@ -1073,7 +1118,6 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
}
}
#endif
}
IEC_Bus::ReadGPIOUserInput(3);
@ -1103,13 +1147,12 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
exitReason = EXIT_AUTOLOAD;
}
if (cycleCount < FAST_BOOT_CYCLES) // cycleCount is used so we can quickly get through 1541's self test code. This will make the emulated 1541 responsive to commands asap.
{
cycleCount++;
ctAfter = read32(ARM_SYSTIMER_CLO);
}
else
#if defined(RPI2)
do // Sync to the 1MHz clock
{
asm volatile ("mrc p15,0,%0,c9,c13,0" : "=r" (ctAfter));
} while ((ctAfter - ctBefore) < clockCycles1MHz);
#else
do // Sync to the 1MHz clock
{
ctAfter = read32(ARM_SYSTIMER_CLO);
@ -1121,7 +1164,7 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
//DEBUG_LOG("!");
}
} while (ctAfter == ctBefore);
}
#endif
ctBefore = ctAfter;
#if not defined(EXPERIMENTALZERO)
@ -1144,11 +1187,18 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
if (nextDisk)
{
pi1581.Insert(diskCaddy.PrevDisk());
#if defined(EXPERIMENTALZERO)
diskCaddy.Update();
#endif
}
else if (prevDisk)
{
pi1581.Insert(diskCaddy.NextDisk());
#if defined(EXPERIMENTALZERO)
diskCaddy.Update();
#endif
}
#if not defined(EXPERIMENTALZERO)
else if (inputMappings->directDiskSwapRequest != 0)
{
for (caddyIndex = 0; caddyIndex < numberOfImagesMax; ++caddyIndex)
@ -1165,6 +1215,7 @@ EXIT_TYPE Emulate1581(FileBrowser* fileBrowser)
}
inputMappings->directDiskSwapRequest = 0;
}
#endif
}
}