Skip to content

Commit b5b45b2

Browse files
committed
wip
1 parent 1c034c9 commit b5b45b2

File tree

9 files changed

+194
-7
lines changed

9 files changed

+194
-7
lines changed

game/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ set(RUNTIME_SOURCE
254254
overlord/jak3/start.cpp
255255
overlord/jak3/iso_api.cpp
256256
overlord/jak3/iso_fake.cpp
257+
overlord/jak3/iso_queue.cpp
257258
overlord/jak3/iso.cpp
258259
overlord/jak3/overlord.cpp
259260
overlord/jak3/pagemanager.cpp

game/overlord/jak3/iso.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
#include "common/log/log.h"
66

77
#include "game/common/dgo_rpc_types.h"
8+
#include "game/overlord/common/isocommon.h"
89
#include "game/overlord/jak3/basefilesystem.h"
910
#include "game/overlord/jak3/iso_api.h"
1011
#include "game/overlord/jak3/iso_fake.h"
12+
#include "game/overlord/jak3/iso_queue.h"
1113
#include "game/overlord/jak3/stream.h"
1214

1315
namespace jak3 {
@@ -20,6 +22,8 @@ int g_nSTRThreadID;
2022
int g_nPlayThreadID;
2123
int g_nISOMbx;
2224
VagDirJak3 g_VagDir;
25+
char g_szCurrentMusicName[16];
26+
char g_szTargetMusicName[16];
2327

2428
static int s_nISOInitFlag;
2529
static ISO_LoadDGO s_LoadDGO;
@@ -30,6 +34,7 @@ static int s_nDGOMbx;
3034

3135
static u32 DGOThread();
3236
u32 ISOThread();
37+
int NullCallback(ISO_Msg* msg);
3338

3439
/* COMPLETE */
3540
void InitDriver() {
@@ -135,9 +140,35 @@ const ISOFileDef* FindIsoFile(const char* name) {
135140
}
136141

137142
u32 ISOThread() {
143+
ISO_Msg* msg;
144+
145+
g_szCurrentMusicName[0] = '\0';
146+
g_szTargetMusicName[0] = '\0';
147+
InitBuffers();
148+
// InitVagCmds();
149+
138150
InitDriver();
139151

140152
while (true) {
153+
int res = PollMbx((MsgPacket**)&msg, g_nISOMbx);
154+
if (res == KE_OK) {
155+
msg->SetActive(false);
156+
msg->SetUnk1(false);
157+
msg->SetUnk2(false);
158+
msg->file = nullptr;
159+
msg->callback = NullCallback;
160+
161+
switch (msg->msg_kind) {
162+
case LOAD_TO_EE_CMD_ID:
163+
case LOAD_TO_IOP_CMD_ID:
164+
case LOAD_TO_EE_OFFSET_CMD_ID:
165+
break;
166+
default:
167+
lg::error("unhandled iso msg type {:x}", msg->msg_kind);
168+
break;
169+
}
170+
}
171+
141172
DelayThread(4000);
142173
}
143174

@@ -208,4 +239,37 @@ s32 GetISOFileLength(const ISOFileDef* fd) {
208239
return g_pFileSystem->GetLength(fd);
209240
}
210241

242+
int NullCallback(ISO_Msg* msg) {
243+
return 7;
244+
}
245+
246+
void ISO_Hdr::SetActive(bool b) {
247+
m_bActive = b;
248+
}
249+
250+
void ISO_Hdr::SetUnk1(bool b) {
251+
unk1 = b;
252+
}
253+
254+
void ISO_Hdr::SetUnk2(bool b) {
255+
unk2 = b;
256+
}
257+
258+
void ISOBuffer::AdjustDataLength(int size) {
259+
int state;
260+
261+
CpuSuspendIntr(&state);
262+
decompressed_size -= size;
263+
CpuResumeIntr(state);
264+
}
265+
266+
void ISOBuffer::AdvanceCurrentData(int size) {
267+
int state;
268+
269+
CpuSuspendIntr(&state);
270+
decomp_buffer += size;
271+
decompressed_size -= size;
272+
CpuResumeIntr(state);
273+
}
274+
211275
} // namespace jak3

game/overlord/jak3/iso.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ struct ISO_Hdr {
1313
bool unk1;
1414
bool unk2;
1515

16-
void SetActive();
17-
void SetUnk1();
18-
void SetUnk2();
16+
void SetActive(bool b);
17+
void SetUnk1(bool b);
18+
void SetUnk2(bool b);
1919
};
2020

2121
struct ISO_Msg : ISO_Hdr {
22-
u32 cmd_kind;
22+
u32 msg_kind;
2323
int mbx_to_reply;
2424
int thread_id;
25-
void* callback;
25+
int (*callback)(ISO_Msg*);
2626
CBaseFile* file;
2727
};
2828

game/overlord/jak3/iso_api.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ using namespace iop;
1111
u32 LoadISOFileToIOP(const ISOFileDef* file, void* addr, u32 length) {
1212
ISO_LoadSingle msg;
1313

14-
msg.cmd_kind = 0x101;
14+
msg.msg_kind = 0x101;
1515
msg.mbx_to_reply = 0;
1616
msg.thread_id = GetThreadId();
1717
msg.fd = file;

game/overlord/jak3/iso_queue.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include "iso_queue.h"
2+
3+
#include "game/overlord/jak3/pagemanager.h"
4+
#include "game/sce/iop.h"
5+
6+
namespace jak3 {
7+
using namespace iop;
8+
9+
constexpr int N_VAG_CMDS = 6;
10+
11+
u32 g_auStreamSRAM[N_VAG_CMDS];
12+
u32 g_auTrapSRAM[N_VAG_CMDS];
13+
int g_nPriQueueSema;
14+
int g_nISOSema;
15+
16+
CPageManager g_PageManager;
17+
18+
void InitBuffers() {
19+
SemaParam semap;
20+
21+
semap.init_count = 1;
22+
semap.max_count = 1;
23+
semap.attr = 0;
24+
semap.option = 0;
25+
g_nPriQueueSema = CreateSema(&semap);
26+
27+
g_PageManager.Initialize();
28+
29+
semap.init_count = 1;
30+
semap.max_count = 1;
31+
semap.attr = SA_THPRI;
32+
semap.option = 0;
33+
g_nISOSema = CreateSema(&semap);
34+
}
35+
} // namespace jak3

game/overlord/jak3/iso_queue.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef ISO_QUEUE_H_
2+
#define ISO_QUEUE_H_
3+
4+
namespace jak3 {
5+
void InitBuffers();
6+
}
7+
8+
#endif // ISO_QUEUE_H_

game/overlord/jak3/iso_structs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ enum class EFileComp { MODE0, MODE1, KNOWN_NOT_BLZO };
1010

1111
struct ISOBuffer {
1212
CPageManager::CPageList* m_pActivePages;
13-
void* decomp_buffer;
13+
u8* decomp_buffer;
1414
int decompressed_size;
1515

1616
void AdjustDataLength(int);

game/overlord/jak3/pagemanager.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
#include "pagemanager.h"
22

3+
#include "game/sce/iop.h"
4+
35
namespace jak3 {
6+
using namespace iop;
7+
8+
static constexpr u32 PAGE_SIZE = 0x8010;
9+
static constexpr u32 NUM_PAGES = 29;
410

511
static inline int ctz(u32 x) {
612
// Isolate lowest bit and subtract 1
@@ -17,4 +23,51 @@ static inline int ctz(u32 x) {
1723
return static_cast<int>(x);
1824
}
1925

26+
CPageManager::CPage::CPage(u8* start, u8* end, int page_id) {
27+
m_pNextPage = nullptr;
28+
m_uPageBit = 1 << (page_id & 0x1f);
29+
m_nUnk = 0;
30+
m_pData = start;
31+
m_pEnd = end;
32+
m_nRefCount = 0;
33+
m_nPageID = page_id;
34+
m_nDmaRefCount = 0;
35+
m_nAllocState = 0;
36+
m_nUnk2 = 0;
37+
}
38+
39+
void CPageManager::Initialize() {
40+
m_Cache.Initialize();
41+
}
42+
43+
CPageManager::CCache::CCache() {
44+
m_paCache = nullptr;
45+
m_uAllocatedPageMap = 0;
46+
m_uFreePageMap = (1 << NUM_PAGES) - 1;
47+
}
48+
49+
int CPageManager::CCache::Initialize() {
50+
m_paCache = AllocSysMemory(0, PAGE_SIZE * NUM_PAGES, nullptr);
51+
if (!m_paCache) {
52+
return 1;
53+
}
54+
55+
m_nNumFree = 29;
56+
57+
/* TODO FIXME */
58+
for (auto& pl : m_aPageLists) {
59+
}
60+
61+
int page_idx = 0;
62+
u8* page_start = (u8*)m_paCache;
63+
for (auto& page : m_aPages) {
64+
page = CPage(page_start, page_start + 0x7fff, page_idx);
65+
66+
page_start += PAGE_SIZE;
67+
page_idx++;
68+
}
69+
70+
return 0;
71+
}
72+
2073
} // namespace jak3

game/overlord/jak3/pagemanager.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,30 @@
55
namespace jak3 {
66
class CPageManager {
77
public:
8+
class CPageList;
9+
810
class CPage {
911
public:
12+
CPage() = default;
1013
CPage(u8*, u8*, int);
1114
int AddRef();
1215
int ReleaseRef();
1316
int AddDmaRef();
1417
int ReleaseDmaRef();
1518
void FromPagesCopy(u8* pInPageData, u8* pDest, int nNumBytes);
19+
20+
private:
21+
CPage* m_pNextPage;
22+
u32 m_uPageBit;
23+
u32 m_nUnk;
24+
CPageList* m_pPageList;
25+
u8* m_pData;
26+
u8* m_pEnd; // maybe
27+
u32 m_nRefCount;
28+
u32 m_nDmaRefCount;
29+
int m_nPageID;
30+
int m_nAllocState;
31+
int m_nUnk2;
1632
};
1733

1834
class CPageList {
@@ -33,7 +49,17 @@ class CPageManager {
3349
private:
3450
class CCache {
3551
public:
52+
CCache();
3653
int Initialize();
54+
55+
private:
56+
int m_nEventFlag;
57+
void* m_paCache;
58+
CPageList m_aPageLists[29];
59+
CPage m_aPages[29];
60+
u32 m_uAllocatedPageMap;
61+
u32 m_uFreePageMap;
62+
int m_nNumFree;
3763
};
3864
CCache m_Cache;
3965
};

0 commit comments

Comments
 (0)