summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore61
-rw-r--r--asm/diploma.s607
-rw-r--r--asm/field_specials.s4
-rw-r--r--asm/overworld.s6
-rw-r--r--asm/pokedex.s6
-rw-r--r--asm/trainer_card.s4
-rw-r--r--data/specials.inc2
-rw-r--r--include/overworld.h1
-rw-r--r--include/pokedex.h3
-rw-r--r--ld_script.txt2
-rw-r--r--src/diploma.c254
-rw-r--r--sym_ewram.txt3
-rwxr-xr-xtools/asmdiff.sh7
13 files changed, 308 insertions, 652 deletions
diff --git a/.gitignore b/.gitignore
index c85c20759..6910d62e9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,48 +1,49 @@
-*.exe
-*.o
-*.i
-*.elf
-*.gba
*.1bpp
*.4bpp
*.8bpp
+*.DS_Store
+*.bak
+*.bat
+*.diff
+*.dump
+*.elf
+*.exe
+*.fwjpnfont
+*.gba
*.gbapal
-*.lz
-*.rl
-*.pcm
-*.latfont
*.hwjpnfont
-*.fwjpnfont
-*.bat
-sound/**/*.bin
-src/*.s
-tools/agbcc
-tools/binutils
-ld_script_ruby.txt
-ld_script_sapphire.txt
-*.map
+*.i
*.id0
*.id1
*.id2
-*.nam
-*.til
-.fuse*
+*.latfont
*.ld
-tags
-types_*.taghl
-*.swp
-*.swo
+*.lz
+*.map
+*.nam
+*.o
+*.pcm
+*.pl
+*.rl
*.s.old
*.s.old2
-*.dump
*.sa*
+*.swo
+*.swp
+*.til
+.fuse*
+.idea/
Thumbs.db
build/
-.idea/
cmake-build-*
-*.DS_Store
-*.pl
-*.bak
+ld_script_ruby.txt
+ld_script_sapphire.txt
+sound/**/*.bin
+src/*.s
src/data/items.h
+tags
+tools/agbcc
+tools/binutils
tools/br_ips/br_ips
tools/br_ips/ips_patch
+types_*.taghl
diff --git a/asm/diploma.s b/asm/diploma.s
deleted file mode 100644
index 9e3d1b3ee..000000000
--- a/asm/diploma.s
+++ /dev/null
@@ -1,607 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80F4BFC
-sub_80F4BFC: @ 80F4BFC
- push {lr}
- bl LoadOam
- bl ProcessSpriteCopyRequests
- bl TransferPlttBuffer
- pop {r0}
- bx r0
- thumb_func_end sub_80F4BFC
-
- thumb_func_start sub_80F4C10
-sub_80F4C10: @ 80F4C10
- push {r4,lr}
- ldr r4, _080F4C40 @ =gUnknown_203AB48
- ldr r0, _080F4C44 @ =0x00001004
- bl AllocZeroed
- str r0, [r4]
- movs r1, 0
- strb r1, [r0]
- ldr r0, [r4]
- strb r1, [r0, 0x1]
- ldr r0, [r4]
- strb r1, [r0, 0x2]
- bl sub_80F4E24
- ldr r0, _080F4C48 @ =sub_80F4C68
- movs r1, 0
- bl CreateTask
- ldr r0, _080F4C4C @ =sub_80F4C50
- bl SetMainCallback2
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080F4C40: .4byte gUnknown_203AB48
-_080F4C44: .4byte 0x00001004
-_080F4C48: .4byte sub_80F4C68
-_080F4C4C: .4byte sub_80F4C50
- thumb_func_end sub_80F4C10
-
- thumb_func_start sub_80F4C50
-sub_80F4C50: @ 80F4C50
- push {lr}
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_80F4C50
-
- thumb_func_start sub_80F4C68
-sub_80F4C68: @ 80F4C68
- push {r4,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _080F4C84 @ =gUnknown_203AB48
- ldr r0, [r0]
- ldrb r0, [r0, 0x2]
- cmp r0, 0x8
- bhi _080F4D30
- lsls r0, 2
- ldr r1, _080F4C88 @ =_080F4C8C
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_080F4C84: .4byte gUnknown_203AB48
-_080F4C88: .4byte _080F4C8C
- .align 2, 0
-_080F4C8C:
- .4byte _080F4CB0
- .4byte _080F4CB8
- .4byte _080F4CBE
- .4byte _080F4CCA
- .4byte _080F4CDC
- .4byte _080F4CFC
- .4byte _080F4D02
- .4byte _080F4D10
- .4byte _080F4D22
-_080F4CB0:
- movs r0, 0
- bl SetVBlankCallback
- b _080F4D50
-_080F4CB8:
- bl sub_80F4E40
- b _080F4D50
-_080F4CBE:
- bl sub_80F4F9C
- lsls r0, 24
- cmp r0, 0
- beq _080F4D5A
- b _080F4D50
-_080F4CCA:
- ldr r1, _080F4CD8 @ =gUnknown_84154E8
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl CopyToBgTilemapBuffer
- b _080F4D50
- .align 2, 0
-_080F4CD8: .4byte gUnknown_84154E8
-_080F4CDC:
- bl sub_8088F84
- lsls r0, 16
- cmp r0, 0
- beq _080F4CF2
- movs r1, 0x80
- lsls r1, 1
- movs r0, 0x14
- bl SetGpuReg
- b _080F4D50
-_080F4CF2:
- movs r0, 0x14
- movs r1, 0
- bl SetGpuReg
- b _080F4D50
-_080F4CFC:
- bl sub_80F5018
- b _080F4D50
-_080F4D02:
- movs r0, 0
- bl CopyBgTilemapBufferToVram
- movs r0, 0x1
- bl CopyBgTilemapBufferToVram
- b _080F4D50
-_080F4D10:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- b _080F4D50
-_080F4D22:
- ldr r0, _080F4D2C @ =sub_80F4BFC
- bl SetVBlankCallback
- b _080F4D50
- .align 2, 0
-_080F4D2C: .4byte sub_80F4BFC
-_080F4D30:
- ldr r0, _080F4D64 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080F4D50
- movs r0, 0x5
- bl PlayFanfareByFanfareNum
- ldr r0, _080F4D68 @ =gTasks
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _080F4D6C @ =sub_80F4D74
- str r0, [r1]
-_080F4D50:
- ldr r0, _080F4D70 @ =gUnknown_203AB48
- ldr r1, [r0]
- ldrb r0, [r1, 0x2]
- adds r0, 0x1
- strb r0, [r1, 0x2]
-_080F4D5A:
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080F4D64: .4byte gPaletteFade
-_080F4D68: .4byte gTasks
-_080F4D6C: .4byte sub_80F4D74
-_080F4D70: .4byte gUnknown_203AB48
- thumb_func_end sub_80F4C68
-
- thumb_func_start sub_80F4D74
-sub_80F4D74: @ 80F4D74
- push {r4,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r2, r0, 24
- ldr r4, _080F4D90 @ =gUnknown_203AB48
- ldr r0, [r4]
- ldrb r1, [r0]
- cmp r1, 0x1
- beq _080F4DA8
- cmp r1, 0x1
- bgt _080F4D94
- cmp r1, 0
- beq _080F4D9A
- b _080F4DD6
- .align 2, 0
-_080F4D90: .4byte gUnknown_203AB48
-_080F4D94:
- cmp r1, 0x2
- beq _080F4DD0
- b _080F4DD6
-_080F4D9A:
- movs r0, 0
- bl WaitFanfare
- lsls r0, 24
- cmp r0, 0
- beq _080F4DD6
- b _080F4DC2
-_080F4DA8:
- ldr r0, _080F4DCC @ =gMain
- ldrh r0, [r0, 0x2E]
- ands r1, r0
- cmp r1, 0
- beq _080F4DD6
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
-_080F4DC2:
- ldr r1, [r4]
- ldrb r0, [r1]
- adds r0, 0x1
- strb r0, [r1]
- b _080F4DD6
- .align 2, 0
-_080F4DCC: .4byte gMain
-_080F4DD0:
- adds r0, r2, 0
- bl sub_80F4DE0
-_080F4DD6:
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80F4D74
-
- thumb_func_start sub_80F4DE0
-sub_80F4DE0: @ 80F4DE0
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r2, r0, 24
- ldr r0, _080F4E18 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0
- bne _080F4E10
- adds r0, r2, 0
- bl DestroyTask
- bl FreeAllWindowBuffers
- ldr r4, _080F4E1C @ =gUnknown_203AB48
- ldr r0, [r4]
- bl Free
- str r5, [r4]
- ldr r0, _080F4E20 @ =sub_80568FC
- bl SetMainCallback2
-_080F4E10:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080F4E18: .4byte gPaletteFade
-_080F4E1C: .4byte gUnknown_203AB48
-_080F4E20: .4byte sub_80568FC
- thumb_func_end sub_80F4DE0
-
- thumb_func_start sub_80F4E24
-sub_80F4E24: @ 80F4E24
- push {lr}
- bl ResetSpriteData
- bl ResetPaletteFade
- bl FreeAllSpritePalettes
- bl ResetTasks
- bl ScanlineEffect_Stop
- pop {r0}
- bx r0
- thumb_func_end sub_80F4E24
-
- thumb_func_start sub_80F4E40
-sub_80F4E40: @ 80F4E40
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x10
- movs r3, 0xC0
- lsls r3, 19
- movs r4, 0xC0
- lsls r4, 9
- add r0, sp, 0xC
- mov r8, r0
- add r2, sp, 0x8
- movs r6, 0
- ldr r1, _080F4F88 @ =0x040000d4
- movs r5, 0x80
- lsls r5, 5
- ldr r7, _080F4F8C @ =0x81000800
- movs r0, 0x81
- lsls r0, 24
- mov r12, r0
-_080F4E66:
- strh r6, [r2]
- add r0, sp, 0x8
- str r0, [r1]
- str r3, [r1, 0x4]
- str r7, [r1, 0x8]
- ldr r0, [r1, 0x8]
- adds r3, r5
- subs r4, r5
- cmp r4, r5
- bhi _080F4E66
- strh r6, [r2]
- add r2, sp, 0x8
- str r2, [r1]
- str r3, [r1, 0x4]
- lsrs r0, r4, 1
- mov r2, r12
- orrs r0, r2
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r0, 0xE0
- lsls r0, 19
- movs r3, 0x80
- lsls r3, 3
- movs r4, 0
- str r4, [sp, 0xC]
- ldr r2, _080F4F88 @ =0x040000d4
- mov r1, r8
- str r1, [r2]
- str r0, [r2, 0x4]
- lsrs r0, r3, 2
- movs r1, 0x85
- lsls r1, 24
- orrs r0, r1
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- movs r1, 0xA0
- lsls r1, 19
- add r0, sp, 0x8
- strh r4, [r0]
- str r0, [r2]
- str r1, [r2, 0x4]
- lsrs r3, 1
- movs r0, 0x81
- lsls r0, 24
- orrs r3, r0
- str r3, [r2, 0x8]
- ldr r0, [r2, 0x8]
- movs r0, 0
- movs r1, 0
- bl SetGpuReg
- movs r0, 0
- bl ResetBgsAndClearDma3BusyFlags
- ldr r1, _080F4F90 @ =gUnknown_8415A08
- movs r0, 0
- movs r2, 0x2
- bl InitBgsFromTemplates
- movs r0, 0
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x2
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x3
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- movs r0, 0x3
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- ldr r0, _080F4F94 @ =gUnknown_8415A10
- bl InitWindows
- bl DeactivateAllTextPrinters
- movs r1, 0x82
- lsls r1, 5
- movs r0, 0
- bl SetGpuReg
- ldr r0, _080F4F98 @ =gUnknown_203AB48
- ldr r1, [r0]
- adds r1, 0x4
- movs r0, 0x1
- bl SetBgTilemapBuffer
- movs r0, 0
- bl ShowBg
- movs r0, 0x1
- bl ShowBg
- movs r5, 0x1E
- str r5, [sp]
- movs r4, 0x14
- str r4, [sp, 0x4]
- movs r0, 0
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect_Palette0
- str r5, [sp]
- str r4, [sp, 0x4]
- movs r0, 0x1
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect_Palette0
- add sp, 0x10
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080F4F88: .4byte 0x040000d4
-_080F4F8C: .4byte 0x81000800
-_080F4F90: .4byte gUnknown_8415A08
-_080F4F94: .4byte gUnknown_8415A10
-_080F4F98: .4byte gUnknown_203AB48
- thumb_func_end sub_80F4E40
-
- thumb_func_start sub_80F4F9C
-sub_80F4F9C: @ 80F4F9C
- push {lr}
- sub sp, 0x4
- ldr r0, _080F4FB4 @ =gUnknown_203AB48
- ldr r0, [r0]
- ldrb r0, [r0, 0x1]
- cmp r0, 0x1
- beq _080F4FC8
- cmp r0, 0x1
- bgt _080F4FB8
- cmp r0, 0
- beq _080F4FC2
- b _080F4FF8
- .align 2, 0
-_080F4FB4: .4byte gUnknown_203AB48
-_080F4FB8:
- cmp r0, 0x2
- beq _080F4FE0
- cmp r0, 0x3
- beq _080F4FEE
- b _080F4FF8
-_080F4FC2:
- bl ResetTempTileDataBuffers
- b _080F5000
-_080F4FC8:
- ldr r1, _080F4FDC @ =gUnknown_84147C0
- movs r0, 0
- str r0, [sp]
- movs r0, 0x1
- movs r2, 0
- movs r3, 0
- bl DecompressAndCopyTileDataToVram
- b _080F5000
- .align 2, 0
-_080F4FDC: .4byte gUnknown_84147C0
-_080F4FE0:
- bl FreeTempTileDataBuffersIfPossible
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080F5000
- b _080F500A
-_080F4FEE:
- ldr r0, _080F4FFC @ =gUnknown_8415954
- movs r1, 0
- movs r2, 0x40
- bl LoadPalette
-_080F4FF8:
- movs r0, 0x1
- b _080F500C
- .align 2, 0
-_080F4FFC: .4byte gUnknown_8415954
-_080F5000:
- ldr r0, _080F5014 @ =gUnknown_203AB48
- ldr r1, [r0]
- ldrb r0, [r1, 0x1]
- adds r0, 0x1
- strb r0, [r1, 0x1]
-_080F500A:
- movs r0, 0
-_080F500C:
- add sp, 0x4
- pop {r1}
- bx r1
- .align 2, 0
-_080F5014: .4byte gUnknown_203AB48
- thumb_func_end sub_80F4F9C
-
- thumb_func_start sub_80F5018
-sub_80F5018: @ 80F5018
- push {r4-r6,lr}
- sub sp, 0xAC
- bl DynamicPlaceholderTextUtil_Reset
- ldr r0, _080F5040 @ =gSaveBlock2Ptr
- ldr r1, [r0]
- movs r0, 0
- bl DynamicPlaceholderTextUtil_SetPlaceholderPtr
- bl sub_8088F84
- lsls r0, 16
- cmp r0, 0
- beq _080F5048
- ldr r1, _080F5044 @ =gUnknown_841B68F
- movs r0, 0x1
- bl DynamicPlaceholderTextUtil_SetPlaceholderPtr
- b _080F5050
- .align 2, 0
-_080F5040: .4byte gSaveBlock2Ptr
-_080F5044: .4byte gUnknown_841B68F
-_080F5048:
- ldr r1, _080F50E0 @ =gUnknown_841B698
- movs r0, 0x1
- bl DynamicPlaceholderTextUtil_SetPlaceholderPtr
-_080F5050:
- movs r0, 0
- movs r1, 0
- bl FillWindowPixelBuffer
- ldr r1, _080F50E4 @ =gUnknown_841B60E
- add r0, sp, 0xC
- bl DynamicPlaceholderTextUtil_ExpandPlaceholders
- movs r5, 0x1
- negs r5, r5
- movs r0, 0x2
- add r1, sp, 0xC
- adds r2, r5, 0
- bl GetStringWidth
- lsrs r2, r0, 1
- movs r4, 0x78
- subs r2, r4, r2
- lsls r2, 24
- lsrs r2, 24
- ldr r6, _080F50E8 @ =gUnknown_8415A04
- str r6, [sp]
- str r5, [sp, 0x4]
- add r0, sp, 0xC
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0x2
- movs r3, 0x4
- bl AddTextPrinterParameterized3
- ldr r1, _080F50EC @ =gUnknown_841B619
- add r0, sp, 0xC
- bl DynamicPlaceholderTextUtil_ExpandPlaceholders
- movs r0, 0x2
- add r1, sp, 0xC
- adds r2, r5, 0
- bl GetStringWidth
- lsrs r0, 1
- subs r4, r0
- lsls r4, 24
- lsrs r4, 24
- str r6, [sp]
- str r5, [sp, 0x4]
- add r0, sp, 0xC
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0x2
- adds r2, r4, 0
- movs r3, 0x1E
- bl AddTextPrinterParameterized3
- str r6, [sp]
- movs r0, 0
- str r0, [sp, 0x4]
- ldr r0, _080F50F0 @ =gUnknown_841B684
- str r0, [sp, 0x8]
- movs r0, 0
- movs r1, 0x2
- movs r2, 0x78
- movs r3, 0x69
- bl AddTextPrinterParameterized3
- movs r0, 0
- bl PutWindowTilemap
- add sp, 0xAC
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080F50E0: .4byte gUnknown_841B698
-_080F50E4: .4byte gUnknown_841B60E
-_080F50E8: .4byte gUnknown_8415A04
-_080F50EC: .4byte gUnknown_841B619
-_080F50F0: .4byte gUnknown_841B684
- thumb_func_end sub_80F5018
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/field_specials.s b/asm/field_specials.s
index c1555f2bb..b2b716a8f 100644
--- a/asm/field_specials.s
+++ b/asm/field_specials.s
@@ -9,13 +9,13 @@
sub_80CA618: @ 80CA618
push {lr}
bl sub_8112364
- ldr r0, _080CA62C @ =sub_80F4C10
+ ldr r0, _080CA62C @ =CB2_ShowDiploma
bl SetMainCallback2
bl ScriptContext2_Enable
pop {r0}
bx r0
.align 2, 0
-_080CA62C: .4byte sub_80F4C10
+_080CA62C: .4byte CB2_ShowDiploma
thumb_func_end sub_80CA618
thumb_func_start sub_80CA630
diff --git a/asm/overworld.s b/asm/overworld.s
index be0fc577f..5e50a5d05 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -3799,8 +3799,8 @@ _080568F4: .4byte gFieldCallback
_080568F8: .4byte FieldCallback_ReturnToEventScript2
thumb_func_end CB2_ReturnToFieldContinueScriptPlayMapMusic
- thumb_func_start sub_80568FC
-sub_80568FC: @ 80568FC
+ thumb_func_start CB2_Overworld
+CB2_Overworld: @ 80568FC
push {lr}
bl sub_80569BC
ldr r1, _08056910 @ =gFieldCallback
@@ -3812,7 +3812,7 @@ sub_80568FC: @ 80568FC
.align 2, 0
_08056910: .4byte gFieldCallback
_08056914: .4byte sub_807DF7C
- thumb_func_end sub_80568FC
+ thumb_func_end CB2_Overworld
thumb_func_start sub_8056918
sub_8056918: @ 8056918
diff --git a/asm/pokedex.s b/asm/pokedex.s
index 279270fbb..69ca5adcf 100644
--- a/asm/pokedex.s
+++ b/asm/pokedex.s
@@ -220,8 +220,8 @@ _08088F7C:
bx r1
thumb_func_end sub_8088F58
- thumb_func_start sub_8088F84
-sub_8088F84: @ 8088F84
+ thumb_func_start HasAllKantoMons
+HasAllKantoMons: @ 8088F84
push {r4,r5,lr}
movs r0, 0
_08088F88:
@@ -277,6 +277,6 @@ _08088FE8:
pop {r4,r5}
pop {r1}
bx r1
- thumb_func_end sub_8088F84
+ thumb_func_end HasAllKantoMons
.align 2, 0 @ Don't pad with nop.
diff --git a/asm/trainer_card.s b/asm/trainer_card.s
index 502d47c89..e8a591264 100644
--- a/asm/trainer_card.s
+++ b/asm/trainer_card.s
@@ -1070,7 +1070,7 @@ _080898BE:
adds r0, 0x1
strb r0, [r5, 0x1]
_080898CE:
- bl sub_8088F84
+ bl HasAllKantoMons
lsls r0, 16
cmp r0, 0
beq _080898DE
@@ -1117,7 +1117,7 @@ _08089918:
_0808991C:
bl sub_8088F58
strb r0, [r5, 0x3]
- bl sub_8088F84
+ bl HasAllKantoMons
adds r6, r5, 0
adds r6, 0x4D
strb r0, [r6]
diff --git a/data/specials.inc b/data/specials.inc
index 24d793093..4c7ad327d 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -441,7 +441,7 @@ gSpecials:: @ 815FD60
def_special sub_8147594
def_special sub_80CD034
def_special sub_815D834
- def_special sub_8088F84
+ def_special HasAllKantoMons
def_special sub_80CD074
def_special sub_80CD098
def_special sub_811B15C
diff --git a/include/overworld.h b/include/overworld.h
index 60fa566f7..799389353 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -104,6 +104,7 @@ extern bool8 (* gFieldCallback2)(void);
void SetLastHealLocationWarp(u8 healLocaionId);
void sub_8055864(u8 mapGroup, u8 mapNum);
+void CB2_Overworld(void);
void CB2_NewGame(void);
bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType);
void Overworld_ResetStateAfterTeleport(void);
diff --git a/include/pokedex.h b/include/pokedex.h
index b389bf821..c4ec27e0b 100644
--- a/include/pokedex.h
+++ b/include/pokedex.h
@@ -7,7 +7,8 @@ void ResetPokedex(void);
void CopyMonCategoryText(u16 species, u8 *dst);
u16 GetPokedexHeightWeight(u16 dexNum, u8 data);
u16 GetNationalPokedexCount(u8);
-u16 GetHoennPokedexCount(u8);
+u16 GetKantoPokedexCount(u8);
+bool16 HasAllKantoMons(void);
u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 trainerId, u32 personality);
enum
diff --git a/ld_script.txt b/ld_script.txt
index 2867cd998..25a219793 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -214,7 +214,7 @@ SECTIONS {
asm/battle_anim_special.o(.text);
asm/hall_of_fame.o(.text);
asm/credits.o(.text);
- asm/diploma.o(.text);
+ src/diploma.o(.text);
asm/save_failed_screen.o(.text);
asm/clear_save_data_screen.o(.text);
asm/evolution_graphics.o(.text);
diff --git a/src/diploma.c b/src/diploma.c
new file mode 100644
index 000000000..74343e82f
--- /dev/null
+++ b/src/diploma.c
@@ -0,0 +1,254 @@
+#include "global.h"
+#include "bg.h"
+#include "constants/fanfares.h"
+#include "dynamic_placeholder_text_util.h"
+#include "gba/macro.h"
+#include "gpu_regs.h"
+#include "gpu_regs.h"
+#include "main.h"
+#include "malloc.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokedex.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "text.h"
+#include "window.h"
+#include "diploma.h"
+
+static void DiplomaBgInit(void);
+static void DiplomaPrintText(void);
+static u8 DiplomaLoadGfx(void);
+static void DiplomaVblankHandler(void);
+
+static void CB2_DiplomaInit(void);
+
+static void Task_WaitForExit(u8);
+static void Task_DiplomaInit(u8);
+static void Task_DiplomaReturnToOverworld(u8);
+
+extern const struct BgTemplate gUnknown_8415A08[2];
+extern const struct WindowTemplate gUnknown_8415A10[];
+extern const u8 gUnknown_8402650[];
+extern const u8 gUnknown_841B60E[];
+extern const u8 gUnknown_841B684[];
+extern u8 gUnknown_84147C0[];
+extern u8 gUnknown_8415954[];
+extern u8 gUnknown_841B698[];
+extern u8 gUnknown_841B68F[];
+extern u8 gUnknown_841B619[];
+extern u8 gUnknown_8415A04[];
+
+struct Diploma
+{
+ u8 state;
+ u8 gfxStep;
+ u8 callbackStep;
+ u16 tilemapBuffer[0x800];
+};
+
+static EWRAM_DATA struct Diploma *gDiploma = NULL;
+
+extern const u32 gUnknown_84154E8[];
+
+static void VCBC_DiplomaOam(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_ShowDiploma(void)
+{
+ gDiploma = AllocZeroed(sizeof(*gDiploma));
+ gDiploma->state = 0;
+ gDiploma->gfxStep = 0;
+ gDiploma->callbackStep = 0;
+ DiplomaBgInit();
+ CreateTask(Task_DiplomaInit, 0);
+ SetMainCallback2(CB2_DiplomaInit);
+}
+
+static void CB2_DiplomaInit(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void Task_DiplomaInit(u8 taskId)
+{
+ switch (gDiploma->callbackStep)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ break;
+ case 1:
+ DiplomaVblankHandler();
+ break;
+ case 2:
+ if (!DiplomaLoadGfx())
+ {
+ return;
+ }
+ break;
+ case 3:
+ CopyToBgTilemapBuffer(1, gUnknown_84154E8, 0, 0);
+ break;
+ case 4:
+ if (HasAllKantoMons())
+ {
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0x80 << 1);
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ }
+ break;
+ case 5:
+ DiplomaPrintText();
+ break;
+ case 6:
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(1);
+ break;
+ case 7:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ break;
+ case 8:
+ SetVBlankCallback(VCBC_DiplomaOam);
+ break;
+ default:
+ if (gPaletteFade.active)
+ {
+ break;
+ }
+ PlayFanfareByFanfareNum(FANFARE_05);
+ gTasks[taskId].func = Task_WaitForExit;
+ }
+ gDiploma->callbackStep++;
+}
+
+static void Task_WaitForExit(u8 taskId)
+{
+ switch (gDiploma->state)
+ {
+ case 0:
+ if (WaitFanfare(0))
+ {
+ gDiploma->state++;
+ }
+ break;
+ case 1:
+ if (JOY_NEW(A_BUTTON))
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gDiploma->state++;
+ }
+ break;
+ case 2:
+ Task_DiplomaReturnToOverworld(taskId);
+ break;
+ }
+}
+
+static void Task_DiplomaReturnToOverworld(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+ DestroyTask(taskId);
+ FreeAllWindowBuffers();
+ FREE_AND_SET_NULL(gDiploma);
+ SetMainCallback2(CB2_Overworld);
+}
+
+static void DiplomaBgInit(void)
+{
+ ResetSpriteData();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ ScanlineEffect_Stop();
+}
+
+static void DiplomaVblankHandler(void)
+{
+ void *vram = (void *)VRAM;
+ DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000);
+ DmaClear32(3, (void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_8415A08, 2);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ InitWindows(gUnknown_8415A10);
+ DeactivateAllTextPrinters();
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetBgTilemapBuffer(1, gDiploma->tilemapBuffer);
+ ShowBg(0);
+ ShowBg(1);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);
+}
+
+static u8 DiplomaLoadGfx(void)
+{
+ switch (gDiploma->gfxStep)
+ {
+ case 0:
+ ResetTempTileDataBuffers();
+ break;
+ case 1:
+ DecompressAndCopyTileDataToVram(1, gUnknown_84147C0, 0, 0, 0);
+ break;
+ case 2:
+ if (!(FreeTempTileDataBuffersIfPossible() == 1))
+ {
+ break;
+ }
+ return 0;
+ case 3:
+ LoadPalette(gUnknown_8415954, 0, 0x40);
+ default:
+ return 1;
+ }
+ gDiploma->gfxStep++;
+ return 0;
+}
+
+static void DiplomaPrintText(void)
+{
+ u8 arr[160];
+ u32 width;
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName);
+ if (HasAllKantoMons())
+ {
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B68F);
+ }
+ else
+ {
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B698);
+ }
+ FillWindowPixelBuffer(0, 0);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B60E);
+ width = GetStringWidth(2, arr, -1);
+ AddTextPrinterParameterized3(0, 2, 0x78 - (width / 2), 4, gUnknown_8415A04, -1, arr);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B619);
+ width = GetStringWidth(2, arr, -1);
+ AddTextPrinterParameterized3(0, 0x2, 0x78 - (width / 2), 0x1E, gUnknown_8415A04, -1, arr);
+ AddTextPrinterParameterized3(0, 0x2, 0x78, 0x69, gUnknown_8415A04, 0, gUnknown_841B684);
+ PutWindowTilemap(0);
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index bec821a2f..ff7823e1d 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -1124,8 +1124,7 @@ gUnknown_203AB40: @ 203AB40
gUnknown_203AB44: @ 203AB44
.space 0x4
-gUnknown_203AB48: @ 203AB48
- .space 0x4
+ .include "src/diploma.o"
gUnknown_203AB4C: @ 203AB4C
.space 0x4
diff --git a/tools/asmdiff.sh b/tools/asmdiff.sh
new file mode 100755
index 000000000..a8114dc4f
--- /dev/null
+++ b/tools/asmdiff.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+OBJDUMP="./tools/binutils/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb"
+OPTIONS="--start-address=$1 --stop-address=$2"
+$OBJDUMP $OPTIONS baserom.gba > baserom.dump
+$OBJDUMP $OPTIONS pokefirered.gba > pokefirered.dump
+diff -u baserom.dump pokefirered.dump