blob: c302e0adb2905fa750d5699da641d88e295a1efe (
plain)
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
;;;
;; The definition of `RUN_TESTS` will be inserted automatically when running
;; tests. Do not insert the definition manually.
.include "common.s"
main:
.ifdef RUN_TESTS
jsr suite
.endif
halt:
jmp halt
;;;
;; Test suite
suite:
jsr list_sum
jsr list_empty_get
jsr large_list
jsr list_set
jsr list_empty_set
jsr list_set_overflow
rts
;; This is re-used in both `list_sum` and `list_set`.
.macro LIST_SUM_AUX
lda #0
sta $90
LIST_INIT $0400
lda #2
jsr List::push
lda #4
jsr List::push
lda #1
jsr List::push
LIST_IT_FROM $0400
:
jsr List::get
cpy #$FF
beq :+
clc
adc $90
sta $90
jmp :-
:
nop
.endmacro
list_sum:
LIST_SUM_AUX
@test_list_sum:
rts
list_empty_get:
LIST_INIT $0400
jsr List::get
cpy #$FF
beq :+
lda #0
sta $90
jmp @test_list_empty_get
:
lda #1
sta $90
@test_list_empty_get:
rts
large_list:
lda #0
sta $90
sta $91
sta $92
LIST_INIT $0400
ldx #0
:
txa
jsr List::push
;; Are we about to overflow the `x` register? If so, check if this was the
;; first time or not. If so, then we let it overflow and loop again $FF
;; times. Otherwise we will stop the loop, since we want to have a
;; $200-sized list.
cpx #$FF
bne :+
inc $92
lda #2
cmp $92
beq :++
:
inx
jmp :--
:
;; At this point we have stored this big list, let's add things up.
lda #0
sta $90
sta $91
LIST_IT_FROM $0400
:
jsr List::get
cpy #$FF
beq @test_large_list
clc
adc $90
sta $90
lda #0
adc $91
sta $91
jmp :-
@test_large_list:
rts
list_set:
LIST_SUM_AUX
lda #0
sta $90
LIST_IT_FROM $0400
lda #3
jsr List::set
lda #5
jsr List::set
lda #2
jsr List::set
LIST_IT_FROM $0400
:
jsr List::get
cpy #$FF
beq @test_list_set
clc
adc $90
sta $90
jmp :-
@test_list_set:
rts
list_empty_set:
LIST_INIT $0400
jsr List::set
cpy #$FF
beq :+
lda #0
sta $90
jmp @test_list_empty_set
:
lda #1
sta $90
@test_list_empty_set:
rts
list_set_overflow:
;; $0402 should not be set by this function, and this is to be checked; so
;; zero it out before doing anything.
lda #0
ldy #0
sta $0402
LIST_INIT $0400
lda #1
jsr List::push
lda #2
jsr List::push
LIST_IT_FROM $0400
lda #2
jsr List::set
sty $90
lda #4
jsr List::set
sty $91
lda #6
jsr List::set
sty $92
@test_list_overflow:
rts
|