mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-08 16:07:14 +00:00
178 lines
2.6 KiB
ArmAsm
178 lines
2.6 KiB
ArmAsm
; sierpinski-like demo
|
|
; based on the code from Hellmood's Memories demo
|
|
|
|
; 140 bytes -- enough for appleiibot plus {B11} directive
|
|
; to allow for decompression time
|
|
|
|
; the simple sierpinski you more or less just plot
|
|
; X AND Y
|
|
|
|
; Hellmood's you plot something more or less like
|
|
; COLOR = ( (Y-(X*T)) & (X+(Y*T) ) & 0xf0
|
|
; where T is an incrementing frame value
|
|
|
|
; to get speed on 6502/Apple II we change the multiplies to
|
|
; a series of 16-bit 8.8 fixed point adds
|
|
|
|
.include "hardware.inc"
|
|
|
|
GBASH = $27
|
|
MASK = $2E
|
|
COLOR = $30
|
|
;XX = $F7
|
|
XX_TH = $F8
|
|
XX_TL = $F9
|
|
;YY = $FA
|
|
YY_TH = $FB
|
|
YY_TL = $FC
|
|
T_L = $FD
|
|
T_H = $FE
|
|
SAVED = $FF
|
|
|
|
|
|
;================================
|
|
; Clear screen and setup graphics
|
|
;================================
|
|
sier:
|
|
|
|
jsr SETGR ; set lo-res 40x40 mode
|
|
bit FULLGR ; make it 40x48
|
|
|
|
lda #0 ; start with multiplier 0
|
|
sta T_L
|
|
sta T_H
|
|
|
|
sier_outer:
|
|
|
|
ldx #0 ; YY starts at 0
|
|
stx YY_TL
|
|
stx YY_TH
|
|
|
|
sier_yloop:
|
|
|
|
; calc YY_T (8.8 fixed point add)
|
|
; save space by skipping clc as it's only a slight variation w/o
|
|
; clc
|
|
lda YY_TL
|
|
adc T_L
|
|
sta YY_TL
|
|
lda YY_TH
|
|
adc T_H
|
|
sta YY_TH
|
|
|
|
txa ; YY ; plot call needs Y/2
|
|
lsr
|
|
|
|
bcc even_mask
|
|
ldy #$f0
|
|
.byte $2C ; bit hack
|
|
even_mask:
|
|
ldy #$0f
|
|
sty MASK
|
|
|
|
jsr GBASCALC ; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear)
|
|
|
|
lda GBASH
|
|
|
|
draw_page_smc:
|
|
adc #0
|
|
sta GBASH ; adjust for PAGE1/PAGE2 ($400/$800)
|
|
|
|
|
|
; reset XX to 0
|
|
|
|
ldy #0 ; XX
|
|
sty XX_TL
|
|
sty XX_TH
|
|
|
|
|
|
sier_xloop:
|
|
|
|
; want (YY-(XX*T)) & (XX+(YY*T)
|
|
|
|
|
|
; SAVED = XX+(Y*T)
|
|
; clc
|
|
tya ; XX
|
|
adc YY_TH
|
|
sta SAVED
|
|
|
|
|
|
; calc XX*T
|
|
; clc
|
|
lda XX_TL
|
|
adc T_L
|
|
sta XX_TL
|
|
lda XX_TH
|
|
adc T_H
|
|
sta XX_TH
|
|
|
|
|
|
; calc (YY-X_T)
|
|
txa ; lda YY
|
|
sec
|
|
sbc XX_TH
|
|
|
|
; want (YY-(XX*T)) & (XX+(YY*T)
|
|
|
|
and SAVED
|
|
|
|
and #$f0
|
|
|
|
beq green
|
|
black:
|
|
lda #00 ; black
|
|
.byte $2C ; bit trick
|
|
green:
|
|
lda #$CC ; green
|
|
sta COLOR
|
|
|
|
; XX value already in Y
|
|
|
|
jsr PLOT1 ; PLOT AT (GBASL),Y
|
|
|
|
iny ; XX
|
|
cpy #40
|
|
bne sier_xloop
|
|
|
|
inx ; YY
|
|
cpx #48
|
|
bne sier_yloop
|
|
|
|
; inc T
|
|
; clc
|
|
lda T_L
|
|
blah_smc:
|
|
adc #1
|
|
sta T_L
|
|
lda T_H
|
|
adc #0
|
|
sta T_H
|
|
|
|
; speed up the zoom as it goes
|
|
inc blah_smc+1
|
|
|
|
flip_pages:
|
|
ldx #0
|
|
|
|
lda draw_page_smc+1 ; DRAW_PAGE
|
|
beq done_page
|
|
inx
|
|
done_page:
|
|
ldy PAGE0,X ; set display page to PAGE1 or PAGE2
|
|
|
|
eor #$4 ; flip draw page between $400/$800
|
|
sta draw_page_smc+1 ; DRAW_PAGE
|
|
|
|
jmp sier_outer ; just slightly too far???
|
|
|
|
; for maximum twitter size we enter this program
|
|
; by using the "&" operator which jumps to $3F5
|
|
|
|
; we can't load there though as the code would end up overlapping
|
|
; $400 which is the graphics area
|
|
|
|
; this is at 389
|
|
; we want to be at 3F5, so load program at 36C?
|
|
jmp sier ; entry point from &
|