ref: 18efb2fab3cec16c8f82ebec71b6c2201c349f1d
parent: 0aadbec02a3a26fbad302cc56b841f3bd987370c
author: mid-kid <[email protected]>
date: Fri Feb 24 06:46:09 EST 2023
Document scripting engine fix for MBC30
--- a/docs/design_flaws.md
+++ b/docs/design_flaws.md
@@ -14,6 +14,7 @@
- [The 6-bit caught level can only record up to level 63](#the-6-bit-caught-level-can-only-record-up-to-level-63)
- [Identical sine wave code and data is repeated five times](#identical-sine-wave-code-and-data-is-repeated-five-times)
- [`GetForestTreeFrame` works, but it's still bad](#getforesttreeframe-works-but-its-still-bad)
+- [The overworld scripting engine assumes no more than 127 banks](#the-overworld-scripting-engine-assumes-no-more-than-127-banks)
## Pic banks are offset by `PICS_FIX`
@@ -815,4 +816,37 @@
+ and 1
+ add a
ret
+```
+
+
+## The overworld scripting engine assumes no more than 127 banks
+
+The `CallCallback` and `ExitScriptSubroutine` functions in [engine/overworld/scripting.asm](https://github.com/pret/pokecrystal/blob/master/engine/overworld/scripting.asm) use the highest bit of the bank value, to store whether a certain script stack position should be treated as a return from a callback. However, it seems it was opted to explicitly use the `endcallback` command for this purpose, instead.
+
+As such, this bit serves no purpose but to make map scripts living in the higher banks of mappers such as Japanese Crystal's MBC30 crash for weird reasons.
+
+**Fix:**
+
+Remove the bit mask for the bank value in `ExitScriptSubroutine`:
+
+```diff
+ ExitScriptSubroutine:
+ ...
+ add hl, de
+ ld a, [hli]
+ ld b, a
+- and $7f
+ ld [wScriptBank], a
+ ld a, [hli]
+ ld e, a
+```
+
+And in `CallCallback`:
+
+```diff
+ CallCallback::
+- ld a, [wScriptBank]
+- or $80
+- ld [wScriptBank], a
+ jp ScriptCall
```