dos33fsprogs/graphics/hgr/starfield/fastar.s

258 lines
2.8 KiB
ArmAsm

DRAW_PAGE = $E6
ZL = $06
ZH = $07
SEEDLO = $4E
SEEDHI = $4F
NUM1 = $F0
NUM1L = $F1
NUM2 = $F2
NUM2L = $F3
RESULT = $F4
RESULT2 = $F5
RESULT3 = $F6
RESULT4 = $F7
XL = $F8
XH = $F9
YL = $FA
YH = $FB
MINUS = $FC
Z = $FD
HGR2 = $F3D8
HPLOT0 = $F457 ; plot (Y,X), (A)
HGLIN = $F53A ; plot to (A,X), (Y)
HCLEAR0 = $F3F2 ; clear current hgr page to blackh
HCOLOR = $F6F0 ; color in X (must be 0..7)
lda #$ff
sta XH
ldx #0
jmp check_bounds
populate_loop:
; Z = XXYY YYYY
; C=Z*.125
; A=A+(A-64)*C
; B=B+(B-64)*C
; X is in NUM1 for this
lda #0
sta MINUS
sec
lda XH
sbc #64
bpl no_minus
set_minus:
inc MINUS
sec
lda #0
sbc XL
sta NUM1
lda #0
sbc XH
sta NUM1+1
jmp do_mult
no_minus:
sta NUM1+1
lda XL
sta NUM1
do_mult:
lda #0
sta NUM2+1
lda Z
sta NUM2
txa
pha
jsr mult16
pla
tax
; result has result but due to our fixed point
; we want to shift the whole thing left by 2
; then grab RESULT+2 as high and RESULT+1 as low
rol RESULT+1
rol RESULT+2
ror RESULT+1
lda RESULT+2
lda RESULT+1 ; low
sta NUM1
lda RESULT+2 ; hight
sta NUM1+1
; add to X; subtract if minus
lda MINUS
beq not_minus
sec
lda #00
sbc NUM1
sta NUM1
lda #00
sbc NUM1+1
sta NUM1+1
not_minus:
clc
lda XL
adc NUM1
sta XL
lda XH
adc NUM1+1
sta XH
; Z=Z+.125
clc
lda Z
adc #$8
sta Z
; check to see if out of bounds
check_bounds:
lda XH
bmi redo_point
lda YH
bpl all_good
redo_point:
; store a break in the lines
lda #0
sta $1000,X
sta $1100,X
sta Z ; needed?
inx
jsr rand16
sta XH
jsr rand16
sta YH
all_good:
; write out
lda XH
sta $1000,X
lda YH
sta $1100,X
inx
beq done_pop
jmp populate_loop
done_pop:
;=========================
;=========================
;=========================
jsr HGR2
ldx #3
jsr HCOLOR
ldx #0
star_loop:
txa
and #$1
beq page2
page1: ; draw page1, show page2
bit $C055
lda #$20
bne adjust_page
page2:
bit $C054
lda #$40
adjust_page:
sta DRAW_PAGE
; clear background
jsr HCLEAR0
txa
pha
lda $1100,X ; ycoord
beq skip_draw
pha
ldy $1000,X ; xcoord
tya
tax
ldy #0
pla
jsr HPLOT0 ; plot (Y,X), (A)
skip_draw:
pla
tax
inx
jmp star_loop
; make sure seed isn't 0000
rand16:
; batari rand16
lda SEEDHI
lsr
rol SEEDLO
bcc noeor
eor #$B4
noeor:
sta SEEDHI
eor SEEDLO
; we only want 127 bits
and #$7f
rts
;=====================
;=====================
; 16x16 -> 32 multiply
;=====================
;=====================
; destroys NUM2
mult16:
lda #0 ; Initialize RESULT to 0
sta RESULT+2
ldx #16 ; There are 16 bits in NUM2
L1:
lsr NUM2+1 ; top part of 16 bit shift right
ror NUM2
bcc L2 ; 0 or 1?
tay ; If 1, add NUM1 (hi byte of RESULT is in A)
clc
lda NUM1
adc RESULT+2
sta RESULT+2
tya
adc NUM1+1
L2:
ror ; "Stairstep" shift
ror RESULT+2
ror RESULT+1
ror RESULT
dex
bne L1
sta RESULT+3
rts