Files
2024-10-16 12:39:12 +02:00

1435 lines
27 KiB
NASM

SCR_HEIGHT = 8
WORLD_LENGTH = 44
DIFF_LEVELS = 20
.IFNDEF ALONE
.def ALONE = 1 ; standalone version
.ENDIF
.IFNDEF TARGET
.def TARGET = 800 ; 5200
.ENDIF
;---------------------------------------------------
; No internet
;---------------------------------------------------
OPT r+
swap_table=$0600 ; table for swap bytes in left characters :)
;---------------------------------------------------
; Zpage variables
.zpvar temp_w .word = $80
.zpvar temp_b .byte
.zpvar temp_b2 .byte
.zpvar DinoWalkPhase .byte
.zpvar DinoState .byte ; 0/1 - walk, 2/3 - crouch, 4... - jump
.zpvar JumpPhase .byte
.zpvar Hit .byte
.zpvar Level .byte
.zpvar PaddleState .byte
.zpvar play_flag .byte
.zpvar NTSCounter .byte
;---------------------------------------------------
icl 'lib/ATARISYS.ASM'
icl 'lib/MACRO.ASM'
;---------------------------------------------------
.IF ALONE =1
org $2000
PLAYER
icl 'music/playlzs16.asm' ; Music Player
ORG $3000
; dark screean and BASIC off
mva #0 dmactls ; dark screen
mva #$ff portb
; and wait one frame :)
waitRTC ; or waitRTC ?
mva #$ff portb ; BASIC off
rts
ini $3000
.else
PLAYER = $2000
INIT_SONG = PLAYER+3
org $e0
song_start_ptr .ds 2
song_end_ptr .ds 2
chn_copy .ds 9
chn_pos .ds 9
bptr .ds 2
cur_pos .ds 1
chn_bits .ds 1
bit_data .ds 1
.ENDIF
;---------------------------------------------------
org $3000
PMgraph
org PMGraph+$800 ; P/M graphics for clouds
;---------------------------------------------------
; display list
GameDL
:8 .byte SKIP8 ; empty lines
.byte MODE2+LMS ; gr.8+LMS
status_line_addr
.word status_line_r
:4 .byte SKIP8
.byte MODE2
.byte SKIP8,SKIP8,SKIP8 ; empty lines
.rept SCR_HEIGHT-1, #
.byte MODE2+LMS+SCH ; gr.0+LMS+HSCRL
line:1_addr
.word screen+$100*(#+1)
.endr
.byte JVB
.word GameDL
status_line_r
dta d" "
.byte $5d ; "N" letter
dta d"o internet! "
dta d" "
.byte $5e ; "L" letter
dta d"-"
.byte $7e,$7f ; "HI" letters
dta d" 00000 "
.byte $5f ; "R" letter
dta d"-"
.byte $7e,$7f ; "HI" letters
dta d" 00000 00000 "
status_line_l
dta d" !tenretni o"
.byte $5d ; "N" letter
dta d" "
dta d" 00000 00000 "
.byte $7f,$7e ; "IH" letters
dta d"-"
.byte $5f ; "R" letter
dta d" 00000 "
.byte $7f,$7e ; "IH" letters
dta d"-"
.byte $5e ; "L" letter
dta d" "
score=status_line_r+33+40
rhiscore=status_line_r+19+40
lhiscore=status_line_r+7+40
scorel=status_line_l+2+40
rhiscorel=status_line_l+16+40
lhiscorel=status_line_l+28+40
game_over_string
.byte $60 ; "G" letter
dta d" a m e "
.byte $7b ; "O" letter
dta d" v e r"
repeat_symbol
.byte $1c, $1e
.byte $7c, $7d
;---------------------------------------------------
; World table without dino
WorldTable
:WORLD_LENGTH+1 .byte 0 ; ground
;---------------------------------------------------
FirstSTART
mva #0 dmactls ; dark screen
mva #$ff portb
; and wait one frame :)
waitRTC ; or waitRTC ?
jsr Check2button ; reset JoyB2+ state
sta PaddleState
jsr ClearScreen
jsr GenerateCharsets
jsr GenerateClouds
jsr PrepareMusicPlayer
;AnyKey
jsr SetGameScreen
NewGame
jsr SetStatusToR
jsr SetStart
jsr WorldToScreen
mva #>font4 chbas
jsr FadeColorsIN
jsr PlayInGameMusic
jsr GameR
jsr GameOverR
jsr PlayGameOverMusic
AnyKey
jsr FadeColorsOUT
jsr HiScoreR
jsr SetStatusToL
jsr SetStart
jsr WorldToScreen
mva #>font4l chbas
jsr FadeColorsIN
jsr PlayInGameMusic
jsr GameL
jsr GameOverL
jsr PlayGameOverMusic
AnyKey
jsr FadeColorsOUT
jsr HiScoreL
jmp NewGame
rts
;-----------------------------------------------
.proc GameR
EndLoopR
;lda #$32
;sta COLBAK
jsr WorldToScreen
jsr ShowDino
lda Hit
bne EndGame
;lda #$5f
;sta COLBAK
jsr CheckJoy
mva #>font2 chbas
waitRTC ; or waitRTC ?
mva #3 hscrol
mva #>font3 chbas
waitRTC ; or waitRTC ?
mva #2 hscrol
jsr WorldShift ; better place (flickering)
jsr CloudsR
mva #>font4 chbas
waitRTC ; or waitRTC ?
mva #1 hscrol
jsr Animate
mva #>font1 chbas
waitRTC ; or waitRTC ?
mva #4 hscrol
jmp EndLoopR
EndGame
rts
.endp
;-----------------------------------------------
.proc GameL
EndLoopL
;lda #$32
;sta COLBAK
jsr WorldToScreenL
jsr ShowDinoL
lda Hit
bne EndGameL
;lda #$5f
;sta COLBAK
jsr CheckJoy
mva #>font2l chbas
waitRTC ; or waitRTC ?
mva #2 hscrol
mva #>font3l chbas
waitRTC ; or waitRTC ?
mva #3 hscrol
jsr WorldShift ; better place (flickering)
jsr CloudsL
mva #>font4l chbas
waitRTC ; or waitRTC ?
mva #4 hscrol
jsr Animate
mva #>font1l chbas
waitRTC ; or waitRTC ?
mva #1 hscrol
jmp EndLoopL
EndGameL
rts
.endp
;-----------------------------------------------
.proc GameOverR
; text
ldy #15
@ lda game_over_string,y
sta screen+$100+15,y
dey
bpl @-
; symbol
lda repeat_symbol
sta screen+$500+22
lda repeat_symbol+1
sta screen+$500+23
lda repeat_symbol+2
sta screen+$600+22
lda repeat_symbol+3
sta screen+$600+23
rts
.endp
;-----------------------------------------------
.proc GameOverL
; text
ldy #15
ldx #0
@ lda game_over_string,y
sta screen+$100+15,x
inx
dey
bpl @-
; symbol
lda repeat_symbol
sta screen+$500+23
lda repeat_symbol+1
sta screen+$500+22
lda repeat_symbol+2
sta screen+$600+23
lda repeat_symbol+3
sta screen+$600+22
rts
.endp
;-----------------------------------------------
; Generation of character sets 2,3 and 4 of 1
; By copying and horizontal shift dino
;-----------------------------------------------
.proc GenerateCharsets
; copy charset 1 to 2,3 and 4 (but not dino chars)
ldy #0
CopyLoop
; no dino characters
lda font1,y
sta font2,y
sta font3,y
sta font4,y
sta font1l,y
sta font2l,y
sta font3l,y
sta font4l,y
lda font1+$200,y
sta font2+$200,y
sta font3+$200,y
sta font4+$200,y
sta font1l+$200,y
sta font2l+$200,y
sta font3l+$200,y
sta font4l+$200,y
lda font1+$300,y
sta font2+$300,y
sta font3+$300,y
sta font4+$300,y
sta font1l+$300,y
sta font2l+$300,y
sta font3l+$300,y
sta font4l+$300,y
; swap bits to make 'left' charsets
lda font1+$100,y
sta font1l+$100,y
lda font2+$100,y
sta font2l+$100,y
lda font3+$100,y
sta font3l+$100,y
lda font4+$100,y
sta font4l+$100,y
iny
bne CopyLoop
; create table for swapping
ldy #0
@ sty temp_b
.REPT 8
rol temp_b
ror @
.ENDR
sta swap_table,y
iny
bne @-
; swap bits in bharacters
ldy #0
SwapLoop
lda font1+$100,y
tax
lda swap_table,x
sta font1l+$100,y
lda font2+$100,y
tax
lda swap_table,x
sta font2l+$100,y
lda font3+$100,y
tax
lda swap_table,x
sta font3l+$100,y
lda font4+$100,y
tax
lda swap_table,x
sta font4l+$100,y
lda font1,y
tax
lda swap_table,x
sta font1l,y
sta font2l,y
sta font3l,y
sta font4l,y
lda font1+$200,y
tax
lda swap_table,x
sta font1l+$200,y
sta font2l+$200,y
sta font3l+$200,y
sta font4l+$200,y
lda font1+$300,y
tax
lda swap_table,x
sta font1l+$300,y
sta font2l+$300,y
sta font3l+$300,y
sta font4l+$300,y
iny
bne SwapLoop
rts
.endp
;-----------------------------------------------
.proc GenerateClouds
; first clear PMgraphics memory
ldy #$00
tya
;hide PM
sta CloudHpos
sta CloudHpos+1
sta CloudHpos+2
sta CloudHpos+3
@ sta PMgraph+$300,y
sta PMgraph+$400,y
sta PMgraph+$500,y
sta PMgraph+$600,y
sta PMgraph+$700,y
iny
bne @-
; now make 4 clouds
ldy #7
@ lda font1+$2e0,y ; cloud symbol ($5c)
sta PMgraph+$400+$78,y
sta PMgraph+$700+$80,y
lda font1l+$2e0,y
sta PMgraph+$600+$78,y
sta PMgraph+$500+$80,y
dey
bpl @-
;hide PM
rts
.endp
;-----------------------------------------------
.proc ClearWorld
ldy #WORLD_LENGTH ; world size
lda #0 ; ground
@ sta WorldTable,y
dey
bpl @-
rts
.endp
;-----------------------------------------------
.proc ClearScreen
ldy #WORLD_LENGTH ; visible screen len
lda #0
ClearLoop
;sta screen+$0700,y
sta screen+$0600,y
sta screen+$0500,y
sta screen+$0400,y
sta screen+$0300,y
sta screen+$0200,y
sta screen+$0100,y
;sta screen+$0000,y
dey
bne ClearLoop
rts
.endp
;-----------------------------------------------
.proc WorldToScreen
jsr ClearScreen
ldx #0 ; start position
stx temp_b
ToScreenLoop
lda WorldTable,x
bmi NothingToDraw
tay
jsr ShowObject
NothingToDraw
inc:ldx temp_b
cpx #WORLD_LENGTH
bne ToScreenLoop
rts
.endp
;-----------------------------------------------
.proc WorldToScreenL
jsr ClearScreen
ldx #0 ; start position (world)
stx temp_b
lda #WORLD_LENGTH-1 ; start position (screen)
sta temp_b2
ToScreenLoop
lda WorldTable,x
bmi NothingToDraw
tay
ldx temp_b2
jsr ShowObjectL
NothingToDraw
inc:ldx temp_b
dec temp_b2
bpl ToScreenLoop
rts
.endp
;-----------------------------------------------
.proc WorldShift
jsr ScoreUp
ldy #0
Shift
lda WorldTable+1,y
sta WorldTable,y
iny
cpy #WORLD_LENGTH
bne Shift
lda #0 ;ground
sta WorldTable,y
; or sometimes mountain :)
lda WorldTable-1,y
bne no_mountain
lda RANDOM
and #%00111111 ; 64:1
bne no_mountain
lda #13
sta WorldTable-1,y
ora #$80
sta WorldTable,y
no_mountain
; now we can insert random object to world end
; check if there is enough of the gap between obstacles
; get the gap for the given difficulty level
ldx diff_level
lda #WORLD_LENGTH
sec
sbc diff_object_gap,x
tax
; is there a gap?
@
lda WorldTable,x
bne noInsert
inx
cpx #WORLD_LENGTH
bne @-
;all zeroes
insertObject
lda RANDOM
and #%00000001 ; insert 50/50
beq noInsert
lda diff_level
cmp #2
bcs AddBirds
NoBirds
randomize 8 12 ; cactuses
bne Drawn
AddBirds
randomize 7 10 ; bigger cactuses and birds
Drawn
cmp #7 ; if bird then select one shape from 3
bne NoBird
randomize 2 7
and #%11111110
NoBird
sta WorldTable+WORLD_LENGTH-2
ora #$80
sta WorldTable+WORLD_LENGTH-1
noInsert
rts
.endp
;-----------------------------------------------
.proc CloudsL
inc CloudHpos
inc CloudHpos+1
inc CloudHpos+2
inc CloudHpos+3
inc CloudHpos+2
inc CloudHpos+3
rts
.endp
;-----------------------------------------------
.proc CloudsR
dec CloudHpos
dec CloudHpos+1
dec CloudHpos+2
dec CloudHpos+3
dec CloudHpos+2
dec CloudHpos+3
rts
.endp
;-----------------------------------------------
.proc ScoreUp
inc score+4
lda score+4
cmp #"9"+1 ; 9+1 character code
bne ScoreReady
lda #"0" ; 0 character code
sta score+4
inc score+3
lda score+3
cmp #"9"+1 ; 9+1 character code
bne ScoreReady
lda #"0" ; 0 character code
sta score+3
; if score gets next 100 - level up
inc diff_level
lda diff_level
cmp #DIFF_LEVELS+1
bne @+
dec diff_level
@ inc score+2
lda score+2
cmp #"9"+1 ; 9+1 character code
bne ScoreReady
lda #"0" ; 0 character code
sta score+2
inc score+1
lda score+1
cmp #"9"+1 ; 9+1 character code
bne ScoreReady
lda #"0" ; 0 character code
sta score+1
inc score
ScoreReady
; move to second (left) score
ldy #4
ldx #0
@ lda score,x
sta scorel,y
inx
dey
bpl @-
rts
.endp
;-----------------------------------------------
.proc Animate
ldy #WORLD_LENGTH
@ lda WorldTable,y
tax
and #%01111111
beq NoBird
cmp #8 ; first cactus
bcs NoBird
; then animate bird
txa
eor #%0000001
sta WorldTable,y
NoBird
dey
bpl @-
; animate Dino
lda DinoWalkPhase
eor #%00000001
sta DinoWalkPhase
; jump
lda DinoState
cmp #4 ; jump state
bne NoJump
lda JumpPhase
cmp #JumpLen ; max jump phase
beq EndJump
inc JumpPhase
NoJump
; clouds
Clouds
ldy #3
@ lda CloudHpos,y
sta HPOSP0,y
dey
bpl @-
rts
EndJump
lda #0
sta JumpPhase
sta DinoState
beq NoJump
.endp
;---------------------------------------------------
.proc SetStatusToL
lda #<status_line_l
sta status_line_addr
lda #>status_line_l
sta status_line_addr+1
rts
.endp
;---------------------------------------------------
.proc SetStatusToR
lda #<status_line_r
sta status_line_addr
lda #>status_line_r
sta status_line_addr+1
rts
.endp
;-----------------------------------------------
; Show Object on screen
; X - y position
; Y - shape nr
;-----------------------------------------------
.proc ShowObject
lda ShapesTableL,y
sta temp_w
lda ShapesTableH,y
sta temp_w+1
ldy #0
ObjectLoop
lda (temp_w),y
smi:sta screen+$400,x
adw temp_w #2
lda (temp_w),y
smi:sta screen+$500,x
adw temp_w #2
lda (temp_w),y
smi:sta screen+$600,x
adw temp_w #2
lda (temp_w),y
smi:sta screen+$700,x
sbw temp_w #6
inx
iny
cpy #2 ; object width
bne ObjectLoop
rts
.endp
;-----------------------------------------------
; Show Object on screen (left)
; X - y position
; Y - shape nr
;-----------------------------------------------
.proc ShowObjectL
lda ShapesTableL,y
sta temp_w
lda ShapesTableH,y
sta temp_w+1
ldy #1 ; object widrh-1
ObjectLoop
lda (temp_w),y
smi:sta screen+$400,x
adw temp_w #2
lda (temp_w),y
smi:sta screen+$500,x
adw temp_w #2
lda (temp_w),y
smi:sta screen+$600,x
adw temp_w #2
lda (temp_w),y
smi:sta screen+$700,x
sbw temp_w #6
inx
dey
bpl ObjectLoop
rts
.endp
;-----------------------------------------------
; Show Dino on screen and check collisions
;-----------------------------------------------
.proc ShowDino
ldx #5 ; position
lda DinoState
ora DinoWalkPhase ; shape
tay
lda DinoShapesTableL,y
sta temp_w
lda DinoShapesTableH,y
sta temp_w+1
cpy #4 ; jump
beq Jump
cpy #5 ; jump
beq Jump
ldy #0
DinoLoop
lda (temp_w),y
bmi @+
lda screen+$500,x
beq NotHit0b
lda #$5b ; hit mark
sta Hit
bne Hit0b
NotHit0b
lda (temp_w),y
Hit0b
sta screen+$500,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$600,x
beq NotHit0c
lda #$5b ; hit mark
sta Hit
bne Hit0c
NotHit0c
lda (temp_w),y
Hit0c
sta screen+$600,x
@ adw temp_w #5
lda (temp_w),y
smi:sta screen+$700,x
sbw temp_w #10
inx
iny
cpy #5 ; dino width
bne DinoLoop
rts
Jump
ldy JumpPhase
lda DinoJumpTr,y
cmp #2
jeq jPhase2
cmp #3
jeq jPhase3
cmp #4
jeq jPhase4
jPhase1
ldy #0
DinoLoop1
lda (temp_w),y
bmi @+
lda screen+$400,x ; check obstacle
beq NotHit1a
lda #$5b ; make hit mark
sta Hit
bne Hit1a
NotHit1a
lda (temp_w),y
Hit1a
sta screen+$400,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$500,x ; check obstacle
beq NotHit1b
lda #$5b ; make hit mark
sta Hit
bne Hit1b
NotHit1b
lda (temp_w),y
Hit1b
sta screen+$500,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$600,x ; check obstacle
beq NotHit1c
lda #$5b ; make hit mark
sta Hit
bne Hit1c
NotHit1c
lda (temp_w),y
Hit1c
sta screen+$600,x
@ sbw temp_w #10
inx
iny
cpy #5 ; dino width
bne DinoLoop1
rts
jPhase2
ldy #0
DinoLoop2
lda (temp_w),y
smi:sta screen+$300,x
adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$400,x ; check obstacle
beq NotHit2a
lda #$5b ; make hit mark
sta Hit
bne Hit2a
NotHit2a
lda (temp_w),y
Hit2a
sta screen+$400,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$500,x ; check obstacle
beq NotHit2b
lda #$5b ; make hit mark
sta Hit
bne Hit2b
NotHit2b
lda (temp_w),y
Hit2b
sta screen+$500,x
@ sbw temp_w #10
inx
iny
cpy #5 ; dino width
bne DinoLoop2
rts
jPhase3
ldy #0
DinoLoop3
lda (temp_w),y
bmi @+
sta screen+$200,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
sta screen+$300,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$400,x ; check obstacle
beq NotHit3a
lda #$5b ; make hit mark
sta Hit
bne Hit3a
NotHit3a
lda (temp_w),y
Hit3a
sta screen+$400,x
@ sbw temp_w #10
inx
iny
cpy #5 ; dino width
bne DinoLoop3
rts
jPhase4
ldy #0
DinoLoop4
lda (temp_w),y
smi:sta screen+$100,x
adw temp_w #5
lda (temp_w),y
smi:sta screen+$200,x
adw temp_w #5
lda (temp_w),y
smi:sta screen+$300,x
sbw temp_w #10
inx
iny
cpy #5 ; dino width
bne DinoLoop4
rts
.endp
;-----------------------------------------------
; Show Dino (left) on screen and check collisions
;-----------------------------------------------
.proc ShowDinoL
ldx #36 ; position
lda DinoState
ora DinoWalkPhase ; shape
tay
lda DinoShapesTableL,y
sta temp_w
lda DinoShapesTableH,y
sta temp_w+1
cpy #4 ; jump
beq Jump
cpy #5 ; jump
beq Jump
ldy #4 ;dino width-1
DinoLoop
lda (temp_w),y
bmi @+
lda screen+$500,x
beq NotHit0b
lda #$5b ; hit mark
sta Hit
bne Hit0b
NotHit0b
lda (temp_w),y
Hit0b
sta screen+$500,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$600,x
beq NotHit0c
lda #$5b ; hit mark
sta Hit
bne Hit0c
NotHit0c
lda (temp_w),y
Hit0c
sta screen+$600,x
@ adw temp_w #5
lda (temp_w),y
smi:sta screen+$700,x
sbw temp_w #10
inx
dey
bpl DinoLoop
rts
Jump
ldy JumpPhase
lda DinoJumpTr,y
cmp #2
jeq jPhase2
cmp #3
jeq jPhase3
cmp #4
jeq jPhase4
jPhase1
ldy #4 ; dinowidth-1
DinoLoop1
lda (temp_w),y
bmi @+
lda screen+$400,x ; check obstacle
beq NotHit1a
lda #$5b ; make hit mark
sta Hit
bne Hit1a
NotHit1a
lda (temp_w),y
Hit1a
sta screen+$400,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$500,x ; check obstacle
beq NotHit1b
lda #$5b ; make hit mark
sta Hit
bne Hit1b
NotHit1b
lda (temp_w),y
Hit1b
sta screen+$500,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$600,x ; check obstacle
beq NotHit1c
lda #$5b ; make hit mark
sta Hit
bne Hit1c
NotHit1c
lda (temp_w),y
Hit1c
sta screen+$600,x
@ sbw temp_w #10
inx
dey
bpl DinoLoop1
rts
jPhase2
ldy #4 ; dino width-1
DinoLoop2
lda (temp_w),y
smi:sta screen+$300,x
adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$400,x ; check obstacle
beq NotHit2a
lda #$5b ; make hit mark
sta Hit
bne Hit2a
NotHit2a
lda (temp_w),y
Hit2a
sta screen+$400,x
@ adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$500,x ; check obstacle
beq NotHit2b
lda #$5b ; make hit mark
sta Hit
bne Hit2b
NotHit2b
lda (temp_w),y
Hit2b
sta screen+$500,x
@ sbw temp_w #10
inx
dey
bpl DinoLoop2
rts
jPhase3
ldy #4 ; dinowidth-1
DinoLoop3
lda (temp_w),y
smi:sta screen+$200,x
adw temp_w #5
lda (temp_w),y
smi:sta screen+$300,x
adw temp_w #5
lda (temp_w),y
bmi @+
lda screen+$400,x ; check obstacle
beq NotHit3a
lda #$5b ; make hit mark
sta Hit
bne Hit3a
NotHit3a
lda (temp_w),y
Hit3a
sta screen+$400,x
@ sbw temp_w #10
inx
dey
bpl DinoLoop3
rts
jPhase4
ldy #4 ; dino width-1
DinoLoop4
lda (temp_w),y
smi:sta screen+$100,x
adw temp_w #5
lda (temp_w),y
smi:sta screen+$200,x
adw temp_w #5
lda (temp_w),y
smi:sta screen+$300,x
sbw temp_w #10
inx
dey
bpl DinoLoop4
rts
.endp
;-----------------------------------------------
.proc CheckJoy
lda DinoState
cmp #4 ; jump state
beq NoChange
lda STICK0
and #%00000010 ; down
beq Down
lda STICK0
and #%00000001 ; up
beq Up
lda TRIG0 ; Fire = Up
beq Up
jsr Check2button ; 2nd button = down
bcc Down
; check keyboard
lda SKSTAT
cmp #$f7 ; SHIFT
beq Down
cmp #$ff
beq Walk
lda kbcode
cmp #@kbcode._space
beq Up
Walk
lda #0
sta DinoState
NoChange
rts
Up lda #4
sta DinoState
lda #0
sta JumpPhase
rts
Down
lda #2
sta DinoState
rts
.endp
;-----------------------------------------------
.proc SetStart
jsr ClearWorld
lda #0
sta DinoWalkPhase
sta DinoState
sta diff_level
sta Hit
; clear score
lda #"0"
ldx #4
@ sta score,x
sta scorel,x
dex
bpl @-
;randomize clouds
ldy #3
@ lda RANDOM
sta CloudHpos,y
dey
bpl @-
jsr Animate.Clouds
rts
.endp
;-----------------------------------------------
.proc HiScoreR
lda rhiscore
cmp score
bcc higher1
bne lower
lda rhiscore+1
cmp score+1
bcc higher2
bne lower
lda rhiscore+2
cmp score+2
bcc higher3
bne lower
lda rhiscore+3
cmp score+3
bcc higher4
bne lower
lda rhiscore+4
cmp score+4
bcc higher5
lower
rts
higher1
lda score
sta rhiscore
higher2
lda score+1
sta rhiscore+1
higher3
lda score+2
sta rhiscore+2
higher4
lda score+3
sta rhiscore+3
higher5
lda score+4
sta rhiscore+4
; move score to 'left' status line
ldy #4
ldx #0
@ lda rhiscore,x
sta rhiscorel,y
inx
dey
bpl @-
rts
.endp
;-----------------------------------------------
.proc HiScoreL
lda lhiscore
cmp score
bcc higher1
bne lower
lda lhiscore+1
cmp score+1
bcc higher2
bne lower
lda lhiscore+2
cmp score+2
bcc higher3
bne lower
lda lhiscore+3
cmp score+3
bcc higher4
bne lower
lda lhiscore+4
cmp score+4
bcc higher5
lower
rts
higher1
lda score
sta lhiscore
higher2
lda score+1
sta lhiscore+1
higher3
lda score+2
sta lhiscore+2
higher4
lda score+3
sta lhiscore+3
higher5
lda score+4
sta lhiscore+4
; move score to 'left' status line
ldy #4
ldx #0
@ lda lhiscore,x
sta lhiscorel,y
inx
dey
bpl @-
rts
.endp
;-----------------------------------------------
.proc FadeColorsIN
ldy #0
sty COLOR1
FadeColor
sty COLOR2
sty COLOR4
sty PCOLR0
sty PCOLR1
sty PCOLR2
sty PCOLR3
waitRTC
iny
cpy #$10
bne FadeColor
lda #$0c
sta PCOLR0
sta PCOLR1
sta PCOLR2
sta PCOLR3
rts
.endp
;-----------------------------------------------
.proc FadeColorsOUT
ldy #$0f
FadeColor
sty COLOR2
sty COLOR4
sty PCOLR0
sty PCOLR1
sty PCOLR2
sty PCOLR3
waitRTC
dey
bpl FadeColor
rts
.endp
;-----------------------------------------------
.proc SetGameScreen
mwa #GameDL dlptrs
lda #@dmactl(standard|dma|players|missiles|lineX1) ; normal screen width, DL on, P/M on
lda #%00111110
sta dmactls
mva #>font1 chbas
mva #>PMgraph PMBASE
lda #%00000010 ; P/M on
sta GRACTL
;lda #$0c
;sta PCOLR0
;sta PCOLR1
;sta PCOLR2
;sta PCOLR3
lda #0
sta HPOSP0
sta HPOSP1
sta HPOSP2
sta HPOSP3
rts
.endp
;-----------------------------------------------
.proc AnyKey
; wait for releasing keyz
@ lda CONSOL
cmp #7
bne @-
; check keyboard
@ lda SKSTAT
cmp #$f7 ; SHIFT
beq @-
cmp #$ff
bne @-
@ lda TRIG0
beq @-
; test for going further
@ lda CONSOL
cmp #7
bne pressed
; check keyboard
lda SKSTAT
cmp #$f7 ; SHIFT
beq pressed
cmp #$ff
bne pressed
lda TRIG0
beq pressed
jmp @-
pressed
; wait for releasing keyz
@ lda CONSOL
cmp #7
bne @-
; check keyboard
@ lda SKSTAT
cmp #$f7 ; SHIFT
beq @-
cmp #$ff
bne @-
@ lda TRIG0
beq @-
rts
.endp
;--------------------------------------------------
Check2button
lda PADDL0
and #$c0
eor #$C0
cmp PaddleState
rts
;--------------------------------------------------
.proc PrepareMusicPlayer
jsr StopMusic
VMAIN VBLinterrupt,7 ; jsr SetVBL
mva #0 NTSCounter
rts
.endp
.proc PlayInGameMusic
jsr StopMusic
mwa #MUSIC1_DATA song_start_ptr
mwa #MUSIC1_DATA_END song_end_ptr
jsr init_song
mva #1 play_flag
rts
.endp
.proc PlayGameOverMusic
jsr StopMusic
mwa #MUSIC2_DATA song_start_ptr
mwa #MUSIC2_DATA_END song_end_ptr
jsr init_song
mva #1 play_flag
rts
.endp
.proc StopMusic
mva #0 play_flag
rts
.endp
.proc VBLinterrupt
lda play_flag
beq NoMusic
; music - PAL/NTSC check
lda PAL
and #%00001110
beq IsPAL
; NTSC ...
inc NTSCounter
lda NTSCounter
cmp #5
bne PlayMusic
mva #0 NTSCounter
beq NoMusic
PlayMusic
IsPAL
jsr PLAYER
NoMusic
pla
tay
pla
tax
pla
rti
.endp
;--------------------------------------------------
icl 'artwork/shapes.asm'
;--------------------------------------------------
.ALIGN $400
; 4 charsets for fine scroll
font1
ins 'artwork/dino1.fnt' ; 1 charset
font2
.ds $100
ins 'artwork/dino2.fnt',+256,256 ; 2 charset
.ds $200
font3
.ds $100
ins 'artwork/dino3.fnt',+256,256 ; 3 charset
.ds $200
font4
.ds $100
ins 'artwork/dino4.fnt',+256,256 ; 4 charset
.ds $200
; and 4 charsets for left game :)
font1l
.ds $400
font2l
.ds $400
font3l
.ds $400
font4l
.ds $400
; screen data
; SCR_HEIGHT lines 256bytes each
screen
.ds $100*SCR_HEIGHT
.align $100
MUSIC1_DATA
ins 'music/InGame.lzss' ; ingame music
.ds 1
MUSIC1_DATA_END
.align $100
MUSIC2_DATA
ins 'music/GameOver.lzss' ; game over music
.ds 1
MUSIC2_DATA_END
run FirstSTART