dos33fsprogs/graphics/hgr/tiny_triangles/sier_hgr.s

238 lines
3.6 KiB
ArmAsm
Raw Normal View History

2021-04-12 05:33:27 +00:00
; sierpinski-like demo
; based on the code from Hellmood's Memories demo
; by Vince `deater` Weaver <vince@deater.net>
; 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
; TODO:
; HPLOT timing
; MOVERIGHT timing
; MOVERIGHT MOVEDOWN timing
; LOOKUP TABLE timing
; zero page
HGR_BITS = $1C
2021-04-12 18:47:49 +00:00
GBASL = $26
2021-04-12 05:33:27 +00:00
GBASH = $27
MASK = $2E
COLOR = $30
2021-04-12 18:47:49 +00:00
HGR_HMASK = $30
2021-04-12 05:33:27 +00:00
HGR_X = $E0
HGR_Y = $E2
HGR_COLOR = $E4
2021-04-12 19:17:21 +00:00
HGR_HORIZ = $E5
2021-04-12 18:47:49 +00:00
SAVEX = $F7
2021-04-12 05:33:27 +00:00
XX_TH = $F8
XX_TL = $F9
2021-04-12 18:47:49 +00:00
YY = $FA
2021-04-12 05:33:27 +00:00
YY_TH = $FB
YY_TL = $FC
2021-04-12 18:47:49 +00:00
T_L = $FD
T_H = $FE
2021-04-12 05:33:27 +00:00
SAVED = $FF
; Soft switches
FULLGR = $C052
PAGE1 = $C054
PAGE2 = $C055
LORES = $C056 ; Enable LORES graphics
; ROM routines
HGR = $F3E2
HGR2 = $F3D8
2021-04-12 18:47:49 +00:00
HPOSN = $F411
HPLOT0 = $F457
HPLOT1 = $F45A ; skip the HPOSN call
COLOR_SHIFT = $F47E ; shift color for odd/even Y (0..7 or 7..13)
MOVE_RIGHT = $F48A ; move next plot location one to the right
MOVE_DOWN = $F504 ; clc at f504, needed?
; f505 is applesoft entry point but assumes c?
; move next plot location one to the right
; note moveright/movedown respect HGR_PAGE
COLORTBL = $F6F6
2021-04-12 05:33:27 +00:00
;.zeropage
;.globalzp T_L,T_H
;================================
; Clear screen and setup graphics
;================================
sier:
jsr HGR2 ; set FULLGR, sets A=0
2021-04-12 19:42:09 +00:00
; lda #0 ; start with multiplier 0
2021-04-12 18:47:49 +00:00
sta T_L
sta T_H
2021-04-12 05:33:27 +00:00
sier_outer:
2021-04-12 19:42:09 +00:00
lda #$40
sta GBASH
2021-04-12 18:47:49 +00:00
2021-04-12 19:42:09 +00:00
lda #0 ; YY starts at 0
sta YY
sta GBASL
2021-04-12 05:33:27 +00:00
2021-04-12 19:42:09 +00:00
sta YY_TL
sta YY_TH
2021-04-12 05:33:27 +00:00
2021-04-12 19:42:09 +00:00
sta YY
2021-04-12 05:33:27 +00:00
2021-04-12 19:42:09 +00:00
sier_yloop:
2021-04-12 18:47:49 +00:00
2021-04-12 19:42:09 +00:00
lda #$C0 ; 192
2021-04-12 18:47:49 +00:00
sta HGR_HMASK
2021-04-12 05:33:27 +00:00
; 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
; reset XX to 0
2021-04-12 19:42:09 +00:00
ldy #0 ; y is x/7
2021-04-12 05:33:27 +00:00
ldx #0 ; XX
stx XX_TL
stx XX_TH
sier_xloop:
; want (YY-(XX*T)) & (XX+(YY*T)
; SAVED = XX+(Y*T)
; clc
2021-04-12 18:47:49 +00:00
txa ; XX ; 2
adc YY_TH ; 3
sta SAVED ; 3
2021-04-12 05:33:27 +00:00
; calc XX*T
; clc
2021-04-12 18:47:49 +00:00
lda XX_TL ; 3
adc T_L ; 3
sta XX_TL ; 3
lda XX_TH ; 3
adc T_H ; 3
sta XX_TH ; 3
2021-04-12 05:33:27 +00:00
; calc (YY-X_T)
2021-04-12 19:17:21 +00:00
eor #$ff ; 2
2021-04-12 18:47:49 +00:00
sec ; 2
2021-04-12 19:17:21 +00:00
adc YY ; 3
2021-04-12 05:33:27 +00:00
; want (YY-(XX*T)) & (XX+(YY*T)
2021-04-12 18:47:49 +00:00
and SAVED ; 3
;============
2021-04-12 19:17:21 +00:00
; 36
2021-04-12 18:47:49 +00:00
2021-04-12 05:33:27 +00:00
2021-04-12 19:17:21 +00:00
; and #$f8
2021-04-12 05:33:27 +00:00
2021-04-12 19:17:21 +00:00
beq black ; 2/3
2021-04-12 05:33:27 +00:00
white:
2021-04-12 19:17:21 +00:00
lda #$ff ; white ; 2
; .byte $2C ; bit trick
black:
;=====
; 4?
2021-04-12 05:33:27 +00:00
2021-04-12 18:47:49 +00:00
color_ready:
2021-04-12 19:17:21 +00:00
; sta HGR_BITS
2021-04-12 05:33:27 +00:00
2021-04-12 18:47:49 +00:00
no_shift:
2021-04-12 05:33:27 +00:00
2021-04-12 19:17:21 +00:00
; inline HPLOT1 (starting at $F45C)
eor (GBASL),Y ; 5+
and HGR_HMASK ; 3
eor (GBASL),Y ; 5+
sta (GBASL),Y ; 6
2021-04-12 19:42:09 +00:00
;=======
; 19
; inline MOVE_RIGHT
2021-04-12 19:17:21 +00:00
2021-04-12 19:42:09 +00:00
lda HGR_HMASK ; get mask ; 3
asl ; adjust ; 2
eor #$80 ; toggle top bit ; 2
bmi lr_1 ; if set, done? ; 3/2
lda #$81 ; otherwise set to $81 ; 2
iny ; and move to next mult of 7 ; 2
2021-04-12 19:17:21 +00:00
2021-04-12 19:42:09 +00:00
; no need to check for
; right boundary
2021-04-12 19:17:21 +00:00
; as we do that separately
2021-04-12 19:42:09 +00:00
lr_1:
sta HGR_HMASK ; 3
;======
; 16
2021-04-12 05:33:27 +00:00
2021-04-12 18:47:49 +00:00
;==================================
2021-04-12 19:17:21 +00:00
inx ; 2
bne sier_xloop ; 3/2
2021-04-12 05:33:27 +00:00
2021-04-12 19:42:09 +00:00
;=================
; total roughly 36+4+19+16+5 = 80
; 49152 per inside *80 = 3,932,160
; apple II cyles/frame = 17,030
; 1FPS = 1,021,800
2021-04-12 18:47:49 +00:00
;==================================
jsr MOVE_DOWN ; X/Y left alone
inc YY ; repeat until Y=192
ldy YY
2021-04-12 05:33:27 +00:00
cpy #192
bne sier_yloop
2021-04-12 18:47:49 +00:00
2021-04-12 05:33:27 +00:00
; inc T
; clc
lda T_L
blah_smc:
adc #1
sta T_L
bcc no_carry
inc T_H
no_carry:
; speed up the zoom as it goes
inc blah_smc+1
;flip_pages:
2021-04-12 18:47:49 +00:00
; TODO if frame rate ever gets fast enough
2021-04-12 05:33:27 +00:00
jmp sier_outer ; what can we branch on?
2021-04-12 18:47:49 +00:00
2021-04-12 05:33:27 +00:00