colourgo/colourgo/game.s
2017-07-19 20:06:10 -05:00

610 lines
16 KiB
ArmAsm

;
; main.s
; colourgo
;
; Created by Jeremy Rand on 2017-07-19.
; Copyright © 2017 Jeremy Rand. All rights reserved.
;
.export _game
.import _vblWait
.include "apple2.inc"
COUT = $fded
KEYBOARD = $c000
STROBE = $c010
MAXY=191
MAXXBYTE=40
MAXX=280
ZPADDR0=<$80
ZPADDR1=<$82
ZPADDR2=<$84
ZPADDR3=<$86
ZPADDR4=<$88
ZPADDR5=<$8a
COL_BLACK=0
COL_VIOLET=1
COL_GREEN=2
COL_WHITE=3
CHAR_HEIGHT=10
NUM_CHAR_POS=3
JUMP_SPEED=5
GRAVITY=1
GRID_YPOS=150
LINE0 = $2000
LINE1 = LINE0 + 1024
LINE2 = LINE1 + 1024
LINE3 = LINE2 + 1024
LINE4 = LINE3 + 1024
LINE5 = LINE4 + 1024
LINE6 = LINE5 + 1024
LINE7 = LINE6 + 1024
LINE8 = LINE0 + 128
LINE9 = LINE8 + 1024
LINE10 = LINE9 + 1024
LINE11 = LINE10 + 1024
LINE12 = LINE11 + 1024
LINE13 = LINE12 + 1024
LINE14 = LINE13 + 1024
LINE15 = LINE14 + 1024
LINE16 = LINE8 + 128
LINE17 = LINE16 + 1024
LINE18 = LINE17 + 1024
LINE19 = LINE18 + 1024
LINE20 = LINE19 + 1024
LINE21 = LINE20 + 1024
LINE22 = LINE21 + 1024
LINE23 = LINE22 + 1024
LINE24 = LINE16 + 128
LINE25 = LINE24 + 1024
LINE26 = LINE25 + 1024
LINE27 = LINE26 + 1024
LINE28 = LINE27 + 1024
LINE29 = LINE28 + 1024
LINE30 = LINE29 + 1024
LINE31 = LINE30 + 1024
LINE32 = LINE24 + 128
LINE33 = LINE32 + 1024
LINE34 = LINE33 + 1024
LINE35 = LINE34 + 1024
LINE36 = LINE35 + 1024
LINE37 = LINE36 + 1024
LINE38 = LINE37 + 1024
LINE39 = LINE38 + 1024
LINE40 = LINE32 + 128
LINE41 = LINE40 + 1024
LINE42 = LINE41 + 1024
LINE43 = LINE42 + 1024
LINE44 = LINE43 + 1024
LINE45 = LINE44 + 1024
LINE46 = LINE45 + 1024
LINE47 = LINE46 + 1024
LINE48 = LINE40 + 128
LINE49 = LINE48 + 1024
LINE50 = LINE49 + 1024
LINE51 = LINE50 + 1024
LINE52 = LINE51 + 1024
LINE53 = LINE52 + 1024
LINE54 = LINE53 + 1024
LINE55 = LINE54 + 1024
LINE56 = LINE48 + 128
LINE57 = LINE56 + 1024
LINE58 = LINE57 + 1024
LINE59 = LINE58 + 1024
LINE60 = LINE59 + 1024
LINE61 = LINE60 + 1024
LINE62 = LINE61 + 1024
LINE63 = LINE62 + 1024
LINE64 = LINE0 + 40
LINE65 = LINE64 + 1024
LINE66 = LINE65 + 1024
LINE67 = LINE66 + 1024
LINE68 = LINE67 + 1024
LINE69 = LINE68 + 1024
LINE70 = LINE69 + 1024
LINE71 = LINE70 + 1024
LINE72 = LINE64 + 128
LINE73 = LINE72 + 1024
LINE74 = LINE73 + 1024
LINE75 = LINE74 + 1024
LINE76 = LINE75 + 1024
LINE77 = LINE76 + 1024
LINE78 = LINE77 + 1024
LINE79 = LINE78 + 1024
LINE80 = LINE72 + 128
LINE81 = LINE80 + 1024
LINE82 = LINE81 + 1024
LINE83 = LINE82 + 1024
LINE84 = LINE83 + 1024
LINE85 = LINE84 + 1024
LINE86 = LINE85 + 1024
LINE87 = LINE86 + 1024
LINE88 = LINE80 + 128
LINE89 = LINE88 + 1024
LINE90 = LINE89 + 1024
LINE91 = LINE90 + 1024
LINE92 = LINE91 + 1024
LINE93 = LINE92 + 1024
LINE94 = LINE93 + 1024
LINE95 = LINE94 + 1024
LINE96 = LINE88 + 128
LINE97 = LINE96 + 1024
LINE98 = LINE97 + 1024
LINE99 = LINE98 + 1024
LINE100 = LINE99 + 1024
LINE101 = LINE100 + 1024
LINE102 = LINE101 + 1024
LINE103 = LINE102 + 1024
LINE104 = LINE96 + 128
LINE105 = LINE104 + 1024
LINE106 = LINE105 + 1024
LINE107 = LINE106 + 1024
LINE108 = LINE107 + 1024
LINE109 = LINE108 + 1024
LINE110 = LINE109 + 1024
LINE111 = LINE110 + 1024
LINE112 = LINE104 + 128
LINE113 = LINE112 + 1024
LINE114 = LINE113 + 1024
LINE115 = LINE114 + 1024
LINE116 = LINE115 + 1024
LINE117 = LINE116 + 1024
LINE118 = LINE117 + 1024
LINE119 = LINE118 + 1024
LINE120 = LINE112 + 128
LINE121 = LINE120 + 1024
LINE122 = LINE121 + 1024
LINE123 = LINE122 + 1024
LINE124 = LINE123 + 1024
LINE125 = LINE124 + 1024
LINE126 = LINE125 + 1024
LINE127 = LINE126 + 1024
LINE128 = LINE64 + 40
LINE129 = LINE128 + 1024
LINE130 = LINE129 + 1024
LINE131 = LINE130 + 1024
LINE132 = LINE131 + 1024
LINE133 = LINE132 + 1024
LINE134 = LINE133 + 1024
LINE135 = LINE134 + 1024
LINE136 = LINE128 + 128
LINE137 = LINE136 + 1024
LINE138 = LINE137 + 1024
LINE139 = LINE138 + 1024
LINE140 = LINE139 + 1024
LINE141 = LINE140 + 1024
LINE142 = LINE141 + 1024
LINE143 = LINE142 + 1024
LINE144 = LINE136 + 128
LINE145 = LINE144 + 1024
LINE146 = LINE145 + 1024
LINE147 = LINE146 + 1024
LINE148 = LINE147 + 1024
LINE149 = LINE148 + 1024
LINE150 = LINE149 + 1024
LINE151 = LINE150 + 1024
LINE152 = LINE144 + 128
LINE153 = LINE152 + 1024
LINE154 = LINE153 + 1024
LINE155 = LINE154 + 1024
LINE156 = LINE155 + 1024
LINE157 = LINE156 + 1024
LINE158 = LINE157 + 1024
LINE159 = LINE158 + 1024
LINE160 = LINE152 + 128
LINE161 = LINE160 + 1024
LINE162 = LINE161 + 1024
LINE163 = LINE162 + 1024
LINE164 = LINE163 + 1024
LINE165 = LINE164 + 1024
LINE166 = LINE165 + 1024
LINE167 = LINE166 + 1024
LINE168 = LINE160 + 128
LINE169 = LINE168 + 1024
LINE170 = LINE169 + 1024
LINE171 = LINE170 + 1024
LINE172 = LINE171 + 1024
LINE173 = LINE172 + 1024
LINE174 = LINE173 + 1024
LINE175 = LINE174 + 1024
LINE176 = LINE168 + 128
LINE177 = LINE176 + 1024
LINE178 = LINE177 + 1024
LINE179 = LINE178 + 1024
LINE180 = LINE179 + 1024
LINE181 = LINE180 + 1024
LINE182 = LINE181 + 1024
LINE183 = LINE182 + 1024
LINE184 = LINE176 + 128
LINE185 = LINE184 + 1024
LINE186 = LINE185 + 1024
LINE187 = LINE186 + 1024
LINE188 = LINE187 + 1024
LINE189 = LINE188 + 1024
LINE190 = LINE189 + 1024
LINE191 = LINE190 + 1024
.CODE
.proc _game
; Set up hires screen
jsr clearScreen
@L1:
jsr _vblWait
jsr drawCharacter
jsr drawGrid
jsr updateCharacter
jsr updateGrid
lda KEYBOARD
bpl @L1
lda STROBE
inc gridColour
lda gridColour
and #COL_WHITE
sta gridColour
sta characterColour
jmp @L1
lda TXTSET
rts
.endproc
.proc updateCharacter
ldx characterPos
inx
cpx #NUM_CHAR_POS
bne @L1
ldx #0
@L1:
stx characterPos
rts
.endproc
.proc drawCharacter
ldx characterColour
lda colourEvenLookup,x
sta evenVal
lda colourOddLookup,x
sta oddVal
ldx characterPos
lda characterPosLo,x
sta ZPADDR1
lda characterPosHi,x
sta ZPADDR1+1
ldy characterY
ldx #0
@L1:
lda loAddrs,y
sta ZPADDR0
lda page1HiAddrs,y
sta ZPADDR0+1
sty yPos
ldy #2
lda evenVal
and (ZPADDR1,x)
sta (ZPADDR0),y
inc ZPADDR1
ldy #3
lda oddVal
and (ZPADDR1,x)
sta (ZPADDR0),y
inc ZPADDR1
ldy yPos
iny
cpy characterYBottom
bne @L1
rts
; Locals
evenVal: .BYTE $00
oddVal: .BYTE $00
yPos: .BYTE $00
.endproc
.proc updateGrid
ldx gridXPos
inx
cpx #7
bne @L1
ldx #0
@L1:
stx gridXPos
rts
.endproc
.proc drawGrid
ldy gridY
lda loAddrs,y
sta ZPADDR0
lda page1HiAddrs,y
sta ZPADDR0+1
iny
lda loAddrs,y
sta ZPADDR1
lda page1HiAddrs,y
sta ZPADDR1+1
iny
lda loAddrs,y
sta ZPADDR2
lda page1HiAddrs,y
sta ZPADDR2+1
iny
lda loAddrs,y
sta ZPADDR3
lda page1HiAddrs,y
sta ZPADDR3+1
iny
lda loAddrs,y
sta ZPADDR4
lda page1HiAddrs,y
sta ZPADDR4+1
iny
lda loAddrs,y
sta ZPADDR5
lda page1HiAddrs,y
sta ZPADDR5+1
ldx gridXPos
ldy gridColour
lda colourEvenLookup,y
sta evenVal
and evenGrid,x
sta evenGridVal
lda colourOddLookup,y
sta oddVal
and oddGrid,x
sta oddGridVal
ldy #0
@L1:
lda evenVal
sta (ZPADDR0),y
sta (ZPADDR5),y
lda evenGridVal
sta (ZPADDR1),y
sta (ZPADDR2),y
sta (ZPADDR3),y
sta (ZPADDR4),y
iny
lda oddVal
sta (ZPADDR0),y
sta (ZPADDR5),y
lda oddGridVal
sta (ZPADDR1),y
sta (ZPADDR2),y
sta (ZPADDR3),y
sta (ZPADDR4),y
iny
cpy #MAXXBYTE
bne @L1
rts
; Locals
evenVal: .BYTE $00
oddVal: .BYTE $00
evenGridVal: .BYTE $00
oddGridVal: .BYTE $00
.endproc
.proc clearScreen
ldx #0
ldy #0
@L1:
lda loAddrs,x
sta ZPADDR0
lda page1HiAddrs,x
sta ZPADDR0+1
lda #$0
@L2:
sta (ZPADDR0),y
iny
cpy #MAXXBYTE
bne @L2
inx
cpx #MAXY
bne @L1
lda TXTCLR
lda MIXCLR
lda HIRES
lda LOWSCR
rts
.endproc
.DATA
loAddrs:
.LOBYTES LINE0, LINE1, LINE2, LINE3, LINE4, LINE5, LINE6, LINE7
.LOBYTES LINE8, LINE9, LINE10, LINE11, LINE12, LINE13, LINE14, LINE15
.LOBYTES LINE16, LINE17, LINE18, LINE19, LINE20, LINE21, LINE22, LINE23
.LOBYTES LINE24, LINE25, LINE26, LINE27, LINE28, LINE29, LINE30, LINE31
.LOBYTES LINE32, LINE33, LINE34, LINE35, LINE36, LINE37, LINE38, LINE39
.LOBYTES LINE40, LINE41, LINE42, LINE43, LINE44, LINE45, LINE46, LINE47
.LOBYTES LINE48, LINE49, LINE50, LINE51, LINE52, LINE53, LINE54, LINE55
.LOBYTES LINE56, LINE57, LINE58, LINE59, LINE60, LINE61, LINE62, LINE63
.LOBYTES LINE64, LINE65, LINE66, LINE67, LINE68, LINE69, LINE70, LINE71
.LOBYTES LINE72, LINE73, LINE74, LINE75, LINE76, LINE77, LINE78, LINE79
.LOBYTES LINE80, LINE81, LINE82, LINE83, LINE84, LINE85, LINE86, LINE87
.LOBYTES LINE88, LINE89, LINE90, LINE91, LINE92, LINE93, LINE94, LINE95
.LOBYTES LINE96, LINE97, LINE98, LINE99, LINE100, LINE101, LINE102, LINE103
.LOBYTES LINE104, LINE105, LINE106, LINE107, LINE108, LINE109, LINE110, LINE111
.LOBYTES LINE112, LINE113, LINE114, LINE115, LINE116, LINE117, LINE118, LINE119
.LOBYTES LINE120, LINE121, LINE122, LINE123, LINE124, LINE125, LINE126, LINE127
.LOBYTES LINE128, LINE129, LINE130, LINE131, LINE132, LINE133, LINE134, LINE135
.LOBYTES LINE136, LINE137, LINE138, LINE139, LINE140, LINE141, LINE142, LINE143
.LOBYTES LINE144, LINE145, LINE146, LINE147, LINE148, LINE149, LINE150, LINE151
.LOBYTES LINE152, LINE153, LINE154, LINE155, LINE156, LINE157, LINE158, LINE159
.LOBYTES LINE160, LINE161, LINE162, LINE163, LINE164, LINE165, LINE166, LINE167
.LOBYTES LINE168, LINE169, LINE170, LINE171, LINE172, LINE173, LINE174, LINE175
.LOBYTES LINE176, LINE177, LINE178, LINE179, LINE180, LINE181, LINE182, LINE183
.LOBYTES LINE184, LINE185, LINE186, LINE187, LINE188, LINE189, LINE190, LINE191
page1HiAddrs:
.HIBYTES LINE0, LINE1, LINE2, LINE3, LINE4, LINE5, LINE6, LINE7
.HIBYTES LINE8, LINE9, LINE10, LINE11, LINE12, LINE13, LINE14, LINE15
.HIBYTES LINE16, LINE17, LINE18, LINE19, LINE20, LINE21, LINE22, LINE23
.HIBYTES LINE24, LINE25, LINE26, LINE27, LINE28, LINE29, LINE30, LINE31
.HIBYTES LINE32, LINE33, LINE34, LINE35, LINE36, LINE37, LINE38, LINE39
.HIBYTES LINE40, LINE41, LINE42, LINE43, LINE44, LINE45, LINE46, LINE47
.HIBYTES LINE48, LINE49, LINE50, LINE51, LINE52, LINE53, LINE54, LINE55
.HIBYTES LINE56, LINE57, LINE58, LINE59, LINE60, LINE61, LINE62, LINE63
.HIBYTES LINE64, LINE65, LINE66, LINE67, LINE68, LINE69, LINE70, LINE71
.HIBYTES LINE72, LINE73, LINE74, LINE75, LINE76, LINE77, LINE78, LINE79
.HIBYTES LINE80, LINE81, LINE82, LINE83, LINE84, LINE85, LINE86, LINE87
.HIBYTES LINE88, LINE89, LINE90, LINE91, LINE92, LINE93, LINE94, LINE95
.HIBYTES LINE96, LINE97, LINE98, LINE99, LINE100, LINE101, LINE102, LINE103
.HIBYTES LINE104, LINE105, LINE106, LINE107, LINE108, LINE109, LINE110, LINE111
.HIBYTES LINE112, LINE113, LINE114, LINE115, LINE116, LINE117, LINE118, LINE119
.HIBYTES LINE120, LINE121, LINE122, LINE123, LINE124, LINE125, LINE126, LINE127
.HIBYTES LINE128, LINE129, LINE130, LINE131, LINE132, LINE133, LINE134, LINE135
.HIBYTES LINE136, LINE137, LINE138, LINE139, LINE140, LINE141, LINE142, LINE143
.HIBYTES LINE144, LINE145, LINE146, LINE147, LINE148, LINE149, LINE150, LINE151
.HIBYTES LINE152, LINE153, LINE154, LINE155, LINE156, LINE157, LINE158, LINE159
.HIBYTES LINE160, LINE161, LINE162, LINE163, LINE164, LINE165, LINE166, LINE167
.HIBYTES LINE168, LINE169, LINE170, LINE171, LINE172, LINE173, LINE174, LINE175
.HIBYTES LINE176, LINE177, LINE178, LINE179, LINE180, LINE181, LINE182, LINE183
.HIBYTES LINE184, LINE185, LINE186, LINE187, LINE188, LINE189, LINE190, LINE191
page2HiAddrs:
.HIBYTES LINE0+$2000, LINE1+$2000, LINE2+$2000, LINE3+$2000, LINE4+$2000, LINE5+$2000, LINE6+$2000, LINE7+$2000
.HIBYTES LINE8+$2000, LINE9+$2000, LINE10+$2000, LINE11+$2000, LINE12+$2000, LINE13+$2000, LINE14+$2000, LINE15+$2000
.HIBYTES LINE16+$2000, LINE17+$2000, LINE18+$2000, LINE19+$2000, LINE20+$2000, LINE21+$2000, LINE22+$2000, LINE23+$2000
.HIBYTES LINE24+$2000, LINE25+$2000, LINE26+$2000, LINE27+$2000, LINE28+$2000, LINE29+$2000, LINE30+$2000, LINE31+$2000
.HIBYTES LINE32+$2000, LINE33+$2000, LINE34+$2000, LINE35+$2000, LINE36+$2000, LINE37+$2000, LINE38+$2000, LINE39+$2000
.HIBYTES LINE40+$2000, LINE41+$2000, LINE42+$2000, LINE43+$2000, LINE44+$2000, LINE45+$2000, LINE46+$2000, LINE47+$2000
.HIBYTES LINE48+$2000, LINE49+$2000, LINE50+$2000, LINE51+$2000, LINE52+$2000, LINE53+$2000, LINE54+$2000, LINE55+$2000
.HIBYTES LINE56+$2000, LINE57+$2000, LINE58+$2000, LINE59+$2000, LINE60+$2000, LINE61+$2000, LINE62+$2000, LINE63+$2000
.HIBYTES LINE64+$2000, LINE65+$2000, LINE66+$2000, LINE67+$2000, LINE68+$2000, LINE69+$2000, LINE70+$2000, LINE71+$2000
.HIBYTES LINE72+$2000, LINE73+$2000, LINE74+$2000, LINE75+$2000, LINE76+$2000, LINE77+$2000, LINE78+$2000, LINE79+$2000
.HIBYTES LINE80+$2000, LINE81+$2000, LINE82+$2000, LINE83+$2000, LINE84+$2000, LINE85+$2000, LINE86+$2000, LINE87+$2000
.HIBYTES LINE88+$2000, LINE89+$2000, LINE90+$2000, LINE91+$2000, LINE92+$2000, LINE93+$2000, LINE94+$2000, LINE95+$2000
.HIBYTES LINE96+$2000, LINE97+$2000, LINE98+$2000, LINE99+$2000, LINE100+$2000, LINE101+$2000, LINE102+$2000, LINE103+$2000
.HIBYTES LINE104+$2000, LINE105+$2000, LINE106+$2000, LINE107+$2000, LINE108+$2000, LINE109+$2000, LINE110+$2000, LINE111+$2000
.HIBYTES LINE112+$2000, LINE113+$2000, LINE114+$2000, LINE115+$2000, LINE116+$2000, LINE117+$2000, LINE118+$2000, LINE119+$2000
.HIBYTES LINE120+$2000, LINE121+$2000, LINE122+$2000, LINE123+$2000, LINE124+$2000, LINE125+$2000, LINE126+$2000, LINE127+$2000
.HIBYTES LINE128+$2000, LINE129+$2000, LINE130+$2000, LINE131+$2000, LINE132+$2000, LINE133+$2000, LINE134+$2000, LINE135+$2000
.HIBYTES LINE136+$2000, LINE137+$2000, LINE138+$2000, LINE139+$2000, LINE140+$2000, LINE141+$2000, LINE142+$2000, LINE143+$2000
.HIBYTES LINE144+$2000, LINE145+$2000, LINE146+$2000, LINE147+$2000, LINE148+$2000, LINE149+$2000, LINE150+$2000, LINE151+$2000
.HIBYTES LINE152+$2000, LINE153+$2000, LINE154+$2000, LINE155+$2000, LINE156+$2000, LINE157+$2000, LINE158+$2000, LINE159+$2000
.HIBYTES LINE160+$2000, LINE161+$2000, LINE162+$2000, LINE163+$2000, LINE164+$2000, LINE165+$2000, LINE166+$2000, LINE167+$2000
.HIBYTES LINE168+$2000, LINE169+$2000, LINE170+$2000, LINE171+$2000, LINE172+$2000, LINE173+$2000, LINE174+$2000, LINE175+$2000
.HIBYTES LINE176+$2000, LINE177+$2000, LINE178+$2000, LINE179+$2000, LINE180+$2000, LINE181+$2000, LINE182+$2000, LINE183+$2000
.HIBYTES LINE184+$2000, LINE185+$2000, LINE186+$2000, LINE187+$2000, LINE188+$2000, LINE189+$2000, LINE190+$2000, LINE191+$2000
colourEvenLookup:
.BYTE $00, $55, $2a, $ff
colourOddLookup:
.BYTE $00, $2a, $55, $ff
evenGrid:
.BYTE $00, $00, $00, $40, $30, $0c, $03
oddGrid:
.BYTE $60, $18, $06, $01, $00, $00, $00
.align 32
characterBitmap:
character1Bitmap:
.BYTE $70, $01
.BYTE $70, $01
.BYTE $30, $00
.BYTE $7c, $01
.BYTE $33, $06
.BYTE $30, $00
.BYTE $30, $00
.BYTE $4f, $01
.BYTE $40, $01
.BYTE $40, $01
.align 32
character2Bitmap:
.BYTE $70, $01
.BYTE $70, $01
.BYTE $30, $00
.BYTE $3c, $06
.BYTE $73, $01
.BYTE $30, $00
.BYTE $7c, $01
.BYTE $43, $07
.BYTE $43, $07
.BYTE $03, $00
.align 32
character3Bitmap:
.BYTE $70, $01
.BYTE $70, $01
.BYTE $30, $00
.BYTE $7c, $01
.BYTE $3c, $06
.BYTE $70, $01
.BYTE $7c, $01
.BYTE $3c, $00
.BYTE $3f, $00
.BYTE $0c, $00
characterPosLo:
.LOBYTES character1Bitmap, character2Bitmap, character3Bitmap
characterPosHi:
.HIBYTES character1Bitmap, character2Bitmap, character3Bitmap
characterColour: .BYTE COL_VIOLET
characterPos: .BYTE $00
characterY: .BYTE GRID_YPOS-CHAR_HEIGHT
characterYBottom: .BYTE GRID_YPOS
characterJumping: .BYTE $00
characterYSpeed: .BYTE $00
characterFalling: .BYTE $00
gridColour: .BYTE COL_VIOLET
gridY: .BYTE GRID_YPOS
gridXPos: .BYTE $00