-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSIERPINSKI.A68
More file actions
292 lines (226 loc) · 6.56 KB
/
Copy pathSIERPINSKI.A68
File metadata and controls
292 lines (226 loc) · 6.56 KB
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
;
; Largely written by Copilot, with some help by Michael Wessel
; 2/12/2026 (i.e., to get the display "shearing" right - it was stuck there)
;
; =========================================================
; Firmware ROM Routines (ET‑3400 Monitor)
; =========================================================
RESET = $FC00
INCH = $FDF4
ENCODE = $FDBB
OUTCH = $FE3A
OUTHEX = $FE28
OUTBYT = $FE20
OUTST1 = $FE50
OUTST0 = $FD8D
DSPLAY = $FD7B
REDIS = $FCBC
; =========================================================
; ET‑3400 + 128×32 OLED
; Sierpinski fractal using logical coordinates (LX, LY)
; Display shear applied only during plotting:
;
; ScreenX = LX + (LY >> 1)
; ScreenY = LY
;
; This preserves the pure Sierpinski logic (LX & LY == 0)
; while visually tilting the triangle on the OLED.
;
; Variables at $0100, code at $1000
; =========================================================
ORG $0100
; -----------------------------
; Logical fractal coordinates
; -----------------------------
LX: RMB 1 ; logical X coordinate
LY: RMB 1 ; logical Y coordinate
; -----------------------------
; Screen coordinates (after shear)
; -----------------------------
SX: RMB 1 ; screen X = LX + (LY >> 1)
SY: RMB 1 ; screen Y = LY
COL: RMB 1 ; pixel color (0xFF = on)
; -----------------------------
; Temporary scratch
; -----------------------------
T1: RMB 1 ; holds LY >> 1
; =========================================================
; CODE SECTION
; =========================================================
ORG $1000
; ---------------------------------------------------------
; MAIN — Sierpinski in logical space, sheared only in plotting
; ---------------------------------------------------------
MAIN:
JSR CLEARSCREEN
JSR INCH
CLR LY ; start at logical Y = 0
Y_LOOP:
CLR LX ; start each row at logical X = 0
X_LOOP:
; ---------------------------------------------------------
; Sierpinski test in logical space:
; (LX & LY) == 0 → pixel is part of the fractal
; ---------------------------------------------------------
LDAA LX
ANDA LY
BNE SKIP_PLOT ; if nonzero → skip pixel
; ---------------------------------------------------------
; Compute screen coordinates:
;
; SX = LX + (LY >> 1)
; SY = LY
;
; This applies a gentle shear to the right, visually
; turning the square-grid Sierpinski into a triangular one.
; ---------------------------------------------------------
LDAA LY
LSRA ; LY >> 1
STAA T1 ; T1 = LY/2
LDAA LX
ADDA T1 ; SX = LX + (LY/2)
STAA SX
LDAA LY
STAA SY ; SY = LY
; ---------------------------------------------------------
; Plot pixel at (SX, SY)
; ---------------------------------------------------------
LDAA #$FF
STAA COL
JSR PLOTNU ; your non-updating plot routine
SKIP_PLOT:
; ---------------------------------------------------------
; Advance logical X
; ---------------------------------------------------------
INC LX
LDAA LX
CMPA #128
BCS X_LOOP ; continue while LX < 128
; ---------------------------------------------------------
; Advance logical Y
; ---------------------------------------------------------
INC LY
LDAA LY
CMPA #32
BCS CONT ; continue while LY < 32
; ---------------------------------------------------------
; Finished — start over after keypress
; ---------------------------------------------------------
DONE:
JSR INCH
JSR MAIN
; ---------------------------------------------------------
; End-of-row housekeeping
; ---------------------------------------------------------
CONT:
JSR PLOT ; your update/refresh routine
BCS Y_LOOP ; branch always (BCS always true after JSR)
; ---------------------------------------------------------
; CLEARSCREEN
; ---------------------------------------------------------
CLEARSCREEN:
PSHA
LDAA #$00
JSR EXEC
PULA
JSR LDELAY
JSR LDELAY
RTS
; ---------------------------------------------------------
; PLOTNU — high-level plot using EXEC, NO UPDATE
; ---------------------------------------------------------
PLOTNU:
LDAA #$0A
JSR EXEC
LDAA sx
JSR EXEC
LDAA sy
JSR EXEC
LDAA col
JSR EXEC
JSR DELAY
RTS
; ---------------------------------------------------------
; PLOT — high-level plot using EXEC, WITH SCREEN UPDATE
; ---------------------------------------------------------
PLOT:
LDAA #$0B
JSR EXEC
LDAA sx
JSR EXEC
LDAA sy
JSR EXEC
LDAA col
JSR EXEC
JSR LDELAY
RTS
; ---------------------------------------------------------
; PLOT0 — disp pixel output
; ---------------------------------------------------------
PLOT0:
JSR REDIS
LDAA sx
JSR OUTBYT
LDAA sy
JSR OUTBYT
LDAA col
JSR OUTBYT
RTS
; ---------------------------------------------------------
; EXEC — write A to $1800 with timing
; ---------------------------------------------------------
EXEC:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
STAA $1800
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JSR DELAY
RTS
; ---------------------------------------------------------
; DELAY — coarse delay
; ---------------------------------------------------------
DELAY:
PSHA
PSHB
LDAA #$01
OUTER: LDAB #$FF
INNER: DECB
BNE INNER
DECA
BNE OUTER
PULB
PULA
RTS
; ---------------------------------------------------------
; LDELAY — longer delay
; ---------------------------------------------------------
LDELAY:
PSHA
PSHB
LDAA #$05
LOUTER: LDAB #$FF
LINNER: DECB
BNE LINNER
DECA
BNE LOUTER
PULB
PULA
RTS