From 379413709f5c33d05dbc1b123054b0301d7ed23a Mon Sep 17 00:00:00 2001 From: Dagen Brock Date: Thu, 9 Jul 2015 21:47:19 -0500 Subject: [PATCH 1/5] The original v1.0 public release via cicd. github sponsors file --- .github/FUNDING.yml | 2 ++ .github/workflows/main.yml | 58 ++++++++++++++++++++++++++++++++++++ .gitignore | 5 ++++ README.md | 32 +++++++++++++------- assets/flapple_gameplay.png | Bin 0 -> 11591 bytes brun.sh | 19 ++++++++++++ flapple140.po | Bin 143360 -> 0 bytes flapple800.po | Bin 819200 -> 0 bytes make_bootable | 2 ++ make_po.sh | 57 +++++++++++++++++++++++++++++++++++ src/_FileInformation.txt | 2 -- 11 files changed, 164 insertions(+), 13 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/main.yml create mode 100644 assets/flapple_gameplay.png create mode 100755 brun.sh delete mode 100644 flapple140.po delete mode 100644 flapple800.po mode change 100755 => 100644 make_bootable create mode 100755 make_po.sh diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..85e083a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [digarok] +custom: ["https://paypal.me/dagenbrock"] diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..09f1c9a --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,58 @@ +on: [push] + +jobs: + cicd_pipeline: + runs-on: ubuntu-latest + name: Run assembly and disk image CICD pipeline + steps: + # CHECKOUT AND ASSEMBLE ON EVERY PUSH, ANY BRANCH + - uses: actions/checkout@v1 + - name: Install Merlin + uses: digarok/install-merlin32-action@v0.1.0 + + - name: Assemble Source + run: | + merlin32 -V src/flapple.s + sed -i.bak "s/^MONO\(.*\)equ.*/MONO\1equ 1/g" src/flapple.s + merlin32 -V src/flapple.s + sed -i.bak "s/^MONO\(.*\)equ.*/MONO\1equ 0/g" src/flapple.s + + + - name: Install Cadius + uses: digarok/install-cadius-action@v0.1.0 + + - name: Make Bootable ProDOS Image + if: startsWith(github.ref, 'refs/tags/v') + run: ./make_po.sh + + # EVERYTHING BELOW IS ONLY WHEN VERSION TAGS PUSHED (i.e. tag like "v0.1") + - name: Create Release + id: create_release + if: startsWith(github.ref, 'refs/tags/v') + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + + - name: Upload Release Asset - 140KB ProDOS Image + if: startsWith(github.ref, 'refs/tags/v') + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./flapple140.po + asset_name: flapple140.po + asset_content_type: application/octet-stream + - name: Upload Release Asset - 800KB ProDOS Image + if: startsWith(github.ref, 'refs/tags/v') + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./flapple800.po + asset_name: flapple800.po + asset_content_type: application/octet-stream diff --git a/.gitignore b/.gitignore index d245efd..0c6711b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ gsport config.gsport gsos src/PRODOS +PRODOS* +src/*_Output.txt +src/*.system +flapple800.po +flapple140.po diff --git a/README.md b/README.md index d2f84f5..c92a37b 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,28 @@ -flapple -======= +# Flapple Bird Flapple Bird - A de-make of Flappy Bird for the Apple II computer -More information about this project is available at http://dagenbrock.com/flappy +![Flapple Gameplay Image](/assets/flapple_gameplay.png?raw=true "Flapple Bird Gameplay Image") -How to run -========== -You can download either disk image and run it with an emulator or transfer it to the respective media and run it on a real machine (recommended). The 3.5" ProDOS disk version is "flapple800.po", and the 5.25" ProDOS disk version is "flapple140.po". +# Download +💾 **[Download Releases Here](https://github.com/digarok/flapple/releases)** -How to build -============ -This is written to compile on Merlin 8/16, but I believe should work with all later Merlin variants. Load Merlin, then 'L'oad the file "flapple.s", finally hit OpenApple-A to assemble and it should build the "flap.system" file. +# How to run +You can download either disk image and run it with an emulator like [GSplus](https://github.com/digarok/gsplus) or transfer it to the respective media and run it on a real machine (recommended). +- `flapple800.po` is the 3.5" ProDOS disk version (800KB) +- `flapple140.po` is the 5.25" ProDOS disk version (140KB) + +It should automatically boot ProDOS and load the color version of Flapple Bird. There is a Monochrome version of the game included on the disk. To run it, quit with the `q` key, and from the ProDOS selector menu (Bitsy-Bye in 2020) run `fmono.system`. + +# How to build +This was originally written to compile on Merlin 8/16, but it's now maintained using [Merlin32](https://github.com/digarok/merlin32/). + +- Classic Merlin16+ on an Apple IIgs + - Load Merlin, then `L`oad the file "flapple.s", finally hit OpenApple-A to assemble and it should build the "flap.system" file. +- Modern PC builds: + - Assemble with `merlin32 src/flapple.s` + - Make disks with `./make_po.sh` + +Requires having `merlin32` and `cadius` commands available on your system. - -Again, more information about this project is available at http://dagenbrock.com/flappy diff --git a/assets/flapple_gameplay.png b/assets/flapple_gameplay.png new file mode 100644 index 0000000000000000000000000000000000000000..ff3a63395e4f0b393babfbd5e3b31a14a1dd2518 GIT binary patch literal 11591 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 PKSxxRHI?!dtginTJrE1l literal 0 HcmV?d00001 diff --git a/brun.sh b/brun.sh new file mode 100755 index 0000000..70b56f1 --- /dev/null +++ b/brun.sh @@ -0,0 +1,19 @@ +#!/bin/bash +merlin32 -V . src/flapple.s +if [ $? -ne 0 ]; then + echo "Assembly Failed. Exiting." ; exit 1 +fi + + +#second time with different build flags (MONO=1) +sed -i.bak "s/^MONO\(.*\)equ.*/MONO\1equ 1/g" src/flapple.s +merlin32 -V . src/flapple.s +if [ $? -ne 0 ]; then + echo "Assembly Failed. Exiting." ; exit 1 +fi + +#revert file to original state (MONO=0) +sed -i.bak "s/^MONO\(.*\)equ.*/MONO\1equ 0/g" src/flapple.s + +./make_po.sh +gsplus diff --git a/flapple140.po b/flapple140.po deleted file mode 100644 index 68e60a9623860a3805216e84d2ac74c689f1610f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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 AKL7v# diff --git a/flapple800.po b/flapple800.po deleted file mode 100644 index ea860ef31db8f8aaad7349f836e654d375d743f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819200 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 zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA gz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%=b-1R?{Tp#T5? diff --git a/make_bootable b/make_bootable old mode 100755 new mode 100644 index ee37b68..989d660 --- a/make_bootable +++ b/make_bootable @@ -82,6 +82,8 @@ done echo "" echo "" +# Move build log out of source dir to current dir +mv src/*Output.txt . echo "Look, I'm no expert, but I think everything went pretty well. (BUILD SUCCEEDED!!!)" echo "" diff --git a/make_po.sh b/make_po.sh new file mode 100755 index 0000000..f48aeeb --- /dev/null +++ b/make_po.sh @@ -0,0 +1,57 @@ +#!/bin/bash +command -v cadius >/dev/null 2>&1 || { echo "I require CADIUS but it's not installed. Aborting." >&2; exit 1; } + + +SRCFILES=(`ls src/*.s`) +SYSFILES=(`ls PRODOS.2.4.2//PRODOS src/*system`) +SRCDIR=src +BLDDIR=build/ + +DISK="flapple" +CADIUS="cadius" + +if [ ! -d $BLDDIR ] ; then + echo "Build directory for this platform doesn't exist so I will create it." + mkdir -p $BLDDIR ; echo "Created: $BLDDIR" +fi + +# need to autogen +cp src/_FileInformation.txt $BLDDIR + +echo "Creating disk images" +$CADIUS createvolume ${DISK}800.po ${DISK}800 800KB >/dev/null +$CADIUS createvolume ${DISK}140.po ${DISK}140 140KB >/dev/null + +#SYSTEM FILES +echo -n "Processing System files: " +COMMA="" +for f in ${SYSFILES[@]}; +do + FNAME=${f##*/} + echo -n "$COMMA $FNAME" + cp $f $BLDDIR/$FNAME + $CADIUS addfile ${DISK}800.po /${DISK}800/ $BLDDIR/$FNAME >/dev/null + $CADIUS addfile ${DISK}140.po /${DISK}140/ $BLDDIR/$FNAME >/dev/null + COMMA="," +done + +#SOURCE FILES +echo "" +echo -n "Processing Source files: " +COMMA="" +for f in ${SRCFILES[@]}; +do + FNAME=${f##*/} + echo -n "$COMMA $FNAME" + cp $f $BLDDIR/$FNAME + echo "$FNAME=Type(04),AuxType(0000),VersionCreate(24),MinVersion(00),Access(E3)" > $BLDDIR/_FileInformation.txt + $CADIUS sethighbit $BLDDIR/$FNAME >/dev/null + $CADIUS addfile ${DISK}800.po /${DISK}800/ $BLDDIR/$FNAME >/dev/null + $CADIUS addfile ${DISK}140.po /${DISK}140/ $BLDDIR/$FNAME >/dev/null + COMMA="," +done + + +echo "Look, I'm no expert, but I think everything went pretty well. (BUILD SUCCEEDED!!!)" +echo "" +exit diff --git a/src/_FileInformation.txt b/src/_FileInformation.txt index 8cecb27..d04f8e5 100644 --- a/src/_FileInformation.txt +++ b/src/_FileInformation.txt @@ -1,5 +1,3 @@ PRODOS=Type(FF),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) flap.system=Type(FF),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) fmono.system=Type(FF),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) -flap=Type(00),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) -fmono=Type(00),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) From 0f6ac410058e0a848915b564b26cc197b1f72ce0 Mon Sep 17 00:00:00 2001 From: Dagen Brock Date: Tue, 17 Mar 2020 08:13:13 -0500 Subject: [PATCH 2/5] cleanup .bak file --- brun.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/brun.sh b/brun.sh index 70b56f1..47449b7 100755 --- a/brun.sh +++ b/brun.sh @@ -14,6 +14,7 @@ fi #revert file to original state (MONO=0) sed -i.bak "s/^MONO\(.*\)equ.*/MONO\1equ 0/g" src/flapple.s +rm src/flapple.s.bak ./make_po.sh gsplus From 0c8a9a81bb624a8472c534e8e7bb3279629d2409 Mon Sep 17 00:00:00 2001 From: Dagen Brock Date: Tue, 17 Mar 2020 08:15:43 -0500 Subject: [PATCH 3/5] cleanup and new vbl handler --- src/bird.s | 26 +---- src/flapple.s | 292 +++++++++++++++----------------------------------- src/sprite.s | 18 ---- src/vbl.s | 51 +++++++++ 4 files changed, 139 insertions(+), 248 deletions(-) create mode 100644 src/vbl.s diff --git a/src/bird.s b/src/bird.s index 91e46a3..49b2984 100644 --- a/src/bird.s +++ b/src/bird.s @@ -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 - - diff --git a/src/flapple.s b/src/flapple.s index 4d11259..2032fa1 100644 --- a/src/flapple.s +++ b/src/flapple.s @@ -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 diff --git a/src/sprite.s b/src/sprite.s index b68501b..707533f 100644 --- a/src/sprite.s +++ b/src/sprite.s @@ -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 diff --git a/src/vbl.s b/src/vbl.s new file mode 100644 index 0000000..398afa5 --- /dev/null +++ b/src/vbl.s @@ -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 + From 4c7cc709cd07cd279130f8178bf3350436615e98 Mon Sep 17 00:00:00 2001 From: Dagen Brock Date: Thu, 19 Mar 2020 04:04:07 -0500 Subject: [PATCH 4/5] VBL working on IIc --- src/flapple.s | 59 ++-------- src/soundengine.s | 267 ++++++++++++++++++++++------------------------ src/vbl.s | 30 ++++-- 3 files changed, 155 insertions(+), 201 deletions(-) diff --git a/src/flapple.s b/src/flapple.s index 2032fa1..eed0fb0 100644 --- a/src/flapple.s +++ b/src/flapple.s @@ -14,7 +14,7 @@ * 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 +MONO equ 0 DO MONO * MONO VERSION BUILD @@ -74,9 +74,9 @@ AttractLoop jsr DL_WipeIn jsr DrawFlogo lda SongSkipCounter - and #%00000011 ; every 4 times? + and #%00000011 ; throttle to play song every 4 times? bne :noSongForYou - jsr PlayFlappySong ;@todo throttle + jsr SND_PlayFlappySong :noSongForYou inc SongSkipCounter ldx #60 @@ -147,7 +147,7 @@ AttractText db 0 * MAIN GAME LOOP GameLoop - jsr WaitVBL ; wait until we are in vertical blanking period + 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) @@ -170,7 +170,7 @@ GAME_OVER jsr DrawPipes jsr DrawScore jsr DrawSplosion - jsr SND_Static + jsr SND_Crash jsr UpdateHiScore lda #3 sta SPR_Y @@ -230,51 +230,6 @@ HiScreen SongSkipCounter db 0 ; used to throttle how often song is played -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 - bne :spkLoop - rts - - -SND_Static - ldx #$80 ;LENGTH OF NOISE BURST -:spkLoop lda SPEAKER ;TOGGLE SPEAKER - jsr GetRand - tay -:waitLoop dey ;DELAY LOOP FOR PULSE WIDTH - bne :waitLoop - dex ;GET NEXT PULSE OF THIS NOISE BURST - bne :spkLoop - - ldx #$60 ;LENGTH OF NOISE BURST -:spkLoop2 lda SPEAKER ;TOGGLE SPEAKER - jsr GetRand - and #%1000000 - tay - -:waitLoop2 dey ;DELAY LOOP FOR PULSE WIDTH - bne :waitLoop2 - dex ;GET NEXT PULSE OF THIS NOISE BURST - bne :spkLoop2 - - ldx #$80 ;LENGTH OF NOISE BURST -:spkLoop3 lda SPEAKER ;TOGGLE SPEAKER - jsr GetRand - lsr - tay -:waitLoop3 dey ;DELAY LOOP FOR PULSE WIDTH - bne :waitLoop3 - dex ;GET NEXT PULSE OF THIS NOISE BURST - bne :spkLoop3 - - rts HandleInput lda BIRD_Y @@ -506,8 +461,8 @@ WriteRefNum db 0 ; set by open subroutine above WriteResult dw 0 ; result count (amount transferred) -Quit jsr ShutDownVBL ; disable IIc VBL polling if needed - jsr QRPause +Quit jsr QRPause + jsr ShutDownVBL ; disable IIc VBL polling if needed 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) diff --git a/src/soundengine.s b/src/soundengine.s index 9db27cd..d45b7ab 100644 --- a/src/soundengine.s +++ b/src/soundengine.s @@ -1,162 +1,149 @@ +* Flappy's Flapping Chirp Sound +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 + bne :spkLoop + rts -PlayFlappySong - ldy #0 -:loop lda FlappySong,y - cmp #NoteEnd - beq :done - cmp #NoteRest - bne :notRest - ldx FlappySong+1,y - jsr VBlankX - clc - bcc :nextNote -:notRest ldx FlappySong+1,y - jsr SENoteAX - ldx #2 - jsr VBlankX -:nextNote iny - iny - lda KEY ; allow user to skip my totally awesome song - bpl :noKey - sta STROBE - rts -:noKey clc - bcc :loop -:done rts +* Flappy's Devastating Crash Sound +SND_Crash + ldx #$80 ;LENGTH OF NOISE BURST + jsr SEStaticBurst -FlappySong hex 72,22,72,22,56,22,01,0E - hex 72,22,72,22,56,22,01,0E - hex 72,22,72,22,56,22,01,0E - hex 72,22,72,22,80,22,01,0E - hex 72,22,72,22,56,22,01,0E - hex 72,22,72,22,56,22,01,0E - hex 72,22,72,22,4C,22,56,22 - hex 5B,22,72,22,5B,22,56,40 - hex 02 ; end byte + ldx #$60 ;LENGTH OF NOISE BURST +:spkLoop2 lda SPEAKER ;TOGGLE SPEAKER + jsr GetRand + and #%1000000 + tay +:waitLoop2 dey ;DELAY LOOP FOR PULSE WIDTH + bne :waitLoop2 + dex ;GET NEXT PULSE OF THIS NOISE BURST + bne :spkLoop2 + ldx #$80 ;LENGTH OF NOISE BURST + jsr SEStaticBurst + rts + +SEStaticBurst +:spkLoop lda SPEAKER ;TOGGLE SPEAKER + jsr GetRand + tay +:waitLoop dey ;DELAY LOOP FOR PULSE WIDTH + bne :waitLoop + dex ;GET NEXT PULSE OF THIS NOISE BURST + bne :spkLoop + rts + + +* BELOW HERE IS THE "MUSIC ENGINE" +SND_PlayFlappySong + ldy #0 +:loop lda FlappySong,y + cmp #NoteEnd + beq :done + cmp #NoteRest + bne :notRest + ldx FlappySong+1,y + jsr VBlankX + clc + bcc :nextNote +:notRest ldx FlappySong+1,y + jsr SENoteAX + ldx #2 + jsr VBlankX +:nextNote iny + iny + lda KEY ; allow user to skip my totally awesome song + bpl :noKey + sta STROBE + rts +:noKey clc + bcc :loop +:done rts + + +FlappySong hex 72,22,72,22,56,22,01,0E + hex 72,22,72,22,56,22,01,0E + hex 72,22,72,22,56,22,01,0E + hex 72,22,72,22,80,22,01,0E + hex 72,22,72,22,56,22,01,0E + hex 72,22,72,22,56,22,01,0E + hex 72,22,72,22,4C,22,56,22 + hex 5B,22,72,22,5B,22,56,40 + hex 02 ; end byte ************************************************** -* wrapper for SEplayNote +* wrapper for SEplayNote * a = freq ... x = dur ************************************************** -SENoteAX jsr _storeReg - sta _SECURRNOTE - stx _SECURRNOTE+1 - jsr SEplayNote - jsr _loadReg - rts - +SENoteAX jsr _storeReg + sta _SECURRNOTE + stx _SECURRNOTE+1 + jsr SEplayNote + jsr _loadReg + rts ************************************************** -* -************************************************** - ds \ +_SECURRNOTE db 0,0 ; current note being played (frequency/duration) + ds \ ; align SEplayNote - ldy _SECURRNOTE+1 -:loop lda SPEAKER -:whyWut dey - bne :thar - dec _SECURRNOTE+1 - beq :doneThat -:thar dex - bne :whyWut - ldx _SECURRNOTE - jmp :loop -:doneThat rts + ldy _SECURRNOTE+1 +:loop lda SPEAKER +:whyWut dey + bne :thar + dec _SECURRNOTE+1 + beq :doneThat +:thar dex + bne :whyWut + ldx _SECURRNOTE + jmp :loop +:doneThat rts -SEplayNote_OLD -:loop lda SPEAKER -:whyWut dey - bne :thar - dec _SECURRNOTE+1 - beq :doneThat -:thar dex - bne :whyWut - ldx _SECURRNOTE - jmp :loop -:doneThat rts - - -_SECURRNOTE db 0,0 ; current note being played (frequency/duration) ************************************************** * This is essentially the scale ************************************************** -_SE_tones db NoteG0,NoteGsharp0,NoteA0,NoteBflat0,NoteB0 - db NoteC1,NoteCsharp1,NoteD1,NoteDsharp1,NoteE1 - db NoteF1,NoteFsharp1,NoteG1,NoteGsharp1,NoteA1 - db NoteBflat1,NoteB1,NoteC2,NoteCsharp2,NoteD2 - db NoteDsharp2,NoteE2,NoteF2 - -NoteRest equ $01 ;\_ these are inaudible anyway -NoteEnd equ $02 ;/ -NoteG0 equ $00 ; because it loops (underflow) -NoteGsharp0 equ $f0 -NoteA0 equ $e6 -NoteBflat0 equ $d5 -NoteB0 equ $cb ; speculating here on up -NoteC1 equ $c0 -NoteCsharp1 equ $b5 -NoteD1 equ $ac -NoteDsharp1 equ $a3 -NoteE1 equ $99 -NoteF1 equ $90 -NoteFsharp1 equ $89 -NoteG1 equ $80 -NoteGsharp1 equ $79 -NoteA1 equ $72 -NoteBflat1 equ $6c -NoteB1 equ $66 -NoteC2 equ $60 -NoteCsharp2 equ $5b -NoteD2 equ $56 -NoteDsharp2 equ $51 -NoteE2 equ $4c -NoteF2 equ $48 - ; starts to suck here anyway - - -SErandStatic - ldy #$ff -:loop lda SPEAKER - jsr GetRand - tax - beq :next -:wait dex - bne :wait -:next dey - bne :loop - rts - -* y = length -SErandStaticBit -:loop lda SPEAKER - jsr GetRand - lsr - tax - beq :next -:wait dex - bne :wait -:next dey - bne :loop - rts - -* y = length - no shift so wider range -SErandStaticBit2 -:loop lda SPEAKER - jsr GetRand - tax - beq :next -:wait dex - bne :wait -:next dey - bne :loop - rts - +_SE_tones db NoteG0,NoteGsharp0,NoteA0,NoteBflat0,NoteB0 + db NoteC1,NoteCsharp1,NoteD1,NoteDsharp1,NoteE1 + db NoteF1,NoteFsharp1,NoteG1,NoteGsharp1,NoteA1 + db NoteBflat1,NoteB1,NoteC2,NoteCsharp2,NoteD2 + db NoteDsharp2,NoteE2,NoteF2 +NoteRest equ $01 ;\_ these are inaudible anyway +NoteEnd equ $02 ;/ +NoteG0 equ $00 ; because it loops (underflow) +NoteGsharp0 equ $f0 +NoteA0 equ $e6 +NoteBflat0 equ $d5 +NoteB0 equ $cb ; speculating here on up +NoteC1 equ $c0 +NoteCsharp1 equ $b5 +NoteD1 equ $ac +NoteDsharp1 equ $a3 +NoteE1 equ $99 +NoteF1 equ $90 +NoteFsharp1 equ $89 +NoteG1 equ $80 +NoteGsharp1 equ $79 +NoteA1 equ $72 +NoteBflat1 equ $6c +NoteB1 equ $66 +NoteC2 equ $60 +NoteCsharp2 equ $5b +NoteD2 equ $56 +NoteDsharp2 equ $51 +NoteE2 equ $4c +NoteF2 equ $48 + ; starts to suck here anyway diff --git a/src/vbl.s b/src/vbl.s index 398afa5..4afd1db 100644 --- a/src/vbl.s +++ b/src/vbl.s @@ -1,4 +1,7 @@ +OP_BPL = #$10 +OP_BMI = #$30 + SetupVBL lda $FBB3 ; machine id byte (A2Misc TN #7) cmp #$06 ; IIe, IIc, IIgs @@ -11,41 +14,50 @@ SetupVBL 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 + lda #OP_BPL ; BPL opcode + sta __waitRasterOp + lda #$70 + sta __patchVBLIIc+1 + lda #$60 + sta __patchVBLIIc+3 + 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 + rts + +:foundIIe lda #OP_BPL ; BPL opcode sta __waitRasterOp - lda #$30 ; BMI opcode + lda #OP_BMI ; BMI opcode sta __waitVBLOp :foundIIgs rts ShutDownVBL rts ; SMC +:lastVBL bit $C019 + bpl :lastVBL + lda $C070 ; $c019 bit 7 is sticky, reset it 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 +:waitRaster lda $c019 bmi :waitRaster ; make sure we are screen area first, (VBL=0) on IIgs, !SMC IIe/c __waitRasterOp = *-2 -:waitVBL bit $c019 +__patchVBLIIc = * +:waitVBL lda $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 From f1fb6a0deef23df5da558b87b22314ce75e7bd27 Mon Sep 17 00:00:00 2001 From: Dagen Brock Date: Thu, 19 Mar 2020 04:08:32 -0500 Subject: [PATCH 5/5] reformatted all with radius for consistency --- src/applerom.s | 37 +- src/bird.s | 750 ++++++++------- src/dlrlib.s | 1630 ++++++++++++++++--------------- src/numbers.s | 346 +++---- src/pipes.s | 2488 ++++++++++++++++++++++++------------------------ src/readme.s | 38 +- src/sprite.s | 226 ++--- src/util.s | 64 +- 8 files changed, 2782 insertions(+), 2797 deletions(-) diff --git a/src/applerom.s b/src/applerom.s index d54d19b..63e8a14 100644 --- a/src/applerom.s +++ b/src/applerom.s @@ -1,23 +1,24 @@ ************************************************** * Apple Standard Memory Locations ************************************************** -CLRLORES equ $F832 -LORES equ $C050 -TXTSET equ $C051 -MIXCLR equ $C052 -MIXSET equ $C053 -TXTPAGE1 equ $C054 -TXTPAGE2 equ $C055 -KEY equ $C000 -C80STOREOFF equ $C000 -C80STOREON equ $C001 -STROBE equ $C010 -SPEAKER equ $C030 -VBL equ $C02E -RDVBLBAR equ $C019 ;not VBL (VBL signal low +CLRLORES equ $F832 +LORES equ $C050 +TXTSET equ $C051 +MIXCLR equ $C052 +MIXSET equ $C053 +TXTPAGE1 equ $C054 +TXTPAGE2 equ $C055 +KEY equ $C000 +C80STOREOFF equ $C000 +C80STOREON equ $C001 +STROBE equ $C010 +SPEAKER equ $C030 +VBL equ $C02E +RDVBLBAR equ $C019 ;not VBL (VBL signal low + +RAMWRTAUX equ $C005 +RAMWRTMAIN equ $C004 +SETAN3 equ $C05E ;Set annunciator-3 output to 0 +SET80VID equ $C00D ;enable 80-column display mode (WR-only) -RAMWRTAUX equ $C005 -RAMWRTMAIN equ $C004 -SETAN3 equ $C05E ;Set annunciator-3 output to 0 -SET80VID equ $C00D ;enable 80-column display mode (WR-only) diff --git a/src/bird.s b/src/bird.s index 49b2984..16f99be 100644 --- a/src/bird.s +++ b/src/bird.s @@ -1,470 +1,466 @@ -SPRITE_X db 0 -SPRITE_Y db 0 ; BYTE,not pixel. gotta be, sorry -SPRITE_W db 0 -SPRITE_W_D2 db 0 -SPRITE_H db 0 ; <- in bytes +SPRITE_X db 0 +SPRITE_Y db 0 ; BYTE,not pixel. gotta be, sorry +SPRITE_W db 0 +SPRITE_W_D2 db 0 +SPRITE_H db 0 ; <- in bytes -SPRITE_MAIN da 0 -SPRITE_AUX da 0 -SPRITE_MASK da 0 -SPRITE_IMASK da 0 -SPRITE_COLLISION db 0 -SPRITE_Y_IDX dw 0 -SPRITE_X_IDX dw 0 +SPRITE_MAIN da 0 +SPRITE_AUX da 0 +SPRITE_MASK da 0 +SPRITE_IMASK da 0 +SPRITE_COLLISION db 0 +SPRITE_Y_IDX dw 0 +SPRITE_X_IDX dw 0 -SPRITE_SCREEN_P equ $00 -SPRITE_DATA_P equ $02 -SPRITE_SCREEN_P2 equ $02 -SPRITE_AUX_P equ $04 -SPRITE_SCREEN_P3 equ $04 -SPRITE_MASK_P equ $FA -SPRITE_SCREEN_P4 equ $FA -SPRITE_IMASK_P equ $FC +SPRITE_SCREEN_P equ $00 +SPRITE_DATA_P equ $02 +SPRITE_SCREEN_P2 equ $02 +SPRITE_AUX_P equ $04 +SPRITE_SCREEN_P3 equ $04 +SPRITE_MASK_P equ $FA +SPRITE_SCREEN_P4 equ $FA +SPRITE_IMASK_P equ $FC -SPRITE_SCREEN_IDX db #$0 +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) -BIRD_Y_OLD db #BIRD_Y_INIT ; used for undraw - to decouple input routine from sequence -BIRD_FLAP db #0 ; 0=down 1=up -BIRD_FLAP_RATE equ #5 -BIRD_FLAP_CNT 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) +BIRD_Y_OLD db #BIRD_Y_INIT ; used for undraw - to decouple input routine from sequence +BIRD_FLAP db #0 ; 0=down 1=up +BIRD_FLAP_RATE equ #5 +BIRD_FLAP_CNT db 0 ** FlapBird - inc BIRD_FLAP_CNT - lda BIRD_FLAP_CNT - cmp #BIRD_FLAP_RATE - bcs :flapIt - rts + inc BIRD_FLAP_CNT + lda BIRD_FLAP_CNT + cmp #BIRD_FLAP_RATE + bcs :flapIt + rts :flapIt - lda #0 - sta BIRD_FLAP_CNT - inc BIRD_FLAP - lda BIRD_FLAP - cmp #2 - bne :noFlip - lda #0 - sta BIRD_FLAP -:noFlip rts + lda #0 + sta BIRD_FLAP_CNT + inc BIRD_FLAP + lda BIRD_FLAP + cmp #2 + bne :noFlip + lda #0 + sta BIRD_FLAP +:noFlip rts ***** EVEN then ODD, i.e. AUX then MAIN BIRD_WUP_E_PIXEL - DO MONO - hex 00,EA,EA,FF,F0,50,D5,A5,0F,00 - hex AA,EA,EE,CF,CF,D5,55,8A,90,90 - hex 05,AD,A4,08,08,05,5D,51,01,00 - ELSE - hex BB,EA,EA,FF,FB,57,D5,A5,0F,77 - hex AA,EA,EE,CF,CF,D5,55,8A,90,97 - hex B5,AD,A4,B8,B8,75,5D,51,71,77 - FIN + DO MONO + hex 00,EA,EA,FF,F0,50,D5,A5,0F,00 + hex AA,EA,EE,CF,CF,D5,55,8A,90,90 + hex 05,AD,A4,08,08,05,5D,51,01,00 + ELSE + hex BB,EA,EA,FF,FB,57,D5,A5,0F,77 + hex AA,EA,EE,CF,CF,D5,55,8A,90,97 + hex B5,AD,A4,B8,B8,75,5D,51,71,77 + FIN BIRD_WUP_E_MASK - hex FF,00,00,00,0F,0F,00,00,00,FF - hex 00,00,00,00,00,00,00,00,00,0F - hex F0,00,00,F0,F0,F0,00,00,F0,FF + hex FF,00,00,00,0F,0F,00,00,00,FF + hex 00,00,00,00,00,00,00,00,00,0F + hex F0,00,00,F0,F0,F0,00,00,F0,FF BIRD_WUP_E_IMASK - hex 00,FF,FF,FF,F0,F0,FF,FF,FF,00 - hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0 - hex 0F,FF,FF,0F,0F,0F,FF,FF,0F,00 + hex 00,FF,FF,FF,F0,F0,FF,FF,FF,00 + hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0 + hex 0F,FF,FF,0F,0F,0F,FF,FF,0F,00 ***** EVEN then ODD, i.e. AUX then MAIN BIRD_WDN_E_PIXEL - DO MONO - hex 00,EA,EA,FF,F0,50,D5,A5,0F,00 - hex AA,EE,EE,CF,CF,DD,5D,8A,90,90 - hex 54,AE,A4,08,08,5D,55,51,01,00 - ELSE - hex BB,EA,EA,FF,FB,57,D5,A5,0F,77 - hex AA,EE,EE,CF,CF,DD,5D,8A,90,97 - hex 54,AE,A4,B8,B8,5D,55,51,71,77 - FIN + DO MONO + hex 00,EA,EA,FF,F0,50,D5,A5,0F,00 + hex AA,EE,EE,CF,CF,DD,5D,8A,90,90 + hex 54,AE,A4,08,08,5D,55,51,01,00 + ELSE + hex BB,EA,EA,FF,FB,57,D5,A5,0F,77 + hex AA,EE,EE,CF,CF,DD,5D,8A,90,97 + hex 54,AE,A4,B8,B8,5D,55,51,71,77 + FIN BIRD_WDN_E_MASK - hex FF,00,00,00,0F,0F,00,00,00,FF - hex 00,00,00,00,00,00,00,00,00,0F - hex 00,00,00,F0,F0,00,00,00,F0,FF + hex FF,00,00,00,0F,0F,00,00,00,FF + hex 00,00,00,00,00,00,00,00,00,0F + hex 00,00,00,F0,F0,00,00,00,F0,FF BIRD_WDN_E_IMASK - hex 00,FF,FF,FF,F0,F0,FF,FF,FF,00 - hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0 - hex FF,FF,FF,0F,0F,FF,FF,FF,0F,00 + hex 00,FF,FF,FF,F0,F0,FF,FF,FF,00 + hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0 + hex FF,FF,FF,0F,0F,FF,FF,FF,0F,00 ***** EVEN then ODD, i.e. AUX then MAIN BIRD_WUP_O_PIXEL - DO MONO - hex 00,A0,A0,F0,00,00,50,50,F0,00 - hex A0,AE,EE,FF,FF,55,5D,AA,00,00 - hex 5A,DE,4E,8C,8C,5D,D5,18,19,09 - hex 00,0A,0A,00,00,00,05,05,00,00 - ELSE - hex BB,AB,AB,FB,BB,77,57,57,F7,77 - hex AB,AE,EE,FF,FF,55,5D,AA,00,77 - hex 5A,DE,4E,8C,8C,5D,D5,18,19,79 - hex BB,BA,BA,BB,BB,77,75,75,77,77 - - FIN + DO MONO + hex 00,A0,A0,F0,00,00,50,50,F0,00 + hex A0,AE,EE,FF,FF,55,5D,AA,00,00 + hex 5A,DE,4E,8C,8C,5D,D5,18,19,09 + hex 00,0A,0A,00,00,00,05,05,00,00 + ELSE + hex BB,AB,AB,FB,BB,77,57,57,F7,77 + hex AB,AE,EE,FF,FF,55,5D,AA,00,77 + hex 5A,DE,4E,8C,8C,5D,D5,18,19,79 + hex BB,BA,BA,BB,BB,77,75,75,77,77 + FIN BIRD_WUP_O_MASK - hex FF,0F,0F,0F,FF,FF,0F,0F,0F,FF - hex 0F,00,00,00,00,00,00,00,00,FF - hex 00,00,00,00,00,00,00,00,00,F0 - hex FF,F0,F0,FF,FF,FF,F0,F0,FF,FF + hex FF,0F,0F,0F,FF,FF,0F,0F,0F,FF + hex 0F,00,00,00,00,00,00,00,00,FF + hex 00,00,00,00,00,00,00,00,00,F0 + hex FF,F0,F0,FF,FF,FF,F0,F0,FF,FF BIRD_WUP_O_IMASK - hex 00,F0,F0,F0,00,00,F0,F0,F0,00 - hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00 - hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F - hex 00,0F,0F,00,00,00,0F,0F,00,00 + hex 00,F0,F0,F0,00,00,F0,F0,F0,00 + hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00 + hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F + hex 00,0F,0F,00,00,00,0F,0F,00,00 ***** EVEN then ODD, i.e. AUX then MAIN BIRD_WDN_O_PIXEL - DO MONO - hex 00,A0,A0,F0,00,00,50,50,F0,00 - hex A0,EE,EE,FF,FF,D5,DD,AA,00,00 - hex 4A,EE,4E,8C,8C,DD,55,18,19,09 - hex 05,0A,0A,00,00,05,05,05,00,00 - ELSE - hex BB,AB,AB,FB,BB,77,57,57,F7,77 - hex AB,EE,EE,FF,FF,D5,DD,AA,00,77 - hex 4A,EE,4E,8C,8C,DD,55,18,19,79 - hex B5,BA,BA,BB,BB,75,75,75,77,77 - FIN + DO MONO + hex 00,A0,A0,F0,00,00,50,50,F0,00 + hex A0,EE,EE,FF,FF,D5,DD,AA,00,00 + hex 4A,EE,4E,8C,8C,DD,55,18,19,09 + hex 05,0A,0A,00,00,05,05,05,00,00 + ELSE + hex BB,AB,AB,FB,BB,77,57,57,F7,77 + hex AB,EE,EE,FF,FF,D5,DD,AA,00,77 + hex 4A,EE,4E,8C,8C,DD,55,18,19,79 + hex B5,BA,BA,BB,BB,75,75,75,77,77 + FIN BIRD_WDN_O_MASK - hex FF,0F,0F,0F,FF,FF,0F,0F,0F,FF - hex 0F,00,00,00,00,00,00,00,00,FF - hex 00,00,00,00,00,00,00,00,00,F0 - hex F0,F0,F0,FF,FF,F0,F0,F0,FF,FF + hex FF,0F,0F,0F,FF,FF,0F,0F,0F,FF + hex 0F,00,00,00,00,00,00,00,00,FF + hex 00,00,00,00,00,00,00,00,00,F0 + hex F0,F0,F0,FF,FF,F0,F0,F0,FF,FF BIRD_WDN_O_IMASK - hex 00,F0,F0,F0,00,00,F0,F0,F0,00 - hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00 - hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F - hex 0F,0F,0F,00,00,0F,0F,0F,00,00 + hex 00,F0,F0,F0,00,00,F0,F0,F0,00 + hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00 + hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F + hex 0F,0F,0F,00,00,0F,0F,0F,00,00 ** y=line a=height x=col -UndrawBird lda BIRD_Y_OLD - lsr - tay - bne :oddBird -:evenBird lda #3 - bne :continue -:oddBird lda #4 -:continue ldx #BIRD_X - cmp #4 - beq :undraw4 -:undraw3 lda LoLineTableL,y - sta SPRITE_SCREEN_P - lda LoLineTableH,y - sta SPRITE_SCREEN_P+1 - lda LoLineTableL+1,y - sta SPRITE_SCREEN_P2 - lda LoLineTableH+1,y - sta SPRITE_SCREEN_P2+1 - lda LoLineTableL+2,y - sta SPRITE_SCREEN_P3 - lda LoLineTableH+2,y - sta SPRITE_SCREEN_P3+1 +UndrawBird lda BIRD_Y_OLD + lsr + tay + bne :oddBird +:evenBird lda #3 + bne :continue +:oddBird lda #4 +:continue ldx #BIRD_X + cmp #4 + beq :undraw4 +:undraw3 lda LoLineTableL,y + sta SPRITE_SCREEN_P + lda LoLineTableH,y + sta SPRITE_SCREEN_P+1 + lda LoLineTableL+1,y + sta SPRITE_SCREEN_P2 + lda LoLineTableH+1,y + sta SPRITE_SCREEN_P2+1 + lda LoLineTableL+2,y + sta SPRITE_SCREEN_P3 + lda LoLineTableH+2,y + sta SPRITE_SCREEN_P3+1 - txa - pha ; stash - tay ; COL offset - sta TXTPAGE2 - lda #BGCOLORAUX -:wipe1 sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny -:wipe1b sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny -:wipe1c sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny -:wipe1d sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny -:wipe1e sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y + txa + pha ; stash + tay ; COL offset + sta TXTPAGE2 + lda #BGCOLORAUX +:wipe1 sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny +:wipe1b sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny +:wipe1c sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny +:wipe1d sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny +:wipe1e sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y - pla ; unstash - tay - sta TXTPAGE1 - lda #BGCOLOR -:wipe2 sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny + pla ; unstash + tay + sta TXTPAGE1 + lda #BGCOLOR +:wipe2 sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny -:wipe2b sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny -:wipe2c sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny -:wipe2d sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - iny -:wipe2e sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - rts +:wipe2b sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny +:wipe2c sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny +:wipe2d sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + iny +:wipe2e sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + rts -:undraw4 lda LoLineTableL,y - sta SPRITE_SCREEN_P - lda LoLineTableH,y - sta SPRITE_SCREEN_P+1 - lda LoLineTableL+1,y - sta SPRITE_SCREEN_P2 - lda LoLineTableH+1,y - sta SPRITE_SCREEN_P2+1 - lda LoLineTableL+2,y - sta SPRITE_SCREEN_P3 - lda LoLineTableH+2,y - sta SPRITE_SCREEN_P3+1 - lda LoLineTableL+3,y - sta SPRITE_SCREEN_P4 - lda LoLineTableH+3,y - sta SPRITE_SCREEN_P4+1 +:undraw4 lda LoLineTableL,y + sta SPRITE_SCREEN_P + lda LoLineTableH,y + sta SPRITE_SCREEN_P+1 + lda LoLineTableL+1,y + sta SPRITE_SCREEN_P2 + lda LoLineTableH+1,y + sta SPRITE_SCREEN_P2+1 + lda LoLineTableL+2,y + sta SPRITE_SCREEN_P3 + lda LoLineTableH+2,y + sta SPRITE_SCREEN_P3+1 + lda LoLineTableL+3,y + sta SPRITE_SCREEN_P4 + lda LoLineTableH+3,y + sta SPRITE_SCREEN_P4+1 - txa - pha ; stash - tay ; COL offset - sta TXTPAGE2 - lda #BGCOLORAUX -:wipe3 sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe3b sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe3c sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe3d sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe3e sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y + txa + pha ; stash + tay ; COL offset + sta TXTPAGE2 + lda #BGCOLORAUX +:wipe3 sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe3b sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe3c sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe3d sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe3e sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y - pla ; unstash - tay - sta TXTPAGE1 - lda #BGCOLOR -:wipe4 sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe4b sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe4c sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe4d sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - iny -:wipe4e sta (SPRITE_SCREEN_P),y - sta (SPRITE_SCREEN_P2),y - sta (SPRITE_SCREEN_P3),y - sta (SPRITE_SCREEN_P4),y - rts + pla ; unstash + tay + sta TXTPAGE1 + lda #BGCOLOR +:wipe4 sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe4b sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe4c sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe4d sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + iny +:wipe4e sta (SPRITE_SCREEN_P),y + sta (SPRITE_SCREEN_P2),y + sta (SPRITE_SCREEN_P3),y + sta (SPRITE_SCREEN_P4),y + rts DrawBird - lda BIRD_Y - lsr - bcs :oddHeight + lda BIRD_Y + lsr + bcs :oddHeight :evenHeight - sta SPRITE_Y - lda #3 - sta SPRITE_H - lda BIRD_FLAP - beq :flapDownEven -:flapUpEven CopyPtr BIRD_WUP_E_PIXEL;SPRITE_DATA_P - CopyPtr BIRD_WUP_E_MASK;SPRITE_MASK_P - CopyPtr BIRD_WUP_E_IMASK;SPRITE_IMASK_P - jmp :drawSprite -:flapDownEven CopyPtr BIRD_WDN_E_PIXEL;SPRITE_DATA_P - CopyPtr BIRD_WDN_E_MASK;SPRITE_MASK_P - CopyPtr BIRD_WDN_E_IMASK;SPRITE_IMASK_P - jmp :drawSprite + sta SPRITE_Y + lda #3 + sta SPRITE_H + lda BIRD_FLAP + beq :flapDownEven +:flapUpEven CopyPtr BIRD_WUP_E_PIXEL;SPRITE_DATA_P + CopyPtr BIRD_WUP_E_MASK;SPRITE_MASK_P + CopyPtr BIRD_WUP_E_IMASK;SPRITE_IMASK_P + jmp :drawSprite +:flapDownEven CopyPtr BIRD_WDN_E_PIXEL;SPRITE_DATA_P + CopyPtr BIRD_WDN_E_MASK;SPRITE_MASK_P + CopyPtr BIRD_WDN_E_IMASK;SPRITE_IMASK_P + jmp :drawSprite :oddHeight - sta SPRITE_Y - lda #4 - sta SPRITE_H - lda BIRD_FLAP - beq :flapDownOdd -:flapUpOdd CopyPtr BIRD_WUP_O_PIXEL;SPRITE_DATA_P - CopyPtr BIRD_WUP_O_MASK;SPRITE_MASK_P - CopyPtr BIRD_WUP_O_IMASK;SPRITE_IMASK_P - jmp :drawSprite -:flapDownOdd CopyPtr BIRD_WDN_O_PIXEL;SPRITE_DATA_P - CopyPtr BIRD_WDN_O_MASK;SPRITE_MASK_P - CopyPtr BIRD_WDN_O_IMASK;SPRITE_IMASK_P - jmp :drawSprite + sta SPRITE_Y + lda #4 + sta SPRITE_H + lda BIRD_FLAP + beq :flapDownOdd +:flapUpOdd CopyPtr BIRD_WUP_O_PIXEL;SPRITE_DATA_P + CopyPtr BIRD_WUP_O_MASK;SPRITE_MASK_P + CopyPtr BIRD_WUP_O_IMASK;SPRITE_IMASK_P + jmp :drawSprite +:flapDownOdd CopyPtr BIRD_WDN_O_PIXEL;SPRITE_DATA_P + CopyPtr BIRD_WDN_O_MASK;SPRITE_MASK_P + CopyPtr BIRD_WDN_O_IMASK;SPRITE_IMASK_P + jmp :drawSprite :drawSprite - jsr DrawSpriteBetter - rts + jsr DrawSpriteBetter + rts * still does collision DrawSpriteBetter - lda #0 - sta SPRITE_X_IDX -:drawLine lda SPRITE_Y ; - tay - lda LoLineTableL,y ; SET SCREEN LINE - sta SPRITE_SCREEN_P - lda LoLineTableH,y - sta SPRITE_SCREEN_P+1 + lda #0 + sta SPRITE_X_IDX +:drawLine lda SPRITE_Y ; + tay + lda LoLineTableL,y ; SET SCREEN LINE + sta SPRITE_SCREEN_P + lda LoLineTableH,y + sta SPRITE_SCREEN_P+1 - lda #BIRD_X ;SPRITE_X ; ADD IN X OFFSET TO SCREEN POSITION - clc ; I think the highest position is $f8 - adc SPRITE_SCREEN_P ; eg- Line 18, col 40= $4f8 - sta SPRITE_SCREEN_P ; SHOULD NEVER CARRY? + lda #BIRD_X ;SPRITE_X ; ADD IN X OFFSET TO SCREEN POSITION + clc ; I think the highest position is $f8 + adc SPRITE_SCREEN_P ; eg- Line 18, col 40= $4f8 + sta SPRITE_SCREEN_P ; SHOULD NEVER CARRY? - jmp DrawSpriteLineC + jmp DrawSpriteLineC ]DSLCD_done - inc SPRITE_Y - dec SPRITE_H - lda SPRITE_H - bne :drawLine - rts + inc SPRITE_Y + dec SPRITE_H + lda SPRITE_H + bne :drawLine + rts DrawSpriteLineC - ; EVEN COLS -DD_EVEN lda #0 - sta SPRITE_SCREEN_IDX - sta TXTPAGE2 + ; EVEN COLS +DD_EVEN lda #0 + sta SPRITE_SCREEN_IDX + sta TXTPAGE2 :lineLoop :collisionCheckDrawer - ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS - lda (SPRITE_SCREEN_P),y + ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS + lda (SPRITE_SCREEN_P),y - ldy SPRITE_X_IDX ; PREP Y INDEX - cmp #BGCOLORAUX ; AUX BGCOLOR @TODO - beq :noCollisionSIMPLE - pha ; SAVE -> STACK - and (SPRITE_IMASK_P),y - cmp #BGCOLORAUX_0LO - beq :noCollision - cmp #BGCOLORAUX_0HI - beq :noCollision - lda #1 - sta SPRITE_COLLISION + ldy SPRITE_X_IDX ; PREP Y INDEX + cmp #BGCOLORAUX ; AUX BGCOLOR @TODO + beq :noCollisionSIMPLE + pha ; SAVE -> STACK + and (SPRITE_IMASK_P),y + cmp #BGCOLORAUX_0LO + beq :noCollision + cmp #BGCOLORAUX_0HI + beq :noCollision + lda #1 + sta SPRITE_COLLISION :noCollision -:doPixels pla ; Y=SPRITE X A=BG DATA - and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA - ora (SPRITE_DATA_P),y ; OVERLAY OUR SPRITE DATA - ldy SPRITE_SCREEN_IDX - sta (SPRITE_SCREEN_P),y - sec - bcs :donePixel +:doPixels pla ; Y=SPRITE X A=BG DATA + and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA + ora (SPRITE_DATA_P),y ; OVERLAY OUR SPRITE DATA + ldy SPRITE_SCREEN_IDX + sta (SPRITE_SCREEN_P),y + sec + bcs :donePixel :noCollisionSIMPLE - lda (SPRITE_DATA_P),y - ldy SPRITE_SCREEN_IDX - sta (SPRITE_SCREEN_P),y + lda (SPRITE_DATA_P),y + ldy SPRITE_SCREEN_IDX + sta (SPRITE_SCREEN_P),y -:donePixel inc SPRITE_X_IDX - inc SPRITE_SCREEN_IDX - ldy SPRITE_SCREEN_IDX - cpy SPRITE_W - bcc :lineLoop +:donePixel inc SPRITE_X_IDX + inc SPRITE_SCREEN_IDX + ldy SPRITE_SCREEN_IDX + cpy SPRITE_W + bcc :lineLoop DD_ODD - ; ODD COLS - lda #0 - sta SPRITE_SCREEN_IDX - sta TXTPAGE1 - -:lineLoop ;ldy SPRITE_X_IDX ; - ;lda (SPRITE_IMASK_P),y - ;beq :noPixel + ; ODD COLS + lda #0 + sta SPRITE_SCREEN_IDX + sta TXTPAGE1 +:lineLoop :collisionCheckDrawer - ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS - lda (SPRITE_SCREEN_P),y - ldy SPRITE_X_IDX ; PREP Y INDEX - cmp #BGCOLOR ; MAIN BGCOLOR @TODO - beq :noCollisionSIMPLE - pha ; SAVE -> STACK - and (SPRITE_IMASK_P),y - cmp #BGCOLOR_0LO - beq :noCollision - cmp #BGCOLOR_0HI - beq :noCollision - lda #1 - sta SPRITE_COLLISION + ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS + lda (SPRITE_SCREEN_P),y + ldy SPRITE_X_IDX ; PREP Y INDEX + cmp #BGCOLOR ; MAIN BGCOLOR @TODO + beq :noCollisionSIMPLE + pha ; SAVE -> STACK + and (SPRITE_IMASK_P),y + cmp #BGCOLOR_0LO + beq :noCollision + cmp #BGCOLOR_0HI + beq :noCollision + lda #1 + sta SPRITE_COLLISION :noCollision -:doPixels pla ; Y=SPRITE X A=BG DATA - and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA - ora (SPRITE_DATA_P),y ; OVERLAY OUR SPRITE DATA - ldy SPRITE_SCREEN_IDX - sta (SPRITE_SCREEN_P),y - sec - bcs :donePixel +:doPixels pla ; Y=SPRITE X A=BG DATA + and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA + ora (SPRITE_DATA_P),y ; OVERLAY OUR SPRITE DATA + ldy SPRITE_SCREEN_IDX + sta (SPRITE_SCREEN_P),y + sec + bcs :donePixel :noCollisionSIMPLE - lda (SPRITE_DATA_P),y - ldy SPRITE_SCREEN_IDX - sta (SPRITE_SCREEN_P),y + lda (SPRITE_DATA_P),y + ldy SPRITE_SCREEN_IDX + sta (SPRITE_SCREEN_P),y -:donePixel inc SPRITE_X_IDX - inc SPRITE_SCREEN_IDX - ldy SPRITE_SCREEN_IDX - cpy SPRITE_W - bcc :lineLoop +:donePixel inc SPRITE_X_IDX + inc SPRITE_SCREEN_IDX + ldy SPRITE_SCREEN_IDX + cpy SPRITE_W + bcc :lineLoop - jmp ]DSLCD_done + jmp ]DSLCD_done diff --git a/src/dlrlib.s b/src/dlrlib.s index c31d4ab..9629b56 100644 --- a/src/dlrlib.s +++ b/src/dlrlib.s @@ -1,280 +1,280 @@ -LOGO_Y db 1 -LOGO_X db 3 -LOGO_CURLINE db 0 +LOGO_Y db 1 +LOGO_X db 3 +LOGO_CURLINE db 0 -SPR_SP equ $00 -SPR_DP equ $02 -SPR_PIXEL db 00 -SPR_MASKCOLOR db 0 -SPR_MASKCOLORH db 0 -SPR_MASKCOLORL db 0 -SPR_X db 0 -SPR_Y db 0 +SPR_SP equ $00 +SPR_DP equ $02 +SPR_PIXEL db 00 +SPR_MASKCOLOR db 0 +SPR_MASKCOLORH db 0 +SPR_MASKCOLORL db 0 +SPR_X db 0 +SPR_Y db 0 -SPR_CURLINE db 0 -SPR_WIDTH db 0 -SPR_HEIGHT db 0 +SPR_CURLINE db 0 +SPR_WIDTH db 0 +SPR_HEIGHT db 0 -SPR_Y_STASH db 0 ;used by big number routines +SPR_Y_STASH db 0 ;used by big number routines -DL_SetDLRMode lda LORES ;set lores - lda SETAN3 ;enables DLR - sta SET80VID +DL_SetDLRMode lda LORES ;set lores + lda SETAN3 ;enables DLR + sta SET80VID - sta C80STOREON ; enable aux/page1,2 mapping - sta MIXCLR ;make sure graphics-only mode - rts -DL_SetDLRMixMode lda LORES ;set lores - lda SETAN3 ;enables DLR - sta SET80VID + sta C80STOREON ; enable aux/page1,2 mapping + sta MIXCLR ;make sure graphics-only mode + rts +DL_SetDLRMixMode lda LORES ;set lores + lda SETAN3 ;enables DLR + sta SET80VID - sta C80STOREON ; enable aux/page1,2 mapping - sta MIXSET ;turn on mixed text/graphics mode - rts + sta C80STOREON ; enable aux/page1,2 mapping + sta MIXSET ;turn on mixed text/graphics mode + rts -DL_MixClearText sta TXTPAGE1 - ldx #40 -:loop dex - sta Lo24,x - sta Lo23,x - sta Lo22,x - sta Lo21,x - bne :loop - sta TXTPAGE2 - ldx #40 -:loop2 dex - sta Lo24,x - sta Lo23,x - sta Lo22,x - sta Lo21,x - bne :loop2 - rts +DL_MixClearText sta TXTPAGE1 + ldx #40 +:loop dex + sta Lo24,x + sta Lo23,x + sta Lo22,x + sta Lo21,x + bne :loop + sta TXTPAGE2 + ldx #40 +:loop2 dex + sta Lo24,x + sta Lo23,x + sta Lo22,x + sta Lo21,x + bne :loop2 + rts ** A = lo-res color byte -DL_Clear sta TXTPAGE1 - ldx #40 -:loop dex - sta Lo01,x - sta Lo02,x - sta Lo03,x - sta Lo04,x - sta Lo05,x - sta Lo06,x - sta Lo07,x - sta Lo08,x - sta Lo09,x - sta Lo10,x - sta Lo11,x - sta Lo12,x - sta Lo13,x - sta Lo14,x - sta Lo15,x - sta Lo16,x - sta Lo17,x - sta Lo18,x - sta Lo19,x - sta Lo20,x - sta Lo21,x - sta Lo22,x - sta Lo23,x - sta Lo24,x - bne :loop - tax ; get aux color value - lda MainAuxMap,x - sta TXTPAGE2 ; turn on p2 - ldx #40 -:loop2 dex - sta Lo01,x - sta Lo02,x - sta Lo03,x - sta Lo04,x - sta Lo05,x - sta Lo06,x - sta Lo07,x - sta Lo08,x - sta Lo09,x - sta Lo10,x - sta Lo11,x - sta Lo12,x - sta Lo13,x - sta Lo14,x - sta Lo15,x - sta Lo16,x - sta Lo17,x - sta Lo18,x - sta Lo19,x - sta Lo20,x - sta Lo21,x - sta Lo22,x - sta Lo23,x - sta Lo24,x - bne :loop2 - rts +DL_Clear sta TXTPAGE1 + ldx #40 +:loop dex + sta Lo01,x + sta Lo02,x + sta Lo03,x + sta Lo04,x + sta Lo05,x + sta Lo06,x + sta Lo07,x + sta Lo08,x + sta Lo09,x + sta Lo10,x + sta Lo11,x + sta Lo12,x + sta Lo13,x + sta Lo14,x + sta Lo15,x + sta Lo16,x + sta Lo17,x + sta Lo18,x + sta Lo19,x + sta Lo20,x + sta Lo21,x + sta Lo22,x + sta Lo23,x + sta Lo24,x + bne :loop + tax ; get aux color value + lda MainAuxMap,x + sta TXTPAGE2 ; turn on p2 + ldx #40 +:loop2 dex + sta Lo01,x + sta Lo02,x + sta Lo03,x + sta Lo04,x + sta Lo05,x + sta Lo06,x + sta Lo07,x + sta Lo08,x + sta Lo09,x + sta Lo10,x + sta Lo11,x + sta Lo12,x + sta Lo13,x + sta Lo14,x + sta Lo15,x + sta Lo16,x + sta Lo17,x + sta Lo18,x + sta Lo19,x + sta Lo20,x + sta Lo21,x + sta Lo22,x + sta Lo23,x + sta Lo24,x + bne :loop2 + rts ** A = lo-res color byte Y = line byte (0-23) -DL_HLine tax - lda LoLineTableL,y - sta SPR_DP - lda LoLineTableH,y - sta SPR_DP+1 - txa +DL_HLine tax + lda LoLineTableL,y + sta SPR_DP + lda LoLineTableH,y + sta SPR_DP+1 + txa - sta TXTPAGE1 - ldy #39 -:loopMain sta (SPR_DP),y - dey - bpl :loopMain + sta TXTPAGE1 + ldy #39 +:loopMain sta (SPR_DP),y + dey + bpl :loopMain - sta TXTPAGE2 - tax - lda MainAuxMap,x - ldy #39 -:loopAux sta (SPR_DP),y - dey - bpl :loopAux - rts + sta TXTPAGE2 + tax + lda MainAuxMap,x + ldy #39 +:loopAux sta (SPR_DP),y + dey + bpl :loopAux + rts * A X Y = 0 1 2 ?? -DL_WipeLn0 db 0 -DL_WipeLn1 db 0 -DL_WipeLn2 db 0 -DL_WipeLn0_I db 0 ; inverted patterns for bottom up -DL_WipeLn1_I db 0 -DL_WipeLn2_I db 0 -DL_WipeCnt db 0 -DL_WipeDelay db #4 +DL_WipeLn0 db 0 +DL_WipeLn1 db 0 +DL_WipeLn2 db 0 +DL_WipeLn0_I db 0 ; inverted patterns for bottom up +DL_WipeLn1_I db 0 +DL_WipeLn2_I db 0 +DL_WipeCnt db 0 +DL_WipeDelay db #4 DL_NibSwap - asl ; nibble swap - rol - rol - rol - sta $00 - and #07 - adc $00 - rts + asl ; nibble swap + rol + rol + rol + sta $00 + and #07 + adc $00 + rts DL_WipeInNoNib - sty DL_WipeLn2 ; set up color bytes to write - sty DL_WipeLn2_I - stx DL_WipeLn1 - stx DL_WipeLn1_I - sta DL_WipeLn0 - sta DL_WipeLn0_I - jmp DL_WipeIt + sty DL_WipeLn2 ; set up color bytes to write + sty DL_WipeLn2_I + stx DL_WipeLn1 + stx DL_WipeLn1_I + sta DL_WipeLn0 + sta DL_WipeLn0_I + jmp DL_WipeIt DL_WipeIn - sty DL_WipeLn2 ; set up color bytes to write - stx DL_WipeLn1 - sta DL_WipeLn0 - jsr DL_NibSwap ; and their A/B swapped equivalents - sta DL_WipeLn0_I ; for mirroring the lines below + sty DL_WipeLn2 ; set up color bytes to write + stx DL_WipeLn1 + sta DL_WipeLn0 + jsr DL_NibSwap ; and their A/B swapped equivalents + sta DL_WipeLn0_I ; for mirroring the lines below - lda DL_WipeLn1 - jsr DL_NibSwap - sta DL_WipeLn1_I + lda DL_WipeLn1 + jsr DL_NibSwap + sta DL_WipeLn1_I - lda DL_WipeLn2 - jsr DL_NibSwap - sta DL_WipeLn2_I + lda DL_WipeLn2 + jsr DL_NibSwap + sta DL_WipeLn2_I DL_WipeIt - ldx DL_WipeDelay - jsr VBlankX ; Frame 1 - special case (clipped) - lda DL_WipeLn0 - ldy #0 - jsr DL_HLine - lda DL_WipeLn0_I - ldy #23 - jsr DL_HLine + ldx DL_WipeDelay + jsr VBlankX ; Frame 1 - special case (clipped) + lda DL_WipeLn0 + ldy #0 + jsr DL_HLine + lda DL_WipeLn0_I + ldy #23 + jsr DL_HLine - ldx DL_WipeDelay - jsr VBlankX ; Frame 2 - special case (clipped) - lda DL_WipeLn0 - ldy #1 - jsr DL_HLine - lda DL_WipeLn1 - ldy #0 - jsr DL_HLine + ldx DL_WipeDelay + jsr VBlankX ; Frame 2 - special case (clipped) + lda DL_WipeLn0 + ldy #1 + jsr DL_HLine + lda DL_WipeLn1 + ldy #0 + jsr DL_HLine - lda DL_WipeLn0_I - ldy #22 - jsr DL_HLine - lda DL_WipeLn1_I - ldy #23 - jsr DL_HLine + lda DL_WipeLn0_I + ldy #22 + jsr DL_HLine + lda DL_WipeLn1_I + ldy #23 + jsr DL_HLine - lda #0 - sta DL_WipeCnt + lda #0 + sta DL_WipeCnt -:wiper ldx DL_WipeDelay - jsr VBlankX - lda DL_WipeLn2 - ldy DL_WipeCnt - jsr DL_HLine - lda DL_WipeLn1 - ldy DL_WipeCnt - iny - jsr DL_HLine - lda DL_WipeLn0 - ldy DL_WipeCnt - iny - iny - jsr DL_HLine - lda #23 - sec - sbc DL_WipeCnt - pha - pha - tay - lda DL_WipeLn2_I - jsr DL_HLine - pla - tay - dey - lda DL_WipeLn1_I - jsr DL_HLine - pla - tay - dey - dey - lda DL_WipeLn0_I - jsr DL_HLine - inc DL_WipeCnt - lda DL_WipeCnt - cmp #10 - bne :wiper +:wiper ldx DL_WipeDelay + jsr VBlankX + lda DL_WipeLn2 + ldy DL_WipeCnt + jsr DL_HLine + lda DL_WipeLn1 + ldy DL_WipeCnt + iny + jsr DL_HLine + lda DL_WipeLn0 + ldy DL_WipeCnt + iny + iny + jsr DL_HLine + lda #23 + sec + sbc DL_WipeCnt + pha + pha + tay + lda DL_WipeLn2_I + jsr DL_HLine + pla + tay + dey + lda DL_WipeLn1_I + jsr DL_HLine + pla + tay + dey + dey + lda DL_WipeLn0_I + jsr DL_HLine + inc DL_WipeCnt + lda DL_WipeCnt + cmp #10 + bne :wiper - ldx DL_WipeDelay - jsr VBlankX ; Frame end-1 - special case (smashed) - lda DL_WipeLn2 - ldy #10 - jsr DL_HLine - lda DL_WipeLn1 - ldy #11 - jsr DL_HLine + ldx DL_WipeDelay + jsr VBlankX ; Frame end-1 - special case (smashed) + lda DL_WipeLn2 + ldy #10 + jsr DL_HLine + lda DL_WipeLn1 + ldy #11 + jsr DL_HLine - lda DL_WipeLn1_I - ldy #12 - jsr DL_HLine - lda DL_WipeLn2_I - ldy #13 - jsr DL_HLine + lda DL_WipeLn1_I + ldy #12 + jsr DL_HLine + lda DL_WipeLn2_I + ldy #13 + jsr DL_HLine - ldx DL_WipeDelay - jsr VBlankX ; Frame end - special case (last fill line) - lda DL_WipeLn2 - ldy #11 - jsr DL_HLine + ldx DL_WipeDelay + jsr VBlankX ; Frame end - special case (last fill line) + lda DL_WipeLn2 + ldy #11 + jsr DL_HLine - lda DL_WipeLn2_I - ldy #12 - jsr DL_HLine - rts + lda DL_WipeLn2_I + ldy #12 + jsr DL_HLine + rts @@ -284,685 +284,671 @@ DL_WipeIt ************************************************** * Lores/Text lines ************************************************** -Lo01 equ $400 -Lo02 equ $480 -Lo03 equ $500 -Lo04 equ $580 -Lo05 equ $600 -Lo06 equ $680 -Lo07 equ $700 -Lo08 equ $780 -Lo09 equ $428 -Lo10 equ $4a8 -Lo11 equ $528 -Lo12 equ $5a8 -Lo13 equ $628 -Lo14 equ $6a8 -Lo15 equ $728 -Lo16 equ $7a8 -Lo17 equ $450 -Lo18 equ $4d0 -Lo19 equ $550 -Lo20 equ $5d0 +Lo01 equ $400 +Lo02 equ $480 +Lo03 equ $500 +Lo04 equ $580 +Lo05 equ $600 +Lo06 equ $680 +Lo07 equ $700 +Lo08 equ $780 +Lo09 equ $428 +Lo10 equ $4a8 +Lo11 equ $528 +Lo12 equ $5a8 +Lo13 equ $628 +Lo14 equ $6a8 +Lo15 equ $728 +Lo16 equ $7a8 +Lo17 equ $450 +Lo18 equ $4d0 +Lo19 equ $550 +Lo20 equ $5d0 * the "plus four" lines -Lo21 equ $650 -Lo22 equ $6d0 -Lo23 equ $750 -Lo24 equ $7d0 +Lo21 equ $650 +Lo22 equ $6d0 +Lo23 equ $750 +Lo24 equ $7d0 -LoLineTable da Lo01,Lo02,Lo03,Lo04,Lo05,Lo06 - da Lo07,Lo08,Lo09,Lo10,Lo11,Lo12 - da Lo13,Lo14,Lo15,Lo16,Lo17,Lo18 - da Lo19,Lo20,Lo21,Lo22,Lo23,Lo24 +LoLineTable da Lo01,Lo02,Lo03,Lo04,Lo05,Lo06 + da Lo07,Lo08,Lo09,Lo10,Lo11,Lo12 + da Lo13,Lo14,Lo15,Lo16,Lo17,Lo18 + da Lo19,Lo20,Lo21,Lo22,Lo23,Lo24 ** Here we split the table for an optimization ** We can directly get our line numbers now ** Without using ASL -LoLineTableH db >Lo01,>Lo02,>Lo03,>Lo04,>Lo05,>Lo06 - db >Lo07,>Lo08,>Lo09,>Lo10,>Lo11,>Lo12 - db >Lo13,>Lo14,>Lo15,>Lo16,>Lo17,>Lo18 - db >Lo19,>Lo20,>Lo21,>Lo22,>Lo23,>Lo24 -LoLineTableL db Lo01,>Lo02,>Lo03,>Lo04,>Lo05,>Lo06 + db >Lo07,>Lo08,>Lo09,>Lo10,>Lo11,>Lo12 + db >Lo13,>Lo14,>Lo15,>Lo16,>Lo17,>Lo18 + db >Lo19,>Lo20,>Lo21,>Lo22,>Lo23,>Lo24 +LoLineTableL db QRCodeData - sta SPR_SP+1 - lda #QRCodeHeight - sta SPR_HEIGHT - lda #QRCodeWidth - sta SPR_WIDTH - lda #13 ; @todo rename 'flogo' - sta SPR_X - lda #3 - sta SPR_Y - lda #0 - sta SPR_CURLINE - jsr DrawSprite - rts + lda #QRCodeData + sta SPR_SP+1 + lda #QRCodeHeight + sta SPR_HEIGHT + lda #QRCodeWidth + sta SPR_WIDTH + lda #13 ; @todo rename 'flogo' + sta SPR_X + lda #3 + sta SPR_Y + lda #0 + sta SPR_CURLINE + jsr DrawSprite + rts -DrawFlogo lda #flogoMaskColor - sta SPR_MASKCOLOR +DrawFlogo lda #flogoMaskColor + sta SPR_MASKCOLOR - lda #flogoData - sta SPR_SP+1 - lda #flogoHeight - sta SPR_HEIGHT - lda #flogoWidth - sta SPR_WIDTH - lda LOGO_X ; @todo rename 'flogo' - sta SPR_X - lda LOGO_Y - sta SPR_Y - lda #0 - sta SPR_CURLINE - jsr DrawSprite - rts + lda #flogoData + sta SPR_SP+1 + lda #flogoHeight + sta SPR_HEIGHT + lda #flogoWidth + sta SPR_WIDTH + lda LOGO_X ; @todo rename 'flogo' + sta SPR_X + lda LOGO_Y + sta SPR_Y + lda #0 + sta SPR_CURLINE + jsr DrawSprite + rts -DrawTap lda #tapMaskColor - sta SPR_MASKCOLOR +DrawTap lda #tapMaskColor + sta SPR_MASKCOLOR - lda #tapData - sta SPR_SP+1 - lda #tapHeight - sta SPR_HEIGHT - lda #tapWidth - sta SPR_WIDTH - lda #8 - sta SPR_X - lda #16 - sta SPR_Y - lda #0 - sta SPR_CURLINE - jsr DrawSprite - rts + lda #tapData + sta SPR_SP+1 + lda #tapHeight + sta SPR_HEIGHT + lda #tapWidth + sta SPR_WIDTH + lda #8 + sta SPR_X + lda #16 + sta SPR_Y + lda #0 + sta SPR_CURLINE + jsr DrawSprite + rts DrawYou - sty SPR_Y - lda #youMaskColor - sta SPR_MASKCOLOR + sty SPR_Y + lda #youMaskColor + sta SPR_MASKCOLOR - lda #youData - sta SPR_SP+1 - lda #youHeight - sta SPR_HEIGHT - lda #youWidth - sta SPR_WIDTH - lda #13 - sta SPR_X - lda #0 - sta SPR_CURLINE - jsr DrawSprite - rts + lda #youData + sta SPR_SP+1 + lda #youHeight + sta SPR_HEIGHT + lda #youWidth + sta SPR_WIDTH + lda #13 + sta SPR_X + lda #0 + sta SPR_CURLINE + jsr DrawSprite + rts * y = Y DrawHi - sty SPR_Y - lda #hiMaskColor - sta SPR_MASKCOLOR + sty SPR_Y + lda #hiMaskColor + sta SPR_MASKCOLOR - lda #hiData - sta SPR_SP+1 - lda #hiHeight - sta SPR_HEIGHT - lda #hiWidth - sta SPR_WIDTH - lda #13 - sta SPR_X - lda #0 - sta SPR_CURLINE - jsr DrawSprite - rts + lda #hiData + sta SPR_SP+1 + lda #hiHeight + sta SPR_HEIGHT + lda #hiWidth + sta SPR_WIDTH + lda #13 + sta SPR_X + lda #0 + sta SPR_CURLINE + jsr DrawSprite + rts DrawHiScore - stx SPR_X - sty SPR_Y - sty SPR_Y_STASH - lda HiScoreHi - sta DrawNumberHi - lda HiScoreLo - sta DrawNumberLo - jsr DrawBigNumbersFancy - rts + stx SPR_X + sty SPR_Y + sty SPR_Y_STASH + lda HiScoreHi + sta DrawNumberHi + lda HiScoreLo + sta DrawNumberLo + jsr DrawBigNumbersFancy + rts DrawYouScore - stx SPR_X - sty SPR_Y - sty SPR_Y_STASH - lda ScoreHi - sta DrawNumberHi - lda ScoreLo - sta DrawNumberLo - jsr DrawBigNumbersFancy - rts + stx SPR_X + sty SPR_Y + sty SPR_Y_STASH + lda ScoreHi + sta DrawNumberHi + lda ScoreLo + sta DrawNumberLo + jsr DrawBigNumbersFancy + rts * Draws in natural format from 0 to 9999 DrawBigNumbersFancy - lda #NumHeight - sta SPR_HEIGHT - lda #NumWidth - sta SPR_WIDTH - lda #NumMaskColor - sta SPR_MASKCOLOR + lda #NumHeight + sta SPR_HEIGHT + lda #NumWidth + sta SPR_WIDTH + lda #NumMaskColor + sta SPR_MASKCOLOR - lda DrawNumberHi - bne :hiDigits - lda SPR_X - clc - adc #NumWidth*2 ; skip two spaces - sta SPR_X - bcc :loDigits + lda DrawNumberHi + bne :hiDigits + lda SPR_X + clc + adc #NumWidth*2 ; skip two spaces + sta SPR_X + bcc :loDigits :hiDigits - lsr - lsr - lsr - lsr - beq :noThousandDigit - jsr DrawBigNumber ; draw "thousands" digit -:noThousandDigit lda SPR_X - clc - adc #NumWidth ; advance one space - sta SPR_X - ldy SPR_Y_STASH - sty SPR_Y - lda DrawNumberHi - and #$0F - jsr DrawBigNumber ; draw "hundreds" digit - lda SPR_X - clc - adc #NumWidth ; advance one space - sta SPR_X - ldy SPR_Y_STASH - sty SPR_Y -:loDigits lda DrawNumberLo - lsr - lsr - lsr - lsr - beq :tensZero - ldy SPR_Y_STASH - sty SPR_Y - jsr DrawBigNumber ; draw "tens" digit (1-9) - clc - bcc :tensDone + lsr + lsr + lsr + lsr + beq :noThousandDigit + jsr DrawBigNumber ; draw "thousands" digit +:noThousandDigit lda SPR_X + clc + adc #NumWidth ; advance one space + sta SPR_X + ldy SPR_Y_STASH + sty SPR_Y + lda DrawNumberHi + and #$0F + jsr DrawBigNumber ; draw "hundreds" digit + lda SPR_X + clc + adc #NumWidth ; advance one space + sta SPR_X + ldy SPR_Y_STASH + sty SPR_Y +:loDigits lda DrawNumberLo + lsr + lsr + lsr + lsr + beq :tensZero + ldy SPR_Y_STASH + sty SPR_Y + jsr DrawBigNumber ; draw "tens" digit (1-9) + clc + bcc :tensDone :tensZero ; we need to know if we drew anything above - lda DrawNumberHi - beq :noTensDigit - ldy SPR_Y_STASH - sty SPR_Y - lda #0 - jsr DrawBigNumber ; draw "tens" digit (0) + lda DrawNumberHi + beq :noTensDigit + ldy SPR_Y_STASH + sty SPR_Y + lda #0 + jsr DrawBigNumber ; draw "tens" digit (0) :noTensDigit :tensDone - lda SPR_X - clc - adc #NumWidth - sta SPR_X + lda SPR_X + clc + adc #NumWidth + sta SPR_X - ldy SPR_Y_STASH - sty SPR_Y - lda DrawNumberLo - and #$0F - jsr DrawBigNumber - rts + ldy SPR_Y_STASH + sty SPR_Y + lda DrawNumberLo + and #$0F + jsr DrawBigNumber + rts -DrawNumberHi db 0 -DrawNumberLo db 0 +DrawNumberHi db 0 +DrawNumberLo db 0 * All params should be set prior to this. Just pass digit (0-9) in A DrawBigNumber - asl - tay - lda NumList,y - sta SPR_SP - lda NumList+1,y - sta SPR_SP+1 - lda #0 - sta SPR_CURLINE + asl + tay + lda NumList,y + sta SPR_SP + lda NumList+1,y + sta SPR_SP+1 + lda #0 + sta SPR_CURLINE - jsr DrawSprite - rts + jsr DrawSprite + rts DrawPlaqueShared - lda #11 - sta SPR_X - lda #plaqueMaskColor - sta SPR_MASKCOLOR - lda #plaqueData - sta SPR_SP+1 - lda #plaqueHeight - sta SPR_HEIGHT - lda #plaqueWidth - sta SPR_WIDTH - lda #0 - sta SPR_CURLINE - jsr DrawSprite - rts + lda #11 + sta SPR_X + lda #plaqueMaskColor + sta SPR_MASKCOLOR + lda #plaqueData + sta SPR_SP+1 + lda #plaqueHeight + sta SPR_HEIGHT + lda #plaqueWidth + sta SPR_WIDTH + lda #0 + sta SPR_CURLINE + jsr DrawSprite + rts -DrawSplosion lda #splosionMaskColor - sta SPR_MASKCOLOR +DrawSplosion lda #splosionMaskColor + sta SPR_MASKCOLOR - lda #splosionData - sta SPR_SP+1 - lda #splosionHeight - sta SPR_HEIGHT - lda #splosionWidth - sta SPR_WIDTH - lda #BIRD_X - clc - adc #2 - sta SPR_X - lda BIRD_Y - lsr - sec - sbc #1 - sta SPR_Y - lda #0 - sta SPR_CURLINE - jsr DrawSprite - rts + lda #splosionData + sta SPR_SP+1 + lda #splosionHeight + sta SPR_HEIGHT + lda #splosionWidth + sta SPR_WIDTH + lda #BIRD_X + clc + adc #2 + sta SPR_X + lda BIRD_Y + lsr + sec + sbc #1 + sta SPR_Y + lda #0 + sta SPR_CURLINE + jsr DrawSprite + rts -DrawSprite lda SPR_MASKCOLOR - and #$F0 - sta SPR_MASKCOLORH - lsr - lsr - lsr - lsr - sta SPR_MASKCOLORL +DrawSprite lda SPR_MASKCOLOR + and #$F0 + sta SPR_MASKCOLORH + lsr + lsr + lsr + lsr + sta SPR_MASKCOLORL :lineLoop - ldy SPR_CURLINE - cpy SPR_HEIGHT ;last line? - bcc :doLine - rts ; !! ROUTINE ENDS HERE -:doLine ldy SPR_Y - lda LoLineTableL,y - clc - adc SPR_X ;; X OFFSET - sta SPR_DP - lda LoLineTableH,y - sta SPR_DP+1 - sta TXTPAGE2 - ldy #$0 + ldy SPR_CURLINE + cpy SPR_HEIGHT ;last line? + bcc :doLine + rts ; !! ROUTINE ENDS HERE +:doLine ldy SPR_Y + lda LoLineTableL,y + clc + adc SPR_X ;; X OFFSET + sta SPR_DP + lda LoLineTableH,y + sta SPR_DP+1 + sta TXTPAGE2 + ldy #$0 :auxLoop - lda (SPR_SP),y - cmp SPR_MASKCOLOR - beq :auxNoData - and #$F0 - cmp SPR_MASKCOLORH - bne :auxNoMask1 - lda (SPR_DP),y - and #$F0 - sta SPR_PIXEL - lda (SPR_SP),y - and #$0F - ora SPR_PIXEL - bne :auxData -:auxNoMask1 lda (SPR_SP),y - and #$0F - cmp SPR_MASKCOLORL - bne :auxNoMask2 - lda (SPR_DP),y - and #$0F - sta SPR_PIXEL - lda (SPR_SP),y - and #$F0 - ora SPR_PIXEL - bne :auxData -:auxNoMask2 lda (SPR_SP),y -:auxData sta (SPR_DP),y -:auxNoData iny - cpy SPR_WIDTH - bcc :auxLoop - lda SPR_SP - clc - adc SPR_WIDTH - sta SPR_SP - bcc :noCarry - inc SPR_SP+1 -:noCarry sta TXTPAGE1 - ldy #0 + lda (SPR_SP),y + cmp SPR_MASKCOLOR + beq :auxNoData + and #$F0 + cmp SPR_MASKCOLORH + bne :auxNoMask1 + lda (SPR_DP),y + and #$F0 + sta SPR_PIXEL + lda (SPR_SP),y + and #$0F + ora SPR_PIXEL + bne :auxData +:auxNoMask1 lda (SPR_SP),y + and #$0F + cmp SPR_MASKCOLORL + bne :auxNoMask2 + lda (SPR_DP),y + and #$0F + sta SPR_PIXEL + lda (SPR_SP),y + and #$F0 + ora SPR_PIXEL + bne :auxData +:auxNoMask2 lda (SPR_SP),y +:auxData sta (SPR_DP),y +:auxNoData iny + cpy SPR_WIDTH + bcc :auxLoop + lda SPR_SP + clc + adc SPR_WIDTH + sta SPR_SP + bcc :noCarry + inc SPR_SP+1 +:noCarry sta TXTPAGE1 + ldy #0 :mainLoop - lda (SPR_SP),y - cmp SPR_MASKCOLOR - beq :mainNoData - and #$F0 - cmp SPR_MASKCOLORH - bne :mainNoMask1 - lda (SPR_DP),y - and #$F0 - sta SPR_PIXEL - lda (SPR_SP),y - and #$0F - ora SPR_PIXEL - bne :mainData -:mainNoMask1 lda (SPR_SP),y - and #$0F - cmp SPR_MASKCOLORL - bne :mainNoMask2 - lda (SPR_DP),y - and #$0F - sta SPR_PIXEL - lda (SPR_SP),y - and #$F0 - ora SPR_PIXEL - bne :mainData -:mainNoMask2 lda (SPR_SP),y -:mainData sta (SPR_DP),y -:mainNoData iny - cpy SPR_WIDTH - bcc :mainLoop - lda SPR_SP - clc - adc SPR_WIDTH - sta SPR_SP - bcc :noCarry2 - inc SPR_SP+1 + lda (SPR_SP),y + cmp SPR_MASKCOLOR + beq :mainNoData + and #$F0 + cmp SPR_MASKCOLORH + bne :mainNoMask1 + lda (SPR_DP),y + and #$F0 + sta SPR_PIXEL + lda (SPR_SP),y + and #$0F + ora SPR_PIXEL + bne :mainData +:mainNoMask1 lda (SPR_SP),y + and #$0F + cmp SPR_MASKCOLORL + bne :mainNoMask2 + lda (SPR_DP),y + and #$0F + sta SPR_PIXEL + lda (SPR_SP),y + and #$F0 + ora SPR_PIXEL + bne :mainData +:mainNoMask2 lda (SPR_SP),y +:mainData sta (SPR_DP),y +:mainNoData iny + cpy SPR_WIDTH + bcc :mainLoop + lda SPR_SP + clc + adc SPR_WIDTH + sta SPR_SP + bcc :noCarry2 + inc SPR_SP+1 :noCarry2 - inc SPR_CURLINE - inc SPR_Y - jmp :lineLoop + inc SPR_CURLINE + inc SPR_Y + jmp :lineLoop -flogoMaskColor equ #$11 -flogoHeight equ #$16 -flogoWidth equ #$21 +flogoMaskColor equ #$11 +flogoHeight equ #$16 +flogoWidth equ #$21 ** Remember: Data is Aux cols, then main cols, next line, repeat flogoData - hex FF,0F,0F,0F,0F,0F,0F,0F,0F,0F,0F,0F,0F,FF,11,11,11,11,11,11,11 - hex 11,FF,0F,0F,0F,0F,0F,0F,0F,0F,0F,FF,0F,0F,0F,0F,0F,0F,0F,0F,0F - hex 0F,0F,0F,0F,11,11,11,11,11,11,11,11,11,0F,0F,0F,0F,0F,0F,0F,0F - hex 0F,0F,11 - hex FF,77,77,77,77,77,77,77,00,77,77,77,77,FF,F1,F1,F1,F1,F1,F1,F1 - hex F1,FF,77,77,00,77,77,77,77,77,77,FF,00,EE,EE,EE,EE,00,EE,EE,EE - hex EE,EE,EE,00,F1,F1,F1,F1,F1,F1,F1,F1,F1,00,EE,EE,EE,EE,00,EE,EE - hex EE,00,11 - hex FF,77,77,F7,F7,F7,77,77,00,F7,F7,77,77,70,70,70,70,70,70,70,70 - hex 70,70,77,77,00,77,77,77,77,F7,F7,FF,00,EE,EE,FE,FE,00,EE,EE,FE - hex FE,EE,EE,00,E0,E0,E0,E0,00,E0,E0,E0,E0,00,EE,EE,EE,EE,00,EE,FE - hex FE,00,F1 - hex FF,77,77,70,70,70,77,77,70,70,70,77,77,77,77,77,77,77,77,77,77 - hex 77,77,77,77,00,77,77,77,77,70,70,00,00,EE,EE,E0,E0,00,EE,00,E0 - hex E0,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,E0 - hex E0,E0,FF - hex FF,77,77,77,77,77,77,77,77,77,77,77,77,77,77,0F,77,77,77,77,0F - hex 77,77,77,77,00,77,77,77,77,77,77,00,00,EE,EE,EE,EE,00,EE,00,EE - hex EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE - hex EE,EE,FF - hex FF,66,66,F6,F6,F6,66,66,66,66,F6,66,66,66,66,00,66,66,66,66,00 - hex 66,66,66,66,00,66,66,66,66,F6,F6,00,00,CC,CC,FC,FC,00,CC,00,CC - hex CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC - hex FC,FC,FF - hex FF,66,66,00,F0,F0,66,66,66,66,60,66,66,66,66,66,66,66,66,66,66 - hex 66,66,66,66,00,66,66,66,66,60,60,00,00,CC,CC,F0,F0,00,CC,00,CC - hex CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC - hex C0,C0,FF - hex FF,66,66,00,11,FF,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66 - hex 66,66,66,66,00,66,66,66,66,66,66,00,00,CC,CC,FF,11,00,CC,00,CC - hex CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC - hex CC,CC,FF - hex FF,0F,0F,00,11,FF,0F,0F,0F,0F,0F,0F,0F,66,66,0F,0F,0F,66,66,0F - hex 0F,0F,0F,0F,00,0F,0F,0F,0F,0F,0F,00,00,0F,0F,FF,11,00,0F,00,0F - hex 0F,0F,0F,00,CC,CC,0F,0F,00,CC,CC,0F,0F,00,0F,0F,0F,0F,00,0F,0F - hex 0F,0F,FF - hex 1F,1F,1F,1F,11,1F,1F,1F,1F,1F,1F,1F,FF,F6,F6,00,1F,FF,F6,F6,00 - hex 1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,11,1F,1F,1F,1F - hex 1F,1F,1F,00,FC,FC,FF,1F,00,FC,FC,FF,1F,1F,1F,1F,1F,1F,1F,1F,1F - hex 1F,1F,1F - hex 11,11,11,11,11,11,11,11,11,11,11,11,FF,F0,F0,F0,11,FF,F0,F0,F0 - hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 - hex 11,11,11,F0,F0,F0,FF,11,F0,F0,F0,FF,11,11,11,11,11,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 - hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 - hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,0F,0F,0F,0F,0F,0F,0F,0F,FF,F1,F1,F1,F1 - hex F1,11,0F,0F,0F,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,0F - hex 0F,0F,0F,0F,0F,0F,0F,F1,F1,F1,F1,F1,11,FF,0F,0F,0F,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,77,77,70,70,70,70,70 - hex FF,F1,00,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE - hex EE,EE,EE,EE,EE,EE,00,E0,E0,E0,E0,00,F1,FF,EE,EE,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,F7,F7,77,77,77,77,77 - hex 70,70,70,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE - hex EE,FE,EE,EE,FE,FE,00,EE,EE,EE,EE,00,E0,E0,EE,EE,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,70,70,77,77,07,77,77 - hex 77,77,77,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE - hex EE,E0,EE,EE,E0,E0,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,77,77,77,77,00,F7,F7 - hex 77,77,F7,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE - hex EE,EE,EE,0F,EE,EE,00,EE,EE,FE,FE,00,EE,EE,EE,EE,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,66,66,66,66,00,66,66,66,66,00,F0,F0 - hex 66,66,00,66,66,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,CC - hex CC,FC,CC,CC,CC,CC,00,CC,CC,F0,F0,00,CC,CC,CC,CC,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,66,66,66,66,00,66,66,66,66,00,11,FF - hex 66,66,60,66,66,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,CC - hex CC,C0,CC,CC,CC,CC,00,CC,CC,FF,11,00,CC,CC,CC,CC,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,66,66,66,66,00,66,66,66,66,00,11,FF - hex 66,66,66,66,66,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,CC - hex CC,CC,CC,CC,CC,CC,00,CC,CC,FF,11,00,CC,CC,CC,CC,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,00,0F,0F,0F,0F,00,0F,0F,0F,0F,00,11,FF - hex 0F,0F,0F,0F,0F,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,0F - hex 0F,0F,0F,0F,0F,0F,00,0F,0F,FF,11,00,0F,0F,0F,0F,00,11,11,11,11 - hex 11,11,11 - hex 11,11,11,11,11,11,11,11,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,11,1F - hex 1F,1F,1F,1F,1F,1F,11,11,11,11,11,11,11,11,11,11,11,11,11,1F,1F - hex 1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,11,1F,1F,1F,1F,1F,1F,11,11,11,11 - hex 11,11,11 + hex FF,0F,0F,0F,0F,0F,0F,0F,0F,0F,0F,0F,0F,FF,11,11,11,11,11,11,11 + hex 11,FF,0F,0F,0F,0F,0F,0F,0F,0F,0F,FF,0F,0F,0F,0F,0F,0F,0F,0F,0F + hex 0F,0F,0F,0F,11,11,11,11,11,11,11,11,11,0F,0F,0F,0F,0F,0F,0F,0F + hex 0F,0F,11 + hex FF,77,77,77,77,77,77,77,00,77,77,77,77,FF,F1,F1,F1,F1,F1,F1,F1 + hex F1,FF,77,77,00,77,77,77,77,77,77,FF,00,EE,EE,EE,EE,00,EE,EE,EE + hex EE,EE,EE,00,F1,F1,F1,F1,F1,F1,F1,F1,F1,00,EE,EE,EE,EE,00,EE,EE + hex EE,00,11 + hex FF,77,77,F7,F7,F7,77,77,00,F7,F7,77,77,70,70,70,70,70,70,70,70 + hex 70,70,77,77,00,77,77,77,77,F7,F7,FF,00,EE,EE,FE,FE,00,EE,EE,FE + hex FE,EE,EE,00,E0,E0,E0,E0,00,E0,E0,E0,E0,00,EE,EE,EE,EE,00,EE,FE + hex FE,00,F1 + hex FF,77,77,70,70,70,77,77,70,70,70,77,77,77,77,77,77,77,77,77,77 + hex 77,77,77,77,00,77,77,77,77,70,70,00,00,EE,EE,E0,E0,00,EE,00,E0 + hex E0,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,E0 + hex E0,E0,FF + hex FF,77,77,77,77,77,77,77,77,77,77,77,77,77,77,0F,77,77,77,77,0F + hex 77,77,77,77,00,77,77,77,77,77,77,00,00,EE,EE,EE,EE,00,EE,00,EE + hex EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,EE,EE + hex EE,EE,FF + hex FF,66,66,F6,F6,F6,66,66,66,66,F6,66,66,66,66,00,66,66,66,66,00 + hex 66,66,66,66,00,66,66,66,66,F6,F6,00,00,CC,CC,FC,FC,00,CC,00,CC + hex CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC + hex FC,FC,FF + hex FF,66,66,00,F0,F0,66,66,66,66,60,66,66,66,66,66,66,66,66,66,66 + hex 66,66,66,66,00,66,66,66,66,60,60,00,00,CC,CC,F0,F0,00,CC,00,CC + hex CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC + hex C0,C0,FF + hex FF,66,66,00,11,FF,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66 + hex 66,66,66,66,00,66,66,66,66,66,66,00,00,CC,CC,FF,11,00,CC,00,CC + hex CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC,CC,CC,00,CC,CC + hex CC,CC,FF + hex FF,0F,0F,00,11,FF,0F,0F,0F,0F,0F,0F,0F,66,66,0F,0F,0F,66,66,0F + hex 0F,0F,0F,0F,00,0F,0F,0F,0F,0F,0F,00,00,0F,0F,FF,11,00,0F,00,0F + hex 0F,0F,0F,00,CC,CC,0F,0F,00,CC,CC,0F,0F,00,0F,0F,0F,0F,00,0F,0F + hex 0F,0F,FF + hex 1F,1F,1F,1F,11,1F,1F,1F,1F,1F,1F,1F,FF,F6,F6,00,1F,FF,F6,F6,00 + hex 1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,11,1F,1F,1F,1F + hex 1F,1F,1F,00,FC,FC,FF,1F,00,FC,FC,FF,1F,1F,1F,1F,1F,1F,1F,1F,1F + hex 1F,1F,1F + hex 11,11,11,11,11,11,11,11,11,11,11,11,FF,F0,F0,F0,11,FF,F0,F0,F0 + hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 + hex 11,11,11,F0,F0,F0,FF,11,F0,F0,F0,FF,11,11,11,11,11,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 + hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 + hex 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,0F,0F,0F,0F,0F,0F,0F,0F,FF,F1,F1,F1,F1 + hex F1,11,0F,0F,0F,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,0F + hex 0F,0F,0F,0F,0F,0F,0F,F1,F1,F1,F1,F1,11,FF,0F,0F,0F,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,77,77,70,70,70,70,70 + hex FF,F1,00,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE + hex EE,EE,EE,EE,EE,EE,00,E0,E0,E0,E0,00,F1,FF,EE,EE,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,F7,F7,77,77,77,77,77 + hex 70,70,70,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE + hex EE,FE,EE,EE,FE,FE,00,EE,EE,EE,EE,00,E0,E0,EE,EE,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,70,70,77,77,07,77,77 + hex 77,77,77,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE + hex EE,E0,EE,EE,E0,E0,00,EE,EE,EE,EE,00,EE,EE,EE,EE,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,77,77,77,77,00,77,77,77,77,00,F7,F7 + hex 77,77,F7,77,77,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,EE + hex EE,EE,EE,0F,EE,EE,00,EE,EE,FE,FE,00,EE,EE,EE,EE,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,66,66,66,66,00,66,66,66,66,00,F0,F0 + hex 66,66,00,66,66,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,CC + hex CC,FC,CC,CC,CC,CC,00,CC,CC,F0,F0,00,CC,CC,CC,CC,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,66,66,66,66,00,66,66,66,66,00,11,FF + hex 66,66,60,66,66,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,CC + hex CC,C0,CC,CC,CC,CC,00,CC,CC,FF,11,00,CC,CC,CC,CC,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,66,66,66,66,00,66,66,66,66,00,11,FF + hex 66,66,66,66,66,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,CC + hex CC,CC,CC,CC,CC,CC,00,CC,CC,FF,11,00,CC,CC,CC,CC,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,00,0F,0F,0F,0F,00,0F,0F,0F,0F,00,11,FF + hex 0F,0F,0F,0F,0F,FF,11,11,11,11,11,11,11,11,11,11,11,11,11,FF,0F + hex 0F,0F,0F,0F,0F,0F,00,0F,0F,FF,11,00,0F,0F,0F,0F,00,11,11,11,11 + hex 11,11,11 + hex 11,11,11,11,11,11,11,11,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,11,1F + hex 1F,1F,1F,1F,1F,1F,11,11,11,11,11,11,11,11,11,11,11,11,11,1F,1F + hex 1F,1F,1F,1F,1F,1F,1F,1F,1F,1F,11,1F,1F,1F,1F,1F,1F,11,11,11,11 + hex 11,11,11 -tapMaskColor equ #$11 -tapHeight equ #$06 -tapWidth equ #$18 +tapMaskColor equ #$11 +tapHeight equ #$06 +tapWidth equ #$18 ** Remember: Data is Aux cols, then main cols, next line, repeat tapData - hex 11,F1,F1,11,11,11,11,11,11,11,F1,11,11,11,11,11,AF,FF,FF,11,11,11,11,11 - hex 11,F1,11,11,11,11,11,11,11,F1,F1,11,11,11,11,FF,0F,5F,11,11,11,11,11,11 - hex F1,FF,0F,FF,F1,F1,F1,F1,11,F1,00,AF,F1,F1,11,F1,00,FF,FF,F1,F1,F1,F1,F1 - hex F1,00,5F,F1,F1,F1,F1,F1,F1,FF,0F,FF,F1,11,11,FF,0F,00,F1,F1,F1,F1,F1,F1 - hex FF,F0,FF,AF,F0,FF,AF,0A,11,FA,00,FF,FA,0F,11,FF,00,FF,FF,AF,F0,FF,AF,00 - hex F5,00,FF,F5,00,00,F5,FF,FF,F0,FF,5F,F0,FF,11,F5,FF,00,FF,F5,00,00,F5,FF - hex 11,FF,0F,00,0F,FF,0F,F0,11,11,00,FF,0F,F0,11,FF,00,FF,0F,00,0F,FF,0F,F0 - hex 11,50,FF,0F,00,00,0F,FF,11,FF,0F,F0,0F,FF,11,0F,0F,00,FF,0F,00,00,0F,FF - hex 11,1F,1F,1F,1F,FF,0F,1F,11,11,1F,1F,1F,1F,11,1F,1F,1F,1F,1F,1F,FF,0F,1F - hex 11,1F,1F,1F,1F,00,FF,11,11,1F,1F,1F,1F,11,11,1F,1F,1F,1F,1F,1F,00,FF,11 - hex 11,11,11,11,11,1F,1F,11,11,11,11,11,11,11,11,11,11,11,11,11,11,1F,1F,11 - hex 11,11,11,11,11,1F,1F,11,11,11,11,11,11,11,11,11,11,11,11,11,11,1F,1F,11 + hex 11,F1,F1,11,11,11,11,11,11,11,F1,11,11,11,11,11,AF,FF,FF,11,11,11,11,11 + hex 11,F1,11,11,11,11,11,11,11,F1,F1,11,11,11,11,FF,0F,5F,11,11,11,11,11,11 + hex F1,FF,0F,FF,F1,F1,F1,F1,11,F1,00,AF,F1,F1,11,F1,00,FF,FF,F1,F1,F1,F1,F1 + hex F1,00,5F,F1,F1,F1,F1,F1,F1,FF,0F,FF,F1,11,11,FF,0F,00,F1,F1,F1,F1,F1,F1 + hex FF,F0,FF,AF,F0,FF,AF,0A,11,FA,00,FF,FA,0F,11,FF,00,FF,FF,AF,F0,FF,AF,00 + hex F5,00,FF,F5,00,00,F5,FF,FF,F0,FF,5F,F0,FF,11,F5,FF,00,FF,F5,00,00,F5,FF + hex 11,FF,0F,00,0F,FF,0F,F0,11,11,00,FF,0F,F0,11,FF,00,FF,0F,00,0F,FF,0F,F0 + hex 11,50,FF,0F,00,00,0F,FF,11,FF,0F,F0,0F,FF,11,0F,0F,00,FF,0F,00,00,0F,FF + hex 11,1F,1F,1F,1F,FF,0F,1F,11,11,1F,1F,1F,1F,11,1F,1F,1F,1F,1F,1F,FF,0F,1F + hex 11,1F,1F,1F,1F,00,FF,11,11,1F,1F,1F,1F,11,11,1F,1F,1F,1F,1F,1F,00,FF,11 + hex 11,11,11,11,11,1F,1F,11,11,11,11,11,11,11,11,11,11,11,11,11,11,1F,1F,11 + hex 11,11,11,11,11,1F,1F,11,11,11,11,11,11,11,11,11,11,11,11,11,11,1F,1F,11 -splosionMaskColor equ #$22 -splosionHeight equ #$06 -splosionWidth equ #$06 +splosionMaskColor equ #$22 +splosionHeight equ #$06 +splosionWidth equ #$06 ** Remember: Data is Aux cols, then main cols, next line, repeat splosionData - hex 28,82,22,22,22,82,12,22,22,22,12,21 - hex 22,CC,E8,C2,EC,28,21,D9,92,D1,99,22 - hex 22,28,EF,FE,8E,22,22,1D,FD,DF,21,22 - hex 22,C8,EF,8E,EE,22,22,DD,1D,DF,91,22 - hex 22,8C,28,22,2C,88,11,29,22,21,19,22 - hex 28,22,22,22,22,22,22,22,22,22,22,21 + hex 28,82,22,22,22,82,12,22,22,22,12,21 + hex 22,CC,E8,C2,EC,28,21,D9,92,D1,99,22 + hex 22,28,EF,FE,8E,22,22,1D,FD,DF,21,22 + hex 22,C8,EF,8E,EE,22,22,DD,1D,DF,91,22 + hex 22,8C,28,22,2C,88,11,29,22,21,19,22 + hex 28,22,22,22,22,22,22,22,22,22,22,21 -plaqueMaskColor equ #$22 -plaqueHeight equ #$06 -plaqueWidth equ #$13 +plaqueMaskColor equ #$22 +plaqueHeight equ #$06 +plaqueWidth equ #$13 ** Remember: Data is Aux cols, then main cols, next line, repeat plaqueData - hex E2,CE,CE,CE,CE,CE,CE,CE,CE,CE,DE,DE,DE,DE,DE,DE,DE,DE,E2,DD,9D,9D,9D,9D - hex 9D,9D,9D,BD,9D,9D,9D,9D,9D,9D,9D,9D,DD,22 - hex EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,99,DD,DD,DD,DD - hex DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,FB,62 - hex EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,B9,DD,DD,DD,DD - hex DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,FB,66 - hex EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,B9,DD,DD,DD,DD - hex DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,BF,66 - hex 2E,ED,ED,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,ED,ED,3E,DD,DF,DF,DB,DF - hex DF,DF,DF,DF,DF,DF,DF,DF,DB,DF,DF,DF,DD,26 - hex 22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,22,22,26,26,26,26 - hex 26,26,26,26,26,26,26,26,26,26,26,26,26,22 + hex E2,CE,CE,CE,CE,CE,CE,CE,CE,CE,DE,DE,DE,DE,DE,DE,DE,DE,E2,DD,9D,9D,9D,9D + hex 9D,9D,9D,BD,9D,9D,9D,9D,9D,9D,9D,9D,DD,22 + hex EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,99,DD,DD,DD,DD + hex DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,FB,62 + hex EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,B9,DD,DD,DD,DD + hex DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,FB,66 + hex EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,EE,B9,DD,DD,DD,DD + hex DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,BF,66 + hex 2E,ED,ED,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,EF,ED,ED,3E,DD,DF,DF,DB,DF + hex DF,DF,DF,DF,DF,DF,DF,DF,DB,DF,DF,DF,DD,26 + hex 22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,22,22,26,26,26,26 + hex 26,26,26,26,26,26,26,26,26,26,26,26,26,22 -youMaskColor equ #$11 -youHeight equ #$03 -youWidth equ #$06 +youMaskColor equ #$11 +youHeight equ #$03 +youWidth equ #$06 youData - hex 01,01,11,11,11,11,11,11,11,11,11,11 - hex 10,10,01,01,00,00,01,11,10,11,11,11 - hex 11,11,11,11,11,10,10,11,10,11,10,11 + hex 01,01,11,11,11,11,11,11,11,11,11,11 + hex 10,10,01,01,00,00,01,11,10,11,11,11 + hex 11,11,11,11,11,10,10,11,10,11,10,11 -hiMaskColor equ #$11 -hiHeight equ #$03 -hiWidth equ #$03 +hiMaskColor equ #$11 +hiHeight equ #$03 +hiWidth equ #$03 hiData - hex 01,01,01,11,11,11 - hex 00,00,01,10,11,11 - hex 10,10,10,11,11,11 + hex 01,01,01,11,11,11 + hex 00,00,01,10,11,11 + hex 10,10,10,11,11,11 -NumMaskColor equ #$11 -NumHeight equ #$03 -NumWidth equ #$02 -NumList da N0Data - da N1Data - da N2Data - da N3Data - da N4Data - da N5Data - da N6Data - da N7Data - da N8Data - da N9Data +NumMaskColor equ #$11 +NumHeight equ #$03 +NumWidth equ #$02 +NumList da N0Data + da N1Data + da N2Data + da N3Data + da N4Data + da N5Data + da N6Data + da N7Data + da N8Data + da N9Data N0Data - hex 01,01,10,11 - hex 00,00,11,11 - hex 10,10,01,11 + hex 01,01,10,11 + hex 00,00,11,11 + hex 10,10,01,11 N1Data - hex 01,11,00,11 - hex 11,11,00,11 - hex 01,01,00,11 + hex 01,11,00,11 + hex 11,11,00,11 + hex 01,01,00,11 N2Data - hex 01,01,10,11 - hex 11,10,01,11 - hex 00,01,01,11 + hex 01,01,10,11 + hex 11,10,01,11 + hex 00,01,01,11 N3Data - hex 10,01,10,11 - hex 11,01,10,11 - hex 01,10,01,11 + hex 10,01,10,11 + hex 11,01,10,11 + hex 01,10,01,11 N4Data - hex 00,01,11,11 - hex 00,00,01,11 - hex 11,00,11,11 + hex 00,01,11,11 + hex 00,00,01,11 + hex 11,00,11,11 N5Data - hex 00,10,10,11 - hex 10,01,10,11 - hex 10,10,01,11 + hex 00,10,10,11 + hex 10,01,10,11 + hex 10,10,01,11 N6Data - hex 01,11,10,11 - hex 00,01,10,11 - hex 10,10,01,11 + hex 01,11,10,11 + hex 00,01,10,11 + hex 10,10,01,11 N7Data - hex 10,00,10,11 - hex 11,10,01,11 - hex 11,11,00,11 + hex 10,00,10,11 + hex 11,10,01,11 + hex 11,11,00,11 N8Data - hex 01,01,10,11 - hex 01,01,10,11 - hex 10,10,01,11 + hex 01,01,10,11 + hex 01,01,10,11 + hex 10,10,01,11 N9Data - hex 01,01,10,11 - hex 10,00,01,11 - hex 11,10,01,11 + hex 01,01,10,11 + hex 10,00,01,11 + hex 11,10,01,11 -QRCodeMaskColor equ #$88 -QRCodeHeight equ #$0e -QRCodeWidth equ #$0e +QRCodeMaskColor equ #$88 +QRCodeHeight equ #$0e +QRCodeWidth equ #$0e QRCodeData - hex FF,0F,0F,0F,FF,FF,FF,0F,FF,FF,0F,0F,0F,FF,0F,0F,0F,0F,FF,FF,0F,FF,FF,0F - hex 0F,0F,0F,FF - hex FF,FF,0F,FF,FF,FF,FF,F0,F0,FF,FF,0F,FF,FF,00,0F,0F,00,F0,F0,FF,F0,F0,00 - hex 0F,0F,00,FF - hex FF,FF,00,FF,FF,00,0F,F0,FF,FF,FF,00,FF,FF,00,00,00,00,F0,F0,F0,F0,0F,00 - hex 00,00,00,FF - hex FF,0F,0F,0F,FF,F0,FF,F0,F0,FF,0F,0F,0F,FF,00,0F,0F,00,00,0F,00,0F,00,00 - hex 0F,0F,00,FF - hex FF,0F,0F,FF,0F,00,0F,0F,0F,0F,0F,0F,0F,FF,0F,0F,0F,0F,0F,F0,0F,00,FF,FF - hex FF,FF,FF,FF - hex FF,00,0F,FF,00,FF,F0,00,0F,0F,00,0F,00,FF,F0,F0,FF,0F,F0,00,0F,0F,00,0F - hex FF,FF,0F,FF - hex FF,00,F0,00,0F,0F,FF,0F,FF,00,FF,FF,0F,FF,F0,0F,FF,0F,00,0F,F0,00,F0,0F - hex 0F,0F,00,FF - hex FF,F0,00,F0,00,FF,F0,F0,0F,0F,F0,00,00,FF,00,0F,0F,0F,FF,0F,0F,0F,F0,0F - hex FF,FF,0F,FF - hex FF,FF,00,0F,F0,00,FF,0F,0F,00,00,F0,FF,FF,00,00,00,0F,FF,00,F0,F0,0F,00 - hex 0F,0F,F0,FF - hex FF,0F,0F,0F,FF,FF,F0,00,FF,FF,FF,00,0F,FF,0F,0F,0F,0F,00,FF,FF,0F,00,0F - hex 00,00,0F,FF - hex FF,FF,0F,FF,FF,00,FF,0F,0F,0F,0F,00,00,FF,00,0F,0F,00,0F,FF,00,00,00,0F - hex 00,0F,F0,FF - hex FF,FF,00,FF,FF,FF,F0,0F,00,F0,0F,FF,F0,FF,00,00,00,00,00,FF,0F,0F,F0,F0 - hex F0,00,00,FF - hex FF,0F,0F,0F,FF,00,0F,0F,F0,F0,00,00,0F,FF,00,0F,0F,00,00,F0,0F,0F,F0,FF - hex 00,0F,00,FF - hex FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF - hex FF,FF,FF,FF + hex FF,0F,0F,0F,FF,FF,FF,0F,FF,FF,0F,0F,0F,FF,0F,0F,0F,0F,FF,FF,0F,FF,FF,0F,0F,0F,0F,FF + hex FF,FF,0F,FF,FF,FF,FF,F0,F0,FF,FF,0F,FF,FF,00,0F,0F,00,F0,F0,FF,F0,F0,00,0F,0F,00,FF + hex FF,FF,00,FF,FF,00,0F,F0,FF,FF,FF,00,FF,FF,00,00,00,00,F0,F0,F0,F0,0F,00,00,00,00,FF + hex FF,0F,0F,0F,FF,F0,FF,F0,F0,FF,0F,0F,0F,FF,00,0F,0F,00,00,0F,00,0F,00,00,0F,0F,00,FF + hex FF,0F,0F,FF,0F,00,0F,0F,0F,0F,0F,0F,0F,FF,0F,0F,0F,0F,0F,F0,0F,00,FF,FF,FF,FF,FF,FF + hex FF,00,0F,FF,00,FF,F0,00,0F,0F,00,0F,00,FF,F0,F0,FF,0F,F0,00,0F,0F,00,0F,FF,FF,0F,FF + hex FF,00,F0,00,0F,0F,FF,0F,FF,00,FF,FF,0F,FF,F0,0F,FF,0F,00,0F,F0,00,F0,0F,0F,0F,00,FF + hex FF,F0,00,F0,00,FF,F0,F0,0F,0F,F0,00,00,FF,00,0F,0F,0F,FF,0F,0F,0F,F0,0F,FF,FF,0F,FF + hex FF,FF,00,0F,F0,00,FF,0F,0F,00,00,F0,FF,FF,00,00,00,0F,FF,00,F0,F0,0F,00,0F,0F,F0,FF + hex FF,0F,0F,0F,FF,FF,F0,00,FF,FF,FF,00,0F,FF,0F,0F,0F,0F,00,FF,FF,0F,00,0F,00,00,0F,FF + hex FF,FF,0F,FF,FF,00,FF,0F,0F,0F,0F,00,00,FF,00,0F,0F,00,0F,FF,00,00,00,0F,00,0F,F0,FF + hex FF,FF,00,FF,FF,FF,F0,0F,00,F0,0F,FF,F0,FF,00,00,00,00,00,FF,0F,0F,F0,F0,F0,00,00,FF + hex FF,0F,0F,0F,FF,00,0F,0F,F0,F0,00,00,0F,FF,00,0F,0F,00,00,F0,0F,0F,F0,FF,00,0F,00,FF + hex FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF diff --git a/src/numbers.s b/src/numbers.s index dff9153..c01cb94 100644 --- a/src/numbers.s +++ b/src/numbers.s @@ -2,192 +2,192 @@ * Well... optimized number drawing because, why not **** -BB equ #$00 -BW equ #$F0 -WB equ #$0F -WW equ #$FF +BB equ #$00 +BW equ #$F0 +WB equ #$0F +WW equ #$FF -DrawNum_Table da DrawNum_0 - da DrawNum_1 - da DrawNum_2 - da DrawNum_3 - da DrawNum_4 - da DrawNum_5 - da DrawNum_6 - da DrawNum_7 - da DrawNum_8 - da DrawNum_9 +DrawNum_Table da DrawNum_0 + da DrawNum_1 + da DrawNum_2 + da DrawNum_3 + da DrawNum_4 + da DrawNum_5 + da DrawNum_6 + da DrawNum_7 + da DrawNum_8 + da DrawNum_9 * y = x, a=val (0-9) DrawNum - asl - tax - lda DrawNum_Table,x - sta :jsrPtr+1 - lda DrawNum_Table+1,x - sta :jsrPtr+2 - tya - tax -:jsrPtr jsr DrawNum_0 - rts + asl + tax + lda DrawNum_Table,x + sta :jsrPtr+1 + lda DrawNum_Table+1,x + sta :jsrPtr+2 + tya + tax +:jsrPtr jsr DrawNum_0 + rts * x = x offset (even cols) 0-40 -DrawNum_0 sta TXTPAGE2 - lda #BB - sta Lo01,x - sta Lo02,x - sta Lo01+1,x - sta Lo02+1,X - sta TXTPAGE1 - lda #BW - sta Lo01,x - lda #WB - sta Lo02,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_0 sta TXTPAGE2 + lda #BB + sta Lo01,x + sta Lo02,x + sta Lo01+1,x + sta Lo02+1,X + sta TXTPAGE1 + lda #BW + sta Lo01,x + lda #WB + sta Lo02,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_1 sta TXTPAGE2 - lda #BW - sta Lo01,x - lda #WB - sta Lo02,x - sta Lo02+1,x - lda #WW - sta Lo01+1,x - sta TXTPAGE1 - sta Lo01+1,x - sta Lo02+1,x - lda #BB - sta Lo01,x - sta Lo02,x - rts +DrawNum_1 sta TXTPAGE2 + lda #BW + sta Lo01,x + lda #WB + sta Lo02,x + sta Lo02+1,x + lda #WW + sta Lo01+1,x + sta TXTPAGE1 + sta Lo01+1,x + sta Lo02+1,x + lda #BB + sta Lo01,x + sta Lo02,x + rts -DrawNum_2 sta TXTPAGE2 - lda #BW - sta Lo01,x - lda #WB - sta Lo02+1,x - lda #BB - sta Lo02,x - sta Lo01+1,x - sta TXTPAGE1 - sta Lo01,x - sta Lo02,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_2 sta TXTPAGE2 + lda #BW + sta Lo01,x + lda #WB + sta Lo02+1,x + lda #BB + sta Lo02,x + sta Lo01+1,x + sta TXTPAGE1 + sta Lo01,x + sta Lo02,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_3 sta TXTPAGE2 - lda #BW - sta Lo01,x - lda #WB - sta Lo02,x - lda #BB - sta Lo01+1,x - sta Lo02+1,x - sta TXTPAGE1 - sta Lo01,x - lda #WB - sta Lo02,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_3 sta TXTPAGE2 + lda #BW + sta Lo01,x + lda #WB + sta Lo02,x + lda #BB + sta Lo01+1,x + sta Lo02+1,x + sta TXTPAGE1 + sta Lo01,x + lda #WB + sta Lo02,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_4 sta TXTPAGE2 - lda #BB - sta Lo01,x - sta Lo01+1,x - sta Lo02+1,x - lda #BW - sta Lo02,x - sta TXTPAGE1 - sta Lo02,x - lda #WW - sta Lo01,x - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_4 sta TXTPAGE2 + lda #BB + sta Lo01,x + sta Lo01+1,x + sta Lo02+1,x + lda #BW + sta Lo02,x + sta TXTPAGE1 + sta Lo02,x + lda #WW + sta Lo01,x + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_5 sta TXTPAGE2 - lda #BW - sta Lo01+1,x - lda #WB - sta Lo02,x - lda #BB - sta Lo01,x - sta Lo02+1,x - sta TXTPAGE1 - sta Lo01,x - sta Lo02,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_5 sta TXTPAGE2 + lda #BW + sta Lo01+1,x + lda #WB + sta Lo02,x + lda #BB + sta Lo01,x + sta Lo02+1,x + sta TXTPAGE1 + sta Lo01,x + sta Lo02,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_6 sta TXTPAGE2 - lda #BB - sta Lo01,x - sta Lo02,x - sta Lo02+1,x - lda #WB - sta Lo01+1,x - sta TXTPAGE1 - sta Lo01,x - sta Lo02,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_6 sta TXTPAGE2 + lda #BB + sta Lo01,x + sta Lo02,x + sta Lo02+1,x + lda #WB + sta Lo01+1,x + sta TXTPAGE1 + sta Lo01,x + sta Lo02,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_7 sta TXTPAGE2 - lda #BW - sta Lo01,x - lda #WW - sta Lo02,x - sta Lo02+1,x - lda #BB - sta Lo01+1,x - sta TXTPAGE1 - sta Lo02,x - lda #BW - sta Lo01,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_7 sta TXTPAGE2 + lda #BW + sta Lo01,x + lda #WW + sta Lo02,x + sta Lo02+1,x + lda #BB + sta Lo01+1,x + sta TXTPAGE1 + sta Lo02,x + lda #BW + sta Lo01,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_8 sta TXTPAGE2 - lda #WB - sta Lo01,x - lda #BB - sta Lo02,X - sta Lo01+1,x - sta Lo02+1,x - sta TXTPAGE1 - sta Lo02,x - lda #BW - sta Lo01,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_8 sta TXTPAGE2 + lda #WB + sta Lo01,x + lda #BB + sta Lo02,X + sta Lo01+1,x + sta Lo02+1,x + sta TXTPAGE1 + sta Lo02,x + lda #BW + sta Lo01,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts -DrawNum_9 sta TXTPAGE2 - lda #BB - sta Lo01,x - sta Lo01+1,x - sta Lo02+1,x - lda #BW - sta Lo02,x - sta TXTPAGE1 - sta Lo01,x - sta Lo02,x - lda #WW - sta Lo01+1,x - sta Lo02+1,x - rts +DrawNum_9 sta TXTPAGE2 + lda #BB + sta Lo01,x + sta Lo01+1,x + sta Lo02+1,x + lda #BW + sta Lo02,x + sta TXTPAGE1 + sta Lo01,x + sta Lo02,x + lda #WW + sta Lo01+1,x + sta Lo02+1,x + rts diff --git a/src/pipes.s b/src/pipes.s index cde5f55..33cb34a 100644 --- a/src/pipes.s +++ b/src/pipes.s @@ -1,6 +1,6 @@ ************************************************** * Pipe Drawing Routines -* These are custom built to draw pipes that +* These are custom built to draw pipes that * move right-to-left only. There is no undraw. * It simply copies a blue pixel in the area to the * right of the column to restore the background. @@ -17,60 +17,60 @@ * hex bb,aa,77,77,66,77,66,66,22,66,22,22,aa,bb,bb ** "interleave" format - DO MONO -PipeBody_Main_E hex 55,ee,ee,cc,cc,44,00 -PipeBody_Main_O hex 00,ee,cc,cc,44,44,55,00 -PipeBody_Aux_E hex 00,77,66,66,22,22,aa,00 -PipeBody_Aux_O hex aa,77,77,66,66,22,00 - ELSE -PipeBody_Main_E hex 55,ee,ee,cc,cc,44,77 -PipeBody_Main_O hex 77,ee,cc,cc,44,44,55,77 -PipeBody_Aux_E hex bb,77,66,66,22,22,aa,bb -PipeBody_Aux_O hex aa,77,77,66,66,22,bb + DO MONO +PipeBody_Main_E hex 55,ee,ee,cc,cc,44,00 +PipeBody_Main_O hex 00,ee,cc,cc,44,44,55,00 +PipeBody_Aux_E hex 00,77,66,66,22,22,aa,00 +PipeBody_Aux_O hex aa,77,77,66,66,22,00 + ELSE +PipeBody_Main_E hex 55,ee,ee,cc,cc,44,77 +PipeBody_Main_O hex 77,ee,cc,cc,44,44,55,77 +PipeBody_Aux_E hex bb,77,66,66,22,22,aa,bb +PipeBody_Aux_O hex aa,77,77,66,66,22,bb - FIN + FIN -PipeInterval equ #60 ; game ticks to spawn new pipe -PipeSpawn db #45 ; our counter, starting point for spawning -PipeSpawnSema db 0 ; points to next spot (even if currently unavailable) -MaxPipes equ 2 -PipeSet ds MaxPipes*3 ; array of pipe{x,y1,y2} +PipeInterval equ #60 ; game ticks to spawn new pipe +PipeSpawn db #45 ; our counter, starting point for spawning +PipeSpawnSema db 0 ; points to next spot (even if currently unavailable) +MaxPipes equ 2 +PipeSet ds MaxPipes*3 ; array of pipe{x,y1,y2} -TopPipes ds MaxPipes*2 ; Space for pipe X,Y -BotPipes ds MaxPipes*2 ; " +TopPipes ds MaxPipes*2 ; Space for pipe X,Y +BotPipes ds MaxPipes*2 ; " -PIPE_SP equ $F0 +PIPE_SP equ $F0 -PIPE_DP equ $00 -PIPE_DP0 equ $00 -PIPE_DP1 equ $02 -PIPE_DP2 equ $04 -PIPE_DP3 equ $06 -PIPE_DP4 equ $08 +PIPE_DP equ $00 +PIPE_DP0 equ $00 +PIPE_DP1 equ $02 +PIPE_DP2 equ $04 +PIPE_DP3 equ $06 +PIPE_DP4 equ $08 -PIPE_RCLIP equ #40 -PIPE_WIDTH equ #15 -PIPE_UNDERVAL db 0 +PIPE_RCLIP equ #40 +PIPE_WIDTH equ #15 +PIPE_UNDERVAL db 0 -PIPE_X db 0 ; the 0-96? X value (screen = 16-95) -PIPE_TOP_Y db 0 ; MEMORY DLR Y index, 0-24 -PIPE_BOT_Y db 0 ; MEMORY DLR Y index, 0-24 +PIPE_X db 0 ; the 0-96? X value (screen = 16-95) +PIPE_TOP_Y db 0 ; MEMORY DLR Y index, 0-24 +PIPE_BOT_Y db 0 ; MEMORY DLR Y index, 0-24 -PIPE_X_IDX db 0 ; MEMORY DLR X index, 0-39 -PIPE_Y_IDX db 0 ; Y*2 for lookups in Lo-Res line table -PIPE_BODY_TOP db 0 ; Y val -PIPE_BODY_BOT db 0 ; Y val +PIPE_X_IDX db 0 ; MEMORY DLR X index, 0-39 +PIPE_Y_IDX db 0 ; Y*2 for lookups in Lo-Res line table +PIPE_BODY_TOP db 0 ; Y val +PIPE_BODY_BOT db 0 ; Y val -PipeXScore equ 50 ; pipe at this value causes score increase +PipeXScore equ 50 ; pipe at this value causes score increase ** LEGACY ! DELETE AFTER REWRITE ! -PIPE_X_FULL db 0 -PIPE_Y db 0 -PIPE_T_B db 0 -PIPE_TOP equ 0 ; enum for top pipe type -PIPE_BOT equ 1 ; enum for bottom pipe type +PIPE_X_FULL db 0 +PIPE_Y db 0 +PIPE_T_B db 0 +PIPE_TOP equ 0 ; enum for top pipe type +PIPE_BOT equ 1 ; enum for bottom pipe type * pipe min = 15x6 pixels = 15x3 bytes * playfield = 80x48 pixels = 80x24 bytes @@ -79,281 +79,281 @@ PIPE_BOT equ 1 ; enum for bottom pipe type * we don't care about screen pixel X/Y though we could translate * the drawing routine will handle it, and we will do collision * in the bird drawing routine -UpdatePipes inc PipeSpawn - lda PipeSpawn - cmp #PipeInterval - bne :noSpawn - jsr SpawnPipe - lda #0 - sta PipeSpawn +UpdatePipes inc PipeSpawn + lda PipeSpawn + cmp #PipeInterval + bne :noSpawn + jsr SpawnPipe + lda #0 + sta PipeSpawn :noSpawn MovePipes - ldx #2 ;MaxPipes*2? -:loop lda TopPipes,x - beq :noPipe - dec TopPipes,x - cmp #PipeXScore+1 ; A should still be set - bne :noScore -:ScoreUp sed - lda ScoreLo - clc - adc #1 - sta ScoreLo - bcc :noFlip - lda ScoreHi - adc #0 - sta ScoreHi -:noFlip cld + ldx #2 ;MaxPipes*2? +:loop lda TopPipes,x + beq :noPipe + dec TopPipes,x + cmp #PipeXScore+1 ; A should still be set + bne :noScore +:ScoreUp sed + lda ScoreLo + clc + adc #1 + sta ScoreLo + bcc :noFlip + lda ScoreHi + adc #0 + sta ScoreHi +:noFlip cld :noScore -:noPipe dex - dex - bpl :loop - jmp UpdatePipesDone +:noPipe dex + dex + bpl :loop + jmp UpdatePipesDone -SpawnPipe lda PipeSpawnSema - asl ; convert to word index - tax - jsr GetRand ; Build Y Value - and #$0F ; @todo - this doesn't check bounds.. just for testing - lsr ; even smaller - sta TopPipes+1,x - clc - adc #13 - sta BotPipes+1,x - lda #95 ; Build X Value ;) - sta TopPipes,x - inc PipeSpawnSema - lda PipeSpawnSema - cmp #MaxPipes - bne :done - lda #0 ; flip our semaphore/counter to 0 - sta PipeSpawnSema -:done rts +SpawnPipe lda PipeSpawnSema + asl ; convert to word index + tax + jsr GetRand ; Build Y Value + and #$0F ; @todo - this doesn't check bounds.. just for testing + lsr ; even smaller + sta TopPipes+1,x + clc + adc #13 + sta BotPipes+1,x + lda #95 ; Build X Value ;) + sta TopPipes,x + inc PipeSpawnSema + lda PipeSpawnSema + cmp #MaxPipes + bne :done + lda #0 ; flip our semaphore/counter to 0 + sta PipeSpawnSema +:done rts * A= x coord X=top y Y=bot y DrawPipes - lda TopPipes ;Pipe X - beq :noPipes0 - ldx TopPipes+1 ;top Y - ldy BotPipes+1 ;bottom y - jsr DrawPipe + lda TopPipes ;Pipe X + beq :noPipes0 + ldx TopPipes+1 ;top Y + ldy BotPipes+1 ;bottom y + jsr DrawPipe :noPipes0 - lda TopPipes+2 ;Pipe X - beq :noPipes1 - ldx TopPipes+3 ;top Y - ldy BotPipes+3 ;bottom y - jsr DrawPipe + lda TopPipes+2 ;Pipe X + beq :noPipes1 + ldx TopPipes+3 ;top Y + ldy BotPipes+3 ;bottom y + jsr DrawPipe :noPipes1 - rts -*jmp DrawPipesDone ;Back to main + rts + * Used by all of the routines that draw the pipe caps SetPipeCapPtrs - ldy PIPE_TOP_Y - lda LoLineTableL,y - sta PIPE_DP0 - lda LoLineTableH,y - sta PIPE_DP0+1 ; cap top line - lda LoLineTableL+1,y - sta PIPE_DP1 - lda LoLineTableH+1,y - sta PIPE_DP1+1 ; cap bottom line + ldy PIPE_TOP_Y + lda LoLineTableL,y + sta PIPE_DP0 + lda LoLineTableH,y + sta PIPE_DP0+1 ; cap top line + lda LoLineTableL+1,y + sta PIPE_DP1 + lda LoLineTableH+1,y + sta PIPE_DP1+1 ; cap bottom line - ldy PIPE_BOT_Y - lda LoLineTableL,y - sta PIPE_DP2 - lda LoLineTableH,y - sta PIPE_DP2+1 ; cap top line - lda LoLineTableL+1,y - sta PIPE_DP3 - lda LoLineTableH+1,y - sta PIPE_DP3+1 ; cap bottom line - rts + ldy PIPE_BOT_Y + lda LoLineTableL,y + sta PIPE_DP2 + lda LoLineTableH,y + sta PIPE_DP2+1 ; cap top line + lda LoLineTableL+1,y + sta PIPE_DP3 + lda LoLineTableH+1,y + sta PIPE_DP3+1 ; cap bottom line + rts * A= x coord X=top y Y=bot y -DrawPipe sta PIPE_X - stx PIPE_TOP_Y - sty PIPE_BOT_Y - cmp #95-13 - bcc :notOver -:over sec ; clipped on right - sbc #16 - lsr - sta PIPE_X_IDX - bcc :evenR -:oddR jmp DrawPipeOddR -:evenR jmp DrawPipeEvenR +DrawPipe sta PIPE_X + stx PIPE_TOP_Y + sty PIPE_BOT_Y + cmp #95-13 + bcc :notOver +:over sec ; clipped on right + sbc #16 + lsr + sta PIPE_X_IDX + bcc :evenR +:oddR jmp DrawPipeOddR +:evenR jmp DrawPipeEvenR -:notOver cmp #16 - bcs :NOCLIP +:notOver cmp #16 + bcs :NOCLIP :under - ; clipped on left - ; X = 0-16 - sta PIPE_UNDERVAL ; we're going to flip it around - lda #16 ; and move backwards from 0. - sec - sbc PIPE_UNDERVAL - pha - lsr - sta PIPE_UNDERVAL - lda #0 - sec - sbc PIPE_UNDERVAL - tax - pla - lsr - bcc :evenL -:oddL dex ; downshift * 1 - txa - sta PIPE_X_IDX - jmp DrawPipeOddL -:evenL txa - sta PIPE_X_IDX - jmp DrawPipeEvenL + ; clipped on left + ; X = 0-16 + sta PIPE_UNDERVAL ; we're going to flip it around + lda #16 ; and move backwards from 0. + sec + sbc PIPE_UNDERVAL + pha + lsr + sta PIPE_UNDERVAL + lda #0 + sec + sbc PIPE_UNDERVAL + tax + pla + lsr + bcc :evenL +:oddL dex ; downshift * 1 + txa + sta PIPE_X_IDX + jmp DrawPipeOddL +:evenL txa + sta PIPE_X_IDX + jmp DrawPipeEvenL -:NOCLIP lda PIPE_X - sec - sbc #16 - lsr - sta PIPE_X_IDX - bcc :even -:odd jmp DrawPipeOdd -:even jmp DrawPipeEven +:NOCLIP lda PIPE_X + sec + sbc #16 + lsr + sta PIPE_X_IDX + bcc :even +:odd jmp DrawPipeOdd +:even jmp DrawPipeEven DrawPipeEven - jsr SetPipeCapPtrs + jsr SetPipeCapPtrs - sta TXTPAGE2 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ; optimized by hand, not perfect, but big help - ;col 0 - lda #$AA - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - iny ;col 2 - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A7 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 4 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 6 - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 8 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 10 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 12 - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 14 (final!) - lda #BGCOLORAUX ; BGCOLOR! Last column, no need to undraw whole pipe - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + sta TXTPAGE2 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ; optimized by hand, not perfect, but big help + ;col 0 + lda #$AA + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + iny ;col 2 + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A7 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 4 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 6 + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 8 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 10 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 12 + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 14 (final!) + lda #BGCOLORAUX ; BGCOLOR! Last column, no need to undraw whole pipe + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y - sta TXTPAGE1 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ;col 1 - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5E - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 3 - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 5 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 7 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 9 - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$54 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 11 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 13 - lda #$55 - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + sta TXTPAGE1 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ;col 1 + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5E + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 3 + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 5 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 7 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 9 + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$54 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 11 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 13 + lda #$55 + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y -* Handle body - lda #0 - sta PIPE_Y ; current line - lda PIPE_TOP_Y - sta PIPE_BODY_BOT - jsr DrawPipeBodyEven +* Handle body + lda #0 + sta PIPE_Y ; current line + lda PIPE_TOP_Y + sta PIPE_BODY_BOT + jsr DrawPipeBodyEven - ldy PIPE_BOT_Y - iny - iny - sty PIPE_Y ; current line - lda #22 - sta PIPE_BODY_BOT - jsr DrawPipeBodyEven + ldy PIPE_BOT_Y + iny + iny + sty PIPE_Y ; current line + lda #22 + sta PIPE_BODY_BOT + jsr DrawPipeBodyEven - rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! - ; !!! We are actually returning for parent DrawPipe + rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! + ; !!! We are actually returning for parent DrawPipe @@ -361,68 +361,68 @@ DrawPipeEven DrawPipeBodyEven -:loop ldy PIPE_Y - cpy PIPE_BODY_BOT - bcs :done +:loop ldy PIPE_Y + cpy PIPE_BODY_BOT + bcs :done - lda LoLineTableL,y - sta PIPE_DP - lda LoLineTableH,y - sta PIPE_DP+1 ; pointer to line on screen + lda LoLineTableL,y + sta PIPE_DP + lda LoLineTableH,y + sta PIPE_DP+1 ; pointer to line on screen - sta TXTPAGE1 + sta TXTPAGE1 *** Version 3 - FULL OPTIMIZATION - ldy PIPE_X_IDX - lda #$55 ; PipeBody_Main_E - sta (PIPE_DP),y - iny - lda #$EE - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$CC - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$44 - sta (PIPE_DP),y - iny - lda #BGCOLOR - sta (PIPE_DP),y + ldy PIPE_X_IDX + lda #$55 ; PipeBody_Main_E + sta (PIPE_DP),y + iny + lda #$EE + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$CC + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$44 + sta (PIPE_DP),y + iny + lda #BGCOLOR + sta (PIPE_DP),y - sta TXTPAGE2 + sta TXTPAGE2 *** Version 3 - FULL OPTIMIZATION - ldy PIPE_X_IDX - ;lda #$BB ; PipeBody_Aux_E - ;sta (PIPE_DP),y - iny - lda #$77 - sta (PIPE_DP),y - iny - lda #$66 - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$22 - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$AA - sta (PIPE_DP),y - iny - lda #BGCOLORAUX - sta (PIPE_DP),y + ldy PIPE_X_IDX + ;lda #$BB ; PipeBody_Aux_E + ;sta (PIPE_DP),y + iny + lda #$77 + sta (PIPE_DP),y + iny + lda #$66 + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$22 + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$AA + sta (PIPE_DP),y + iny + lda #BGCOLORAUX + sta (PIPE_DP),y - inc PIPE_Y - jmp :loop + inc PIPE_Y + jmp :loop -:done rts +:done rts @@ -431,1014 +431,1014 @@ DrawPipeBodyEven DrawPipeOdd - jsr SetPipeCapPtrs - sta TXTPAGE1 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ; for this "odd" routine, we add 1 for TXTPAGE2 + jsr SetPipeCapPtrs + sta TXTPAGE1 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ; for this "odd" routine, we add 1 for TXTPAGE2 - ; optimized by hand, not perfect, but big help - ;col 0 - lda #$55 - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - iny ;col 2 - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5E - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 4 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 6 - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 8 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 10 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 12 - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$54 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 14 (final!) - lda #BGCOLOR - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + ; optimized by hand, not perfect, but big help + ;col 0 + lda #$55 + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + iny ;col 2 + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5E + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 4 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 6 + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 8 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 10 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 12 + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$54 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 14 (final!) + lda #BGCOLOR + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP - sta TXTPAGE2 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - iny ; TXTPAGE2 is +1 in "odd" mode - ;col 1 - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A7 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 3 - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 5 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 7 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 9 - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 11 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 13 - lda #$AA - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + sta TXTPAGE2 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + iny ; TXTPAGE2 is +1 in "odd" mode + ;col 1 + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A7 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 3 + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 5 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 7 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 9 + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 11 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 13 + lda #$AA + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP2 -* Handle body - lda #0 - sta PIPE_Y ; current line - lda PIPE_TOP_Y - sta PIPE_BODY_BOT - jsr DrawPipeBodyOdd +* Handle body + lda #0 + sta PIPE_Y ; current line + lda PIPE_TOP_Y + sta PIPE_BODY_BOT + jsr DrawPipeBodyOdd - ldy PIPE_BOT_Y - iny - iny - sty PIPE_Y ; current line - lda #22 - sta PIPE_BODY_BOT - jsr DrawPipeBodyOdd + ldy PIPE_BOT_Y + iny + iny + sty PIPE_Y ; current line + lda #22 + sta PIPE_BODY_BOT + jsr DrawPipeBodyOdd DrawPipeBodyOdd -:loop ldy PIPE_Y - cpy PIPE_BODY_BOT - bcs :done +:loop ldy PIPE_Y + cpy PIPE_BODY_BOT + bcs :done - lda LoLineTableL,y - sta PIPE_DP - lda LoLineTableH,y - sta PIPE_DP+1 ; pointer to line on screen + lda LoLineTableL,y + sta PIPE_DP + lda LoLineTableH,y + sta PIPE_DP+1 ; pointer to line on screen - sta TXTPAGE1 + sta TXTPAGE1 *** Version 3 - FULL OPTIMIZATION - ldy PIPE_X_IDX - ;lda #$77 ; PipeBody_Main_O - ;sta (PIPE_DP),y - iny - lda #$EE - sta (PIPE_DP),y - iny - lda #$CC - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$44 - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$55 - sta (PIPE_DP),y - iny - lda #BGCOLOR - sta (PIPE_DP),y + ldy PIPE_X_IDX + ;lda #$77 ; PipeBody_Main_O + ;sta (PIPE_DP),y + iny + lda #$EE + sta (PIPE_DP),y + iny + lda #$CC + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$44 + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$55 + sta (PIPE_DP),y + iny + lda #BGCOLOR + sta (PIPE_DP),y - sta TXTPAGE2 + sta TXTPAGE2 *** Version 3 - FULL OPTIMIZATION - ldy PIPE_X_IDX - iny - lda #$AA ; PipeBody_Aux_O - sta (PIPE_DP),y - iny - lda #$77 - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$66 - sta (PIPE_DP),y - iny - sta (PIPE_DP),y - iny - lda #$22 - sta (PIPE_DP),y - iny - lda #BGCOLORAUX - sta (PIPE_DP),y + ldy PIPE_X_IDX + iny + lda #$AA ; PipeBody_Aux_O + sta (PIPE_DP),y + iny + lda #$77 + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$66 + sta (PIPE_DP),y + iny + sta (PIPE_DP),y + iny + lda #$22 + sta (PIPE_DP),y + iny + lda #BGCOLORAUX + sta (PIPE_DP),y - inc PIPE_Y - jmp :loop - ;sec - ;bcs :loop -:done rts + inc PIPE_Y + jmp :loop + ;sec + ;bcs :loop +:done rts DrawPipeEvenR - jsr SetPipeCapPtrs + jsr SetPipeCapPtrs - sta TXTPAGE2 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ; optimized by hand, not perfect, but big help - ;col 0 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$AA - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - iny ;col 2 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A7 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 4 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 6 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 8 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 10 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 12 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 14 (final!) - cpy #PIPE_RCLIP - bcs :RCLIP - lda #BGCOLORAUX - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + sta TXTPAGE2 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ; optimized by hand, not perfect, but big help + ;col 0 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$AA + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + iny ;col 2 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A7 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 4 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 6 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 8 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 10 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 12 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 14 (final!) + cpy #PIPE_RCLIP + bcs :RCLIP + lda #BGCOLORAUX + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP - sta TXTPAGE1 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ;col 1 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5E - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 3 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 5 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 7 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 9 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$54 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 11 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 13 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$55 - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + sta TXTPAGE1 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ;col 1 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5E + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 3 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 5 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 7 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 9 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$54 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 11 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 13 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$55 + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP2 -* Handle body - lda #0 - sta PIPE_Y ; current line - lda PIPE_TOP_Y - sta PIPE_BODY_BOT - jsr DrawPipeBodyEvenR +* Handle body + lda #0 + sta PIPE_Y ; current line + lda PIPE_TOP_Y + sta PIPE_BODY_BOT + jsr DrawPipeBodyEvenR - ldy PIPE_BOT_Y - iny - iny - sty PIPE_Y ; current line - lda #22 - sta PIPE_BODY_BOT - jsr DrawPipeBodyEvenR + ldy PIPE_BOT_Y + iny + iny + sty PIPE_Y ; current line + lda #22 + sta PIPE_BODY_BOT + jsr DrawPipeBodyEvenR - rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! - ; !!! We are actually returning for parent DrawPipe + rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! + ; !!! We are actually returning for parent DrawPipe DrawPipeBodyEvenR -:loop ldy PIPE_Y - cpy PIPE_BODY_BOT - bcs :done +:loop ldy PIPE_Y + cpy PIPE_BODY_BOT + bcs :done - lda LoLineTableL,y - sta PIPE_DP - lda LoLineTableH,y - sta PIPE_DP+1 ; pointer to line on screen + lda LoLineTableL,y + sta PIPE_DP + lda LoLineTableH,y + sta PIPE_DP+1 ; pointer to line on screen - sta TXTPAGE1 + sta TXTPAGE1 *** Version 2.1 - lda PIPE_X_IDX - clc - adc #PIPE_WIDTH/2-1 - pha ;PHA for below loop - tay - ldx #PIPE_WIDTH/2-1 -:oddLoop cpy #PIPE_RCLIP - bcs :oddBreak - lda PipeBody_Main_E,x - sta (PIPE_DP),y + lda PIPE_X_IDX + clc + adc #PIPE_WIDTH/2-1 + pha ;PHA for below loop + tay + ldx #PIPE_WIDTH/2-1 +:oddLoop cpy #PIPE_RCLIP + bcs :oddBreak + lda PipeBody_Main_E,x + sta (PIPE_DP),y :oddBreak - dey - dex - bpl :oddLoop + dey + dex + bpl :oddLoop - sta TXTPAGE2 + sta TXTPAGE2 *** Version 2.1 - pla - tay ;PHA from above - iny - ldx #PIPE_WIDTH/2 -:evenLoop cpy #PIPE_RCLIP - bcs :evenBreak - lda PipeBody_Aux_E,x - sta (PIPE_DP),y + pla + tay ;PHA from above + iny + ldx #PIPE_WIDTH/2 +:evenLoop cpy #PIPE_RCLIP + bcs :evenBreak + lda PipeBody_Aux_E,x + sta (PIPE_DP),y :evenBreak - dey - dex - bpl :evenLoop - inc PIPE_Y - jmp :loop + dey + dex + bpl :evenLoop + inc PIPE_Y + jmp :loop -:done rts +:done rts DrawPipeOddR - jsr SetPipeCapPtrs - sta TXTPAGE1 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ; for this "odd" routine, we add 1 for TXTPAGE2 + jsr SetPipeCapPtrs + sta TXTPAGE1 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ; for this "odd" routine, we add 1 for TXTPAGE2 - ; optimized by hand, not perfect, but big help - ;col 0 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$55 - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - iny ;col 2 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5E - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 4 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 6 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 8 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 10 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 12 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$54 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 14 (final!) - cpy #PIPE_RCLIP - bcs :RCLIP - lda #BGCOLOR - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + ; optimized by hand, not perfect, but big help + ;col 0 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$55 + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + iny ;col 2 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5E + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 4 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 6 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 8 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 10 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 12 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$54 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 14 (final!) + cpy #PIPE_RCLIP + bcs :RCLIP + lda #BGCOLOR + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP - sta TXTPAGE2 - ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - iny ; TXTPAGE2 is +1 in "odd" mode - ;col 1 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A7 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 3 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 5 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 7 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 9 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - iny ;col 11 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - iny ;col 13 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$AA - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + sta TXTPAGE2 + ldy PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + iny ; TXTPAGE2 is +1 in "odd" mode + ;col 1 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A7 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 3 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 5 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 7 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 9 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + iny ;col 11 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + iny ;col 13 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$AA + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP2 -* Handle body - lda #0 - sta PIPE_Y ; current line - lda PIPE_TOP_Y - sta PIPE_BODY_BOT - jsr DrawPipeBodyOddR +* Handle body + lda #0 + sta PIPE_Y ; current line + lda PIPE_TOP_Y + sta PIPE_BODY_BOT + jsr DrawPipeBodyOddR - ldy PIPE_BOT_Y - iny - iny - sty PIPE_Y ; current line - lda #22 - sta PIPE_BODY_BOT - jsr DrawPipeBodyOddR + ldy PIPE_BOT_Y + iny + iny + sty PIPE_Y ; current line + lda #22 + sta PIPE_BODY_BOT + jsr DrawPipeBodyOddR - rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! - ; !!! We are actually returning for parent DrawPipe + rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! + ; !!! We are actually returning for parent DrawPipe DrawPipeBodyOddR -:loop ldy PIPE_Y - cpy PIPE_BODY_BOT - bcs :done +:loop ldy PIPE_Y + cpy PIPE_BODY_BOT + bcs :done - lda LoLineTableL,y - sta PIPE_DP - lda LoLineTableH,y - sta PIPE_DP+1 ; pointer to line on screen + lda LoLineTableL,y + sta PIPE_DP + lda LoLineTableH,y + sta PIPE_DP+1 ; pointer to line on screen - sta TXTPAGE1 + sta TXTPAGE1 *** Version 2.1 - lda PIPE_X_IDX - clc - adc #PIPE_WIDTH/2 - pha ;PHA for below loop - tay ;\_ skip col 0 (bg color) - iny ;/ - ldx #PIPE_WIDTH/2+1 -:oddLoop cpy #PIPE_RCLIP - bcs :oddBreak - lda PipeBody_Main_O,x - sta (PIPE_DP),y + lda PIPE_X_IDX + clc + adc #PIPE_WIDTH/2 + pha ;PHA for below loop + tay ;\_ skip col 0 (bg color) + iny ;/ + ldx #PIPE_WIDTH/2+1 +:oddLoop cpy #PIPE_RCLIP + bcs :oddBreak + lda PipeBody_Main_O,x + sta (PIPE_DP),y :oddBreak - dey - dex - bne :oddLoop ; we can skip the first pixel, transparent + dey + dex + bne :oddLoop ; we can skip the first pixel, transparent - sta TXTPAGE2 + sta TXTPAGE2 *** Version 2.1 - pla - tay ;PHA from above - ldx #PIPE_WIDTH/2-1 -:evenLoop cpy #PIPE_RCLIP - bcs :evenBreak - lda PipeBody_Aux_O,x - sta (PIPE_DP),y + pla + tay ;PHA from above + ldx #PIPE_WIDTH/2-1 +:evenLoop cpy #PIPE_RCLIP + bcs :evenBreak + lda PipeBody_Aux_O,x + sta (PIPE_DP),y :evenBreak - dey - dex - bpl :evenLoop + dey + dex + bpl :evenLoop - inc PIPE_Y - jmp :loop -:done rts + inc PIPE_Y + jmp :loop +:done rts DrawPipeEvenL - jsr SetPipeCapPtrs - sta TXTPAGE2 - lda PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ; optimized by hand, not perfect, but big help - clc - adc #PIPE_WIDTH/2 - tax ;stash for below loop - tay - ;col 14 (rightmost) - cpy #PIPE_RCLIP - bcs :RCLIP - lda #BGCOLORAUX - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - dey ;col 12 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 10 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 8 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 6 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 4 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A7 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 2 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 0 (final! leftmost) - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$AA - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + jsr SetPipeCapPtrs + sta TXTPAGE2 + lda PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ; optimized by hand, not perfect, but big help + clc + adc #PIPE_WIDTH/2 + tax ;stash for below loop + tay + ;col 14 (rightmost) + cpy #PIPE_RCLIP + bcs :RCLIP + lda #BGCOLORAUX + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + dey ;col 12 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 10 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 8 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 6 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 4 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A7 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 2 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 0 (final! leftmost) + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$AA + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP - sta TXTPAGE1 - txa - tay - dey - ;col 13 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$55 - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - dey ;col 11 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$54 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 9 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 7 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 5 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 3 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 1 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5E - sta (PIPE_DP1),y - sta (PIPE_DP3),y + sta TXTPAGE1 + txa + tay + dey + ;col 13 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$55 + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + dey ;col 11 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$54 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 9 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 7 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 5 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 3 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 1 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5E + sta (PIPE_DP1),y + sta (PIPE_DP3),y :RCLIP2 -* Handle body - lda #0 - sta PIPE_Y ; current line - lda PIPE_TOP_Y - sta PIPE_BODY_BOT - jsr DrawPipeBodyEvenL +* Handle body + lda #0 + sta PIPE_Y ; current line + lda PIPE_TOP_Y + sta PIPE_BODY_BOT + jsr DrawPipeBodyEvenL - ldy PIPE_BOT_Y - iny - iny - sty PIPE_Y ; current line - lda #22 - sta PIPE_BODY_BOT - jsr DrawPipeBodyEvenL + ldy PIPE_BOT_Y + iny + iny + sty PIPE_Y ; current line + lda #22 + sta PIPE_BODY_BOT + jsr DrawPipeBodyEvenL - rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! - ; !!! We are actually returning for parent DrawPipe + rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! + ; !!! We are actually returning for parent DrawPipe DrawPipeBodyEvenL -:loop ldy PIPE_Y - cpy PIPE_BODY_BOT - beq :done +:loop ldy PIPE_Y + cpy PIPE_BODY_BOT + beq :done - lda LoLineTableL,y - sta PIPE_DP - lda LoLineTableH,y - sta PIPE_DP+1 ; pointer to line on screen + lda LoLineTableL,y + sta PIPE_DP + lda LoLineTableH,y + sta PIPE_DP+1 ; pointer to line on screen - sta TXTPAGE2 - lda PIPE_X_IDX - clc - adc #PIPE_WIDTH/2 - bmi :done - pha ;PHA for below loop - tay - ldx #PIPE_WIDTH/2 + sta TXTPAGE2 + lda PIPE_X_IDX + clc + adc #PIPE_WIDTH/2 + bmi :done + pha ;PHA for below loop + tay + ldx #PIPE_WIDTH/2 -:evenLoop lda PipeBody_Aux_E,x - sta (PIPE_DP),y - dex - dey - bpl :evenLoop +:evenLoop lda PipeBody_Aux_E,x + sta (PIPE_DP),y + dex + dey + bpl :evenLoop - sta TXTPAGE1 - pla ;PLA from above - tay - ldx #PIPE_WIDTH/2 + sta TXTPAGE1 + pla ;PLA from above + tay + ldx #PIPE_WIDTH/2 -:oddLoop lda PipeBody_Main_E,x - sta (PIPE_DP),y - dex - dey - bpl :oddLoop +:oddLoop lda PipeBody_Main_E,x + sta (PIPE_DP),y + dex + dey + bpl :oddLoop - inc PIPE_Y - jmp :loop -:done rts + inc PIPE_Y + jmp :loop +:done rts DrawPipeOddL - jsr SetPipeCapPtrs - sta TXTPAGE1 - lda PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 - ; optimized by hand, not perfect, but big help - clc - adc #PIPE_WIDTH/2 - tax ;stash for below loop - tay - ;col 14 (rightmost) - cpy #PIPE_RCLIP - bcs :RCLIP - lda #BGCOLOR - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - dey ;col 12 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$45 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$54 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 10 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 8 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$C5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 6 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5C - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 4 - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$5E - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 2 - cpy #PIPE_RCLIP - bcs :RCLIP - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$E5 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 0 (final! leftmost) - cpy #PIPE_RCLIP - bcs :RCLIP - lda #$55 - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y + jsr SetPipeCapPtrs + sta TXTPAGE1 + lda PIPE_X_IDX ; y= the x offset... yay dp indexing on 6502 + ; optimized by hand, not perfect, but big help + clc + adc #PIPE_WIDTH/2 + tax ;stash for below loop + tay + ;col 14 (rightmost) + cpy #PIPE_RCLIP + bcs :RCLIP + lda #BGCOLOR + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + dey ;col 12 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$45 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$54 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 10 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 8 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$C5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 6 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5C + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 4 + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$5E + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 2 + cpy #PIPE_RCLIP + bcs :RCLIP + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$E5 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 0 (final! leftmost) + cpy #PIPE_RCLIP + bcs :RCLIP + lda #$55 + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y :RCLIP - sta TXTPAGE2 - txa - tay - ;col 13 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$AA - sta (PIPE_DP0),y - sta (PIPE_DP1),y - sta (PIPE_DP2),y - sta (PIPE_DP3),y - dey ;col 11 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 9 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$2A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 7 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 5 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - lda #$6A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - dey ;col 3 - cpy #PIPE_RCLIP - bcs :RCLIP2 - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A6 - sta (PIPE_DP1),y - sta (PIPE_DP3),y - dey ;col 1 - cpy #PIPE_RCLIP - bcs :RCLIP2 - lda #$7A - sta (PIPE_DP0),y - sta (PIPE_DP2),y - lda #$A7 - sta (PIPE_DP1),y - sta (PIPE_DP3),y + sta TXTPAGE2 + txa + tay + ;col 13 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$AA + sta (PIPE_DP0),y + sta (PIPE_DP1),y + sta (PIPE_DP2),y + sta (PIPE_DP3),y + dey ;col 11 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 9 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$2A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 7 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 5 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + lda #$6A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + dey ;col 3 + cpy #PIPE_RCLIP + bcs :RCLIP2 + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A6 + sta (PIPE_DP1),y + sta (PIPE_DP3),y + dey ;col 1 + cpy #PIPE_RCLIP + bcs :RCLIP2 + lda #$7A + sta (PIPE_DP0),y + sta (PIPE_DP2),y + lda #$A7 + sta (PIPE_DP1),y + sta (PIPE_DP3),y :RCLIP2 -* Handle body - lda #0 - sta PIPE_Y ; current line - lda PIPE_TOP_Y - sta PIPE_BODY_BOT - jsr DrawPipeBodyOddL +* Handle body + lda #0 + sta PIPE_Y ; current line + lda PIPE_TOP_Y + sta PIPE_BODY_BOT + jsr DrawPipeBodyOddL - ldy PIPE_BOT_Y - iny - iny - sty PIPE_Y ; current line - lda #22 - sta PIPE_BODY_BOT - jsr DrawPipeBodyOddL + ldy PIPE_BOT_Y + iny + iny + sty PIPE_Y ; current line + lda #22 + sta PIPE_BODY_BOT + jsr DrawPipeBodyOddL - rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! - ; !!! We are actually returning for parent DrawPipe + rts ; !!! FORMERLY WAS 'jmp DrawPipeDone' !!! + ; !!! We are actually returning for parent DrawPipe DrawPipeBodyOddL -:loop ldy PIPE_Y - cpy PIPE_BODY_BOT - beq :done +:loop ldy PIPE_Y + cpy PIPE_BODY_BOT + beq :done - lda LoLineTableL,y - sta PIPE_DP - lda LoLineTableH,y - sta PIPE_DP+1 ; pointer to line on screen + lda LoLineTableL,y + sta PIPE_DP + lda LoLineTableH,y + sta PIPE_DP+1 ; pointer to line on screen - sta TXTPAGE1 - lda PIPE_X_IDX - clc - adc #PIPE_WIDTH/2 - bmi :done - pha ;PHA for below loop - tay - ldx #PIPE_WIDTH/2 + sta TXTPAGE1 + lda PIPE_X_IDX + clc + adc #PIPE_WIDTH/2 + bmi :done + pha ;PHA for below loop + tay + ldx #PIPE_WIDTH/2 -:evenLoop lda PipeBody_Main_O,x - sta (PIPE_DP),y - dex - dey - bpl :evenLoop +:evenLoop lda PipeBody_Main_O,x + sta (PIPE_DP),y + dex + dey + bpl :evenLoop - sta TXTPAGE2 - pla ;PLA from above - tay - ldx #PIPE_WIDTH/2-1 + sta TXTPAGE2 + pla ;PLA from above + tay + ldx #PIPE_WIDTH/2-1 -:oddLoop lda PipeBody_Aux_O,x - sta (PIPE_DP),y - dex - dey - bpl :oddLoop +:oddLoop lda PipeBody_Aux_O,x + sta (PIPE_DP),y + dex + dey + bpl :oddLoop - inc PIPE_Y - jmp :loop + inc PIPE_Y + jmp :loop -:done rts +:done rts diff --git a/src/readme.s b/src/readme.s index f040e7c..c5b2230 100644 --- a/src/readme.s +++ b/src/readme.s @@ -3,25 +3,27 @@ * * Flapple Bird - A de-make of Flappy Bird for the Apple II computer * -* More information about this project is available at -* http://dagenbrock.com/flappy +* # Download releases here: +* https://github.com/digarok/flapple/releases * -* How to run -* ========== -* You can download either disk image and run it with an emulator -* or transfer it to the respective media and run it on a real -* machine (recommended). -* The 3.5" ProDOS disk version is "flapple800.po", and the -* 5.25" ProDOS disk version is "flapple140.po". +* # How to run +* You can download either disk image and run it with an emulator like GSplus +* or transfer to the respective media and run on a real machine (recommended). +* - `flapple800.po` is the 3.5" ProDOS disk version (800KB) +* - `flapple140.po` is the 5.25" ProDOS disk version (140KB) * -* How to build -* ============ -* This is written to compile on Merlin 8/16, but I believe should -* work with all later Merlin variants. Load Merlin, then 'L'oad -* the file "flapple.s", finally hit OpenApple-A to assemble and -* it should build the "flap.system" file. +* It should automatically boot ProDOS and load the color version of the game. +* There is a Monochrome version of the game included on the disk. +* To run it, quit game with the `q` key, and from the ProDOS selector menu +* run `fmono.system`. * +* # How to build +* This was originally written to compile on Merlin 8/16, but it's now +* maintained using Merlin32 (https://github.com/digarok/merlin32/). * -* -* Again, more information about this project is available at -* http://dagenbrock.com/flappy +* - Classic Merlin16+ on an Apple IIgs +* - Load Merlin, then `L`oad the file "flapple.s", finally hit OpenApple-A to assemble and it should build the "flap.system" file. +* - Modern PC builds: +* - Assemble with `merlin32 src/flapple.s` +* - Make disks with `./make_po.sh` +* * Requires having `merlin32` and `cadius` commands available on your system. diff --git a/src/sprite.s b/src/sprite.s index 707533f..be2d730 100644 --- a/src/sprite.s +++ b/src/sprite.s @@ -1,144 +1,144 @@ -SPRITE_X db 0 -SPRITE_Y db 0 ; BYTE,not pixel. gotta be, sorry -SPRITE_W db 0 -SPRITE_W_D2 db 0 -SPRITE_H db 0 ; <- in bytes +SPRITE_X db 0 +SPRITE_Y db 0 ; BYTE,not pixel. gotta be, sorry +SPRITE_W db 0 +SPRITE_W_D2 db 0 +SPRITE_H db 0 ; <- in bytes -SPRITE_MAIN da 0 -SPRITE_AUX da 0 -SPRITE_MASK da 0 -SPRITE_IMASK da 0 -SPRITE_COLLISION db 0 -SPRITE_Y_IDX dw 0 -SPRITE_X_IDX dw 0 +SPRITE_MAIN da 0 +SPRITE_AUX da 0 +SPRITE_MASK da 0 +SPRITE_IMASK da 0 +SPRITE_COLLISION db 0 +SPRITE_Y_IDX dw 0 +SPRITE_X_IDX dw 0 -SPRITE_SCREEN_P equz $00 -SPRITE_MAIN_P equz $02 -SPRITE_SCREEN_P2 equz $02 -SPRITE_AUX_P equz $04 -SPRITE_SCREEN_P3 equz $04 -SPRITE_MASK_P equz $FA -SPRITE_SCREEN_P4 equz $FA -SPRITE_IMASK_P equz $FC +SPRITE_SCREEN_P equz $00 +SPRITE_MAIN_P equz $02 +SPRITE_SCREEN_P2 equz $02 +SPRITE_AUX_P equz $04 +SPRITE_SCREEN_P3 equz $04 +SPRITE_MASK_P equz $FA +SPRITE_SCREEN_P4 equz $FA +SPRITE_IMASK_P equz $FC -SPRITE_SCREEN_IDX db #$0 -AUX_BG_COLOR db #$BB -MAIN_BG_COLOR db #$77 +SPRITE_SCREEN_IDX db #$0 +AUX_BG_COLOR db #$BB +MAIN_BG_COLOR db #$77 * still does collision DrawSpriteBetter - lda #0 - sta SPRITE_X_IDX -:drawLine lda SPRITE_Y ; - tay - lda LoLineTableL,y ; SET SCREEN LINE - sta SPRITE_SCREEN_P - lda LoLineTableH,y - sta SPRITE_SCREEN_P+1 + lda #0 + sta SPRITE_X_IDX +:drawLine lda SPRITE_Y ; + tay + lda LoLineTableL,y ; SET SCREEN LINE + sta SPRITE_SCREEN_P + lda LoLineTableH,y + sta SPRITE_SCREEN_P+1 - lda SPRITE_X ; ADD IN X OFFSET TO SCREEN POSITION - clc ; I think the highest position is $f8 - adc SPRITE_SCREEN_P ; eg- Line 18, col 40= $4f8 - sta SPRITE_SCREEN_P ; SHOULD NEVER CARRY? + lda SPRITE_X ; ADD IN X OFFSET TO SCREEN POSITION + clc ; I think the highest position is $f8 + adc SPRITE_SCREEN_P ; eg- Line 18, col 40= $4f8 + sta SPRITE_SCREEN_P ; SHOULD NEVER CARRY? - jmp DrawSpriteLineC + jmp DrawSpriteLineC ]DSLCD_done - inc SPRITE_Y - dec SPRITE_H - lda SPRITE_H - bne :drawLine - rts + inc SPRITE_Y + dec SPRITE_H + lda SPRITE_H + bne :drawLine + rts DrawSpriteLineC - ; EVEN COLS -DD_EVEN lda #0 - sta SPRITE_SCREEN_IDX - sta TXTPAGE2 + ; EVEN COLS +DD_EVEN lda #0 + sta SPRITE_SCREEN_IDX + sta TXTPAGE2 :lineLoop - ;ldy SPRITE_X_IDX ; - ;lda (SPRITE_IMASK_P),y - ;beq :noPixel + ;ldy SPRITE_X_IDX ; + ;lda (SPRITE_IMASK_P),y + ;beq :noPixel :collisionCheckDrawer - ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS - lda (SPRITE_SCREEN_P),y - pha ; SAVE -> STACK - ldy SPRITE_X_IDX ; PREP Y INDEX - cmp #$BB ; AUX BGCOLOR @TODO - beq :noCollision - and (SPRITE_IMASK_P),y - cmp #$B0 - beq :noCollision - cmp #$0B - beq :noCollision - lda #1 - sta SPRITE_COLLISION - sta $c034 + ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS + lda (SPRITE_SCREEN_P),y + pha ; SAVE -> STACK + ldy SPRITE_X_IDX ; PREP Y INDEX + cmp #$BB ; AUX BGCOLOR @TODO + beq :noCollision + and (SPRITE_IMASK_P),y + cmp #$B0 + beq :noCollision + cmp #$0B + beq :noCollision + lda #1 + sta SPRITE_COLLISION + sta $c034 :noCollision -:doPixels pla ; Y=SPRITE X A=BG DATA - and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA - ora (SPRITE_AUX_P),y ; OVERLAY OUR SPRITE DATA - ldy SPRITE_SCREEN_IDX - sta (SPRITE_SCREEN_P),y +:doPixels pla ; Y=SPRITE X A=BG DATA + and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA + ora (SPRITE_AUX_P),y ; OVERLAY OUR SPRITE DATA + ldy SPRITE_SCREEN_IDX + sta (SPRITE_SCREEN_P),y -:noPixel inc SPRITE_X_IDX - inc SPRITE_X_IDX - inc SPRITE_SCREEN_IDX - ldy SPRITE_SCREEN_IDX - cpy SPRITE_W - bcc :lineLoop +:noPixel inc SPRITE_X_IDX + inc SPRITE_X_IDX + inc SPRITE_SCREEN_IDX + ldy SPRITE_SCREEN_IDX + cpy SPRITE_W + bcc :lineLoop DD_ODD - ; ODD COLS - inc SPRITE_X_IDX ; + 1 column offset - lda SPRITE_X_IDX - sec - sbc SPRITE_W ; RESET DATA PTR - sbc SPRITE_W ; *2 due to pixel skip - sta SPRITE_X_IDX - lda #0 - sta SPRITE_SCREEN_IDX - sta TXTPAGE1 + ; ODD COLS + inc SPRITE_X_IDX ; + 1 column offset + lda SPRITE_X_IDX + sec + sbc SPRITE_W ; RESET DATA PTR + sbc SPRITE_W ; *2 due to pixel skip + sta SPRITE_X_IDX + lda #0 + sta SPRITE_SCREEN_IDX + sta TXTPAGE1 -:lineLoop ;ldy SPRITE_X_IDX ; - ;lda (SPRITE_IMASK_P),y - ;beq :noPixel +:lineLoop ;ldy SPRITE_X_IDX ; + ;lda (SPRITE_IMASK_P),y + ;beq :noPixel :collisionCheckDrawer - ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS - lda (SPRITE_SCREEN_P),y - pha ; SAVE -> STACK - ldy SPRITE_X_IDX ; PREP Y INDEX - cmp #$77 ; MAIN BGCOLOR @TODO - beq :noCollision - and (SPRITE_IMASK_P),y - cmp #$70 - beq :noCollision - cmp #$07 - beq :noCollision - lda #1 - sta SPRITE_COLLISION - sta $c034 + ldy SPRITE_SCREEN_IDX ; GET SCREEN PIXELS + lda (SPRITE_SCREEN_P),y + pha ; SAVE -> STACK + ldy SPRITE_X_IDX ; PREP Y INDEX + cmp #$77 ; MAIN BGCOLOR @TODO + beq :noCollision + and (SPRITE_IMASK_P),y + cmp #$70 + beq :noCollision + cmp #$07 + beq :noCollision + lda #1 + sta SPRITE_COLLISION + sta $c034 :noCollision -:doPixels pla ; Y=SPRITE X A=BG DATA - and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA - ora (SPRITE_MAIN_P),y ; OVERLAY OUR SPRITE DATA - ldy SPRITE_SCREEN_IDX - sta (SPRITE_SCREEN_P),y +:doPixels pla ; Y=SPRITE X A=BG DATA + and (SPRITE_MASK_P),y ; CUT OUT SPRITE IN BG DATA + ora (SPRITE_MAIN_P),y ; OVERLAY OUR SPRITE DATA + ldy SPRITE_SCREEN_IDX + sta (SPRITE_SCREEN_P),y -:noPixel inc SPRITE_X_IDX - inc SPRITE_X_IDX - inc SPRITE_SCREEN_IDX - ldy SPRITE_SCREEN_IDX - cpy SPRITE_W - bcc :lineLoop - dec SPRITE_X_IDX ; -1 column offset (for next row) +:noPixel inc SPRITE_X_IDX + inc SPRITE_X_IDX + inc SPRITE_SCREEN_IDX + ldy SPRITE_SCREEN_IDX + cpy SPRITE_W + bcc :lineLoop + dec SPRITE_X_IDX ; -1 column offset (for next row) - jmp ]DSLCD_done + jmp ]DSLCD_done diff --git a/src/util.s b/src/util.s index 5fb9bf8..3bed85f 100644 --- a/src/util.s +++ b/src/util.s @@ -1,44 +1,44 @@ ** Register preservation -_sX dw 0 -_sY dw 0 -_sA dw 0 -_storeReg sta _sA - stx _sX - sty _sY - rts -_loadReg lda _sA - ldx _sX - ldy _sY - rts +_sX dw 0 +_sY dw 0 +_sA dw 0 +_storeReg sta _sA + stx _sX + sty _sY + rts +_loadReg lda _sA + ldx _sX + ldy _sY + rts ************************************************** * Awesome PRNG thx to White Flame (aka David Holz) ************************************************** GetRand - lda _randomByte - beq :doEor - asl - bcc :noEor -:doEor eor #$1d -:noEor sta _randomByte - rts -_randomByte db 0 + lda _randomByte + beq :doEor + asl + bcc :noEor +:doEor eor #$1d +:noEor sta _randomByte + rts +_randomByte db 0 GetRandLow - lda _randomByte2 - beq :doEor - asl - bcc :noEor -:doEor eor #$1d -:noEor sta _randomByte2 - cmp #$80 - bcs :hot - lda #$0 - rts -:hot lda #$04 - rts + lda _randomByte2 + beq :doEor + asl + bcc :noEor +:doEor eor #$1d +:noEor sta _randomByte2 + cmp #$80 + bcs :hot + lda #$0 + rts +:hot lda #$04 + rts -_randomByte2 db 0 +_randomByte2 db 0