Fix invalid writes to storage area

Also starting to render hires stuff, but crashes on BltChars
This commit is contained in:
meepingsnesroms
2019-03-01 21:04:01 -08:00
parent 11c392f8b6
commit fa98647959
10 changed files with 120 additions and 58 deletions

View File

@@ -415,6 +415,8 @@ uint32_t sandboxCommand(uint32_t command, void* data){
//HwrCalcDynamicRAMSize_10083B0A:
//patchOsRom(0x5CC6, "203C000800004E75");//move.l 0x80000, d0; rts
//patchOsRom(0x83B0A, "203C000800004E75");//move.l 0x80000, d0; rts
patchOsRom(0x5CC6, "203C001000004E75");//move.l 0x100000, d0; rts
patchOsRom(0x83B0A, "203C001000004E75");//move.l 0x100000, d0; rts
//patch PrvChunkNew to only allocate in 4 byte intervals
//PrvChunkNew_10020CBC:

View File

@@ -109,6 +109,9 @@ uint32_t emulatorInit(buffer_t palmRomDump, buffer_t palmBootDump, uint32_t enab
emulatorSoftReset();
setRtc(0, 0, 0, 0);//RTCTIME and DAYR are not cleared by reset, clear them manually in case the frontend doesnt set the RTC
//debug patches
sandboxCommand(SANDBOX_PATCH_OS, NULL);
emulatorInitialized = true;
return EMU_ERROR_NONE;

View File

@@ -117,7 +117,7 @@ int32_t interruptAcknowledge(int32_t intLevel){
void setBusErrorTimeOut(uint32_t address, bool isWrite){
uint8_t scr = registerArrayRead8(SCR);
debugLog("Bus error timeout, PC:0x%08X\n", flx68000GetPc());
debugLog("Bus error timeout at:0x%08X, PC:0x%08X\n", address, flx68000GetPc());
registerArrayWrite8(SCR, scr | 0x80);
if(scr & 0x10)
flx68000BusError(address, isWrite);
@@ -125,7 +125,7 @@ void setBusErrorTimeOut(uint32_t address, bool isWrite){
void setPrivilegeViolation(uint32_t address, bool isWrite){
uint8_t scr = registerArrayRead8(SCR);
debugLog("Privilege violation, PC:0x%08X\n", flx68000GetPc());
debugLog("Privilege violation at:0x%08X, PC:0x%08X\n", address, flx68000GetPc());
registerArrayWrite8(SCR, scr | 0x20);
if(scr & 0x10)
flx68000BusError(address, isWrite);
@@ -133,7 +133,7 @@ void setPrivilegeViolation(uint32_t address, bool isWrite){
void setWriteProtectViolation(uint32_t address){
uint8_t scr = registerArrayRead8(SCR);
debugLog("Write protect violation, PC:0x%08X\n", flx68000GetPc());
debugLog("Write protect violation at:0x%08X, PC:0x%08X\n", address, flx68000GetPc());
registerArrayWrite8(SCR, scr | 0x40);
if(scr & 0x10)
flx68000BusError(address, true);

View File

@@ -207,6 +207,8 @@ static void setCsd(uint16_t value){
else
chips[CHIP_DX_RAM].unprotectedSize = chips[CHIP_DX_RAM].lineSize / (1 << 7 - (value >> 11 & 0x0003));
//debugLog("RAM unprotected size:0x%08X, bits:0x%02X\n", chips[CHIP_DX_RAM].unprotectedSize, ((value >> 11 & 0x0003) | (csControl1 & 0x4000 && csControl1 & 0x0010) * 0x0004));
registerArrayWrite16(CSD, value);
}

View File

@@ -4,31 +4,61 @@
#include "debug.h"
#include "globals.h"
#include "traps.h"
#include "palmOsPriv.h"
#include "palmGlobalDefines.h"
#include "specs/emuFeatureRegisterSpec.h"
typedef struct{
BitmapTypeV3 bitmap;
uint16_t* data;
}BitmapTypeV3Indirect;
static Boolean setTungstenWDriverFramebuffer(uint16_t width, uint16_t height){
if(getGlobalVar(TUNGSTEN_W_DRIVERS_INSTALLED)){
BitmapTypeV3* newBitmap;
BitmapTypeV3Indirect* newBitmap;
uint16_t* newBitmapData;
WindowType* driverWindow;
Err error;
driverWindow = WinGetWindowPointer(WinGetDisplayWindow());
newBitmap = BmpCreateBitmapV3(BmpCreate(width, height, 16, NULL, &error), kDensityDouble, NULL/*bitsP*/, NULL/*colorTableP*/);
if(error != errNone)
newBitmap = MemChunkNew(0, sizeof(BitmapTypeV3Indirect), memNewChunkFlagNonMovable | memNewChunkFlagAllowLarge);
if(!newBitmap){
debugLog("Couldnt create new framebuffer bitmap struct!\n");
return false;
}
MemSet(newBitmap, sizeof(BitmapTypeV3Indirect), 0x00);
newBitmap->bitmap.width = width;
newBitmap->bitmap.height = height;
newBitmap->bitmap.rowBytes = width * sizeof(uint16_t);
newBitmap->bitmap.flags.indirect = true;
newBitmap->bitmap.flags.forScreen = true;
newBitmap->bitmap.flags.directColor = true;
newBitmap->bitmap.size = sizeof(BitmapTypeV3);
newBitmap->bitmap.pixelFormat = pixelFormat565;
newBitmap->bitmap.compressionType = BitmapCompressionTypeNone;
newBitmap->bitmap.density = kDensityDouble;
newBitmap->data = MemChunkNew(0, width * height * sizeof(uint16_t), memNewChunkFlagNonMovable | memNewChunkFlagAllowLarge);
if(!newBitmap->data){
debugLog("Couldnt create new framebuffer:%d\n");
return false;
}
/*white out framebuffer*/
MemSet(newBitmap->data, width * height * sizeof(uint16_t), 0xFF);
/*clean up old framebuffer if its not the original one and set new one*/
driverWindow->bitmapP->flags.forScreen = false;
BmpDelete(driverWindow->bitmapP);
newBitmap->flags.forScreen = true;
driverWindow->bitmapP = newBitmap;
driverWindow->bitmapP = &newBitmap->bitmap;
/*tell the emu where the framebuffer is*/
writeArbitraryMemory32(EMU_REG_ADDR(EMU_SRC), (uint32_t)BmpGetBits(newBitmap));
writeArbitraryMemory32(EMU_REG_ADDR(EMU_SRC), (uint32_t)newBitmap->data);
writeArbitraryMemory32(EMU_REG_ADDR(EMU_VALUE), (uint32_t)width << 16 | height);
writeArbitraryMemory32(EMU_REG_ADDR(EMU_CMD), CMD_LCD_SET_FB);

View File

@@ -21,7 +21,8 @@ static void setConfigDefaults(uint32_t* configFile){
UInt32 PilotMain(UInt16 cmd, MemPtr cmdBPB, UInt16 launchFlags){
DmOpenRef configDb;
MemHandle configHandle;
uint32_t* configFile;
uint32_t* dmConfigFile;
uint32_t configFile[CONFIG_FILE_ENTRIES];
Err error;
configDb = DmOpenDatabaseByTypeCreator('EMUC', 'GuiC', dmModeReadWrite);
@@ -29,29 +30,27 @@ UInt32 PilotMain(UInt16 cmd, MemPtr cmdBPB, UInt16 launchFlags){
/*create db and set defaults if config doesnt exist*/
if(!configDb){
error = DmCreateDatabase(0/*cardNo*/, "Emu Config", 'GuiC', 'EMUC', true);
debugLog("Tried to create db, err:%d\n", error);
if(error != errNone)
debugLog("Tried to create db, err:%d\n", error);
configDb = DmOpenDatabaseByTypeCreator('EMUC', 'GuiC', dmModeReadWrite);
if(!configDb)
debugLog("Cant find created db!\n");
configHandle = DmNewResource(configDb, 'CONF', 0, CONFIG_FILE_ENTRIES * sizeof(uint32_t));
if(!configHandle)
debugLog("Cant open db resource!\n");
configFile = MemHandleLock(configHandle);
dmConfigFile = MemHandleLock(configHandle);
setConfigDefaults(configFile);
}
else{
configHandle = DmGetResource('CONF', 0);
if(!configHandle)
debugLog("Cant open db resource!\n");
configFile = MemHandleLock(configHandle);
dmConfigFile = MemHandleLock(configHandle);
MemMove(configFile, dmConfigFile, CONFIG_FILE_ENTRIES * sizeof(uint32_t));
}
if(cmd == sysAppLaunchCmdNormalLaunch)
@@ -59,6 +58,11 @@ UInt32 PilotMain(UInt16 cmd, MemPtr cmdBPB, UInt16 launchFlags){
else if(cmd == sysAppLaunchCmdSystemReset)
initBoot(configFile);
/*must use DmWrite to write to databases or a write protect violation may trigger*/
error = DmWrite(dmConfigFile, 0, configFile, CONFIG_FILE_ENTRIES * sizeof(uint32_t));
if(error != errNone)
debugLog("Coludnt write config file, err:%d\n", error);
MemHandleUnlock(configHandle);
DmReleaseResource(configHandle);
DmCloseDatabase(configDb);

View File

@@ -0,0 +1,11 @@
#ifndef PALM_OS_PRIV_H
#define PALM_OS_PRIV_H
#define memNewChunkFlagAllowLarge 0x1000
#define FIXED_ADDRESS_VAR(a, t) (*((volatile t*)a))
/*these are all the Palm OS varibles the SDK dosent expose that I have found while decompiling Palm OS*/
#define ScrStatePtr FIXED_ADDRESS_VAR(0x00000164, void*)
#endif

View File

@@ -4,6 +4,7 @@
#include "debug.h"
#include "armv5.h"
#include "globals.h"
#include "palmOsPriv.h"
#include "palmGlobalDefines.h"
@@ -92,126 +93,136 @@ void emuErrDisplayFileLineMsg(const Char* const filename, UInt16 lineNo, const C
debugLog("Error at:%s, Line:%d, Msg:%s\n", filename, lineNo, msg);
}
Err emuHwrDisplayAttributes(Boolean set, UInt8 attribute, void* returnPtr){
Err emuHwrDisplayAttributes(Boolean set, UInt8 attribute, void* dataPtr){
/*this function is exempt from formatting standards, it is meant as an exact C reconstrution of the Tungsten W HwrDisplayAttributes patched to work on an m515*/
static const char lcdControllerName[] = "MQ11xx LCD Controller";
Err error = errNone;
/*dispErrorClass | 0x01 = Cant Set???, also returned for null pointers*/
/*dispErrorClass | 0x04 = Attribute Doesnt Exist??*/
switch(attribute){
case 0:
/*display controler ID, MediaQ GPU*/
(UInt32*)returnPtr = '12MQ';
(UInt32*)dataPtr = '12MQ';
break;
case 1:
/*???*/
(UInt16*)returnPtr = 1;
(UInt16*)dataPtr = 1;
break;
case 2:
/*???*/
(UInt16*)returnPtr = 1;
(UInt16*)dataPtr = 1;
break;
case 3:
/*???*/
(UInt16*)returnPtr = 0x808B;
(UInt16*)dataPtr = 0x808B;
break;
case 4:
/*read some random RAM value and fail if 0*/
if(readArbitraryMemory32(0x164))
(UInt16*)returnPtr = 0x10;
if(ScrStatePtr)
(UInt16*)dataPtr = 0x10;
else
error = dispErrorClass | 0x04;
break;
case 5:
/*???*/
(UInt16*)returnPtr = 8;
(UInt16*)dataPtr = 8;
break;
case 6:
/*???*/
(UInt16*)returnPtr = 0x10;
(UInt16*)dataPtr = 0x10;
break;
case 7:
/*display size something, PrvDisplaySize(Uint8 unknown, void* returnPtr)*/
/*TODO*/
/*display size something, width???, PrvDisplaySize(Boolean set, void* dataPtr)*/
/*UNTESTED*/
(UInt16*)dataPtr = 320;
break;
case 8:
/*display size something, PrvDisplaySize(Uint8 unknown, void* returnPtr)*/
/*TODO*/
/*display size something, height???, PrvDisplaySize(Boolean set, void* dataPtr)*/
/*UNTESTED*/
(UInt16*)dataPtr = 320;
break;
case 9:
/*display chip address space start address*/
(UInt32*)returnPtr = 0x1F000000;
/*display chip framebuffer start address*/
(UInt32*)dataPtr = 0x1F000000;
break;
case 10:
/*display chip address space size*/
(UInt32*)returnPtr = 0x3C000;
/*display chip framebuffer size*/
(UInt32*)dataPtr = 0x3C000;
break;
case 11:
/*???*/
(UInt16*)returnPtr = 1;
(UInt16*)dataPtr = 1;
break;
case 12:
/*full name of display controller*/
StrCopy((char*)returnPtr, lcdControllerName);
StrCopy((char*)dataPtr, lcdControllerName);
break;
case 13:
/*display size base address*/
/*TODO*/
/*display base address*/
/*UNTESTED*/
(UInt32*)dataPtr = 0x1F000000;
break;
case 14:
/*display size depth*/
/*TODO*/
/*display depth*/
/*UNTESTED*/
(UInt16*)dataPtr = 16;
break;
case 15:
/*read some random RAM value and write to returnPtr*/
/*read some random RAM value and write to dataPtr*/
if(readArbitraryMemory8(0x36C))
(UInt16*)returnPtr = 0x140;
(UInt16*)dataPtr = 0x140;
else
(UInt16*)returnPtr = 0xA0;
(UInt16*)dataPtr = 0xA0;
break;
case 16:
/*read some random RAM value and write to returnPtr*/
/*read some random RAM value and write to dataPtr*/
if(readArbitraryMemory8(0x36C))
(UInt16*)returnPtr = 0x140;
(UInt16*)dataPtr = 0x140;
else
(UInt16*)returnPtr = 0xA0;
(UInt16*)dataPtr = 0xA0;
break;
case 17:
/*display row bytes*/
/*TODO*/
/*UNTESTED*/
(UInt16*)dataPtr = 320 * sizeof(uint16_t);
break;
case 18:
/*display backlight*/
/*TODO*/
/*UNTESTED*/
(UInt8*)dataPtr = 0x01;
break;
case 19:
/*display contrast*/
/*TODO*/
/*UNTESTED*/
(UInt8*)dataPtr = 0x01;
break;
/*case 20: has no handler*/
case 21:
/*display debug indicator*/
/*TODO*/
/*TODO, shouldnt be needed*/
break;
case 22:
@@ -219,7 +230,7 @@ Err emuHwrDisplayAttributes(Boolean set, UInt8 attribute, void* returnPtr){
if(set)
error = dispErrorClass | 0x01;
else
(UInt32*)returnPtr = 0x1F03C000;
(UInt32*)dataPtr = 0x1F03C000;
break;
/*case 23: has no handler*/
@@ -229,27 +240,25 @@ Err emuHwrDisplayAttributes(Boolean set, UInt8 attribute, void* returnPtr){
case 27:
/*???*/
(UInt16*)returnPtr = 0x90;
(UInt16*)dataPtr = 0x90;
break;
case 28:
/*???*/
(UInt16*)returnPtr = 0x40;
(UInt16*)dataPtr = 0x40;
break;
case 29:
/*???*/
(UInt16*)returnPtr = 0x20;
(UInt16*)dataPtr = 0x20;
break;
case 30:
/*???*/
(UInt8*)returnPtr = 1;
(UInt8*)dataPtr = 1;
break;
default:
/*attribute > 30*/
/*dispErrorClass | 0x04 = Invalid Param???*/
debugLog("Invalid display attribute requested:%d\n", attribute);
error = dispErrorClass | 0x04;
break;

View File

@@ -6,6 +6,6 @@
UInt32 emuPceNativeCall(NativeFuncType *nativeFuncP, void *userDataP);
UInt32 emuKeyCurrentState(void);
void emuErrDisplayFileLineMsg(const Char* const filename, UInt16 lineNo, const Char* const msg);
Err emuHwrDisplayAttributes(Boolean set, UInt8 attribute, void* returnPtr);
Err emuHwrDisplayAttributes(Boolean set, UInt8 attribute, void* dataPtr);
#endif

View File

@@ -6,5 +6,6 @@ ARM support
OS 5 audio API
Custom FB mode
GUI
Setting window color like OS 5
Fixed: