-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsonnet-appleman-dithered.a68
More file actions
467 lines (426 loc) · 9.65 KB
/
Copy pathsonnet-appleman-dithered.a68
File metadata and controls
467 lines (426 loc) · 9.65 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
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
; Coded by Claude Sonnet 4.5 2/16/2026
; High-Level Guidance by M.Wessel aka LambdaMikel
; =========================================================
; Mandelbrot Fractal with Dithered Shading for ET-3400
; Creates illusion of 5 gray levels using B&W dithering
; =========================================================
RESET = $FC00
OUTBYT = $FE20
REDIS = $FCBC
ORG $0100
MPLIER EQU $0140
MPCAND EQU $0142
RESULT EQU $0144
BITCNT EQU $0148
TEMP EQU $0150
SIGN EQU $0154
ZR EQU $0160
ZI EQU $0162
CR EQU $0164
CI EQU $0166
ZR2 EQU $0168
ZI2 EQU $016A
TEMP1 EQU $016C
ITER EQU $016E
XPOS EQU $016F
YPOS EQU $0170
COL EQU $0171
ORG $1000
MAIN:
JSR CLEARSCREEN
CLR YPOS
YLOOP:
CLR XPOS
XLOOP:
; X to CR (unsigned conversion)
LDAA XPOS
STAA MPLIER+1
CLR MPLIER
CLR MPCAND
LDAA #$06
STAA MPCAND+1
JSR UMPY16
CLC
LDAA RESULT+3
STAA CR+1
LDAA RESULT+2
ADCA #$FE
STAA CR
; Y to CI (unsigned conversion)
LDAA YPOS
STAA MPLIER+1
CLR MPLIER
CLR MPCAND
LDAA #$10
STAA MPCAND+1
JSR UMPY16
CLC
LDAA RESULT+3
STAA CI+1
LDAA RESULT+2
ADCA #$FF
STAA CI
JSR MANDEL
JSR SHADE ; Apply dithered shading
JSR PLOT0
JSR PLOT
INC XPOS
LDAA XPOS
CMPA #$80
BCC NXTY
JMP XLOOP
NXTY:
INC YPOS
LDAA YPOS
CMPA #$20
BCC DONE
JMP YLOOP
DONE:
BRA MAIN
;=======================================================================
; Dithered Shading Based on Iteration Count
; Creates 5 apparent gray levels using patterns
;=======================================================================
SHADE:
LDAA ITER
; Level 0: ITER < 4 = Solid Black (escapes very fast)
CMPA #$04
BCC SHADE1
CLR COL
RTS
SHADE1:
; Level 1: ITER 4-7 = 25% dots (sparse)
CMPA #$08
BCC SHADE2
; Pattern: dot every 4th pixel (2x2 grid, 1 dot per 4 pixels)
LDAA XPOS
ANDA #$01
BNE SHBLK
LDAA YPOS
ANDA #$01
STAA COL
RTS
SHADE2:
; Level 2: ITER 8-11 = 50% checkerboard
CMPA #$0C
BCC SHADE3
LDAA XPOS
ADDA YPOS
ANDA #$01
STAA COL
RTS
SHADE3:
; Level 3: ITER 12-15 = 75% dots (dense)
CMPA #$10
BCC SHADE4
; Pattern: white with sparse black holes
LDAA XPOS
ANDA #$01
BEQ SHWHT
LDAA YPOS
ANDA #$01
BEQ SHWHT
BRA SHBLK
SHADE4:
; Level 4: ITER >= 16 = Solid White (in the set)
LDAA #$01
STAA COL
RTS
SHBLK:
CLR COL
RTS
SHWHT:
LDAA #$01
STAA COL
RTS
;=======================================================================
; Mandelbrot Calculation
;=======================================================================
MANDEL:
CLR ZR
CLR ZR+1
CLR ZI
CLR ZI+1
CLR ITER
MITER:
; ZR² = ZR × ZR (signed)
LDAA ZR
STAA MPLIER
LDAA ZR+1
STAA MPLIER+1
LDAA ZR
STAA MPCAND
LDAA ZR+1
STAA MPCAND+1
JSR SMPY16
LDAA RESULT+1
STAA ZR2
LDAA RESULT+2
STAA ZR2+1
; ZI² = ZI × ZI (signed)
LDAA ZI
STAA MPLIER
LDAA ZI+1
STAA MPLIER+1
LDAA ZI
STAA MPCAND
LDAA ZI+1
STAA MPCAND+1
JSR SMPY16
LDAA RESULT+1
STAA ZI2
LDAA RESULT+2
STAA ZI2+1
; Check escape: ZR² + ZI² >= 4.0 ($0400)
CLC
LDAA ZR2+1
ADDA ZI2+1
STAA TEMP1+1
LDAA ZR2
ADCA ZI2
STAA TEMP1
CMPA #$04
BCC ESCAPE
CONT:
; New ZI = 2×ZR×ZI + CI (signed)
LDAA ZR
STAA MPLIER
LDAA ZR+1
STAA MPLIER+1
LDAA ZI
STAA MPCAND
LDAA ZI+1
STAA MPCAND+1
JSR SMPY16
; Multiply by 2: shift 32-bit result left by 1
ASL RESULT+3
ROL RESULT+2
ROL RESULT+1
ROL RESULT
; Extract bits 23-8
LDAA RESULT+1
STAA TEMP1
LDAA RESULT+2
STAA TEMP1+1
CLC
LDAA TEMP1+1
ADDA CI+1
STAA ZI+1
LDAA TEMP1
ADCA CI
STAA ZI
; New ZR = ZR² - ZI² + CR (signed)
LDAA ZR2+1
SUBA ZI2+1
STAA TEMP1+1
LDAA ZR2
SBCA ZI2
STAA TEMP1
CLC
LDAA TEMP1+1
ADDA CR+1
STAA ZR+1
LDAA TEMP1
ADCA CR
STAA ZR
INC ITER
LDAA ITER
CMPA #$20
BEQ ESCAPE
JMP MITER
ESCAPE:
RTS
;=======================================================================
; Signed 16x16=32 Multiplication
;=======================================================================
SMPY16:
CLR SIGN
LDAA MPLIER
BPL MPLR_POS
INC SIGN
JSR NEG_MPLIER
MPLR_POS:
LDAA MPCAND
BPL MPCD_POS
LDAA SIGN
EORA #$01
STAA SIGN
JSR NEG_MPCAND
MPCD_POS:
JSR UMPY16
LDAA SIGN
BEQ SIGN_DONE
JSR NEG_RESULT
SIGN_DONE:
RTS
NEG_MPLIER:
LDAA MPLIER
COMA
STAA MPLIER
LDAA MPLIER+1
COMA
STAA MPLIER+1
LDAA MPLIER+1
ADDA #$01
STAA MPLIER+1
LDAA MPLIER
ADCA #$00
STAA MPLIER
RTS
NEG_MPCAND:
LDAA MPCAND
COMA
STAA MPCAND
LDAA MPCAND+1
COMA
STAA MPCAND+1
LDAA MPCAND+1
ADDA #$01
STAA MPCAND+1
LDAA MPCAND
ADCA #$00
STAA MPCAND
RTS
NEG_RESULT:
LDAA RESULT
COMA
STAA RESULT
LDAA RESULT+1
COMA
STAA RESULT+1
LDAA RESULT+2
COMA
STAA RESULT+2
LDAA RESULT+3
COMA
STAA RESULT+3
LDAA RESULT+3
ADDA #$01
STAA RESULT+3
LDAA RESULT+2
ADCA #$00
STAA RESULT+2
LDAA RESULT+1
ADCA #$00
STAA RESULT+1
LDAA RESULT
ADCA #$00
STAA RESULT
RTS
UMPY16:
CLR RESULT
CLR RESULT+1
CLR RESULT+2
CLR RESULT+3
CLR TEMP
CLR TEMP+1
LDAA MPCAND
STAA TEMP+2
LDAA MPCAND+1
STAA TEMP+3
LDAA #$10
STAA BITCNT
MLOOP:
LDAA MPLIER+1
ANDA #$01
BEQ NOADD
LDAA RESULT+3
ADDA TEMP+3
STAA RESULT+3
LDAA RESULT+2
ADCA TEMP+2
STAA RESULT+2
LDAA RESULT+1
ADCA TEMP+1
STAA RESULT+1
LDAA RESULT
ADCA TEMP
STAA RESULT
NOADD:
LSR MPLIER
ROR MPLIER+1
ASL TEMP+3
ROL TEMP+2
ROL TEMP+1
ROL TEMP
DEC BITCNT
BNE MLOOP
RTS
CLEARSCREEN:
PSHA
LDAA #$00
JSR EXEC
PULA
JSR LDELAY
JSR LDELAY
RTS
PLOT:
LDAA #$0B
JSR EXEC
LDAA XPOS
JSR EXEC
LDAA YPOS
JSR EXEC
LDAA COL
JSR EXEC
JSR LDELAY
RTS
PLOT0:
JSR REDIS
LDAA XPOS
JSR OUTBYT
LDAA YPOS
JSR OUTBYT
LDAA COL
JSR OUTBYT
RTS
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:
PSHB
PSHA
LDAA #$10
DLY1: LDAB #$FF
DLY2: DECB
BNE DLY2
DECA
BNE DLY1
PULA
PULB
RTS
LDELAY:
PSHA
PSHB
LDAA #$05
LOUTER: LDAB #$FF
LINNER: DECB
BNE LINNER
DECA
BNE LOUTER
PULB
PULA
RTS
END