mirror of
https://github.com/Pecusx/dino-game.git
synced 2026-05-21 06:39:38 +02:00
507 lines
9.6 KiB
NASM
507 lines
9.6 KiB
NASM
SCR_HEIGHT = 8
|
|
WORLD_LENGTH = 64
|
|
DIFF_LEVELS = 16
|
|
|
|
; No internet
|
|
;---------------------------------------------------
|
|
OPT r+
|
|
|
|
;---------------------------------------------------
|
|
; Zpage variables
|
|
.zpvar temp_w .word = $80
|
|
.zpvar temp_b .byte
|
|
.zpvar DinoWalkPhase .byte
|
|
.zpvar DinoState .byte ; 0/1 - walk, 2/3 - crouch, 4... - jump
|
|
.zpvar JumpPhase .byte
|
|
;---------------------------------------------------
|
|
icl 'lib/ATARISYS.ASM'
|
|
icl 'lib/MACRO.ASM'
|
|
;---------------------------------------------------
|
|
; dark screean and BASIC off
|
|
ORG $2000
|
|
mva #0 dmactls ; dark screen
|
|
mva #$ff portb
|
|
; and wait one frame :)
|
|
seq:wait ; or waitRTC ?
|
|
mva #$ff portb ; BASIC off
|
|
rts
|
|
ini $2000
|
|
;---------------------------------------------------
|
|
|
|
org $2000
|
|
;---------------------------------------------------
|
|
; 4 charsets for fine scroll
|
|
font1
|
|
ins 'artwork/dino1.fnt' ; 1 charset
|
|
font2 = font1+$400
|
|
ins 'artwork/dino2.fnt' ; 2 charset
|
|
font3 = font2+$400
|
|
ins 'artwork/dino3.fnt' ; 3 charset
|
|
font4 = font3+$400
|
|
ins 'artwork/dino4.fnt' ; 4 charset
|
|
org font4+$400
|
|
; screen data
|
|
; SCR_HEIGHT lines 256bytes each
|
|
screen
|
|
.ds $100*SCR_HEIGHT
|
|
; display list
|
|
GameDL
|
|
:10 .byte SKIP8 ; empty lines
|
|
|
|
.rept SCR_HEIGHT, #
|
|
.byte MODE2+LMS+SCH ; gr.0+LMS+HSCRL
|
|
line:1_addr
|
|
.word screen+$100*#
|
|
.endr
|
|
.byte JVB
|
|
.word GameDL
|
|
;---------------------------------------------------
|
|
; World table without dino
|
|
WorldTable
|
|
:WORLD_LENGTH .byte 0 ; ground
|
|
;---------------------------------------------------
|
|
FirstSTART
|
|
jsr GenerateCharsets
|
|
jsr SetStart
|
|
jsr SetGameScreen
|
|
mva #0 diff_level
|
|
|
|
; test only (some object in the world)
|
|
lda #1 ;bird0
|
|
sta WorldTable+10
|
|
lda #4 ;cactus
|
|
sta WorldTable+20
|
|
lda #4+$80 ; cactus (second char)
|
|
sta WorldTable+21
|
|
;
|
|
ldx #5 ; position
|
|
ldy #0 ; shape
|
|
jsr ShowDino
|
|
ldx #10 ; position
|
|
ldy #1 ; shape
|
|
jsr ShowDino
|
|
ldx #15 ; position
|
|
ldy #2 ; shape
|
|
jsr ShowDino
|
|
ldx #20 ; position
|
|
ldy #3 ; shape
|
|
jsr ShowDino
|
|
ldx #25 ; position
|
|
ldy #4 ; shape
|
|
jsr ShowDino
|
|
mva #$50 screen+$700+32
|
|
EndLoop
|
|
jsr WorldShift
|
|
jsr WorldToScreen
|
|
jsr ShowDino
|
|
jsr CheckJoy
|
|
;waitRTC ; or waitRTC ?
|
|
;key
|
|
mva #>font2 chbas
|
|
waitRTC ; or waitRTC ?
|
|
mva #3 hscrol
|
|
;waitRTC ; or waitRTC ?
|
|
;key
|
|
mva #>font3 chbas
|
|
waitRTC ; or waitRTC ?
|
|
mva #2 hscrol
|
|
;waitRTC ; or waitRTC ?
|
|
;key
|
|
mva #>font4 chbas
|
|
waitRTC ; or waitRTC ?
|
|
mva #1 hscrol
|
|
;waitRTC ; or waitRTC ?
|
|
;key
|
|
jsr Animate
|
|
mva #>font1 chbas
|
|
waitRTC ; or waitRTC ?
|
|
mva #4 hscrol
|
|
jmp EndLoop
|
|
halt
|
|
rts
|
|
|
|
;-----------------------------------------------
|
|
; 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
|
|
lda font1,y
|
|
sta font2,y
|
|
sta font3,y
|
|
sta font4,y
|
|
lda font1+$200,y
|
|
sta font2+$200,y
|
|
sta font3+$200,y
|
|
sta font4+$200,y
|
|
lda font1+$300,y
|
|
sta font2+$300,y
|
|
sta font3+$300,y
|
|
sta font4+$300,y
|
|
iny
|
|
bne CopyLoop
|
|
|
|
rts
|
|
.endp
|
|
;-----------------------------------------------
|
|
.proc ClearWorld
|
|
ldy #WORLD_LENGTH-1 ; world size
|
|
lda #0 ; ground
|
|
@ sta WorldTable,y
|
|
dey
|
|
bpl @-
|
|
rts
|
|
.endp
|
|
.proc ClearScreen
|
|
ldy #WORLD_LENGTH ; TODO: shouldn't be -1?
|
|
lda #0
|
|
ClearLoop
|
|
sta screen+$700,y
|
|
sta screen+$600,y
|
|
sta screen+$500,y
|
|
sta screen+$400,y
|
|
sta screen+$300,y
|
|
dey
|
|
bpl 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 temp_b
|
|
ldx temp_b
|
|
cpx #WORLD_LENGTH
|
|
bne ToScreenLoop
|
|
rts
|
|
.endp
|
|
;-----------------------------------------------
|
|
.proc WorldShift
|
|
ldy #0
|
|
Shift
|
|
lda WorldTable+1,y
|
|
sta WorldTable,y
|
|
iny
|
|
cpy #WORLD_LENGTH-1
|
|
bne Shift
|
|
lda #0 ;ground
|
|
sta WorldTable,y
|
|
; 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
|
|
randomize 8 13 ; cactuses and hole
|
|
sta WorldTable+WORLD_LENGTH-2
|
|
ora #$80
|
|
sta WorldTable+WORLD_LENGTH-1
|
|
inc diff_level
|
|
|
|
|
|
|
|
noInsert
|
|
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
|
|
rts
|
|
EndJump
|
|
lda #0
|
|
sta JumpPhase
|
|
sta DinoState
|
|
NoJump
|
|
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
|
|
bmi @+
|
|
sta screen+$400,x
|
|
@ adw temp_w #2
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$500,x
|
|
@ adw temp_w #2
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$600,x
|
|
@ adw temp_w #2
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$700,x
|
|
@ sbw temp_w #6
|
|
inx
|
|
iny
|
|
cpy #2 ; object width
|
|
bne ObjectLoop
|
|
rts
|
|
.endp
|
|
;-----------------------------------------------
|
|
; Show Dino on screen (test)
|
|
;-----------------------------------------------
|
|
.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 @+
|
|
sta screen+$400,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$500,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$600,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$700,x
|
|
@ sbw temp_w #15
|
|
inx
|
|
iny
|
|
cpy #5 ; dino width
|
|
bne DinoLoop
|
|
rts
|
|
Jump
|
|
ldy JumpPhase
|
|
lda DinoJumpTr,y
|
|
cmp #2
|
|
beq jPhase2
|
|
cmp #3
|
|
jeq jPhase3
|
|
cmp #4
|
|
jeq jPhase4
|
|
jPhase1
|
|
ldy #0
|
|
DinoLoop1
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$300,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$400,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$500,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$600,x
|
|
@ sbw temp_w #15
|
|
inx
|
|
iny
|
|
cpy #5 ; dino width
|
|
bne DinoLoop1
|
|
rts
|
|
jPhase2
|
|
ldy #0
|
|
DinoLoop2
|
|
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 @+
|
|
sta screen+$400,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$500,x
|
|
@ sbw temp_w #15
|
|
inx
|
|
iny
|
|
cpy #5 ; dino width
|
|
bne DinoLoop2
|
|
rts
|
|
jPhase3
|
|
ldy #0
|
|
DinoLoop3
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$100,x
|
|
@ adw temp_w #5
|
|
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 @+
|
|
sta screen+$400,x
|
|
@ sbw temp_w #15
|
|
inx
|
|
iny
|
|
cpy #5 ; dino width
|
|
bne DinoLoop3
|
|
rts
|
|
jPhase4
|
|
ldy #0
|
|
DinoLoop4
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$100,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$200,x
|
|
@ adw temp_w #5
|
|
lda (temp_w),y
|
|
bmi @+
|
|
sta screen+$300,x
|
|
@ sbw temp_w #15
|
|
inx
|
|
iny
|
|
cpy #5 ; dino width
|
|
bne 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
|
|
; no change state (temporary set to 0)
|
|
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
|
|
lda #0
|
|
sta DinoState
|
|
sta COLOR1
|
|
ldy #0
|
|
FadeColor
|
|
sty COLOR2
|
|
sty COLOR4
|
|
waitRTC
|
|
iny
|
|
cpy #$10
|
|
bne FadeColor
|
|
lda #$0f
|
|
sta COLOR2
|
|
sta COLOR4
|
|
rts
|
|
.endp
|
|
;-----------------------------------------------
|
|
.proc SetGameScreen
|
|
mwa #GameDL dlptrs
|
|
lda #%00111110 ; normal screen width, DL on, P/M on
|
|
sta dmactls
|
|
mva #>font1 chbas
|
|
rts
|
|
.endp
|
|
;--------------------------------------------------
|
|
icl 'artwork/shapes.asm'
|
|
;--------------------------------------------------
|
|
|
|
run FirstSTART
|