scene.org File Archive

File download

<root>­/­parties­/­2025­/­sommarhack25­/­wild/ma_asylum_party_demo_studio_emulated_on_atari2600.zip

File size:
32 666 bytes (31.90K)

Preview

  • Demo_Studio_from_RelationalFramework_for_C64.zip 21.41K
  • demostudio.bin 8.25K
  • demostudio_petscii_commented.txt 25.57K

file_id.diz

 rem ------------------------------------------------------------------------------
 rem --- 6/4/2025 Demo Graphics IDE
 rem ------------------------------------------------------------------------------
 rem --- Edit Display List graphics and sprite animation    
 rem --- bw switch/shiftlock - starts editor and loads 1st sprite frame
 rem --- button: edit sprite pixels and background graphics.  
 rem --- button + right/left: step thru sprite frames (frame marker at bottom)
 rem --- down + button: clones prior sprite as template (animation ctrl)
 rem --- up + button: change sprites row colors (hex code indicator on left)
 rem --- up/down/left/right: position cursor to edit sprite pixels,
 rem --- and explore amd edit display list graphics.
 rem ---------------------------------------------------------------
 rem --- Inertia Zone Demo with interactive user mode (joystick)
 rem --- Pick up tile mapped friends to experience each zones different inertia.
 rem --- Demo switches between 30 and 60 Hz (25 and 50 Hz on PAL),
 rem --- when the music slows down the animation becomes crystal clear via MBR.
 rem --- Then liquid plasma is displayed aided by MBR,
 rem --- then the music speeds up again and animation has a pleasant blur without MBR.
 rem ---------------------------------------------------------------

 rem ----------------------------------------------------------------
 rem ---20231221 Inertia Zones                                    --- 
 rem ----------------------------------------------------------------
 rem --- Inertia: Game idea travel thru inertia pickup zones each with different physics
 rem --- pickup your tilemapped friends in each quickly moving pickup zone
 rem --- "inertia zones" add horizontal or vertical directional currents based on scrolling direction (up/down/left/right)
 rem --- todo for the sequel: Diagonal zone with cross inertia.
 rem --- 4AB - switch every level MBR & MB with DLIs

 rem -------------------------------------------------------------------------------------------------
 rem -------------------------------------------------------------------------------------------------
 rem ---- SuperCharger BASIC program for Atari 2600 and Commodore 64
 rem ---- Download SuperCharger BASIC https://RelationalFramework.com/
 rem ------------------------------------------------------------------------------------------------- 

 rem ----------------------------------------- 
 rem ---init section, runs once: -------------
 rem -----------------------------------------

grabinit 
 score=1:g=0:scrollvirtualworldtoggle=1
 l=0
 rem comment next line for SuperCharger:
 rem a=0:gosub loadvirtualworld:rem loads virtualworld into RAM, required for Flashback BASIC (CBS RAM)

 COLUBK=15
 rem lost player colors under flashback BASIC
 rem data xplayer0colors $c2,$c2,$D2,$d2,$b2,$b2,$a2,$a2,$A1
 data xrowcolors $42,$42,$42,$42,$c4,$c4,$c4,$b6,$b6,$42
 for e=0 to 9:rowcolors(e)=xrowcolors(e):next e

 rem for e=0 to 7:player0colors(e)=xplayer0colors(e):next e
 rem SUPERCHARGERID=0:rem this is the Operating System so it is now always 0... rem=3 can be anywhere usually in the init, set to zero for testing (supercharger security)
 loadplayer1(0)
 COLUP1=$98:rem FE
 rem NA below - this is already init to 15 below line 0 setup
 rem MUSICINDEX=0:rem 20200904 SuperCharger var may be reset on reload and actively loaded! init for button load transition delay...
 rem -------------------------------------------------------------------------------------------------------------------------------

 e=29:f=5:player0x=30:player0y=30:rem player0colors(0)=$c1
 rem CXCLR=0

 rem DisplayList3Shadow(119)=48:DisplayList3Shadow(118)=48
 rem DisplayList3Shadow(154)=48

 rem ------------------------------------------------
 rem end init section (implicit return)--------------
 rem ------------------------------------------------

 rem -- variable map:------------------------------
 rem freed l, using MUSICINDEX for toggle switching display modes instead of each level 
 rem t = timer 0/1 used to seed display lists
 rem g = 1 after setup (setup var), 2 if button is pressed
 rem r = musical algorythm variable 
 rem !Sound bug using r in kitchensink event setting color ram backbuffers
 rem score = level 2,3,4 create different instrument sets for the SID [C64 only]
 rem Interesting feature, enhanced sound algorithm... 
 rem h,u,w - BITIndex for different DLI zones
 rem x,y,v,s,z - 
 rem e,f - tilemapped sprites virtual world coordinates
 rem i,j - joy direction
 rem ----------------------------------------------

 rem ------------------------------------------------
 rem ---gameloop subroutine, runs every frame:    ---
 rem ------------------------------------------------
 if SWCHB|%11110111=247 then goto charactereditor

hookgameloop1
 if t<>0 then goto tisnot0
 if f=17 then vwpixel(e,f,bindplayer1)
  
 rem gosub getpetscii2
 scrollvirtualworldtoggle=35:gosub DLI:goto tisnot1: rem run this DLI every other frame

tisnot0
 rem if t=1 then 
 gosub getpetscii3
 BYTErowoffset=v*12:h=BITIndex:BITIndex=u::scrollvirtualworldtoggle=30:gosub DLI:BITIndex=h:BYTErowoffset=120 
tisnot1
 scrollvirtualworldtoggle=0


1 if g=0 then BYTErowoffset=120:COLUPF=$64:COLUP0=$b4:MUSICINDEX=0:gosub grabinit:g=1 
 rem ---setup complete---
 if g=2 and joy0fire=0 then g=1


 rem --- caught tile mapped item
 if CXPPMM & 128<>128 then COLUBK=0:goto skiphit: rem bit7 detects player0 and player1 sprite collision
 CXCLR=0
 COLUBK=2
 rem scrollvirtualworldtoggle=1:rem dynamic color RAM 20250421 
 rem alread on for 30 Hz/25 Hz mode with Display list calls!
 gosub increasescore:gosub colorcycle

 player0x=0:rem MUSICINDEX=10
 if f=18 then goto set18 
 if e=22 then f=18:e=20:COLUP1=$54:goto skiphit
 if f=5 then f=17:e=22:COLUP1=$86:goto skiphit
set18
 e=29+w:f=5:COLUP1=$32
skiphit

 return

 rem ---- 20250422 Sound enhancement C64 only levels 2,3,4 have different Instrument set ADSR
 rem ---- changes 32 instrument orchestra ---- 
 
rebuildsid456a rem 20241002 rebuild instrument defintions - sounds better
 for bx=0 to 32
 rem SID4(bx)=SID4(bx)+2:rem SID4(bx)=SID4(bx)&%11110111:mask squelch off
 rem rem rem test squelch, interesting not 100% effective SID4(bx)=SID4(bx)^%00001000
 rem SID5(bx)=SID5(bx)+2
 rem SID6(bx)=SID6(bx)+2
 rem next bx
 rem rem DisplayList3Shadow(154)=DisplayList3Shadow(154)+1
 return 

rebuildsid456b rem 20241002 rebuild instrument defintions - reverse direction
 rem for bx=0 to 32
 rem SID4(bx)=SID4(bx)-2:rem SID4(bx)=SID4(bx)&%11110111
 rem SID5(bx)=SID5(bx)-2
 rem SID6(bx)=SID6(bx)-2
 rem next bx
 rem rem DisplayList3Shadow(154)=DisplayList3Shadow(154)-1
 return 


buttonpressed rem --------------

 rem if joy0up=1 then gosub rebuildsid456a:return
 rem if joy0down=1 then gosub rebuildsid456b:return
 rem releasing button inc's var1 - 11...
 rem if joy0left=1 then goto editpetscii 
 if joy0right=1 then gosub rebuildmusic:return
 rem -----------------------------
 rem test gosub increasescore:rem use algorithm

 return

editpetscii
 rem top pescii buffer 
 rem if player0y>50 then petscii3(3)=petscii3(3)+1:return
 rem bottom
 rem if player0y<20 then petscii(2)=petscii(2)+1:petscii(4)=petscii(4)+1:petscii(0)=petscii(0)+1:return
 rem middle buffer, 2 elements
 rem petscii2(3)=petscii2(3)+1: petscii2(2)=petscii2(2)+1
 rem return

increasescore

 score=score+1
 rem C64 ADSR instrument set variations based on score:
 rem if score=2 then gosub rebuildsid456a:gosub rebuildsid456a:rem gosub changerefresh
 rem if score=4 then gosub rebuildsid456a:gosub rebuildsid456a
 rem if score=3 then gosub rebuildsid456a
 rem if score=5 then gosub rebuildsid456a
 rem reverse instrument algorithms and repeat
 if score=11 then score=0:return
 rem if score>4 then gosub rebuildsid456b:rem reverse ADSR algorithm
 return

colorcycle
 rem if MUSICINDEX>40 or t=0 then return:rem roll dice
 if MUSICINDEX<210 or by=0 then return:rem roll dice

 for r=0 to 9
 rowcolors(r)=rowcolors(r)+1:rem 17
 next r

 return

changerefresh
 rem freeing l... 
 rem l=1-l:rem refreshrate scripting command for scrollvirtualworld
 if MUSICINDEX>160 then scrollvirtualworldtoggle=1 else scrollvirtualworldtoggle=0
 return
 
hookgameloop2 
 t=1-t

 rem 2x slow playback:
 rem 20210208 SUSTAINFORFRAMES=SUSTAINFORFRAMES+t:goto variableplaybackspeed
 rem if player0y>100 and 1=1 then SUSTAINFORFRAMES=SUSTAINFORFRAMES+t:goto variableplaybackspeed 
 rem 20201013 4x slow playback:
 rem 20250502 if t=0 then r=1-r:SUSTAINFORFRAMES=SUSTAINFORFRAMES+r else SUSTAINFORFRAMES=SUSTAINFORFRAMES+t

variableplaybackspeed
 
 if BITIndex>71 then BITIndex=255:rem overflows to 0 as intended, avoids off by 1 
 rem --- change color of words!
 rem if h>36 then goto changewordcolor
 rem for j=0 to 3:rem rowcolors(j)=$58:rem next:rem rowcolors(9)=$58
 rem goto donechangewordcolor 
changewordcolor
donechangewordcolor

 if x=255 then x=71
 if t<>0 then goto tnot0 else z=1-z:x=x-z:BITIndex=BITIndex+1:h=BITIndex:BITIndex=x
 if f=18 then vwpixel(e,f,bindplayer1)

 rem scrollvirtualworldtoggle=8:gosub DLI:scrollvirtualworldtoggle=l:BITIndex=h:return: rem else COLUPF=100

 rem use MUSICINDEX to determine graphics mode 
 rem gosub getpetscii
 scrollvirtualworldtoggle=8:gosub DLI:gosub changerefresh:BITIndex=h:return: rem else COLUPF=100


tnot0
 
 rem animate character sprite
 if s>56 then s=0
 rem byterowoffset is 120 for 1st DL
 w=w+1
 if w<>3 then goto wnot3

 loadplayer0(s)
 rem g=s+40:loadplayer1(g)
 rem loadplayer1upsidedown(s)
 s=s+8:h=BITIndex:BITIndex=u:w=0:v=v+1:BYTErowoffset=v*12
 if f=5 then vwpixel(e,f,bindplayer1)
 
 rem 20250421 f=17 load is free ....
 rem deprecated using kitchensink if f=17 then gosub colorcyclecolorRAMtop
 
 rem scrollvirtualworldtoggle=3:gosub DLI:scrollvirtualworldtoggle=l:BITIndex=h:return
 rem gosub getpetscii3
 scrollvirtualworldtoggle=3:gosub DLI:gosub changerefresh:BITIndex=h:return


wnot3

 if v>10 then v=0:u=u+20:rem SUSTAINFORFRAMES=4
 if u>60 then u=19
 rem rem 20231221 player0y=player0y+1:player0x=player0x+1
 rem BITIndex=h:rem preserved
 BYTErowoffset=120

 rem debug this j=2:i=2:rem park mode

 if joy0down=1 then j=0
 if joy0up=1 then j=1
 if joy0left=1 then i=0:REFP0=255
 if joy0right=1 then i=1:REFP0=0

 rem if joy0down=1 then player0y=player0y-2
 rem if joy0left=1 then player0x=player0x-3

 rem reverse direction when hitting a wall
 if i=0 and player0x<5 then i=1:REFP0=0
 if j=0 and player0y<12 then j=1

 if i=1 and player0x>162 then i=0:REFP0=255
 if j=1 and player0y>94 then j=0

 rem add inertia for zone (experimental):
 rem -----------------------------------------
 rem debug:
 rem if player0y>50 then COLUBK=1 else COLUBK=0:rem vwpixel(3,3,flip)
 if player0y>50 then player0y=player0y+1:goto abovefifty
 rem 50 or below, check for horizontal inertia
 rem this handles both lower zones (horizontal inertia in different directions)
 if player0y>22 then player0x=player0x-2 else player0x=player0x+2
 rem ------------------------------- Inertia zone currents end

abovefifty rem top zone

 if i=0 then player0x=player0x-3
 if i=1 then player0x=player0x+3
 if j=0 then player0y=player0y-2 
 if j=1 then player0y=player0y+2

 rem -- Navigate Directory in SuperCharger File System:
 rem -------------------------------------------------------------------------------------------------
 rem ------------ LOAD one of 3 6K SuperCharger games depending upon which zone the button is pressed!
 rem -------------------------------------------------------------------------------------------------

 if joy0fire=1 and g=1 then g=2:gosub buttonpressed:rem debug/SID 4,5,6 algorithm testing feature

 rem not in use:
 rem if joy0fire=0 or MUSICINDEX<40 then goto skipLoad:rem basing delay on what has been initialized here :)
 rem ---superchargerindex of program to be loaded by SuperCharger ISAM file system
 rem if player0y<=26 then SUPERCHARGERINDEX=3:goto loadmenu:rem --- modular program1
 rem if player0y<=56 then SUPERCHARGERINDEX=2:goto loadmenu:rem --- modular program2
 rem SUPERCHARGERINDEX=1:rem default ----
 rem --------------------------
loadmenu rem load
 rem load can also be overloaded with an argument, examples:
 rem i=5:load i
 rem load 5
 rem load $a
skipLoad
 rem ---------------------------------------------------------------------

 return

charactereditor
 t=1-t

 if g<>0 then return:rem charactereditor initializes g to 0 after setup (reverse of demo/game)
 
 rem top blank
 return

rem --------------------------------------------------------------------------------------
getcharl rem based on l, character frame to screen ---------------------------------------
rem --------------------------------------------------------------------------------------
 rem clear area:
 for bx=0 to 15:for by=0 to 9:vwpixel(bx,by,on):vwpixel(bx,by,flip):next by,bx

 m=l+7
 loadplayer0(l)

 n=1
 
 rem map bitmap character at lms l to bitmap virtualworld (big char to edit)
 for bx=l to m:virtualworld(n)=sprites(bx):n=n+12:next bx

 rem map sprite colors (fix one off) to large sprite bitmap on virtualworld
 n=6
 for bx=0 to 6
 rowcolors(bx)=player0colors(n)
 n=n-1
 next bx
 rowcolors(9)=player0colors(7)

 scrollvirtualworldtoggle=1
 return

flipcharpix
 rem vwpixel(x,y,flip)
 rem mirror change on sprite:

 if x>15 or y>7 then return:rem allow edits to virtualworld beyond character staging
 
 j=l+y
 k=y*12
 k=k+1
 sprites(j)=virtualworld(k)
 loadplayer0(l)
 return

hexcolordisplay rem --- display color list values using hexidecimal alphanumerics
 rem if alt frame move hex alphanumeric over 8 px
 if y=0 then n=rowcolors(9) else m=y-1:n=rowcolors(m)


 vwpixel(t,y,bindplayer1)
 if t=1 then goto otherhexdigit
 rem first nybble of byte:
 rem this takes 19 bytes less in asm: lda n: lsr: lsr: lsr: lsr: sta n
 n=n&%11110000:n=n/16
 
 goto donehexdigits
   
otherhexdigit 
 rem second nybble of byte:
 n=n&%00001111
 player1x=player1x+1
donehexdigits
 
 n=n*8:n=n+64:rem 0 character sprite is at 64 in the sprite library

 loadplayer1(n)
 rem ?? if y=0 then COLUP1=rowcolors(9) else n=y-1:COLUP1=rowcolors(n)
 COLUP1=$56
 return

cloneframe rem ----- clone bitmap of prior sprite frame as template for animation
 if s=0 and joy0fire=1 and joy0down=1 then s=1 else return
 i=l-8
 for j=i to l
 k=j+8
 sprites(k)=sprites(j)
 next j
 gosub getcharl:rem load cloned bitmap 
 return



scrollleft 
 rem ---- scroll panoramic for editing bitmap virtualworld:
 if x-BITIndex=0 and x>0 then BITIndex=BITIndex-1:scrollvirtualworldtoggle=1
 rem page up/down in panoramic bitmap image:  
 if y=10 and BYTErowoffset=0 then BYTErowoffset=120:scrollvirtualworldtoggle=1
 if y=9 and BYTErowoffset=120 then BYTErowoffset=0:scrollvirtualworldtoggle=1
 rem return
  
 rem -------------------------------------------------------------
 rem end game loop (implicit return)-----------------
 rem -------------------------------------------------------------

 rem -------------------------------------------------------------
 rem ---gameloop2 subroutine, runs every frame:    --
 rem ------------------------------------------------

 if SWCHB|%11110111=247 then goto charactereditor2


 goto hookgameloop2

rebuildmusic
 rem create new musical score:"
 for r=0 to 255
 if r=44 or r=74 or r=159 or r=229 then goto skipnote
 d=MusicData(r)&%00011111
 MusicData(r)=d+3:rem 3
skipnote 
 next r
 rem DisplayList3Shadow(119)=DisplayList3Shadow(119)+1
 r=0:rem restore r variable to 0 state, used for music bug (extended sound dilation) and sound dilation
 rem if DisplayList3Shadow(119)=58 then DisplayList3Shadow(119)=48:DisplayList3Shadow(118)=DisplayList3Shadow(118)+1
 return

rebuildmusic2
 rem create new musical score:"
 
 rem for r=0 to 255
 rem if r=44 or r=74 or r=159 or r=229 then goto skipnote2
 rem d=MusicData(r)&%00001111
 rem MusicData(r)=d+5:rem 3
skipnote2 
 rem next r
 rem DisplayList3Shadow(119)=DisplayList3Shadow(119)+1
 rem r=0:rem restore r variable to 0 state, used for MUSIC DURATION AND MUSIC EXTENDED DURATION BUG
 rem if DisplayList3Shadow(119)=58 then DisplayList3Shadow(119)=48:DisplayList3Shadow(118)=DisplayList3Shadow(118)+1
 rem MUSICINDEX=0
 return

charactereditor2

 rem --- char editor variable map:
 rem --- l - character frame 
 rem --- g setupvar (reversed for kickout init returning from editor)
 rem --- r,s button released, stick released while button pressed
 rem --- x,y tile coordinates for player sprite cursor (editor on editor)



 rem setup [when g!0]
 if g>0 then g=0:BITIndex=0:BYTErowoffset=0 else goto donecharsetup
 rem C64 petscii:
 rem BackgroundTileCharacters(0)=111
 rem BackgroundTileCharacters(1)=111
 rem BackgroundTileCharacters(2)=32
 rem BackgroundTileCharacters(3)=32

 l=0:r=0:gosub getcharl:rem get first character frame
 x=8:y=0:rem cursor upper left
 t=0
donecharsetup

 if r=1 and joy0left=0 and joy0fire=0 and joy0right=0 and joy0up=0 and joy0down=0 then r=0:s=0:goto skipctrls

 if r=0 and joy0right=1 then x=x+1:r=1
 if r=0 and joy0left=1 then x=x-1:r=1
 if r=0 and joy0up=1 then y=y-1:r=1
 if r=0 and joy0down=1 then y=y+1:r=1
 
 rem ---edit panoramic virtualworld scroll to right when edge is reached:
 if x-BITIndex=19 and x<91 then BITIndex=BITIndex+1:scrollvirtualworldtoggle=1
 gosub scrollleft

 if r=0 and joy0fire=1 then r=1:vwpixel(x,y,flip):gosub flipcharpix

 rem holding button and pressing right? advance to next frame
 rem edit advance next frame
 
 if s=0 and joy0fire=1 and joy0right=1 then s=1:j=l/8:vwpixel(j,9,flip):l=l+8:gosub getcharl:return

 rem edit advance prior frame
 if s=0 and joy0fire=1 and joy0left=1 then s=1:j=l/8:vwpixel(j,9,flip):l=l-8:gosub getcharl:return

 if s=0 and joy0fire=1 and joy0up=1 then s=1:gosub adjustcolor:return

 gosub cloneframe:rem sprite character may be templated from prior sprite 


skipctrls


 vwpixel(x,y,bindplayer0):set sprite as cursor to edit large sprite image
 j=l/8
 vwpixel(j,9,on):rem marker character frame position

 gosub hexcolordisplay

 SUSTAINFORFRAMES=SUSTAINFORFRAMES+t


 return


adjustcolor
 n=7-y
 rem increase or decrease:
 player0colors(n)=player0colors(n)+17
 gosub getcharl
 return

 rem C64 declare multiple petscii tilemap buffers  
getpetscii
getpetscii1
 rem if score<4 then goto getpetscii4
 rem BackgroundTileCharacters(0)=petscii(0)
 rem BackgroundTileCharacters(1)=petscii(1)
 rem BackgroundTileCharacters(2)=petscii(2)
 rem BackgroundTileCharacters(3)=petscii(3)
 rem return
   
getpetscii2
 rem if score<6 then goto getpetscii4
 rem BackgroundTileCharacters(0)=petscii2(0)
 rem BackgroundTileCharacters(1)=petscii2(1)
 rem BackgroundTileCharacters(2)=petscii2(2)
 rem BackgroundTileCharacters(3)=petscii2(3)
 rem return

getpetscii3
 rem if score<2 then goto getpetscii4
 rem BackgroundTileCharacters(0)=petscii3(0)
 rem BackgroundTileCharacters(1)=petscii3(1)
 rem BackgroundTileCharacters(2)=petscii3(2)
 rem BackgroundTileCharacters(3)=petscii3(3)
 rem return

getpetscii4
 rem BackgroundTileCharacters(0)=32
 rem BackgroundTileCharacters(1)=32
 rem BackgroundTileCharacters(2)=32
 rem BackgroundTileCharacters(3)=32
 return


 petscii texture map C64:
 rem data petscii 209,230,208,208
 rem pattern
 rem data petscii2 121,121,121,121
 rem parallel lines
 rem data petscii3 205,206,206,205
 rem diagonal fence pattern


 rem -------------------------------------------------------------
 rem end gameloop2 (implicit return)----------------- 
 rem ------------------------------------------------

 rem -------------------------------------------------------------
 rem ---KITCHENSINK subroutine, runs when scrollvirtualworldtoggle=1
 rem -------------------------------------------------------------
 rem kitchensink
 by=1-by 
 SUSTAINFORFRAMES=SUSTAINFORFRAMES+by

 if SWCHB|%11110111=247 then goto charactereditorKS

 gosub hookgameloop1

 gosub hookgameloop2
 
 rem gosub increasescore

 gosub colorcycle

 rem - jump over playfield Camera LMS tp preserve display list zones:

 rem thislabel goto thislabel+5:rem SuperCharger BASIC can jump 5 bytes fwd on Atari 
 rem missing in C64 SuperCharger BASIC so... esacping to Assembly as: 
 "fw6 bvc fw6+5"
 
charactereditorKS rem --------------character frames editor
 rem character frames editor does not jump over renderer to preserve DLI zones
 
 rem --------------------------------------------------------------------
 rem end kitchensink events----------------------------------------------              
 rem --------------------------------------------------------------------

                                                                                          

virtualworld
....................................................................xxx.....................
......................XXXXXXXXXXXXX.................................x.......................
.....................XX............X................................xxx.....x...............
.....................XX..XXXXXXXXX.XX.................................x.x.x.x...............
.....................xX..xxx...XXx.xx..XXXXx..X............XX.XXX..X.xx..X..xxx.............
.....................xX.XXxX...XXX.xx..XX..X.X.X...........X.XX.X.X.X....X..................
.....................xX.XXXXXXXXXXXxx..XXXXx.xxX..X...x....X.XX.X.XXX....X..x.X.............
.....................xX................Xx....x.x..Xx.xxx..xX....X.X.X.......xxx.............
......................XXXXXXXXXXxXxx...XX....x.x..x...X.X.XX....X.X.X.......................
..........................XXXXXXXXxx...Xx....x.x..x...x.xXXX....X.X.X....xx.xxX.............
..........................................................X..............x.x..x.............
........................................................XXX..............x....x.............
............................................................................................
............................................................................................
............................................................................................
.XXXxX.xXXX.XXX.X.X.x.xx.xXXX..XX..XXX.XXX.XXX...XXX.X...X..X.X..X..X.X...XXXxX.xXXX.XXX.X.X 
.XxxxX..xX..X...XX..x.xx.xXxx...X..X.X.X.X.XX....XXX.X..XXX..X..XXX.XXX...Xxxxx..xX..X...XX.
.XXx...xXXX.XXX.X.X.xxXx.xX.....XX.XXX.X.X.XXX...X...XX.X.X..X..X.x.X.X...XXX...xXXX.XXX.X.X 
x.x.x.x.x.x.x.x.x.xX.X.X.X.X.X.X.X.X.X.XxX.X.X.XxX.X.XxX.X.XxX.X.X.X...XxX.X.X.X.X.X.X.X.X.X
.x.x.x.x.x.x.x.x.x..X.X.X.X.X.X.X.X.X.XxXxX.X.XxXxX.XxXxX.XxXxX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.

player0colors $c3,$c1,$D1,$d1,$b1,$b1,$a1,$a1
rowcolors $42,$42,$42,$42,$c4,$c4,$c4,$b6,$b6,$42

sprites
0
........
.XX.....
X.....X.
X.....XX
.XXXXX..
.XX..X..
X.....X.
........
8
........
.X......
X.X...X.
X.....XX
.XXXXX..
.XX..X..
.X...X..
........
16
........
.XX.....
X.....X.
X.....XX
.XXXXX..
.X...X..
..X.X...
........
24
........
.X...X..
X....XXX
X..XXX..
.XXXXXX.
.X...X.X
..X.X...
........
32
........
XX....X.
X.....XX
XX.XXX..
.XXXXXXX
.X...X..
XX....X.
........


40
........
XX...X..
X....XX.
X..XXX..
.XXXXXXX
.XX..X..
..X...X.
..X.....


48
........
.....X..
XX...XX.
X...XX..
X.XXXXXX
XXXXXX..
..XX..X.
..XX....

56
........
....XX..
....X...
..XXXX.x
..xXX.X.
x..XXX..
.xX...x.
.....x..

64
xxxxxxxx
xx....XX
Xx....XX
XX....xx
xxxx..xx
Xxxx..XX
Xxxx..xx
xxxxxxxx
56x
..xxx...
.xxxx...
..xxx...
..xxx...
..xxx...
.xxxxx..
.xxxxx..
.xxxxx..
64
........
xxxxxxxx
......xx
......xx
xxxxxxxx
xxxx....
xxxx....
xxxxxxxx
72
xxxxxxx.
......x.
......x.
......x.
xxxxxxxx
......xx
......xx
xxxxxxxx
80
xx......
xx......
xx......
xx...xx.
xxxxxxx.
.....xx.
.....xx.
.....xx.
88
........
xxxxxxxx
xx......
xx......
xxxxxxxx
....xxxx
....xxxx
xxxxxxxx
96
........
xxxxxxxx
xx....xx
xx......
xxxxxxxx
xx....xx
xxxx..xx
xxxxxxxx
104
xxxxxxxx
xxxxxxxx
xx...xxx
....xxx.
...xxx..
...xxx..
...xxx..
...xxx..
112
.xxxxxx.
.x....X.
.x....X.
XXxxxxxx
xx....xx
Xxxx..XX
Xxxx..xx
xxxxxxxx
120
xxxxxxxx
x.....xx
x....xxx
xxxxxxxx
......xx
......xx
......xx
......xx

xxxxxxx.
xx....X.
xx....X.
XXxxxxxx
xx....xx
Xx....XX
Xx....xx
xx....xx

xx......
xx......
xx......
XXxxxxx.
xx....xx
Xx....XX
Xx....xx
xxxxxxx.


........
........
........
.Xxxxxx.
xx......
Xx......
Xx......
.xxxxxx.

......xx
......xx
......xx
.Xxxxxxx
xx....xx
Xx....XX
Xx....xx
.xxxxxxx

xxxxxxx.
xx......
xx......
XXxxxxx.
xx......
Xx......
Xxxxxxx.
xxxxxxx.

xxxxxxx.
xx......
xx......
XXxxxxx.
xx......
Xx......
Xx......
Xx......

xxxxxxx.
xx....x.
xx......
XX......
xx..xxx.
Xx...xx.
Xxxxxxx.
xxxxxxx.




chiptunes
6,27,6,13,8
6,27,6,13,8
6,24,6,20,8
6,24,6,20,8
6,22,6,22,8


7,22,4,16,8

6,22,6,22,8
6,22,6,22 ,8
6,24,6,20,8
6,24,6,20,8
6,13,6,27,12


7,22,4,16,16


12,26,12,26,16
12,26,12,26,8

12,23,12,11,8
12,23,12,2,8

12,17,12,17,8
0,0,0,0,16


0,0,0,0,16

AIR
HEAD
4,31,12,23,8
4,31,12,23,8
4,20,12,1,32
4,23,12,23,8
4,24,12,24,8
4,27,12,27,8
4,24,12,24,8

4,27,12,18,8
4,27,12,18,4
4,27,12,18,4
4,27,12,18,8
4,27,12,18,8
4,27,12,18,8

0,0,0,0,16

6,27,6,13,8
6,27,6,13,8
6,24,6,20,8
6,24,6,20,8
6,22,6,22,8


0,0,0,0,16

6,22,6,22,8
6,22,6,22,8
6,24,6,20,8
6,24,6,20,8
6,13,6,27,12 


MOON
PTRL
4,31,4,5,8
0,0,0,0,8

4,17,4,8,8
4,17,4,8,8

4,19,7,30,8
4,19,7,30,8

4,23,4,14,8
4,23,4,14,8
4,19,4,4,8

4,31,4,5,8
0,0,0,0,8

4,17,4,8,8
4,17,4,8,16
4,19,7,30,8
4,23,4,14,16
4,19,4,4,24   

RPT
0,0,0,0,32

0,0,0,0,0