]> git.sesse.net Git - s573compress/commitdiff
Rewrite the limitations section.
authorSteinar H. Gunderson <steinar+ddr@gunderson.no>
Sat, 7 Dec 2019 12:52:25 +0000 (13:52 +0100)
committerSteinar H. Gunderson <steinar+ddr@gunderson.no>
Sat, 7 Dec 2019 12:52:25 +0000 (13:52 +0100)
README

diff --git a/README b/README
index dcf929ea7c5380ff215a91ffca8a9ec6650a3b0c..303560643b26153569c74f9ef15cef659a231de8 100644 (file)
--- a/README
+++ b/README
@@ -83,33 +83,79 @@ something like
 Limits
 ======
 
-How many songs can you add? There are certainly limitations, but nobody knows
-exactly where the true ceiling lies:
+How many songs can you have? It appears that without fairly large binary
+modifications, the effective limit in the EXTREME engine is 248. Let's look
+through the list of known limits:
 
-  - An ISO9660 (CD-ROM) directory can not be larger than 0x6000 bytes,
+  - An ISO9660 (CD-ROM) directory can not be larger than 0x6000 bytes (24 kB),
     or the files past that will not be found (this is of course a limitation
     in Konami's code, not the standard). /DAT/ is very close to this limit,
-    but you can get around it by putting shorts somewhere else, such as flash
-    or a second CD-ROM directory (the latter requires patching aout.exe,
-    or perhaps being creative with naming).
+    but there's a little trick here: Nothing stops you from using a slash
+    within the filename in mp3_tab.bin, so that if you use a filename
+    such as e.g. “M2/BBBBB” (instead of the default “M6XBBBBB”), the game will
+    look in /DAT/M2/BBBBB.DAT (and /DAT/M2/ will have a separate 0x6000 limit,
+    so you can put lots of files in there). Optionally, of course, you can put
+    shorts in flash, or modify the unused third path in aout.exe (by default
+    c:/tmp/).
 
   - There seems to be a limit of 0x130000 bytes (19 922 245), give or take
     a little, for the sum of all menu music (E*.DAT), shorts (S*.DAT) and
     single biggest song (biggest M*.DAT in bytes). If you go above this limit,
     only menu music will be loaded. This is probably since the I/O board
-    has 24 MB RAM. You can get around this by simply marking shorts as
-    not loaded on startup, although it will probably cause lag in the
-    songwheel.
-
-  - There is a limit of 500 entries in mp3_tab.bin. You can increase this
-    somewhat by patching (the instruction is at 0x800af604), but it's not
-    clear by how much until you start overwriting neighboring data and
-    corrupting memory.
-
-  - Finally, it seems there's a limit of 256 songs, including the system
-    sounds (of which there are nine), so you can only have 247 in the
-    songwheel before they get truncated (possibly ordered by song_number).
-    This one has not been investigated thoroughly yet.
+    has 24 MB RAM. (There is also a limitation of 300 preloaded files, since
+    there's a fixed array that holds them.) You can get around this by simply
+    marking shorts as not loaded on startup, although it will probably cause
+    lag in the songwheel.
+
+  - There is a limit of 500 entries in mp3_tab.bin (loaded at 0x801cc948);
+    10 or 11 are used for the system, depending on whether you include the
+    trailing zero entry. This would indicate you could only have 244 or 245
+    songs, but you can increase this somewhat by patching (the instruction
+    is at 0x800af604). The dword immediately after the array (address 0x801cf828)
+    is used for some status (seems to be 0xff000003), which means that this
+    entry will be corrupted, but after that, it _seems_ to be clear up to
+    0x801cfedc, indicating that there would be room for 570 or 571 entries,
+    ie., 279 or 280 songs. Anything more than this, and one would need to
+    relocate the MP3 table.
+
+  - Finally, after loading, the songs in the music database are indexed
+    mostly by song_number (starting from 1 and going upwards; create_mdb.py
+    will re-sort them by title for you). A number of places test this index
+    against a limit of 247, 248 or 249; for instance, a common utility function
+    (at 0x800a886c) will simply refuse to return the pointer to any song number
+    above 248. This limit is hard-coded in a number of places; an incomplete
+    list of instructions that seem to be relevant (checking such limits or
+    setting end points, sometimes multiplied by four or plus/minus 1) include
+
+      0x800698a0, 0x8007f084, 0x8007f090, 0x8007f224, 0x8007f298, 0x8007f2ac,
+      0x8007f478, 0x80081868, 0x80082538, 0x80087094, 0x800873a8, 0x80089208,
+      0x80089ad8, 0x80089b94, 0x8008becc, 0x8008c128, 0x8008def0, 0x8008e88c,
+      0x8008ee74, 0x800a79d4, 0x800a79e0, 0x800a7a24, 0x800a7dbc, 0x800a7fcc,
+      0x800a886c, 0x800a94d0, 0x800ba5a8
+
+   Note in particular that the function starting at 0x8007ebc4 (which seems to
+   be sorting and building the song wheel) stores sort keys for each song in
+   an array that is 250 entries long, so you will easily overrun the stack
+   if you increase the limits by too much. There are also some special song_number
+   values; e.g., one of the high 0xF* values seems to be the roulette entry.
+
+
+The latter barrier seems to be the hardest one to change. For those who wish to
+experiment with moving data to other places, these parts of the RAM seem to be
+unused (based on simply dumping the memory and looking for zeros, then setting
+watchpoints in the MAME debugger):
+
+  0x800f5b70   57 kB
+  0x80109df0   57 kB
+  0x8012abe0   96 kB
+  0x80210010  159 kB
+  0x802e23e0  119 kB
+  0x80368930  128 kB
+  0x803e7cc0   75 kB
+
+These would all be reasonable places to try to relocate data to. The bootloader
+(loaded near the top of the RAM) also seems to be unused after the game has
+booted.
 
 
 License