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