summaryrefslogtreecommitdiff
path: root/home/save.asm
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2017-01-20 08:47:59 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2017-01-20 08:47:59 -0500
commit36381c3553bed66ca54b1ad8c1d281dce55bea0c (patch)
tree30ba9750cc06152104e382c2e084027e2f946e24 /home/save.asm
parente0dfebc08eb023d73bfbbfb07c67c380fdf4c0fc (diff)
SRAM and high scores
Diffstat (limited to 'home/save.asm')
-rwxr-xr-xhome/save.asm170
1 files changed, 170 insertions, 0 deletions
diff --git a/home/save.asm b/home/save.asm
new file mode 100755
index 0000000..63cfaa8
--- /dev/null
+++ b/home/save.asm
@@ -0,0 +1,170 @@
+LoadSavedData: ; 0xf0c
+ call ValidateSaveData
+ ret nc
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop
+ scf
+ ret
+
+SaveData: ; 0xf1a
+; Input: hl = data to save
+; bc = number of bytes to save
+; de = destination for saved data
+ push bc
+ push de
+ push hl
+.save
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .save
+ pop hl
+ pop de
+ pop bc
+ ld h, d
+ ld l, e
+ call SignData
+ call ComputeChecksum
+ call CreateBackupCopy
+ ret
+
+ValidateSaveData: ; 0xf34
+ call ValidateSignature
+ jr nc, .backup
+ call ValidateChecksum
+ jr nc, .backup
+ ret
+
+.backup
+ add hl, bc
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ call ValidateSignature
+ ret nc
+ call ValidateChecksum
+ ret
+
+CreateBackupCopy: ; 0xf4c
+ push bc
+ push hl
+ push de
+ inc bc
+ inc bc
+ inc bc
+ inc bc
+ ld d, h
+ ld e, l
+ add hl, bc
+.loop
+ ld a, [de]
+ ld [hli], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop
+ pop de
+ pop hl
+ pop bc
+ ret
+
+ValidateSignature: ; 0xf62
+ push hl
+ add hl, bc
+ ld a, [hli]
+ cp $4e
+ jr nz, .asm_f71
+ ld a, [hl]
+ cp $54
+ jr nz, .asm_f71
+ scf
+ jr .asm_f72
+
+.asm_f71
+ and a
+.asm_f72
+ pop hl
+ ret
+
+SignData: ; 0xf74
+ push hl
+ add hl, bc
+ ld a, $4e
+ ld [hli], a
+ ld a, $54
+ ld [hl], a
+ pop hl
+ ret
+
+ValidateChecksum: ; 0xf7e
+ push bc
+ push de
+ push hl
+ inc bc
+ inc bc
+ ld de, $0000
+.loop
+ ld a, [hli]
+ add e
+ ld e, a
+ jr nc, .asm_f8c
+ inc d
+.asm_f8c
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop
+ ld a, [hli]
+ cp e
+ jr nz, .fail
+ ld a, [hl]
+ cp d
+ jr nz, .fail
+ scf
+ jr .pass
+
+.fail
+ and a
+.pass
+ pop hl
+ pop de
+ pop bc
+ ret
+
+ComputeChecksum: ; 0xfa1
+ push bc
+ push de
+ push hl
+ inc bc
+ inc bc
+ ld de, $0000
+.loop
+ ld a, [hli]
+ add e
+ ld e, a
+ jr nc, .nocarry
+ inc d
+.nocarry
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hl], a
+ pop hl
+ pop de
+ pop bc
+ ret