-
Notifications
You must be signed in to change notification settings - Fork 30
/
CHANGES (snes9x).TXT
1690 lines (1690 loc) · 99.8 KB
/
CHANGES (snes9x).TXT
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
1.39
- Added SDD-1 unknown graphics data logging at the dumper's request. A bit late
but might help with Street Fighter 2 Alpha's data dumping. Creates a
romname.dat file in the freeze file folder.
- Implemented 16-bit texture support for OpenGL modes in Windows and Linux.
Had to support a new pixel format type to do it - RGB5551 (one bit of alpha)
which caused me some major problems - black was no longer always pixel value
zero!
- Removed the Bump map OpenGL mode from the Windows port (didn't look so good
anyway and was slow).
- Added a hidden novelty OpenGL mode (clue: a keyboard shortcut activates it)
- Reverted back to FMod version 3.20 after reports that version 3.33 broke
AD3 support.
- Implemented a better work-around for the broken select system call in the
Linux kernel - the original work-around was long-winded and stopped working
when I implemented OpenGL support under Linux.
- Added the same speed-up hack to the OpenGL code that the Glide code already
supported. Basically, if your OpenGL implementation supports 16-bit textures
then OpenGL mode should be as fast, or faster than the 3dfx Glide mode.
- Hopefully fixed Glide support.
- Reverted back to the original colour blending code. The newer code, although
more accurate in most cases, had too many glitches and was slower.
- Included multiple Japanese games fixes from Iswashi San.
- Fixed a timing problem caused by a speed up hack that was affecting Top Gear
300. No the game still isn't playable yet, but I noticed the problem while
investigating the DSP-4 chip used by the game.
1.38
- Added support for Star Ocean and Street Fighter 2 Alpha decompressed graphics
packs from dejap. Used a binary chop search rather than a linear search to
locate correct decompressed graphics more quickly - should help emulation
speed during later stages of the game.
- Included OpenGL support into the Linux port and speeded up the Windows OpenGL
implementation slightly. The real speed up would occur if I could figure out
how/if 16-bit textures are supported in OpenGL because at the moment the
16-bit software rendered SNES image must be converted to 24-bit before being
uploaded as a texture...
- Included the latest ZSNES DSP-1 code. Now Pilotwings, SD Racer and Suzuka 8
Hours are playable. Aim For The Ace, Super Air Diver 1 & 2 and Syutoko Battle 94
are also playable, but with bugs. Thanks to zsKnight, _demo_, et al for all
their hard work.
- Another Daffy Duck: Marvin Missions screen flicker problem worked around -
writing to the IRQ enable register shouldn't clear any pending IRQs, but
Sieken 3 seems to require this or else the game hangs. Special-cased Daffy
Duck for now.
- An NMI emulation bug was triggering a Panic Bomberman World game bug,
crashing it. Basically, if a game enables NMIs after the normal trigger
point, the NMI should not trigger if the game has already read the NMI clear
register.
- Panic Bomberman World requires SPC700 memory to be initialised to zero on
reset otherwise the game hangs when a tune finishes and another one should
start.
- Added mouse pointer auto-hide to the Windows port. Much better than the turn
the mouse pointer into a black dot method I was using before.
- Included the latest ZSNES Super FX code. Not sure if it fixes actually fixes
any games.
- Added an offset hack for Strike Gunner to get the scrolling ground layer
to line up correctly - another offset-per-tile bug hacked around for now.
- Arrr! Left in some debugging code in the last release that prevented all
games that need the slower SPC700 timing from working. Removed it.
- Hmm. The broken cut-scenes in Deep Space 9 seem to indicate that I haven't
got the emulated clock speed of the 65c816 CPU correct yet. And not by a
little bit - a 9% too slow error. Hacked special timing for the game for now.
- Added triple-buffering to Windows port - enabling double-buffering actually
enables triple-buffering if you have enough free video RAM, defaulting to
double-buffering if you don't.
- Fixed another crash bug in the interpolated mode 7 code - if no scaling
was being used (either up or down) and screen repeat was enabled and the
screen was flipped horizontally, the routine would crash Snes9x. Was causing
Snes9x to crash during rock monster boss stage of Castlevania 4.
- Oops. Got the initialisation of the default SNES screen width and height
round the wrong way - could cause a X Windows System error message on the
UNIX port after loading a ZSNES freeze file.
- Included the unofficial Windows port emulation fixes for several games including
Kentouou World championship and TKO Super Championship.
- Included Iwashi San's improved Anti Res. sound sample decoding routine and
updated the C version to match.
- Included Anti Res. improved sample decompression code he sent me ages ago,
but for some reason I didn't include. Sorry. This version seems good enough
to leave enabled all the time.
1.37
- Added fix for Captain America's corrupt graphics - a ROM bug causes it to
read from what I thought should be an unmapped memory area, but it expects
the value returned to be zero.
- Added code to support games that switch to the hi-res. SNES screen mode part
way down the screen while using the 3dfx bi-linear filter mode. The code
basically has to back out of the speed up hack it was using when the game
switches resolutions.
- Fixed support for games that have mixed lo-res. (256x224), medium res.
(512x224) and hi-res. (512x448) all on the same screen - corrects the display
of Majin Tensei 2.
- Added support for games that use sub-screen addition to the back-drop layer
while displaying hi-res. graphics - something I thought the SNES couldn't do
but the game Marvelous uses this.
- Reworked the UNIX/Linux output image handling code: the image doesn't always
have to be scaled when hi-res. support is enabled, the PutImage operation
only updates the area of the screen it has to, the SNES image is now always
centred in the window/full-screen area and if the SNES image changes size
between frames, the old screen areas are now correctly cleared.
- Fixed the corrupt graphics problem during the battle scene of Last Bible 3 -
it requires that previously unknown DMA mode 5 should just act the same as
DMA mode 1.
- Fixed a nasty bug when H-IRQs were being reused on the same scanline - a logic
bug could cause H-DMA processing for that line to be skipped. Was causing
the bridge and the start banners to be the wrong colours in Top Gear 2.
- Added Kreed's display processing modes to the Linux port, including his new
asm version of the Super2xSaI mode and the new software bi-linear filtering
mode.
- Think I might have figured out the odd Mode 7 glitch problems the games
Illusion and Gaia and Chase HQ were having. My original fix was to mod the
centre X & Y values with 1024, but looks like the true fix is to mod
X + horizontal offset and Y + vertical offset with 1024 when screen wrapping
is enabled.
- Disabled H-DMA'ing into V-RAM via registers 2118/2119. The game Hook
deliberately does this causing graphic corruption while dialog boxes are
displayed. Maybe the real SNES disallowed this and it was left in the game by
mistake? Not sure what effect the game was trying to produce because
disabling the emulation of this feature doesn't seem to affect the game at
all, other than stopping the corruption.
+ Also fixes graphics junk problem on first screen of Bugs Bunny.
- Added a 'region-free' timing hack for Power Rangers Fight - without it the
NTSC version was displaying badly glitching graphics; I'd already fixed the
PAL version.
- Added true priority-per-pixel mode 7 support (the previous support was just
a hack to get the colours correct) - level 2 of Contra 3 used this feature.
- The Japanese, German, French and Spanish version of Illusion of Gaia needs the
slow SPC700 timing.
- Deleted the Breath of Fire 2 S-RAM hack for the hacker intro version -
according to reports it was causing problems for the non-hacked version.
- Legend, the PAL version, never sets the sound master volume control - Snes9x
was defaulting this to off, I guess the real SNES must default it to full
volume; changed Snes9x. The NTSC version of Legend does set the master
volume level, but sets it to off just after the title screen. Hmm. The -nmv
command-line switch allows you to hear sound in this version.
- Panic Bomber World was tripping an SA-1 emulation bug - the WAI instruction
emulation code was setting the 'waiting for interrupt' flag on the wrong CPU
causing the main SNES to skip an instruction when the next interrupt occurred.
- Panic Bomber World, Bomberman 4 and UFO Kamen Yakisoban all need the slower
SPC700 timing.
- Oops! The Super Formation Soccer 95 fix was causing Aero 2 to lock up. This
means I have no no idea what value the DMA in progress register should
represent. I've hacked it and made it toggle between 0 and $ff on each read
which gets both games working, for now...
- The ROM de-interleaving code always assumed the blocks were rearranged based
on a power of two, but Francois found a copy of Soldiers of Fortune where
this was not the case. Corrected the code.
1.36
- Finally worked out why the menu items weren't being highlighted in several
ROMs, including Battletoads, U.N. Squadron and All Japan Pro Wrestling.
Two problems: its seems the SNES does halve the colour value result when
blending colours when only the fixed colour addition/subtraction is enabled,
but doesn't halve the result when sub-screen is being blended and its a clear
part of the sub-screen. The second problem was that I had an optimisation
that prevented the time consuming colour blending code from being called if
the colour being added/subtracted was black - adding zero to a number doesn't
affect the result, but not performing the side-effect of halving the result
does affect the final value...
- Super Formation Soccer 95 requires that the DMA enabled register doesn't
always return zero, otherwise the game locks up.
- Thanks to several people reporting a screen flickering problem in the
pseudo 3-d section of Jurassic Park 2 I've fixed a nasty problem in H-IRQ
handling code which could cause double-triggers or skip IRQs altogether.
With this fix I can now remove the special hacks for Ninja Warriors Again,
Chuck Rock and F-1 Grand Prix.
- More games needing the slow SPC700 timing:
Zennihon Puroresu 2, Soulblazer and Robotrek.
- The CPU idle time skipping code was skipping cycles during a software delay
loop in Itchy and Scratchy, causing screen flicker.
- Looks like reading the value of register $2137 shouldn't clear a pending
IRQ - was causing screen flicker on Yoshi's Island.
- Actraiser 1 & 2 both need the slow SPC700 timing.
- Terranigma reads a sound channel's current sample output value and waits for
it to be zero before preceeding. I forgot to always return zero when a
channel was silent. This mistake was causing the game to lock up.
+ Itchy and Scratchy and was causing the music to stop and samples to be cut
short in the Mario Early Years series.
- Added a hack for Secret of the Evermore - at several points in the game, just
as the plane is about to land, it reads from unknown registers $4000 and
$4001 and, if it doesn't get the value its looking for, the game hangs or
displays corrupt graphics.
- Silva Saga 2 was accidentally triggering a colour blending hack I put in
place Kirby Dreamland 3 and Kirby Superstar.
- The ZSNES freeze-file loading code could leave a file open if the file wasn't
a valid ZSNES freeze file.
- Super Punch-out requires certain DMA registers to be updated after the DMA
completes. Snes9x used to do that, but I must have accidentally left the code
commented out whilst investigating a different problem in another game.
1.35
- Added a recently played game list to the Windows port File menu so you can
quickly load up your favourite games.
- Included IPS patching support based on code from Neill Corlett - just rename
the patch file to match your ROM image name but with a .ips extension and
copy it into your ROM or freeze-file folder.
- Added John Weidman's and Darkforce's S-RTC, (Real Time Clock) emulation code.
The only game that seems to use it is Dai Kaijyu Monogatari II.
- Included code from Nose000 for games with 128Kbytes of S-RAM. Now
Sound Novel-Tcool, Thoroughbred Breeder 3, RPG-Tcool 2 and Dezaemon are
supported.
- The Windows port now has an option to make the 'turbo speed' button a toggle
button.
- The optimised fixed colour addition/subtraction code was ignoring the colour
window. Thanks to John Weidman for pointing this out.
- Added mode 7 and hi-res. hack for Dezaemon from Nose000 - the mode 7 hack
looks interesting (to me); I wonder if some other games would benefit?
- Both Tales of Phantasia and Star Ocean need custom sound CPU timing. Hmm.
That's 4 ROMs now, there will be more... That means I still haven't
discovered all the major SNES timing quirks. :-(
- Windows port now has an option to save the S-RAM data at any time.
- Windows port saving SPC dumps now auto-increments the filename.
- Added work-around for a Super Robot Wars Ex ROM bug - the game was checking
the wrong PPU register for end of h-blank. The game must have only worked by
chance rather than by design on a real SNES.
1.34
- Corrected the colour addition/subtraction and halve the result code not to
halve the result when only the fixed colour is used, i.e. the sub-screen is
clear. Discovered and fixed this awhile ago, but I accidentally reintroduced
the bug when adding some optimisations a few versions back.
- Finally cleared the last of the offset per tile background mode bugs. There
was something odd about the tile at the left-hand edge of the screen that I
couldn't figure out - well now I have. Yoshi's Island level 6 boss screen,
Mario RPG mine cart screen and Jim Power title screen now all display
correctly.
- Made reading blank areas of the SNES memory map return the middle byte of
the address - fixes Home Alone which tries to execute code in an empty part
of its memory map but only works because the real SNES seems to return the
middle byte of the address - $60 in this case, which corresponds to the
ReTurn from Subroutine instruction.
- Added auto-cycle skipping disable for Earth Worm Jim 2 and several other
games that spool sample data using H-DMA as the sample is being played.
Improves some sound effects in these games.
- Fixed joy-pad routines to only report up or left if down or right are also
pressed respectively. Works around a game bug in Empire Strikes Back in the
asteroid stage where the game crashes if both left and right are pressed -
something impossible to do on the original SNES game-pad.
- Added custom SPC700 timing for Rendering Ranger R2 - the game now works with
full sound. No idea why it needs custom SPC700 timing.
- The ROM type detection was broken for Treasure Hunter G and Test Drive 2 -
fixed the code so type 2 ROMs can be LoROM.
- Adjusted the main CPU cycles per scan-line from 341 to 342 to give an exact
match for the timing required for Earth Worm Jim 2. All EWJ2 needs now
for perfect sound emulation is a method of synchronising the emulation
speed to the host hardware's sound card playback rate, oh, and a fast CPU!
The Linux port already has this but seems to be broken because games
play at double-speed when this option is enabled.
- Some SPC700 code in Earth Worm Jim 2 seemed to prove that I had guessed the
clock speed of the SPC700 sound CPU incorrectly - out by almost a factor of
two, in fact. Changed the relative emulated clock speed of SPC700. Now
Chrono Trigger doesn't lock up at certain points anymore, the special SPC700
timing for games written by the Human Software company isn't required and
you can hear some more of the sound samples in Earth Worm Jim 2, etc.
- H-IRQ triggering code was broken - if a ROM turned on H-IRQ but later turned
it off, Snes9x could continued to generate H-IRQs, crashing some games.
- Added a generic test for Human Entertainment games - they need special
sound CPU timing to work. Gets Taekwon-Do working.
- Disabled offset-per-tile mode for Theme Park; the world map screen is corrupt
with it enabled.
- Yet more changes to the offset-per-tile backgrounds modes 2 and 4. Added
64 tile wide screen support for Mario RPG's mine cart ride and fixed multiple
bugs with the handling of horizontal offset-per-tile used in Chrono Trigger's
fade in of the space ship.
- New feature: Snes9x can now load ZSNES freeze state files! Just copy them
into the freeze file folder and Snes9x will load them when you load a freeze
file, but only if the corresponding native format Snes9x freeze file doesn't
exist.
- Added memory map hack for Batman - Revenge of the Joker: its ROM header block
is in the wrong location and Snes9x incorrectly detected its ROM type.
- Fixed an off-by-one-pixel clip window 2 bug when the window was set to clip
outside the window area; clip window 1 was already correct. Removed the bright
line bug at the left edge when the combat screen is appearing in Starfox and
the clip problem when text boxes zoom-out in Yoshi's Island.
- Jim Power's title screen seems to prove that the per-tile offset data on
mode 2 isn't ignored for the left most tile as I originally thought.
Modified the code.
- The recent timing changes highlighted another problem with Daffy Duck -
changed IRQ enable register to only clear pending IRQs if one has been pending
for several microseconds.
- Speeded up the sprite data register handling slightly.
- Finally got Aero the AcroBat 2 working, after many hours of investigation,
spread over several years - literally! Two problems. The SNES doesn't seem
to consider scan-line line zero to be part of the v-blank period even though
the line is never drawn and V-IRQs at the start of the scan-line have to be
delayed until a few microseconds into the line - Traverse: Starlight & Prairie
required this as well, so I removed the original, Traverse specific hack.
There's a problem with the in-game music that I'll investigate at a later
date.
- The in-game music problem just required ENVX emulation to be switched on,
off by default on the Linux port, on by default on the Windows port.
- Fixed the mode 7 corruption problem on the title screen of Chase HQ using the
same trick as Illusion of Gaia - i.e. mod the mode 7 centre X & Y values with
1024.
- Fixed another crash bug in the interpolated mode 7 code - a portion of
the code was ignoring the screen flip value and the fact that X render
direction reversed if the screen was flipped horizontally. Was causing a
crash on the whale boss screen of Kirby Superstar.
- Mortal Kombat 3 now auto-adjusts emulated cycles per scan-line work-around
a speech sample being cut short.
- Added sample data register reading support to the sound DSP - somehow I
seem to have missed implementing this. Not sure if any ROM actually reads
the value.
- Followed Sumire Kinoshita's suggestion and stopped clearing the ENDX flags
when the value is read, against my better judgement, and it does actually
improve speech samples in several games. Ooops! The Mortal Kombat series,
Magical Drop 2 and Metal Combat are the ones I've discovered so far.
- WWF Arcade now auto-adjusts the cycles per scan-line value to work-around
a sound sample repeat problem.
- Hmm. There's something about offset-per-tile mode I don't understand - WWF
Wrestlemania Arcade is getting corrupt graphics; not sure what effect the
ROM is trying to produce. Disabled offset-per-tile mode for the game for now.
- Fixed Street Racer player 1 wobble problem during the soccer game by auto-
adjusting the cycles per scan-line value slightly.
- Made Power Rangers Fight auto-adjust emulated cycles per scan-line to work
around a slight timing problem that causes an NMI to corrupt register
values that an IRQ handler is trying to update. Without it the scrolling
back-drop and fighter graphics are corrupt.
- Illusion of Gaia seems to need the mode 7 centre X & Y values to be mod 1024
if the screen repeat flag is set. Fixes the island fly-over bug right at
the end of the intro but breaks a few other games. Hmm. Made it auto-switch
on for this game only.
- Added memory map support for Radical Dreamers. Thanks to satellite hut master
for the information.
- Made updates to the top bit of the sprite write address register be ignored
unless the low byte had been written to first. A ROM coding bug in
James Pond II requires this, otherwise it writes a junk byte value into the
main character's X position and Robocod wobbles around all over the place.
- Reverted back to pre 1.31 way of initialising unknown register values -
Rock and Roll Racing was reading a junk register value and using the value
to set up DMA, which in turn was causing corruption on the player select
screen.
- Added Star Ocean memory map - thanks zsKnight! The original ROM I was testing
was corrupt, no wonder I couldn't figure out the memory map myself! The game
still isn't playable, though, due to missing S-DD1 graphics decompression
(+ encryption?) emulation.
- Started to dump some compressed data values from Street Fighter 2 Alpha in
the hope that one day someone will be able to crack the S-DD1's compression
algorithm.
1.33a
- C4 emulation wasn't being automatically enabled for Rockman X2 / X3 - the
Japanese versions of Megaman X2 / X3.
- Fixed the Super FX plot table pointer that I accidentally broke while saving
1Mb of workspace RAM - it was stopping all Super FX games from working.
1.33
- Noticed another problem with the CPU_SHUTDOWN code - Chrono Trigger locked
up during the intro but only when using the asm code CPU core. Found the
algorithm difference between the code and made the CPU match what the C
version was doing. Still not sure why it caused a problem in the first place.
- Changed colour subtraction code to use Lindsey Dubb's newer version he sent
me some time ago but I 'forgot' to include. I say forgot, but I really put
off including it because, although it improves most games that use the
effect, it does result in one or two slight visual glitches.
- Hacked in zsKnight's C4 emulation asm code - now both Megaman X2 and X3 are
playable. Still got to complete the reverse engineering of the i386 asm code
to C so other, non-Intel ports can have C4 emulation.
- Shuffled the keyboard mapping a bit on the Linux port so now Tab key acts as
an emulation speed turbo button, `, # and ~ act as superscope turbo and
/ acts as the superscope pause button.
- Fixed asm CPU_SHUTDOWN code that I accidentally broke while trying to
optimise it! Thanks to all the people who noticed Snes9x's frame skipping
had changed between releases. Frames rates should be improved again for more
than 50% of games.
- Re-enabled in-lining of the C SNES memory access routines, improves frame
rate by one or two on slower machines.
- Optimised the asm 65c816 addressing mode emulation code a little.
- Included some code changes making life easier for the Mac porter, John Stiles.
- Added memory map support for Sufami Turbo using information supplied by
Nose0000. No idea if it works because I don't have the ROM.
- Spent a few minutes trying to figure out the Star Ocean memory map so at
least the sound effects could be heard. But gave up after a couple of hours
due to laziness. If anyone knows the memory map details, let me know please!
1.32a
- The delay loading of the OpenGL DLLs on the Windows port was causing the
OpenGL initialisation code to fail. Reverted back to normal DDL loading but
with the side effect that Windows 95 users must visit the Microsoft web site
and download the OpenGL add-on before Snes9x will work for them.
- Corrected the OpenGL bump-map display option - my attempt to get the
bi-linear OpenGL display option to work with Voodoo card's limited texture
size had broken the bump-map mode.
1.32
- Changed the Windows port to delay load the two OpenGL DLLs, so now they're
only loaded if you switch to OpenGL mode. The original version of Windows 95
didn't include the OpenGL DDLs, so Snes9x wouldn't even start on that
platform; now it should.
- Added yet another sound buffer option to the Windows port - this time the
block size of sound data to mix. Some DirectSound sound card drivers only
report the play position moving in steps rather than continuous amounts and
Snes9x's default mix block size turned out to be smaller than this step
value on several cards.
Snes9x couldn't work out out where the true play position was accurately
enough resulting in broken, noisy sound output.
- Modified the Windows frame timer code to use semaphores rather than events -
they should make Snes9x more reliable at not missing frame sync pulses when
Windows is busy doing background tasks.
- Added SA-1 shutdown code - basically, Snes9x now stops emulating SA-1 CPU
instructions when the SA-1 enters an idle loop waiting for the main SNES
CPU to give it something to do. All SA-1 run much faster and smoother now.
- Added multi-axis joystick/game controller support to the Windows port and
tweaked the dead-zone threshold position a little.
- It looks like the SNES PPU was designed to support 128K of V-RAM but only
64K was fitted; Snes9x wasn't wrapping all V-RAM address to stay within the
64K limit causing a corrupt title screen on ReX Ronan - there will be others.
- Added amend functionality to the Windows Cheat Entry dialog and added extra
text boxes for direct address and cheat value input rather than only being
able to type in a Game Genie or Pro-Action Reply code.
- BS Suttehakkun2 was crashing just before start of play - the ROM was
performing a junk DMA that was corrupting RAM, crashing the game when it
went searching for a particular value.
- F-1 Grand Prix requires IRQ triggering when IRQ scan-line register set to
current scan line, but Chuck Rock objects. Hmm. Chuck Rock seems to indicate
the CPU emulation is running too fast, but I can't see where the mistake is.
Special-cased Chuck Rock for now.
- Optimised SNES DMA handling slightly - copying data to SNES V-RAM is now
significantly faster.
- Windows Cheat search dialog was ignoring data type parameter in various
places which was causing problems when larger numbers were being searched
for.
- Forced unknown PPU register reads to always return 0 - a coding bug in
Equinox shows that this is required. An earlier fix didn't work.
- Puya Puya 2 & remix were objecting to an NMI being triggered when enabling
NMIs after scan-line 226, but Ys 5 seems to require this. Hmm. Added a hack
to support both games.
1.31
- Snes9x DirectSound code modified - the mixing block size is now always 10ms
for Windows 95/98/2000 and 20ms for NT 4.x, now there should be no need to
enable Sync Sound when a large sound buffer is required (helps emulation
speed). The maximum sound buffer length values have been updated to reflect
the smaller mixing block size.
- Changed the DirectSound code back to use an offset from the play position
as the place to write new sample data into the sound buffer - on NT 4.x the
write position seems to vary randomly rather than being a fixed distance
in front of the play position as documented. Now I know why I used the play
position originally!
- Changed the DirectSound code to fill the sound buffer at the write position
supplied by DirectSound, rather than just before the current play position -
should help reduce latency.
- Added an auto-detect method for interleaved mode 2 Super FX ROM images -
well, not really auto-detect: if the game crashes and its a Super FX game,
Snes9x assumes its in interleaved mode 2, de-mangles the ROM image and tries
to run the game again.
- Had to update the Snes9x Windows registry version number as the additional
diagonal settings make old registry settings incompatible.
- Added diagonal keyboard controls to the Windows port, as requested by
several users.
- Changed PPU code to return zero when reading non-existent registers - the
game Equinox relies on this due to an original game coding bug.
- Included FMOD sound driver support to Windows port - people experiencing
broken sound or delayed sound, etc, might want to give it a try.
- Tales of Phantasia - un-interleaved format ROM memory map changes to match
odd ZSNES format, now the hacked ROM works.
- Changed NMI again. Made reading or writing to PPU register 0x4210
clear NMI pending flag again, without this Super Tennis does not work.
- Changed NMI timing back to be the same as several versions ago and just
special cased Cacoma Knight instead - although kept the code to prevent
the re-triggering of an NNI more than once in the same frame.
1.30
- Forgot to force GUI surface to be displayed when some dialogs where popped
up - problem only happened on full-screen mode with triple or double
buffering enabled, or when using 3dfx mode. It appeared as if Snes9x had
locked up, but pressing Esc would pop down the hidden dialog.
- Added a couple of options to the Settings dialog. Now its possible to
disable S-RAM auto-save which was causing Snes9x to write to the hard disk
every 30 seconds on some games, causing the occasional skipped frame.
- Fixed Reset option which was accidentally broken when Netplay support was
added.
- Added support for Dirt Racer - it leaves the Super FX chip running all the
time, so the default CPU emulation method never allocated any time to other
CPUs and the emulation seemed to lock up.
- NMI timing changed again. Now an NMI can only be triggered once per
frame and enabling an NMI after the normal trigger scan line triggers
an NMI immediately. This fixes display glitches in Ys 5, Stargate and
Daffy Duck.
- Fixed the WAI instruction to only 'wake up' once an actual NMI has
triggered, rather than just waking up when it should have triggered.
This fixes Battletoads, broken since version 1.29(ish).
- Changed NMI again. Made reading or writing to PPU register 0x4210 not
clear NMI pending flag. Seems to allow all the NMI timing sensitive ROMs
I had on my list to now work without any special hacks. Illusion of
Gaia now works again.
- Another NMI fix - cleared the CPU pending NMI flag at start of frame;
Battletoads intro was crashing without this. A long DMA was stopping the
SNES CPU so it couldn't and shouldn't respond to the NMI signal from the PPU.
- Fixed Netplay problem when game didn't have any S-RAM and Sync Using Reset
was being used. An error dialog was displayed and the client would disconnect
from the server.
1.30b#1
- The Windows auto-frame skip code was broken - badly. It didn't re-sync a
timer value with timer events being generated, causing Snes9x to deliberately
stop and wait for an event when it didn't need to, slowing down the overall
emulation speed and increasing the number of frames skipped.
- Improved the Windows cheat search dialog - its now possible to compare
against a value and more comparison functions are available.
- Finally worked out why Voodoo 3 support was so buggy in Snes9x - the Voodoo 3
card generates a WM_DISPLAYCHANGE message when switching to Voodoo mode (the
Voodoo 1 and 2 cards don't); Snes9x thought that some other application had
changed the screen depth or resolution and tried to adjust its window to
match - triggering another WM_DISPLAYCHANGE message. No idea how the code
worked at all; it must have been only by chance and very dependant on the
driver version you were using!
- Implemented Netplay on the Windows port - but its buggy as hell. I seem to
be having major Windows multi-threading problems. Comments I've seen seem to
suggest that Windows 95/98 don't implement true multi-threading; hmm...
- Not happy with the current Netplay, so I scrapped it and tried again;
the protocol is much improved and not using select to control game timing
seems to have removed lots of the threading-type problems I was having.
- Attempted to switch to just using Borland's C++ Builder to build the Windows
port - and failed, again. Although C++ Builder can build Snes9x from sources,
it can't then link in the asm CPU cores. I had hoped Borland might have
fixed this with their latest release - they haven't.
- Several attempts to get Anti Resonance's super-fast sound CPU and sound DSP
code working in Snes9x, but all failed. Part of the problem was his code was
written using TASM and the object files it generated would only work under
Windows - but all my SNES debugging code was in the Linux port. Anti' fixed
that, and I then had some success getting his code working, but its just too
unstable at the moment for a main-stream release.
- Included an option to use Anti Resonance's alternate sample decoding routine;
it can approximate the wind and noise sound effects heard in several Square
Soft games.
- Thanks to Lindsey Dubb for the mode 7 bi-linear filtering code - it
generates a nice smooth image when a game scales the screen using the SNES'
mode 7, but you'll a fast machine if you don't want the frame rate to drop.
- Thanks again to Lindsey Dubb, he improved the colour addition/subtraction
subtraction routines - they are just a little slower but now mostly perform
full 15-bit precision addition and subtraction rather than the previous
13-bits of precision. Many more colour shades can be seen - look at the
improved shading on the Mario Kart or F-Zero track for example.
- Added a reverse stereo option, for people with sound cards that swap the two
channels.
- Added a sound config dialog to the Windows port - now you can access extra
sound options that have always been there, but just no GUI interface to
access them.
- Fixed the 32-bit windowed support on the Windows port.
- Adjusted the NMI timing by a few microseconds to get Metal Warriors working
again.
- Added a few more sound playback rate choices. Most modern sound cards allow
any value to be used from a large range, rather than just a select few, may
be I ought to add text field so you could just type a value in?
- Used Factory Setup 4 to build a new installer package for the Windows port -
just shipping a zip file was confusing novice users and many (mostly AOL
users) seemed to have an odd program mapped to .zip files, further confusing
the issue.
1.29
- Disabled the SPC700 noise feature simulation used by Chrono Trigger and
Final Fantasy 3 until I work out why its being triggered by sound effects
that don't use it.
- Rewrote/reorganised the DirectX and 3D/fx handling code, now both are never
enabled at the same time in Snes9X. It might fix the crashing problems some
Window port users are seeing. Changing between DirectX and Voodoo 3D/fx
modes now requires Snes9X to be restarted.
- Tracked down and fixed the Chrono Trigger black screen problem on the Windows
port: a rogue asm instruction was left in by mistake after some code edits -
it was only by chance that the code worked on the Linux port.
- Added some SNES debug options to the Windows port, but disabled by default,
on the shipped version.
- Clicking on the column headings in the OpenROM dialog in the Windows port
now sorts by that column; plus added some slight screen update optimisations.
- Added an optimisation to graphics rendering: don't add or subtract
sub-screen from background layers, or clear the sub-screen, if SNES fixed
colour is black and no background layers are enabled on sub-screen, even if
ROM tries to enable translucency effects for every background layer.
Discovered Sonic was doing this, there will be others.
- Forgot to enable auto S-RAM save on Windows port, oops!
1.28
- Warning dialog added to the Windows port - if a ROM is loaded from a
read-only directory, e.g. a CD, and the freeze file folder is set to be the
same as the ROM image folder, then a warning is displayed when the game first
starts.
- The Windows port now supports 5 joy-pads - Snes9x always did support 5 but
the Windows port lacked the GUI option to enable and configure it.
- Added an about dialog to the Windows port.
- The Windows port now has a simple settings dialog, only one option so far -
changing the freeze file and S-RAM save directory; much better than having to
use regedit at least.
- Added a new cheat search dialog, you can use it to find where games are
storing life counters, health levels, etc. and then add cheats that stop the
values from changing.
- Added a cheat code entry dialog to the Windows port; now Game Genie,
Pro-Action Replay and Gold Finger codes can be graphically entered and
edited.
- Added a master cheat codes on/off toggle, available from the Cheats menu
on the Windows port.
- Extended the number of cheats per game from 10 to 75.
- Changed cheat code to reapply cheat every emulated frame so if RAM is being
patched the cheat value is continuously applied.
- Wrote some new cheat search code, the code won't be useful until I get around
to writing a cheat search dialog.
- Added automatic cheat code loading and saving using the same file format as
ZSNES.
- Rewrote large parts of the Snes9x cheat handling code ready for adding
cheat dialogs to the Windows port.
1.27
- Added a flag to only enable SPC700 noise 'feature' when Chrono Trigger or
Final Fantasy 3 are loaded - the conditions that I thought were necessary to
trigger the feature where sometimes being met by other games.
- Added a simulation of the SPC700 noise 'feature' where some games, notably
Chrono Trigger and Final Fantasy 3, play samples that deliberately overrun
outside a 16-bit value, the SPC700 sound DSP then for some reason starts to
generate a type of noise sound which the games use to generate wind and
swish type sound effects. Thanks to ZSNES for some of the information.
- Fixed another sound interpolation problem, thanks to Mikael Bouillot -
the initial value of the sample byte being played was not being set correctly
when processing fractional offsets.
- Added auto S-RAM save option; S-RAM is automatically written to a .srm file
a few seconds (30 by default) after a ROM writes to it - useful for people
who were playing games long into to night, only to lose their progress
after a power cut or machine crash.
- NMI delay code changed again - the fix for Cacoma Knight was breaking
Tuff E Nuff; it would seem delaying NMI until the start of h-blank to too
long, added a cycle counter instead.
- Fixed yet another clip window bug - clip window was being incorrectly set
at no range if colour window was enabled but background layer clip window
was disabled (meaning layer should not be clipped).
Fixes the sunken ship level on FF5.
- Worked out (by example) how to add keyboard accelerators to the Windows port,
now toggling full screen using ALT+Return works.
- Added mouse-warp to the Windows port so the the cursor doesn't wonder off the
Window while SNES mouse emulation is enabled.
- Improved 3dfx support on Windows port - load dialog doesn't drop out of
bi-linear mode and underlying window zooms to full-screen so its easy to find
and click on the menu bar with the mouse.
- Added Mouse and Superscope SNES emulation support to the Windows port, use
'7' on the keyboard to select.
- Windows cursor now hidden unless super scope emulation is enabled.
- Windows port now has command line parsing - cheapo way of adding Game Genie,
Pro Action Replay cheat codes, disabling sound CPU emulation for the
corrupt copy of Star Fox 2, etc. Also allows ROM images to be dropped onto
the Snes9x icon.
- Cacoma Knight seems to provide proof that Snes9x triggers the SNES
non-maskable interrupt (NMI) too early. Changed interrupt to trigger at the
start of the next horizontal blank period. Will have to watch for it
causing problems for other ROMs.
- Added a translucency hack - when a ROM tries to create a stipple background
pattern by enabling pseudo hi-res. and not enabling a background layer on
one of the screens, Snes9x changes the effect to use transparency effects
instead (the real SNES can't do transparency effects with pseudo hi-res.
enabled). Now the water in Kirby 3 is translucent.
- SA-1 CPU reset bug fixed, now Jumpin' Derby boots and plays but with major
graphics problems.
- Fixed nasty asm SA-1 custom hardware read/write bug that was causing the
course map not to be displayed on Augusta Masters and Pebble Beach.
- Added SA-1 character conversion DMA support for all SNES depths, now
Augusta Masters and Pebble Beach work.
- Merged in minor code changes for Linux running on the Alpha processor. Thanks
to Sadruddin Rejeb for the changes.
- Added four more auto-multi-player-adaptor-emulation-off presets based on
code from Mystagogus.
- Added DirectX3D output image processing support to the Windows port... and
removed it again because it causes my desktop machine to lock up. Back to
the drawing board...
1.26
- Fixed memory leak that crept in when SA-1 support was added when loading a
game freeze file.
- Added SPC dumping option based on code from Cyber Warrior X that he sent me
ages ago but I've just found again while looking for something else!
- Merged in most of the Amiga PPC port source code changes into the main
source code tree.
- Keying on a sound channel seems to clear its last-sound-sample-block-just-
played flag. Chaos Engine/Soldiers of Fortune needs this.
- Add multi-thread support to the UNIX ports for sound playing - required in
the Linux port to work around a Sound Blaster Live driver bug and useful if
you have multiple CPUs in your machine to help spread the emulation workload.
1.25
- Added BS 24Mbit ROM memory map, for Derby Stallion 96 and Sound Novel-TCool.
No idea if it works. Thanks to Nose0000 for the info and code.
- Corrected unzip code not to loop forever if an encrypted zip file is loaded -
an error is generated instead.
- Changed relative SPC700 cycle length for Mortal Kombat 3 to fix sample
repeat problems - I wish I knew exactly how fast the SPC700 is clocked.
Maybe I should write a test ROM and run it on a real SNES?
1.24
- 3dfx speed hack back again, only disabled when Seiken 3 is loaded.
- Some minor SA-1 speed ups added - the SA-1 instruction skipping code will
have to wait until I have more time.
1.23
- Corrected a SA-1 reset bug that reset the SA-1 RAM bank pointer back to block
zero but didn't clear the RAM bank register. Was causing Kirby 3 to crash.
- Fixed a wave clipping problem with interpolated sound that was causing noise
on sound output when certain sound samples were played.
- Fixed a bug in the sync-sound code that could overrun the sound buffer by a
few bytes causing clicks on the sound output.
- The sound sample repeat bug that has plagued Snes9x ever since is was called
Snes96 finally bit the dust - Snes9x continued to play sample loops
even if the game dynamically updated the sample not to loop. Fixes the
stutter in the Mortal Kombat series and improves the sound from several games
that download sound samples in real-time as they are played.
- Rewrote the code the handled the SPC700's 64 byte shadow RAM area to fix a
possible sample corruption problem with ROMs that stored samples that
cross the 64 byte start area.
- Added code to allow ROMs to change the sample being played the next time the
channel loops or is keyed on - not sure if it fixes anything but seems more
correct.
- Added a zero-frequency fix to the stereo sound mixing code that I'd already
added to the mono code some time ago.
- Changed the code to set the end-of-sample flag just before the last block is
played, rather than just after. Seems to help improve the sound on some
games.
- Sound sample start code now doesn't reset the channel's envelope volume level
to zero before starting the sample - helps reduce the clicks being heard when
a channel envelope volume level hadn't reached zero before being keyed on
again.
- Changed initialisation of sample-end-register to 0 rather than 255 - seems
more logical now I've thought about it. Not sure if it helps anything.
1.22
- Finally fixed the corrupt copy of Donkey Kong Country not working problem -
Snes9x thought the ROM used the same memory map as Street Fighter Alpha 2.
- Added explode, un-shrink and un-reduce decompression modes support to the
unzip code.
- Fixed offset per tile bug that crept in after me trying to fix the Starfox
on-tilt bug.
- Made some fixes to the C Super FX emulation code, enough to get most 'FX
games playable on the Mac port.
1.21
- Finally worked out how character DMA worked on the SA-1 and implemented a
hacky, slow version, but its enough to get the level up screens displaying
correctly on Mario RPG.
- Incorporated ZSNES' new optimised Super FX asm code - had to track down and
fix a nasty memory overwrite bug in the code first to get it to work.
- Changed sample mixing code to not automatically wrap offsets to
keep inside the sound buffer, external port code is now expected to do that.
Helped me fix a problem in the Windows port that prevented very large sound
buffers from working, which are required for some badly written sound card
drivers.
- Corrected a bug in the SA-1 C code where incorrect processor emulation
functions where called if the code was compiled with in-lining turned off.
- Fixed crash bug in Super Mario RPG on the level up screen - forgot to mask
the enable bit from the RAM bank register. Thanks to Christian Wolf for
sending me a freeze file which made it easy to find the problem.
- Fixed a lockup bug in the window clipping code, if the ROM ever turned off
the sub-screen completely the clipping code would enter an infinite loop.
Fixes The Cartoon Addams.
- Made the Daffy Duck NMI fix only enable when Daffy Duck is loaded - fix was
causing problems for Breath Of Fire 1 and 2.
1.20
- Windows port no longer sets DirectSound to exclusive mode, so its now
possible to hear sound output from Windows apps while Snes9x has focus.
- Fixed the freeze file loading and saving on the Windows port.
- More GUI settings are saved in the registry on the Windows port now.
- Added 3D/FX image scaling/filtering support to the Windows port.
- Added the TV mode from the Mac/Linux ports to the Windows port.
- Incorporated Kreed's new output image routines into the Windows port that
fixes RGB555 display colour problems. Many thanks to Kreed.
- New auto-frame rate timing code on the Windows port, stops the silly speed
up problems when the old code tried to 'catch up' after the emulator had
been paused.
- Increased the DirectSound secondary buffer length on the Windows port to
hopefully fix all the static/broken sound output problems some people were
experiencing.
- Altered the ZSNES Super FX asm code so the Windows port could use it - all
previous versions of the Windows port were shipped using the C Super FX
emulation code which is a lot slower.
- Implemented interpolated and sync-sound options on the Windows port.
- Added an image stretch option to the Windows port - stretches the SNES image
to fill the whole screen or the Window. Looks really good on my TNT card
since that chips seems to filter the image as it scales it.
- Implemented Windowed mode on the Windows port.
- Added special SPC700 cycle timing for Empire Strikes Back.
- Fixed the missing polygon problem for Super FX games - thanks to zsknight
for the information.
- Implemented SA-1 support required for Mario RPG, Kirby Superstar,
Paradius 3, etc. but since only a good image of Mario RPG exists, I could
only test that game.
- Fixed a graphics clip window bug: inverting the area of a clip area that
only consisted of empty bands should become the full width of the screen;
Mario Kart's rear-view mirror display needs it.
- Fixed mode 7 render code to use correct z-buffer when rendering onto the
sub-screen. Fixes Final Fantasy V title screen.
- Added horizontal offset per tile support in the offset per tile modes 2
and 6, and switchable horizontal/vertical offset in mode 4. Fixes Chrono
Trigger in several places and Mario All Stars title screens.
- Changed SPC700 relative cycle length to 14, needed for Stunt Car Racer.
- Enabled immediate triggering of NMI if NMI enable flag set while scan-line
was on first line of v-blank. Needed to fix a background jitter bug in
Daffy Duck: The Marvin Missions.
- Altered ROM load code to ignore corrupt ROM map type byte in ROM header,
preventing the code erroneously detecting what it thinks are interleaved
ROMs. Fixes EEK! The cat, Formation Soccer, the corrupt copy of Donkey
Kong Country, ...
- Disabled IRQ re-triggering if V-IRQ registers set to the current line. Fixes
Chuck Rock.
- Fixed missing sprites in Andre Agassi Tennis - writing to low byte only of
the sprite write address register seems to also clear the hi-byte.
1.19
- Games written by the Japanese software company Human seem to need special
SPC700 sound CPU timing, so the ROM load and reset routines now check the
software author company and adjust the CPU cycle length accordingly.
It gets Clock Tower, Super Fire Pro-wrestling Premium, etc working.
- Added ROM check sum calculation and testing code - Snes9x can now detect
pure, corrupt or hacked ROMs.
- Noticed a fast way to implement the SNES 4096 colour mode, so I implemented
it. Now the colours in ActRaiser 2 look correct.
- Corrected a noise frequency error thanks to information from Takehiro.
- Added a 'start in full screen mode' flag to the Linux port.
- While debugging the new graphics code I thought of a fast way to implement
the SNES direct colour mode, tried it out and now the colours in Actraiser 2
are correct.
- Blast, forgot about the colour window and fixed colour effects. The separate
sub-screen is back again, but all the other graphics speed ups are there.
- Now I've got a z-buffer I keep finding other ways to optimise the SNES
graphics rendering - no need for a separate sub-screen, no need to clear
the sub-screen to the fixed colour, no need to waste CPU time on translucency
effects on hidden pixels, no need to completely clear the main-screen to the
back drop colour, etc., etc.
- Implemented a software z-buffer and changed the SNES graphics rendering to
use it (required change for future 3D card support). Finally fixes the
sprite-to-sprite priority bug that some games suffer from. Also a big speed
increasing for some games (10 fps+), others are slight losers.
- Added code to skip the rendering of completely transparent graphic tiles
rather than comparing each pixel to see if it is transparent; helps the
frame rate a bit on some games.
- Added a fixed for Tetris & Dr. Mario - the game didn't like a multi-player 5
adaptor plugged in to the real SNES when being played, so turned off the
adaptor emulation for this game.
- Added hack for Final Fantasy II - if sync sound isn't on, make attack rate of
1ms actually 0ms (old v1.16 behaviour). Causes a slight click but its better
than samples being cut short.
- Fixed a clip window area invert bug if the colour window was enabled on
on one window and the other window was being used to clip a background layer.
Fixes the finial (I hope) display problem with Gun Hazard.
- Added code to intersect the clip window areas if both a colour window and
a background layer clip window were enabled at the same time. Required by
Gun Hazard.
- Forgot to mark graphic clip windows as needing recomputing when the master
colour window inside/outside/on/off/main-screen/sub-screen PPU register was
updated. Was causing display problems for Gun Hazard.
- Internal H-DMA execution accelerator pointer variables where not always
being recomputed when started H-DMA part way into a frame. Was causing
display problems for Gun Hazard.
- Made H-DMA continue for one extra scan-line to fix a disappearing monster
problem in Dragon Quest 5. Thanks to Alex Jackson for the bug report.
- Zoop seems to require volume envelope height reading by the sound CPU to
always return 0 when the channel is in gain mode.
- The sound code was ignoring updates to the ADSR volume envelope rates while
one was in progress. Fixed that and now the bird song at the start of
Chrono Trigger sounds correct.
- Had to disable the CPU shutdown code for loops reading the horizontal beam
position, it was causing problems for Star Fox. Still no polygons though.
- Oops, sound DSP noise output was broken - accidentally deleted an important
line while removing debug code ready for the last release.
- Added initial 3Dfx support to the Linux port - basically using the Voodoo
card as a bi-linear filtering, scaling blitter. Actually slightly slower than
TV mode, for non-scrolling images due to poor texture upload speeds to the
card, but the full-screen feature is nice and the speed doesn't drop as more
of the screen changes.
1.18
- Implemented a sync-sound mode where sound data gets generated in sync with
SPC700 instructions being executed. Finally the sound Williams Arcade
classics can be heard. Also helps slight sound timing problems in many other
games but doesn't fix Mortal Kombat 2 like I thought it would - its
sound routine programmers must have been on drugs or something!
- Added interpolated sound - gives low frequency sounds much more bass similar
to a real SNES especially with the playback rate ramped up to 44KHz.
- Added on-screen messages as various emulation options are toggled on and off
using the in-game keys.
- Fixed a PPU register read bug with the sprite register write position. Thanks
to Takehiro TOMINAGA for the bug report.
- Altered the auto-frame skip timing code to only wait and re-sync to the end
of frame when frames haven't been skipped. Again thanks to Takehiro.
- Speeded up the colour addition and subtraction code using ideas from
Takehiro.
1.17
- Linux and UNIX sound code now driven directly from signal timer handler
rather than the timer handler just setting a flag which had to be polled in
the main emulation code. Slightly faster execution.
- Fixed the crash bug in the ZSNES Super FX asm code with Vortex - the game's
polygons still aren't visible though.
- Implemented bent-line increase and exponential decay and sustain volume
envelopes - they should match, or at least be very similar to the real SNES
sound DSP chip now.
- It would seem ROMs can key on sound channels even if the channel hasn't
been keyed-off, Pac-In-Time requires it. Changed code to allow it.
- Quick mod to ZSNES Super FX code to get Winter Gold working - it was already
working with the C Super FX code.
- Added emulation of the extra 1/2 scan-line per frame on PAL and NTSC -
should help improve music speed emulation.
- Worked around the click sound heard when ROMs use 0 volume envelope attack
rate.
- Removed the 'check for IRQ already happened' H-IRQ position register setting
code - it was causing problems for Ninja Warriors and was not required by
F1 Grand Prix.
- Fixed a bug in the new sound code - the sustain part of the
attack-decay-sustain-release volume envelope was being skipped if the
sustain level wasn't at 100%. The fix has helped some music notes from
being cut off early in a few games.
- Added fix to Pro Action Reply support (again). Thanks to Paul Shoener III for
the original fix and Gil Pedersen for reminding me to apply it!
- Finally fixed the Tales of Phantasia 'bum note' problem! The ROM set its
sample directory to the upper-most page and I forget to code for the hidden
64 bytes of RAM, that appear when the boot ROM is switched off, when fetching
sample addresses.
- Adjusted the relative cycle length between the 65c816 and the SPC700 slightly
to get Terranigma working again.
- Oops, the emulated joypads 3 and 4 via the emulated Multi-player 5 interface
weren't working. Thanks to Steffen Schwenke for the bug report.
- Optimised the echo sound code - by-passed the the FIR filter code if only
a pass-through FIR filter was defined by the ROM.
- Modified V and H-IRQ register changing code to trigger an IRQ immediately if
V-IRQ is enabled and the scan-lines match and either H-IRQ is not enabled or
the electron beam position has already gone past the trigger point. Fixes
the screen flicker in F1 Grand Prix.
- Modified the priority-per-pixel mode 7 code to use BG#1's clipping data if
the top bit of the mode 7 pixel is set. Fixes initial track drive-through
display in F1 Grand Prix.
- Modified the sprite priority levels for the priority-per-pixel mode 7
display. Now the car can be seen in F1 Grand Prix.
- Wrote a sound DSP register recording scheme which 'plays back' the register
changes in sync with the sound generation code. I'm bit disappointed, it
only improves the sound in a very few games... Scrapped the code, it actually
causes more problems than it fixes. Oh, well, another 3 weeks work wasted...
- Fixed a SPC700 wake up problem for Lufia I - made the SPC700 also wake up
when the 65c816 read from one of the four comm ports.
- Included lots of sound code speed ups and sound quality improvements
from Takehiro TOMINAGA - many thanks go to him.
1.16
- Fixed a case where the -forcelorom option didn't work - the case was
required for Formation Soccer which claims in its ROM header to use the
same memory map as Super FX ROM, it doesn't.
- Pulled apart a real SNES using a crowbar (great fun), just to look at what
speed the SPC700 is actually clocked at for more accurate relative emulation
speed.
- Implemented SPC700 cycle counting in the hope the improved timing would fix
Tales'; no such luck but at least the -ratio option is obsolete now.
- Implemented executing SPC700 instructions during DMA, fixes BSZelda and
Goal lock up at start and music pausing briefly when ROMs do lots of DMA,
usually between game screens.
- Scrapped the i386 asm SPC700 code - it was the cause of the music not
restarting after a battle in Chrono Trigger and FF3 and I didn't realise
because the bug had already occurred in the test freeze-file I had.
Thanks to John Stiles for pointing out that the Mac port didn't have the
missing music problem.
- Fixed RGB subtraction bug on displays with only 5 bits for green, e.g. RGB555
displays. The GREEN_HI_BIT variable was always set to a value for 6 bit
green displays.
- Added the SA-1 memory map, still a long way to go before any SA-1 game will
run.
1.15
- Jumped versions to keep in sync with the DOS port release.
1.14
- Improved 8-bit sound generation slightly, but it still sounds very poor
compared to 16-bit sound.
1.13
- Implemented the Tales of Phantasia memory map using the information supplied
by zsKnight. Had to also implement a de-interleave routine to work around
a ROM feature and Snes9x CPU instruction fetching implementation detail.
- Added a frames-per-second on-screen display option.
- Fixed the final glitch bug with the Mario Kart track display - the byte code
for the termination of the DSP1 raster command wasn't been recognised.
- Disabled a NMI/DMA hack for Rise of the Robots, was causing problems for
Mario Kart and 'Robots wasn't working correctly anyway.
- Optimised the mode 7 rendering a little.
- Changed tile rendering code to use offsets into screen buffer rather than
direct pointers ready for z-buffer implementation.
1.12
- Changed V-blank NMI to occur immediately after a WAI instruction, Toy Story
required this.
- Fixed reading of H-DMA line counter register, Top Gear 3000 needed this.
- Ripped off large parts of ZSNES's DSP1 code (with _Demo_'s and zsKnight's
approval). Now Mario Kart works almost 100%.
- Added a check to see if a vertical scan-line IRQ register change will cause
a H-IRQ later on the current scan-line. Pilot Wings needed this.
- Fixed possible crash bug in clip window code when both windows had two
spans. Could actually cause Chrono Trigger to crash the emulator.
- Fixed a lock-up problem with the C Super FX code, Star Fox and executing
a few 'FX instructions per scan-line (required for Winter Gold).
1.11
- Partially fixed the DOS netplay server - the server timer is running too
slowly and it doesn't deal with disconnects correctly yet.
- Corrected the sound echo delay - it was varying with the sound playback
rate chosen by the user - it shouldn't have been.
- Implemented DOS netplay code - DOS server code still not working though.
- Removed all floating point calculations from the sound generation code.
- Fiddled with the pitch modulation code - my guess is the output of a
channel that is used to modulate the frequency of another channel is
automatically muted by the SPC700 chip. Just a guess, but the wind from
FF3 sounds 'better' but far from perfect.
- Optimised the tile palette index calculation.
- Optimised the planar to chunky tile conversion code.
- Fixed X11 port to always scale SNES image if hi-res. only (no interpolation)
support is enabled.
- Added zipped ROM image support using Gilles Vollant unzip code and
some code that Ivar (Lestat) sent me a long time ago.
- 65c816 asm RTI instruction was destroying the program bank in emulation mode,
the C code was already correct. Caused C64E to break.
1.10
- Finished NetPlay v1 - allows up to five networked machines to play
multi-player SNES games, one player on each machine.
- Switchable full-screen mode added to Linux X11 port, some code and ideas
nicked from Maciej Babinski's original Snes9x XFree86 DGA Linux port, the
UAE Amiga emulator, plus lots of my own code.
1.08
- Bug fixes to C Super FX emulation - now Winter Gold works correctly again.
1.07
- More DSP1 work. Mario Kart is now playable! The character projection code
is still broken so the opponents and obstacles aren't always positioned
correctly on screen and you keep bumping into them, but I can still keep
coming first!
- Started work on NetPlay support.
- Decreased sound card DMA buffer size on DOS port to improve sound generation
and sound CPU synchronisation in some games.
- Included Linux joystick driver patches from Vojtech Pavlik so the port can
use the new v1.x joystick drivers, again written by Vojtech Pavlik. Allows
use of Micro$oft Sidewinder pads, NES and SNES pads, PlayStation pads,
Gamepad Pros, etc.
- Added halve-the-result colour subtraction.
1.06