Code Monkey home page Code Monkey logo

trapezoid's Introduction

Trapezoid

Build status dependency status license Crates.io trapezoid

trapezoid is a PSX/PS1 emulator built from scratch using Rust.

This is a personal project for fun and to experience emulating hardware and connecting them together.

Showcase

demo

Building and installation

Installing

You can install trapezoid from crates.io using cargo:

cargo install trapezoid

Building

If you want to experience the latest development version, you can build trapezoid yourself.

cargo build --release

The emulator will be slow without optimization, that's why we have opt-level = 2 in debug profile.

Emulator core

The emulator core is implemented as a library in trapezoid-core, this library is the emulator core, and contain all the components. You can easily take the core and build a frontend around it, or use it as a server.

Check the trapezoid-core for more info and documentation.

Frontend

Controls

The Frontend implementations has its own controls mapping, this can be configured if you decide to use trapezoid-core directly

Keyboard

keyboard PSX controller
Enter Start
Backspace Select
Num1 L1
Num2 L2
Num3 L3
Num0 R1
Num9 R2
Num8 R3
W Up
S Down
D Right
A Left
I Triangle
K X
L Circle
J Square

Debugging

trapezoid has a built-in powerfull debugger to help debug games and access to data.

This is a CLI based debugger, it can be activated by pressing / (forward slash) key, it will pause the emulation and activates the debugger.

You will get a prompt:

CPU>

The debugger uses rustyline and has auto completion

Debugger addressing and variables

Anywhere the term <addr> is used, it can be a hex address, or a variable name.

There are two variable types:

  • start with $ are registers, for example $t0 is the register t0, etc...
  • start with @ are special hardware registers, like @TIMER0_TARGET which is the timer 0 target register.

You can know these registers using the tab completion. Just start typing $ or @ and press tab.

Debugger commands

h

Prints the help message

CPU> h
h - help
r - print registers
c - continue
s - step
so - step-over
su - step-out
tt - enable trace
tf - disbale trace
stack [0xn] - print stack [n entries in hex]
bt/[limit] - print backtrace [top `limit` entries]
b <addr> - set breakpoint
rb <addr> - remove breakpoint
bw <addr> - set write breakpoint
rbw <addr> - remove write breakpoint
br <addr> - set read breakpoint
rbr <addr> - remove read breakpoint
lb - list breakpoints
m[32/16/8] <addr> - print content of memory (default u32)
p <addr>/<$reg> - print address or register value
i/[n] [addr] - disassemble instructions
hook_add <cmd[;cmd]> - add hook/s commands
hook_clear - clear all hooks
hook_list - list all hooks
hook_setting [<break_type>[=true/false]] - change when the hooks are executed
r

Prints the registers (example from a random game in a random point)

CPU> r
Registers:
pc: 8004A648    at: 80060000
hi: 00000000    lo: 009941F4
v0: 00003178    s0: 54042275
v1: FFFFFFFF    s1: 0000015B
a0: 00003179    s2: 0000008F
a1: 00008000    s3: 00000000
a2: 00000000    s4: 00000002
a3: 00000000    s5: 00000000
t0: 39937A40    s6: 00000000
t1: 00000000    s7: 00000000
t2: 00000000    t8: 00000000
t3: F9A700FE    t9: 801FFEE0
t4: 0000F159    k0: 8004A600
t5: 801A1D9C    k1: 00006418
t6: 00000001    gp: 8005F17C
t7: 00000003    sp: 801FFE78
fp: 801FFFF8    ra: 8004A540
c

Continue the emulation

s

Executes one instruction and then stops

so

Executes one instruction and then stops, if the instruction is a function call, it will execute the function and stop at the next instruction after the call.

For example, if the code was like this

0x1000: jal 0x8004A648
0x1004: _nop            ; delay slot
0x1008: nop

and the PC was at 0x1000, then so will execute jal and stop at 0x1008

su

Will continue the emulation until the current function returns.

It will stop on the instruction after the function call.

tt

Enable trace, this will print the executed instructions, this is very heavy as it prints all instruction and will reduce the emulation speed.

Example output:

CPU> tt
Instruction trace: true
CPU> c
80000080: lui k0, 0x0000
80000084: addiu k0, k0, 0x0C80
80000088: jr k0
8000008C: _nop
00000C80: nop
00000C84: nop
00000C88: addiu k0, zero, 0x0100
00000C8C: lw k0, 0x0008(k0)
00000C90: nop
00000C94: lw k0, 0x0000(k0)
00000C98: nop
...
tf

Disable trace

stack

Print the stack content, you can specify the number of entries to print, default is 10

CPU> stack
Stack: SP=0x801FFC90
    8001273C
    8001273C
    00000002
    00000000
    00000000
    800C82AC
    00000012
    00000001
    00000000
    800143AC
bt

Print the backtrace, you can specify the number of entries to print, default, whole backtrace

For example, here we are in 59 level of the backtrace, but we only print the top 10 entries

CPU> bt/10
#59:      80012E24
#58:      000019B8
#57:      00000E28
#56:      8004AAB0
#55:      8004A888
#54:      8004AAB0
#53:      8004A888
#52:      000019B8
#51:      00000E28
#50:      000019B8

The addresses here are the return addresses, for example, looking at the first one 80012E24, lets print the 2 instructions before it.

We will we have the call instruction, the delay slot, and the return address is what's in the backtrace.

CPU> i 80012E1C
0x80012E1C: jal 0x0004AF1 => 0x80012BC4
0x80012E20: _addiu a0, zero, 0xFFFF
0x80012E24: lui v0, 0x8006

This means that right now we are inside the function 0x80012BC4

b

Set a breakpoint on address, the address is in hex, the 0x prefix is optional This will trigger when the address is executed

CPU> b 80012E24
Breakpoint added: 0x80012E24
rb

Remove a breakpoint

CPU> rb 80012E24
Breakpoint removed: 0x80012E24
bw

Set a write breakpoint on address, the address is in hex, the 0x prefix is optional This will trigger when the address is written to

CPU> bw 80012E24
Write breakpoint added: 0x80012E24
rbw

Remove a write breakpoint

CPU> rbw 80012E24
Write breakpoint removed: 0x80012E24
br

Set a read breakpoint on address, the address is in hex, the 0x prefix is optional This will trigger when the address is read from (also execute, since we are reading from this address)

CPU> br 80012E24
Read breakpoint added: 0x80012E24
rbr

Remove a read breakpoint

CPU> rbr 80012E24
Read breakpoint removed: 0x80012E24
lb

List all breakpoints

CPU> lb
Breakpoint: 0x80012E24
Write Breakpoint: 0x80012E24
Read Breakpoint: 0x80012E24
m

Print the memory content, you can specify the size of the read, and the number of times to read, default is 1 u32

CPU> m 80012E24
0x80012E24: 0x3C028006
CPU> m32 80012E24
0x80012E24: 0x3C028006
CPU> m32/4 80012E24
0x80012E24: 0x3C028006
0x80012E28: 0x8C427FB0
0x80012E2C: 0x00000000
0x80012E30: 0x1440FFED
CPU> m8/4 80012E24
0x80012E24: 0x06
0x80012E25: 0x80
0x80012E26: 0x02
0x80012E27: 0x3C
CPU> m16/4 80012E24
0x80012E24: 0x8006
0x80012E26: 0x3C02
0x80012E28: 0x7FB0
0x80012E2A: 0x8C42

CPU> m @GPU_STAT        ; reading gpu status register easily
0x1F801814: 0x5404220A
p

Print the value of a register or memory address

This is only useful for cpu registers, at least for now, there is no expression evaluation

CPU> p $t0
0x00005688
CPU> p @GPU_STAT
0x1F801814
CPU> p 12345678
0x12345678
i

Disassemble instructions, you can specify the number of instructions to disassemble, default is 1 at the current location of PC

CPU> i
0x80000084: addiu k0, k0, 0x0C80
CPU> i/10
0x80000084: addiu k0, k0, 0x0C80
0x80000088: jr k0
0x8000008C: _nop
0x80000090: nop
0x80000094: nop
0x80000098: nop
0x8000009C: nop
0x800000A0: lui t0, 0x0000
0x800000A4: addiu t0, t0, 0x05C4
0x800000A8: jr t0
CPU> i 800000A0
0x800000A0: lui t0, 0x0000

Hooks

The debugger allows to create hooks, these are commands, any of the above commands which will execute on certain events. The events can be configured using hook_setting command.

CPU> hook_setting
Hooks will be executed on the following breakpoints:
  step: false
  step_over: false
  step_out: false
  instruction_breakpoint: false
  read_breakpoint: false
  write_breakpoint: false

By default, hooks aren't bound to any event.

But can be set using hook_setting to modify when to execute them.

CPU> hook_setting step,instruction_breakpoint=true,step_out=false
Hooks will be executed on the following breakpoints:
  step: true
  step_over: false
  step_out: false
  instruction_breakpoint: true
  read_breakpoint: false
  write_breakpoint: false

This will enable hooks on step and instruction_breakpoint events, and disable them on step_out event, and leave the rest as is.

hook_add

We can add hooks by hook_add, which will be executed when the event is triggered.

CPU> hook_add r;i/20
Hook added: r
Hook added: i/20

This adds two commands to execute on an event, r and i/20, r will print the registers, and i/20 will disassemble 20 instructions from PC.

hook_clear

Clear all hooks

hook_list

List all hooks

CPU> hook_list
r
i/20

VRAM

We can view the raw vram state, which you can think of as an image of 1024x512 pixels

This can be triggerd with the keyboard button v.

vram

Contributions and TODO

Check the trapezoid-core for more information about TODO items related to the emulator.

Also check the issues.

Really appreciate any contributions. Thanks!

License

This project is under MIT license.

NES is a product and/or trademark of Nintendo Co., Ltd. Nintendo Co., Ltd. and is not affiliated in any way with Plastic or its author

References

Most of the documentation for PSX components can be found in the consoledev website

trapezoid's People

Contributors

amjad50 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

trapezoid's Issues

Crash warped generates exception `bus_read_u8: 1F8008BB at 80041AB4: u8 read from 1F8008BB` sometimes (random)

Not sure why, this is a locked memory area after the scratchpad so it shouldn't be accessed

Call stack

[ERROR psx_core::cpu] call stack:
[ERROR psx_core::cpu]   00: BFC06F18
[ERROR psx_core::cpu]   01: BFC067D8
[ERROR psx_core::cpu]   02: BFC06C80
[ERROR psx_core::cpu]   03: BFC0D5F0
[ERROR psx_core::cpu]   04: BFC03D60
[ERROR psx_core::cpu]   05: 80048A9C
[ERROR psx_core::cpu]   06: 80011654
[ERROR psx_core::cpu]   07: 00000E28
[ERROR psx_core::cpu]   08: 000019B8
[ERROR psx_core::cpu]   09: 00000E28
[ERROR psx_core::cpu]   10: 000019B8
[ERROR psx_core::cpu]   11: 00000E28
[ERROR psx_core::cpu]   12: 000019B8
[ERROR psx_core::cpu]   13: 00000E28
[ERROR psx_core::cpu]   14: 000019B8
[ERROR psx_core::cpu]   15: 00000E28
[ERROR psx_core::cpu]   16: 000019B8
[ERROR psx_core::cpu]   17: 00000E28
[ERROR psx_core::cpu]   18: 000019B8
[ERROR psx_core::cpu]   19: 00000E28
[ERROR psx_core::cpu]   20: 000019B8
[ERROR psx_core::cpu]   21: 00000E28
[ERROR psx_core::cpu]   22: 000019B8
[ERROR psx_core::cpu]   23: 00000E28
[ERROR psx_core::cpu]   24: 000019B8
[ERROR psx_core::cpu]   25: 00000E28
[ERROR psx_core::cpu]   26: 000019B8
[ERROR psx_core::cpu]   27: 00000E28
[ERROR psx_core::cpu]   28: 000019B8
[ERROR psx_core::cpu]   29: 00000E28
[ERROR psx_core::cpu]   30: 000019B8
[ERROR psx_core::cpu]   31: 00000E28
[ERROR psx_core::cpu]   32: 000019B8
[ERROR psx_core::cpu]   33: 00000E28
[ERROR psx_core::cpu]   34: 000019B8
[ERROR psx_core::cpu]   35: 00000E28
[ERROR psx_core::cpu]   36: 000019B8
[ERROR psx_core::cpu]   37: 00000E28
[ERROR psx_core::cpu]   38: 000019B8
[ERROR psx_core::cpu]   39: 00000E28
[ERROR psx_core::cpu]   40: 000019B8
[ERROR psx_core::cpu]   41: 00000E28
[ERROR psx_core::cpu]   42: 000019B8
[ERROR psx_core::cpu]   43: 00000E28
[ERROR psx_core::cpu]   44: 000019B8
[ERROR psx_core::cpu]   45: 00000E28
[ERROR psx_core::cpu]   46: 000019B8
[ERROR psx_core::cpu]   47: 00000E28
[ERROR psx_core::cpu]   48: 000019B8
[ERROR psx_core::cpu]   49: 00000E28
[ERROR psx_core::cpu]   50: 000019B8
[ERROR psx_core::cpu]   51: 00000E28
[ERROR psx_core::cpu]   52: 000019B8
[ERROR psx_core::cpu]   53: 00000E28
[ERROR psx_core::cpu]   54: 000019B8
[ERROR psx_core::cpu]   55: 00000E28
[ERROR psx_core::cpu]   56: 000019B8
[ERROR psx_core::cpu]   57: 00000E28
[ERROR psx_core::cpu]   58: 000019B8
[ERROR psx_core::cpu]   59: 00000E28
[ERROR psx_core::cpu]   60: 000019B8
[ERROR psx_core::cpu]   61: 00000E28
[ERROR psx_core::cpu]   62: 000019B8
[ERROR psx_core::cpu]   63: 00000E28
[ERROR psx_core::cpu]   64: 000019B8
[ERROR psx_core::cpu]   65: 00000E28
[ERROR psx_core::cpu]   66: 000019B8
[ERROR psx_core::cpu]   67: 8004B6AC
[ERROR psx_core::cpu]   68: 8004B8D4
[ERROR psx_core::cpu]   69: 00000E28
[ERROR psx_core::cpu]   70: 000019B8
[ERROR psx_core::cpu]   71: 8004B6AC
[ERROR psx_core::cpu]   72: 8004B8D4
[ERROR psx_core::cpu]   73: 00000E28
[ERROR psx_core::cpu]   74: 000019B8
[ERROR psx_core::cpu]   75: 00000E28
[ERROR psx_core::cpu]   76: 000019B8
[ERROR psx_core::cpu]   77: 00000E28
[ERROR psx_core::cpu]   78: 000019B8
[ERROR psx_core::cpu]   79: 00000E28
[ERROR psx_core::cpu]   80: 000019B8
[ERROR psx_core::cpu]   81: 00000E28
[ERROR psx_core::cpu]   82: 000019B8
[ERROR psx_core::cpu]   83: 00000E28
[ERROR psx_core::cpu]   84: 000019B8
[ERROR psx_core::cpu]   85: 00000E28
[ERROR psx_core::cpu]   86: 000019B8
[ERROR psx_core::cpu]   87: 00000E28
[ERROR psx_core::cpu]   88: 000019B8
[ERROR psx_core::cpu]   89: 8004B6AC
[ERROR psx_core::cpu]   90: 8004B8D4
[ERROR psx_core::cpu]   91: 00000E28
[ERROR psx_core::cpu]   92: 000019B8
[ERROR psx_core::cpu]   93: 00000E28
[ERROR psx_core::cpu]   94: 000019B8
[ERROR psx_core::cpu]   95: 00000E28
[ERROR psx_core::cpu]   96: 000019B8
[ERROR psx_core::cpu]   97: 00000E28
[ERROR psx_core::cpu]   98: 000019B8
[ERROR psx_core::cpu]   99: 00000E28
[ERROR psx_core::cpu]   100: 000019B8
[ERROR psx_core::cpu]   101: 00000E28
[ERROR psx_core::cpu]   102: 000019B8
[ERROR psx_core::cpu]   103: 00000E28
[ERROR psx_core::cpu]   104: 000019B8
[ERROR psx_core::cpu]   105: 00000E28
[ERROR psx_core::cpu]   106: 000019B8
[ERROR psx_core::cpu]   107: 00000E28
[ERROR psx_core::cpu]   108: 000019B8
[ERROR psx_core::cpu]   109: 00000E28
[ERROR psx_core::cpu]   110: 000019B8
[ERROR psx_core::cpu]   111: 00000E28
[ERROR psx_core::cpu]   112: 000019B8
[ERROR psx_core::cpu]   113: 00000E28
[ERROR psx_core::cpu]   114: 000019B8
[ERROR psx_core::cpu]   115: 00000E28
[ERROR psx_core::cpu]   116: 000019B8
[ERROR psx_core::cpu]   117: 8004B6AC
[ERROR psx_core::cpu]   118: 8004B8D4
[ERROR psx_core::cpu]   119: 8004B6AC
[ERROR psx_core::cpu]   120: 8004B8D4
[ERROR psx_core::cpu]   121: 00000E28
[ERROR psx_core::cpu]   122: 000019B8
[ERROR psx_core::cpu]   123: 00000E28
[ERROR psx_core::cpu]   124: 000019B8
[ERROR psx_core::cpu]   125: 00000E28
[ERROR psx_core::cpu]   126: 000019B8
[ERROR psx_core::cpu]   127: 00000E28
[ERROR psx_core::cpu]   128: 000019B8
[ERROR psx_core::cpu]   129: 00000E28
[ERROR psx_core::cpu]   130: 000019B8
[ERROR psx_core::cpu]   131: 00000E28
[ERROR psx_core::cpu]   132: 000019B8
[ERROR psx_core::cpu]   133: 00000E28
[ERROR psx_core::cpu]   134: 000019B8
[ERROR psx_core::cpu]   135: 00000E28
[ERROR psx_core::cpu]   136: 000019B8
[ERROR psx_core::cpu]   137: 00000E28
[ERROR psx_core::cpu]   138: 000019B8
[ERROR psx_core::cpu]   139: 00000E28
[ERROR psx_core::cpu]   140: 000019B8
[ERROR psx_core::cpu]   141: 00000E28
[ERROR psx_core::cpu]   142: 000019B8
[ERROR psx_core::cpu]   143: 00000E28
[ERROR psx_core::cpu]   144: 000019B8
[ERROR psx_core::cpu]   145: 00000E28
[ERROR psx_core::cpu]   146: 000019B8
[ERROR psx_core::cpu]   147: 00000E28
[ERROR psx_core::cpu]   148: 000019B8
[ERROR psx_core::cpu]   149: 00000E28
[ERROR psx_core::cpu]   150: 000019B8
[ERROR psx_core::cpu]   151: 00000E28
[ERROR psx_core::cpu]   152: 000019B8
[ERROR psx_core::cpu]   153: 00000E28
[ERROR psx_core::cpu]   154: 000019B8
[ERROR psx_core::cpu]   155: 00000E28
[ERROR psx_core::cpu]   156: 000019B8
[ERROR psx_core::cpu]   157: 00000E28
[ERROR psx_core::cpu]   158: 000019B8
[ERROR psx_core::cpu]   159: 00000E28
[ERROR psx_core::cpu]   160: 000019B8
[ERROR psx_core::cpu]   161: 00000E28
[ERROR psx_core::cpu]   162: 000019B8
[ERROR psx_core::cpu]   163: 00000E28
[ERROR psx_core::cpu]   164: 000019B8
[ERROR psx_core::cpu]   165: 00000E28
[ERROR psx_core::cpu]   166: 000019B8
[ERROR psx_core::cpu]   167: 00000E28
[ERROR psx_core::cpu]   168: 000019B8
[ERROR psx_core::cpu]   169: 00000E28
[ERROR psx_core::cpu]   170: 000019B8
[ERROR psx_core::cpu]   171: 00000E28
[ERROR psx_core::cpu]   172: 000019B8
[ERROR psx_core::cpu]   173: 00000E28
[ERROR psx_core::cpu]   174: 000019B8
[ERROR psx_core::cpu]   175: 00000E28
[ERROR psx_core::cpu]   176: 000019B8
[ERROR psx_core::cpu]   177: 00000E28
[ERROR psx_core::cpu]   178: 000019B8
[ERROR psx_core::cpu]   179: 00000E28
[ERROR psx_core::cpu]   180: 000019B8
[ERROR psx_core::cpu]   181: 8004B6AC
[ERROR psx_core::cpu]   182: 8004B8D4
[ERROR psx_core::cpu]   183: 00000E28
[ERROR psx_core::cpu]   184: 000019B8
[ERROR psx_core::cpu]   185: 00000E28
[ERROR psx_core::cpu]   186: 000019B8
[ERROR psx_core::cpu]   187: 00000E28
[ERROR psx_core::cpu]   188: 000019B8
[ERROR psx_core::cpu]   189: 00000E28
[ERROR psx_core::cpu]   190: 000019B8
[ERROR psx_core::cpu]   191: 00000E28
[ERROR psx_core::cpu]   192: 000019B8
[ERROR psx_core::cpu]   193: 00000E28
[ERROR psx_core::cpu]   194: 000019B8
[ERROR psx_core::cpu]   195: 00000E28
[ERROR psx_core::cpu]   196: 000019B8
[ERROR psx_core::cpu]   197: 00000E28
[ERROR psx_core::cpu]   198: 000019B8
[ERROR psx_core::cpu]   199: 00000E28
[ERROR psx_core::cpu]   200: 000019B8
[ERROR psx_core::cpu]   201: 00000E28
[ERROR psx_core::cpu]   202: 000019B8
[ERROR psx_core::cpu]   203: 00000E28
[ERROR psx_core::cpu]   204: 000019B8
[ERROR psx_core::cpu]   205: 00000E28
[ERROR psx_core::cpu]   206: 000019B8
[ERROR psx_core::cpu]   207: 00000E28
[ERROR psx_core::cpu]   208: 000019B8
[ERROR psx_core::cpu]   209: 00000E28
[ERROR psx_core::cpu]   210: 000019B8
[ERROR psx_core::cpu]   211: 00000E28
[ERROR psx_core::cpu]   212: 000019B8
[ERROR psx_core::cpu]   213: 00000E28
[ERROR psx_core::cpu]   214: 000019B8
[ERROR psx_core::cpu]   215: 00000E28
[ERROR psx_core::cpu]   216: 000019B8
[ERROR psx_core::cpu]   217: 00000E28
[ERROR psx_core::cpu]   218: 000019B8
[ERROR psx_core::cpu]   219: 00000E28
[ERROR psx_core::cpu]   220: 000019B8
[ERROR psx_core::cpu]   221: 00000E28
[ERROR psx_core::cpu]   222: 000019B8
[ERROR psx_core::cpu]   223: 00000E28
[ERROR psx_core::cpu]   224: 000019B8
[ERROR psx_core::cpu]   225: 00000E28
[ERROR psx_core::cpu]   226: 000019B8
[ERROR psx_core::cpu]   227: 00000E28
[ERROR psx_core::cpu]   228: 000019B8
[ERROR psx_core::cpu]   229: 00000E28
[ERROR psx_core::cpu]   230: 000019B8
[ERROR psx_core::cpu]   231: 00000E28
[ERROR psx_core::cpu]   232: 000019B8
[ERROR psx_core::cpu]   233: 00000E28
[ERROR psx_core::cpu]   234: 000019B8
[ERROR psx_core::cpu]   235: 00000E28
[ERROR psx_core::cpu]   236: 000019B8
[ERROR psx_core::cpu]   237: 00000E28
[ERROR psx_core::cpu]   238: 000019B8
[ERROR psx_core::cpu]   239: 00000E28
[ERROR psx_core::cpu]   240: 000019B8
[ERROR psx_core::cpu]   241: 00000E28
[ERROR psx_core::cpu]   242: 000019B8
[ERROR psx_core::cpu]   243: 00000E28
[ERROR psx_core::cpu]   244: 000019B8
[ERROR psx_core::cpu]   245: 00000E28
[ERROR psx_core::cpu]   246: 000019B8
[ERROR psx_core::cpu]   247: 00000E28
[ERROR psx_core::cpu]   248: 000019B8
[ERROR psx_core::cpu]   249: 00000E28
[ERROR psx_core::cpu]   250: 000019B8
[ERROR psx_core::cpu]   251: 00000E28
[ERROR psx_core::cpu]   252: 000019B8
[ERROR psx_core::cpu]   253: 00000E28
[ERROR psx_core::cpu]   254: 000019B8
[ERROR psx_core::cpu]   255: 00000E28
[ERROR psx_core::cpu]   256: 000019B8
[ERROR psx_core::cpu]   257: 00000E28
[ERROR psx_core::cpu]   258: 000019B8
[ERROR psx_core::cpu]   259: 00000E28
[ERROR psx_core::cpu]   260: 000019B8
[ERROR psx_core::cpu]   261: 00000E28
[ERROR psx_core::cpu]   262: 000019B8
[ERROR psx_core::cpu]   263: 00000E28
[ERROR psx_core::cpu]   264: 000019B8
[ERROR psx_core::cpu]   265: 00000E28
[ERROR psx_core::cpu]   266: 000019B8
[ERROR psx_core::cpu]   267: 00000E28
[ERROR psx_core::cpu]   268: 000019B8
[ERROR psx_core::cpu]   269: 00000E28
[ERROR psx_core::cpu]   270: 000019B8
[ERROR psx_core::cpu]   271: 00000E28
[ERROR psx_core::cpu]   272: 000019B8
[ERROR psx_core::cpu]   273: 00000E28
[ERROR psx_core::cpu]   274: 000019B8
[ERROR psx_core::cpu]   275: 00000E28
[ERROR psx_core::cpu]   276: 000019B8
[ERROR psx_core::cpu]   277: 00000E28
[ERROR psx_core::cpu]   278: 000019B8
[ERROR psx_core::cpu]   279: 00000E28
[ERROR psx_core::cpu]   280: 000019B8
[ERROR psx_core::cpu]   281: 00000E28
[ERROR psx_core::cpu]   282: 000019B8
[ERROR psx_core::cpu]   283: 00000E28
[ERROR psx_core::cpu]   284: 000019B8
[ERROR psx_core::cpu]   285: 00000E28
[ERROR psx_core::cpu]   286: 000019B8
[ERROR psx_core::cpu]   287: 00000E28
[ERROR psx_core::cpu]   288: 000019B8
[ERROR psx_core::cpu]   289: 00000E28
[ERROR psx_core::cpu]   290: 000019B8
[ERROR psx_core::cpu]   291: 00000E28
[ERROR psx_core::cpu]   292: 000019B8
[ERROR psx_core::cpu]   293: 00000E28
[ERROR psx_core::cpu]   294: 000019B8
[ERROR psx_core::cpu]   295: 00000E28
[ERROR psx_core::cpu]   296: 000019B8
[ERROR psx_core::cpu]   297: 00000E28
[ERROR psx_core::cpu]   298: 000019B8
[ERROR psx_core::cpu]   299: 00000E28
[ERROR psx_core::cpu]   300: 000019B8
[ERROR psx_core::cpu]   301: 00000E28
[ERROR psx_core::cpu]   302: 000019B8
[ERROR psx_core::cpu]   303: 00000E28
[ERROR psx_core::cpu]   304: 000019B8
[ERROR psx_core::cpu]   305: 00000E28
[ERROR psx_core::cpu]   306: 000019B8
[ERROR psx_core::cpu]   307: 00000E28
[ERROR psx_core::cpu]   308: 000019B8
[ERROR psx_core::cpu]   309: 00000E28
[ERROR psx_core::cpu]   310: 000019B8
[ERROR psx_core::cpu]   311: 00000E28
[ERROR psx_core::cpu]   312: 000019B8
[ERROR psx_core::cpu]   313: 00000E28
[ERROR psx_core::cpu]   314: 000019B8
[ERROR psx_core::cpu]   315: 00000E28
[ERROR psx_core::cpu]   316: 000019B8
[ERROR psx_core::cpu]   317: 00000E28
[ERROR psx_core::cpu]   318: 000019B8
[ERROR psx_core::cpu]   319: 00000E28
[ERROR psx_core::cpu]   320: 000019B8
[ERROR psx_core::cpu]   321: 00000E28
[ERROR psx_core::cpu]   322: 000019B8
[ERROR psx_core::cpu]   323: 00000E28
[ERROR psx_core::cpu]   324: 000019B8
[ERROR psx_core::cpu]   325: 00000E28
[ERROR psx_core::cpu]   326: 000019B8
[ERROR psx_core::cpu]   327: 00000E28
[ERROR psx_core::cpu]   328: 000019B8
[ERROR psx_core::cpu]   329: 00000E28
[ERROR psx_core::cpu]   330: 000019B8
[ERROR psx_core::cpu]   331: 00000E28
[ERROR psx_core::cpu]   332: 000019B8
[ERROR psx_core::cpu]   333: 00000E28
[ERROR psx_core::cpu]   334: 000019B8
[ERROR psx_core::cpu]   335: 00000E28
[ERROR psx_core::cpu]   336: 000019B8
[ERROR psx_core::cpu]   337: 00000E28
[ERROR psx_core::cpu]   338: 000019B8
[ERROR psx_core::cpu]   339: 00000E28
[ERROR psx_core::cpu]   340: 000019B8
[ERROR psx_core::cpu]   341: 00000E28
[ERROR psx_core::cpu]   342: 000019B8
[ERROR psx_core::cpu]   343: 8004B6AC
[ERROR psx_core::cpu]   344: 8004B8D4
[ERROR psx_core::cpu]   345: 00000E28
[ERROR psx_core::cpu]   346: 000019B8
[ERROR psx_core::cpu]   347: 00000E28
[ERROR psx_core::cpu]   348: 000019B8
[ERROR psx_core::cpu]   349: 00000E28
[ERROR psx_core::cpu]   350: 000019B8
[ERROR psx_core::cpu]   351: 00000E28
[ERROR psx_core::cpu]   352: 000019B8
[ERROR psx_core::cpu]   353: 00000E28
[ERROR psx_core::cpu]   354: 000019B8
[ERROR psx_core::cpu]   355: 00000E28
[ERROR psx_core::cpu]   356: 000019B8
[ERROR psx_core::cpu]   357: 00000E28
[ERROR psx_core::cpu]   358: 000019B8
[ERROR psx_core::cpu]   359: 00000E28
[ERROR psx_core::cpu]   360: 000019B8
[ERROR psx_core::cpu]   361: 00000E28
[ERROR psx_core::cpu]   362: 000019B8
[ERROR psx_core::cpu]   363: 00000E28
[ERROR psx_core::cpu]   364: 000019B8
[ERROR psx_core::cpu]   365: 00000E28
[ERROR psx_core::cpu]   366: 000019B8
[ERROR psx_core::cpu]   367: 00000E28
[ERROR psx_core::cpu]   368: 000019B8
[ERROR psx_core::cpu]   369: 8004B6AC
[ERROR psx_core::cpu]   370: 8004B8D4
[ERROR psx_core::cpu]   371: 00000E28
[ERROR psx_core::cpu]   372: 000019B8
[ERROR psx_core::cpu]   373: 00000E28
[ERROR psx_core::cpu]   374: 000019B8
[ERROR psx_core::cpu]   375: 00000E28
[ERROR psx_core::cpu]   376: 000019B8
[ERROR psx_core::cpu]   377: 8004B6AC
[ERROR psx_core::cpu]   378: 8004B8D4
[ERROR psx_core::cpu]   379: 00000E28
[ERROR psx_core::cpu]   380: 000019B8
[ERROR psx_core::cpu]   381: 00000E28
[ERROR psx_core::cpu]   382: 000019B8
[ERROR psx_core::cpu]   383: 00000E28
[ERROR psx_core::cpu]   384: 000019B8
[ERROR psx_core::cpu]   385: 00000E28
[ERROR psx_core::cpu]   386: 000019B8
[ERROR psx_core::cpu]   387: 00000E28
[ERROR psx_core::cpu]   388: 000019B8
[ERROR psx_core::cpu]   389: 8004B6AC
[ERROR psx_core::cpu]   390: 8004B8D4
[ERROR psx_core::cpu]   391: 00000E28
[ERROR psx_core::cpu]   392: 000019B8
[ERROR psx_core::cpu]   393: 00000E28
[ERROR psx_core::cpu]   394: 000019B8
[ERROR psx_core::cpu]   395: 00000E28
[ERROR psx_core::cpu]   396: 000019B8
[ERROR psx_core::cpu]   397: 00000E28
[ERROR psx_core::cpu]   398: 000019B8
[ERROR psx_core::cpu]   399: 00000E28
[ERROR psx_core::cpu]   400: 000019B8
[ERROR psx_core::cpu]   401: 00000E28
[ERROR psx_core::cpu]   402: 000019B8
[ERROR psx_core::cpu]   403: 00000E28
[ERROR psx_core::cpu]   404: 000019B8
[ERROR psx_core::cpu]   405: 8004B6AC
[ERROR psx_core::cpu]   406: 8004B8D4
[ERROR psx_core::cpu]   407: 00000E28
[ERROR psx_core::cpu]   408: 000019B8
[ERROR psx_core::cpu]   409: 00000E28
[ERROR psx_core::cpu]   410: 000019B8
[ERROR psx_core::cpu]   411: 00000E28
[ERROR psx_core::cpu]   412: 000019B8
[ERROR psx_core::cpu]   413: 00000E28
[ERROR psx_core::cpu]   414: 000019B8
[ERROR psx_core::cpu]   415: 00000E28
[ERROR psx_core::cpu]   416: 000019B8
[ERROR psx_core::cpu]   417: 00000E28
[ERROR psx_core::cpu]   418: 000019B8
[ERROR psx_core::cpu]   419: 00000E28
[ERROR psx_core::cpu]   420: 000019B8
[ERROR psx_core::cpu]   421: 00000E28
[ERROR psx_core::cpu]   422: 000019B8
[ERROR psx_core::cpu]   423: 00000E28
[ERROR psx_core::cpu]   424: 000019B8
[ERROR psx_core::cpu]   425: 00000E28
[ERROR psx_core::cpu]   426: 000019B8
[ERROR psx_core::cpu]   427: 00000E28
[ERROR psx_core::cpu]   428: 000019B8
[ERROR psx_core::cpu]   429: 00000E28
[ERROR psx_core::cpu]   430: 000019B8
[ERROR psx_core::cpu]   431: 00000E28
[ERROR psx_core::cpu]   432: 000019B8
[ERROR psx_core::cpu]   433: 00000E28
[ERROR psx_core::cpu]   434: 000019B8
[ERROR psx_core::cpu]   435: 00000E28
[ERROR psx_core::cpu]   436: 000019B8
[ERROR psx_core::cpu]   437: 00000E28
[ERROR psx_core::cpu]   438: 000019B8
[ERROR psx_core::cpu]   439: 00000E28
[ERROR psx_core::cpu]   440: 000019B8
[ERROR psx_core::cpu]   441: 00000E28
[ERROR psx_core::cpu]   442: 000019B8
[ERROR psx_core::cpu]   443: 00000E28
[ERROR psx_core::cpu]   444: 000019B8
[ERROR psx_core::cpu]   445: 00000E28
[ERROR psx_core::cpu]   446: 000019B8
[ERROR psx_core::cpu]   447: 00000E28
[ERROR psx_core::cpu]   448: 000019B8
[ERROR psx_core::cpu]   449: 00000E28
[ERROR psx_core::cpu]   450: 000019B8
[ERROR psx_core::cpu]   451: 8004B6AC
[ERROR psx_core::cpu]   452: 8004B8D4
[ERROR psx_core::cpu]   453: 00000E28
[ERROR psx_core::cpu]   454: 000019B8
[ERROR psx_core::cpu]   455: 00000E28
[ERROR psx_core::cpu]   456: 000019B8
[ERROR psx_core::cpu]   457: 00000E28
[ERROR psx_core::cpu]   458: 000019B8
[ERROR psx_core::cpu]   459: 00000E28
[ERROR psx_core::cpu]   460: 000019B8
[ERROR psx_core::cpu]   461: 00000E28
[ERROR psx_core::cpu]   462: 000019B8
[ERROR psx_core::cpu]   463: 00000E28
[ERROR psx_core::cpu]   464: 000019B8
[ERROR psx_core::cpu]   465: 00000E28
[ERROR psx_core::cpu]   466: 000019B8
[ERROR psx_core::cpu]   467: 00000E28
[ERROR psx_core::cpu]   468: 000019B8
[ERROR psx_core::cpu]   469: 00000E28
[ERROR psx_core::cpu]   470: 000019B8
[ERROR psx_core::cpu]   471: 00000E28
[ERROR psx_core::cpu]   472: 000019B8
[ERROR psx_core::cpu]   473: 00000E28
[ERROR psx_core::cpu]   474: 000019B8
[ERROR psx_core::cpu]   475: 00000E28
[ERROR psx_core::cpu]   476: 000019B8
[ERROR psx_core::cpu]   477: 8004B6AC
[ERROR psx_core::cpu]   478: 8004B8D4
[ERROR psx_core::cpu]   479: 00000E28
[ERROR psx_core::cpu]   480: 000019B8
[ERROR psx_core::cpu]   481: 00000E28
[ERROR psx_core::cpu]   482: 000019B8
[ERROR psx_core::cpu]   483: 00000E28
[ERROR psx_core::cpu]   484: 000019B8
[ERROR psx_core::cpu]   485: 00000E28
[ERROR psx_core::cpu]   486: 000019B8
[ERROR psx_core::cpu]   487: 00000E28
[ERROR psx_core::cpu]   488: 000019B8
[ERROR psx_core::cpu]   489: 00000E28
[ERROR psx_core::cpu]   490: 000019B8
[ERROR psx_core::cpu]   491: 00000E28
[ERROR psx_core::cpu]   492: 000019B8
[ERROR psx_core::cpu]   493: 00000E28
[ERROR psx_core::cpu]   494: 000019B8
[ERROR psx_core::cpu]   495: 00000E28
[ERROR psx_core::cpu]   496: 000019B8
[ERROR psx_core::cpu]   497: 00000E28
[ERROR psx_core::cpu]   498: 000019B8
[ERROR psx_core::cpu]   499: 00000E28
[ERROR psx_core::cpu]   500: 000019B8
[ERROR psx_core::cpu]   501: 00000E28
[ERROR psx_core::cpu]   502: 000019B8
[ERROR psx_core::cpu]   503: 00000E28
[ERROR psx_core::cpu]   504: 000019B8
[ERROR psx_core::cpu]   505: 00000E28
[ERROR psx_core::cpu]   506: 000019B8
[ERROR psx_core::cpu]   507: 00000E28
[ERROR psx_core::cpu]   508: 000019B8
[ERROR psx_core::cpu]   509: 00000E28
[ERROR psx_core::cpu]   510: 000019B8
[ERROR psx_core::cpu]   511: 00000E28
[ERROR psx_core::cpu]   512: 000019B8
[ERROR psx_core::cpu]   513: 00000E28
[ERROR psx_core::cpu]   514: 000019B8
[ERROR psx_core::cpu]   515: 00000E28
[ERROR psx_core::cpu]   516: 000019B8
[ERROR psx_core::cpu]   517: 00000E28
[ERROR psx_core::cpu]   518: 000019B8
[ERROR psx_core::cpu]   519: 00000E28
[ERROR psx_core::cpu]   520: 000019B8
[ERROR psx_core::cpu]   521: 00000E28
[ERROR psx_core::cpu]   522: 000019B8
[ERROR psx_core::cpu]   523: 00000E28
[ERROR psx_core::cpu]   524: 000019B8
[ERROR psx_core::cpu]   525: 00000E28
[ERROR psx_core::cpu]   526: 000019B8
[ERROR psx_core::cpu]   527: 00000E28
[ERROR psx_core::cpu]   528: 000019B8
[ERROR psx_core::cpu]   529: 8004B6AC
[ERROR psx_core::cpu]   530: 8004B8D4
[ERROR psx_core::cpu]   531: 00000E28
[ERROR psx_core::cpu]   532: 000019B8
[ERROR psx_core::cpu]   533: 00000E28
[ERROR psx_core::cpu]   534: 000019B8
[ERROR psx_core::cpu]   535: 00000E28
[ERROR psx_core::cpu]   536: 000019B8
[ERROR psx_core::cpu]   537: 00000E28
[ERROR psx_core::cpu]   538: 000019B8
[ERROR psx_core::cpu]   539: 00000E28
[ERROR psx_core::cpu]   540: 000019B8
[ERROR psx_core::cpu]   541: 00000E28
[ERROR psx_core::cpu]   542: 000019B8
[ERROR psx_core::cpu]   543: 00000D00
[ERROR psx_core::cpu]   544: 00000D00
[ERROR psx_core::cpu]   545: 00000D00
[ERROR psx_core::cpu]   546: 00000D00
[ERROR psx_core::cpu]   547: 00000D00
[ERROR psx_core::cpu]   548: 00000D00
[ERROR psx_core::cpu]   549: 00000D00
[ERROR psx_core::cpu]   550: 00000D00
[ERROR psx_core::cpu]   551: 00000D00
[ERROR psx_core::cpu]   552: 00000D00
[ERROR psx_core::cpu]   553: 00000D00
[ERROR psx_core::cpu]   554: 00000D00
[ERROR psx_core::cpu]   555: 00000D00
[ERROR psx_core::cpu]   556: 00000D00
[ERROR psx_core::cpu]   557: 00000D00
[ERROR psx_core::cpu]   558: 00000D00
[ERROR psx_core::cpu]   559: 00000D00
[ERROR psx_core::cpu]   560: 00000D00
[ERROR psx_core::cpu]   561: 00000D00
[ERROR psx_core::cpu]   562: 00000D00
[ERROR psx_core::cpu]   563: 00000D00
[ERROR psx_core::cpu]   564: 00000D00
[ERROR psx_core::cpu]   565: 00000D00
[ERROR psx_core::cpu]   566: 8004B6AC
[ERROR psx_core::cpu]   567: 8004B8D4
[ERROR psx_core::cpu]   568: 8004B6AC
[ERROR psx_core::cpu]   569: 8004B8D4
[ERROR psx_core::cpu]   570: 00000E28
[ERROR psx_core::cpu]   571: 000019B8
[ERROR psx_core::cpu]   572: 8004B6AC
[ERROR psx_core::cpu]   573: 8004B8D4
[ERROR psx_core::cpu]   574: 00000E28
[ERROR psx_core::cpu]   575: 000019B8
[ERROR psx_core::cpu]   576: 00000E28
[ERROR psx_core::cpu]   577: 000019B8
[ERROR psx_core::cpu]   578: 00000E28
[ERROR psx_core::cpu]   579: 000019B8
[ERROR psx_core::cpu]   580: 00000E28
[ERROR psx_core::cpu]   581: 000019B8
[ERROR psx_core::cpu]   582: 00000E28
[ERROR psx_core::cpu]   583: 000019B8
[ERROR psx_core::cpu]   584: 00000E28
[ERROR psx_core::cpu]   585: 000019B8
[ERROR psx_core::cpu]   586: 00000E28
[ERROR psx_core::cpu]   587: 000019B8
[ERROR psx_core::cpu]   588: 00000E28
[ERROR psx_core::cpu]   589: 000019B8
[ERROR psx_core::cpu]   590: 8004B6AC
[ERROR psx_core::cpu]   591: 8004B8D4
[ERROR psx_core::cpu]   592: 00000E28
[ERROR psx_core::cpu]   593: 000019B8
[ERROR psx_core::cpu]   594: 00000E28
[ERROR psx_core::cpu]   595: 000019B8
[ERROR psx_core::cpu]   596: 00000E28
[ERROR psx_core::cpu]   597: 000019B8
[ERROR psx_core::cpu]   598: 00000E28
[ERROR psx_core::cpu]   599: 000019B8
[ERROR psx_core::cpu]   600: 00000E28
[ERROR psx_core::cpu]   601: 000019B8
[ERROR psx_core::cpu]   602: 00000E28
[ERROR psx_core::cpu]   603: 000019B8
[ERROR psx_core::cpu]   604: 8004B6AC
[ERROR psx_core::cpu]   605: 8004B8D4
[ERROR psx_core::cpu]   606: 00000E28
[ERROR psx_core::cpu]   607: 000019B8
[ERROR psx_core::cpu]   608: 00000E28
[ERROR psx_core::cpu]   609: 000019B8
[ERROR psx_core::cpu]   610: 00000E28
[ERROR psx_core::cpu]   611: 000019B8
[ERROR psx_core::cpu]   612: 00000E28
[ERROR psx_core::cpu]   613: 000019B8
[ERROR psx_core::cpu]   614: 00000E28
[ERROR psx_core::cpu]   615: 000019B8
[ERROR psx_core::cpu]   616: 00000E28
[ERROR psx_core::cpu]   617: 000019B8
[ERROR psx_core::cpu]   618: 00000E28
[ERROR psx_core::cpu]   619: 000019B8
[ERROR psx_core::cpu]   620: 00000E28
[ERROR psx_core::cpu]   621: 000019B8
[ERROR psx_core::cpu]   622: 00000E28
[ERROR psx_core::cpu]   623: 000019B8
[ERROR psx_core::cpu]   624: 00000E28
[ERROR psx_core::cpu]   625: 000019B8
[ERROR psx_core::cpu]   626: 00000E28
[ERROR psx_core::cpu]   627: 000019B8
[ERROR psx_core::cpu]   628: 00000E28
[ERROR psx_core::cpu]   629: 000019B8
[ERROR psx_core::cpu]   630: 8004B6AC
[ERROR psx_core::cpu]   631: 8004B8D4
[ERROR psx_core::cpu]   632: 00000E28
[ERROR psx_core::cpu]   633: 000019B8
[ERROR psx_core::cpu]   634: 00000E28
[ERROR psx_core::cpu]   635: 000019B8
[ERROR psx_core::cpu]   636: 00000E28
[ERROR psx_core::cpu]   637: 000019B8
[ERROR psx_core::cpu]   638: 00000E28
[ERROR psx_core::cpu]   639: 000019B8
[ERROR psx_core::cpu]   640: 00000E28
[ERROR psx_core::cpu]   641: 000019B8
[ERROR psx_core::cpu]   642: 00000E28
[ERROR psx_core::cpu]   643: 000019B8
[ERROR psx_core::cpu]   644: 00000E28
[ERROR psx_core::cpu]   645: 000019B8
[ERROR psx_core::cpu]   646: 00000E28
[ERROR psx_core::cpu]   647: 000019B8
[ERROR psx_core::cpu]   648: 00000E28
[ERROR psx_core::cpu]   649: 000019B8
[ERROR psx_core::cpu]   650: 00000E28
[ERROR psx_core::cpu]   651: 000019B8
[ERROR psx_core::cpu]   652: 00000E28
[ERROR psx_core::cpu]   653: 000019B8
[ERROR psx_core::cpu]   654: 00000E28
[ERROR psx_core::cpu]   655: 000019B8
[ERROR psx_core::cpu]   656: 00000E28
[ERROR psx_core::cpu]   657: 000019B8
[ERROR psx_core::cpu]   658: 00000E28
[ERROR psx_core::cpu]   659: 000019B8
[ERROR psx_core::cpu]   660: 00000E28
[ERROR psx_core::cpu]   661: 000019B8
[ERROR psx_core::cpu]   662: 00000E28
[ERROR psx_core::cpu]   663: 000019B8
[ERROR psx_core::cpu]   664: 00000E28
[ERROR psx_core::cpu]   665: 000019B8
[ERROR psx_core::cpu]   666: 00000E28
[ERROR psx_core::cpu]   667: 000019B8
[ERROR psx_core::cpu]   668: 00000E28
[ERROR psx_core::cpu]   669: 000019B8
[ERROR psx_core::cpu]   670: 00000E28
[ERROR psx_core::cpu]   671: 000019B8
[ERROR psx_core::cpu]   672: 00000E28
[ERROR psx_core::cpu]   673: 000019B8
[ERROR psx_core::cpu]   674: 00000E28
[ERROR psx_core::cpu]   675: 000019B8
[ERROR psx_core::cpu]   676: 00000E28
[ERROR psx_core::cpu]   677: 000019B8
[ERROR psx_core::cpu]   678: 00000E28
[ERROR psx_core::cpu]   679: 000019B8
[ERROR psx_core::cpu]   680: 00000E28
[ERROR psx_core::cpu]   681: 000019B8
[ERROR psx_core::cpu]   682: 00000E28
[ERROR psx_core::cpu]   683: 000019B8
[ERROR psx_core::cpu]   684: 00000E28
[ERROR psx_core::cpu]   685: 000019B8
[ERROR psx_core::cpu]   686: 00000E28
[ERROR psx_core::cpu]   687: 000019B8
[ERROR psx_core::cpu]   688: 00000E28
[ERROR psx_core::cpu]   689: 000019B8
[ERROR psx_core::cpu]   690: 00000E28
[ERROR psx_core::cpu]   691: 000019B8
[ERROR psx_core::cpu]   692: 00000E28
[ERROR psx_core::cpu]   693: 000019B8
[ERROR psx_core::cpu]   694: 00000E28
[ERROR psx_core::cpu]   695: 000019B8
[ERROR psx_core::cpu]   696: 00000E28
[ERROR psx_core::cpu]   697: 000019B8
[ERROR psx_core::cpu]   698: 00000E28
[ERROR psx_core::cpu]   699: 000019B8
[ERROR psx_core::cpu]   700: 00000E28
[ERROR psx_core::cpu]   701: 000019B8
[ERROR psx_core::cpu]   702: 00000E28
[ERROR psx_core::cpu]   703: 000019B8
[ERROR psx_core::cpu]   704: 00000E28
[ERROR psx_core::cpu]   705: 000019B8
[ERROR psx_core::cpu]   706: 00000E28
[ERROR psx_core::cpu]   707: 000019B8
[ERROR psx_core::cpu]   708: 00000E28
[ERROR psx_core::cpu]   709: 000019B8
[ERROR psx_core::cpu]   710: 00000E28
[ERROR psx_core::cpu]   711: 000019B8
[ERROR psx_core::cpu]   712: 00000E28
[ERROR psx_core::cpu]   713: 000019B8
[ERROR psx_core::cpu]   714: 00000E28
[ERROR psx_core::cpu]   715: 000019B8
[ERROR psx_core::cpu]   716: 00000E28
[ERROR psx_core::cpu]   717: 000019B8
[ERROR psx_core::cpu]   718: 00000E28
[ERROR psx_core::cpu]   719: 000019B8
[ERROR psx_core::cpu]   720: 00000E28
[ERROR psx_core::cpu]   721: 000019B8
[ERROR psx_core::cpu]   722: 00000E28
[ERROR psx_core::cpu]   723: 000019B8
[ERROR psx_core::cpu]   724: 00000E28
[ERROR psx_core::cpu]   725: 000019B8
[ERROR psx_core::cpu]   726: 00000E28
[ERROR psx_core::cpu]   727: 000019B8
[ERROR psx_core::cpu]   728: 00000E28
[ERROR psx_core::cpu]   729: 000019B8
[ERROR psx_core::cpu]   730: 00000E28
[ERROR psx_core::cpu]   731: 000019B8
[ERROR psx_core::cpu]   732: 00000E28
[ERROR psx_core::cpu]   733: 000019B8
[ERROR psx_core::cpu]   734: 00000E28
[ERROR psx_core::cpu]   735: 000019B8
[ERROR psx_core::cpu]   736: 00000E28
[ERROR psx_core::cpu]   737: 000019B8
[ERROR psx_core::cpu]   738: 00000E28
[ERROR psx_core::cpu]   739: 000019B8
[ERROR psx_core::cpu]   740: 00000E28
[ERROR psx_core::cpu]   741: 000019B8
[ERROR psx_core::cpu]   742: 00000E28
[ERROR psx_core::cpu]   743: 000019B8
[ERROR psx_core::cpu]   744: 00000E28
[ERROR psx_core::cpu]   745: 000019B8
[ERROR psx_core::cpu]   746: 00000E28
[ERROR psx_core::cpu]   747: 000019B8
[ERROR psx_core::cpu]   748: 00000E28
[ERROR psx_core::cpu]   749: 000019B8
[ERROR psx_core::cpu]   750: 00000E28
[ERROR psx_core::cpu]   751: 000019B8
[ERROR psx_core::cpu]   752: 00000E28
[ERROR psx_core::cpu]   753: 000019B8
[ERROR psx_core::cpu]   754: 00000E28
[ERROR psx_core::cpu]   755: 000019B8
[ERROR psx_core::cpu]   756: 00000E28
[ERROR psx_core::cpu]   757: 000019B8
[ERROR psx_core::cpu]   758: 00000E28
[ERROR psx_core::cpu]   759: 000019B8
[ERROR psx_core::cpu]   760: 00000E28
[ERROR psx_core::cpu]   761: 000019B8
[ERROR psx_core::cpu]   762: 00000E28
[ERROR psx_core::cpu]   763: 000019B8
[ERROR psx_core::cpu]   764: 00000E28
[ERROR psx_core::cpu]   765: 000019B8
[ERROR psx_core::cpu]   766: 00000E28
[ERROR psx_core::cpu]   767: 000019B8
[ERROR psx_core::cpu]   768: 00000E28
[ERROR psx_core::cpu]   769: 000019B8
[ERROR psx_core::cpu]   770: 00000E28
[ERROR psx_core::cpu]   771: 000019B8
[ERROR psx_core::cpu]   772: 00000E28
[ERROR psx_core::cpu]   773: 000019B8
[ERROR psx_core::cpu]   774: 00000E28
[ERROR psx_core::cpu]   775: 000019B8
[ERROR psx_core::cpu]   776: 00000E28
[ERROR psx_core::cpu]   777: 000019B8
[ERROR psx_core::cpu]   778: 00000E28
[ERROR psx_core::cpu]   779: 000019B8
[ERROR psx_core::cpu]   780: 00000E28
[ERROR psx_core::cpu]   781: 000019B8
[ERROR psx_core::cpu]   782: 00000E28
[ERROR psx_core::cpu]   783: 000019B8
[ERROR psx_core::cpu]   784: 00000E28
[ERROR psx_core::cpu]   785: 000019B8
[ERROR psx_core::cpu]   786: 00000E28
[ERROR psx_core::cpu]   787: 000019B8
[ERROR psx_core::cpu]   788: 00000E28
[ERROR psx_core::cpu]   789: 000019B8
[ERROR psx_core::cpu]   790: 00000E28
[ERROR psx_core::cpu]   791: 000019B8
[ERROR psx_core::cpu]   792: 00000E28
[ERROR psx_core::cpu]   793: 000019B8
[ERROR psx_core::cpu]   794: 00000E28
[ERROR psx_core::cpu]   795: 000019B8
[ERROR psx_core::cpu]   796: 00000E28
[ERROR psx_core::cpu]   797: 000019B8
[ERROR psx_core::cpu]   798: 00000E28
[ERROR psx_core::cpu]   799: 000019B8
[ERROR psx_core::cpu]   800: 00000E28
[ERROR psx_core::cpu]   801: 000019B8
[ERROR psx_core::cpu]   802: 00000E28
[ERROR psx_core::cpu]   803: 000019B8
[ERROR psx_core::cpu]   804: 00000E28
[ERROR psx_core::cpu]   805: 000019B8
[ERROR psx_core::cpu]   806: 00000E28
[ERROR psx_core::cpu]   807: 000019B8
[ERROR psx_core::cpu]   808: 8004B6AC
[ERROR psx_core::cpu]   809: 8004B8D4
[ERROR psx_core::cpu]   810: 00000E28
[ERROR psx_core::cpu]   811: 000019B8
[ERROR psx_core::cpu]   812: 00000E28
[ERROR psx_core::cpu]   813: 000019B8
[ERROR psx_core::cpu]   814: 8004B6AC
[ERROR psx_core::cpu]   815: 8004B8D4
[ERROR psx_core::cpu]   816: 00000E28
[ERROR psx_core::cpu]   817: 000019B8
[ERROR psx_core::cpu]   818: 00000E28
[ERROR psx_core::cpu]   819: 000019B8
[ERROR psx_core::cpu]   820: 00000E28
[ERROR psx_core::cpu]   821: 000019B8
[ERROR psx_core::cpu]   822: 00000E28
[ERROR psx_core::cpu]   823: 000019B8
[ERROR psx_core::cpu]   824: 00000E28
[ERROR psx_core::cpu]   825: 000019B8
[ERROR psx_core::cpu]   826: 00000E28
[ERROR psx_core::cpu]   827: 000019B8
[ERROR psx_core::cpu]   828: 00000E28
[ERROR psx_core::cpu]   829: 000019B8
[ERROR psx_core::cpu]   830: 00000E28
[ERROR psx_core::cpu]   831: 000019B8
[ERROR psx_core::cpu]   832: 00000E28
[ERROR psx_core::cpu]   833: 000019B8
[ERROR psx_core::cpu]   834: 00000E28
[ERROR psx_core::cpu]   835: 000019B8
[ERROR psx_core::cpu]   836: 00000E28
[ERROR psx_core::cpu]   837: 000019B8
[ERROR psx_core::cpu]   838: 00000E28
[ERROR psx_core::cpu]   839: 000019B8
[ERROR psx_core::cpu]   840: 00000E28
[ERROR psx_core::cpu]   841: 000019B8
[ERROR psx_core::cpu]   842: 00000E28
[ERROR psx_core::cpu]   843: 000019B8
[ERROR psx_core::cpu]   844: 00000E28
[ERROR psx_core::cpu]   845: 000019B8
[ERROR psx_core::cpu]   846: 00000E28
[ERROR psx_core::cpu]   847: 000019B8
[ERROR psx_core::cpu]   848: 00000E28
[ERROR psx_core::cpu]   849: 000019B8
[ERROR psx_core::cpu]   850: 00000E28
[ERROR psx_core::cpu]   851: 000019B8
[ERROR psx_core::cpu]   852: 00000E28
[ERROR psx_core::cpu]   853: 000019B8
[ERROR psx_core::cpu]   854: 00000E28
[ERROR psx_core::cpu]   855: 000019B8
[ERROR psx_core::cpu]   856: 00000E28
[ERROR psx_core::cpu]   857: 000019B8
[ERROR psx_core::cpu]   858: 00000E28
[ERROR psx_core::cpu]   859: 000019B8
[ERROR psx_core::cpu]   860: 00000E28
[ERROR psx_core::cpu]   861: 000019B8
[ERROR psx_core::cpu]   862: 00000E28
[ERROR psx_core::cpu]   863: 000019B8
[ERROR psx_core::cpu]   864: 00000E28
[ERROR psx_core::cpu]   865: 000019B8
[ERROR psx_core::cpu]   866: 00000E28
[ERROR psx_core::cpu]   867: 000019B8
[ERROR psx_core::cpu]   868: 00000E28
[ERROR psx_core::cpu]   869: 000019B8
[ERROR psx_core::cpu]   870: 00000E28
[ERROR psx_core::cpu]   871: 000019B8
[ERROR psx_core::cpu]   872: 00000E28
[ERROR psx_core::cpu]   873: 000019B8
[ERROR psx_core::cpu]   874: 00000E28
[ERROR psx_core::cpu]   875: 000019B8
[ERROR psx_core::cpu]   876: 00000E28
[ERROR psx_core::cpu]   877: 000019B8
[ERROR psx_core::cpu]   878: 00000E28
[ERROR psx_core::cpu]   879: 000019B8
[ERROR psx_core::cpu]   880: 00000E28
[ERROR psx_core::cpu]   881: 000019B8
[ERROR psx_core::cpu]   882: 00000E28
[ERROR psx_core::cpu]   883: 000019B8
[ERROR psx_core::cpu]   884: 00000E28
[ERROR psx_core::cpu]   885: 000019B8
[ERROR psx_core::cpu]   886: 00000E28
[ERROR psx_core::cpu]   887: 000019B8
[ERROR psx_core::cpu]   888: 00000E28
[ERROR psx_core::cpu]   889: 000019B8
[ERROR psx_core::cpu]   890: 8004B6AC
[ERROR psx_core::cpu]   891: 8004B8D4
[ERROR psx_core::cpu]   892: 00000E28
[ERROR psx_core::cpu]   893: 000019B8
[ERROR psx_core::cpu]   894: 00000E28
[ERROR psx_core::cpu]   895: 000019B8
[ERROR psx_core::cpu]   896: 8004B6AC
[ERROR psx_core::cpu]   897: 8004B8D4
[ERROR psx_core::cpu]   898: 00000E28
[ERROR psx_core::cpu]   899: 000019B8
[ERROR psx_core::cpu]   900: 00000E28
[ERROR psx_core::cpu]   901: 000019B8
[ERROR psx_core::cpu]   902: 00000E28
[ERROR psx_core::cpu]   903: 000019B8
[ERROR psx_core::cpu]   904: 00000E28
[ERROR psx_core::cpu]   905: 000019B8
[ERROR psx_core::cpu]   906: 00000E28
[ERROR psx_core::cpu]   907: 000019B8
[ERROR psx_core::cpu]   908: 00000E28
[ERROR psx_core::cpu]   909: 000019B8
[ERROR psx_core::cpu]   910: 00000E28
[ERROR psx_core::cpu]   911: 000019B8
[ERROR psx_core::cpu]   912: 00000E28
[ERROR psx_core::cpu]   913: 000019B8
[ERROR psx_core::cpu]   914: 00000E28
[ERROR psx_core::cpu]   915: 000019B8
[ERROR psx_core::cpu]   916: 00000E28
[ERROR psx_core::cpu]   917: 000019B8
[ERROR psx_core::cpu]   918: 00000E28
[ERROR psx_core::cpu]   919: 000019B8
[ERROR psx_core::cpu]   920: 8004B6AC
[ERROR psx_core::cpu]   921: 8004B8D4
[ERROR psx_core::cpu]   922: 00000E28
[ERROR psx_core::cpu]   923: 000019B8
[ERROR psx_core::cpu]   924: 00000E28
[ERROR psx_core::cpu]   925: 000019B8
[ERROR psx_core::cpu]   926: 00000E28
[ERROR psx_core::cpu]   927: 000019B8
[ERROR psx_core::cpu]   928: 00000E28
[ERROR psx_core::cpu]   929: 000019B8
[ERROR psx_core::cpu]   930: 8004B6AC
[ERROR psx_core::cpu]   931: 8004B8D4
[ERROR psx_core::cpu]   932: 00000E28
[ERROR psx_core::cpu]   933: 000019B8
[ERROR psx_core::cpu]   934: 00000E28
[ERROR psx_core::cpu]   935: 000019B8
[ERROR psx_core::cpu]   936: 00000E28
[ERROR psx_core::cpu]   937: 000019B8
[ERROR psx_core::cpu]   938: 00000E28
[ERROR psx_core::cpu]   939: 000019B8
[ERROR psx_core::cpu]   940: 00000E28
[ERROR psx_core::cpu]   941: 000019B8
[ERROR psx_core::cpu]   942: 00000E28
[ERROR psx_core::cpu]   943: 000019B8
[ERROR psx_core::cpu]   944: 00000E28
[ERROR psx_core::cpu]   945: 000019B8
[ERROR psx_core::cpu]   946: 00000E28
[ERROR psx_core::cpu]   947: 000019B8
[ERROR psx_core::cpu]   948: 00000E28
[ERROR psx_core::cpu]   949: 000019B8
[ERROR psx_core::cpu]   950: 00000E28
[ERROR psx_core::cpu]   951: 000019B8
[ERROR psx_core::cpu]   952: 00000E28
[ERROR psx_core::cpu]   953: 000019B8
[ERROR psx_core::cpu]   954: 00000E28
[ERROR psx_core::cpu]   955: 000019B8
[ERROR psx_core::cpu]   956: 00000E28
[ERROR psx_core::cpu]   957: 000019B8
[ERROR psx_core::cpu]   958: 00000E28
[ERROR psx_core::cpu]   959: 000019B8
[ERROR psx_core::cpu]   960: 00000E28
[ERROR psx_core::cpu]   961: 000019B8
[ERROR psx_core::cpu]   962: 00000E28
[ERROR psx_core::cpu]   963: 000019B8
[ERROR psx_core::cpu]   964: 8004B6AC
[ERROR psx_core::cpu]   965: 8004B8D4
[ERROR psx_core::cpu]   966: 00000E28
[ERROR psx_core::cpu]   967: 000019B8
[ERROR psx_core::cpu]   968: 00000E28
[ERROR psx_core::cpu]   969: 000019B8
[ERROR psx_core::cpu]   970: 00000E28
[ERROR psx_core::cpu]   971: 000019B8
[ERROR psx_core::cpu]   972: 00000E28
[ERROR psx_core::cpu]   973: 000019B8
[ERROR psx_core::cpu]   974: 00000E28
[ERROR psx_core::cpu]   975: 000019B8
[ERROR psx_core::cpu]   976: 00000E28
[ERROR psx_core::cpu]   977: 000019B8
[ERROR psx_core::cpu]   978: 00000E28
[ERROR psx_core::cpu]   979: 000019B8
[ERROR psx_core::cpu]   980: 00000E28
[ERROR psx_core::cpu]   981: 000019B8
[ERROR psx_core::cpu]   982: 00000E28
[ERROR psx_core::cpu]   983: 000019B8
[ERROR psx_core::cpu]   984: 00000E28
[ERROR psx_core::cpu]   985: 000019B8
[ERROR psx_core::cpu]   986: 00000E28
[ERROR psx_core::cpu]   987: 000019B8
[ERROR psx_core::cpu]   988: 00000E28
[ERROR psx_core::cpu]   989: 000019B8
[ERROR psx_core::cpu]   990: 00000E28
[ERROR psx_core::cpu]   991: 000019B8
[ERROR psx_core::cpu]   992: 8004B6AC
[ERROR psx_core::cpu]   993: 8004B8D4
[ERROR psx_core::cpu]   994: 00000E28
[ERROR psx_core::cpu]   995: 000019B8
[ERROR psx_core::cpu]   996: 00000E28
[ERROR psx_core::cpu]   997: 000019B8
[ERROR psx_core::cpu]   998: 00000E28
[ERROR psx_core::cpu]   999: 000019B8
[ERROR psx_core::cpu]   1000: 00000E28
[ERROR psx_core::cpu]   1001: 000019B8
[ERROR psx_core::cpu]   1002: 00000E28
[ERROR psx_core::cpu]   1003: 000019B8
[ERROR psx_core::cpu]   1004: 00000E28
[ERROR psx_core::cpu]   1005: 000019B8
[ERROR psx_core::cpu]   1006: 00000E28
[ERROR psx_core::cpu]   1007: 000019B8
[ERROR psx_core::cpu]   1008: 00000E28
[ERROR psx_core::cpu]   1009: 000019B8
[ERROR psx_core::cpu]   1010: 00000E28
[ERROR psx_core::cpu]   1011: 000019B8
[ERROR psx_core::cpu]   1012: 00000E28
[ERROR psx_core::cpu]   1013: 000019B8
[ERROR psx_core::cpu]   1014: 00000E28
[ERROR psx_core::cpu]   1015: 000019B8
[ERROR psx_core::cpu]   1016: 80011C0C
[ERROR psx_core::cpu]   1017: 00000E28
[ERROR psx_core::cpu]   1018: 000019B8
[ERROR psx_core::cpu]   1019: 00000E28
[ERROR psx_core::cpu]   1020: 000019B8
[ERROR psx_core::cpu]   1021: 00000E28
[ERROR psx_core::cpu]   1022: 000019B8
[ERROR psx_core::cpu]   1023: 00000E28
[ERROR psx_core::cpu]   1024: 000019B8

Sound keeps repeating

Sometimes, some sound effects get stuck in a loop. For example in King's Field II, when hitting, the sound of the hit keeps repeating forever, when hitting again you get two overlapping infinite sounds. This is also present in other games, but its the clearest in this game.

This may be due to wrong handling of ADPCM looping.

Fix input delay in Crash2 (and maybe other games)

After the performance increased a lot by #3 and #5, a delay in PAD input was introduced, and its very high with higher FPS and performance.

Maybe it is related to the GPU being multi-threaded? Maybe we are drawing way behind schedule.
Another idea, is that this may be related to the game itself and how the BIOS work and registers the input.

Cdrom improvements and additional features

We want to continue #34 more. Here is what is missing from the cdrom:

  • The Play command
  • Handling of multiple tracks files
  • Implement 0x10 cmd, GetLocL, and in general better handling of the L offset and P offsets

Reduce Deps

Would be good to reduce deps where possible, for example clap and any other deps we might not really need.

Testing

We should use roms to automate testing, and thus reduce bugs in the future.

Implement better GPU debugging

Several things we can add to improve gpu debugging and help for example fix #7 .

  • Ability to clock one gpu frame at a time.
  • Store the draw commands for a frame, and allow to reply.
  • Allow to easily modify the saved commands, so we can know which command results in a rendering bug.
  • Would be useful to warn if the command will perform breaking action, for example, if the commands read into RAM and then modify the content. Not sure exactly how this will work, but generally a kind of safety mechanism so that we don't corrupt the gpu/ram memories.

Improving performance

The emulator, even with multi-threaded GPU doesn't run to the speed we need (60 FPS).
We need to find where we can improve the emulator speed.

Handle Transparency modes better in the GPU

One of the things that impact performance the most is the use of different types of semi-transparency modes, especially mode=3. Some of these games are Need for Speed - High Stakes
Its bad because it leads to us flushing the drawing buffer and calling vkDraw for every polygon for example, which is very bad.

Currently, we are batching by several parameters and one of them is the semi-transparency-mode

I think a good approach is to optimize this is to batch multiple draws from different semi-transparency-mode.

One idea to do this is to use 2 back-images and switch between them on every batch, and handle all semi-transparency inside the shaders.
We can batch multiple draws that don't intersect. Of course this could be easily defeated if some games draw triangles on top of each other a lot of the times.
This may not be perfect, but we can check and see which works better.

Debugger improvements

  • Adding step out command for the debugger
  • Adding hooks to run on breakpoints (separated by ;?)
  • print the instruction for the trace before running, its very annoying when I read jal, and I hit step-over but it doesn't work because its too late

In #16 command input handling is done by the backend psx-core through the tty, which is not ideal for automated access, maybe this should be converted into an API interface

Multithread GPU

The performance is not good now, and its mainly due to the GPU. The PSX architecture has the GPU running in different clock speed from the CPU. Because of these reasons, its really easy to split the GPU from the rest.

Artifacts on rendering

Sometimes in Crash2 there is artifacts and slight glitches in GPU rendering.

Maybe the issue is related to using the command buffer for polyline and polygon commands? maybe we should flush when the render mode changes.

GPU sync problem

When was working on MDEC (#15), there was an issue when testing with the mdec test from JaCzekanski_tests.

The issue is that the gpu DMA (2), would hang in the middle, because it would set the CPUtoVRAM blit command, and then the flag READY_FOR_CMD_RECV should be cleared, but because we are doing it in another thread, there seems to be a delay after the command is written to the GPU and the flag being cleared.
Not sure why, but the test rom will hang (maybe bug in the library that handles GPU DMA), but the GPU sync should be fixed anyway this will help make the GPU more accurate and hopefully fixes more bugs (#7 ?)

use `tock_registers` instead of `bitflags`

Originated idea from #30.

tock_registers Is a library to represent hardware registers, it was created for MMIO and such stuff, but we don't need the unsafe volatile read/write, we can just use the interface they provide.

I was thinking of also creating a custom libarary that does this, and would probably do if this library doesn't meet my needs

Weird issue in King's Field II, freeze processing on some areas

After starting new world, if you walk to the front for a bit until you see the gold coin, you will notice the FPS drops to 2 then continue normal, and keeps this sudden drop in FPS.

Looking at the profiler, the CPU (host) is not running at that time, meaning that there is some IO we are waiting for, either in the GPU or somewhere else.

Not sure what's in that area, but I suspect the GPU, maybe something to do with transparency for example.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.