1 #pragma once
2 
3 #include "Iop_FileIo.h"
4 
5 namespace Iop
6 {
7 	class CFileIoHandler1000 : public CFileIo::CHandler
8 	{
9 	public:
10 		CFileIoHandler1000(CIopBios&, uint8*, CIoman*, CSifMan&);
11 		virtual ~CFileIoHandler1000();
12 
13 		void Invoke(CMIPS&, uint32) override;
14 		bool Invoke(uint32, uint32*, uint32, uint32*, uint32, uint8*) override;
15 
16 	private:
17 		enum
18 		{
19 			TRAMPOLINE_SIZE = 0x80,
20 			BUFFER_SIZE = 0x400,
21 		};
22 
23 		struct MODULEDATA
24 		{
25 			uint8 trampoline[TRAMPOLINE_SIZE];
26 			uint8 buffer[BUFFER_SIZE];
27 			uint32 method;
28 			uint32 handle;
29 			uint32 resultAddr;
30 			uint32 eeBufferAddr;
31 			uint32 size;
32 			uint32 bytesProcessed;
33 		};
34 
35 		void LaunchOpenRequest(uint32*, uint32, uint32*, uint32, uint8*);
36 		void LaunchCloseRequest(uint32*, uint32, uint32*, uint32, uint8*);
37 		void LaunchReadRequest(uint32*, uint32, uint32*, uint32, uint8*);
38 		void LaunchSeekRequest(uint32*, uint32, uint32*, uint32, uint8*);
39 
40 		std::pair<bool, int32> FinishReadRequest(MODULEDATA*, uint8*, int32);
41 
42 		void ExecuteRequest(CMIPS&);
43 		void FinishRequest(CMIPS&);
44 		void BuildExportTable();
45 
46 		CIopBios& m_bios;
47 		uint8* m_iopRam = nullptr;
48 		CSifMan& m_sifMan;
49 		uint32 m_moduleDataAddr = 0;
50 		uint32 m_trampolineAddr = 0;
51 		uint32 m_bufferAddr = 0;
52 	};
53 }
54