//------------------------------------------------------- void coStackTracer::getAddressInfo (coUintPtr _address, AddressInfo& _info) { _info = AddressInfo(); }
static int ConfigParseMAMEFile() { #define AddressInfo() \ int k = (flags >> 20) & 3; \ for (int i = 0; i < k+1; i++) { \ pCurrentCheat->pOption[n]->AddressInfo[nCurrentAddress].nCPU = 0; \ pCurrentCheat->pOption[n]->AddressInfo[nCurrentAddress].nAddress = nAddress + i; \ pCurrentCheat->pOption[n]->AddressInfo[nCurrentAddress].nValue = (nValue >> ((k*8)-(i*8))) & 0xff; \ nCurrentAddress++; \ } \ #define OptionName(a) \ if (pCurrentCheat->pOption[n] == NULL) { \ pCurrentCheat->pOption[n] = (CheatOption*)malloc(sizeof(CheatOption)); \ } \ memset(pCurrentCheat->pOption[n], 0, sizeof(CheatOption)); \ _tcsncpy (pCurrentCheat->pOption[n]->szOptionName, a, QUOTE_MAX * sizeof(TCHAR)); \ #define tmpcpy(a) \ _tcsncpy (tmp, szLine + c0[a] + 1, c0[a+1] - (c0[a]+1)); \ tmp[c0[a+1] - (c0[a]+1)] = '\0'; \ TCHAR szFileName[MAX_PATH] = _T(""); _stprintf(szFileName, _T("%scheat.dat"), szAppCheatsPath); FILE *fz = _tfopen(szFileName, _T("rt")); if (fz == NULL) { return 1; } TCHAR tmp[256]; TCHAR gName[64]; TCHAR szLine[1024]; int nLen; int n = 0; int menu = 0; int nFound = 0; int nCurrentAddress = 0; unsigned int flags = 0; unsigned int nAddress = 0; unsigned int nValue = 0; CheatInfo* pCurrentCheat = NULL; _stprintf(gName, _T(":%s:"), BurnDrvGetText(DRV_NAME)); while (1) { if (_fgetts(szLine, 1024, fz) == NULL) break; nLen = lstrlen (szLine); if (szLine[0] == ';') continue; if (_tcsncmp (szLine, gName, lstrlen(gName))) { if (nFound) break; else continue; } nFound = 1; int c0[16], c1 = 0; // find colons / break for (int i = 0; i < nLen; i++) if (szLine[i] == ':' || szLine[i] == '\n') c0[c1++] = i; tmpcpy(1); // control flags _stscanf (tmp, _T("%x"), &flags); tmpcpy(2); // cheat address _stscanf (tmp, _T("%x"), &nAddress); tmpcpy(3); // cheat value _stscanf (tmp, _T("%x"), &nValue); tmpcpy(5); // cheat name if (flags & 0x80007f00) continue; // skip various cheats // controls how many bytes we're going to patch (only allow single bytes for now) // if (flags & 0x00300000) continue; // nValue &= 0x000000ff; // only use a single byte if ( flags & 0x00008000 || (flags & 0x0001000 && !menu)) { if (nCurrentAddress < CHEAT_MAX_ADDRESS) { AddressInfo(); } continue; } if (~flags & 0x00010000) { n = 0; menu = 0; nCurrentAddress = 0; // Link new node into the list CheatInfo* pPreviousCheat = pCurrentCheat; pCurrentCheat = (CheatInfo*)malloc(sizeof(CheatInfo)); if (pCheatInfo == NULL) { pCheatInfo = pCurrentCheat; } memset(pCurrentCheat, 0, sizeof(CheatInfo)); pCurrentCheat->pPrevious = pPreviousCheat; if (pPreviousCheat) { pPreviousCheat->pNext = pCurrentCheat; } // Fill in defaults pCurrentCheat->nType = 0; // Default to cheat type 0 (apply each frame) pCurrentCheat->nStatus = -1; // Disable cheat pCurrentCheat->nDefault = 0; // Set default option _tcsncpy (pCurrentCheat->szCheatName, tmp, QUOTE_MAX); if (lstrlen(tmp) <= 0 || flags == 0x60000000) { n++; continue; } OptionName(_T("Disabled")); if (nAddress) { n++; OptionName(tmp); AddressInfo(); } else { menu = 1; } continue; } if ( flags & 0x00010000 && menu) { n++; nCurrentAddress = 0; OptionName(tmp); AddressInfo(); continue; } } fclose (fz); return 0; }