-
Notifications
You must be signed in to change notification settings - Fork 0
/
highscore.s.save.1
159 lines (118 loc) · 2.5 KB
/
highscore.s.save.1
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
.include "mov32.inc"
@ System Calls
.set EXIT, 1
.set READ, 3
.set WRITE, 4
.set OPEN, 5
.set CLOSE, 6
@ Constants for System Calls
.set STDIN, 0
.set STDOUT, 1
.set O_WRONLY, 1
.set O_CREAT, 64
.set O_RDWR , 2
.set O_TRUNC, 512
.set O_APPEND, 1024
.set CREAT_FLAGS, (/*O_WRONLY*/O_RDWR | O_APPEND | O_CREAT/* | O_TRUNC*/)
.balign 4
.data
filename:
.ascii "highscore.txt\0"
.set filename_Len, .-filename
newline:
.ascii "\n\0"
.set newline_Len, .-newline
empty_mess:
.ascii "Empty File::::\n\0"
.set empty_mess_Len, .-empty_mess
.balign 4
.bss
userName:
.space 28
userScore:
.space 4
file_info:
.space 96
temp_score:
.space 4
.balign 4
.text
.global _start
_start:
push {r4-r9}
// OpenFile or Create Highscore File
mov32 r0, filename
movw r1, #CREAT_FLAGS
movw r2, #00644 // Permission for File number 644 ultimate power
mov r7, #OPEN
svc #0
bl check_file
blne display_scores
bl did_user_place // Did the user place in the top three
pop {r4-r9}
mov r7, #EXIT
svc #0
check_file:
// Load file information into .data section
mov32 r1, file_info
mov r2, #100
mov r7, #READ
svc #0
// Load first byte from file and check to see if there is information
mov32 r1, file_info
ldrb r1, [r1]
// If r0 = 0, then file is empty :: if r0 = any #, then file contains something
cmp r1, #0
bx lr
continue:
// Get input from user
mov r0, #STDIN
mov32 r1, userName
mov r2, #32
mov r7, #READ
svc #0
// Write to File
mov r0, r4
mov32 r1, userName
mov r2, #6
mov r7, #WRITE
svc #0
display_scores:
push {r4, lr}
mov r0, #20 // Middle
mov r1, #30 // Screen
@Add this later bl locate
// Print top 3 score from file pulled from memory for now.
mov r0, #STDOUT
mov32 r1, file_info
mov r2, #100
mov r7, #WRITE
svc #0
pop {r4, pc}
did_user_place:
push {r4, lr}
mov32 r0, file_info
mov r1, #0 // Shift bit Counter
mov r2, #1 // Top Player = 1 if r3 = 2 then we are at second top PLayer etc
mov32 r4, temp_score // This is used to compare scores
while_loop:
ldrb r0, [r0, r1]
cmp r0, #57
movgt r0, #100
cmp r0, #32
moveq r0, #100
// If at the end of the line then lets compare scores
cmp #10, r0
bleq compare_scores
cmp r0, #100
// Here we will store 1 score from the file one by one and comparing
strbne r0, [r4, #1]
cmp r0, #10
bl compare_scores
beq while_loop
pop {r4, pc}
compare_scores:
push {r4, lr}
// Get user score here either from a register or from the .data section
cmp r0, r1 // r0 = user score, r1 = file score "one of the file scores"
pop {r4, pc}