intro screen

This commit is contained in:
2026-07-15 22:39:08 +02:00
parent be94eef972
commit 97216d245d
6 changed files with 205 additions and 22 deletions
+6 -2
View File
@@ -20,7 +20,10 @@ in the original.
## How it works
- PAL frame loop synced by polling the raster beam (no interrupts), one
state update per frame — title, play and game over are `updvec` states.
state update per frame — intro, menu, play and game over are `updvec`
states. Boot shows the giant TTG / Teletype Games logo with the gold
color wash from the c64-demo, then the menu with *fire = start game*;
losing brings up the final score with *fire = retry*.
- The background is raster-split at the horizon: sky above, grass below.
The road is a grey wedge of inverse-space characters between painted
white edge lines, with trees along both shoulders.
@@ -40,7 +43,8 @@ in the original.
|------|----------|
| `main.asm` | BASIC stub, init, frame loop, state dispatch |
| `defs.asm` | registers, constants, zero page, macros |
| `title.asm` | title screen: logo, parked scooters, demo rabbits |
| `intro.asm` | boot screen: giant TTG logo with the gold wash |
| `title.asm` | menu screen: logo, start game, demo rabbits |
| `play.asm` | gameplay: input, spawning, scoring, HUD |
| `over.asm` | game over box + retry |
| `common.asm` | shared routines: printing, road, input, RNG, rabbit positioning |
+29 -12
View File
@@ -67,7 +67,17 @@ draw_road:
ldx #0
dr_loop:
stx drtmp
txa
jsr road_row
ldx drtmp
inx
cpx #19
bne dr_loop
jmp draw_trees
; ---- redraw road row drtmp (0-18, char row 6+drtmp):
; edge chars + grey fill; also erases text printed over it ----
road_row:
lda drtmp
clc
adc #6 ; road runs from char row 6 to row 24
tax
@@ -90,21 +100,19 @@ dr_loop:
lda #COL_EDGE
sta (collo),y
dey ; fill the surface between the edges
dr_fill:
rr_fill:
cpy drleft
beq dr_rowdone
beq rr_done
lda #$a0 ; inverse space: solid block
sta (scrlo),y
lda #COL_ROAD
sta (collo),y
dey
jmp dr_fill
dr_rowdone:
ldx drtmp
inx
cpx #19
bne dr_loop
; falls through: the roadside trees
jmp rr_fill
rr_done:
rts
; ---- the roadside trees ----
draw_trees:
lda #0
sta ttidx
@@ -537,14 +545,23 @@ txt_score: !scr "score"
txt_miss: !scr "miss"
txt_rabbit: !scr "rabbit"
txt_scooter: !scr "scooter"
txt_press: !scr "press fire to start"
txt_info: !scr "joystick 2 or a/d fire starts"
txt_press: !scr "fire = start game"
txt_info: !scr "joystick 2 or a/d moves"
txt_ttgname: !scr "teletype games"
txt_presents:!scr "presents"
txt_over: !scr "game over"
txt_retry: !scr "fire = retry"
txt_blank: !fill 19, $20
washtbl: ; gold glow ramp (16 entries, cyclic)
!byte $09, $02, $08, $0a, $07, $07, $01, $01
!byte $01, $01, $07, $07, $0a, $08, $02, $09
; ---- shared variables ----
framectr: !byte 0 ; frame counter, incremented by the main loop
washphase: !byte 0 ; gold wash offset on the intro letters
bg_top: !byte COL_SKY ; background color above / below the
bg_bot: !byte COL_GRASS ; horizon raster split
seed: !byte $a7 ; rand8 LFSR state
fheld: !byte 0 ; fire/space edge detection state
joyb: !byte 0 ; joystick bits from read_joy (active high)
+151
View File
@@ -0,0 +1,151 @@
; -----------------------------------------------------------
; intro.asm - boot screen in the spirit of the c64-demo:
; giant TTG letters built from 8x8 bitmaps with a gold color
; wash running down them, TELETYPE GAMES / PRESENTS below;
; advances to the menu after a few seconds or on fire
; -----------------------------------------------------------
INTRO_LROW = 3 ; top cell row of the giant letters
INTRO_TIME = 250 ; frames before it advances on its own
intro_init:
lda #BLACK ; the intro plays on a black screen
sta bg_top
sta bg_bot
lda #0
sta SPR_EN
jsr clear_screen
; T T G at columns 6 / 16 / 26
lda #<glyph_t
sta txtlo
lda #>glyph_t
sta txthi
lda #6
sta g8col
jsr draw_glyph8
lda #16
sta g8col
jsr draw_glyph8
lda #<glyph_g
sta txtlo
lda #>glyph_g
sta txthi
lda #26
sta g8col
jsr draw_glyph8
+prtext 13, 13, WHITE, txt_ttgname, 14
+prtext 15, 16, LGREY, txt_presents, 8
lda #INTRO_TIME
sta introt
lda #0
sta washphase
+setupd intro_update
rts
intro_update:
; gold wash: recolor the letter rows from the cyclic ramp
inc washphase
lda #0
sta g8row
iw_row:
lda #INTRO_LROW
clc
adc g8row
tax
jsr row_ptr
lda washphase
lsr ; half speed keeps the shimmer gentle
clc
adc g8row
and #15
tax
lda washtbl,x
sta rtmp
ldy #33 ; the letters span columns 6-33
iw_col:
lda (scrlo),y
cmp #$a0 ; only touch the letter blocks
bne iw_skip
lda rtmp
sta (collo),y
iw_skip:
dey
cpy #5
bne iw_col
inc g8row
lda g8row
cmp #8
bne iw_row
; fire skips, otherwise wait out the timer
jsr start_edge
beq iw_tick
jmp title_init
iw_tick:
dec introt
bne iw_done
jmp title_init
iw_done:
rts
; ---- draw an 8x8-cell giant letter: txtlo/hi = 8-byte
; bitmap, g8col = left cell column ----
draw_glyph8:
lda #0
sta g8row
g8_row:
lda #INTRO_LROW
clc
adc g8row
tax
jsr row_ptr
ldy g8row
lda (txtlo),y
sta curbits
ldy g8col
lda #8
sta bitcnt
g8_bit:
asl curbits ; leftmost pixel first
bcc g8_next
lda #$a0 ; inverse space = solid block
sta (scrlo),y
lda #YELLOW
sta (collo),y
g8_next:
iny
dec bitcnt
bne g8_bit
inc g8row
lda g8row
cmp #8
bne g8_row
rts
; ---- 8x8 letter bitmaps ----
glyph_t:
!byte %11111111
!byte %11111111
!byte %00111100
!byte %00111100
!byte %00111100
!byte %00111100
!byte %00111100
!byte %00111100
glyph_g:
!byte %00111100
!byte %01111110
!byte %11000011
!byte %11000000
!byte %11001111
!byte %11000011
!byte %01111110
!byte %00111100
; ---- intro variables ----
introt: !byte 0 ; frames left before auto-advancing
g8row: !byte 0 ; glyph renderer / wash internals
g8col: !byte 0
+6 -5
View File
@@ -65,7 +65,7 @@ sprcol:
!ifdef AUTOPLAY { ; test builds boot straight into the game
jsr play_init
} else {
jsr title_init
jsr intro_init ; TTG logo, then the menu
}
; ============================================================
@@ -74,16 +74,16 @@ sprcol:
; ============================================================
main:
jsr wait_frame
lda #COL_SKY ; repaint the sky while the beam is off screen
lda bg_top ; repaint the sky while the beam is off screen
sta BG
inc framectr
jsr rand8 ; stir the RNG once per frame
jsr call_update ; finishes long before the horizon line
wait_grass:
lda RASTER ; split the background at the horizon:
cmp #RAS_SPLIT ; sky above, grass below
bne wait_grass
lda #COL_GRASS
cmp #RAS_SPLIT ; sky above, grass below (the intro
bne wait_grass ; sets both halves to black)
lda bg_bot
sta BG
jmp main
@@ -114,6 +114,7 @@ wf_hit:
; ============================================================
; the states and everything they share
; ============================================================
!src "intro.asm"
!src "title.asm"
!src "play.asm"
!src "over.asm"
+4
View File
@@ -6,6 +6,10 @@
; ---- start (or restart) a round ----
play_init:
lda #COL_SKY ; in case we come from a black screen
sta bg_top
lda #COL_GRASS
sta bg_bot
jsr clear_screen
jsr draw_road
+9 -3
View File
@@ -5,12 +5,16 @@
; -----------------------------------------------------------
title_init:
lda #COL_SKY ; back from the intro's black screen
sta bg_top
lda #COL_GRASS
sta bg_bot
jsr clear_screen
jsr draw_road
+prbig 1, 8, RED, txt_rabbit, 6
+prtext 6, 16, WHITE, txt_scooter, 7
+prtext 17, 4, WHITE, txt_info, 31
+prtext 17, 8, WHITE, txt_info, 23
; one parked scooter per lane on sprites 0-4, all in red
ldx #4
@@ -86,10 +90,12 @@ tu_pos:
lda framectr
and #32
bne tu_hide
+prtext 15, 10, YELLOW, txt_press, 19
+prtext 15, 11, YELLOW, txt_press, 17
jmp tu_start
tu_hide:
+prtext 15, 10, YELLOW, txt_blank, 19
lda #9 ; hide: repaint road row 15 over the text
sta drtmp
jsr road_row
tu_start:
jsr start_edge
beq tu_done