/* область RAM. размер 2 MB. */ unsigned char ram[0x200000]; /* область BIOS (ROM). размер 512 KB. */ unsigned char rom[0x80000]; /* транслируем адрес 0x80012340 */ real_address = &ram[0x80012340 & 0x1fffff]; /* транслируем адрес 0xBFC01230 */ real_address = &rom[0xBFC01230 & 0x7ffff]; |
- экономия памяти - простота трансляции - облегчается контроль за границами дозволенного HLE адресного пространства |
центральной частью являются, взаимодействующие между друг другом, динамический
рекомпилятор и геометрический сопроцессор. они вместе делят между собой регистры
R3000 и его адресное пространство (вместе это называется "контекст HLPSE").
естественно, ничего бы не работало без PSX программы, которая находится в PS-X EXE
файле и загружается в сегмент кода. и наконец, для эмуляции аппаратуры используются
система HLPSE плагинов, которая будет описана ниже. небольшое замечание : контекст HLPSE является ключевой структурой. он используется как связуещее звено между главным HLPSE модулем (HLPSE.EXE) и набором доступных плагинов. на схеме видно, что обе "половинки" связаны между собой посредством контекста. также без доступа к контексту стало бы невозможным сделать высокоуровневую эмуляцию и аппаратную абстракцию. |
Ident - для опознавания плагина. возвращает строку-идентификатор "I_HLPSE_PLUG". Init - вызывается при запуске эмулятора. на входе передается контекст HLPSE. Shutdown - вызывается при выходе из эмулятора. |
/* HLPSE Context */ typedef struct { /* Emulator Context */ u_long *GPR; void *text; HWND hwnd; /* Emulator Interface */ int (*RegisterMessage)(UINT, LRESULT (*)(HWND, UINT, WPARAM, LPARAM)); void (*SysError)(char *, ...); void (*Shutdown)(); FARPROC (*Recompile)(u_long); void (*Execute)(u_long); FARPROC (*SendHLERequest)(char *); void (*Interrupt)(); (*) char*(*Dasm)(u_long, u_long); (*) void (*Printf)(char *, ...); (*) } HLPSE_State; |
[address] [name] [address] [name] ... например: 8007B6A0 printf 800856B0 CD_vol 80085F60 puts 80087020 ResetCallback 80087050 InterruptCallback |