sine: optimize a bit more

This commit is contained in:
Vince Weaver 2022-01-26 00:06:20 -05:00
parent 22a9c81d36
commit f67e8bc7cc
6 changed files with 70 additions and 67 deletions

View File

@ -152,6 +152,9 @@ noc2:
bne right_lines_loop bne right_lines_loop
;========================================= ;=========================================
; draw line ; draw line
; from x1,y1 to x2,y2 ; from x1,y1 to x2,y2

View File

@ -5,22 +5,22 @@ TOKENIZE = ../../../utils/asoft_basic-utils/tokenize_asoft
LINKERSCRIPTS = ../../../linker_scripts LINKERSCRIPTS = ../../../linker_scripts
EMPTYDISK = ../../../empty_disk/empty.dsk EMPTYDISK = ../../../empty_disk/empty.dsk
all: plasma_hgr.dsk all: sines.dsk
plasma_hgr.dsk: HELLO APPROX_SINE THICK_SINE THICK_COS TABLE_SINE ROM_SINE \ sines.dsk: HELLO APPROX_SINE THICK_SINE THICK_COS TABLE_SINE ROM_SINE \
OOPS_COS OOPS2_COS OOPS3_COS OOPS4_COS ROTATE OOPS_COS OOPS2_COS OOPS3_COS OOPS4_COS ROTATE
cp $(EMPTYDISK) plasma_hgr.dsk cp $(EMPTYDISK) sines.dsk
$(DOS33) -y plasma_hgr.dsk SAVE A HELLO $(DOS33) -y sines.dsk SAVE A HELLO
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 APPROX_SINE $(DOS33) -y sines.dsk BSAVE -a 0xc00 APPROX_SINE
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 TABLE_SINE $(DOS33) -y sines.dsk BSAVE -a 0xc00 TABLE_SINE
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 ROM_SINE $(DOS33) -y sines.dsk BSAVE -a 0xc00 ROM_SINE
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 THICK_SINE $(DOS33) -y sines.dsk BSAVE -a 0xc00 THICK_SINE
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 THICK_COS $(DOS33) -y sines.dsk BSAVE -a 0xc00 THICK_COS
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 OOPS_COS $(DOS33) -y sines.dsk BSAVE -a 0xc00 OOPS_COS
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 OOPS2_COS $(DOS33) -y sines.dsk BSAVE -a 0xc00 OOPS2_COS
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0x3f5 OOPS3_COS $(DOS33) -y sines.dsk BSAVE -a 0x3f5 OOPS3_COS
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0x3f5 OOPS4_COS $(DOS33) -y sines.dsk BSAVE -a 0x3f5 OOPS4_COS
$(DOS33) -y plasma_hgr.dsk BSAVE -a 0x3f5 ROTATE $(DOS33) -y sines.dsk BSAVE -a 0x3f5 ROTATE
### ###

View File

@ -28,11 +28,11 @@ force_zero:
sta sinetable+$30,X sta sinetable+$30,X
sta sinetable+$20,Y sta sinetable+$20,Y
lda #0
inx inx
dey dey
tya ; force a zero at end
beq force_zero beq force_zero
bpl sinetable_loop bpl sinetable_loop
end: end:

View File

@ -1,10 +1,14 @@
; thick sine ; table look up sine
; trying to make a 64 entry 32*sin() in the zero page
; want to beat 35 bytes (that's what the cos/ROM does)
; 57 bytes -- original
; 48 bytes -- optimize
; 46 bytes -- zero page
; zero page ; zero page
GBASL = $26
GBASH = $27
YY = $69
ROW_SUM = $70
HGR_X = $E0 HGR_X = $E0
HGR_XH = $E1 HGR_XH = $E1
@ -17,46 +21,35 @@ SUM = $FD
SAVEX = $FE SAVEX = $FE
SAVEY = $FF SAVEY = $FF
sinetable=$70
thick_sine:
table_sine:
;================== ;==================
; create sinetable ; create sinetable
ldy #0 ; Y is 0 ldx #0 ; Y is 0
ldy #$10
sinetable_loop: sinetable_loop:
tya ; 2
and #$3f ; wrap sine at 63 entries ; 2
cmp #$20
php ; save pos/negative for later
and #$1f
cmp #$10
bcc sin_left ; blt
sin_right:
; sec carry should be set here
eor #$FF
adc #$20 ; 32-X
sin_left:
tax
lda sinetable_base,X ; 4+ lda sinetable_base,X ; 4+
plp sta sinetable+$10,X
bcc sin_done sta sinetable+$00,Y
sin_negate:
; carry set here
eor #$ff eor #$ff
adc #0 ; FIXME: this makes things off by 1
sin_done: sec ; these maybe not needed
sta sinetable,Y adc #$0
iny sta sinetable+$30,X
bne sinetable_loop sta sinetable+$20,Y
inx
dey
bpl sinetable_loop
; Y is 0 at this point? ; Y is 0 at this point?
@ -66,10 +59,9 @@ done:
sinetable_base: sinetable_base:
; this is actually (32*sin(x)) ; this is actually (32*sin(x))
.byte $00,$03,$06,$09,$0C,$0F,$11,$14 ;.byte $00,$03,$06,$09,$0C,$0F,$11,$14
.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F ;.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F,$20
.byte $20
.byte $20,$1F,$1F,$1E,$1D,$1C,$1A,$18,$16
sinetable=$6000 .byte $14,$11,$0F,$0C,$09,$06,$03,$00

View File

@ -11,9 +11,10 @@
; 72 bytes -- depend on X being 0 at end of loop ; 72 bytes -- depend on X being 0 at end of loop
; 71 bytes -- rerrange so can beq rather than jmp ; 71 bytes -- rerrange so can beq rather than jmp
; 70 bytes -- update the sine table division ; 70 bytes -- update the sine table division
; 69 bytes -- optimize sine routine
; zero page ; zero page
sinetable=$70 sinetable=$60
HGR_X = $E0 HGR_X = $E0
HGR_XH = $E1 HGR_XH = $E1
HGR_Y = $E2 HGR_Y = $E2
@ -52,23 +53,24 @@ sinetable_loop:
lda costable_base+1,Y lda costable_base+1,Y
force_zero: force_zero:
lsr ; rom value is *256 lsr ; rom value is *256
lsr ; we want *32 lsr ; we want *64
; lsr
sta sinetable+$10,Y sta sinetable+$10,Y
sta sinetable+$00,X sta sinetable+$00,X
eor #$FF eor #$FF
sec sec
adc #$0 adc #$0
sta sinetable+$30,Y sta sinetable+$30,Y
sta sinetable+$20,X sta sinetable+$20,X
lda #0 ; hack, ROM cosine table doesn't
; have a good zero for some reason
iny iny
dex dex
txa ; hack, ROM cosine table doesn't
; have a good zero for some reason
beq force_zero beq force_zero
bpl sinetable_loop bpl sinetable_loop
@ -107,11 +109,11 @@ circle_loop:
lda FRAME lda FRAME
and #$3f ; wrap value to 0..63 and #$3f ; wrap value to 0..63
tay tay
lda sinetable,Y lda sinetable,Y
; multiply by 2 and center on screen $60 is midscreen ; center on screen $60 is midscreen
; asl
clc clc
adc #$60 adc #$60

View File

@ -1,4 +1,9 @@
; Tiny Tiny ; Tiny Cool - 32B demo
; makes a pretty neat spinning pattern
; not necessarily repeatable, it's walking through each memory page
; and grabbing offset 32 or so as a shape table
; what you get depends on contents of RAM
; zero page locations ; zero page locations
HGR_SHAPE = $1A HGR_SHAPE = $1A
@ -24,11 +29,11 @@ tiny_tiny:
jsr HGR2 ; Hi-res graphics, no text at bottom jsr HGR2 ; Hi-res graphics, no text at bottom
; Y=0, A=0 after this call ; Y=0, A=0 after this call
lda #1 iny
sta HGR_SCALE sty HGR_SCALE
tiny_loop: tiny_loop:
; setup X and Y co-ords ; setup X and Y co-ords for center of screen
ldy #0 ; Y always 0 ldy #0 ; Y always 0
ldx #140 ldx #140
lda #96 lda #96
@ -42,7 +47,8 @@ rot_smc:
jsr XDRAW0 ; XDRAW 1 AT X,Y jsr XDRAW0 ; XDRAW 1 AT X,Y
; Both A and X are 0 at exit ; Both A and X are 0 at exit
inc rot_smc+1 ; increment rotation
inc rot_smc+1 ; oops also increments high byte of shape table
jmp tiny_loop jmp tiny_loop
shape_table: shape_table: