aboutsummaryrefslogtreecommitdiff
path: root/test/suite.s
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