diff --git a/TakeMeToPROM/main.cpp b/TakeMeToPROM/main.cpp index 54d178e..9bd0a5a 100644 --- a/TakeMeToPROM/main.cpp +++ b/TakeMeToPROM/main.cpp @@ -1,4 +1,5 @@ #include +#include extern "C" { extern VOID WINAPI HalReturnToFirmware(DWORD); @@ -6,59 +7,44 @@ extern "C" { XBOXAPI LONG WINAPI HalReadSMBusValue(UCHAR, UCHAR, UCHAR, ULONG*); } -unsigned char inputByte(unsigned short port) -{ - unsigned char value; - __asm { - mov dx, port - in al, dx - mov value, al - } - return value; -} - -void outputByte(unsigned short port, unsigned char value) -{ - __asm { - mov dx, port - mov al, value - out dx, al - } -} - void __cdecl main() { ULONG scratch; HalReadSMBusValue(0x20, 0x1b, FALSE, &scratch); HalWriteSMBusValue(0x20, 0x1b, FALSE, (UCHAR)(scratch & ~0x04)); - if (inputByte(0xf500) == 0xE1) // Xecuter + unsigned char aladdinOrSmartXX = _inp(0xf701); + bool isAladdin1mb = (aladdinOrSmartXX & 0xf0) == 0x10; + bool isAladdin2mb = aladdinOrSmartXX == 0x69; + bool isSmartXX = (isAladdin1mb | isAladdin2mb) == false && aladdinOrSmartXX != 0xff; + + if (isAladdin1mb) // Aladdin 1mb { - outputByte(0xf502, 0x80); + _outp(0xf70f, 0x87); } - else if (inputByte(0xdead) == 0xaf) // Modxo + else if (isAladdin2mb) // Aladdin 2mb { - outputByte(0xdeaa, 0x01); + _outp(0xf70f, 0x14); } - else if (inputByte(0xf701) == 0x11 || inputByte(0xf701) == 0x15) // Aladdin 1mb + else if (isSmartXX) // Smartxx { - outputByte(0xf70f, 0x87); + _outp(0xF703, 0x00); } - else if (inputByte(0xf701) == 0x69) // Aladdin 2mb + else if (_inp(0xf500) == 0xE1) // Xecuter { - outputByte(0xf70f, 0x14); + _outp(0xf502, 0x80); } - else if (inputByte(0xf701) != 0xff) // Assume Smartxx + else if (_inp(0xdead) == 0xaf) // Modxo { - outputByte(0xF703, 0x00); + _outp(0xdeaa, 0x01); } - else if (inputByte(0x1912) != 0xff) // Xchanger + else if (_inp(0x1912) != 0xff) // Xchanger { - outputByte(0x1912, 0x00); + _outp(0x1912, 0x00); } - else if (inputByte(0xee) == 0x55) // Xenium + else if (_inp(0xee) == 0x55) // Xenium { - outputByte(0x00ef, 1); + _outp(0x00ef, 1); } HalReturnToFirmware(0x01);