// PSXExe.cpp: implementation of the CPSXExe class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "PSXExe.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CPSXExe::CPSXExe() { m_Address=0; m_Length=0; } CPSXExe::~CPSXExe() { } bool CPSXExe::SendThread() { DWORD fileStatus; bool bSuccess; // // we send the exe file skipping the first 2048 bytes // fileStatus=::SetFilePointer(m_hFile, EXE_HEAD_BYTES, NULL, FILE_BEGIN); if (fileStatus==0xffffffff) { // // failed // return false; } // // enter binary mode // bSuccess=CTransferrableFile::StartBinaryWrite(*m_pPort); if (!bSuccess) { return false; } // // transfer body of file // bSuccess=CTransferrableFile::TransferDataFromFile(*m_pPort, m_Address, m_Length); if (!bSuccess) { return false; } // // leave binary mode // bSuccess=CTransferrableFile::EndBinaryWrite(*m_pPort); if (!bSuccess) { return false; } bSuccess=CProgramFile::SetupRegisters(); return bSuccess; } bool CPSXExe::OpenForReading(TCHAR* filename) { XF_HDR header; BOOL bReadSuccess; DWORD bytesRead; m_hFile=::CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (m_hFile==INVALID_HANDLE_VALUE) { // // error opening file // return false; } // // read the header // bReadSuccess=::ReadFile(m_hFile, &header, sizeof(XF_HDR), &bytesRead, NULL); if (!bReadSuccess) { return false; } // // set address and size // m_Address=header.exec.t_addr; m_Length=header.exec.t_size; // // set values of GP, entry point and stack // m_GPValue=header.exec.gp0; m_PCValue=header.exec.pc0; if ((header.exec.s_addr + header.exec.s_size)>0) { m_SPValue=header.exec.s_addr + header.exec.s_size; } else { m_SPValue=0x801ffff0; } return true; }