summaryrefslogtreecommitdiff
path: root/pandora/readme.txt
blob: 68ef578c6faaeeac0676c40abea314730ed35eba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
-- porter's foreword --

This is a Pandora port of Exophase's impressive GBA emulator, gpSP.
Since nobody has released a functional port for more than a year after
pandora's release, and the GINGE'd version doesn't do this emulator
justice, I've decided to take this task. This version also includes
my own tweaks from GP2X/Wiz version. In case anyone wonders, this
release was done with author's consent.

To use it, you'll first need to copy authentic GBA BIOS to gpSP
appdata directory, which usually is <SD card>/pandora/appdata/gpsp/ .
It must be named gba_bios.bin and should be 16kB in size.

I've appended the original gpSP GP2X and PSP readme files as they
contain lots of information that is still relevant for this version,
as well as development history of this project.

- notaz

Changelog:

0.9-2xb u8
- fixed tv-out
- integrated M-HT's neon scalers
- merged an assorment of calc84maniac's bugfixes

0.9-2xb u7
- Pandora port, using hardware scaler for video output.
- Fixed a few portablility issues in ARM asm and sound code.
- Tweaked timing to suit pandora's LCD refresh nicely.
- Maybe fixed GBC/digital sound channel desync over time.
- Some other not-that-relevant cleanups and tweaks.

Source code should be available at:
http://notaz.gp2x.de/cgi-bin/gitweb.cgi



-- gameplaySP2X  Gameboy Advance emulator for GP2X --

gpSP2X is a version of my (Exophase)'s emulator originally for Sony PSP.
A large amount of effort has been done to make it more optimized for the
ARM CPU present in the GP2X, however it is still very much a work in
progress.

See readme.txt for the PSP version readme, which contains a lot of
information relevant to the GP2X version (note that some of it does
not apply however).


Changelog:

0.9-2xb u6
- Fixed clock and scaling config saving.
- Fixed occasional crash on first ROM load on 1.1 firmware.
- Added LCD timing setup code, which can be controlled through
  'pollux_dpc_set' environment vatiable (see gpsp.gpe wrapper script).

0.9-2xb u5
- Added portrait drawing modes. They eliminate tearing but are slightly
  slower.
- Added page scrolling in ROM browser with L/R.
- 32MB ROM support fixed.

0.9-2xb u4 (unofficial notaz release, done on Exophase's request)
- Wiz port. No emulation related changes.
- Wiz: dropped SDL for video and hitting hardware directly (GPH SDL can't
  be trusted, it doesn't do double buffering as of firmware 1.0).
- Added new optimized software scaler with interpolation.
- gpSP is now saving ROM dir on exit. Delete romdir.txt if you don't
  want that.
- gpSP now comes with wARM, new kernel module+lib for ARM cache control
  (replaces mmuhack).
- gpSP no longer invalidates whole icache after recompilation, might
  cause minor speedup.

0.9-2xb u3 (unofficial notaz release, released with permission):
- Removed built-in CPU/LCD/RAM-Tweaker.
- Improved usability of volume control.
- Removed PSP-specific GUI options, adjusted help text.
- Overclocking from menu now works, keep it at 200 if you don't want that
  (if you want to overclock using launcher, for example).
- Fixed centering-on-first-run problem.
- 3:2 scaled option now does what it says.

0.9-2xb u2 (unofficial notaz release):
- Replaced non-working mmuhack.o with proper one, added cache flush calls
  to avoid artifacts.

0.9-2xb u1 (unofficial notaz release):
- Fixed a problen in thread synchronization which caused deadlock after
  some time.

0.9-2xb: 
-- IMPORTANT-- If you're overwriting an old version, be sure to delete the
   gpsp.cfg file first, or be prepared to have a bunch of weird button
   settings that would require fixing.

- Fixed some bugs stunting compatability.
- Optimized alpha blends in renderer.
- Some more optimizations to dynarec output.
- Savestates should work better now.
- Cheat/misc menu won't crash the emulator.
- Main button config window works (not all buttons are in yet)

0.9-2Xa: (Exophase release)
- Redid autoframeskip. Should work more reliably.
- Rewrote dynamic recompiler from x86 source (arm_emit.h, arm_stub.S).
  Has some more sophisticated behavior than the last version, more is
  still to come... Should notice a slight speed improvement over the
  last version.
- Tweaked GUI to be a little more useable. Buttons are now mirroring the
  PSP version's.
- Code unification + cleanup amongst versions.


v9008: (zodttd release)
- Updated the way autoframeskip works. Should be better now. Still has a max
  frameskip value.
- Added a slight performance increase to the dynarec.
- Added sync() to make sure files such as savestates and in-game saves are
  saved properly to the GP2X.

v9006: (zodttd release)
- Initial public release


Installation:

1. Place the "gpsp.gpe" and "game_config.txt" file in a directory on your SD
   card used with the GP2X.

2. Place your GBA BIOS in the directory from step 1. This file must be named
   "gba_bios.bin" in all lowercase as shown, so rename it if needed.

   -- NOTE --

   There are two commonly available BIOSes - one is the correct one used in
   production GBA's worldwide and the other is a prototype BIOS. The latter
   will not cause some games to not work correctly or crash. If you attempt
   to use this BIOS you will be presented with a warning before being
   allowed to continue. This screen will give you a checksum of the real
   BIOS image (see readme.txt for further information).

3. Place your GBA games in the directory from step 1. These files should have
   a ".gba" or ".bin" file extension. Zip compressed games should be supported
   and are recognized with the ".zip" file extension. Note that 32MB ROMs will
   probably not run if zipped. 16MB and smaller should be OK.

4. Done. Run gpsp.gpe.


Controls:

How to use gpSP on the GP2X:
Buttons are mapped as follows (GBA/ingame buttons can be changed in the menu):

GP2X--------------------GBA
X           ->          A
B           ->          B
L TRIG      ->          L TRIG
R TRIG      ->          R TRIG
START       ->          START
SELECT      ->          SELECT

GP2X--------------------------------gpSP

-- IN-GAME --

VOL MIDDLE (UP + DOWN)    ->        menu
PUSH STICK                ->        fps display toggle (second number is
                                     frames actually drawn)

-- IN-MENU --
B                         ->        select option
X                         ->        cancel/exit menu
A                         ->        escape (up one director level in the
                                     file selector)

When gpSP is started, you are presented with the option to overclock your
GP2X. Use the L/R TRIG to change the CPU clockspeed and press START to
continue. You may also change RAM timings here - experiment with what
works well. Note that going too high on overclocking or low on RAM
timings can cause the game to crash or the GP2X to outright freeze up.

If you do not want to overclock, press START without using L/R.
You will now be presented with a menu to choose a game. Press the IN-MENU
"SELECT" button shown above to pick a game to load.

If you would like to test gpSP for the GP2X with a homebrew (free public
domain) game, a game by Russ Prince works very well with gpSP. It is called
Bust-A-Move and is a remake of the classic game it's named after.


How to build from source:

The makefile included in the source is geared towards the Open2x toolchain.
If you use Open2x and installed it in the way recommended then it should
work okay, assuming you also have up to date HW-SDL (and have
arm-linux-sdl-config installed in the right place). The makefile is in the
gp2x directory, so go there first then just type make to build gpsp.gpe.
Might need a little tweaking if your setup is different. If you need help
you can ask me, but I'll probably nag you about why you want to build it in
the first place.


GP2X version FAQ:

Q) Help! This game doesn't work. Am I using a bad version of the ROM?

A) First, make sure you're using the correct BIOS version. If you aren't
   gpSP should tell you. Other than that, there are some games that are
   known to not work now (and will probably work later), and perhaps
   many more games that I don't know about that don't work. I haven't
   launched a full scale compatability test at this version, so it might
   take a while before the compatability levels are high.


Q) Why is this version slower than the PSP version?

A) gpSP is still a work in progress. It might be possible to obtain more
   speed from both this version and the PSP one too (and others in the
   future). With that in mind, know that even a very agressively overclocked
   GP2X is still less powerful than a PSP, generally speaking. Still, I
   have a lot of ideas. It's unlikely that the GP2X version will ever be as
   fast/faster than the PSP version for anyone but anything's possible.


Q) How high does my GP2X have to overclock to enjoy gpSP?

A) That depends on you. Higher overclocking will mean less frames skipped
   on autoframeskip, or less frameskip needed if on manual. Or it can
   make the difference between whether or not virtual 60fps can be reached.
   For some games no GP2X in the world will be able to run them fullspeed,
   with any amount of frameskip. A few might run well with no overclocking
   and a generous level of frameskip (probably manual). If you don't care
   about battery life (or you're plugged into an outlet) you should push
   it as high as you can while still maintaining stability, because
   chances are high that whatever you play will benefit from it. Right now
   you'll probably want 260MHz if you can achieve it, but with a lot of
   luck this number will lower slightly in the future (and is just a vague
   ballpark figure anyway). I don't want to scare anyone off from using the
   emulator, you should give it a try and see how it plays for you
   regardless of how high you can overclock. Just note that this is far
   from a locked smooth experience for everyone on every game.


Q) GBA has an ARM processor, GP2X has an ARM processor. GP2X is more
   powerful than GBA. This emulator should run great without overclocking,
   so therefore you're doing it wrong.

A) That's not a question, but I'll field it anyway. Two things: first,
   "virtualization", or running the GBA code "natively" on the GP2X is
   probably not possible, at least not with the way I want to do things.
   For reasons why go read my blog (see below). So yes, you actually
   do need more than 16.7MHz of ARM9 power to emulate the GBA's CPU.
   Second: there is a whole lot of work behind emulating the pretty 2D
   graphics on the GBA, something it can do in hardware a lot better than
   this platform can.
   End result: GBA emulation on GP2X isn't as easy as you think it is.


Q) What are you working on now? When will you release the next version?

A) See the gpSP development blog:

   http://gpsp-dev.blogspot.com/

   Note that I don't give release dates, ever, unless I'm right on the verge
   of releasing. Be grateful that I've decided to be much more open about
   the development of the emulator now.


Q) Thanks to your blog I heard that you made some improvement. Can I have
   a copy of the new code?

A) No. Builds in transition often have a lot of problems, and I like for
   releases to be relatively substantial. I can probably be bribed out of
   them with donations though. :P


Q) Why do the menu suck so much? Why do half the options not work or not
   make any sense?

A) Sorry, the menu still hasn't been modified very much to fit the GP2X
   version instead of the PSP version.. hopefully this will improve in the
   future.


Q) Who's in charge of the GP2X version anyway?

A) Originally, zodttd was. I, Exophase, have basically usurped control of it
   now to encourage zodttd to work more on his PS1 emulator (that and I'm
   possessive of gpSP and get nervous when people work on it too heavily).
   zodttd will most likely still be around to work on things though.


Q) I'm a super nice person and would like to donate some of my hard earned
   money to this one-off GBA emulator. Where do I send my money to?

A) Exophase: exophase@gmail.com on PayPal
   zodttd: https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=heirloomer
    %40pobox%2ecom&item_number=1&no_shipping=1&no_note=1&tax=0&cy_code=USD&bn=
    PP%2dDonationsBF&charset=UTF%2d8
    ^ Click there for donating on PayPal (remove whitespace/linebreaks).

   GP2X people have already donated a lot more to me than PSP people have,
   even though there's an order of magnitude or two less users. And they've
   donated far more to zodttd than they have to me. So I'm not going to ask
   people to donate..

   However I won't lie: donating ups the chances of me actually working on the
   next version (for which I have a lot of ideas, but not necessarily time to
   dedicate to.. that time might need more incentive to be allotted from other
   things). This could change depending on my employment situation, but right
   now I feel guilty doing anything that doesn't help guarantee that I'll be
   able to buy food a year from now.


Q) Tell me all of your personal information.

A) Again not a question, but why not. I'm Exophase, real name: Gilead Kutnick,
   male, 23 years old, current residence Bloomington, IN; straight/single/not
   actively looking, almost have an MS in Computer Science (do have a BS
   underneath it), likes PSP more than GP2X, will not write a Nintendo DS
   emulator for either, am currently looking for a job for after I graduate.


Q) You said you're looking for a job.

A) Yes. If you have one or know someone who needs a low level oriented
   programmer then I'm up for grabs. And this is my resume:
   http://exophase.devzero.co.uk/resume.pdf


Credits:

Original codebase: Exophase (exophase@gmail.com)
Foundation gp2x code: zodttd
GP2X dynarec/stubs + current code maintainance: Exophase



-- gameplaySP  Gameboy Advance emulator for Playstation Portable --


-- Release log --

v0.91 (minor cleanup release)

NOTE: I don't usually do minor releases but I rewrote a ton of
things in gpSP 0.9, much of it during the last few days, and although
I spent a lot of time debugging a few bugs inevitably crept in.

# Fixed some issues in the new memory handlers that crept up, hopefully
  should fix the problems between 0.8 and 0.9.
# Fixed a bug introduced in 0.9 that could cause crashes when selecting
  things in the menu (I hope, at least).
# Fixed a bug with a certain invalid opcode causing a jump to be scanned
  when there isn't one (fixes Sabre Wulf).
# Removed 2048 option for audio buffer.

v0.9 (yes, it's still beta)

NOTE: As some of you may be aware I'm pretty much tired of these
unofficial releases by people (okay, mostly single person) who
don't wish to follow my wishes. I'm in the process of asking this
person to stop, in his own language. However, I want to make
something clear. Look at the last six new features in this
changelog. I added these TODAY. I could have done them at any
time. But I didn't, because I spent many (dozens, quite possibly
hundreds) hours debugging games that people want to play. I have
always believed that this is far more important than spending time
on new features. Frankly, I'm tired of my emulator being hacked on
by other people, and if it doesn't stop I'm going to make this
project closed source.

Since I know this information is most visible when updated on the
major sites, note that it is the news posters I am especially
talking to. Next time you upload unofficial releases of my
emulator (without even knowing what's changed) bear in mind that
you're only encouraging me to stop working on this. If you want
to pick sides between me and unofficial devs, be my guest. I'll
let you decide by the contents of this release who's doing more
for my emulator.

Oh, and if you downloaded a version of gpSP that has more than
"gpSP" in its name then you're using one of their versions. Shame
on them for not even removing this threatening message, and shame
on you. Unless you're using a port I endorse (GP2X, Dreamcast, etc),
in which case everything's good.


# Fixed stereo output being reversed.
# Fixed a bug causing misaligned errors on 8bit writes to the gbc
  audio channel 3 wave data (fixes various Super Robot Wars games)
# Fixed DMA with garbage in their upper 4 bits (fixes a crash in
  Zelda: Minish Cap)
# Added double buffering to the rendering, removes line artifacts.
  Big thanks to Brunni for the idea.
# Fixed a bug preventing some SRAM based games from saving (fixes
  MMBN4-6)
# Fixed a bug causing part of EWRAM to potentially get corrupted if
  code segments loaded in EWRAM cross 32KB boundaries (fixes
  Phantasy Star 2)
# Fixed a bug causing games using movs pc in user mode (very bad
  behavior) to crash. Fixes Colin McRae Rally 2.0.
# Improved timing a bit more. Fixes GTA Advance.
# Fixed a sprite clipping bug (fixes crash in third boss of Zelda:
  Minish cap)
# Increased translation buffer size significantly (fixes Donkey Kong:
  King of Swing)
# Fixed a dynarec bug causing add pc, reg to not work in Thumb code
  (fixes crash in DBZ:LoZ, seems to fix crashes in battle in Golden
  Sun, probably fixes other games)
# Made sprites using tiles < 512 not display in modes 3-5 (fixes
  a couple minor graphical bugs)
# Removed abort on instruction 0x00000000 hack, was breaking a
  certain bugged up game (Scurge)
# Fixed bug in flags generating variable logical shifts (fixes
  SD Gundam Force)
# Fixed unaligned 16bit reads (fixes DBZ:LoZ in game)
# Redid contiguous block flag modification checking AGAIN and
  hopefully got it right this time (fixes Mario vs. Donkey Kong)
# Redid ldm/stm instructions, fixing some cases (along with the
  timing improvements fixes Mario & Luigi)
# Fixed 14bit EEPROM addressing (hopefully fixes saving in a lot
  of games)
# Completely redid memory handlers, accurately emulates open and
  BIOS reads now. Fixes Zelda: Minish Cap (roll bug, last dungeon),
  Rayman, MMBN 1 (last dungeon), probably others.
# Fixed a minor graphical glitch on the edges of the screen
  (thanks Brunni and hlide for the help!)
# Fixed crash on loading savestates from files of games not currently
  loaded, but be sure you have the exact file you loaded it from or
  gpSP will exit.
@ New memory handlers should provide performance boost for games
  that access VRAM significantly (ie 3D games)
@ Added dead flag elimination checking for logical shifts, probably
  doesn't make a noticeable difference but should have been there
  anyway.
+ Added rapidfire to the button mappings.
+ Added auto frameskip. Removed fractional frameskip (don't think
  it's very useful with auto anyway). Select auto in the graphics/
  sound menu to activate it; frameskip value will act as the
  maximum (auto is by default on). Thanks again to Brunni for some
  help with this. Frameskip options are game specific.
+ Added vsync to the rendering. Only occurs when frames aren't
  skipped. Seems to reduce tearing at least some of the time.
+ Added non-filtered video option.
+ Cheat support (Gameshark/Pro Action Replay v1-v3 only), still
  in early stages, doesn't support everything; codes may cause
  the game to crash, haven't determined yet if the codes are bad
  or the implementation is. See cheat section for more information.
+ Added ability to change audio buffer size. Does not take affect
  until you restart the game.
+ Added analog config options.
+ Added ability to set analog sensitivity and turn off analog.
+ Added ability to change the clock speed. This is a game specific
  option. Try lower speeds w/auto frameskip to save battery life.
+ Fixed savestate speed on crappy Sony sticks.

(legend: # bug fix, + feature addition, @ optimization)

v0.8 - ("unlocked" beta)

NOTE 1: It has come to my attention that there are actually BIOSes
out there that are being used that cause some games to not work.
The BIOS md5sum listed here is for the BIOS actually in GBAs and
is as accurate as you'll get, (if you have a GBA and a flashcart
you can dump it yourself, see http://wiki.pocketheaven.com/GBA_BIOS)

NOTE 2: Since I know this is as far as a lot of people here I have a
little request. Please, please, (I'd italicize this if I could)
please stop constantly asking me when the next release will be,
what it'll have, etc. And while you're at it, please stop asking me
to implement wi-fi multiplayer, cheat support, or fix all of your
games. Some things will happen in due time, other things might not
ever happen. I devote about as much time as I can to this emulator
and I carefully include as much as I can in releases to try to
minimize the number of people who will nag me next time (erm, I
mean, to make the most people happy), so I don't release every other
day or anything like that. Sorry that I can't release once a week,
but I'm a lot busier now than I was when I was first developing this
emulator. Good thing I got the first version out before that, wasn't
it?

Congratulations, you made it this far! Now read the rest of the this
thing. *_*


# Fixed bug in dead flag elimination, "alt" version no longer needed.
# Fixed EEPROM saves being saved as 32kb instead of 512bytes/8kb
+ 32MB ROM support has been added. ROMS are "demand loaded" as
  necessary and page swapped out; there might be a small loading lag,
  but I have yet to ever really notice anything.
  NOTE: 32MB ROM support only works for unzipped ROMs.
+ Save states have been added. See the save state menu for save/load
  options.
+ Support for the real-time clock (RTC) chip in Pokemon cartridegs
  and other games. The implementation is based off of VBA's, whatever
  notes on gbadev I could find, and some of my own reverse engineering
  of what the games do... it might not be totally correct. Also,
  setting the time does not work.
+ Per-game configuration. Currently this only saves frameskip and
  frameskip variation options.
+ Removed the flash type option from the menu and instead added it
  to game_config.txt. Hopefully got everything - let me know if you
  find something that isn't there. It's pretty easy to add them if you
  have to.
+ Added a display in the upper left-hand corner to indicate when
  fast-forward is on.
+ Added button bindings for save/load state.
@ Found a fix of StrmnNrmn proportion: far too much unnecessary mutex
  synchronization was going on. Removing the two offending lines of
  code gave a massive speed boost for free. Enjoy.

v0.7 - (beta than ever)

# Fixed a dynarec bug involving flags generating functions in
  contiguous conditional blocks. Fixes music in Super Mario
  Advance 2-4.
# Fixed a dynarec bug where Thumb mov imm instructions wouldn't
  set flags. Fixes Zelda: Minish Cap, Megaman Battle Network,
  probably others. Comes at a slight speed cost.
# Fixed a MIPS dynarec bug where some delay slots might not
  get filled rarely, causing chaos. Don't know if it improves
  any games.
# Improved self-modifying code detection. Makes Golden Sun,
  Golden Sun 2, and Madden 2007 sorta work but excrutiatingly
  slowly. Looking for a game-specific workaround for this - if you
  want to play these games you'll have to wait for now :(
# Fixed a bug causing the interrupt disable flag to go down
  when SWIs are entered, causing crashes/resets. Fixes
  Super Mario Advance 2-4.
# Fixed menu crashing when strings with certain characters are
  printed (for instance going to the menu after loading the
  BIOS)
# Accidentally forgot to render win0 + win1 + objwin when all
  active at the same time, many weeks ago. Added that, should fix
  some parts in games that had frozen screens.
# Fixed some issues with gpsp.cfg needing to be present and
  corrupting, hopefully. At the very least sanity checks are
  performed on the config file.
# Made it so assigning the frameskip button to something besides
  triangle actually worked as expected.
# Fixed ability to restart current game if nothing is loaded
  (ie, crash)
# Added interrupt on cpsr modification support to the dynarec
  (fixes backgrounds in Castlevania: Harmony of Dissonance)
# Added open addressing for ldm/stm instructions (fixes
  Super Mario Advance 3)
# Improved cycle accuracy a little. Don't know of anything this
  fixes, but games with idle loops will run a little better w/o
  idle loop elimination (but should still be added when possible)
# Fixed some bugs causing sound to play sometimes when it shouldn't.
@ Added dead flag elimination for Thumb code. May possibly have
  noticeable performance increases (Thumb emited coded size can
  have a reduction of 20% or more)
@ Added code generation for divide SWI. May have a small speed
  increase in some games.
+ Added analog nub support (special thanks to psp298 for the
  code)
+ Added fractional frameskip. Go below 0 to get them. A frameskip
  of 1/2 for instance means render 2 out of every 3 frames, 2/3
  means render 3 out of every 4 frames, etc. Possibly useful for
  games that are not quite fast enough at fs0 but fullspeed at
  fs1...

v0.6 - (still beta quality, look out for new bugs)

NOTE: Please include gpsp.cfg with EBOOT.PBP, this shouldn't be
 necessary but I think it is right now.

# Fixed a nasty bug that shouldn't have made it into the initial
  release; a lot of games that TECM.. erm.. crash won't anymore.
  NOTE: This doesn't mean that no game will ever crash, freeze,
  otherwise not work.
# Fixed some crashes in the GUI and the ability to "go up" past
  ms0:/PSP. Made the "go up" button square like it was supposed to
  be (instead of cross).
+ There's now a menu that you can access, by default press right
  while holding down triangle for the frameskip bar.
+ Menu option: resize screen aspect ratio, the default is now
  "scaled 3:2" which makes it look more like a normal GBA. You
  can use "fullscreen" (what it was like before) or "unscaled 3:2"
  (tiny but pixel for pixel like a GBA)
+ Menu option: You can now load new games while the current one
  is running.
+ Menu option: You can now restart the currently running game.
+ Menu option: Frameskip variation - this defaults to "uniform"
  whereas it defaulted to "random" last release. Basically, turn
  it on random if you find that frameskip causes flickering
  animations to make things disappear. Other than that it will
  generally look better on uniform.
+ GUI and file loading now have "auto repeat" on the buttons so
  they're not such a pain to navigate.
+ Menu option: Added support for 128KB flash ROM, some games
  require it (Pokemon Firered/Leaf Green, Super Mario Advance 4),
  turn it on before running the game to make sure it works.
  NOTE: There are some versions of these ROMs that have been
  hacked to get around their 128KB flash, and may not even work
  properly at all. Look out for them, these games should save
  128KB save files after you set the setting to it, IF they use
  128KB flash.
+ Menu option: Added ability to make the .sav files only update
  when you exit the emulator, use with extreme caution (in other
  words, it's not a good idea to use something like this in beta
  quality software if you care about your saves). Does NOT update
  if you exit through the home button, don't use the home button
  if you can help it.
+ Zip support thanks to SiberianSTAR. It will load the first file
  with the extension .gba or .bin that it finds.
+ Menu options are saved to gpsp.cfg. Note that it does not save
  frameskip options or flash ROM options because these are very
  per game particular.
+ The emulator will now try to save backup files to something
  more matching the backup size than a fixed 64KB.
@ Loading ROMs and the auto save of the .sav files is MUCH faster
  now. Thanks for the heads up on how to improve this from pollux!
@ While coding for the screen resize code I found that SDL just
  wasn't cutting it and had to code for the GU myself. Turns out
  the new code is faster (but because it is render code any
  improvement will be diminished to nothing as frameskip is
  increased). Special thanks to Zx-81 for the tips on this one
  and for his GU code in the PSPVBA source as an example.
@ Added some games to game_config.txt. Note that not all versions
  of these ROMs will work with these options, try to use the USA
  version if possible.

8-19-2006  v0.5 - Initial release (public beta quality)


-- About --

gameplaySP (gpSP for short) is a GBA emulator written completely from
scratch. It is still pretty young (only having started a 3 months prior
to the first release) and thus rather immature, but it does a decent
job of playing a number of games, and is being improved upon somewhat
regularly. It is currently somewhat minimalistic, in the sourcecode,
presentation, and features. Its number one focus is to deliver a GBA
gaming experience in the most playable way that PSP can manage, with
frills being secondary (although still a consideration, at least for
some of them).

Having said that, optimization was the important way in achieving this
goal, with overall compatability being a near second. Because of this
some games may not run at the favor of running more games significantly
better. Of course, the compatability will improve with time. The
compatability in the current version (0.8) is perhaps around 80%
(assuming the correct BIOS image is used).

Many games will run at their best out of the box, but some games will
run very slowly unless idle loops are taken care of. There is a supplied
ROM database, game_config.txt, that gives idle loop targets and other
settings that may help a game to run better (or at all) on a per-game
basis. Currently (as of version 0.8) a few dozen games are on this list,
mostly only USA versions. This list will continue to be updated; there's
no real telling exactly how many of the ~2500 GBA games will need to
appear here.

gpSP currently requires an authentic GBA BIOS image file to run. It will
make no effort to run without one present; this file is 16kb and should
be called gba_bios.bin and present in the same location as the EBOOT.PBP
file. Please do not ask me where to obtain this, you'll have to look
online or grab it from a GBA. Note that it is not legal to have this file
unless you own a GBA, and even then it's rather gray area.



-- Features --

gpSP mostly emulates the core Gameboy Advance system. As of right now it
does not emulate any special hardware present on various GBA cartridges.


What it emulates:

GBA CPU: All ARM7TDMI ARM and Thumb mode opcodes except block memory w/
 s-bit (probably aren't used in GBA games)
Video: Modes 0, 1, 2 almost completely, basic 3-5 support, sprites,
 windows/OBJ windows
Interrupts: HBlank, VBlank, all timers, all DMA channels, keypad
DMA: Immediate, HBlank, VBlank, sound timer triggered
Sound: Both DirectSound channels and all 4 GBC audio channels
Input: Basic GBA input delivered through PSP controls
Cartridges: Currently supports ROMs up to 32MB in size (the maximum for
GBA) with the technique of ROM page swapping to fit within PSP's RAM.
Backup: 32/64kb SRAM, 64/128kb flash, 512bit/8kb EEPROM
RTC: The real-time clock present in cartridges such as most of the
 Pokemon games and some others.


What it lacks:

Video: No mosaic, bitmap modes lack color effects (alpha, fades),
 there might be some minor inaccuracies in blending...
Cycle accuracy: Very cycle innacurate; CPU is effectively somewhat
 overclocked, meaning games with rampant idle loops will probably run
 rather poorly. DMA transfers effectively happen for free (0 cycle).
 Please do NOT use gpSP as a first source for developing GBA homebrew,
 try No$GBA instead.


Additional features it has:
- The ability to attempt to run games at faster than GBA speed (sometimes
  they can end up a lot faster, other times not so much)
- Savestates: the ability to save a game's state to a file and resume
  playing where you left off later.
- Mild cheat support


Features that it doesn't have (please don't ask me to implement these!)
- Wi-fi multiplayer


-- Controls --

The default control scheme is very simple. If you don't like it you can
change it in the configuration menu.

At the ROM selection screen:

Up/down: navigate current selection window.
Left/right: switch between file window and directory window.
Circle/start: select current entry.
Square: go one directory up.

In game:

Up/down/left/right: GBA d-pad
Circle: GBA A button
Cross: GBA B button
Square/start: GBA start button
Select: GBA select button
Left trigger: GBA left trigger
Right trigger: GBA right trigger
Triangle: Adjust frameksip

In frameskip adjustment:

Hold down triangle to keep up, press up/down to increase/decrease
frameskip, respectively. Press down at 0 to change to auto, and up
at auto to change to 0.

In the menu:

Up/down: navigate current menu.
Left/right: change value in current menu selection (if a value is present)
Circle/start: select current entry (see help for entry to see what this means)
Square: exit the current menu.


-- Frameskip --

The purpose behind frameskip is to cause the emulator to not render every
frame of graphics to make the emulation closer to fullspeed. Many games will
run fullspeed without skipping any frames, however, some (particularly more
graphically demanding ones) will require this.

Frameskip can be set to two forms, either auto or manual. Auto will attempt
to skip only as many frames as necessary to make the game full speed, and
will not skip more than 4 in a row no matter what speed the game runs at
(at this point the benefits of frameskip yield diminishing returns).

It is recommended that you keep frameskip on auto, but manual is maintained
as an option if you want it and works as follows:

Manual frameskip will only render one out of every (n + 1) frames, where n
is the current frameskip value (so 0 will render everything). Increasing
the frameskip can improve speed, especially with very graphically
intensive games.


-- Cheats --

Currently, gpSP supports some functionality of Gameshark/Pro Action Replay
cheat codes. To use these, you must first make a file with the same name
as the ROM you want the cheat code to apply to, but with the extension .cht.
Put this file in the same directory as the ROM. To make it use a normal
text editor like notepad or wordpad if you're on Windows.

To write a code, write the type of model it is, gameshark_v1, gameshark_v3,
PAR_v1, or PAR_v3. gameshark_v1/PAR_v1 and gameshark_v3/PAR_v3 respectively
are interchangeable, but v1 and v3 are not! So if you don't know which
version it is, try both to see if it'll work.

Then, after that, put a space and put the name you'd like to give the cheat.

On the next several lines, put each cheat code pair, which should look like
this:

AAAAAAAA BBBBBBBB

Then put a blank line when you're done with that code, and start a new code
immediately after it. Here's an example of what a cheat file should look
like:


gameshark_v3 MarioInfHP
995fa0d9 0c6720d2

gameshark_v3 MarioMaxHP
21d58888 c5d0e432

gameshark_v3 InfHlthBat
6f4feadb 0581b00e
79af5dc6 5ce0d2b1
dbbd5995 44b801c9
65f8924d 2fbcd3c4

gameshark_v3 StopTimer
2b399ca4 ec81f071


After you have written the .cht file, you have to enable the cheats
individually in the game menu. Go to the Cheats/Misc menu, and you will
see the cheats; turn them on here. You may turn them on and off as you
please, but note that some cheats may still hold after you turn them off,
due to the nature of the system. Restart to completely get rid of them.

IMPORTANT NOTES:

This is still very work in progress! I basically added this in only 1.5
or so hours, and I don't have a lot of time right now to work on it
before releasing. So I'll probably improve it later.

Not all of gameshark's features are supported, especially for v3. Only
basic cheats will work, more or less.

Cheats may be unstable and may crash your game. If you're having problems
turn the cheats off.

Really, there's no guarantee that ANY cheats will work; I tried a few and
some seem to work, others are questionable. Try for yourself, but don't
expect anything to actually work right now. Do expect this feature to
improve in future versions.



-- Frequently Asked Questions --

Q) How do I run this on my PSP?

A) Provided is an EBOOT.PBP which will run as is on a 1.0 firmware
   PSP or custom firmware that can run unsigned EBOOTs. On 1.5 firmwares
   you must use a kxploit tool to run it (try SeiPSPtool). On 2.0
   firmwares and higher further exploits must be used - see
   http://pspupdates.qj.net/ for more information. Note that I have NOT
   tested this emulator on any firmware version besides 1.5, and it's
   very possible that it doesn't run well, or at all on higher versions.
   Therefore I strongly recommend you downgrade if possible, and use
   Devhook to run games that require > 1.5 version firmwares.

   Be sure to include in the same directory as the EBOOT.PBP file the
   game_config.txt file included and the gba_bios.bin file which you
   must provide yourself.

   gpSP does not run on PSPs with version 2.71 or higher firmware yet,
   nor does any other homebrew executable.


Q) What is a BIOS image file? Why do I need it to run gpSP? Other GBA
   emulators don't require this...

A) The GBA BIOS image file is a copy of a ROM on the GBA system that
   has code for starting up the GBA (it shows the logo), verifying the
   game, and most importantly, providing utility functions for the games
   to use. It is the latter that gpSP needs the BIOS present for. It's
   possible to replace all of these functions with equivilent code, but
   this will take time - in the future gpSP may not require a BIOS image.


Q) I can't find this BIOS image.. please send it to me.

A) Sorry, but you're on your own. I won't send you a BIOS or tell you
   where to get one (unless you want to rip it from a GBA yourself, in
   which case I'll just give you the same link at the top). I can't do
   this because it's not legal to send it around and I don't want to
   get a reputation for illegally distributing BIOS images.


Q) How do I know I have the right BIOS?

A) If you have md5sum you can check if it has this hash:
   a860e8c0b6d573d191e4ec7db1b1e4f6
   That BIOS should work fine. I think that some others work fine too,
   although I haven't confirmed this with absolute certainty. It's also
   theoretically possible to use custom (and free) BIOS replacements,
   but I don't know of any publically availablone ones.

   As far as I'm aware there are two BIOSes floating around, I doubt
   you'll get one that isn't one of those two. There's a very easy way
   to determine which one you have - just look at the very first byte in
   a hex editor. The correct BIOS begins with 0x18, the buggy BIOS begins
   with 0x14.


Q) My favorite game won't run.

A) There probably isn't anything you can do about this, although a
   change to game_config.txt might help. gpSP is still an emulator in
   its infancy so the compatability is not superb. I don't have time
   to test too many games so I'm releasing it as a public beta to get
   a feel for some things that don't work. The next version could
   perhaps fix it, or it might never run. There are always other
   emulators of course, please try one.

   However, before nagging me there is one thing I recommend you try,
   and that is to add the option "iwram_stack_optimize = no" for the
   game in game_config.txt. See the file itself for more information
   on how to do this. If this fixes your game (and it's not already
   in the game_config.txt) please tell me about it.


Q) My favorite game is very slow.

A) Emulating GBA takes a number of resources and getting it done well
   on PSP is no simple task by any means. Some games are just going to
   overwhelm the emulator completely. Of course, there is one special
   case of game (a lot of early generation games fall under this
   category) that can be made much faster by a simple addition to the
   game_config.txt file. Wait for a new version of this file or the
   next version of the emulator and the game may be improved.

   That aside, there are still numerous optimizations that can be done,
   and I sure you future versions will be faster (I just can't tell you
   how much)

   Also, a lot of games will be sped up considerably by adding an
   idle_loop_eliminate_target line for it in game_config.txt. There
   are some more obscurer options there that can improve speed too. If
   the game is VERY slow there might be something wrong with its
   emulation that can be improved. For instance, if you can't get a game
   to run fullspeed on any frameskip you should e-mail me about it.


Q) Some games run fullspeed but the sound is messed up. Why?

A) At least 9 out of 10 times it means the game isn't really running
   full speed, but just that you can't notice the difference. Increasing
   frameskip will almost always improve sound quality in these
   situations, to a certain point (after around frameskip 3 you
   probably won't be seeing many more returns if it isn't already
   fullspeed). The rest of the time it means there's a bug somewhere else
   in the emulator, probably in the CPU core. Chances are that all you
   can do is wait for it to be fixed in a later release.


Q) The emulator crashed!

A) Most games that don't run will probably take the emulator down with
   it, or it could be an emulator bug completely unrelated to the game
   (but unlikely). Press home and wait for the next version.

   There is some information that comes up when the game crashes. This
   information may be slightly useful to me, but chances are it
   usually won't be all that interesting.

   These days games are more likely to exit with a "bad crash" error.
   This number is possibly useful to me, but to debug a game I'll have
   to reproduce the crash anyway. When this happens it's probably due to
   a bug in the CPU core that hasn't been fixed yet.


Q) Why won't my game save?

A) The game might need 128KB flash turned on and might not be listed in
   game_config.txt. See game_config.txt for more information regarding
   this. Be sure to include game_config.txt with the EBOOT.PBP file.

   Other games might simply have bugs in the save support. For now, use
   savestates as an alternative if you can't save.


Q) How do I change sound quality?

A) Right now, you can't. For those wondering, sound is locked at 44.1KHz
   (sounds a bit high? It is, but it's currently necessary to play
   everything correctly). I don't have any plans to allow changing this
   right now, because I don't think there's really much reason to be
   able to (it'd be a tiny speed boost at best and I don't think SDL even
   allows for anything besides this sampling rate on PSP)


Q) What is this emulator's name?

A) Um.. what? It's gameplaySP, isn't it? You call it gpSP for short.
   Somehow the name can't have the acronyms gbSP, gbapSP, or really
   just about anything else you feel like giving it. Oh, and if you
   really want to make me happy get the capitalization right too.
   That's gpSP, not gPSP, GPsp.. you get the idea.


Q) Does gpSP run Gameboy/Gameboy Color games? Will it later?

A) No. Even though GBA can run these games it uses separate hardware
   that proper GBA games have no access to (save for the audio chip),
   and thus there's no point including it in a GBA emulator (it
   doesn't help run GBA games). I recommend using a GB/GBC emulator
   like Rin for playing these games. It'll probably give you a lot
   more options anyway. gpSP will never actually emulate GB/GBC
   games. You'd may as well be waiting for it to emulate PS2 games...
   (that was an analogy. gpSP won't ever emulate PS2 games. >_>)


Q) Other emulators use the PSP's graphical hardware to accelerate the
   video emulation. Is this possible for gpSP?

A) I'm honestly not too sure at this point. It's definitely a rather
   complicated procedure, and I don't think it'll be possible to
   accurately accelerate alpha blending. On the other hand, affine
   transformations could perhaps receive a speed boost this way. Any
   solution would have to be hybrid hardware/software, which might be
   possible due to the nature of the PSP's VRAM. Maybe someone will
   be willing to help me think of possibilities here?

   But don't bother of you're just going to tell me to render a list
   of quads...


Q) Other emulators use the PSP's second CPU to offload the sound
   emulation. Is this possible for gpSP?

A) Yes, but it wouldn't improve it nearly as much as say, SNES9x TYL.
   This is because most of the processing that goes into sound on a GBA
   game is done in the CPU, not in dedicated audio hardware. It could
   help a little, but probably not a lot. Maybe enough to be worthwhile.
   It might also be possible to split the video rendering to the main
   CPU and the main emulation to the secondary one, but there are a lot
   of coherency issues involved.


Q) I heard gpSP can only load games 16MB or smaller in size. Is this
   true? What about zipped games?

A) As of version 0.8 gpSP can play 32MB ROMs. However, they must be
   unzipped. The reason for this is that parts of the ROM are constantly
   loaded to memory as needed, and for this to be as fast as possible the
   ROM has to be present on the memory stick in raw format.

   You might be wondering, why not just have gpSP unzip the ROM to a file
   then delete the file when it is done? The reason why is because this
   would impose a "hidden" requirement of 32MB on the user that very
   likely may not be there. Furthermore, there are only a few 32MB games
   that anyone actually wants to play. If you only have one 32MB game on
   your memstick then it'd actually require signifnicantly more free space
   to hold both the ROM and the 32MB raw file. With 2 32MB ROMs you only
   gain a around 10-25MB of free space, depending on how effective the
   compression is.


Q) Savestates? From other emulators??

A) See the savestates option in main menu. gpSP will probably never
   support savestates from other emulators, there's just too much in the
   way of emulator specific data in them.

   Savestates are currently 506,943 bytes. They would be a little smaller
   without the snapshot, but I find that very useful and it wouldn't help
   size immensely. Compression would help, but I wanted the size to be
   constant so you knew exactly how much you could hold and to improve
   save/load speed.


Q) What's with the zip support?

A) I hear stories that some games work unzipped and not zipped, so you
   might want to try unzipping them if it gives you problems. You also
   might want to try making fresh zips with WinRAR - users have
   reported some higher success rates doing this.


Q) What's with the config file? Should I make it read only?

A) There was a bug in version 0.6 that caused the config file to not
   get updated or get corrupted sometimes. Hopefully this is fixed now,
   but if it DOES get corrupted making it read only can prevent this
   from happening in the future.


Q) So when WILL the next version be released?

A) Sorry, but I almost never announce release dates. Furthermore, I'll
   probably be pretty hush hush on internal development, just to keep
   people from nagging me about it and building too much suspense.


Q) I don't like this emulator. Are there other alternatives?

A) Yes. Try PSPVBA by Zx-81 (http://zx81.dcemu.co.uk/). Overall I doubt
   the compatability is significantly higher than gpSP's anymore, but
   I'm sure there are some games it runs that gpSP doesn't.


Q) I heard there was a version of gpSP for PCs. Is that true?

A) I developed this emulator internally on PC. It might have a speed
   advantage over other PC GBA emulators, although the PSP version has
   more sophisticated optimizations. Most people have fast enough
   computers to run better GBA emulators for PC and gpSP lacks some
   important features (screen resizing) that the PSP version kinda
   hides. Even though gpSP spent a majority of its development
   gestation as a PC app it was always developed with the PSP in mind,
   so the PC version will probably not see the light of the day unless
   I get overwhelming demand for it. It is, however, possible to
   build it from the source. But I request that you don't distribute
   such builds. If you happen to find one, bear in mind that I don't
   offer any support for it, and as far as I'm concerned it won't
   exist.


Q) I hear there's a version of gpSP for other platforms too, like
   Dreamcast. And I hear they're slow! What gives?

   These are ports, done by other people (or maybe myself?). This is
   possible because gpSP is open source and its base version is fairly
   portable, but to run fast enough on anything but platforms quite a
   bit faster than PSP it at least needs a CPU specific dynarec backend.

   I don't (necessarily) maintain all builds of gpSP, so you'll have to
   contact the authors of these ports for more information. That
   notwithstanding, I try to get as involved in other ports of gpSP as
   I can.


Q) I want to modify gpSP. How can I do this, and am I at liberty to do
   so?

A) Yes, you are, under the terms of the GPL (see the included
   COPYING.DOC). You can download the sourcecode from whereever you
   downloaded this; if you can't find it please e-mail me and I'll give
   you a link to it. I would vastly appreciate it if you contacted me first
   before forking my project, especially if you're just looking to gain
   recognition without adding much to it. It's better to keep all changes
   tidy in one branch of development.

   I would like to stress this a little more seriously (hopefully those
   interested are reading this). Although you are legally entitled to
   release your own forks of gpSP it would be much more benficial to me,
   to you, and to the users of this program if you instead tried working
   with me to get your changes incorporated into the next version. I
   really don't feel like competing with other builds of my source
   anymore, so please do me a big favor and send me an e-mail if you want
   to work with gpSP.


Q) How do I build gpSP?

A) make will build it. You need to have SDL for PSP installed, as well
   as the standard PSP toolchain/PSPSDK and zlib. gpSP isn't much of a
   "build it yourself" program so please don't bother me much about how to
   build it unless you have a good reason for wanting to do so.


Q) What is with the version numbers?

A) Anything less than 1.0 means beta. Beta means that I still have major
   plans for working on it, and that I don't fully back it as being
   stable or reliable software. Of course, if it does hit 1.0, that doesn't
   mean it'll be perfect. It just means I'll have spent a lot of cumulative
   time working things out. The closer it gets to 0.9, the happier I am with
   it overall.


Q) Donations?

A) Very appreciated. exophase@gmail.com on PayPal. <3


Q) How can I contact you?

A) exophase@gmail.com, Exophase on AIM, exophase@adelphia.net on MSN. I
   welcome IMs, but if you nag me a lot you'll make me sad inside. And
   don't ask me for ROMs or the GBA BIOS. I figured this was common sense
   but apparently not.


-- Credits --

Exophase: main developer
siberianSTAR: zip support
psp298: analog nub code

Beta testers for 0.7:
theohsoawesome1
thisnamesucks837
blackdragonwave9
dagreatpeewee
xsgenji

Beta testers for 0.8:
Runaway_prisoner
theohsoawesome1
tanyareimyoko
spynghotoh2020

Beta testers for 0.9:
RunawayPrisoner (my right hand man)
Veskgar (my left hand man)
qasim

-- Special thanks --

Quasar84: He's helped me in so many ways with this. We both kinda learned
GBA together, he did little demos for me and I got them emulated. It was
great trying out your more advanced code for your own projects once you
got to them, it was equally rewarding to see your work and to be able to
run it at the same time. Least of all I wouldn't have been able to do any
of this without your constant support and presence. I really owe this
release to you.

gladius: You are an amazing GBA coder. I wouldn't have been able to get
through some tough parts without your help. Its been good talking about
ideas with you.. I'm sure you're glad to see that there's finally a GBA
emulator with dynarec ;)


Many, many others of course, probably too many to name, and I don't want
to make anyone feel bad by putting others above them (well, except those
two, heh) so if you think you should be on here, you probably should be!
Just pretend you are for now, and maybe I'll put you here next time.