1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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
|