cleanup and new vbl handler

This commit is contained in:
Dagen Brock
2020-03-17 08:15:43 -05:00
parent 0f6ac41005
commit 0c8a9a81bb
4 changed files with 139 additions and 248 deletions
+4 -22
View File
@@ -25,6 +25,10 @@ SPRITE_IMASK_P equ $FC
SPRITE_SCREEN_IDX db #$0
BIRD_VELOCITY db 0 ; in two's compliment {-3,3}
BIRD_VELOCITY_MAX equ #20
BIRD_VELOCITY_MIN equ #%111111111 ; -1
BIRD_WIDTH equ #5
BIRD_X equ #17
BIRD_Y_INIT equ #17
BIRD_Y db #BIRD_Y_INIT ; (0-47)
@@ -233,7 +237,6 @@ UndrawBird lda BIRD_Y_OLD
:undraw4 lda LoLineTableL,y
sta SPRITE_SCREEN_P
lda LoLineTableH,y
@@ -348,24 +351,6 @@ DrawBird
jsr DrawSpriteBetter
rts
*** MAKE IT WORK
BirdTest
lda BIRD_X ;#30 (0-79)
sta SPRITE_X
lda BIRD_Y ;#10 (0-23)
sta SPRITE_Y
lda #5 ;/2 value (we do two passes of 1/2... Aux/Main)
sta SPRITE_W
lda #3 ;/2 value (must be byte aligned vertically
sta SPRITE_H
; CopyPtr BIRD_WDN_MAIN;SPRITE_MAIN_P
; CopyPtr BIRD_WDN_AUX;SPRITE_AUX_P
; CopyPtr BIRD_WDN_MASK;SPRITE_MASK_P
; CopyPtr BIRD_WDN_IMASK;SPRITE_IMASK_P
jsr DrawSpriteBetter
rts
* still does collision
DrawSpriteBetter
lda #0
@@ -482,7 +467,4 @@ DD_ODD
cpy SPRITE_W
bcc :lineLoop
jmp ]DSLCD_done
+84 -208
View File
@@ -9,21 +9,15 @@
typ $ff ; set P8 type ($ff = "SYS") for output file
xc off ; @todo force 6502?
xc off
MLI equ $bf00
; Sorry, I gotta have some macros.. this is merlin format after all
; You might as well take advantage of your tools :P
CopyPtr MAC
lda #<]1 ; load low byte
sta ]2 ; store low byte
lda #>]1 ; load high byte
sta ]2+1 ; store high byte
<<<
; HANDLE GREENSCREEN DOODS... MONO flag set 0 = color mode, 1 = mono mode
* Change this flag to build either color/mono version
* 0 = color mode, 1 = mono mode
* The main difference is that it uses a black background so playfield is more visible on B/W screens
MONO equ 0
DO MONO
* MONO VERSION BUILD
dsk fmono.system ; tell compiler output filename
BGCOLOR equ #$00
BGCOLORAUX equ #$00
@@ -32,8 +26,8 @@ BGCOLOR_0HI equ #$00
BGCOLORAUX_0LO equ #$00
BGCOLORAUX_0HI equ #$00
; HANDLE COLOR DOODS
ELSE
* COLOR VERSION BUILD
dsk flap.system ; tell compiler output filename
BGCOLOR equ #$77
BGCOLORAUX equ #$BB
@@ -41,20 +35,31 @@ BGCOLOR_0LO equ #$70
BGCOLOR_0HI equ #$07
BGCOLORAUX_0LO equ #$B0
BGCOLORAUX_0HI equ #$0B
FIN
* Usage: CopyPtr sourceAddress;destinationZPPtrLoc
* macro used to set up ZeroPage pointers
* Example setting up sprite data pointer to the location of a bird sprite
* CopyPtr BIRD_WUP_E_PIXEL;SPRITE_DATA_P
CopyPtr MAC
lda #<]1 ; load low byte
sta ]2 ; store low byte
lda #>]1 ; load high byte
sta ]2+1 ; store high byte
<<<
Main
jsr DetectMachine ; also inits vbl
jsr SetupVBL
jsr LoadHiScore
jsr IntroWipe
jsr DL_SetDLRMode
Title
jsr VBlank
AttractLoop
jsr WaitVBL
DO MONO
lda #$FF
ELSE
@@ -68,97 +73,87 @@ Title
ldy #BGCOLOR
jsr DL_WipeIn
jsr DrawFlogo
lda FlogoCount
lda SongSkipCounter
and #%00000011 ; every 4 times?
bne :noSongForYou
jsr PlayFlappySong ;@todo throttle
:noSongForYou
inc FlogoCount
inc SongSkipCounter
ldx #60
ldy #2
jsr WaitKeyXY
PreGameLoop
** INIT ALL GAME STATE ITEMS
PlayfieldAttract
* INITIALIZE ALL GAME STATE VALUES
lda #BIRD_X
sta SPRITE_X
lda #BIRD_Y_INIT
sta BIRD_Y
sta BIRD_Y_OLD
lda #BIRD_WIDTH
sta SPRITE_W
lda #0
sta SPRITE_COLLISION
sta PreGameTick
sta PreGameTick+1
sta PreGameText
sta AttractTick
sta AttractTick+1
sta AttractText
sta ScoreLo
sta ScoreHi
lda #0
ldx #3
:clearPipes sta TopPipes,x
sta BotPipes
:zeroPipes sta TopPipes,x
sta BotPipes,x
dex
bpl :clearPipes
bpl :zeroPipes
** CLEAR SCREEN - SETUP BIRD
jsr VBlank
* CLEAR SCREEN TO PLAYFIELD COLOR
jsr WaitVBL
lda #BGCOLOR
jsr DL_Clear
lda #BIRD_X
sta SPRITE_X
lda #5
sta SPRITE_W ; all birds are same width
** WAIT FOR PLAYER TO HIT SOMETHING
:noKey jsr VBlank
* ANIMATE PLAYFIELD/BIRD WHILE WAITING FOR A KEYPRESS
:attractAnimLoop jsr WaitVBL
jsr UndrawBird
jsr DrawBird
jsr UpdateGrass
jsr FlapBird
inc PreGameTick
inc AttractTick
bne :noOverflow
inc PreGameTick+1
:noOverflow lda PreGameTick
cmp #60
bcc :skipText
lda PreGameText
inc AttractTick+1
:noOverflow lda AttractTick
cmp #60 ; on the 60th tick (aka after 1 second)
bne :skipText
inc PreGameText
jsr DrawTap
jsr DrawTap ; draw the "tap to flap" message
:skipText
lda PreGameTick+1
cmp #2
lda AttractTick+1
cmp #2 ; on the 0x200 aka 512th tick, switch to hiscore screen
bne :checkKey
jmp HiScreen
:checkKey jsr ButtonsCheck
bcs :key
bcs :keyPressed
lda KEY
bpl :noKey
:key sta STROBE
bpl :attractAnimLoop
:keyPressed sta STROBE
lda #BGCOLOR
jsr DL_Clear
jmp GameLoop
PreGameTick dw 0
PreGameText db 0
GSBORDER da _GSBORDER
_GSBORDER db 0
AttractTick dw 0
AttractText db 0
* MAIN GAME LOOP
GameLoop
jsr VBlank
jsr UndrawBird
jsr DrawPipes
jsr DrawScore
jsr DrawBird
jmp UpdatePipes
jsr WaitVBL ; wait until we are in vertical blanking period
jsr UndrawBird ; overwrite sprite area with background color
jsr DrawPipes ; draw pipes in new position (this wipes with bgcolor as it draws)
jsr DrawScore ; draw the score indicator at the top (overlapping any pipes)
jsr DrawBird ; draw the bird
jmp UpdatePipes ; update the
UpdatePipesDone
DONTUPDATEPIPES
jsr FlapBird
jsr UpdateGrass
@@ -205,13 +200,13 @@ GAME_OVER
lda QuitFlag
beq :noQuit
jmp Quit
:noQuit jmp PreGameLoop
:noQuit jmp PlayfieldAttract
:noKey
lda #$FA
ldx #$50
ldy #$00
jsr DL_WipeIn
jmp Title
jmp AttractLoop
HiScreen
jsr GetRand
jsr DL_Clear
@@ -230,34 +225,17 @@ HiScreen
lda QuitFlag
beq :noQuit
jmp Quit
:noQuit jmp PreGameLoop
:noKey jmp Title
:noQuit jmp PlayfieldAttract
:noKey jmp AttractLoop
FlogoCount db 0 ; used to throttle how often song is played
SongSkipCounter db 0 ; used to throttle how often song is played
SND_Flap jmp SND_Flap2
SND_Flap1
ldx #$1c ;LENGTH OF NOISE BURST
:spkLoop lda SPEAKER ;TOGGLE SPEAKER
txa
asl
asl
tay
:waitLoop dey ;DELAY LOOP FOR PULSE WIDTH
bne :waitLoop
dex ;GET NEXT PULSE OF THIS NOISE BURST
bne :spkLoop
rts
SND_Flap2
ldx #$16 ;LENGTH OF NOISE BURST
SND_Flap ldx #$16 ;LENGTH OF NOISE BURST
:spkLoop sta SPEAKER ;TOGGLE SPEAKER
txa
clc
adc #$30
tay
:waitLoop dey ;DELAY LOOP FOR PULSE WIDTH
bne :waitLoop
dex ;GET NEXT PULSE OF THIS NOISE BURST
@@ -270,7 +248,6 @@ SND_Static
:spkLoop lda SPEAKER ;TOGGLE SPEAKER
jsr GetRand
tay
* ldy $BA00,X ;GET PULSE WIDTH PSEUDO-RANDOMLY
:waitLoop dey ;DELAY LOOP FOR PULSE WIDTH
bne :waitLoop
dex ;GET NEXT PULSE OF THIS NOISE BURST
@@ -281,7 +258,7 @@ SND_Static
jsr GetRand
and #%1000000
tay
* ldy $BA00,X ;GET PULSE WIDTH PSEUDO-RANDOMLY
:waitLoop2 dey ;DELAY LOOP FOR PULSE WIDTH
bne :waitLoop2
dex ;GET NEXT PULSE OF THIS NOISE BURST
@@ -400,9 +377,6 @@ PauseKeyCheck cmp #"p"
lda #0
rts
BIRD_VELOCITY db 0 ; in two's compliment {-3,3}
BIRD_VELOCITY_MAX equ #20
BIRD_VELOCITY_MIN equ #%111111111 ; -1
LoadHiScore jsr CreateHiScoreFile
bcs :error
jsr OpenHiScoreFile
@@ -428,7 +402,7 @@ CreateHiScoreFile
:error cmp #$47 ; dup filename - already created?
bne :bail
clc ; this is ok, clear error state
:bail rts ; oh well... just carry on in session
:bail rts ; oh well... just carry on in session
OpenHiScoreFile
jsr MLI
@@ -445,7 +419,7 @@ OpenHiScoreFile
ReadHiScoreFile
lda #0
sta IOBuffer
sta IOBuffer+1 ;zero load area, just in case
sta IOBuffer+1 ; zero load area, just in case
lda OpenRefNum
sta ReadRefNum
jsr MLI
@@ -493,7 +467,7 @@ WriteHiScoreFile
OpenHiScoreParam
dfb #$03 ; number of parameters
dfb #$03 ; number of parameters
dw HiScoreFile
dw $900
OpenRefNum db 0 ; assigned by open call
@@ -501,7 +475,7 @@ HiScoreFile str 'flaphi'
CloseHiScoreParam
dfb #$01 ; number of parameters
dfb #$01 ; number of parameters
CloseRefNum db 0
@@ -532,7 +506,8 @@ WriteRefNum db 0 ; set by open subroutine above
WriteResult dw 0 ; result count (amount transferred)
Quit jsr QRPause
Quit jsr ShutDownVBL ; disable IIc VBL polling if needed
jsr QRPause
sta TXTPAGE1 ; Don't forget to give them back the right page!
jsr MLI ; first actual command, call ProDOS vector
dfb $65 ; QUIT P8 request ($65)
@@ -584,15 +559,16 @@ QRPause jsr DL_SetDLRMixMode
ldy #60
jsr WaitKeyXY
rts
QuitStr str "http://dagenbrock.com/flappy"
QuitStr str "https://github.com/digarok/flapple"
******************************
**************************************************
* Score Routines
*********************
**************************************************
ScoreLo db 0 ; 0-99
ScoreHi db 0 ; hundreds, not shown on screen
ScoreHi db 0 ; hundreds, not shown during gameplay but in highscore it is shown
HiScoreLo db 0
HiScoreHi db 0
** Draw the Score - @todo - handle > 99
DrawScore lda ScoreLo
and #$0F
@@ -612,7 +588,7 @@ DrawScore lda ScoreLo
sta Lo02+18
rts
** HANDLE HIGH SCORE
** HANDLE HIGH SCORE
UpdateHiScore
lda HiScoreHi
cmp ScoreHi
@@ -623,7 +599,6 @@ UpdateHiScore
bcc :newHighScore
bcs :noHighScore
:newHighScore lda ScoreHi
sta HiScoreHi
lda ScoreLo
@@ -635,7 +610,7 @@ UpdateHiScore
**************************************************
* Grass
* Grass
**************************************************
UpdateGrass inc GrassState
lda GrassState
@@ -842,7 +817,7 @@ WaitKey
WaitKeyXY
stx _waitX
:kloop jsr VBlank
:kloop jsr WaitVBL
lda KEY
bmi :kpress
dex
@@ -859,27 +834,8 @@ WaitKeyXY
rts
_waitX db 0
**************************************************
* See if we're running on a IIgs
* From Apple II Technote:
* Miscellaneous #7
* Apple II Family Identification
**************************************************
DetectMachine
sec ;Set carry bit (flag)
jsr $FE1F ;Call to the monitor
bcs :oldmachine ;If carry is still set, then old machine
* bcc :newmachine ;If carry is clear, then new machine
:newmachine asl _compType ;multiply vblank detection val $7E * 2
lda #1
bne :setmachine
:oldmachine lda #0
:setmachine sta GMachineIIgs
jsr InitVBlank
rts
GMachineIIgs db 0
IntroWipe
sta C80STOREON
@@ -905,12 +861,12 @@ IntroText str "Dagen Brock presents..."
**************************************************
* Wait for vertical blanking interval - IIe/IIgs
* Wait for multiple VBLs
**************************************************
VBlankX
:xloop txa
pha
jsr VBlank
jsr WaitVBL
pla
tax
dex
@@ -918,94 +874,14 @@ VBlankX
rts
InitVBlank
lda $FBC0 ; check for IIc
bne :rts ; not a IIc--use VBlankIIeIIgs
jsr MLI ; instantiate our interrupt
dfb $40
da VBLIntParm
lda #%00001000 ; enable vblint only
ldx #SETMOUSE
jsr mouse
lda #VBlankIIc ; override vblank
sta VBlankRoutine
lda #>VBlankIIc
sta VBlankRoutine+1
cli
:rts rts
VBLIntParm dfb 2
brk ;?
da VBLIntHandler
VBLIntHandler cld ; Expected by ProDOS
ldx #SERVEMOUSE
jsr mouse
bcs :notOurs ; pass if not
sec
ror _vblflag ;set hibit
clc
:notOurs rts
mouse ldy $C400,x
sty :jump+1
ldx #$C4
ldy #$40
sei
:jump jmp $C400
MOUSE = $c400 ; mouse = slot 4
*SETMOUSE = $c412 ; Apple IIc Ref p.168
*SERVEMOUSE = $c413 ; Apple IIc Ref p.168
SETMOUSE = $12
SERVEMOUSE = $13
READMOUSE = $14
INITMOUSE = $19
VBlank jmp VBlankIIeIIgs
VBlankRoutine equ *-2
VBlankIIc
cli ;enable interrupts
:loop1 bit _vblflag
bpl :loop1 ;wait for vblflag = 1
lsr _vblflag ;...& set vblflag = 0
*:loop2 bit _vblflag
* bpl :loop2
* lsr _vblflag
sei
rts
_vblflag db 0
VBlankIIeIIgs
lda _compType
:vblActive cmp RDVBLBAR ; make sure we wait for the current one to stop
bpl :vblActive ; in case it got launched in rapid succession
:screenActive cmp RDVBLBAR
bmi :screenActive
rts
_compType db #$7e ; $7e - IIe ; $FE - IIgs
MLI equ $bf00 ; ProDOS entry point
put vbl
put util
put applerom
put dlrlib
-18
View File
@@ -25,24 +25,6 @@ SPRITE_SCREEN_IDX db #$0
AUX_BG_COLOR db #$BB
MAIN_BG_COLOR db #$77
*** MAKE IT WORK
BirdTest
lda BIRD_X ;#30 (0-79)
sta SPRITE_X
lda BIRD_Y ;#10 (0-23)
sta SPRITE_Y
lda #5 ;/2 value (we do two passes of 1/2... Aux/Main)
sta SPRITE_W
lda #3 ;/2 value (must be byte aligned vertically
sta SPRITE_H
CopyPtr BIRD_WDN_MAIN;SPRITE_MAIN_P
CopyPtr BIRD_WDN_AUX;SPRITE_AUX_P
CopyPtr BIRD_WDN_MASK;SPRITE_MASK_P
CopyPtr BIRD_WDN_IMASK;SPRITE_IMASK_P
jsr DrawSpriteBetter
rts
* still does collision
DrawSpriteBetter
lda #0
+51
View File
@@ -0,0 +1,51 @@
SetupVBL
lda $FBB3 ; machine id byte (A2Misc TN #7)
cmp #$06 ; IIe, IIc, IIgs
bne :foundII ; II, II+
lda $FBC0 ; machine id byte (A2Misc TN #7)
beq :foundIIc ; IIc = FBB3:06 FBC0:00
sec
jsr $FE1F ; Check for IIgs compatibility routine
bcs :foundIIe
bcc :foundIIgs
:foundII lda #$60 ; RTS opcode
sta WaitVBL
rts
:foundIIc lda #$EA ; NOP opcode
sta ShutDownVBL
sei
sta $C07F ; enable access to VBL register
sta $C05B ; enable VBL polling
sta $C07E ; disable access to VBL register
lda #$EA ; NOP opcode
sta __waitVBLIIcPassthru
:foundIIe lda #$10 ; BPL opcode
sta __waitRasterOp
lda #$30 ; BMI opcode
sta __waitVBLOp
:foundIIgs rts
ShutDownVBL rts ; SMC
sta $C07F ; enable access to VBL register
sta $C05A ; disable VBL polling
sta $C07E ; disable access to VBL register
lda $C070 ; $c019 bit 7 is sticky, reset it
cli
rts
* This function gets modified based on System: II(+), IIe, IIc, IIgs
WaitVBL
:waitRaster bit $c019
bmi :waitRaster ; make sure we are screen area first, (VBL=0) on IIgs, !SMC IIe/c
__waitRasterOp = *-2
:waitVBL bit $c019
bpl :waitVBL ; as soon as blanking starts return, (VBL=1) on IIgs, !SMC IIe/c
__waitVBLOp = *-2
__waitVBLIIcPassthru rts
lda $C070 ; $c019 bit 7 is sticky on IIc, reset it
rts