Commit graph

502 commits

Author SHA1 Message Date
Michel Heily 8b6d356924 Add new project icon
Derived from rusts' lovely public domain mascot, Ferris the crab!

The design is based from https://rustacean.net/assets/rustacean-flat-happy.svg


Former-commit-id: cac7eb31b5913a9a536c55f474018db0c2d7e2a8
2020-04-10 16:45:55 +03:00
Michel Heily b21cd1e3d9 Refactor project workspace and fix build
Former-commit-id: 8e264cdbc9e5290654c29e6893a121bce73c29c9
2020-04-10 00:53:41 +03:00
Michel Heily 3db61d1804 android: Add color correction shader setting
Former-commit-id: 894a0d6d6a07b16d3333739d565bba853ce13fc4
2020-04-10 00:39:28 +03:00
Michel Heily 2aa0eec95e android: Putting in work
- Landscape layout.
- Snapshot viewer is now a fragment for future re-use.
- Bugfixes
- Etc'


Former-commit-id: 34365fd143cefdc2b1bb3b68a62f62849f442fa1
2020-04-10 00:39:28 +03:00
Michel Heily 46287ca88d android: Use OpenGLES2 for rendering the screen instead of ImageView
Former-commit-id: 80d96928dabaa215d0b8812e203d65193ac85cc8
2020-04-10 00:39:28 +03:00
Michel Heily b270265694 android: Implement emulator audio playback
Former-commit-id: 5d0daee9e7616212aa184e31be360b0110b4c054
2020-04-10 00:39:28 +03:00
Michel Heily 40360f7839 jni: Add bindings for audio
Former-commit-id: 8885208102d51fdf9585a76a31f9ee50f5a5086d
2020-04-10 00:39:28 +03:00
Michel Heily e75c3289cd android: WIP snapshot manager
Former-commit-id: 7b39e4ac1ea86262a0a1ccf95639382f20801d92
2020-04-10 00:39:40 +03:00
Michel Heily fc8b066191 jni: Render directly to the java frame buffer
Former-commit-id: 1647ad7859ad4558ba9626a1ef7afe2ceb1967f4
2020-04-10 00:39:32 +03:00
Michel Heily ef70f3bafc feat/android: Add PoC android project
Former-commit-id: 48e47374f4782976d509cc52a2998786073261ea
2020-04-10 00:39:29 +03:00
Michel Heily a18ea022cd arm7tdmi: Small optimizations
Former-commit-id: 3348eae804c85f49231aa95e6436655c1a7c692f
2020-04-10 00:36:10 +03:00
Michel Heily 8f8204a52b Optimize emulator frame loop
Syncronize to number of cycles performed instead of VCOUNT when
emulating a frame


Former-commit-id: 0f9afe6a95a576dbb7a15cd1bf6bfb7d7ce02fff
2020-04-10 00:35:59 +03:00
Michel Heily ff95b67ae1 Update gdbstub crate to version 0.1.2 and run cargo-update
Former-commit-id: 2db24a3f835b817519cc544d722c58437e98011f
2020-04-07 23:57:29 +03:00
Michel Heily fb93ebb4ed feat/arm7tdmi_dispatch_table: Done!
Moved away from using lazy_static for this one since every access to a
lazy_static reference adds a runtime check, Currently using a build.rs script to generate a const table instead.

Worked out the ARM decoding issues, seems to run fine now.

Though the dynamic decoding for ARM is broken now since I had to change things in Data Processing and MSR instructions

TODO use `const fn` when it becomes stable


Former-commit-id: ba09748ff74a403c7016adcbe0ca553b591f6855
2020-04-07 02:31:13 +03:00
Michel Heily ad232227c1 Refactor ARM format names
Former-commit-id: b99e03669e2c1ccadbd13d2f06eb7127e2145f2b
2020-04-07 02:30:22 +03:00
Michel Heily a523a37d32 [WIP] Start working on arm7tdmi dispatch table.
Lookup tables are generally faster than matching in most architectures.
There is some trouble in decoding some arm data processing instructions
so this is non-default feature for now

* Crashes on armwrestler but many games seem to work


Former-commit-id: 3c06ea344ae0097947d8cd5bd05b1f882c7f743a
2020-04-07 02:30:22 +03:00
Michel Heily 8f11bebd2b fix/performance/accuracy: Reimplement sysbus stall cycle counting.
Previously I did not account for gamepak 32-bit accesses being two 16bit (NSEQ+SEQ or SEQ+SEQ) accesses,
This resulted in less cycles being accounted for, resulting in more wasted CPU cycles per frame and was a huge performance hit.

I re-implemented this with look-up-tables also to speed up the cycle
count routing `SysBus::get_cycles` and also account for 32bit gamepak memory access.


Former-commit-id: fe6a9a570c843d40e38971a2a36e6511df1b8894
2020-04-04 13:55:40 +03:00
Michel Heily c4c8163b0e optimize/timers: Get rid of the while loop in Timer::update.
Profiling with 'perf' I discovered that too much time was spent inside
Timer::update when the prescalar was 0 (frequency of 1 cycle).
This was due to the while loop I used. I optimized this loop out and
there is an appearent performance increase.

Former-commit-id: d228450625fad003f054e3161f6eeee888245cac
2020-04-04 13:43:57 +03:00
Michel Heily f0aa671674 optimize/cpu: Pass Arm/Thumb Instruction and other large structs as references.
Also, get rid of unnecessary derive Copy.

Since the ArmInstruction (and Thumb) derived from Copy, the compiler
always saves them to the stack when they are passed by value to other
functions, thus making some unwanted performance overhead.

I removed the derive Copy, and also pass them as references. This
project has a lot of "derive Copy" everywhere, and I should take note if
this is happenning elsewhere aswell.


Former-commit-id: 2f94c6050fa26c5b777244bd26706d4e6e2f0dc9
2020-03-28 16:14:59 +03:00
Michel Heily 2af9249a6c optimize/arm: Force inlining.
This functions were not inlined by the optimizer


Former-commit-id: aa02a3f5e6d33f16c298bc655c8d3a244c2ef946
2020-03-28 16:14:59 +03:00
Michel Heily d9ce1c7d8d optimize/arm: Improve arm instruction condition check.
Obviously AL(always) instructions are the most common, so prioritize checking these first.


Former-commit-id: e236f1e116dbf65757a68dda9090645d220a1cee
2020-03-28 16:14:59 +03:00
Michel Heily 414c1b0557 optimize/gpu: Optimize read_pixel_index calls inside render loops.
Former-commit-id: 763b24a151ddd3dcb69afacabcb214b26ad03052
2020-03-28 16:14:59 +03:00
Michel Heily 699b2decd2 core/gpu/bugfix: Support firing HBlank IRQs during VBlank
This commit fixes #43


Former-commit-id: 6a4367282c673a35316643e16413f9a602094d9d
2020-03-13 16:29:12 +02:00
Michel Heily 7f34e8bd08 core/gpu/bugfix: Use correct bitmask when writing to DISPSTAT
Accidently used 5 (0b0101) instead of 7 (0b0111)


Former-commit-id: f690dd3f591bef10c5dd280d46be22cd339498a2
2020-03-13 16:29:12 +02:00
Michel Heily aa0f708302 chore: Update Cargo.lock
Former-commit-id: 4f4fae3b12ab027a34cc5080dd041d5e09ce3e64
2020-02-28 15:11:02 +02:00
Michel Heily 6344744414 feat/jni: More work on JNI bindings
Former-commit-id: 125f764bd17ee9add3221cd6b64cde6edb592255
2020-02-28 15:11:02 +02:00
Michel Heily 84db854a06 chore: Make GameBoyAdvance the the bios argument as boxed slice rather then a Vec
On windows, the Vec may sit on the stack..


Former-commit-id: b8aa77858291c1b7ee6bfbfbec92646f18e819de
2020-02-28 15:11:02 +02:00
Michel Heily c4e8c71d1f sysbus: Make BoxedMemory a transparent struct
Former-commit-id: fc07876e9f73928eb2aaa6fcd4cba081a35745b9
2020-02-28 15:11:02 +02:00
Michel Heily c5b9c68d5e feat/jni: Cleanup & Improve jni bindings
- Wrap static globals with a mutex.
- Implement InputInterface

Testing this on a standalone Java Console Application (without
rendering) shows sufficiant performanse for now (AVG fps of 180 in the bios)


Former-commit-id: cfbb9abb7e91b04258c41fc20e8a22c16d797386
2020-02-28 15:11:02 +02:00
Michel Heily c68b9502fe bugfix: Fix bad write impl of DISPSTAT again.
I should really pay more attention to the docs..
The previous fix (bb843ea5) was not enough as it caused vblank,hblank
and vcount-match flags to be overwritten when they really should have
just been ignored.

This caused Dragon Ball - Advance Adevnture to fail booting


Former-commit-id: 1810e32692a0abd79f2df385c7c822debf186c79
2020-02-28 15:05:06 +02:00
Michel Heily d938767430 feat/jni: Add rustboyadvance-jni crate to export some simple JNI bindings
Former-commit-id: d4e7a622a97215a8c1b7b50bb7f08d18cb9c5716
2020-02-23 00:30:38 +02:00
Michel Heily 778274b5ae refactor: split "plat" binaries into separate crates
Former-commit-id: 73554b0128e036279f7ac895acb57d8f89cb1c96
2020-02-23 00:30:38 +02:00
Michel Heily c50ab1ecd8 feat: Add basic gdbserver feature
Initially I began implementing the gdb protocol on my own, but I then found a
nice work-in-progress crate on https://github.com/daniel5151/gdbstub
that suited my needs.


Former-commit-id: f77557cbbd8652c2ed05ac439efc1956d8e99729
2020-02-21 22:12:58 +02:00
Michel Heily 96cacb5f4c chore: Update .travis.yml
Former-commit-id: c529a4740c8d81e09a7a65648d9d2d77905e1146
2020-02-21 22:07:06 +02:00
Michel Heily b333ae7f65 rustfmt
Former-commit-id: a73535e556d1fb44e30927f0ab1f6238a8df8739
2020-02-21 14:08:08 +02:00
Michel Heily 0476342278 bugfix: Fix a bug where sprites were not rendered in bitmap modes.
I misunderstood the docs ^^


Former-commit-id: 157ae0dec037be3718b7a28314ba3b2eeb85cca0
2020-02-19 01:39:47 +02:00
Michel Heily a585753dc2 fix: Allow writes to DirectSound FIFOs in 8bit granularity
This fixes audio in games that directly write to sound FIFO using STRB instructions.


Former-commit-id: 3efb686b28146c414d5fad289f958346a9a5db6e
2020-02-18 22:29:54 +02:00
MishMish 1a382b4cee Update README.md
Former-commit-id: e1ff263d66abf91ebedc7863148b9203466f424d
2020-02-17 23:57:51 +02:00
Michel Heily c96fa38a2d bugfix: Fix improper write to DISPSTAT register
For some reason, probably typing mistkae, I `or`ed the value being written to DISPSTAT,
causing bits to never actually turn off, affectivly making HBLANK/VBLANK
interrupts linger forever.

This probably has caused some nasty glitches that I don't even know of, but two confirm issues solved
by this are Mariokart and Pacman.

This commit fixes #14 and #13


Former-commit-id: 72ad6efcb9e8f6b582d9279c5daab2603d5a408e
2020-02-16 01:46:51 +02:00
Michel Heily 392ad1bd71 gpu: Refactor Gpu::bg to Gpu::background
Former-commit-id: 78aa4ad525ba9df0a4944dfac0c5723e35633390
2020-02-16 01:40:59 +02:00
Michel Heily aeab3a82a3 Return to rust stable, get rid of nightly features for now
Former-commit-id: 1550bc0f70218c8a012f0631502eabbdf835d0ab
2020-02-14 14:33:22 +02:00
Michel Heily 11fb9d7eda Fix panic when fs::create_dir fails for LOG_DIR when it already exists
Former-commit-id: a332a8aadc8322650beaf9ff7eead4ac162c6eec
2020-02-14 14:26:45 +02:00
Michel Heily b03fe3567e Fix all warnings during build
Ran cargo-fix to automatically fix most of the build warnings,
Cleaned up dead code, and fix the rest manually


Former-commit-id: f35faba46b40eaf9c047efb8ab1e77ffa24d41b6
2020-02-14 14:21:45 +02:00
Michel Heily 0c2da2ae46 refactor: Refactor instruction decoding to panic instead of returning a Result
flamegraph shows too much time is being spent 'unwraping' decoded
instructions


Former-commit-id: e89072e6cf648e83f87d8c01891f50474246a36b
2020-02-14 13:05:14 +02:00
Michel Heily 69aadb9d92 Fix broken tests due to recent arm7tdmi changes
Former-commit-id: e1a5ec4ce3cb4c61bf6f511babfa8da8efd7321f
2020-02-14 13:02:56 +02:00
Michel Heily 84004ddb5c windows: Add file icon to build targets
Former-commit-id: 2dae2e7818d86ddf9470afafd0404f0e7e021718
2020-02-12 22:18:58 +02:00
Michel Heily 32a20d2cbb ptimize: CPU Pipeline optimization part 3
Move reload_pipeline calls inside instructions.
This commit yeilds yet another 5% performance improvment.

The next step is to move `advance_pc` into the instructions themselves
and save the `match result` per executed instruction


Former-commit-id: 42193ffc48fda9943665e6a74e873186627a0b4a
2020-02-11 02:26:17 +02:00
Michel Heily 6beec306c2 optimize: CPU Pipeline optimization part 2
Optimize redundent pipeline stages
About 5% performance gain.

Also rustfmt..


Former-commit-id: 2f5fc95798e97eb963fea976866bbeaf637084b0
2020-02-11 02:26:17 +02:00
Michel Heily 1f79205f51 optimize: CPU Pipeline optimization part 1
In preperation for later optimization in the CPU pipeline
implementation, this commit refactors the arm/thumb exec functions to return a
CpuAction (Whether to advance the program counter or to flush the
pipeline)

Currently, a lot of host cycles are wasted in the arm7tdmi pipeline
Refill1 & Refill2 states. Optimizing these steps out would make the CPU
a bit faster.


Former-commit-id: 9be7966eaad22cceeb443fcc5823bbd945284027
2020-02-11 02:26:17 +02:00
Michel Heily 7736154b50 fix: Use flush_pipeline16 when branch exchange changes CPU to thumb mode
Former-commit-id: 6f9c01c6f7ad7be2889a18ca66f7d310fcaa7c35
2020-02-11 02:26:17 +02:00