Waternoose, the XBOX 360 emulator
A very young XBOX 360 emulator that aims to boot games some day
Loading...
Searching...
No Matches
main.cpp
1#include <loader/xex.h>
2#include <memory/memory.h>
3#include <cpu/CPU.h>
4#include <cstdio>
5#include <fstream>
6#include <kernel/kernel.h>
7#include <kernel/modules/xboxkrnl.h>
8#include <vfs/VFS.h>
9
10CPUThread* mainThread;
11uint32_t mainThreadStackSize;
12
13void atexit_handler()
14{
15 mainThread->Dump();
16}
17
18int main(int argc, char** argv)
19{
20 VFS::SetRootDirectory(".waternoose");
21 VFS::MountDirectory("/SystemRoot", "systemroot");
22 VFS::MountDirectory("/Device/Flash", "flash");
23 VFS::MountDirectory("/Device/Harddisk0/Partition0", "drv0p0");
24 VFS::MountDirectory("/Device/Harddisk0/Partition1", "drv0p1");
25 VFS::MountDirectory("/Device/Cdrom0", "cdrom");
26
27 if (argc < 2)
28 {
29 printf("Usage: %s <xex name>\n", argv[0]);
30 return 0;
31 }
32
33 char* xam_buf;
34 size_t xam_size;
35
36 std::ifstream file(".waternoose/systemroot/xam.xex", std::ios::binary | std::ios::ate);
37 if (!file.is_open())
38 printf("Failed to open file %s\n", ".waternoose/systemroot/xam.xex");
39 xam_size = file.tellg();
40 file.seekg(0, std::ios::beg);
41 xam_buf = new char[xam_size];
42 file.read(xam_buf, xam_size);
43 file.close();
44
45 char* buf;
46 size_t size;
47
48 file.open(argv[1], std::ios::binary | std::ios::ate);
49 size = file.tellg();
50 file.seekg(0, std::ios::beg);
51 buf = new char[size];
52 file.read(buf, size);
53 file.close();
54
55 Memory::Initialize();
56
57 krnlModule.Initialize();
58
59 std::atexit(Memory::Dump);
60
61 xam = new XexLoader((uint8_t*)xam_buf, xam_size, ".waternoose/SystemRoot/xam.xex");
62 //XexLoader loader((uint8_t*)buf, size, argv[0]);
63
64#if 1
65 mainThreadStackSize = xam->GetStackSize();
66 mainThread = new CPUThread(xam->GetEntryPoint(), xam->GetStackSize(), *xam);
67 mainThread->SetArg(0, 0xBCBCBCBC);
68 mainThread->SetArg(1, 1);
69 mainThread->SetArg(2, 0);
70#else
71 mainThreadStackSize = loader.GetStackSize();
72 mainThread = new CPUThread(loader.GetEntryPoint(), loader.GetStackSize(), loader);
73#endif
74
75 std::atexit(atexit_handler);
76
77 while (1)
78 {
79 mainThread->Run();
80 }
81
82 delete mainThread;
83
84 return 0;
85}