Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 20 additions & 34 deletions TakeMeToPROM/main.cpp
Original file line number Diff line number Diff line change
@@ -1,64 +1,50 @@
#include <xtl.h>
#include <conio.h>

extern "C" {
extern VOID WINAPI HalReturnToFirmware(DWORD);
extern VOID WINAPI HalWriteSMBusValue(BYTE, BYTE, BOOL, BYTE);
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);
Expand Down