dos33fsprogs/graphics/gr/sier/sier_bot.s
2021-03-01 19:21:55 -05:00

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 &