mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-02-13 14:31:19 +00:00
260 lines
3.9 KiB
ArmAsm
260 lines
3.9 KiB
ArmAsm
|
; more plasma
|
||
|
|
||
|
; by Vince `deater` Weaver (vince@deater.net) / dSr
|
||
|
; with some help from qkumba
|
||
|
|
||
|
; zero page
|
||
|
GBASL = $26
|
||
|
GBASH = $27
|
||
|
MASK = $2E
|
||
|
COLOR = $30
|
||
|
;CTEMP = $68
|
||
|
YY = $69
|
||
|
|
||
|
FRAME = $FC
|
||
|
SUM = $FD
|
||
|
SAVEX = $FE
|
||
|
SAVEY = $FF
|
||
|
|
||
|
; soft-switches
|
||
|
FULLGR = $C052
|
||
|
PAGE1 = $C054
|
||
|
|
||
|
; ROM routines
|
||
|
PLOT = $F800 ;; PLOT AT Y,A
|
||
|
PLOT1 = $F80E ;; PLOT at (GBASL),Y (need MASK to be $0f or $f0)
|
||
|
GBASCALC= $F847 ;; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear)
|
||
|
SETCOL = $F864 ;; COLOR=A*17
|
||
|
SETGR = $FB40
|
||
|
|
||
|
|
||
|
|
||
|
;================================
|
||
|
; Clear screen and setup graphics
|
||
|
;================================
|
||
|
plasma:
|
||
|
|
||
|
jsr SETGR ; set lo-res 40x40 mode
|
||
|
bit FULLGR ; make it 40x48
|
||
|
|
||
|
draw_plasma:
|
||
|
|
||
|
lda #$0f
|
||
|
sta MASK
|
||
|
|
||
|
ldx #47 ; YY
|
||
|
create_yloop:
|
||
|
|
||
|
lda MASK
|
||
|
eor #$FF
|
||
|
sta MASK
|
||
|
|
||
|
txa
|
||
|
lsr
|
||
|
jsr GBASCALC ; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear)
|
||
|
|
||
|
ldy #39
|
||
|
|
||
|
create_xloop:
|
||
|
|
||
|
lda #128
|
||
|
sta SUM
|
||
|
|
||
|
tya ; XX
|
||
|
jsr calcsine
|
||
|
|
||
|
txa ; YY
|
||
|
jsr calcsine
|
||
|
|
||
|
clc
|
||
|
sty SAVEY ; XX
|
||
|
txa
|
||
|
adc SAVEY ; XX + YY
|
||
|
jsr calcsine
|
||
|
|
||
|
clc
|
||
|
adc FRAME
|
||
|
|
||
|
lsr
|
||
|
and #$7
|
||
|
tax
|
||
|
lda colorlookup,X
|
||
|
|
||
|
jsr SETCOL
|
||
|
|
||
|
ldy SAVEY
|
||
|
lda SAVEX
|
||
|
|
||
|
jsr PLOT1 ; PLOT (GBASL),Y
|
||
|
|
||
|
ldx SAVEX
|
||
|
|
||
|
dey
|
||
|
bpl create_xloop
|
||
|
|
||
|
dex
|
||
|
bpl create_yloop
|
||
|
|
||
|
; X and Y both $FF
|
||
|
|
||
|
create_lookup_done:
|
||
|
|
||
|
forever_loop:
|
||
|
inc FRAME
|
||
|
|
||
|
jmp draw_plasma
|
||
|
; jmp forever_loop
|
||
|
|
||
|
.if 0
|
||
|
cycle_colors:
|
||
|
|
||
|
; cycle colors
|
||
|
; instead of advancing entire frame, do slightly slower route
|
||
|
; instead now and just incrememnting the frame and doing the
|
||
|
; adjustment at plot time.
|
||
|
|
||
|
; increment frame
|
||
|
|
||
|
inc frame_smc+1
|
||
|
|
||
|
; set/flip pages
|
||
|
; we want to flip pages and then draw to the offscreen one
|
||
|
|
||
|
flip_pages:
|
||
|
|
||
|
; ldy #0
|
||
|
|
||
|
; iny ; y is $FF, make it 0
|
||
|
|
||
|
lda draw_page_smc+1 ; DRAW_PAGE
|
||
|
bne done_page
|
||
|
dey
|
||
|
done_page:
|
||
|
; ldx PAGE1,Y ; set display page to PAGE1 or PAGE2
|
||
|
|
||
|
ldx $BF56,Y ; PAGE1 - $FF
|
||
|
|
||
|
eor #$4 ; flip draw page between $400/$800
|
||
|
sta draw_page_smc+1 ; DRAW_PAGE
|
||
|
|
||
|
|
||
|
; plot current frame
|
||
|
; scan whole 40x48 screen and plot each point based on
|
||
|
; lookup table colors
|
||
|
plot_frame:
|
||
|
|
||
|
ldx #47 ; YY=47 (count backwards)
|
||
|
plot_yloop:
|
||
|
|
||
|
txa ; get YY into A
|
||
|
pha ; save X for later
|
||
|
lsr ; call actually wants Ycoord/2
|
||
|
|
||
|
php ; save C flag for mask handling
|
||
|
|
||
|
; ugh can't use PLOT trick as it always will draw something
|
||
|
; to PAGE1 even if we don't want to
|
||
|
|
||
|
jsr GBASCALC ; point GBASL/H to address in (A is ycoord/2)
|
||
|
; after, A is GBASL, C is clear
|
||
|
|
||
|
lda GBASH ; adjust to be PAGE1/PAGE2 ($400 or $800)
|
||
|
draw_page_smc:
|
||
|
adc #0
|
||
|
sta GBASH
|
||
|
|
||
|
; increment YY in top nibble of lookup for (yy<<16)+xx
|
||
|
; clc from above, C always 0
|
||
|
lda plot_lookup_smc+1
|
||
|
adc #$10 ; no need to mask as it will oflo and be ignored
|
||
|
sta plot_lookup_smc+1
|
||
|
|
||
|
;==========
|
||
|
|
||
|
ldy #39 ; XX = 39 (countdown)
|
||
|
|
||
|
; sets MASK by calling into middle of PLOT routine
|
||
|
; by Y being 39 draw in a spot that gets over-written
|
||
|
|
||
|
plp
|
||
|
jsr $f806
|
||
|
|
||
|
plot_xloop:
|
||
|
|
||
|
tya ; get XX & 0x0f
|
||
|
and #$f
|
||
|
tax
|
||
|
|
||
|
plot_lookup_smc:
|
||
|
lda lookup,X ; load lookup, (YY*16)+XX
|
||
|
|
||
|
clc
|
||
|
frame_smc:
|
||
|
adc #$00 ; add in frame
|
||
|
|
||
|
and #$f
|
||
|
lsr ; we actually only have 8 colors
|
||
|
|
||
|
tax
|
||
|
|
||
|
lda colorlookup,X ; lookup color
|
||
|
|
||
|
|
||
|
sta COLOR ; each nibble should be same
|
||
|
|
||
|
jsr PLOT1 ; plot at GBASL,Y (x co-ord goes in Y)
|
||
|
|
||
|
dey
|
||
|
bpl plot_xloop
|
||
|
|
||
|
pla ; restore YY
|
||
|
tax
|
||
|
dex
|
||
|
bpl plot_yloop
|
||
|
bmi forever_loop
|
||
|
.endif
|
||
|
|
||
|
|
||
|
;calcsine_div_8:
|
||
|
; lsr
|
||
|
;calcsine_div_4:
|
||
|
; lsr
|
||
|
;calcsine_div_2:
|
||
|
; lsr
|
||
|
calcsine:
|
||
|
; asl
|
||
|
stx SAVEX
|
||
|
and #$1f
|
||
|
tax
|
||
|
lda sinetable,X
|
||
|
clc
|
||
|
adc SUM
|
||
|
sta SUM
|
||
|
ldx SAVEX
|
||
|
rts
|
||
|
|
||
|
|
||
|
colorlookup:
|
||
|
|
||
|
; blue
|
||
|
;.byte $55,$22,$66,$77,$ff,$77,$55,$00
|
||
|
|
||
|
.byte $00,$55,$77,$ff,$77,$66,$22,$55
|
||
|
|
||
|
;.byte $00,$00,$55,$55,$77,$77,$ff,$ff
|
||
|
;.byte $77,$77,$66,$66,$22,$22,$55,$55
|
||
|
|
||
|
|
||
|
sinetable:
|
||
|
; this is actually (32*sin(x))
|
||
|
.byte $00,$06,$0C,$11,$16,$1A,$1D,$1F
|
||
|
.byte $20,$1F,$1D,$1A,$16,$11,$0C,$06
|
||
|
.byte $00,$FA,$F4,$EF,$EA,$E6,$E3,$E1
|
||
|
.byte $E0,$E1,$E3,$E6,$EA,$EF,$F4,$FA
|
||
|
|
||
|
;.byte $00,$0C,$16,$1D
|
||
|
;.byte $20,$1D,$16,$0C
|
||
|
;.byte $00,$F4,$EA,$E3
|
||
|
;.byte $E0,$E3,$EA,$F4
|
||
|
|