scene.org File Archive

File download

<root>­/­parties­/­2025­/­atparty25­/­oldschool_demo/demo_studio_from_relationalframework_for_c64.zip

File size:
21 919 bytes (21.41K)
File date:
2025-07-02 00:05:25
Download count:
all-time: 1

Preview

  • demostudio.prg 7.91K
  • demostudio.txt 45.73K
  • DemoStudio_Instructions.txt 5.30K

file_id.diz

 rem ------------------------------------------------------------------------------
 rem --- 6/4/2025 Demo Construction Set
 rem ------------------------------------------------------------------------------
 rem --- Display List graphics and sprite animation studio    
 rem --- bw switch/shiftlock - starts editor and loads 1st sprite frame*
 rem --- button: edit sprite pixels and Display Lists.
 rem --- Sprite edited is paintbrush/cursor and also updated.  
 rem --- button + right/left: step thru sprite frames (frame marker at bottom)
 rem --- down + button: clone 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 --- 6/10/2025 petscii texturemap editor and pattern select:  
 rem --- Pattern: hold left and press button in any zone to cycle patterns
 rem --- Full petscii editor: go to upper right of screen and press button
 rem --- then up/down/left/right changes petscii characters in a display list,
 rem --- Button advances through display lists and background/foreground petscii. 
 rem -------------------------------------------------------------------------
 rem --- Music Maker IDE: BW switch/shiftlock when character is in bottom zone  
 rem --- Step through Tracker patterns to revise or write new music.
 rem --- 3rd voice manufactured as a logical and of the waverform. 
 rem -------------------------------------------------------------------------
 rem ---   Instument    Note     Instrument      Note       Frames Duration
 rem -------------------------------------------------------------------------
 rem --- Values are 0-31 for all fields except Frames Duration. 
 rem --- Frames Duration goes to 99 and increases the beat in increments of 16.
 rem --- button: Step thru trace/plays next pattern.
 rem --- up/down: changes a field value and plays revised pattern again.
 rem --- left/right: Navigates between fields 
 rem --- hold right + button: "sound search" revises current pattern 
 rem --- hold up + button: "different sound search" revises current pattern 
 rem --- hold down + button: clones previous pattern as template for 
 rem -------------------------------------------------------------------------
 rem --- Music revision during demo - hold right and press button for new tunes 
 rem --- New tunes can be edited and reviewed in the Music Maker IDE.
 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 plasma colors cycle for a few seconds and new colors are selected,
 rem --- then the music speeds up again and animation has a pleasant blur without MBR.
 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 2025 BETA https://RelationalFramework.com/
 rem ------------------------------------------------------------------------------------------------- 

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

grabinit 
 score=1:g=0:scrollvirtualworldtoggle=1
 l=0
 q=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 - tile pixel x/y, s=sprite animation index,z=
 rem e,f - tilemapped sprites virtual world coordinates
 rem i,j - joy direction
 rem q   - Music Editor IDE on/off (1/0)
 rem var1,var2 realtime petscii editor index/control
 rem -----------------------------------------------

 rem --- Tracker editor variable map-----------------
 rem --- f - frames, z - draw grid flag, var1 - joystick released
 rem --- score - hilight cursor, var2 used by tracker editor
 rem --- z - on/off tracker GUI, y tilepixel virtualworld coordinate
 rem --- bx index of MusicData chiptunes
 rem 20250220 improving Editor to mirror waxing and waning of voice one and voice 2 Fx and variable sustain lengths
 rem --- w - SUSTAINFORFRAMES Fx mirror, var1, m - control toggle

 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)
  
 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:z=0 
 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
 SID4(bx)=SID4(bx)+2:rem SID4(bx)=SID4(bx)&%11110111:mask squelch off
 rem test squelch, interesting not 100% effective SID4(bx)=SID4(bx)^%00001000
 SID5(bx)=SID5(bx)+2
 SID6(bx)=SID6(bx)+2
 next bx
 rem DisplayList3Shadow(154)=DisplayList3Shadow(154)+1
 return 

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

buttonpressed rem --------------
 rem entering petscii multiple buffer editor? (player at upper right)
 if player0x>150 and player0y>80 and var1=0 then var1=1:return:rem start petscii editor at top DLI
 rem if player0x>150 and player0y<12 and var1=0 then var1=2:return:rem start petscii editor at 2nd DLI
 rem if joy0up=1 and var1=0 then var1=1:return:rem start petscii full editor in top zone
 if var1=6 then var1=0:rem turn off full petscii editor
 if var1>0 then var1=var1+1:return:rem step through petscii tilemap zones in full editor 

 rem display hex value upper left ... petscii symbol lookup OK

 rem if joy0up=1 then gosub rebuildsid456a:return
 rem if joy0down=1 then gosub rebuildsid456b:return
 
 rem releasing button selects presets 
 if joy0left=1 then goto editpetscii 
 if joy0right=1 then gosub rebuildmusic:return
 rem -----------------------------
 rem test gosub increasescore:rem use algorithm

 return

petsciifulleditor

 if joy0right=0 and joy0left=0 and joy0up=0 and joy0down=0 then var2=0
 if var1=2 then goto 2ndzonefulledit
 if var1=3 then goto 3rdzonefulledit
 if var1=4 then goto topzonefulledittile
 if var1=5 then goto 2ndzonefulledittile
 if var1=6 then goto 3rdzonefulledittile
topzonefulledit
 if joy0up=1 and var2=0 then var2=1:petscii3(0)=petscii3(0)+1  
 if joy0down=1 and var2=0 then var2=1:petscii3(1)=petscii3(1)+1  
 if joy0right=1 and var2=0 then var2=1:petscii3(2)=petscii3(2)+1  
 if joy0left=1 and var2=0 then var2=1:petscii3(3)=petscii3(3)+1  
 return
2ndzonefulledit
 if joy0up=1 and var2=0 then var2=1:petscii2(0)=petscii2(0)+1  
 if joy0down=1 and var2=0 then var2=1:petscii2(1)=petscii2(1)+1  
 if joy0right=1 and var2=0 then var2=1:petscii2(2)=petscii2(2)+1  
 if joy0left=1 and var2=0 then var2=1:petscii2(3)=petscii2(3)+1  
 return
 
3rdzonefulledit
 if joy0up=1 and var2=0 then var2=1:petscii(0)=petscii(0)+1  
 if joy0down=1 and var2=0 then var2=1:petscii(1)=petscii(1)+1  
 if joy0right=1 and var2=0 then var2=1:petscii(2)=petscii(2)+1  
 if joy0left=1 and var2=0 then var2=1:petscii(3)=petscii(3)+1  
 return

topzonefulledittile
 if joy0up=1 and var2=0 then var2=1:tilepetscii3(0)=tilepetscii3(0)+1  
 if joy0down=1 and var2=0 then var2=1:tilepetscii3(1)=tilepetscii3(1)+1  
 if joy0right=1 and var2=0 then var2=1:tilepetscii3(2)=tilepetscii3(2)+1  
 if joy0left=1 and var2=0 then var2=1:tilepetscii3(3)=tilepetscii3(3)+1  
 return

2ndzonefulledittile
 if joy0up=1 and var2=0 then var2=1:tilepetscii2(0)=tilepetscii2(0)+1  
 if joy0down=1 and var2=0 then var2=1:tilepetscii2(1)=tilepetscii2(1)+1  
 if joy0right=1 and var2=0 then var2=1:tilepetscii2(2)=tilepetscii2(2)+1  
 if joy0left=1 and var2=0 then var2=1:tilepetscii2(3)=tilepetscii2(3)+1  
 return
 
3rdzonefulledittile
 if joy0up=1 and var2=0 then var2=1:tilepetscii(0)=tilepetscii(0)+1  
 if joy0down=1 and var2=0 then var2=1:tilepetscii(1)=tilepetscii(1)+1  
 if joy0right=1 and var2=0 then var2=1:tilepetscii(2)=tilepetscii(2)+1  
 if joy0left=1 and var2=0 then var2=1:tilepetscii(3)=tilepetscii(3)+1  
 return


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

 return

increasescore

 score=score+1


 if score=2 then gosub rebuildsid456a:gosub rebuildsid456a:rem gosub changerefresh
 if score=4 then gosub rebuildsid456a:gosub rebuildsid456a

 if score=3 then gosub rebuildsid456a
 if score=5 then gosub rebuildsid456a

 rem reverse instrument algorithms and repeat
 rem if score>5 then for r=1 to 6:gosub rebuildsid456b:next r:score=0
 if score=11 then score=0:return
 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 
 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 scrollvirtualworldtoggle=3:gosub DLI:scrollvirtualworldtoggle=l:BITIndex=h:return
 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 petscii full editor activated for any DLI zones?
 if var1>0 then gosub petsciifulleditor:rem goto skipmoveplayer
 
 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 
skipmoveplayer

 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
 rem goto Editor1
 if q<>0 then goto Editor1:rem music editor

 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 skipnote2A
 rem d=MusicData(r)&%00001111
 rem MusicData(r)=d+5:rem 3
skipnote2A 
 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 goto Editor2
 if q<>0 then goto Editor2:rem music editor


 rem setup [when g!0]
 if g>0 then g=0:BITIndex=0:BYTErowoffset=0 else goto donecharsetup
 if player0y<30 then REFP0=0:q=1:m=0:var1=0:var2=0:t=0:z=0:goto Editor2:rem init and queue music editor JVB

 rem C64 drawing graph paper grid for editor with petscii tilemapping:
 rem BackgroundTileCharacters(0)=207
 rem BackgroundTileCharacters(1)=208
 rem BackgroundTileCharacters(2)=204
 rem BackgroundTileCharacters(3)=250
 BackgroundTileCharacters(0)=111
 BackgroundTileCharacters(1)=111
 BackgroundTileCharacters(2)=32
 BackgroundTileCharacters(3)=32

 rem TileCharacters(0)=32
 rem TileCharacters(1)=32
 rem TileCharacters(2)=32
 rem TileCharacters(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
 if score<4 then goto getpetscii4
 BackgroundTileCharacters(0)=petscii(0)
 BackgroundTileCharacters(1)=petscii(1)
 BackgroundTileCharacters(2)=petscii(2)
 BackgroundTileCharacters(3)=petscii(3)

 TileCharacters(0)=tilepetscii(0)
 TileCharacters(1)=tilepetscii(1)
 TileCharacters(2)=tilepetscii(2)
 TileCharacters(3)=tilepetscii(3)

 return
   
getpetscii2
 if score<6 then goto getpetscii4
 BackgroundTileCharacters(0)=petscii2(0)
 BackgroundTileCharacters(1)=petscii2(1)
 BackgroundTileCharacters(2)=petscii2(2)
 BackgroundTileCharacters(3)=petscii2(3)

 TileCharacters(0)=tilepetscii2(0)
 TileCharacters(1)=tilepetscii2(1)
 TileCharacters(2)=tilepetscii2(2)
 TileCharacters(3)=tilepetscii2(3)

 return

getpetscii3
 if score<2 then goto getpetscii4

 BackgroundTileCharacters(0)=petscii3(0)
 BackgroundTileCharacters(1)=petscii3(1)
 BackgroundTileCharacters(2)=petscii3(2)
 BackgroundTileCharacters(3)=petscii3(3)

 TileCharacters(0)=tilepetscii3(0)
 TileCharacters(1)=tilepetscii3(1)
 TileCharacters(2)=tilepetscii3(2)
 TileCharacters(3)=tilepetscii3(3)
 return

getpetscii4
 BackgroundTileCharacters(0)=32
 BackgroundTileCharacters(1)=32
 BackgroundTileCharacters(2)=32
 BackgroundTileCharacters(3)=32
 TileCharacters(0)=102
 TileCharacters(1)=230
 TileCharacters(2)=102
 TileCharacters(3)=230

 return


 rem petscii texture map C64:
 rem data petscii 209,230,208,208
 rem data petscii 208,208,208,208
 data petscii 208,208,33,250
 
 
 rem pattern
 data petscii2 121,121,121,121
 rem parallel lines
 rem data petscii3 205,206,206,205
 rem diagonal fence pattern
 rem data petscii3 199,199,199,199
 rem thickparallel lines
 data petscii3 210,210,210,210
 rem horizontal lines

 data tilepetscii 210,210,210,210
 data tilepetscii2 65,65,65,65
 rem data tilepetscii3 205,206,206,205
 rem diagonal fence pattern
 data tilepetscii3 64,64,64,64
 rem starfield
 rem 102,230,102,230
 

 rem -------------------------------------------------------------
 rem 20250612 adding music editor, top vertical blank code:

 data fastm 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248

Editor1 
callalgorithms 
 rem all chiptunes
 if var1=0 and SWCHB|254<>255 then var1=1:gosub algorithm2:gosub TraceTracker
 rem 2025024 2nd method to call algorithm2: hold left and press button:
 if var1=1 and joy0left=1 and joy0fire=1 and m=0 then m=1:gosub algorithm2:gosubTraceTracker


 rem pattern level
 if var1=0 and SWCHB|%11111101<>255 then var1=1:gosub algorithmpatt:gosub TraceTracker:rem select
 rem 2025024 2nd method to call algorithmpatt: hold right and press button:
 if var1=1 and joy0right=1 and joy0fire=1 and m=0 then m=1:gosub algorithmpatt:gosubTraceTracker
 if var1=1 and joy0up=1 and joy0fire=1 and m=0 then m=2:gosub algorithmpatt:gosubTraceTracker
 if var1=1 and joy0down=1 and joy0fire=1 and m=0 then m=1:gosub templatepattern:gosubTraceTracker

checktokens
 rem next token? 
 if var1=0 and joy0right=1 and score<4 then score=score+1:var1=1
 rem prior token?
 if var1=0 and joy0left=1 and score>0 then score=score-1:var1=1

 COLUBK=0

 rem clear joystick input when stick is centered: (incldue reset, clear when reset is not set)
 if SWCHB|%11111101=255 and SWCHB|254=255 and joy0right=0 and joy0up=0 and joy0down=0 and joy0left=0 and var1=1 then var1=0:rem same input scheme to move joystick incrementally

 rem advance to next pattern?
 if m=0 and joy0fire=1 and MUSICINDEX<245 then m=1:y=y+1:gosub setrowcolors:gosub skipcontrols:return 

 rem gosub checktokens  -- done in top vertical blank

 if var1=0 and joy0up=1 then var1=1:t=1:gosub txpattern
 
 if var1=0 and joy0down=1 then var1=1:t=0:gosub txpattern

 rem --- music editor top vertical blank code ---
 return

 rem Muic editor bottom vertical blank code
 rem --------------------------------------
Editor2
  rem setup editor grid: setup TPL Tracker Player list program to return 1st pattern: 
 if z<10 then BITIndex=0:BYTErowoffset=0:NUSIZ1=0:gosub drawmusicscreen:MUSICINDEX=0:gosub TraceTracker:z=10:g=0:score=0:var1=0
 COLUBK=5
 SUSTAINFORFRAMES=SUSTAINFORFRAMES+1

 rem apply shaped volume Fx to voices:
 if w>0 then w=w-1 else SUSTAINFORFRAMES=2:rem ?
 AUDV0=w:AUDV1=w

 if f>2 then f=0 else f=f+1:rem frame

 if f>0 then goto notframe0
 if score=1 then COLUP1=60 else COLUP1=255
 if score=0 then bx=60 else bx=255
 gosub colorplayer0
 
 rem --- instrument v1
 bx=MUSICINDEX:gosub loadvar2
 var2=fastm(var2):rem var2*8
 rem 
 q=var2:gosub loadplayer0lib2:rem loadplayer0(var2)
 vwpixel(2,y,bindplayer0)
 rem --- v1 note
 bx=MUSICINDEX+1:gosub loadvar2
 var2=fastm(var2):rem var2*8
 q=var2:gosub loadplayer1lib2:rem loadplayer1(var2)
 vwpixel(6,y,bindplayer1)
 goto doneframes
   
notframe0 rem ---- 
 if score=3 then COLUP1=60 else COLUP1=255
 if score=2 then bx=60 else bx=255
 gosub colorplayer0

 if f>1 then goto notframe1
 rem --- instrument v2
 bx=MUSICINDEX+2:gosub loadvar2
 var2=fastm(var2):rem var2*8
 q=var2:gosub loadplayer0lib2:rem loadplayer0(var2)
 vwpixel(11,y,bindplayer0)
 rem --- v2 note
 bx=MUSICINDEX+3:gosub loadvar2
 var2=fastm(var2):rem var2*8
 q=var2:gosub loadplayer1lib2:rem loadplayer1(var2)
 vwpixel(14,y,bindplayer1)
 goto doneframes

notframe1 rem duration ---
 rem color both digits for duration (up to 99):
 if score=4 then COLUP1=60:bx=60 else COLUP1=255:bx=255
 rem gosub colorplayer0
 rem --- first digit
 bx=MUSICINDEX+4:gosub loadvar2
 j=var2/10:i=b
 j=fastm(j):rem j*8
 q=j:gosub loadplayer0lib2:rem loadplayer0(j)
 vwpixel(17,y,bindplayer0)
 rem --- duration second digit (up to 99)
 i=i*8
 q=i:gosub loadplayer1lib2:rem loadplayer1(i)
 vwpixel(18,y,bindplayer1)

doneframes


 if m<>0 and joy0fire=0 then m=0:rem clear

 rem --- music editor bottom vertical blank code ---
   
 return

loadvar2
 var2=MusicData(bx)
 return

setvar2
 MusicData(bx)=var2
 return

setrowcolors
 rowcolors(y)=0
 scrollvirtualworldtoggle=1
 return

txpattern
 bx=MUSICINDEX+score
 i=MusicData(bx)
 if t=1 then i=i+1 else i=i-1
 if t=0 and i=255 then return:rem below zero
 if i=0 and score=4 then return:rem duration must be at least one frame (zero duration indicate4s control frames used to bind subtunes and Fx to game events)
 MusicData(bx)=i
 gosub TraceTracker
 return

drawmusicscreen
 for y=0 to 9:rowcolors(y)=y+4:next y
 for y=0 to 8:for x=0 to 20 step 4:vwpixel(x,y,flip):next x,y:x=0:y=9:gosub setrowcolors:y=0:gosub setrowcolors
 return

skipcontrols 
 if y=10 then y=0:gosub drawmusicscreen:rem call screen column painter 
 if MUSICINDEX=250 then MUSICINDEX=0:y=0:COLUBK=3:rem loop around to start (tx c olor)

 bx=MUSICINDEX+9
 gosub loadvar2
test3 if var2=0 then MUSICINDEX=MUSICINDEX+10:gosub recolorscreen:gosub setrowcolors:score=0 else MUSICINDEX=MUSICINDEX+5:score=0
TraceTracker SUSTAINFORFRAMES=0:gosub PlayMusic:rem want next pattern 0 duration setting increments MUSICINDEX by 5
 MUSICINDEX=MUSICINDEX-5
 SUSTAINFORFRAMES=SUSTAINFORFRAMES+1
 w=SUSTAINFORFRAMES:rem 20250220 for AUDV0/AUDV1 volume Fx mirror
 return

colorplayer0
 for i=0 to 3:player0colors(i)=bx:next i:return

algorithmpatt rem one pattern only
 rem create new musical score 
 g=MUSICINDEX+4
 for bx=MUSICINDEX to g
 rem skip control codes
 rem -- not necessary since these algorithms are called from accessible patterns only:
 rem if bx=44 or bx=89 or bx=134 or bx=179 or bx=224 then goto skipnote2
 gosub loadvar2
 rem 20250224 up plus button = algorithm b applied at pattern level
 if m=2 then var2=var2&%00011111:var2=var2+5 else var2=var2&%00001111:var2=var2+3 
 gosub setvar2
 rem MusicData(var2)=var2^%00001111+5:rem 3
skipnote2 
 next bx
 g=0 
 return

algorithm2
 rem create new musical score 
 for bx=0 to 249
 rem skip control codes
 if bx=44 or bx=89 or bx=134 or bx=179 or bx=224 then goto skipnote3
 gosub loadvar2
 var2=var2&%00001111
 var2=var2+3
 gosub setvar2
 rem MusicData(bx)=var2&%00011111+3:rem 3
skipnote3 
 next bx
 return

templatepattern rem --- Template prior pattern [composition ctrl]
 if MUSICINDEX=0 then return:cannot template 1st pattern (templates prior pattern)
 g=MUSICINDEX+4
 for bx=MUSICINDEX to g
 m=bx-5
 var2=MusicData(m):gosub setvar2
 rem MusicData(bx)=var2
 rem MusicData(bx)=MusicData(m)
 MusicData(bx)=var2
 next bx
 g=0:m=1
 return

recolorscreen
 rem scrollvirtualworldtoggle=1
 for y=0 to 8:x=y*16:x=x+7:x=x+y:rowcolors(y)=x:next y:y=0
 return

loadplayer0lib2
 for bx=7 to 0 step -1
 player0(bx)=spritelib2(q)
 q=q+1
 next bx
 q=1:rem restore state
 return

loadplayer1lib2
 for bx=7 to 0 step -1
 player1(bx)=spritelib2(q)
 q=q+1
 next bx
 q=1:rem restore state
 return

 data spritelib2 %00000000
 data spritel001 %00000110
 data spritel002 %00001001
 data spritel003 %00001001
 data spritel004 %00001001
 data spritel005 %00001011
 data spritel006 %00000110
 data spritel007 %00000000

 data spritel008 %00000000
 data spritel009 %00000110
 data spritel00a %00001110
 data spritel00b %00000110
 data spritel00c %00000110
 data spritel00d %00000110
 data spritel00e %00000110
 data spritel00f %00000000

 data spritel00g %00000000
 data spritel00h %00001110
 data spritel00i %00001001
 data spritel00j %00000001
 data spritel00k %00000010
 data spritel00l %00000110
 data spritel00m %00001111
 data spritel00n %00000000

 data spritel00o %00000000
 data spritel00p %00001110
 data spritel00q %00000001
 data spritel00r %00000001
 data spritel00s %00001111
 data spritel00t %00000001
 data spritel00u %00001110
 data spritel00v %00000000

 data spritel00w %00000000
 data spritel00x %00000001
 data spritel00y %00000011
 data spritel00z %00000101
 data spritel010 %00001111
 data spritel020a %00000011
 data spritel030 %00000011
 data spritel040a %00000000

 data spritel050a %00000000
 data spritel060 %00001111
 data spritel070 %00001000
 data spritel080 %00001111
 data spritel090 %00000001
 data spritel0a0 %00000001
 data spritel0b0 %00001111
 data spritel0c0 %00000000

 data spritel0d0 %00000000
 data spritel0e0 %00000110
 data spritel0f0 %00001001
 data spritel0g0 %00001000
 data spritel0h0 %00001110
 data spritel0i0 %00001001
 data spritel0j0 %00001110
 data spritel0k0 %00000000

 data spritel0l0 %00000000
 data spritel0m0 %00001111
 data spritel0n0 %00000011
 data spritel0o0 %00000110
 data spritel0p0 %00001100
 data spritel0q0 %00001100
 data spritel0r0 %00001100
 data spritel0s0 %00000000

 data spritel0t0 %00000000
 data spritel0u0 %00000110
 data spritel0v0 %00001001
 data spritel0w0 %00001001
 data spritel0x0 %00000110
 data spritel0y0 %00001001
 data spritel0z0 %00000110
 data spritel011 %00000000

 data spritel012 %00000000
 data spritel013 %00000110
 data spritel014 %00001001
 data spritel015 %00001001
 data spritel016 %00000111
 data spritel017 %00000001
 data spritel018 %00000001
 data spritel019 %00000000

 data spritel01a %00000000
 data spritel01b %01100110
 data spritel01c %11101001
 data spritel01d %01101001
 data spritel01e %01101001
 data spritel01f %01101011
 data spritel01g %01100110
 data spritel01h %00000000

 data spritel01i %00000000
 data spritel01j %01100110
 data spritel01k %11101110
 data spritel01l %01100110
 data spritel01m %01100110
 data spritel01n %01100110
 data spritel01o %01100110
 data spritel01p %00000000

 data spritel01q %00000000
 data spritel01r %01101110
 data spritel01s %11101001
 data spritel01t %01100001
 data spritel01u %01100010
 data spritel01v %01100110
 data spritel01w %01101111
 data spritel01x %00000000

 data spritel01y %00000000
 data spritel01z %01101110
 data spritel020 %11100001
 data spritel021 %01100001
 data spritel022 %01101111
 data spritel023 %01100001
 data spritel024 %01101110
 data spritel025 %00000000

 data spritel026 %00000000
 data spritel027 %01100001
 data spritel028 %11100011
 data spritel029 %01100101
 data spritel02a %01101111
 data spritel02b %01100011
 data spritel02c %01100011
 data spritel02d %00000000

 data spritel02e %00000000
 data spritel02f %01101111
 data spritel02g %11101000
 data spritel02h %01101111
 data spritel02i %01100001
 data spritel02j %01100001
 data spritel02k %01101111
 data spritel02l %00000000

 data spritel02m %00000000
 data spritel02n %01100110
 data spritel02o %11101101
 data spritel02p %01101100
 data spritel02q %01101110
 data spritel02r %01101001
 data spritel02s %01101110
 data spritel02t %00000000

 data spritel02u %00000000
 data spritel02v %01101111
 data spritel02w %11100011
 data spritel02x %01100110
 data spritel030a %01101100
 data spritel031 %01101100
 data spritel032 %01101100
 data spritel033 %00000000

 data spritel034 %00000000
 data spritel035 %01100110
 data spritel036 %11101001
 data spritel037 %01101001
 data spritel038 %01100110
 data spritel039 %01101001
 data spritel03a %01100110
 data spritel03b %00000000

 data spritel03c %00000000
 data spritel03d %01100110
 data spritel03e %11101001
 data spritel03f %01101001
 data spritel03g %01100111
 data spritel03h %01100001
 data spritel03i %01100001
 data spritel03j %00000000

 data spritel03k %00000000
 data spritel03l %11100110
 data spritel03m %10101001
 data spritel03n %00101001
 data spritel03o %01001001
 data spritel03p %10001011
 data spritel03q %11100110
 data spritel03r %00000000

 data spritel03s %00000000
 data spritel03t %11100110
 data spritel03u %10101110
 data spritel03v %00100110
 data spritel03w %01000110
 data spritel03x %10000110
 data spritel03y %11100110
 data spritel03z %00000000

 data spritel040 %00000000
 data spritel041 %11101110
 data spritel042 %10101010
 data spritel043 %00100010
 data spritel044 %01000100
 data spritel045 %10001000
 data spritel046 %11101110
 data spritel047 %00000000

 data spritel048 %00000000
 data spritel049 %11101110
 data spritel04a %10100001
 data spritel04b %00100001
 data spritel04c %01001111
 data spritel04d %10000001
 data spritel04e %11101110
 data spritel04f %00000000

 data spritel04g %00000000
 data spritel04h %11100001
 data spritel04i %10100011
 data spritel04j %00100101
 data spritel04k %01001111
 data spritel04l %10000011
 data spritel04m %11100011
 data spritel04n %00000000

 data spritel04o %00000000
 data spritel04p %11101111
 data spritel04q %10101000
 data spritel04r %00101111
 data spritel04s %01000001
 data spritel04t %10000001
 data spritel04u %11101111
 data spritel04v %00000000

 data spritel04w %00000000
 data spritel04x %11100110
 data spritel04y %10101001
 data spritel04z %00101000
 data spritel050 %01001110
 data spritel051 %10001001
 data spritel052 %11101110
 data spritel053 %00000000

 data spritel054 %00000000
 data spritel055 %11101111
 data spritel056 %10100011
 data spritel057 %00100110
 data spritel058 %01001100
 data spritel059 %10001100
 data spritel05a %11101100
 data spritel05b %00000000

 data spritel05c %00000000
 data spritel05d %11100110
 data spritel05e %10101001
 data spritel05f %00101001
 data spritel05g %01000110
 data spritel05h %10001001
 data spritel05i %11100110
 data spritel05j %00000000

 data spritel05k %00000000
 data spritel05l %11100110
 data spritel05m %10101001
 data spritel05n %00101001
 data spritel05o %01000111
 data spritel05p %10000001
 data spritel05q %11100001
 data spritel05r %00000000

 data spritel05s %00000000
 data spritel05t %11000110
 data spritel05u %00101001
 data spritel05v %00101001
 data spritel05w %11101001
 data spritel05x %00101011
 data spritel05y %11000110
 data spritel05z %00000000

 data spritel060a %00000000
 data spritel061 %11000110
 data spritel062 %00101110
 data spritel063 %00100110
 data spritel064 %11100110
 data spritel065 %00100110
 data spritel066 %11000110
 data spritel067 %00000000

 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
 d=s/8
 if d&#00000110>0 then 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
4,23,4,17,29
16,9,13,21,9
0,18,0,14,34
36,18,15,16,25
35,16,30,10,34
0,19,0,12,48
33,16,30,10,34
0,16,0,16,34
0,16,0,16,9
0,18,0,14,34
0,18,0,14,34
0,7,0,21,06
1,16,30,10,10
6,20,6,20,10
6,20,6,20,8

6,17,6,5,34
6,17,6,28,34
6,11,6,11,34
26,26,26,26,10
26,26,26,26,10
30,25,6,17,34
30,25,6,17,34
30,14,6,27,26
30,17,6,17,34
30,21,6,21,34
30,18,6,18,34
30,21,6,12,34
30,14,8,31,40
30,21,6,18,27
30,21,4,9,64

30,19,6,28,31
30,21,6,12,34
26,26,26,26,10
0,21,0,7,34
0,14,0,3,48
0,18,0,14,34
0,18,0,14,34
0,16,0,16,34
26,24,26,29,18
0,16,0,16,34
0,16,0,16,34
0,26,0,14,34
0,18,0,14,34
0,7,0,21,6
30,25,30,31,8
26,26,26,26,34
30,11,30,1,34
30,11,30,1,34
30,13,33,21,34
0,18,0,14,48
0,0,0,0,0