mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-01 01:06:33 +00:00
274 lines
3.9 KiB
ArmAsm
274 lines
3.9 KiB
ArmAsm
; Interference Pattern
|
|
|
|
; a really bad hack up of some existing code I had
|
|
; don't have time to make something better
|
|
|
|
|
|
;================================
|
|
; Clear screen and setup graphics
|
|
;================================
|
|
interference:
|
|
|
|
bit SET_GR
|
|
bit FULLGR ; make it 40x48
|
|
bit PAGE1
|
|
; bit LORES ; put this off so draw before flip
|
|
|
|
|
|
lda #0
|
|
sta FRAME
|
|
|
|
lda #4
|
|
sta DRAW_PAGE
|
|
|
|
draw_oval_loop:
|
|
inc FRAME ; increment frame
|
|
|
|
ldx #47 ; YY from 47 downto zero
|
|
|
|
create_yloop:
|
|
|
|
txa
|
|
|
|
;================================
|
|
; plot_setup
|
|
;================================
|
|
|
|
plot_setup:
|
|
|
|
lsr ; shift bottom bit into carry ; 2
|
|
tay
|
|
|
|
bcc do_plot_even ; 2nt/3
|
|
do_plot_odd:
|
|
lda #$f0 ; 2
|
|
bcs do_plot_c_done ; 2nt/3
|
|
do_plot_even:
|
|
lda #$0f ; 2
|
|
do_plot_c_done:
|
|
sta mask_smc2+1 ;
|
|
eor #$FF ; 2
|
|
sta mask_invert_smc1+1 ;
|
|
|
|
|
|
lda gr_offsets_l,Y ; lookup low-res memory address ; 4
|
|
sta gbasl_smc1+1
|
|
sta gbasl_smc2+1
|
|
|
|
|
|
lda gr_offsets_h,Y ; 4
|
|
clc
|
|
adc DRAW_PAGE ; add in draw page offset ; 3
|
|
sta gbasl_smc1+2
|
|
sta gbasl_smc2+2
|
|
|
|
;==========================================
|
|
|
|
|
|
|
|
;===========================
|
|
; calculate for each XPOS (Y) on ROW (X)
|
|
|
|
ldy #39
|
|
|
|
create_xloop:
|
|
|
|
; lda #128
|
|
lda FRAME
|
|
sta SUM
|
|
|
|
tya ; XX
|
|
jsr calcsine_div2
|
|
|
|
txa ; YY
|
|
|
|
adc FRAME ; ADDED
|
|
|
|
jsr calcsine
|
|
|
|
; X (YY) is in SAVEX
|
|
|
|
clc
|
|
|
|
sty SAVEY ; XX
|
|
|
|
tya
|
|
|
|
; PATCH?
|
|
adc SAVEX ; XX + YY
|
|
|
|
adc FRAME ; ADDED
|
|
|
|
jsr calcsine_div2
|
|
; jsr calcsine
|
|
|
|
|
|
; clc
|
|
; adc FRAME
|
|
|
|
lsr ; double colors
|
|
and #$7 ; mask
|
|
tax
|
|
lda colorlookup,X
|
|
|
|
sta color_smc+1
|
|
|
|
; tya
|
|
; pha
|
|
|
|
|
|
;================================
|
|
; plot1
|
|
;================================
|
|
|
|
plot1:
|
|
mask_invert_smc1:
|
|
lda #$ff ; load mask ; 2
|
|
gbasl_smc1:
|
|
and $400,Y ; mask to preserve on-screen color ; 4+
|
|
sta COLOR_MASK ; save temporarily ; 3
|
|
color_smc:
|
|
lda #$FF ; load color ; 2
|
|
mask_smc2:
|
|
and #$FF ; mask so only hi/lo we want ; 2
|
|
ora COLOR_MASK ; combine with on-screen color ; 3
|
|
gbasl_smc2:
|
|
sta $400,Y ; save back out ; 5
|
|
|
|
;=================================
|
|
|
|
; pla
|
|
; tay
|
|
|
|
ldy SAVEY
|
|
ldx SAVEX
|
|
|
|
dey
|
|
bpl create_xloop
|
|
|
|
dex
|
|
bpl create_yloop
|
|
|
|
|
|
lda DRAW_PAGE
|
|
beq flip_to_2
|
|
|
|
bit PAGE2
|
|
|
|
lda #0
|
|
beq done_flip
|
|
|
|
flip_to_2:
|
|
bit PAGE1
|
|
lda #4
|
|
done_flip:
|
|
sta DRAW_PAGE
|
|
|
|
bit LORES ; here so first flip happens after having drawn
|
|
|
|
|
|
;===================================
|
|
;===================================
|
|
;===================================
|
|
; try patching
|
|
|
|
lda FRAME
|
|
and #$10
|
|
bne do_patch1
|
|
undo_patch1:
|
|
lda #$EA ; nop
|
|
bne done_patch1 ; bra
|
|
do_patch1:
|
|
lda #$4A ; lsr
|
|
done_patch1:
|
|
sta patch1
|
|
;===================================
|
|
|
|
interference_end_smc:
|
|
lda #18
|
|
jsr wait_for_pattern
|
|
bcs done_interference
|
|
|
|
; lda KEYPRESS
|
|
; bmi done_interference
|
|
|
|
jmp draw_oval_loop ; bra
|
|
|
|
done_interference:
|
|
; bit KEYRESET
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
;=============================
|
|
;=============================
|
|
|
|
calcsine_div2:
|
|
; no LSR = zoomed out
|
|
lsr ; one LSR = zoomed in on oval
|
|
patch1:
|
|
nop ; two LSR = more zoomed in
|
|
|
|
calcsine:
|
|
stx SAVEX
|
|
|
|
and #$3f
|
|
|
|
tax
|
|
rol
|
|
rol
|
|
rol
|
|
bcc sinadd
|
|
|
|
sinsub:
|
|
lda #0
|
|
lda SUM
|
|
sec
|
|
sbc sinetable-32,X
|
|
jmp sindone
|
|
|
|
sinadd:
|
|
; ldx FRAME
|
|
|
|
lda SUM
|
|
clc
|
|
adc sinetable,X
|
|
|
|
sindone:
|
|
sta SUM
|
|
|
|
ldx SAVEX
|
|
rts
|
|
|
|
|
|
colorlookup:
|
|
|
|
; pink
|
|
.byte $55,$11,$33,$bb,$ff,$bb,$55
|
|
.byte $00
|
|
|
|
|
|
sinetable:
|
|
; this is actually (32*sin(x))
|
|
|
|
.byte $00,$03,$06,$09,$0C,$0F,$11,$14
|
|
.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F
|
|
.byte $20,$1F,$1F,$1E,$1D,$1C,$1A,$18
|
|
.byte $16,$14,$11,$0F,$0C,$09,$06,$03
|
|
;.byte $00,$FD,$FA,$F7,$F4,$F1,$EF,$EC
|
|
;.byte $EA,$E8,$E6,$E4,$E3,$E2,$E1,$E1
|
|
;.byte $E0,$E1,$E1,$E2,$E3,$E4,$E6,$E8
|
|
;.byte $EA,$EC,$EF,$F1,$F4,$F7,$FA,$FD
|
|
|
|
gr_offsets_l:
|
|
.byte <$400,<$480,<$500,<$580,<$600,<$680,<$700,<$780
|
|
.byte <$428,<$4a8,<$528,<$5a8,<$628,<$6a8,<$728,<$7a8
|
|
.byte <$450,<$4d0,<$550,<$5d0,<$650,<$6d0,<$750,<$7d0
|
|
|
|
gr_offsets_h:
|
|
.byte >$400,>$480,>$500,>$580,>$600,>$680,>$700,>$780
|
|
.byte >$428,>$4a8,>$528,>$5a8,>$628,>$6a8,>$728,>$7a8
|
|
.byte >$450,>$4d0,>$550,>$5d0,>$650,>$6d0,>$750,>$7d0
|