Files
c64-demo/slide4.asm
T
2026-07-18 15:12:47 +02:00

240 lines
5.9 KiB
NASM

; -----------------------------------------------------------
; slide4.asm - CONTACT
; pulsing big title, contact lines, three-layer starfield
; drifting left, six star sprites floating on sine paths
; behind the text
; -----------------------------------------------------------
s4_init:
jsr clear_screen
+prbig 2, 6, WHITE, big_contact, 7
+prtext 10, 7, LGREEN, txt_web, txt_web_end - txt_web
+prtext 13, 6, YELLOW, txt_bbs, txt_bbs_end - txt_bbs
+prtext 16, 4, CYAN, txt_irc, txt_irc_end - txt_irc
; starfield: draw the stars at their current positions so
; the in-transition reveals them together with the text
ldx #11
s4i_star:
jsr star_ptr
ldy star_x,x
lda #$2e ; '.'
sta (scrlo),y
lda star_col,x
sta (collo),y
dex
bpl s4i_star
; sprites: same star shape on all six, floating behind the
; characters; enabled by the update, so they pop in only
; after the slide's in-transition is done
;
; the shape is copied to the cassette buffer: the VIC sees
; the chargen ROM at $1000-$1fff instead of RAM, so sprite
; data assembled there ($1540) would show as glyph garbage
ldx #62
s4i_copy:
lda sprdata,x
sta SPRBUF,x
dex
bpl s4i_copy
lda #(SPRBUF >> 6)
ldx #5
s4i_ptr:
sta SCREEN+$3f8,x
dex
bpl s4i_ptr
ldx #5
s4i_col:
lda sprcols,x
sta SPR_COL,x
dex
bpl s4i_col
lda #0
sta SPR_MC
sta SPR_XEX
sta SPR_YEX
lda #%00111111
sta SPR_PRIO ; behind the text
lda #%00100000 ; sprite 5 lives right of x=255
sta SPR_MSBX
rts
s4_update:
lda RASTER
cmp #RAS_BOTTOM
bne s4_update
inc framectr
lda framectr ; grey-white pulse on the big title rows (2-6)
lsr
lsr
lsr
and #7
tay
lda pulsetbl,y
ldx #39
s4_loop:
sta COLRAM + 2*40,x
sta COLRAM + 3*40,x
sta COLRAM + 4*40,x
sta COLRAM + 5*40,x
sta COLRAM + 6*40,x
dex
bpl s4_loop
; starfield: three layers, each layer steps left on its own
; frame mask (fast/mid/slow parallax)
ldx #11
s4u_star:
lda framectr
and star_mask,x
bne s4u_next
jsr star_ptr
ldy star_x,x
lda #$20 ; erase at the old position
sta (scrlo),y
lda star_x,x ; step left, wrap at the edge
bne s4u_dec
lda #40
sta star_x,x
s4u_dec:
dec star_x,x
ldy star_x,x
lda #$2e
sta (scrlo),y
lda star_col,x
sta (collo),y
s4u_next:
dex
bpl s4u_star
; sprites: y from a sine table, x = base + slower sine wobble
lda #%00111111
sta SPR_EN
ldx #5
s4u_spr:
txa
asl
sta sprofs ; register offset = sprite * 2
lda framectr
lsr
clc
adc spr_yph,x
and #63
tay
lda ysin,y
ldy sprofs
sta SPRPOS+1,y
lda framectr
lsr
lsr
clc
adc spr_xph,x
and #63
tay
lda xwob,y
clc
adc spr_xbase,x
ldy sprofs
sta SPRPOS,y
dex
bpl s4u_spr
rts
; ---- scrlo/hi + collo/hi = screen/color RAM row of star X ----
star_ptr:
ldy star_row,x
lda mul40lo,y
sta scrlo
sta collo
lda mul40hi,y
clc
adc #>SCREEN
sta scrhi
clc
adc #$d4 ; COLRAM - SCREEN high byte distance
sta colhi
rts
; ---- data ----
big_contact:
!scr "contact"
txt_web:
!scr "web: www.teletypegames.org"
txt_web_end:
txt_bbs:
!scr "bbs: teletypegames.org 2323"
txt_bbs_end:
txt_irc:
!scr "irc: libera.chat #teletypegames"
txt_irc_end:
; starfield: rows avoid the title (2-6) and text (10, 13, 16) rows
star_row:
!byte 0, 8, 11, 14, 17, 19, 1, 9, 12, 15, 21, 23
star_mask: ; move on framectr & mask == 0
!byte 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7
star_col: ; fast = white, mid = lgrey, slow = dgrey
!byte WHITE, LGREY, DGREY, WHITE, LGREY, DGREY
!byte WHITE, LGREY, DGREY, WHITE, LGREY, DGREY
sprcols:
!byte YELLOW, LBLUE, LGREEN, WHITE, ORANGE, CYAN
spr_xbase: ; spread across the screen; sprite 5 gets
!byte 40, 85, 130, 175, 220, 20 ; +256 via SPR_MSBX
spr_yph: ; sine phase offsets per sprite
!byte 0, 11, 21, 32, 43, 53
spr_xph:
!byte 0, 26, 52, 13, 39, 7
ysin: ; 64-entry sine, 134 +/- 60 (sprite y)
!byte $86, $8c, $92, $97, $9d, $a2, $a7, $ac
!byte $b0, $b4, $b8, $bb, $bd, $bf, $c1, $c2
!byte $c2, $c2, $c1, $bf, $bd, $bb, $b8, $b4
!byte $b0, $ac, $a7, $a2, $9d, $97, $92, $8c
!byte $86, $80, $7a, $75, $6f, $6a, $65, $60
!byte $5c, $58, $54, $51, $4f, $4d, $4b, $4a
!byte $4a, $4a, $4b, $4d, $4f, $51, $54, $58
!byte $5c, $60, $65, $6a, $6f, $75, $7a, $80
xwob: ; 64-entry sine, 12 +/- 12 (x wobble)
!byte $0c, $0d, $0e, $0f, $11, $12, $13, $14
!byte $14, $15, $16, $17, $17, $17, $18, $18
!byte $18, $18, $18, $17, $17, $17, $16, $15
!byte $14, $14, $13, $12, $11, $0f, $0e, $0d
!byte $0c, $0b, $0a, $09, $07, $06, $05, $04
!byte $04, $03, $02, $01, $01, $01, $00, $00
!byte $00, $00, $00, $01, $01, $01, $02, $03
!byte $04, $04, $05, $06, $07, $09, $0a, $0b
; 24x21 four-pointed star sprite; copied to SPRBUF at init, so
; it needs no alignment and may sit anywhere
sprdata:
!byte $00, $00, $00
!byte $00, $00, $00
!byte $00, $18, $00
!byte $00, $18, $00
!byte $00, $18, $00
!byte $00, $3c, $00
!byte $00, $3c, $00
!byte $00, $7e, $00
!byte $07, $ff, $e0
!byte $00, $7e, $00
!byte $00, $3c, $00
!byte $00, $3c, $00
!byte $00, $18, $00
!byte $00, $18, $00
!byte $00, $18, $00
!byte $00, $00, $00
!byte $00, $00, $00
!byte $00, $00, $00
!byte $00, $00, $00
!byte $00, $00, $00
!byte $00, $00, $00
; ---- variables ----
star_x: ; star columns (start scattered)
!byte 3, 17, 29, 8, 35, 22, 13, 31, 5, 26, 19, 37
sprofs: !byte 0 ; sprite register offset in the update loop