Commit: b3f7735736ab8b95d9791ffe3d7575edddada5a4 Author: Vi Date: 2019-07-03 10:40 UTC Summary: Initial Commit .gitignore | 1 + Makefile | 36 + README.md | 55 ++ src/data/announcers.dat | 19 + src/data/categories.dat | 14 + src/data/consoles.dat | Bin 0 -> 609 bytes src/data/games.dat | 10 + src/data/prototype.dat | Bin 0 -> 1 bytes src/data/runners.dat | 12 + src/data/runnumber.dat | 1 + src/data/runtimes.dat | Bin 0 -> 423 bytes src/data/starttimes.dat | Bin 0 -> 423 bytes src/graphics/tileset.chr | Bin 0 -> 8186 bytes src/graphics/title.nam | Bin 0 -> 1024 bytes src/sgdq2019.asm | 2872 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 3020 insertions(+) diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..ba077a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..801f858 --- /dev/null +++ b/Makefile @@ -0,0 +1,36 @@ +# Copyright (C) 2019, Vi Grey +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +PKG_NAME := sgdq2019 +CURRENTDIR := $(dir $(realpath $(firstword $(MAKEFILE_LIST)))) + +all: + mkdir -p $(CURRENTDIR)/bin; \ + cd $(CURRENTDIR)src; \ + asm $(PKG_NAME).asm ../bin/$(PKG_NAME).nes; \ + cd ..; \ + +clean: + rm -rf -- $(CURRENTDIR)bin diff --git a/README.md b/README.md new file mode 100755 index 0000000..6a4d075 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# Unofficial SGDQ 2019 Event Schedule NES Cartridge + +An Unofficial SGDQ 2019 Event Schedule ported to the NES to be played on real NES hardware with accurate run start times and total run times + +**_SGDQ 2019 Event Schedule NES Cartridge was created by Vi Grey and is licensed under the BSD 2-Clause License._** + +### Description: +This NES game is a playable NES game that contains the event schedule for Summer Games Done Quick 2019. A standard NES controller is used to navigate the event schedule. This game can be burned onto a physical NES cartridge and played on actual NES hardware. All start times use the Central Daylight Timezone (UTC -5), as the event was held in Bloomington, MN during June 23rd to June 30th, which used the Central Daylight Timezone. + +### Platforms: +- GNU/Linux + +### Build Dependencies: +- asm6 _(You'll probably have to build asm6 from source. Make sure the asm6 binary is named **asm** and that the binary is executable and accessible in your PATH. The source code can be found at **http://3dscapture.com/NES/asm6.zip**)_ + +### Build NES ROM: +From a terminal, go to the the main directory of this project (the directory this README.md file exists in), you can then build the NES ROM with the following command. + + $ make + +The resulting NES ROM will be located at **bin/sgdq2019.nes** + +### Cleaning Build Environment: +If you used `make` to build the NES ROM, you can run the following command to clean up the build environment. + + $ make clean + +### Important Note: +This event schedule was created using data from the [publicly available event schedule](https://gamesdonequick.com/tracker/runs/sgdq2019) for Summer Games Done Quick 2019. This is an independent project created solely by Vi Grey and is not affiliated with or endorsed by Games Done Quick, their partners, or their sponsors, including (but not limited to) Doctors Without Borders, Best Buy, Power Up Audio, Final Fantasy XIV: Showdowbringers, Magwest, Super Meat Boy Forever, Tokyo Attack!, Annapurna Interactive, Chrono, 8-4, Red Bull, Heave Ho, The Yetee, Fangamer, World 9 Gaming, or Twitch. Summer Games Done Quick and the Games Done Quick logo used in this event schedule are owned by Games Done Quick. + +### License: + Copyright (C) 2019, Vi Grey + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS \`\`AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. diff --git a/src/data/announcers.dat b/src/data/announcers.dat new file mode 100755 index 0000000..56465f9 --- /dev/null +++ b/src/data/announcers.dat @@ -0,0 +1,19 @@ +NICHOLE GOODNIGHTNICHOLE GOODNIGHTNICHOLE GOODNIGHTLLKTHE_KOVTHE_KOVEDOBEANEDOBEANIGGYZIGSIMPLYAJ +MIKE UYAMAPROLIXSOORAYA +KRUNCHYLEX +KRUNCHYLEX +KRUNCHYLEXSPORADICERRATICSPORADICERRATICSPORADICERRATICSPORADICERRATICSPORADICERRATICSPORADICERRATICYOBGSYOBGSYOBGSYOBGSYOBGS +PYTHONICUS +PYTHONICUS +PYTHONICUSCARTRIDGEBLOWERSCARTRIDGEBLOWERSCARTRIDGEBLOWERSCARTRIDGEBLOWERSANETERNALENIGMAANETERNALENIGMAPROLIX COVERTMUFFINPROLIX SAKURATSUBASA SAKURATSUBASASOORAYASOORAYA WEGOGIANT WEGOGIANTLLKSGRUNTSGRUNTYOBGSYOBGSIGGYZIGIGGYZIG GLASS JOETHE_KOV SONICMEGAEDOBEANSKYBILZSMOOTHOPERATIVESMOOTHOPERATIVEANETERNALENIGMAANETERNALENIGMAANETERNALENIGMANICHOLE GOODNIGHTNICHOLE GOODNIGHTNICHOLE GOODNIGHTLLKLLKLLKLLK +PYTHONICUS +PYTHONICUS +PYTHONICUSCARTRIDGEBLOWERSCARTRIDGEBLOWERSCARTRIDGEBLOWERS FRENCH TOAST FRENCH TOAST FRENCH TOAST FRENCH TOAST FRENCH TOASTIGGYZIGIGGYZIGSGRUNTSOORAYAANETERNALENIGMAANETERNALENIGMASMOOTHOPERATIVESMOOTHOPERATIVESMOOTHOPERATIVESMOOTHOPERATIVESMOOTHOPERATIVE +PYTHONICUS +PYTHONICUS +PYTHONICUS +PYTHONICUS +PYTHONICUS +PYTHONICUSNICHOLE GOODNIGHTNICHOLE GOODNIGHTTHE_KOVTHE_KOV SAKURATSUBASASPORADICERRATICSKYBILZ COVERTMUFFINSKYBILZ COVERTMUFFINSPORADICERRATIC +KRUNCHYLEXSMOOTHOPERATIVESMOOTHOPERATIVESMOOTHOPERATIVE WEGOGIANT FRENCH TOAST FRENCH TOAST FRENCH TOASTTHE_KOVSGRUNTSGRUNT SAKURATSUBASAMETMANMETMANEDOBEANEDOBEANRAELCUNRAELCUNRAELCUN COVERTMUFFINST3RFPATTYSAMWITHOUTAPLANSIMPLYAJSIMPLYAJ WEGOGIANT WEGOGIANT +KRUNCHYLEXYOBGSKUNGFUFRUITCUPSKYBILZSPORADICERRATIC, PROLIXSTAFF \ No newline at end of file diff --git a/src/data/categories.dat b/src/data/categories.dat new file mode 100755 index 0000000..b8c1f08 --- /dev/null +++ b/src/data/categories.dat @@ -0,0 +1,14 @@ +FUNANY%SINGLE PLAYER INBOUNDS +ANY% CO-OP +ALL STAGESANY%ANY%ANY%ANY%ANY%HARDESTTNT-EVILUTION UV-SPEEDANY%ANY% NO MENU GLITCHES CLASSIC NORMAL (ALL GOALS) (NG+)ANY% ANY% (JP)ANY%ANY% +ANY% NO WWANY% +ANY% CO-OP ANY% 2 PLAYER LOW% 2 PLAYER ANY% HARD SUPEREASYHEAVYANY% ALL MISSIONS ANY% HERO 30ANY%ANY %ANY% NO-OOB ULTIMATE (VETERAN)!ALL BOSSES & RELICS, SAVE RICHTERNO OOBALL MAIN QUESTSANY%ANY%COOP ALL QUESTSANY%ANY%ANY% PS4 NO AIRWALKANY%ANY% +ALL BOSSESANY%CANNONBALL MAX SETTINGS RACEALL DETONATOR RUNSALL TRACKS NO DUPLICATE RIDES100%ANY%CRASH BANDICOOT 3:WARPED ANY% ANY% 1ST LOOP+CONTENDER & TITLE DEFENSE (1ST & 2ND LOOPS)ANY% GLITCHLESSRACE (LITE FLAGSET)TRUE PACIFIST ENDING RACE ANY% RACECLAIRE A VS LEON A +UFO ENDINGBIG THE CAT (2P/1C)2STORY MODE ALL LEVELS RACE - DAMN TOUGH DIFFICULTYANY%NO LEVELS EARLYANY%ANY%ANY%ANY% NO PASSWORDSALL MAIN LEVELSANY%ANY%ANY% TRUE ENDING RACE100% DIFFICULTYANY% NO ITEM USEANY% +NOABILITY% ARCADE MODE ROOKIE ANY%SPEEDRUN MODE (FURI DIFFICULTY) +ALL BOSSESSOVIET CAMPAIGN HARD MODE CO-OPBROOD WAR PROTOSS CAMPAIGN100%ALL BOSSES (WITH DLC)OVERTIME MODE (NEW GAME / LOW%) ALL CHAPTERS +ALL LEVELSANY%ANY%ANY%ANY%ANY%ANY% ANY% RACE +ANY% CO-OP +ANY% CO-OP100%ANY% BAD ENDING BEST ENDINGHARD/REVELATION/BIRTHRIGHT/CONQUEST (NORMAL/CLASSIC)ANY% (BEGINNER) CO-OP RELAYBLIND RELAY RACEALL FORTS RACE100%ANY% GOOD ENDING 100% RACEALL 4 CUPS RACEANY%ANY%ALL KEYSRED LINE ALL MEDALSNECROMANCER ANY% NORMALEASY RUNANY%NEW ENGINE, INBOUNDSNO MAJOR GLITCHESANY% RANDOM SEED GLITCHLESSSINGLE STORY BIDWARANY%DIFFICULT ZIPLESSANY%ANY% NORMAL NO OOB RACEJOURNEY MODE (EXPERT),MODE B, PLAYAROUND, FASTEST 999999 BY BAXTER8 TRACKS (IGT: ~10 MINUTES) ALL BERRIES +ALL BOSSESANY% (NO AMIIBO)100%ANY%ANY%ANY%LOW% +MAIN QUESTANY%96 EXITANY%&CO-OP BEAT THE GAMES (BUT ALSO A RACE)GLITCHLESS 100%THE END \ No newline at end of file diff --git a/src/data/consoles.dat b/src/data/consoles.dat new file mode 100755 index 0000000..411ad99 Binary files /dev/null and b/src/data/consoles.dat differ diff --git a/src/data/games.dat b/src/data/games.dat new file mode 100755 index 0000000..b54b822 --- /dev/null +++ b/src/data/games.dat @@ -0,0 +1,10 @@ +PRESHOW)SPYRO REIGNITED TRILOGY: SPYRO THE DRAGONPORTAL 27TEENAGE MUTANT NINJA TURTLES III: THE MANHATTAN PROJECTSUPER MARIO BROS. 2)DONKEY KONG COUNTRY 2: DIDDY'S KONG QUESTKIRBY: NIGHTMARE IN DREAM LANDSONIC GENERATIONS#THE LEGEND OF ZELDA: THE MINISH CAP DEVIL MAY CRYSTREETS OF RAGE +FINAL DOOMOUTLAND +THE HOBBITTONY HAWK'S UNDERGROUND 2ZOMBIES ATE MY NEIGHBORSBLASTER MASTER SOLOMON'S KEYMETROIDRYGAR DUCKTALES 2MARBLE MADNESSJACKALCONTRACONTRA III: THE ALIEN WARS ALIEN SOLDIERRANGER-X NINJA SPIRITSUPER TIME FORCE ULTRAHALF-MINUTE HERO TIMESPINNER CASTLEVANIABLOODSTAINED: CURSE OF THE MOON"CASTLEVANIA: SYMPHONY OF THE NIGHTCASTLEVANIA: PORTRAIT OF RUINPREY TITANFALL 2 PERFECT DARK BORDERLANDS 2 METROID PRIMEMETROID PRIME 2: ECHOESUNCHARTED: DRAKE'S FORTUNECHASM: THE RIFT"MONSTER BOY AND THE CURSED KINGDOMTHE TEXTORCIST)SKYLAR & PLUX: ADVENTURE ON CLOVER ISLAND +SLIPSTREAM SPLIT/SECONDKIRBY AIR RIDEKIRBY 64: THE CRYSTAL SHARDS +APE ESCAPE CRASH BANDICOOT: N. SANE TRILOGYPUNCH-OUT!! (ARCADE)PUNCH-OUT!! (WII)POKEMON CRYSTALTHE LEGEND OF ZELDA RANDOMIZER DELTARUNESUPER MARIO SUNSHINERESIDENT EVIL 2 SILENT HILL 3"SONIC ADVENTURE DX: DIRECTOR'S CUTDIVEKICKWE LOVE KATAMARISHREK EXTRA LARGEMORT THE CHICKENCATLATERAL DAMAGEHYLICS LAFFY TAFFY 3D PYRAMID CHALLENGEGLOVERCASTLEVANIA (DOS)LAST ACTION HEROSPLATTERHOUSE: WANPAKU GRAFFITI$SYLVESTER AND TWEETY IN CAGEY CAPERS%BOOGERMAN: A PICK AND FLICK ADVENTURE'T.R.A.G.: TACTICAL RESCUE ASSAULT GROUP CLUSTERTRUCKLETHAL LEAGUE BLAZE NEX MACHINAFURINUCLEAR THRONECOMMAND & CONQUER: RED ALERT 3STARCRAFT REMASTERED*THE LEGEND OF ZELDA: A LINK BETWEEN WORLDS DARK SOULS II DEAD RISINGREMNANTS OF NAEZITH LOONEY TUNES RHINO RUMBLEJUMPER: GRIFFIN'S STORYAERO THE ACRO-BAT 2SUPER BOMBERMAN 2 METAL SLUG X METAL SLUG 3GAUNTLETCHIP 'N DALE: RESCUE RANGERS0TEENAGE MUTANT NINJA TURTLES IV: TURTLES IN TIMERISTARSONIC 3D BLAST +CAVE STORY)KOUMAJOU DENSETSU II: YOUGEN NO CHINGONKAFIRE EMBLEM FATESKINGDOM HEARTS IIISUPER MARIO WORLDSUPER MARIO BROS. 3INVICTUSGRAND POO WORLD 2 BANJO-KAZOOIEMARIO KART: DOUBLE DASH!!SUPER MARIO GALAXY 2 PAC-MAN WORLD%SLY COOPER AND THE THIEVIUS RACCOONUS STAR FOX 64DIABLO 2: LORD OF DESTRUCTIONQUAKE HALF-LIFE HALF-LIFE 2HYPER LIGHT DRIFTER MINECRAFTOCTOPATH TRAVELERROCKMAN 4 MINUS INFINITY +MEGA MAN 2 +MEGA MAN 3 MEGA MAN 11 TETRIS EFFECTTASBOT PLAYS TETRISTASBOT PLAYS MARIO KART WIITASBOT PLAYS CELESTE +DARK SOULS'THE LEGEND OF ZELDA: BREATH OF THE WILD"THE LEGEND OF ZELDA: MAJORA'S MASKBOMBERMAN 64: THE SECOND ATTACK CANNON SPIKELARA CROFT TOMB RAIDER: LEGEND +TRANSISTORTHE ELDER SCROLLS V: SKYRIM"POKEMON: LET'S GO, PIKACHU!/EEVEE!SUPER MARIO WORLD%THE LEGEND OF ZELDA: OCARINA OF TIME.1LINK TO THE PAST + SUPER METROID COMBO RANDOMIZERCHRONO TRIGGERFINALE \ No newline at end of file diff --git a/src/data/prototype.dat b/src/data/prototype.dat new file mode 100755 index 0000000..f76dd23 Binary files /dev/null and b/src/data/prototype.dat differ diff --git a/src/data/runners.dat b/src/data/runners.dat new file mode 100755 index 0000000..75ef0f7 --- /dev/null +++ b/src/data/runners.dat @@ -0,0 +1,12 @@ + TECH CREWCHRISLBC +CAN'T EVENPJ, MECHA RICHTERCOOLKID MIKEKANIS MR_SHASTA THEBLUEMANIAQUO MAXYLOBES CESTPATOUKINGDIMEVULAJIN +CHRIXIAM98PLUMATOTEDDYRASDAVIDTKI METROIDMCFLY METROIDMCFLY DARKWING DUCKSWORDSMANKIRBYYELSRAEK, ELIPSISROTTDAWG, SUPERPITFROANGRYLANKS, ROTTDAWGFCJ2000CHRONOOND4GR0N +LATTMACKEYTOHLOODOWOLFRISKYCB2SNEK, KOMRADE, FREELAND1787 STRIZER86 DR4GONBLITZVB__LIFEL1KEBRYONATO ALKAMAASS THEFUNCANNON, SHOCKWVE, AMYRLINNJUSTINDMCLARISOSSKARITBCR TINAHACKSTEDDYRAS CUTTYFLAME_KONASUMI, WHATISCALVINVICEROYOFMONTECRISTOPEARSTRIKE, 1DAVIDJSWORDSMANKIRBYHORNLITZJHOBZ, MURCAZ, CAMERONVENGENZZALLARD1ZALLARD1KEIZARONJAMEVIL, FCOUGHLINCOOKIEPOCALYPSE, SHAYYJCOOL114, KWANIZA +BAWKBASOUPPUNCHYJERKRO, ALLEGRORAGINGCHERRY, ESAMGARBITHEGLITCHERESS +SILO_SIMON JOESTER98BULLETSTHEFLYINGMARLINZIKUBIYOSHIPRO LOZCARDSFAN23 SUPERPITFROSTORMCROW56K, BESTICKLES +RITZ BLUES MRMAXIMUS11 +CAVEMANDCJ CONNORACE BUFFET TIMEPROTOPIP +DIRCASHEDE FISHMCMUFFINSRAELCUN, COVERTMUFFINKINGDIMETHELEGENDOFZAHEER DISTORTION2 +DRUNKWARIO XEPICCATX WINNERBIT WINNERBIT +SILO_SIMONTHU OXICEPLUGSUKIMOSSUKIMOSDIGSHAKE, EUNOSSINISTER1, GENERALANDREWSGENERALANDREWS, DOSPOSTMANNCHUBBUS KINGRHODESTNSHADAXSHADAX KIRBYMASTAH MISTMASTER1, CRISPYME, NINTEN866WBARBARIAN, LASERBELCH, PANGAEAPANGA, DODE, GRANDPOOBEAR, JUZCOOK, GLITCHCAT7, NOBLETOFU1MITCHFLOWERPOWER, GRANDPOOBEAR, LAWSO42, THEHAXORDODEMITCHFLOWERPOWERHAGGINATER, DUCKOPTIMISTICEMO, GOOMBASUPERVIPERT302 JOESTER98ZENTHROWLYLATR MRLLAMASCALEXH0WALEXH0W, MSUSHIWAEZONE COVERTMUFFIN ILLUMINA1337$MAMGAR, ALTABISCUIT, OURO, ARCHARIATKUUMBACOOLKID COLONELFATSOFASTATCC, QTTSIXHARDDROPDWANGOACDWANGOAC TECH CREW CATALYSTZ WOLHAIKSONG MAJINPHIL LIVELYRACCOONAQUASSMOOTHOPERATIVEFHNNHF CHRONOS_REDDAKETSEATHORNE, TRUMAN, TNTTORJE +ANDY, IVANPUWEXIL TECH CREW \ No newline at end of file diff --git a/src/data/runnumber.dat b/src/data/runnumber.dat new file mode 100755 index 0000000..1bd8bf6 --- /dev/null +++ b/src/data/runnumber.dat @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/data/runtimes.dat b/src/data/runtimes.dat new file mode 100755 index 0000000..a86cbc4 Binary files /dev/null and b/src/data/runtimes.dat differ diff --git a/src/data/starttimes.dat b/src/data/starttimes.dat new file mode 100755 index 0000000..1f503f5 Binary files /dev/null and b/src/data/starttimes.dat differ diff --git a/src/graphics/tileset.chr b/src/graphics/tileset.chr new file mode 100755 index 0000000..7a8c235 Binary files /dev/null and b/src/graphics/tileset.chr differ diff --git a/src/graphics/title.nam b/src/graphics/title.nam new file mode 100755 index 0000000..a0e912b Binary files /dev/null and b/src/graphics/title.nam differ diff --git a/src/sgdq2019.asm b/src/sgdq2019.asm new file mode 100755 index 0000000..bfbbaa9 --- /dev/null +++ b/src/sgdq2019.asm @@ -0,0 +1,2872 @@ +;; Copyright (C) 2019, Vi Grey +;; All rights reserved. +;; +;; Redistribution and use in source and binary forms, with or without +;; modification, are permitted provided that the following conditions +;; are met: +;; +;; 1. Redistributions of source code must retain the above copyright +;; notice, this list of conditions and the following disclaimer. +;; 2. Redistributions in binary form must reproduce the above copyright +;; notice, this list of conditions and the following disclaimer in the +;; documentation and/or other materials provided with the distribution. +;; +;; THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;; ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +;; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +;; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +;; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +;; SUCH DAMAGE. + + +;;;;;;;;;; +;; +;; iNES Header +;; +;;;;;;;;;; + +;;INES header setup + .db "NES", $1A + .db $02 + .db $01 + .db $00 + .db $00 + .db 0, 0, 0, 0, 0, 0, 0, 0 ;pad header to 16 bytes + +;;;;;;;;;; +;; +;; Variables +;; +;;;;;;;;;; + +;;Initialize Variables (Automatic) + enum $00 + +addr dsb 2 +tmpaddr dsb 2 +nmi dsb 1 +visible dsb 1 + +textsplit dsb 4 +textsplittmp dsb 2 + +title dsb 1 +event dsb 1 +day dsb 1 +day2 dsb 1 +hour dsb 1 +hour2 dsb 1 +minute dsb 1 +eventtotal dsb 1 + +select dsb 1 +selectoption dsb 1 + +code dsb 2 +fps dsb 1 +fpslast dsb 1 +frame dsb 1 +hydration dsb 1 +reset dsb 1 +mlcountdown dsb 1 +ozcountdown dsb 1 +timerhours dsb 3 +timerminutes dsb 2 +timerseconds dsb 2 +timercentiseconds dsb 2 +mliters dsb 6 +ounces dsb 4 + +textwidth dsb 1 + + + + +tmp dsb 2 +tmp2 dsb 2 + + +controller dsb 1 +controllerLastFrame dsb 1 +held dsb 1 +heldframes dsb 1 +heldframesmax dsb 1 + ende + + +BUTTON_A = 1 << 7 +BUTTON_B = 1 << 6 +BUTTON_SELECT = 1 << 5 +BUTTON_START = 1 << 4 +BUTTON_UP = 1 << 3 +BUTTON_DOWN = 1 << 2 +BUTTON_LEFT = 1 << 1 +BUTTON_RIGHT = 1 << 0 + +TEXT_WIDTH = 22 +ANNOUNCER_WIDTH = 20 + + .base $8000 + + + + + +;;;;;;;;;; +;; +;; Reset Management +;; +;;;;;;;;;; + +;; Run upon power on or reset +RESET: + sei ; disable IRQs + cld ; disable decimal mode, meant to make decimal arithmetic "easier" + ldx #$40 + stx $4017 ; disable APU frame IRQ + ldx #$FF + txs ; Set up stack + inx ; X overflows back to 0 + jsr Blank + stx $4010 ; disable DMC IRQs + ldx #$00 ;reset x back to 0 + ldy #$00 ;reset y back to 0 + + +;;;;;;;;;; +;; +;; Vblank Waits +;; +;;;;;;;;;; + +;; First vblank wait to make sure PPU is ready +vwait1: + lda $2002 ; wait + bpl vwait1 + lda fps + sta fpslast + +;; Second vblank wait, PPU is ready after this +;; Region detection code inspired by Damian Yerrick's code, +;; although his code has better documentation as to why it works +vwait2: + inx + bne DoNotIncY + iny +DoNotIncY: + lda $2002 + bpl vwait2 + lda #50 + cpy #$09 + bne NotNTSC + lda #60 +NotNTSC: + sta fps + + jsr CheckForReset + + +;;;;;;;;;; +;; +;; Memory Clearing Management +;; +;;;;;;;;;; + + +;; Initialize memory and APU +Initialize: + ldx #$00 +InitializeLoop: + ; reset all values of $0000 - $01FF and $0300 - $07FF back to 0 + lda #$00 + cmp reset + beq NewPowerOn + cpx #fps + bcc NotSkipRange + cpx #(ounces + 4) + bcc SkipFPS + jmp NotSkipRange +NewPowerOn: + cpx #reset + beq SkipFPS + cpx #fps + beq SkipFPS + cpx #fpslast + beq SkipFPS +NotSkipRange: + sta $0000, x +SkipFPS: + sta $0100, x + sta $0300, x + sta $0400, x + sta $0500, x + sta $0600, x + sta $0700, x + lda #$fe + sta $0200, x + inx + bne InitializeLoop ;repeat until x rolls back to 0 +InitializeDone: + dec controllerLastFrame + lda reset + bne InitializationReset + lda #30 + sta ozcountdown + lda #$03 + sta mlcountdown +InitializationReset: + jsr SetReset + + + + lda #$00 ;reset A value + ldx #$00 ;reset X value + ldy #$00 ;reset Y value + + lda fps + cmp fpslast + beq SameFPS + stx timercentiseconds + stx (timercentiseconds + 1) +SameFPS: + +;;;;;;;;;; +;; +;; Infinite Loop +;; +;;;;;;;;;; + + sta event + + + jsr GetEventTotal + + jsr SetPalette + jsr DrawBlankScreen + jsr SetNMI + jsr DrawTitleScreen + jsr ResetScroll + + +Forever: + jmp Forever + +DrawHydration: + lda hydration + beq DrawHydrationDone + lda #$20 + sta $2006 + lda #$74 + sta $2006 + lda #<(HydrationWord) + sta addr + lda #>(HydrationWord) + sta (addr + 1) + ldy #$00 +DrawHydrationLoop: + lda (addr), y + sta $2007 + iny + cpy #$09 + bne DrawHydrationLoop +DrawHydrationDone: + rts + +DrawTitle: + ;get high and low byte of lobby screen nametable file + lda #<(TitleNametable) + sta addr + lda #>(TitleNametable) + sta (addr + 1) + ;set to start of title screen nametable + lda #$20 + sta $2006 + lda #$00 ;point $2006 to the nametable (0x2000) + sta $2006 + ;set counter of 4 for x, y will iterate 256 times per x counter + ldx #$04 + ldy #$00 +DrawTitleLoop: ;loop through and load nam file into PPU + lda (addr), y + sta $2007 + iny + bne DrawTitleLoop ;loop if y is not 0 + inc (addr + 1) + dex ;decrement x by 1 to indicate one set of y iterations is finished + bne DrawTitleLoop ;loop if x is not 0 + rts + +DrawTitleScreen: + lda #$00 + sta code + jsr DrawTitle + ldy #$01 + jsr DrawPressStart + jsr DrawKonamiTop + rts + +DrawKonamiTop: + lda hydration + beq DrawKonamiTopDisabled + jsr DrawKonami + jmp DrawKonamiTopDone +DrawKonamiTopDisabled: + jsr DrawKonamiBlank +DrawKonamiTopDone: + rts + +DrawKonami: + jsr DrawWater + jsr DrawRunTime + jsr DrawHydration + rts + +DrawKonamiBlank: + lda #$20 + sta $2006 + lda #$60 + sta $2006 + lda #$00 + ldx #$40 +DrawKonamiBlankLoop: + sta $2007 + dex + bne DrawKonamiBlankLoop + rts + +DrawPressStart: + lda title + beq DrawPressStartDone + lda #$22 + sta $2006 + lda #$EB + sta $2006 + ldx #$0B + cpy #$01 + beq DrawPressStartLoop + lda #$00 +DrawPressStartBlankLoop: + sta $2007 + dex + bne DrawPressStartBlankLoop + jmp DrawPressStartDone +DrawPressStartLoop: + lda #$0E + sta $2007 + lda #$0F + sta $2007 + lda #$10 + sta $2007 + lda #$11 + sta $2007 + lda #$11 + sta $2007 + lda #$00 + sta $2007 + lda #$11 + sta $2007 + lda #$12 + sta $2007 + lda #$13 + sta $2007 + lda #$0F + sta $2007 + lda #$12 + sta $2007 +DrawPressStartDone: + rts + +DrawRunTime: + lda title + bne DrawRunTimeIsTitle + jmp DrawRunTimeDone +DrawRunTimeIsTitle: + lda hydration + bne DrawRunTimeContinue + jmp DrawRunTimeDone +DrawRunTimeContinue: + lda #$20 + sta $2006 + lda #$63 + sta $2006 + ldx #$00 + lda timerhours + beq SkipHours + inx + lda timerhours + clc + adc #$01 + sta $2007 +SkipHours: + cpx #$00 + bne NotSkipHours1 + lda (timerhours + 1) + beq SkipHours1 +NotSkipHours1: + lda (timerhours + 1) + inx + clc + adc #$01 + sta $2007 +SkipHours1: + cpx #$00 + bne NotSkipHours2 + lda (timerhours + 2) + beq SkipHours2 +NotSkipHours2: + lda (timerhours + 2) + inx + clc + adc #$01 + sta $2007 + lda #$FA + sta $2007 +SkipHours2: + cpx #$00 + bne NotSkipMinutes + lda timerminutes + beq SkipMinutes +NotSkipMinutes: + lda timerminutes + inx + clc + adc #$01 + sta $2007 +SkipMinutes: + cpx #$00 + bne NotSkipMinutes1 + lda (timerminutes + 1) + beq SkipMinutes1 +NotSkipMinutes1: + lda (timerminutes + 1) + inx + clc + adc #$01 + sta $2007 + lda #$FA + sta $2007 +SkipMinutes1: + cpx #$00 + bne NotSkipSeconds + lda timerseconds + beq SkipSeconds +NotSkipSeconds: + lda timerseconds + clc + adc #$01 + sta $2007 +SkipSeconds: + lda (timerseconds + 1) + clc + adc #$01 + sta $2007 + lda #$FB + sta $2007 + lda timercentiseconds + clc + adc #$01 + sta $2007 + lda (timercentiseconds + 1) + clc + adc #$01 + sta $2007 +DrawRunTimeDone: + rts + + + +DrawWater: + lda title + bne DrawWaterIsTitle + jmp DrawWaterDone +DrawWaterIsTitle: + lda hydration + bne DrawWaterContinue + jmp DrawRunTimeDone +DrawWaterContinue: + jsr WaterPaddingLength + lda #$20 + sta $2006 + lda #$8D + sta $2006 + lda #$00 + ldx tmp +DrawWaterPaddingLoop: + dex + bmi DrawWaterPaddingLoopDone + sta $2007 + jmp DrawWaterPaddingLoop +DrawWaterPaddingLoopDone: + ldx #$00 + lda ounces + beq SkipOunce + inx + clc + adc #$01 + sta $2007 +SkipOunce: + cpx #$00 + bne NotSkipOunce1 + lda (ounces + 1) + beq SkipOunce1 +NotSkipOunce1: + inx + lda (ounces + 1) + clc + adc #$01 + sta $2007 +SkipOunce1: + cpx #$00 + bne NotSkipOunce2 + lda (ounces + 2) + beq SkipOunce2 +NotSkipOunce2: + inx + lda (ounces + 2) + clc + adc #$01 + sta $2007 +SkipOunce2: + lda (ounces + 3) + clc + adc #$01 + sta $2007 + lda #$0B + sta $2007 + lda #$0C + sta $2007 + lda #$00 + sta $2007 + lda #$1B + sta $2007 + ldx #$00 + jsr CheckForLiters + beq DrawMliters + lda mliters + beq SkipMliters + inx + clc + adc #$01 + sta $2007 +SkipMliters: + cpx #$00 + bne NotSkipMliters1 + lda (mliters + 1) + beq SkipMliters1 +NotSkipMliters1: + lda (mliters + 1) + clc + adc #$01 + sta $2007 +SkipMliters1: + lda (mliters + 2) + clc + adc #$01 + sta $2007 + lda #$FB + sta $2007 + lda (mliters + 3) + clc + adc #$01 + sta $2007 + lda (mliters + 4) + clc + adc #$01 + sta $2007 + jmp DrawWaterDone +DrawMliters: + lda (mliters + 3) + beq SkipMliters3 + inx + clc + adc #$01 + sta $2007 +SkipMliters3: + cpx #$00 + bne NotSkipMliters4 + lda (mliters + 4) + beq SkipMliters4 +NotSkipMliters4: + lda (mliters + 4) + clc + adc #$01 + sta $2007 +SkipMliters4: + lda (mliters + 5) + clc + adc #$01 + sta $2007 + lda #$0D + sta $2007 +DrawWaterDone: + lda #$F9 + sta $2007 + lda #$1C + sta $2007 + rts + +CheckForLiters: + lda mliters + ora (mliters + 1) + ora (mliters + 2) + rts + +WaterPaddingLength: + lda #$00 + sta tmp + lda ounces + bne WaterPaddingLengthOzDone + inc tmp + lda (ounces + 1) + bne WaterPaddingLengthOzDone + inc tmp + lda (ounces + 2) + bne WaterPaddingLengthOzDone + inc tmp +WaterPaddingLengthOzDone: + lda mliters ; 011111_ + bne WaterPaddingLengthMlDone + inc tmp + lda (mliters + 1) ; 001111_ + bne WaterPaddingLengthMlDone + inc tmp + lda (mliters + 2) ; ---111_ + bne WaterPaddingLengthMlDone + lda (mliters + 3) + bne WaterPaddingLengthMlDone + inc tmp + lda (mliters + 4) + bne WaterPaddingLengthMlDone + inc tmp +WaterPaddingLengthMlDone: + rts + +PressStartBlink: + lda fps + lsr + cmp frame + bne PressStartBlinkNotHalfSecond + ldy #$00 + jsr DrawPressStart + jmp PressStartBlinkDone +PressStartBlinkNotHalfSecond: + lda frame + cmp fps + bne PressStartBlinkDone + lda #$00 + sta frame + ldy #$01 + jsr DrawPressStart +PressStartBlinkDone: + rts + + + + + + +CheckForReset: + lda #$00 + sta reset + lda $A0 + cmp #$52 + bne CheckForResetDone + lda $B0 + cmp #$45 + bne CheckForResetDone + lda $C0 + cmp #$53 + bne CheckForResetDone + lda $D0 + cmp #$45 + bne CheckForResetDone + lda $E0 + cmp #$54 + bne CheckForResetDone + inc reset +CheckForResetDone: + rts + +SetReset: + lda #$52 + sta $A0 + lda #$45 + sta $B0 + lda #$53 + sta $C0 + lda #$45 + sta $D0 + lda #$54 + sta $E0 + rts + + + + +DrawEvent: + jsr DrawEventFrame + jsr DrawDateTime + jsr GetGameTitle + jsr GetCategory + jsr GetConsole + jsr GetRunners + jsr GetAnnouncer + jsr GetRunTime + jsr ClearControls + jsr DrawControls + lda #$00 + sta select + rts + +IncEvent: + inc event + lda event + cmp eventtotal + bcc IncEventDraw + lda eventtotal + sta event + dec event + jmp IncEventDone +IncEventDraw: + jsr Blank + jsr DrawEvent + jsr ResetScroll +IncEventDone: + rts + +DecEvent: + dec event + lda event + cmp #$FF + bne DecEventDraw + inc event + jmp DecEventDone +DecEventDraw: + jsr Blank + jsr DrawEvent + jsr ResetScroll +DecEventDone: + rts + +;;;;;;;;;; +;; +;; Game Main Loop +;; +;;;;;;;;;; + + +;; Game Main Loop +NMI: + jsr IncCentiseconds + jsr DrawRunTime + inc frame + jsr PressStartBlink + jsr Draw + jsr ResetScroll + jsr Update + rti + +Update: + jsr LatchController + jsr PollController + lda title + bne UpdateTitle + jsr CheckA + jsr CheckB + jsr CheckLeft + jsr CheckRight + jsr CheckUp + jsr CheckDown + jsr CheckSelect + jmp UpdateDone +UpdateTitle: + jsr CheckKonamiCode +UpdateDone: + jsr CheckStart + rts + +CheckKonamiCode: + lda #$00 + sta (code + 1) + jsr CheckCodeUp + jsr CheckCodeDown + jsr CheckCodeLeft + jsr CheckCodeRight + jsr CheckCodeB + jsr CheckCodeA + jsr CheckCodeOtherButtons + rts + +CheckCodeUp: + lda controller + cmp #(BUTTON_UP) + beq CheckCodeUpProcessStart + jmp CheckCodeUpDone +CheckCodeUpProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckCodeUpDone + cmp #(BUTTON_UP) + beq CheckCodeUpDone + lda code + cmp #$01 + beq CheckCodeUpIncCode + cmp #$02 + beq CheckCodeUpDone + lda #$01 + sta code + inc (code + 1) + jmp CheckCodeUpDone +CheckCodeUpIncCode: + inc code + inc (code + 1) +CheckCodeUpDone: + rts + +CheckCodeDown: + lda controller + cmp #(BUTTON_DOWN) + beq CheckCodeDownProcessStart + jmp CheckCodeDownDone +CheckCodeDownProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckCodeDownDone + cmp #(BUTTON_DOWN) + beq CheckCodeDownDone + lda code + cmp #$02 + beq CheckCodeDownIncCode + cmp #$03 + beq CheckCodeDownIncCode + lda #$00 + sta code + jmp CheckCodeDownDone +CheckCodeDownIncCode: + inc code + inc (code + 1) +CheckCodeDownDone: + rts + +CheckCodeLeft: + lda controller + cmp #(BUTTON_LEFT) + beq CheckCodeLeftProcessStart + jmp CheckCodeLeftDone +CheckCodeLeftProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckCodeLeftDone + cmp #(BUTTON_LEFT) + beq CheckCodeLeftDone + lda code + cmp #$04 + beq CheckCodeLeftIncCode + cmp #$06 + beq CheckCodeLeftIncCode + lda #$00 + sta code + jmp CheckCodeLeftDone +CheckCodeLeftIncCode: + inc code + inc (code + 1) +CheckCodeLeftDone: + rts + +CheckCodeRight: + lda controller + cmp #(BUTTON_RIGHT) + beq CheckCodeRightProcessStart + jmp CheckCodeRightDone +CheckCodeRightProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckCodeRightDone + cmp #(BUTTON_RIGHT) + beq CheckCodeRightDone + lda code + cmp #$05 + beq CheckCodeRightIncCode + cmp #$07 + beq CheckCodeRightIncCode + lda #$00 + sta code + jmp CheckCodeRightDone +CheckCodeRightIncCode: + inc code + inc (code + 1) +CheckCodeRightDone: + rts + +CheckCodeB: + lda controller + cmp #(BUTTON_B) + beq CheckCodeBProcessStart + jmp CheckCodeBDone +CheckCodeBProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckCodeBDone + cmp #(BUTTON_B) + beq CheckCodeBDone + lda code + cmp #$08 + beq CheckCodeBIncCode + lda #$00 + sta code + jmp CheckCodeBDone +CheckCodeBIncCode: + inc code + inc (code + 1) +CheckCodeBDone: + rts + +CheckCodeA: + lda controller + cmp #(BUTTON_A) + beq CheckCodeAProcessStart + jmp CheckCodeADone +CheckCodeAProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckCodeADone + cmp #(BUTTON_A) + beq CheckCodeADone + lda code + cmp #$09 + bne CheckCodeAResetCode + lda #$00 + sta code + lda hydration + eor #$01 + sta hydration + jsr Blank + jsr DrawKonamiTop + jsr ResetScroll +CheckCodeAResetCode: + lda #$00 + sta code + sta (code + 1) +CheckCodeADone: + rts + +CheckCodeOtherButtons: + ldx #$08 + ldy #$00 +CheckCodeOtherButtonsLoop: + dex + beq CheckCodeOtherButtonsContinue + rol + bcc CheckCodeOtherButtonsLoop + iny + jmp CheckCodeOtherButtonsLoop +CheckCodeOtherButtonsContinue + cpy #$02 + bcc CheckCodeOtherButtonsDone + beq CheckCodeOtherButtonsDone + lda (code + 1) + bne CheckCodeOtherButtonsDone + lda #$00 + sta code +CheckCodeOtherButtonsDone: + rts + +IncMl: + lda #$00 + sta tmp + dec mlcountdown + bne IncMlDone + lda #$03 + sta mlcountdown + dec ozcountdown + bne IncMlNotNewOz + lda #$1e + sta ozcountdown + jsr IncOz +IncMlNotNewOz: + inc (mliters + 5) + lda (mliters + 5) + cmp #$0A + bne IncMlDrawWater + lda #$00 + sta (mliters + 5) + inc (mliters + 4) + lda (mliters + 4) + cmp #$0A + bne IncMlDrawWater + lda #$00 + sta (mliters + 4) + inc (mliters + 3) + lda (mliters + 3) + cmp #$0A + bne IncMlDrawWater + lda #$00 + sta (mliters + 3) + inc (mliters + 2) + lda (mliters + 2) + cmp #$0A + bne IncMlDrawWater + lda #$00 + sta (mliters + 2) + inc (mliters + 1) + lda (mliters + 1) + cmp #$0A + bne IncMlDrawWater + lda #$00 + sta (mliters + 1) + inc mliters +IncMlDrawWater: + lda title + beq IncMlDone + jsr DrawWater +IncMlDone: + rts + +IncOz: + inc (ounces + 3) + lda (ounces + 3) + cmp #$0A + bne IncOzDone + lda #$00 + sta (ounces + 3) + inc (ounces + 2) + lda (ounces + 2) + cmp #$0A + bne IncOzDone + lda #$00 + sta (ounces + 2) + inc (ounces + 1) + lda (ounces + 1) + cmp #$0A + bne IncOzDone + sta (ounces + 1) + inc ounces +IncOzDone: + rts + +IncCentiseconds: + jsr CheckFullTimer + cpx #$01 + bne IncCentisecondsContinue + jmp IncCentisecondsDone +IncCentisecondsContinue + lda fps + cmp #60 + beq IncCentisecondsNTSC + inc (timercentiseconds + 1) + inc (timercentiseconds + 1) + lda (timercentiseconds + 1) + cmp #$0A + beq NewCentisecond + jmp IncCentisecondsDone +NewCentisecond: + lda #$00 + sta (timercentiseconds + 1) + inc timercentiseconds + lda timercentiseconds + cmp #$0A + bne IncCentisecondsDone + lda #$00 + sta timercentiseconds + jsr IncTimer + jmp IncCentisecondsDone +IncCentisecondsNTSC: + inc (timercentiseconds + 1) + lda (timercentiseconds + 1) + cmp #$0A + bne IncCentisecondsNotNewTens + lda #$00 + sta (timercentiseconds + 1) + inc timercentiseconds + lda timercentiseconds + cmp #$0A + bne IncCentisecondsDone + lda #$00 + sta timercentiseconds + jsr IncTimer + jmp IncCentisecondsDone +IncCentisecondsNotNewTens: + lda (timercentiseconds + 1) + cmp #$01 + beq IncCentisecondsDone + inc (timercentiseconds + 1) +IncCentisecondsDone: + rts + +CheckFullTimer: + ldx #$00 + lda #$09 + ldy #$05 + cmp timerhours + bne CheckFullTimerDone + cmp (timerhours + 1) + bne CheckFullTimerDone + cmp (timerhours + 2) + bne CheckFullTimerDone + cpy timerminutes + bne CheckFullTimerDone + cmp (timerminutes + 1) + bne CheckFullTimerDone + cpy timerseconds + bne CheckFullTimerDone + cmp (timerseconds + 1) + bne CheckFullTimerDone + cmp timercentiseconds + bne CheckFullTimerDone + lda #09 + ldy fps + cpy #60 + beq CheckFullTimerNTSC + lda #$08 +CheckFullTimerNTSC: + cmp (timercentiseconds + 1) + bne CheckFullTimerDone + ldx #$01 +CheckFullTimerDone: + rts + +DrawBlankScreen: + lda #$20 + sta $2006 + lda #$00 + sta $2006 + ldx #$00 + ldy #$04 + lda #$00 +DrawBlankScreenLoop: + sta $2007 + inx + bne DrawBlankScreenLoop + dey + bne DrawBlankScreenLoop + rts + +IncTimer: + inc (timerseconds + 1) + lda (timerseconds + 1) + cmp #$0A + bne IncTimerDone + lda #$00 + sta (timerseconds + 1) + inc timerseconds + jsr IncMl + lda timerseconds + cmp #$06 + bne IncTimerDone + lda #$00 + sta timerseconds + inc (timerminutes + 1) + lda (timerminutes + 1) + cmp #$0A + bne IncTimerDone + lda #$00 + sta (timerminutes + 1) + inc timerminutes + lda timerminutes + cmp #$06 + bne IncTimerDone + lda #$00 + sta timerminutes + inc (timerhours + 2) + lda (timerhours + 2) + cmp #$0A + bne IncTimerDone + lda #$00 + sta (timerhours + 2) + inc (timerhours + 1) + lda (timerhours + 1) + cmp #$0A + bne IncTimerDone + lda #$00 + sta (timerhours + 1) + inc timerhours + lda timerhours + cmp #$0A + bne IncTimerDone + lda #$09 + sta timercentiseconds + sta (timercentiseconds + 1) + sta timerhours + sta (timerhours + 1) + sta (timerhours + 2) + sta (timerminutes + 1) + sta (timerseconds + 1) + lda #$05 + sta timerminutes + sta timerseconds +IncTimerDone: + rts + + + + +;;;;;;;;;; +;; +;; Draw Blank and Update +;; +;;;;;;;;;; + +;set up and enable NMI +EnableNMI: + lda nmi + sta $2000 + rts + +SetNMI: + lda #$01 + sta title + lda #%10010000 + sta nmi + rts + +;set up the PPU +Draw: + lda #%00001110 + sta $2001 + rts + +DisableNMI: + lda #$00 + sta $2000 + rts + +Blank: + lda #$00 + sta visible + sta $2001 + jsr DisableNMI + rts + +SetPalette: + lda #$3F + sta $2006 + lda #$00 + sta $2006 + ldx #$08 +SetPaletteLoop: + lda #$21 + sta $2007 + lda #$00 + sta $2007 + lda #$30 + sta $2007 + sta $2007 + dex + bne SetPaletteLoop + rts + + +;;;;;;;;;; +;; +;; Controller Handling +;; +;;;;;;;;;; + +;; Tell both controllers to latch buttons +LatchController: + lda #$01 + sta $4016 + lda #$00 + sta $4016 ;Sending 01 then 00 to $4016 strobes the controllers for input values + rts + +;;Get button presses from both controllers +PollController: + ldx controller + stx controllerLastFrame + ldx #$08 +PollControllerLoop: + lda $4016 + lsr A + rol controller +PollControllerEnd: + dex + bne PollControllerLoop + rts + +CheckA: + lda controller + cmp #(BUTTON_A) + beq CheckAProcessStart + jmp CheckADone +CheckAProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckADone + cmp #(BUTTON_A) + beq CheckADone + lda select + beq CheckADone + jsr SetEvent +CheckADone: + rts + +CheckB: + lda controller + cmp #(BUTTON_B) + beq CheckBProcessStart + jmp CheckBDone +CheckBProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckBDone + cmp #(BUTTON_B) + beq CheckBDone + lda select + beq CheckBDone + lda #$00 + sta select + jsr Blank + jsr DrawEvent + jsr ResetScroll +CheckBDone: + rts + +CheckDown: + lda controller + cmp #(BUTTON_DOWN) + beq CheckDownProcessStart + jmp CheckDownDone +CheckDownProcessStart: + lda controllerLastFrame + cmp #$FF + bne CheckDownProcessStartContinue + jmp CheckDownDone + lda controllerLastFrame + cmp #$FF + bne CheckDownProcessStartContinue + jmp CheckDownDone +CheckDownProcessStartContinue: + cmp #(BUTTON_DOWN) + beq CheckDownDone + lda select + beq CheckDownDone + lda selectoption + bne CheckDownNotSelectOption0 + dec day2 + lda day2 + cmp #$FF + bne CheckDownDrawSelect + inc day2 + jmp CheckDownDrawSelect +CheckDownNotSelectOption0: + cmp #$01 + bne CheckDownNotSelectOption1 + dec hour2 + lda hour2 + cmp #$FF + bne CheckDownHourNotWrap + lda #$23 + sta hour2 +CheckDownHourNotWrap: + jmp CheckDownDrawSelect +CheckDownNotSelectOption1: + cmp #$02 + bne CheckDownDrawSelect + lda hour2 + cmp #13 + bcs CheckDownNotAM + clc + adc #12 + sta hour2 + cmp #24 + bne CheckDownDrawSelect + lda #$00 + sta hour2 + jmp CheckDownDrawSelect +CheckDownNotAM: + sec + sbc #12 + sta hour2 + jmp CheckDownDrawSelect +CheckDownDrawSelect: + lda day + sta tmp2 + lda hour + sta (tmp2 + 1) + lda day2 + sta day + lda hour2 + sta hour + lda selectoption + bne CheckDownOption1 + jsr DrawDateSelect + jmp CheckDownOptionsDone +CheckDownOption1: + cmp #$01 + bne CheckDownOption2 + jsr DrawHourSelect + jmp CheckDownOptionsDone +CheckDownOption2: + jsr DrawAMPMSelect +CheckDownOptionsDone: + + lda tmp2 + sta day + lda (tmp2 + 1) + sta hour + jsr ResetScroll +CheckDownDone: + rts + +CheckUp: + lda controller + cmp #(BUTTON_UP) + beq CheckUpProcessStart + jmp CheckUpDone +CheckUpProcessStart: + lda controllerLastFrame + cmp #$FF + bne CheckUpProcessStartContinue + lda controllerLastFrame + cmp #$FF + bne CheckUpProcessStartContinue + jmp CheckUpDone +CheckUpProcessStartContinue: + cmp #(BUTTON_UP) + beq CheckUpDone + lda select + beq CheckUpDone + lda selectoption + bne CheckUpNotSelectOption0 + inc day2 + lda day2 + cmp #$08 + bne CheckUpDrawSelect + dec day2 + jmp CheckUpDrawSelect +CheckUpNotSelectOption0: + cmp #$01 + bne CheckUpNotSelectOption1 + inc hour2 + lda hour2 + cmp #24 + bne CheckUpHourNotWrap + lda #$00 + sta hour2 +CheckUpHourNotWrap: + jmp CheckUpDrawSelect +CheckUpNotSelectOption1: + cmp #$02 + bne CheckUpDrawSelect + lda hour2 + cmp #13 + bcs CheckUpNotAM + clc + adc #12 + sta hour2 + cmp #24 + bne CheckUpDrawSelect + lda #$00 + sta hour2 + jmp CheckUpDrawSelect +CheckUpNotAM: + sec + sbc #12 + sta hour2 + jmp CheckUpDrawSelect +CheckUpDrawSelect: + lda day + sta tmp2 + lda hour + sta (tmp2 + 1) + lda day2 + sta day + lda hour2 + sta hour + lda selectoption + bne CheckUpOption1 + jsr DrawDateSelect + jmp CheckUpOptionsDone +CheckUpOption1: + cmp #$01 + bne CheckUpOption2 + jsr DrawHourSelect + jmp CheckUpOptionsDone +CheckUpOption2: + jsr DrawAMPMSelect +CheckUpOptionsDone: + lda tmp2 + sta day + lda (tmp2 + 1) + sta hour + jsr ResetScroll +CheckUpDone: + rts + +CheckLeft: + lda controller + cmp #(BUTTON_LEFT) + beq CheckLeftProcessStart + jmp CheckLeftDone +CheckLeftProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckLeftDone + lda select + beq CheckLeftNotSelect + lda controllerLastFrame + cmp #(BUTTON_LEFT) + beq CheckLeftDone + dec selectoption + lda selectoption + cmp #$FF + bne CheckLeftSelectOptionNotWrap + lda #$02 + sta selectoption +CheckLeftSelectOptionNotWrap: + jsr DrawSelectCursor + jsr ResetScroll + jmp CheckLeftDone +CheckLeftNotSelect: + lda controllerLastFrame + and #(BUTTON_LEFT) + bne CheckLeftLeftHeld + lda #$00 + sta heldframes + lda fps + lsr + sta heldframesmax + jsr DecEvent + jmp CheckLeftDone +CheckLeftLeftHeld: + inc heldframes + lda heldframes + cmp heldframesmax + bne CheckLeftDone + lda fps + cmp #60 + bne CheckLeftNotNTSC + lda #06 + jmp CheckLeftRegionDone +CheckLeftNotNTSC: + lda #05 +CheckLeftRegionDone: + sta heldframesmax + lda #$00 + sta heldframes + jsr DecEvent +CheckLeftDone: + rts + +CheckRight: + lda controller + cmp #(BUTTON_RIGHT) + beq CheckRightProcessStart + jmp CheckRightDone +CheckRightProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckRightDone + lda select + beq CheckRightNotSelect + lda controllerLastFrame + cmp #(BUTTON_RIGHT) + beq CheckRightDone + inc selectoption + lda selectoption + cmp #$03 + bne CheckRightSelectOptionNotWrap + lda #$00 + sta selectoption +CheckRightSelectOptionNotWrap: + jsr DrawSelectCursor + jsr ResetScroll + jmp CheckRightDone +CheckRightNotSelect: + lda controllerLastFrame + and #(BUTTON_RIGHT) + bne CheckRightRightHeld + lda #$00 + sta heldframes + lda fps + lsr + sta heldframesmax + jsr IncEvent + jmp CheckRightDone +CheckRightRightHeld: + inc heldframes + lda heldframes + cmp heldframesmax + bne CheckRightDone + lda fps + cmp #60 + bne CheckRightNotNTSC + lda #06 + jmp CheckRightRegionDone +CheckRightNotNTSC: + lda #05 +CheckRightRegionDone: + sta heldframesmax + lda #$00 + sta heldframes + jsr IncEvent +CheckRightDone: + rts + +CheckStart: + lda controller + cmp #(BUTTON_START) + beq CheckStartProcessStart + jmp CheckStartDone +CheckStartProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckStartDone + cmp #(BUTTON_START) + beq CheckStartDone + lda title + beq CheckStartOnTitle + lda #$00 + sta event + jsr Blank + lda #$00 + sta title + lda #%10001000 + sta nmi + jsr DrawBlankScreen + jsr DrawEvent + jsr ResetScroll + jmp CheckStartDone +CheckStartOnTitle: + lda select + bne CheckStartOnSelect + jsr Blank + lda #$01 + sta title + lda #%10010000 + sta nmi + jsr DrawBlankScreen + jsr DrawTitleScreen + jsr ResetScroll + jmp CheckStartDone +CheckStartOnSelect: + jsr SetEvent +CheckStartDone: + rts + +CheckSelect: + lda controller + cmp #(BUTTON_SELECT) + beq CheckSelectProcessStart + jmp CheckSelectDone +CheckSelectProcessStart: + lda controllerLastFrame + cmp #$FF + beq CheckSelectDone + cmp #(BUTTON_SELECT) + beq CheckSelectDone + lda select + bne CheckSelectDone + jsr DrawSelect +CheckSelectDone: + rts + +DrawSelect: + jsr Blank + lda #$00 + sta selectoption + lda #$01 + sta select + lda day + sta tmp2 + lda hour + sta (tmp2 + 1) + lda day + sta day2 + lda hour + sta hour2 + jsr DrawSelectFrame + jsr DrawDateSelect + jsr DrawHourSelect + jsr DrawAMPMSelect + jsr ClearControls + jsr DrawSelectControls + jsr DrawSelectCursor + jsr ResetScroll + rts + +DrawSelectCursor: + lda #$21 + sta $2006 + lda #$8C + sta $2006 + lda selectoption + bne DrawSelectCursorTopNot0 + lda #$01 + sta $2007 + jmp DrawSelectCursorTop0Done +DrawSelectCursorTopNot0: + lda #$00 + sta $2007 +DrawSelectCursorTop0Done: + lda #$21 + sta $2006 + lda #$B3 + sta $2006 + lda selectoption + cmp #$01 + bne DrawSelectCursorTopNot1 + lda #$01 + sta $2007 + jmp DrawSelectCursorTop1Done +DrawSelectCursorTopNot1: + lda #$00 + sta $2007 +DrawSelectCursorTop1Done: + lda #$00 + sta $2007 + lda selectoption + cmp #$02 + bne DrawSelectCursorTopNot2 + lda #$01 + sta $2007 + jmp DrawSelectCursorTop2Done +DrawSelectCursorTopNot2: + lda #$00 + sta $2007 +DrawSelectCursorTop2Done: + lda #$21 + sta $2006 + lda #$EC + sta $2006 + lda selectoption + bne DrawSelectCursorBottomNot0 + lda #$02 + sta $2007 + jmp DrawSelectCursorBottom0Done +DrawSelectCursorBottomNot0: + lda #$00 + sta $2007 +DrawSelectCursorBottom0Done: + lda #$00 + sta $2007 + sta $2007 + sta $2007 + sta $2007 + sta $2007 + sta $2007 + lda selectoption + cmp #$01 + bne DrawSelectCursorBottomNot1 + lda #$02 + sta $2007 + jmp DrawSelectCursorBottom1Done +DrawSelectCursorBottomNot1: + lda #$00 + sta $2007 +DrawSelectCursorBottom1Done: + lda #$00 + sta $2007 + lda selectoption + cmp #$02 + bne DrawSelectCursorBottomNot2 + lda #$02 + sta $2007 + jmp DrawSelectCursorBottom2Done +DrawSelectCursorBottomNot2: + lda #$00 + sta $2007 +DrawSelectCursorBottom2Done: + rts + + +ResetScroll: + lda #$00 + sta visible + inc visible + sta $2005 + sta $2005 ;Reset scroll by passing #$0000 to $2005 + jsr EnableNMI + rts + +DrawEventFrame: + lda #$20 + sta $2006 + sta tmpaddr + lda #$83 + sta $2006 + sta (tmpaddr + 1) + lda #$60 + sta $2007 + ldx #$18 +DrawEventFrameTopEdgeLoop: + lda #$61 + sta $2007 + dex + bne DrawEventFrameTopEdgeLoop + lda #$62 + sta $2007 + ldy #$12 +DrawEventFrameLeftRightEdgeLoop: + lda (tmpaddr + 1) + clc + adc #$20 + sta (tmpaddr + 1) + lda tmpaddr + adc #$00 + sta tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #$70 + sta $2007 + ldx #$18 +DrawEventFrameLeftRightCenterLoop: + lda #$00 + sta $2007 + dex + bne DrawEventFrameLeftRightCenterLoop + lda #$72 + sta $2007 + dey + bne DrawEventFrameLeftRightEdgeLoop + lda (tmpaddr + 1) + clc + adc #$20 + sta (tmpaddr + 1) + lda tmpaddr + adc #$00 + sta tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #$80 + sta $2007 + ldx #$18 +DrawEventFrameBottomEdgeLoop: + lda #$81 + sta $2007 + dex + bne DrawEventFrameBottomEdgeLoop + lda #$82 + sta $2007 + rts + +GetStartTime: + lda #<(StartTimesData) + sta addr + lda #>(StartTimesData) + sta (addr + 1) + ldx #$03 + ldy event +GetStartTimeOffsetLoop: + dey + cpy #$FF + beq GetStartTimeOffsetLoopDone + jsr IncAddrByX + jmp GetStartTimeOffsetLoop +GetStartTimeOffsetLoopDone: + ldy #$00 + lda (addr), y + sta day + iny + lda (addr), y + sta hour + iny + lda (addr), y + sta minute + rts + +GetUncompressedData: + ldx event + stx tmp + ldy #$00 +GetUncompressedDataLoop: + ldx tmp + dex + cpx #$FF + beq GetUncompressedDataLoopDone + lda (addr), Y + tax + inx + jsr IncAddrByX + dec tmp + jmp GetUncompressedDataLoop +GetUncompressedDataLoopDone: + lda (addr), Y + sta tmp + rts + + +GetGameTitle: + lda #<(GamesData) + sta addr + lda #>(GamesData) + sta (addr + 1) + jsr GetUncompressedData + lda #TEXT_WIDTH + sta textwidth + jsr GetLineWraps + dec tmp + jsr PrintGameTitle + rts + +GetCategory: + lda #<(CategoriesData) + sta addr + lda #>(CategoriesData) + sta (addr + 1) + jsr GetUncompressedData + lda #TEXT_WIDTH + sta textwidth + jsr GetLineWraps + dec tmp + jsr PrintCategory + rts + +GetConsole: + lda #<(ConsolesData) + sta addr + lda #>(ConsolesData) + sta (addr + 1) + jsr GetUncompressedData + lda tmp + beq GetConsoleDone + lda #TEXT_WIDTH + sta textwidth + jsr GetLineWraps + dec tmp + jsr PrintConsole +GetConsoleDone + rts + +GetRunners: + lda #<(RunnersData) + sta addr + lda #>(RunnersData) + sta (addr + 1) + jsr GetUncompressedData + lda #TEXT_WIDTH + sta textwidth + jsr GetLineWraps + dec tmp + jsr PrintRunners + rts + +GetAnnouncer: + lda #<(AnnouncersData) + sta addr + lda #>(AnnouncersData) + sta (addr + 1) + jsr GetUncompressedData + lda #ANNOUNCER_WIDTH + sta textwidth + jsr GetLineWraps + dec tmp + jsr PrintAnnouncer + rts + +GetRunTime: + lda #<(RunTimesData) + sta addr + lda #>(RunTimesData) + sta (addr + 1) + jsr GetRunTimeData + dec tmp + jsr PrintRunTime + rts + +GetRunTimeData: + ldy event + ldx #$03 +GetRunTimeDataLoop: + cpy #$00 + beq GetRunTimeDataLoopDone + jsr IncAddrByX + dey + jmp GetRunTimeDataLoop +GetRunTimeDataLoopDone: + rts + + + +IncTmpAddrByX: + txa + clc + adc (tmpaddr + 1) + sta (tmpaddr + 1) + lda tmpaddr + adc #$00 + sta tmpaddr + rts + +IncAddrByX: + txa + clc + adc addr + sta addr + lda (addr + 1) + adc #$00 + sta (addr + 1) + rts + + +PrintGameTitle: + lda #$20 + sta tmpaddr + lda #$C5 + sta (tmpaddr + 1) + jsr PrintData + rts + +PrintRunners: + ldx #$60 + jsr IncTmpAddrByX + jsr PrintData + rts + +PrintCategory: + ldx #$40 + jsr IncTmpAddrByX + jsr PrintData + rts + +PrintConsole: + ldx #$40 + jsr IncTmpAddrByX + jsr PrintData + rts + +PrintRunTime: + ldx #$3E + jsr IncTmpAddrByX + lda tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #$E5 + sta $2007 + lda #$00 + sta $2007 + ldy #$00 + sty tmp2 + lda (addr), y + sta minute + jsr GenerateMinuteNumber + lda (tmp + 1) + cmp #$30 + beq DrawRunTimeSkipHour + inc tmp2 + sta $2007 + lda #$3A + sta $2007 +DrawRunTimeSkipHour: + iny + lda (addr), y + sta minute + jsr GenerateMinuteNumber + lda tmp + cmp #$30 + bne DrawRunTimeMinuteNot10sZero + lda tmp2 + beq DrawRunTimeSkip10sMinute +DrawRunTimeMinuteNot10sZero: + lda tmp + sta $2007 +DrawRunTimeSkip10sMinute: + lda (tmp + 1) + sta $2007 + lda #$3A + sta $2007 + iny + lda (addr), y + sta minute + jsr GenerateMinuteNumber + lda tmp + sta $2007 + lda (tmp + 1) + sta $2007 + lda #<(PrototypeData) + sta addr + lda #>(PrototypeData) + sta (addr + 1) + ldy #$00 + lda (addr), Y + tax +DrawRunTimePrototypeLoop: + dex + bmi DrawRunTimePrototypeLoopDone + iny + lda (addr), Y + sta $2007 + jmp DrawRunTimePrototypeLoop +DrawRunTimePrototypeLoopDone + rts + +PrintAnnouncer: + ldx #$60 + jsr IncTmpAddrByX + lda tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #$E4 + sta $2007 + lda #$00 + sta $2007 + ldx #$02 + jsr IncTmpAddrByX + jsr PrintData + rts + +PrintData: + ldx #$00 + ldy #$00 + iny +PrintDataLoopNewLine: + lda tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + inc textsplit, x +PrintDataLoop: + dey + cpy tmp + beq PrintDataDone + iny + dec textsplit, x + lda textsplit, x + beq PrintDataNewLine + lda (addr), Y + sta $2007 + jmp PrintDataLoopDone +PrintDataNewLine: + lda (addr), Y + cmp #$2F + bne PrintDataNewLineNotSlash + sta $2007 + jmp PrintDataNewLineNotDash +PrintDataNewLineNotSlash: + cmp #$2D + bne PrintDataNewLineNotDash + sta $2007 +PrintDataNewLineNotDash: + stx (tmp + 1) + ldx #$20 + jsr IncTmpAddrByX + ldx (tmp + 1) + inx + iny + jmp PrintDataLoopNewLine +PrintDataLoopDone: + iny + jmp PrintDataLoop +PrintDataDone: + rts + + +GetLineWraps: + ldy #$FF + sty textsplit + sty (textsplit + 1) + sty (textsplit + 2) + sty (textsplit + 3) + ldy #$00 + ldx #$00 + sty textsplittmp + sty (textsplittmp + 1) + inc tmp + iny +GetLineWrapsLoop: + lda (addr), Y + cmp #$20 + bne GetLineWrapsCharacterNotSpace + lda (textsplittmp + 1) + sta textsplittmp + sty (tmp + 1) + jmp GetLineWrapsCharacterNotDash +GetLineWrapsCharacterNotSpace: + cmp #$2F + bne GetLineWrapsCharacterNotSlash + lda (textsplittmp + 1) + cmp textwidth + beq GetLineWrapsCharacterNotSlash + lda (textsplittmp + 1) + sta textsplittmp + sty (tmp + 1) + lda (addr), Y + jmp GetLineWrapsNotFrameWidth +GetLineWrapsCharacterNotSlash: + cmp #$2D + bne GetLineWrapsCharacterNotDash + lda (textsplittmp + 1) + cmp textwidth + beq GetLineWrapsCharacterNotDash + lda (textsplittmp + 1) + sta textsplittmp + sty (tmp + 1) + lda (addr), Y + jmp GetLineWrapsNotFrameWidth +GetLineWrapsCharacterNotDash: + lda (textsplittmp + 1) + cmp textwidth + bne GetLineWrapsNotFrameWidth + lda textsplittmp + sta textsplit, x + lda #$00 + sta textsplittmp + sta (textsplittmp + 1) + inx + ldy (tmp + 1) + jmp GetLineWrapsLoopEnd +GetLineWrapsNotFrameWidth: + inc (textsplittmp + 1) +GetLineWrapsLoopEnd: + iny + cpy tmp + bne GetLineWrapsLoop + rts + +Days: + .byte "SUNMONTUEWEDTHURSFRISATSUN" + +DrawDateTime: + jsr GetStartTime + jsr DrawDate + jsr DrawTime + rts + +DrawDayName: + lda #<(Days) + sta addr + lda #>(Days) + sta (addr + 1) + ldx day + ldy #$00 +DrawDayIncYLoop: + dex + bmi DrawDayIncYLoopDone + cpx #$04 + bne DrawDayIncYLoopXNot4 + iny + iny +DrawDayIncYLoopXNot4: + iny + iny + iny + jmp DrawDayIncYLoop +DrawDayIncYLoopDone: + lda #$20 + sta $2006 + lda #$63 + sta $2006 + ldx day + cpx #$04 + beq DrawDayThurs + ldx #$03 + jmp DrawDayNameLoop +DrawDayThurs: + ldx #$05 +DrawDayNameLoop: + lda (addr), Y + sta $2007 + iny + dex + bne DrawDayNameLoop + rts + + +DrawDateSelect: + jsr DrawDaySelectName + lda #$21 + sta $2006 + lda #$C9 + sta $2006 + lda #$4A + sta $2007 + lda #$55 + sta $2007 + lda #$4E + sta $2007 + lda #$45 + sta $2007 + lda #$00 + sta $2007 + jsr GenerateDateNumber + lda tmp + sta $2007 + lda (tmp + 1) + sta $2007 + rts + +DrawHourSelect: + lda #$21 + sta $2006 + lda #$D2 + sta $2006 + jsr GenerateHourNumber + lda tmp + cmp #$30 + beq DrawHourSelectNotHourTens + sta $2007 + jmp DrawHourSelectDone +DrawHourSelectNotHourTens: + lda #$00 + sta $2007 +DrawHourSelectDone: + lda (tmp + 1) + sta $2007 + lda hour + beq DrawHourSelectDrawAMPM + cmp #23 + beq DrawHourSelectDrawAMPM + cmp #11 + beq DrawHourSelectDrawAMPM + cmp #12 + beq DrawHourSelectDrawAMPM +DrawHourSelectDrawAMPM: + jsr DrawAMPMSelect +DrawHourSelectAMPMDone: + rts + +DrawAMPMSelect: + lda #$21 + sta $2006 + lda #$D5 + sta $2006 + lda hour + cmp #$0C + bcs DrawPMSelect + lda #$41 + sta $2007 + jmp DrawMSelect: +DrawPMSelect: + lda #$50 + sta $2007 +DrawMSelect: + lda #$4D + sta $2007 +DrawDateHourSelectDone: + lda tmp2 + sta day + rts + +DrawDaySelectName: + lda #<(Days) + sta addr + lda #>(Days) + sta (addr + 1) + ldx day2 + ldy #$00 +DrawDaySelectIncYLoop: + dex + bmi DrawDaySelectIncYLoopDone + cpx #$04 + bne DrawDaySelectIncYLoopXNot4 + iny + iny +DrawDaySelectIncYLoopXNot4: + iny + iny + iny + jmp DrawDaySelectIncYLoop +DrawDaySelectIncYLoopDone: + lda #$21 + sta $2006 + lda #$AA + sta $2006 + lda day + cmp #$04 + bne DrawDaySelectStartNotThursday + lda (addr), Y + sta $2007 + iny + lda (addr), Y + sta $2007 + iny + lda (addr), Y + sta $2007 + iny + lda (addr), Y + sta $2007 + iny + lda (addr), Y + sta $2007 + jmp DrawDaySelectDone +DrawDaySelectStartNotThursday: + lda #$00 + sta $2007 + lda (addr), Y + sta $2007 + iny + lda (addr), Y + sta $2007 + iny + lda (addr), Y + sta $2007 + lda #$00 + sta $2007 +DrawDaySelectDone: + rts + +DrawDate: + jsr DrawDayName + lda #$2E + sta $2007 + lda #$00 + sta $2007 + lda #$4A + sta $2007 + lda #$55 + sta $2007 + lda #$4E + sta $2007 + lda #$45 + sta $2007 + lda #$00 + sta $2007 + jsr GenerateDateNumber + lda tmp + sta $2007 + lda (tmp + 1) + sta $2007 + lda day + bne DrawDateNot23rd + lda #$52 + sta $2007 + lda #$44 + jmp DrawDateRDTHDone +DrawDateNot23rd: + lda #$54 + sta $2007 + lda #$48 +DrawDateRDTHDone: + sta $2007 + lda day + cmp #$04 + beq DrawDateDone + lda #$00 + sta $2007 + sta $2007 +DrawDateDone: + rts + +DrawTime: + jsr DrawHour + lda #$3A + sta $2007 + jsr DrawMinute + lda #$00 + sta $2007 + lda hour + cmp #$0C + bcc DrawTimeNotPM + lda #$50 + jmp DrawTimeM +DrawTimeNotPM: + lda #$41 +DrawTimeM: + sta $2007 + lda #$4D + sta $2007 + rts + +DrawHour: + jsr GenerateHourNumber + lda #$20 + sta $2006 + lda #$75 + sta $2006 + lda tmp + cmp #$31 + beq DrawHourNot10 + lda #$00 +DrawHourNot10: + sta $2007 + lda (tmp + 1) + sta $2007 + rts + +DrawMinute: + jsr GenerateMinuteNumber + lda tmp + sta $2007 + lda (tmp + 1) + sta $2007 + rts + +GenerateDateNumber: + lda #$32 + sta tmp + lda #$33 + sta (tmp + 1) + ldx day +GenerateDateIncLoop: + dex + bmi GenerateDateNumberDone + inc (tmp + 1) + lda (tmp + 1) + cmp #$3A + bne GenerateDateIncLoop + lda #$30 + sta (tmp + 1) + inc tmp + jmp GenerateDateIncLoop +GenerateDateNumberDone: + rts + +GenerateHourNumber: + lda #$31 + sta tmp + lda #$32 + sta (tmp + 1) + ldx hour + beq GenerateHourNumberDone + lda #$30 + sta tmp + sta (tmp + 1) +GenerateHourNumberLoop: + dex + bmi GenerateHourNumberDone + inc (tmp + 1) + lda (tmp + 1) + cmp #$3A + bne GenerateHourNumberNotTen + inc tmp + lda #$30 + sta (tmp + 1) +GenerateHourNumberNotTen: + lda (tmp + 1) + cmp #$33 + bne GenerateHourNumberNot12 + lda tmp + cmp #$31 + bne GenerateHourNumberNot12 + lda #$30 + sta tmp + lda #$31 + sta (tmp + 1) +GenerateHourNumberNot12: + jmp GenerateHourNumberLoop +GenerateHourNumberDone: + rts + +GenerateMinuteNumber: + lda #$30 + sta tmp + sta (tmp + 1) + ldx minute +GenerateMinuteNumberLoop: + dex + bmi GenerateMinuteNumberDone + inc (tmp + 1) + lda (tmp + 1) + cmp #$3A + bne GenerateMinuteNumberNotTen + inc tmp + lda #$30 + sta (tmp + 1) +GenerateMinuteNumberNotTen: + jmp GenerateMinuteNumberLoop +GenerateMinuteNumberDone: + rts + +GetEventTotal: + lda #<(EventTotalValue) + sta addr + lda #>(EventTotalValue) + sta (addr + 1) + ldy #$00 + lda (addr), y + sta eventtotal + rts + +DrawControls: + lda #$23 + sta $2006 + lda #$26 + sta $2006 + lda #<(Controls) + sta addr + lda #>(Controls) + sta (addr + 1) + ldy #$00 + ldx #$14 +DrawControlsTopLoop: + lda (addr), y + sta $2007 + iny + dex + bne DrawControlsTopLoop + lda #$23 + sta $2006 + lda #$46 + sta $2006 + ldx #$14 +DrawControlsMiddleLoop: + lda (addr), y + sta $2007 + iny + dex + bne DrawControlsMiddleLoop + lda #$23 + sta $2006 + lda #$66 + sta $2006 + ldx #$14 +DrawControlsBottomLoop: + lda (addr), y + sta $2007 + iny + dex + bne DrawControlsBottomLoop + rts + +DrawSelectControls: + lda #$23 + sta $2006 + lda #$26 + sta $2006 + lda #<(SelectControls) + sta addr + lda #>(SelectControls) + sta (addr + 1) + ldy #$00 + ldx #$14 +DrawSelectControlsTopLoop: + lda (addr), y + sta $2007 + iny + dex + bne DrawSelectControlsTopLoop + lda #$23 + sta $2006 + lda #$46 + sta $2006 + ldx #$14 +DrawSelectControlsMiddleLoop: + lda (addr), y + sta $2007 + iny + dex + bne DrawSelectControlsMiddleLoop + lda #$23 + sta $2006 + lda #$66 + sta $2006 + ldx #$14 +DrawSelectControlsBottomLoop: + lda (addr), y + sta $2007 + iny + dex + bne DrawSelectControlsBottomLoop + rts + +ClearControls: + lda #$23 + sta $2006 + lda #$20 + sta $2006 + lda #$00 + ldx #$60 +ClearControlsLoop: + sta $2007 + dex + bne ClearControlsLoop + rts + +SelectControls: + .byte $00, $00, $E2, "/", $E3, ":MOVE CURSOR " + .byte $00, $00, $E0, "/", $E1, ":CHANGE VALUE " + .byte " START:CONFIRM " + +Controls: + .byte $00, $00, $E2, ":PREV ", $E3, ":NEXT " + .byte "SELECT:SET DATE/TIME" + .byte " START:TITLE SCREEN " + + +SetEvent: + lda #<(StartTimesData) + sta addr + lda #>(StartTimesData) + sta (addr + 1) + lda #$ff + sta event +SetEventLoop: + ldy #$00 + lda event + clc + adc #$01 + cmp eventtotal + beq SetEventDone + inc event + lda (addr), Y + cmp day2 + bcc SetEventLoopDone + beq SetEventLoopContinue + dec event + jmp SetEventDone +SetEventLoopContinue: + iny + lda (addr), Y + cmp hour2 + bcc SetEventLoopDone ; Branch if Addr < hour2 + bne NotHour2 ; Branch if Addr > hour2 + iny + lda (addr), y + beq SetEventDone ; Branch if Addr == 0 + lda event + cmp #$00 + beq SetEventDone + dec event + jmp SetEventDone +NotHour2: + lda event + beq SetEventDone + dec event + jmp SetEventDone +SetEventLoopDone: + ldx #$03 + jsr IncAddrByX + jmp SetEventLoop +SetEventDone: + lda #$00 + sta select + jsr Blank + jsr DrawEvent + jsr ResetScroll + rts + +DrawSelectFrame: + lda #$21 + sta tmpaddr + sta $2006 + lda #$25 + sta (tmpaddr + 1) + sta $2006 + lda #$63 + sta $2007 + lda #$64 + ldy #$14 +DrawSelectFramesTopLoop: + sta $2007 + dey + bne DrawSelectFramesTopLoop + lda #$65 + sta $2007 + ldx #$20 + jsr IncTmpAddrByX + lda tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #<(SetDateTime) + sta addr + lda #>(SetDateTime) + sta (addr + 1) + ldy #$00 +DrawSelectSetDateTimeLoop: + lda (addr), Y + sta $2007 + iny + cpy #$16 + bne DrawSelectSetDateTimeLoop + ldx #$20 + jsr IncTmpAddrByX + ldx #$06 +DrawSelectFrameSidesLoop: + lda tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #$73 + sta $2007 + lda #$00 + ldy #$14 +DrawSelectFrameBlankLoop: + sta $2007 + dey + bne DrawSelectFrameBlankLoop + lda #$73 + sta $2007 + stx tmp + ldx #$20 + jsr IncTmpAddrByX + ldx tmp + dex + bne DrawSelectFrameSidesLoop + lda tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #<(SelectOptions) + sta addr + lda #>(SelectOptions) + sta (addr + 1) + ldy #$00 +DrawSelectOptionsLoop: + lda (addr), Y + sta $2007 + iny + cpy #$16 + bne DrawSelectOptionsLoop + ldx #$20 + jsr IncTmpAddrByX + lda tmpaddr + sta $2006 + lda (tmpaddr + 1) + sta $2006 + lda #$83 + sta $2007 + lda #$64 + ldx #$14 +DrawSelectedBottomLoop: + sta $2007 + dex + bne DrawSelectedBottomLoop + lda #$85 + sta $2007 + rts + +SetDateTime: + .byte $73, " SET DATE/TIME", $73 + +SelectOptions: + .byte $73, " B:BACK A:CONFIRM ", $73 + +HydrationWord: + .byte $14, $15, $16, $17, $13, $12, $18, $19, $1A + +TitleNametable: + .incbin "graphics/title.nam" +PrototypeData: + .incbin "data/prototype.dat" +EventTotalValue: + .incbin "data/runnumber.dat" +AnnouncersData: + .incbin "data/announcers.dat" +CategoriesData: + .incbin "data/categories.dat" +ConsolesData: + .incbin "data/consoles.dat" +GamesData: + .incbin "data/games.dat" +RunnersData: + .incbin "data/runners.dat" +RunTimesData: + .incbin "data/runtimes.dat" +StartTimesData: + .incbin "data/starttimes.dat" + + + .org $E000, $ff + + .incbin "graphics/tileset.chr" ;must be 8192 bytes long +NESCallback: + .dw NMI ;(NMI_Routine) + .dw RESET ;(Reset_Routine) + .dw 0 ;(IRQ_Routine) + + .base $0000 + .incbin "graphics/tileset.chr" ;must be 8192 bytes long + .dw NMI ;(NMI_Routine) + .dw RESET ;(Reset_Routine) + .dw 0 ;(IRQ_Routine)