summaryrefslogtreecommitdiff
path: root/common/predef.asm
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2013-09-09 15:59:08 -0500
committerBryan Bishop <kanzure@gmail.com>2013-09-09 15:59:08 -0500
commit3a2dbb5289e745dfb5f26844148c0981f14e8fcf (patch)
treedfb418aa41502c67ae3f75bab4d3df91b5cfd6c1 /common/predef.asm
parent37e1aa4e8ec2400ba97db4c767bd3a9fcd43a1ac (diff)
parentabb7f2fa20e49cf56a55c81d4ec86431e3009098 (diff)
Merge branch 'yenatch/split-predefs-specials-stds' into fix-split-predefs-specials-stds
https://github.com/kanzure/pokecrystal/pull/198
Diffstat (limited to 'common/predef.asm')
-rw-r--r--common/predef.asm54
1 files changed, 54 insertions, 0 deletions
diff --git a/common/predef.asm b/common/predef.asm
new file mode 100644
index 000000000..bd34a87a1
--- /dev/null
+++ b/common/predef.asm
@@ -0,0 +1,54 @@
+Predef: ; 2d83
+; Call predefined function a.
+; Preserves bc, de, hl and f.
+
+ ld [PredefID], a
+ ld a, [hROMBank]
+ push af
+
+ ld a, BANK(GetPredefPointer)
+ rst Bankswitch
+ call GetPredefPointer ; stores hl in PredefTemp
+
+; Switch to the new function's bank
+ rst Bankswitch
+
+; Instead of directly calling stuff,
+; push it to the stack in reverse.
+
+ ld hl, .Return
+ push hl
+
+; Call the Predef function
+ ld a, [PredefAddress]
+ ld h, a
+ ld a, [PredefAddress + 1]
+ ld l, a
+ push hl
+
+; Get hl back
+ ld a, [PredefTemp]
+ ld h, a
+ ld a, [PredefTemp + 1]
+ ld l, a
+ ret
+
+.Return
+; Clean up after the Predef call
+
+ ld a, h
+ ld [PredefTemp], a
+ ld a, l
+ ld [PredefTemp+1], a
+
+ pop hl
+ ld a, h
+ rst Bankswitch
+
+ ld a, [PredefTemp]
+ ld h, a
+ ld a, [PredefTemp + 1]
+ ld l, a
+ ret
+; 2dba
+