From 41001489ca51139d9a2538fafdbc72ef1a22c092 Mon Sep 17 00:00:00 2001 From: gimulnautti Date: Sat, 18 Feb 2023 12:15:00 +0200 Subject: [PATCH] add TRSE files --- PiraattiIntro.trse | 80 + piraatti_intro.ras | 1514 +++++++++++++++++ resources/charsets/alternate_reality_x.bin | Bin 0 -> 1904 bytes resources/charsets/bold_xy.bin | Bin 0 -> 2048 bytes resources/charsets/broadway_xy.bin | Bin 0 -> 2048 bytes resources/charsets/cavelon.bin | Bin 0 -> 512 bytes .../charsets/final_designer_scroll_y.bin | Bin 0 -> 1024 bytes resources/charsets/geometrisch_2_x.bin | Bin 0 -> 2048 bytes resources/charsets/inspector_gadget_xy.bin | Bin 0 -> 2048 bytes resources/charsets/jumping_jack_x.bin | Bin 0 -> 1024 bytes resources/images/piraaattilogo.bitmap.flf | Bin 0 -> 12271 bytes resources/images/piraattinaamat-1.flf | Bin 0 -> 12271 bytes resources/images/piraattinaamat-1_color.bin | Bin 0 -> 2002 bytes resources/images/piraattinaamat-1_data.bin | Bin 0 -> 8000 bytes resources/images/piraattinaamat-2-39x24.flf | Bin 0 -> 11503 bytes .../images/piraattinaamat-2-39x24_color.bin | 1 + .../images/piraattinaamat-2-39x24_data.bin | Bin 0 -> 7488 bytes resources/images/piraattinaamat-2.flf | Bin 0 -> 12271 bytes resources/images/piraattinaamat-2_color.bin | Bin 0 -> 2002 bytes resources/images/piraattinaamat-2_data.bin | Bin 0 -> 8000 bytes resources/images/toni.flf | Bin 0 -> 12271 bytes resources/sid/_piraattimusa.dat | Bin 0 -> 5517 bytes resources/sid/piraattimusa.sid | Bin 0 -> 5643 bytes resources/sprites/c-equals-2x1-hires.bin | Bin 0 -> 64 bytes resources/sprites/c-equals-2x1-hires.flf | Bin 0 -> 401 bytes resources/sprites/piraattilogo-hires.bin | Bin 0 -> 512 bytes resources/sprites/piraattilogo-hires.flf | Bin 0 -> 1157 bytes 27 files changed, 1595 insertions(+) create mode 100644 PiraattiIntro.trse create mode 100644 piraatti_intro.ras create mode 100644 resources/charsets/alternate_reality_x.bin create mode 100644 resources/charsets/bold_xy.bin create mode 100644 resources/charsets/broadway_xy.bin create mode 100644 resources/charsets/cavelon.bin create mode 100644 resources/charsets/final_designer_scroll_y.bin create mode 100644 resources/charsets/geometrisch_2_x.bin create mode 100644 resources/charsets/inspector_gadget_xy.bin create mode 100644 resources/charsets/jumping_jack_x.bin create mode 100644 resources/images/piraaattilogo.bitmap.flf create mode 100644 resources/images/piraattinaamat-1.flf create mode 100644 resources/images/piraattinaamat-1_color.bin create mode 100644 resources/images/piraattinaamat-1_data.bin create mode 100644 resources/images/piraattinaamat-2-39x24.flf create mode 100644 resources/images/piraattinaamat-2-39x24_color.bin create mode 100644 resources/images/piraattinaamat-2-39x24_data.bin create mode 100644 resources/images/piraattinaamat-2.flf create mode 100644 resources/images/piraattinaamat-2_color.bin create mode 100644 resources/images/piraattinaamat-2_data.bin create mode 100644 resources/images/toni.flf create mode 100644 resources/sid/_piraattimusa.dat create mode 100644 resources/sid/piraattimusa.sid create mode 100644 resources/sprites/c-equals-2x1-hires.bin create mode 100644 resources/sprites/c-equals-2x1-hires.flf create mode 100644 resources/sprites/piraattilogo-hires.bin create mode 100644 resources/sprites/piraattilogo-hires.flf diff --git a/PiraattiIntro.trse b/PiraattiIntro.trse new file mode 100644 index 0000000..b40df3c --- /dev/null +++ b/PiraattiIntro.trse @@ -0,0 +1,80 @@ +zeropages = ,$02, $04, $08, $16, $0B, $0D, $10, $12, $22, $24, $68, $45 +temp_zeropages = ,$54, $56, $58, $5A +zeropages_userdefined = ,$5e, $5f, $60, $61, $62, $63 +zeropage_screenmemory = $fe +zeropage_decrunch1 = $47 +zeropage_decrunch2 = $48 +zeropage_decrunch3 = $4a +zeropage_decrunch4 = $4b +pascal_settings_use_local_variables = 0 +system = C64 +main_ras_file = none +zeropage_internal1 = $4c +zeropage_internal2 = $4e +zeropage_internal3 = $50 +zeropage_internal4 = $52 +post_optimizer_passlda = 1 +post_optimizer_passjmp = 1 +post_optimizer_passldatax = 1 +post_optimizer_passstalda = 1 +post_optimizer_passldx = 1 +post_optimizer_passcmp = 1 +post_optimizer_passphapla = 1 +machine_state = $35 +exomize_toggle = 0 +border_color = 0 +background_color = 0 +override_target_settings = 0 +override_target_settings_org = $810 +override_target_settings_ignore_sys = 0 +override_target_settings_ignore_prg = 0 +output_debug_symbols = 1 +open_files = ,piraatti_intro.ras +project_path = /Users/gimulnautti/piraattipuolue-github/c64-vaali-intro-2023/ +zeropage_colormemory = $fb +dirart_flf_file = none +d64name = main +show_all_files = 1 +use_vice_c1541 = 0 +remove_unused_symbols = 1 +ignore_initial_jump = 0 +current_file = piraatti_intro.ras +output_type = prg +exomizer_toggle = 0 +use_track_19 = 1 +disable_compiler_comments = 0 +charset_ = :resources/character.rom +data_header_resources/charsets/charial.flf = 0 +data_header_resources/images/piraattinaamat-1.flf = 0 +data_header_resources/images/piraattinaamat-2-39x24.flf = 6.4902e-314 +data_header_resources/images/toni.flf = 2.28122e-314 +var_zeropages = , +global_defines = , +custom_system_cpu = 6502 +custom_system_methods = C64 +custom_system_assembler = From System +custom_system_assembler_custom = 0 +custom_system_emulator = 0 +custom_system_emulator_parameters = 0 +custom_system_assembler_parameters = 0 +custom_system_ending = 0 +petmodel = 2001-8N +amstradcpc_model = 464 +qemu = No +use_tripe = 0 +amstradcpc_options = 0 +spectrum_model = 0 +dosbox_cycles = 0 +dosbox_x86_system = default +cpu_x86_system = 8086 +cpu_x86_output = exe +columns = 40 +vic_memory_config = none +via_zeropages = , +d64_paw_file = none +d64_paw_file_disk2 = none +override_target_settings_basic = 0 +override_target_settings_sys = 0 +override_target_settings_prg = 0 +build_list = , +data_header_resources/images/piraattinaamat-2.flf = 6.42703e-314 diff --git a/piraatti_intro.ras b/piraatti_intro.ras new file mode 100644 index 0000000..10b30ef --- /dev/null +++ b/piraatti_intro.ras @@ -0,0 +1,1514 @@ +/** + * Single file C64 intro + * + * Finnish Pirate Party election campaign 2023 + */ +program PiraattiIntro; + +var +/* + Demo part flags +*/ + @define partNone 0 + @define partWriter 1 + @define partOpenBar 2 + @define partSpriteBounce 3 + @define partFadeOutOpeningScreen 4 + @define partLogoBarWobble 5 + @define partBounceBarUp 6 + @define partMain 7 + + currentPart : byte = @partNone; + currentTime : integer = 0; + currentPartDone : boolean = true; + +/* + Main screen state flags +*/ + @define mainShowText 0 + @define mainFadeToPicture 1 + @define mainPicture 2 + @define mainFadeToText 3 + + mainState : byte = @mainPicture; + mainTime : integer = 0; + +/* + Opening writer main variables +*/ + bTime, curWait, curCol, i : byte = 0; + tp, sp: pointer; + onPause, bigSprite : boolean; + textColFade : array[] of byte = ($01, $03, $0c, $0d, $01, $01, $01, $01); + + @define cpause 220 + @define cmoveto 221 + @define cstop 223 + @define cpage 224 + @define cloop 225 + +/* + Writer sprite flying +*/ + charOnSprite0 : byte = 0; + spriteX : integer = 0; + spriteY : byte = 0; + textX, textY : byte = 0; + + @define spriteLoc $3c80 + @define charSetCopyLoc $c000 + @define spriteBank 0 + + lookup3Dx : array[40] of integer = buildtable("300 * (i - 20) / 200"); + lookup3Dy : array[25] of integer = buildtable("300 * (i - 11) / 30"); + + flightColFade : array[] of byte = ($01, $0c, $01, $0b, $01, $00, $0f, $00, $01); + + @define betweencharpause 8 + +/* + Writer text. + @cmoveto moves the cursor to the x/y position + @ccolor sets color + @cpause initializes a pause +*/ + +text : string = (@cmoveto, 6,10, + "TIETOYHTEISKUNTA TARVITSEE ", @cpause,12, + @cmoveto, 10,12, + "TEKNOLOGIAPUOLUEEN ", @cpause,32, + @cstop); + +/* + Opening color plasma variables +*/ + textPlasmaX : array[256] of integer = buildtable("5 * (Math.sin(3 * i * 6.28 / 256) * 0.5 + 0.5) + 12 * (Math.sin(2 * i * 6.28 / 256) * 0.5 + 0.5)"); + fastPlasma : array[256] of byte; + textPlasmaLumi : array[] of byte = ($06, $0b, $0c, $0e, $0f, $03, $0d, $07, $01, $01, $01, $01, $01, $01, $01); + textLumi2 : array[] of byte = ($01, $07, $0d, $03, $0f, $0e, $0c, $0b, $06, $0b, $0c, $0e, $0f, $03, $0d, $07, $01); + fastPlasmaSweep : array[256] of byte = buildtable("10 * (-Math.cos(2 * i * 6.28 / 256) * 0.5 + 0.5)"); + + textPlStartX : byte = 0; + textPlStartY : byte = 0; + textPlEndX : byte = 40; + textPlEndY : byte = 7; + textPlOfsX, textPlOfsY : byte = 0; + textPlAdd : byte = 0; + + textBlinkOfs : byte = 0; + +/* + Purple bar variables +*/ + @define purpleBarBounceSize 128 + @define purpleBarDefaultCenter 180 + @define purpleBarCenterOffset 17 + + purpleBarBounce : array[@purpleBarBounceSize] of byte = buildtable("17 * Math.abs( (i <= 64) ? Math.exp(5*((i/64)-1)) : 1 - ( Math.abs(Math.cos( ((i/64)+0.5) * 3.1415 )) / Math.pow((i/64),2) ) )") at $5a00; + purpleBarBounce2 : array[@purpleBarBounceSize] of byte = buildtable("60 + 120 * (Math.pow(2, -8 * (i/128)))") at $5a80; + purpleBounceOfs : byte = 0; + purpleBarCenter : byte = @purpleBarDefaultCenter; + bgColBefore, fgColBefore : byte = 0; + purpleBarStartRasterLine : byte = @purpleBarDefaultCenter - 17; + purpleBarEndRasterLine : byte = @purpleBarDefaultCenter + 17; + +/* + Sprite bounce variables +*/ + @define spriteBounceSpriteWidth 24 + @define spriteBounceSize 128 + @define spriteBarCenterOffset 10 + + spriteBounce : array[@spriteBounceSize] of integer = buildtable("300 - 300 * Math.abs( (i <= 64) ? Math.exp(5*((i/64)-1)) : (1 - ( Math.abs(Math.cos( ((i/64)+0.5) * 3.1415 )) / Math.pow((i/64),2) ) ) - ( (i/64) / 12 ) )") at $5b00; + spriteBounceOfs : byte = 0; + spriteBounceStartY : byte = 170; + spriteBounceStartX : byte = 24; + spriteBounceXCurrent : integer = 0; + + // Export all sprites automatically on each build + @define spriteLocBounce0 $3d00 + @define spriteLocBounce $0000 + + @export "resources/sprites/piraattilogo-hires.flf" "resources/sprites/piraattilogo-hires.bin" 0 + bounceSpritesBank0:incbin("resources/sprites/piraattilogo-hires.bin", @spriteLocBounce0); + bounceSpritesBank1:incbin("resources/sprites/piraattilogo-hires.bin", @spriteLocBounce + $4000); + + @define spriteLocCEquals0 $3f00 + @define spriteLocCEquals $0200 + + @export "resources/sprites/c-equals-2x1-hires.flf" "resources/sprites/c-equals-2x1-hires.bin" 0 + cEqualsSpritesBank0:incbin("resources/sprites/c-equals-2x1-hires.bin", @spriteLocCEquals0); + cEqualsSpritesBank1:incbin("resources/sprites/c-equals-2x1-hires.bin", @spriteLocCEquals + $4000); + + @define spriteWobbleSize 256 + spriteWobble : array[@spriteWobbleSize] of byte = buildtable("78 + 10 * ( ( (i <= 127) ? (i/128) : ((256-i)/128) ) * Math.sin(i/4) )"); + spriteWobbleEasy : array[@spriteWobbleSize] of byte = buildtable("78 + 10 * ( ( (i <= 127) ? (i/128) : ((256-i)/128) ) * Math.sin(i/10) )"); + spriteWobblePtr : pointer; + + spriteWobbleOfs : byte = 0; + flagOrCequals : boolean = false; + +/* + Screen fade variables +*/ + @define textFadeLumiLast 21 + textFadeLumi : array[] of byte = ($01, $01,$01, $01, $07, $07, $0d, $0d, $03, $03, $03, $03, $03, $0e, $0e, $0e, $0e, $0e, $0b, $0b, $00, $00); + textFadeReverse : array[] of byte = ($0, $0, $0, $0, $0b, $0b, $0b, $0e, $0e, $0e, $03, $03, $03, $0d, $0d, $0d, $07, $07, $07, $01, $01, $01); + + @define fadeStateBorder 0 + @define fadeStateText 1 + @define fadeStateAll 2 + + fadeStateCurrent : byte = @fadeStateBorder; + fadeOfsCurrent : byte = 0; + fadeTemp : byte = 0; + +/* + Main part +*/ + @define mainpart_bitmapArea $6000 // <-- VIDEO BUFFER IS HERE!! + + @define piraattinaamat1_color $5200 + @define piraattinaamat1_data $8000 + + @export "resources/images/piraattinaamat-1.flf" "resources/images/piraattinaamat-1.bin" 0 + naamat1Color:incbin("resources/images/piraattinaamat-1_color.bin", @piraattinaamat1_color); + naamat1Data:incbin("resources/images/piraattinaamat-1_data.bin", @piraattinaamat1_data); + + @define piraattinaamat2_color $f800 + @define piraattinaamat2_data $a000 + + @export "resources/images/piraattinaamat-2.flf" "resources/images/piraattinaamat-2.bin" 0 + naamat2Color:incbin("resources/images/piraattinaamat-2_color.bin", @piraattinaamat2_color); + naamat2Data:incbin("resources/images/piraattinaamat-2_data.bin", @piraattinaamat2_data); + + + @define naamaCoordEhdokas 0 + @define naamaCoordStartX 1 + @define naamaCoordStartY 2 + @define naamaCoordWidth 3 + @define naamaCoordHeight 4 + + naamatAddresses : array[] of integer = ( @piraattinaamat1_data, @piraattinaamat1_color, + @piraattinaamat1_data, @piraattinaamat1_color, + @piraattinaamat1_data, @piraattinaamat1_color, + @piraattinaamat1_data, @piraattinaamat1_color, + @piraattinaamat1_data, @piraattinaamat1_color, + @piraattinaamat1_data, @piraattinaamat1_color, + + @piraattinaamat2_data, @piraattinaamat2_color, + @piraattinaamat2_data, @piraattinaamat2_color, + @piraattinaamat2_data, @piraattinaamat2_color, + @piraattinaamat2_data, @piraattinaamat2_color, + @piraattinaamat2_data, @piraattinaamat2_color, + @piraattinaamat2_data, @piraattinaamat2_color); + + naamatCoordinates : array[] of byte = ( 0, 0, 13, 12, + 13, 0, 13, 12, + 26, 0, 13, 12, + 0, 12, 13, 12, + 13, 12, 13, 12, + 26, 12, 13, 12, + + 0, 0, 13, 12, + 13, 0, 13, 12, + 26, 0, 13, 12, + 0, 12, 13, 12, + 13, 12, 13, 12, + 26, 12, 13, 12); + + naamatNames : string = ( + "TONI AITTONIEMI - UUSIMAA", @cpause, + "JUHO KARVINEN - PIRKANMAA", @cpause, + "RIIKKA NIEMINEN - UUSIMAA", @cpause, + "JARI NIKKINEN - SAVO-KARJALA", @cpause, + "SATU IMMONEN - HELSINKI", @cpause, + "PEKKA MUSTONEN - HELSINKI", @cpause, + + "REETTA OJALA - HELSINKI", @cpause, + "MAREK NETSHADA - HELSINKI", @cpause, + "OLAVI KAUKAMIELI - HELSINKI", @cpause, + "PYRY SAARELA - VARSINAIS-SUOMI", @cpause, + "KAUSTI RANTALAINEN - HELSINKI", @cpause, + "ARI-PEKKA PULKKIS - VAASA", @cpause, @cstop ); + + naamatNumbers : string = ( "123", "456", "789", " 10", "20 ", " 30", + " 40", "50 ", " 60", " 70", " 80", " 90", @cstop); + + + tab320 : array[25] of integer = buildtable("i*320"); + tab40 : array[25] of integer = buildtable("i*40"); + + @define numberSpriteCopies $5800 + numberSprite0loc : byte = @numberSpriteCopies / 64 + 0; + numberSprite1loc : byte = @numberSpriteCopies / 64 + 1; + numberSprite2loc : byte = @numberSpriteCopies / 64 + 2; + + numberSpriteFloatX : array[256] of byte = buildtable("Math.sin(i * (2 * 6.28 / 256)) * 7 + Math.cos(i * 6.28 / 256) * 20") at $5c00; + numberSpriteFloatY : array[256] of byte = buildtable("Math.cos(i * (3 * 6.28 / 256)) * 5") at $5d00; + numberSprite0FloatOfs : byte = 15; + numberSprite1FloatOfs : byte = 30; + numberSprite2FloatOfs : byte = 45; + numberSprite3FloatOfs : byte = 0; + numberSprite4FloatOfs : byte = 15; + numberSprite5FloatOfs : byte = 30; + + @define mainPartBigFontLoc $4800 + mainPartBigFont:incbin("resources/charsets/broadway_xy.bin", @mainPartBigFontLoc); + + @define numMainTextPages 6 + mainText : string = ( @cmoveto, 0, 3, " COMMODORELLA ", + @cmoveto, 0, 4, " EDUSKUNTAAN ", + @cmoveto, 0, 5, " 2023 ", + @cpage, + @cmoveto, 0, 2, " RADIKAALISTI ", + @cmoveto, 0, 3, " AVOINTA ", + @cmoveto, 0, 4, " DEMOKRATIAA ", + @cmoveto, 0, 5, " VALTIONHALLINNON ", + @cmoveto, 0, 6, " LIVESTREAMAUS ", + @cmoveto, 0, 7, " LAHTOKOHTAISESTI ", + @cpage, + @cmoveto, 0, 2, " LOBBAUS NAKYVAKSI ", + @cmoveto, 0, 3, " LAAJA JULKISUUSLAKI", + @cmoveto, 0, 4, "KANSANAANESTYSALOITE", + @cmoveto, 0, 5, " RAHANKERAYSLAIN ", + @cmoveto, 0, 6, " UUDISTUS ", + @cmoveto, 0, 7, " PERUSTULO ", + @cpage, + @cmoveto, 0, 2, " PERUSOIKEUDET ", + @cmoveto, 0, 3, " YKSITYISYYDENSUOJA ", + @cmoveto, 0, 4, " YHDENVERTAISUUS ", + @cmoveto, 0, 5, " KESTAVYYSSIIRTYMA ", + @cmoveto, 0, 6, " VETYTALOUDEN ", + @cmoveto, 0, 7, " TEKNOLOGIATUKI ", + @cpage, + @cmoveto, 0, 2, " HYVINVOINTIALUEIDEN", + @cmoveto, 0, 3, " VERONKANTO-OIKEUS ", + @cmoveto, 0, 4, "PAIKALLISDEMOKRATIAN", + @cmoveto, 0, 5, " VAHVISTAMINEN ", + @cmoveto, 0, 6, " LUONTO MAANKAYTTO ", + @cmoveto, 0, 7, " KESTAVYYS ", + @cpage, + @cmoveto, 0, 3, " TIETOPOLITIIKAN ", + @cmoveto, 0, 4, " VAKIINNUTTAMINEN ", + @cmoveto, 0, 5, " OSAKSI HALLINTO- ", + @cmoveto, 0, 6, " RAKENNETTA ", + @cpage, @cstop); + + mainPartAddressTable : array[25] of integer; + colorAddressTable : array[25] of integer; + + @define mainPartSmallFontLoc $5000 + mainPartSmallFont:incbin("resources/charsets/cavelon.bin", @mainPartSmallFontLoc); + + naamatDataPtr, naamatColorPtr : pointer; + numbersPtr, namesPtr : pointer; + + pictureFade, textFade, numbersFade, nameFade : integer = 0; + + currentNaama : byte = 0; + + rasterLineMainCandidateText : byte = 180; + rasterLineMainScroller : byte = 240; + + // TODO optimize spaces + scrollText : string = " YARRRR SAILORS WELCOME TO THE FINNISH PIRATE PARTY PARLIAMENTARY ELECTION 2023 INTRO --- VOTE FOR US --- WE ROCK THE WORLD IN 8 BITS AND BEYOND --- WRITTEN BY GIMLE IN TRSE --- MUSIC BY GIMLE IN SIDFACTORY II --- MUCH LOVE AND GREETINGS TO THE C64 DEMOSCENE --- WE SALUTE SOME GROUNDBREAKING TECHNOLOGICAL PIRATES --- FINNISH GOLD - EXTEND - VIRTUAL DREAMS - FAIRLIGHT - BYTERAPERS - BLOODSUCKERS - ARTLINE DESIGNS - DEKADENCE - BOOZE DESIGN - ACCESSION - NOICE - PROXIMA - ORANGE - CNCD - KEWLERS - MFX - TPOLM - MATUREFURK - KATASTRO FI - SCOOPEX - TAAT - HEDELMAE - JUMALAUTA - KAITA FILMITUOTANTO - BRAINLEZ CODERS - SYMPTOM - GOTO 10 - DAMONES - DA JORMAS - WIDE LOAD - HIRMU --- "; + scrollTextOffset : integer = 0; + scrollTextLength : integer = 0; + scrollCurrent : byte = 0; + scrollFlashTimer : integer = 0; + +/* + Music +*/ + sidfile:incsid("resources/sid/piraattimusa.sid", 2); + +/* + General flags +*/ + @define useKernal 0 + +/* + Spare pointers +*/ + tempPtr1, tempPtr2 : pointer; + tempInt : integer; + +//=========================================================================================================== +// Raster interrupt forward declarations +//=========================================================================================================== + +interrupt MainRaster(); +interrupt RasterText(); +interrupt RasterTextPlasma(); +interrupt RasterPurpleBarStart(); +interrupt RasterPurpleBarEnd(); +interrupt RasterPurpleBarStartWithSprites(); +interrupt RasterMainPartCandidateTexts(); +interrupt RasterMainPartScroller(); + +procedure GoToMainRaster(); +begin + RasterIrq(MainRaster(), 250, @useKernal); +end; + +procedure GoToPurpleBarRasterStart(); +begin + if (currentPart < @partLogoBarWobble) then RasterIrq(RasterPurpleBarStart(), purpleBarStartRasterLine, @useKernal) + else RasterIrq(RasterPurpleBarStartWithSprites(), purpleBarStartRasterLine, @useKernal); +end; + +procedure GoToPurpleBarRasterEnd() inline; +begin + RasterIrq(RasterPurpleBarEnd(), purpleBarEndRasterLine, @useKernal); +end; + +procedure GoToMainPartCandidateTextRaster(); +begin + RasterIrq(RasterMainPartCandidateTexts(), rasterLineMainCandidateText, @useKernal); +end; + +procedure GoToMainPartScrollerRaster(); +begin + RasterIrq(RasterMainPartScroller(), rasterLineMainScroller, @useKernal); +end; + +/** + * Assembly setup for a character set copy in RAM + */ +procedure CopyCharsetRomToRam(targetHi : byte); +begin + asm(" + ldx #$08 ; we loop 8 times (8x255 = 2Kb) + lda #$33 ; make the CPU see the Character Generator ROM... + sta $01 ; ...at $D000 by storing %00110011 into location $01 + lda #$d0 ; load high byte of $D000 + sta $fc ; store it in a free location we use as vector + ldy #$00 ; init counter with 0 + sty $fb ; store it as low byte in the $FB/$FC vector + lda $fd ; second pair in $FD/$FE + lda targetHi ; point to target + sta $fe + +loopc lda ($fb),y ; read byte from vector stored in $fb/$fc + sta ($fd),y ; write to the RAM + iny ; do this 255 times... + bne loopc ; ..for low byte $00 to $FF + inc $fc ; when we passed $FF increase high byte... + inc $fe + dex ; ... and decrease X by one before restart + bne loopc ; We repeat this until X becomes Zero + lda #$37 ; switch in I/O mapped registers again... + sta $01 ; ... with %00110111 so CPU can see them + "); +end; + +/** + * Print character set char to sprite data (hires) + * Triple each bit in char both vertical and horizontal + */ +procedure PrintCharToSprite(char:byte, charsetptr, sPtr:pointer); +var + chrBitMask : array[] of byte = ($01, $02, $04, $08, $10, $20, $40, $80); + sprBitMask : array[] of byte = ($07, $38, $c0, $01, $0e, $70, $80, $03, $1c, $e0); + sprOffset : array[] of byte = ($02, $02, $02, $01, $01, $01, $01, $00, $00, $00); + sprChrBit : array[] of byte = ($00, $01, $02, $02, $03, $04, $05, $05, $06, $07); + numLines : array[] of byte = (3, 3, 3, 3, 3, 3, 3, 3); + numLines2 : array[] of byte = (2, 3, 3, 2, 3, 3, 3, 2); + numLinesPtr : pointer; + temp : array[] of byte = (0,0,0); + charTemp, sprOfsTemp : byte; + k : byte; +begin + while (char > 64) do char -= 64; + + tempPtr1 := charsetptr + char * 8; + + for k:=0 to 8 do begin + temp[0] := 0; + temp[1] := 0; + temp[2] := 0; + for i:=0 to 10 do begin + charTemp := tempPtr1[0] & chrBitMask[sprChrBit[i]]; + sprOfsTemp := sprOffset[i]; + if charTemp then temp[sprOfsTemp] := temp[sprOfsTemp] | sprBitMask[i]; + end; + for i:=0 to numLinesPtr[k] do begin + sPtr[0] := temp[0]; + sPtr[1] := temp[1]; + sPtr[2] := temp[2]; + sPtr += 3; + end; + tempPtr1 += 1; + end; + +end; + +procedure PrintDebug(cx, cy, n : byte); +begin + tempPtr1 := screenmemory; + moveto(cx,cy,hi(screen_char_loc)); + printnumber(n); + screenmemory := tempPtr1; +end; + +procedure UpdateText(); + +procedure UpdateTextColor() inline; +begin + for i:=0 to 5 do begin + tempPtr1:=sp-i; + tempPtr1[0]:=textPlasmaLumi[4+i]; + end; +end; + +procedure UpdateTextPlasma(); +var iy, ix : byte; +begin + for iy := textPlStartY to textPlEndY do begin + tempPtr1 := #screen_col_loc + tab40[iy]; + tempPtr2 := #fastPlasma + textPlOfsX + iy; + memcpyfast(tempPtr2, 0, tempPtr1, 40); + end; + inc(textPlOfsX); + if (textPlOfsX > 230) then textPlOfsX := 0; // don't go over +end; + +procedure TransformCharToSpriteLoc(x, y:byte); +begin + spriteX := (x * 8) + 24; + spriteY := (y * 8) + 50; + + spriteX += lookup3Dx[x] * curWait; + spriteY += lookup3Dy[y] * curWait; + + if (bigSprite) then begin + spriteX -= 24; + spriteY -= 21; + end else begin + spriteX -= 12; + spriteY -= 9; + end; +end; + +/* + Updates and prints text on screen +*/ +procedure UpdateText(); +var j : byte; +begin + if (curWait) then begin + if (onPause) then begin + sp:=sp+1; + UpdateTextColor(); + end else if (tp[0] < @cpause) then begin + if (curWait > (@betweencharpause / 2)) then bigSprite := true else bigSprite := false; + TransformCharToSpriteLoc(textX, textY); + SpritePos(spriteX, spriteY, 0); + sprite_color[0] := flightColFade[curWait]; + if (bigSprite) then + begin + togglebit(sprite_stretch_x, 0, 1); + togglebit(sprite_stretch_y, 0, 1); + end else begin + togglebit(sprite_stretch_x, 0, 0); + togglebit(sprite_stretch_y, 0, 0); + end; + end; + dec(curWait); + return(); + end; + + // Moveto + if (tp[0]=@cmoveto) then begin + textX:=tp[1]; + textY:=tp[2]; + moveto(tp[1], tp[2], hi(screen_col_loc)); + sp:=screenmemory; + moveto(tp[1], tp[2], hi(screen_char_loc)); + tp:=tp+3; + onPause:=false; + + return(); + end; + + + // Pause + if (tp[0]=@cpause) then begin + curWait:=tp[1]; + tp:=tp+2; + onPause:=true; + return(); + end; + + // Stop - jump to next IRQ + if (tp[0]=@cstop) then begin + // jump to next part here + currentPartDone := true; + return(); + end; + + // Render text + j:=tp[0]; + // Subtract 64 + if (j>64) then j:=j-64; + screenmemory[0]:=j; + + UpdateTextColor(); + + if (j <> KEY_SPACE) then + begin + PlaySound(sid_channel1, + 10, // Volume + Random()/128 + 5, // Hi byte frequency + 0*16+0, // Attack voice 1 + 15*16 + 3, // Sustain = 16*15 + release=6 + 1 +sid_noise, // Waveform + sid_noise); // waveform + PlaySound(sid_channel2, + 13, // Volume + 6, // Hi byte frequency + 0*16+0, // Attack voice 1 + 4*16 + 3, // Sustain = 16*15 + release=6 + 1 + sid_tri, // Waveform + sid_tri); // waveform + end; + + // Increase tex,color and screen pointers + tp:=tp+1; + sp:=sp+1; + screenmemory:=screenmemory+1; + curWait:=@betweencharpause; + textX:=textX+1; + + // print next char on sprite + if (j <> charOnSprite0) then PrintCharToSprite(j, @charSetCopyLoc, @spriteLoc); + +// PrintDebug(0, 24, textX); +// PrintDebug(3, 24, textY); + +end; + +/** + * Write 2x2 text on screen (vic bank 1) + * + * input: + * tp : pointer - text + * + */ +procedure WriteMainText(); // TODO write in parts to fit in frame +begin + sp := #screen_char_loc2; + while (tp[0] <> @cpage) do + begin + if (tp[0] = @cmoveto) then + begin + x := tp[1] * 2; + y := tp[2] * 3 - 1; + sp := AddressTable(#mainPartAddressTable, x, y); + tp += 3; + end + else + begin + j := tp[0]; + if (j = KEY_SPACE) then j := 0; + if (j > 64) then j := j - 64; + + k := j * 4; // k contains character start + + sp[0] := k; + sp[1] := k+1; + sp[40] := k+2; + sp[41] := k+3; + + tp += 1; + sp += 2; + end; + end; + tp += 1; +end; + + +/** + * Write 1x1 text in bottom of main screen + * input: + * namesPtr : pointer - text + */ + +procedure WriteMainName(); +begin + sp := AddressTable(#mainPartAddressTable, 8, 21); + while (namesPtr[0] <> @cpause) do + begin + j := namesPtr[0]; + if (j = KEY_SPACE) then j := 0; + if (j > 64) then j := j - 64; + + sp[0] := j; + + namesPtr += 1; + x += 1; + sp += 1; + end; + namesPtr += 1; +end; + +/** + * Write scroll text at offset + */ +procedure WriteScrollText() inline; +begin + tempPtr1 := #scrollText + scrollTextOffset; + memcpyunroll(tempPtr1,0,^$47c0,40); +end; + +/** + * Subtract 64 from the ASCII text + */ +procedure PreProcessScrollText(); +var temps : integer; +begin + tempPtr1 := #scrollText; + while (tempPtr1[0] <> 0) do + begin + j := tempPtr1[0]; + if (j > 64) then j -= 64; + tempPtr1[0] := j; + tempPtr1 += 1; + end; +end; + + + +/** + * Copies a rectangle of one bitmap + color data to another, assumes width of both to be 320/160 pixels / 40 chars + * + * input: + * naamatDataPtr : pointer - bitmap data + * naamatColorPtr : pointer - color data + */ +procedure CopyNaamatBitmapData(fromX, fromY, toX, toY, width, height : byte, colordatasize : integer); +begin + // copy bitmap data + tempPtr1 := naamatDataPtr; + tempPtr2 := @mainpart_bitmapArea; + + tempPtr1 += tab320[fromY]; // 40 * 8 bytes on a single row of characters + tempPtr2 += tab320[toY]; + tempPtr1 += fromX * 8; + tempPtr2 += toX * 8; + + j := width * 8; // never call this with width >= 32 !! + for i := 0 to height do + begin + memcpy(tempPtr1, 0, tempPtr2, j); + tempPtr1 += 320; + tempPtr2 += 320; + end; + + // copy color data #1 + tempPtr1 := naamatColorPtr + 2; // skip bg & fg colors and go directly to color data + tempPtr2 := #screen_char_loc2; + + tempPtr1 += fromY * 40 + fromX; + tempPtr2 += toY * 40 + toX; + + for i := 0 to height do + begin + memcpyfast(tempPtr1, 0, tempPtr2, width); + tempPtr1 += 40; + tempPtr2 += 40; + end; + + // copy color data #2 + tempPtr1 := naamatColorPtr + 2 + colordatasize; // skip bg & fg colors and go directly to second color data + tempPtr2 := #screen_col_loc; + + tempPtr1 += fromY * 40 + fromX; + tempPtr2 += toY * 40 + toX; + + for i := 0 to height do + begin + memcpyfast(tempPtr1, 0, tempPtr2, width); + tempPtr1 += 40; + tempPtr2 += 40; + end; +end; + +/** + * Fill rectangle in bitmap mode with black + */ +procedure BlankNaamatBitmapData(fromX2, fromY2, toX2, toY2, width2, height2 : byte); +begin + // bitmap data + tempPtr2 := @mainpart_bitmapArea; + tempPtr2 += tab320[toY]; + tempPtr2 += toX2 * 8; + + j := width2 * 8; // never call this with width >= 32 !! + for i := 0 to height2 do + begin + fill(tempPtr2, 0, j); + tempPtr2 += 320; + end; + + // color data #1 + tempPtr2 := #screen_char_loc2; + tempPtr2 += toY2 * 40 + toX2; + + for i := 0 to height2 do + begin + fillfast(tempPtr2, 0, width2); + tempPtr2 += 40; + end; + + // color data #2 + tempPtr2 := #screen_col_loc; + tempPtr2 += toY2 * 40 + toX2; + + for i := 0 to height2 do + begin + fillfast(tempPtr2, 0, width2); + tempPtr2 += 40; + end; +end; + +//=========================================================================================================== +// Sprite initializers +//=========================================================================================================== + +procedure UpdateSpriteBouncePositions(); // TODO get rid of this method +begin + SpritePos(spriteBounceXCurrent + 0, spriteBounceStartY, 0); + SpritePos(spriteBounceXCurrent + @spriteBounceSpriteWidth, spriteBounceStartY, 1); + SpritePos(spriteBounceXCurrent + @spriteBounceSpriteWidth * 2, spriteBounceStartY, 2); + SpritePos(spriteBounceXCurrent + @spriteBounceSpriteWidth * 3, spriteBounceStartY, 3); + SpritePos(spriteBounceXCurrent + @spriteBounceSpriteWidth * 4, spriteBounceStartY, 4); + SpritePos(spriteBounceXCurrent + @spriteBounceSpriteWidth * 5, spriteBounceStartY, 5); + SpritePos(spriteBounceXCurrent + @spriteBounceSpriteWidth * 6, spriteBounceStartY, 6); + SpritePos(spriteBounceXCurrent + @spriteBounceSpriteWidth * 7, spriteBounceStartY, 7); +end; + +procedure UpdateSpriteXLSBPositions(posx:byte); +begin + poke(SPRITE_POS, 0, posx); + poke(SPRITE_POS, 2, posx + 24); + poke(SPRITE_POS, 4, posx + 48); + poke(SPRITE_POS, 6, posx + 72); + poke(SPRITE_POS, 8, posx + 96); + poke(SPRITE_POS, 10, posx + 120); + poke(SPRITE_POS, 12, posx + 144); + poke(SPRITE_POS, 14, posx + 168); +end; + +procedure UpdateSpriteYPositions(posy:byte); +begin + poke(SPRITE_POS, 1, posy); + poke(SPRITE_POS, 3, posy); + poke(SPRITE_POS, 5, posy); + poke(SPRITE_POS, 7, posy); + poke(SPRITE_POS, 9, posy); + poke(SPRITE_POS, 11, posy); + poke(SPRITE_POS, 13, posy); + poke(SPRITE_POS, 15, posy); +end; + +procedure InitSpriteWriter(); +begin + sprite_multicolor:=$00; + sprite_color[0]:=$00; + sprite_stretch_x:=$ff; + sprite_stretch_y:=$ff; + togglebit(sprite_bitmask,0,1); + SetSpriteLoc(0, @spriteLoc/64, @spriteBank); +end; + +procedure InitLogoBounceSprites(); +begin + sprite_multicolor:=$00; + sprite_color[0]:=$01; + sprite_color[1]:=$01; + sprite_color[2]:=$01; + sprite_color[3]:=$01; + sprite_color[4]:=$01; + sprite_color[5]:=$01; + sprite_color[6]:=$01; + sprite_color[7]:=$01; + sprite_stretch_x:=$0; + sprite_stretch_y:=$0; + sprite_bitmask := $ff; + //sprite_multicolor_reg1:=$0c; + //sprite_multicolor_reg2:=$01; + //SetSpriteLoc(0, @spriteLocCEquals/64, @spriteBank); + SetSpriteLoc(0, (@spriteLocBounce0)/64, @spriteBank); + SetSpriteLoc(1, (@spriteLocBounce0)/64 + 1, @spriteBank); + SetSpriteLoc(2, (@spriteLocBounce0)/64 + 2, @spriteBank); + SetSpriteLoc(3, (@spriteLocBounce0)/64 + 3, @spriteBank); + SetSpriteLoc(4, (@spriteLocBounce0)/64 + 4, @spriteBank); + SetSpriteLoc(5, (@spriteLocBounce0)/64 + 5, @spriteBank); + SetSpriteLoc(6, (@spriteLocBounce0)/64 + 6, @spriteBank); + SetSpriteLoc(7, (@spriteLocBounce0)/64 + 7, @spriteBank); +end; + +procedure InitLogoBounceSprites1(); +begin + sprite_multicolor:=$00; + sprite_color[0]:=$01; + sprite_color[1]:=$01; + sprite_color[2]:=$01; + sprite_color[3]:=$01; + sprite_color[4]:=$01; + sprite_color[5]:=$01; + sprite_color[6]:=$01; + sprite_color[7]:=$01; + sprite_stretch_x:=$0; + sprite_stretch_y:=$0; + sprite_bitmask := $ff; + //sprite_multicolor_reg1:=$00; + //sprite_multicolor_reg2:=$00; + if (flagOrCequals) then SetSpriteLoc(0, @spriteLocCEquals/64 + $4000, 1) + else SetSpriteLoc(0, (@spriteLocBounce + $4000)/64, 1); + SetSpriteLoc(1, (@spriteLocBounce + $4000)/64 + 1, 1); + SetSpriteLoc(2, (@spriteLocBounce + $4000)/64 + 2, 1); + SetSpriteLoc(3, (@spriteLocBounce + $4000)/64 + 3, 1); + SetSpriteLoc(4, (@spriteLocBounce + $4000)/64 + 4, 1); + SetSpriteLoc(5, (@spriteLocBounce + $4000)/64 + 5, 1); + SetSpriteLoc(6, (@spriteLocBounce + $4000)/64 + 6, 1); + SetSpriteLoc(7, (@spriteLocBounce + $4000)/64 + 7, 1); +end; + +procedure InitVoteNumberSprites1(); +begin + sprite_multicolor:=$00; + sprite_stretch_x:=$7f; + sprite_stretch_y:=0; + sprite_bitmask:=$7f; + SetSpriteLoc(0, numberSprite0loc, 1); + SetSpriteLoc(1, numberSprite1loc, 1); + SetSpriteLoc(2, numberSprite2loc, 1); + SetSpriteLoc(3, numberSprite0loc, 1); + SetSpriteLoc(4, numberSprite1loc, 1); + SetSpriteLoc(5, numberSprite2loc, 1); + SpritePos(110 + numberSpriteFloatX[numberSprite0FloatOfs], 188 + numberSpriteFloatY[numberSprite0FloatOfs], 0); + SpritePos(160 + numberSpriteFloatX[numberSprite1FloatOfs], 188 + numberSpriteFloatY[numberSprite1FloatOfs], 1); + SpritePos(210 + numberSpriteFloatX[numberSprite2FloatOfs], 188 + numberSpriteFloatY[numberSprite2FloatOfs], 2); + SpritePos(110 + numberSpriteFloatX[numberSprite3FloatOfs], 188 + numberSpriteFloatY[numberSprite3FloatOfs], 3); + SpritePos(160 + numberSpriteFloatX[numberSprite4FloatOfs], 188 + numberSpriteFloatY[numberSprite4FloatOfs], 4); + SpritePos(210 + numberSpriteFloatX[numberSprite5FloatOfs], 188 + numberSpriteFloatY[numberSprite5FloatOfs], 5); +end; + +procedure ChangeFlagToCEquals(); +begin + if (flagOrCequals) then SetSpriteLoc(0, @spriteLocBounce0/64, @spriteBank) + else SetSpriteLoc(0, @spriteLocCEquals0/64, @spriteBank); + flagOrCequals := not(flagOrCequals); +end; + +procedure ChangeFlagToCEquals1(); +begin + if (flagOrCequals) then SetSpriteLoc(0, @spriteLocBounce/64, 1) + else SetSpriteLoc(0, @spriteLocCEquals/64, 1); + flagOrCequals := not(flagOrCequals); +end; + +//=========================================================================================================== +// Raster interrupts +//=========================================================================================================== + +procedure UpdateMainPart(); + +interrupt RasterTextPlasma(); +begin + startirq(@useKernal); + //screen_bg_col := red; + UpdateTextPlasma(); + //screen_bg_col := bgColBefore; + GoToPurpleBarRasterStart(); + closeirq(); +end; + +interrupt RasterText(); +begin + startIRQ(@useKernal); + if (currentTime > 50) then UpdateText(); + closeIRQ(); + GoToMainRaster(); +end; + +interrupt RasterPurpleBarStart(); +begin + StartIRQ(@useKernal); + nop(14); + screen_bg_col := purple; + screen_fg_col := purple; + GoToPurpleBarRasterEnd(); + CloseIRQ(); +end; + +interrupt RasterPurpleBarStartWithSprites(); +begin + StartIRQ(@useKernal); + poke(^$39, 0, lo(spriteWobblePtr)); + poke(^$3a, 0, hi(spriteWobblePtr)); + nop(13); + screen_bg_col := purple; + screen_fg_col := purple; + asm(" + ldy spriteWobbleOfs + ldx #21 +sprLoop lda ($39),y + sta $d000 + adc #24 + sta $d002 + adc #24 + sta $d004 + adc #24 + sta $d006 + adc #24 + sta $d008 + adc #24 + sta $d00a + adc #24 + sta $d00c + adc #24 + sta $d00e + iny + dex + bne sprLoop + "); + GoToPurpleBarRasterEnd(); + CloseIRQ(); +end; + +interrupt RasterPurpleBarEnd(); +begin + StartIRQ(@useKernal); + nop(13); + screen_bg_col := bgColBefore; + screen_fg_col := fgColBefore; + if (currentPart >= @partMain) then + begin + if (mainState = @mainPicture or mainState = @mainFadeToText) then + begin + GoToMainPartCandidateTextRaster(); + setmulticolormode(); + setbitmapmode(); + setcharsetlocation(@mainpart_bitmapArea); + InitVoteNumberSprites1(); + end + else + begin + settextmode(); + setregularcolormode(); + setcharsetlocation(@mainPartBigFontLoc); + GoToMainPartScrollerRaster(); + end; + UpdateMainPart(); + end + else + GoToMainRaster(); + CloseIRQ(); +end; + +interrupt RasterMainPartCandidateTexts(); +begin + StartIRQ(@useKernal); + setregularcolormode(); + settextmode(); + setcharsetlocation(@mainPartSmallFontLoc); + GoToMainPartScrollerRaster(); + CloseIRQ(); +end; + +interrupt RasterMainPartScroller(); +begin + StartIRQ(@useKernal); + scrollx(scrollCurrent); + setcharsetlocation(@mainPartSmallFontLoc); + GoToMainRaster(); + CloseIRQ(); +end; + +//=========================================================================================================== +// Demo part handlers +//=========================================================================================================== + +procedure InitMainPart(); + +procedure InitPart(part : byte); +begin + if (part = @partWriter) then + begin + tp:=#text; + InitSpriteWriter(); + numLinesPtr := #numLines; + end; + if (part = @partOpenBar) then + begin + bgColBefore := screen_bg_col; + fgColBefore := screen_fg_col; + InitSID(SIDFILE_1_INIT); + end; + if (part = @partSpriteBounce) then InitLogoBounceSprites(); + if (part = @partLogoBarWobble) then + begin + spriteWobblePtr := #spriteWobble; + spriteWobbleOfs := 245; + end; + if (part = @partBounceBarUp) then + begin + purpleBounceOfs := 0; + spriteBounceOfs := 0; + end; + if (part = @partMain) then + begin + screen_bg_col := 0; + screen_fg_col := 0; + bgColBefore := 0; + fgColBefore := 0; + + spriteBounceOfs := 0; + purpleBarStartRasterLine := 60 - 17; + purpleBarEndRasterLine := 60 + 17; + + spriteWobblePtr := #spriteWobbleEasy; + spriteBounceStartY := 60 - @spriteBarCenterOffset; + + InitLogoBounceSprites1(); + UpdateSpriteYPositions(spriteBounceStartY); + UpdateSpriteXLSBPositions(spriteWobble[0]); + + clearscreen(0, screen_col_loc); + + setmulticolormode(); + setbitmapmode(); + + setcharsetlocation(@mainpart_bitmapArea); + setbank(vic_bank1); + + tp := #mainText; + + naamatDataPtr := naamatAddresses[0]; + naamatColorPtr := naamatAddresses[1]; + namesPtr := #naamatNames; + numbersPtr := #naamatNumbers; + + currentNaama := 0; + mainState := @mainPicture; + mainTime := 0; + + scrollTextLength := length(scrollText); + + numLinesPtr := #numLines2; + + InitMainPart(); + end; +end; + +procedure InitMainPart(); +var currentNaamaX, currentNaamaY, currentNaamaWidth, currentNaamaHeight : byte; + plasmaHeight : byte; + +begin + // Always reset + pictureFade := 0; + textFade := 0; + numbersFade := 0; + nameFade := 0; + + if (mainState = @mainShowText) then + begin + //tempPtr1 := #screen_char_loc2 + 840; + Fill(^$4740, 0, 80); + //tempPtr1 := #screen_col_loc + 800; + FillFast(^$DB20, 0, 80); + + WriteMainText(); + if (tp[0] = @cstop) then tp := #mainText; // back to first page when done + + //tempPtr2 := #screen_col_loc + 960; // keep color for scroll text + fillfast(^$DBC0, $a, 40); + end; + + if (mainState = @mainPicture) then + begin + setmulticolormode(); + setbitmapmode(); + + //tempPtr1 := AddressTable(#colorAddressTable, 0, 21); + FillFast(^$4748, 0, 120); + + //tempPtr2 := #screen_col_loc + 960; // keep color for scroll text + fillfast(^$DBC0, $a, 40); + + // set current picture + currentNaamaX := naamatCoordinates[currentNaama * 4]; + currentNaamaY := naamatCoordinates[currentNaama * 4 + 1]; + currentNaamaWidth := naamatCoordinates[currentNaama * 4 + 2]; + currentNaamaHeight := naamatCoordinates[currentNaama * 4 + 3]; + + // todo write these in main loop instead of raster interrupt + PrintCharToSprite(numbersPtr[0], @mainPartSmallFontLoc, @numberSpriteCopies); + PrintCharToSprite(numbersPtr[1], @mainPartSmallFontLoc, @numberSpriteCopies + 64); + PrintCharToSprite(numbersPtr[2], @mainPartSmallFontLoc, @numberSpriteCopies + 128); + numbersPtr += 3; + if (numbersPtr[0] = @cstop) then numbersPtr := #naamatNumbers; + + // print the name + WriteMainName(); + if (namesPtr[1] = @cstop) then namesPtr := #naamatNames; + + plasmaHeight := 2; + end; +end; + +procedure UpdateMainPart(); +begin + if (mainState = @mainShowText) then + begin + textPlStartX := 0; + i := lo(textFade); + j := fastPlasmaSweep[i]; + textPlStartY := 4 + j; + textPlEndX := 40; + textPlEndY := textPlStartY + plasmaHeight; + UpdateTextPlasma(); + inc(textFade); + if (mod(textFade, 10) = 0) then inc(plasmaHeight); + if (plasmaHeight > 9) then plasmaHeight := 9; + end; + if (mainState = @mainFadeToPicture and textFade < 210) then + begin + i := lo(textFade); + j := fastPlasmaSweep[i]; + textPlStartY := 4 + textFade / 10; + if (textPlStartY > 21) then textPlStartY := 21; + textPlEndY := textPlStartY + plasmaHeight; + if (textPlEndY > 22) then textPlEndY := 22; + if (textPlStartY > textPlEndY) then textPlStartY := textPlEndY; + if (mainTime < 180) then UpdateTextPlasma(); + + tempPtr1 := #screen_col_loc + textFade * 4 + 100; + memcpyfast(#textFadeReverse, 0, tempPtr1, 20); + + tempPtr1 := #screen_char_loc2 + textFade * 4 + 96; + fillfast(tempPtr1, 0, 4); // clear character memory + + inc(textFade); + end; + if (mainState = @mainPicture) then + begin + // copy picture one row at a time + if (pictureFade < currentNaamaHeight) then + begin + CopyNaamatBitmapData(currentNaamaX, currentNaamaY + pictureFade, 13, 4 + pictureFade, currentNaamaWidth, 1, 1000); + inc(pictureFade); + end; + + // fade in the sprite colors + if (mainTime > 100) then + begin + if (numbersFade < @textFadeLumiLast) then + begin + j := textFadeReverse[numbersFade]; + sprite_color[0]:=j; + sprite_color[1]:=j; + sprite_color[2]:=j; + inc(numbersFade); + end else begin + sprite_color[0]:=1; + sprite_color[1]:=1; + sprite_color[2]:=1; + sprite_color[3]:=$0b; + sprite_color[4]:=$0b; + sprite_color[5]:=$0b; + end + end + else + fillfast(#sprite_color, 0, 6); + + if (nameFade < 85) then + begin + tempPtr1 := #screen_col_loc + 800 + nameFade; // starts at row 20 + memcpyfast(#textFadeLumi, 0, tempPtr1, 20); + inc(nameFade); + end; + + if (mainTime > 350 and mainTime < 425) then + begin + i := mainTime - 350; + tempPtr1 := #screen_col_loc + 800 + i; // starts at row 20 + memcpyfast(#textFadeLumi, 0, tempPtr1, 20); + end; + end; + if (mainState = @mainFadeToText) then + begin + // blank out picture one row at a time + if (pictureFade < currentNaamaHeight) then + begin + BlankNaamatBitmapData(currentNaamaX, currentNaamaY + pictureFade, 13, 4 + pictureFade, currentNaamaWidth, 1); + inc(pictureFade); + end; + + // fade out the sprite colors + if (numbersFade < @textFadeLumiLast) then + begin + j := textFadeLumi[numbersFade]; + sprite_color[0]:=j; + sprite_color[1]:=j; + sprite_color[2]:=j; + sprite_color[3]:=$0; + sprite_color[4]:=$0; + sprite_color[5]:=$0; + inc(numbersFade); + end else + begin + sprite_color[0]:=0; + sprite_color[1]:=0; + sprite_color[2]:=0; + sprite_color[3]:=$0; + sprite_color[4]:=$0; + sprite_color[5]:=$0; + end; + + if (mainTime > 50 and nameFade < 150) then + begin + tempPtr1 := #screen_col_loc + 840 + nameFade; // starts at row 21 + memcpyfast(#textFadeReverse, 0, tempPtr1, 20); + inc(nameFade); + end; + end; + + if (currentTime > 512 and mod(mainTime, 2) = 0)then + begin + if (scrollCurrent = 0) then + begin + inc(scrollTextOffset); + if (scrollTextOffset > scrollTextLength - 39) then scrollTextOffset := 0; + WriteScrollText(); + scrollCurrent := 7; + end; + dec(scrollCurrent); + end; + +end; + +procedure GoToNextMainPart(); +begin + mainTime := 0; + mainState := mod(mainState + 1, 4); + + if (mainState = @mainPicture) then begin + currentNaama := mod(currentNaama + 1, 12); + naamatDataPtr := naamatAddresses[currentNaama * 2]; + naamatColorPtr := naamatAddresses[currentNaama * 2 + 1]; + end; + InitMainPart(); +end; + +procedure UpdateCurrentRaster(); +var lastSpriteWoblOfs : byte; + wobblePause : boolean = false; + wobblePauseTimer : integer = 0; + cEqualsChangeFlag : boolean = false; +begin + if (part >= @partOpenBar) then Call(SIDFILE_1_PLAY); + + if (part = @partWriter) then RasterIRQ(RasterText(),0, @useKernal); + + if (part = @partOpenBar) then + begin + purpleBarStartRasterLine := purpleBarCenter - purpleBarBounce[purpleBounceOfs]; + purpleBarEndRasterLine := purpleBarCenter + purpleBarBounce[purpleBounceOfs] + 1; + RasterIRQ(RasterTextPlasma(), 0, @useKernal); + inc(purpleBounceOfs); + if (purpleBounceOfs >= @purpleBarBounceSize) then currentPartDone := true; + end; + + if (part = @partSpriteBounce) then + begin + spriteBounceXCurrent := spriteBounceStartX + spriteBounce[spriteBounceOfs]; + UpdateSpriteBouncePositions(); + RasterIRQ(RasterTextPlasma(), 0, @useKernal); + if (spriteBounceOfs < @spriteBounceSize - 1) then spriteBounceOfs += 1; + if (currentTime > 240) then currentPartDone := true; + end; + + if (part = @partFadeOutOpeningScreen) then + begin + if (fadeStateCurrent = @fadeStateBorder) then + begin + bgColBefore := textFadeLumi[fadeOfsCurrent]; + screen_bg_col := bgColBefore; + RasterIRQ(RasterTextPlasma(), 0, @useKernal); + if (fadeOfsCurrent >= @textFadeLumiLast) then + begin + fadeStateCurrent := @fadeStateText; + fadeOfsCurrent := 0; + end; + end; + if (fadeStateCurrent = @fadeStateText) then + begin + fadeTemp := textFadeLumi[fadeOfsCurrent]; + Fill(screen_col_loc, fadeTemp, 255); + FillFast(screen_col_loc + 256, fadeTemp, 127); + Fill(screen_col_loc + 512, fadeTemp, 255); + Fill(screen_col_loc + 768, fadeTemp, 232); + GoToPurpleBarRasterStart(); + if (fadeOfsCurrent >= @textFadeLumiLast) then + begin + fadeStateCurrent := @fadeStateAll; + fadeOfsCurrent := 0; + end; + end; + if (fadeStateCurrent = @fadeStateAll) then + begin + fgColBefore := 0; + Fill(screen_char_loc, KEY_SPACE, 255); + FillFast(screen_char_loc + 256, KEY_SPACE, 127); + GoToPurpleBarRasterStart(); + currentPartDone := true; + screen_fg_col := 0; + end; + fadeOfsCurrent += 1; + end; + + if (part = @partLogoBarWobble) then + begin + fadeTemp := textLumi2[textBlinkOfs]; + FillFast(screen_col_loc + 406 , fadeTemp, 30); + FillFast(screen_col_loc + 486 , fadeTemp, 30); + inc(textBlinkOfs); + if (textBlinkOfs > 16) then textBlinkOfs := 0; + if (currentTime > 150) then + begin + if (lastSpriteWoblOfs = 127 and spriteWobbleOfs = 128) then ChangeFlagToCEquals(); + lastSpriteWoblOfs := spriteWobbleOfs; + if (currentTime > 645) then currentPartDone := true; + inc(spriteWobbleOfs); + end; + GoToPurpleBarRasterStart(); + end; + + if (part = @partBounceBarUp) then + begin + purpleBarCenter := purpleBarBounce2[purpleBounceOfs]; + purpleBarStartRasterLine := purpleBarCenter - @purpleBarCenterOffset; + purpleBarEndRasterLine := purpleBarCenter + @purpleBarCenterOffset; + spriteBounceStartY := purpleBarCenter - @spriteBarCenterOffset; + UpdateSpriteYPositions(spriteBounceStartY); + + if (currentTime = 5) then FillFast(^$05e0, KEY_SPACE, 40); + if (currentTime = 8) then FillFast(^$0590, KEY_SPACE, 40); + + inc(purpleBounceOfs); + if (purpleBounceOfs > 127) then currentPartDone := true; + GoToPurpleBarRasterStart(); + end; + + if (part = @partMain) then + begin + setbank(vic_bank1); + + if (not(wobblePause)) then + begin + inc(spriteWobbleOfs); + if (lastSpriteWoblOfs = 127 and spriteWobbleOfs = 128) then + begin + if (cEqualsChangeFlag) then ChangeFlagToCEquals1(); + cEqualsChangeFlag := not(cEqualsChangeFlag); + end; + end; + lastSpriteWoblOfs := spriteWobbleOfs; + + inc(wobblePauseTimer); + if (wobblePauseTimer > 512) then + begin + wobblePause := not(wobblePause); + wobblePauseTimer := 0; + spriteWobbleOfs := 245; + end; + + InitLogoBounceSprites1(); + UpdateSpriteYPositions(spriteBounceStartY); + UpdateSpriteXLSBPositions(spriteWobble[0]); + + inc(numberSprite0FloatOfs); + inc(numberSprite1FloatOfs); + inc(numberSprite2FloatOfs); + inc(numberSprite3FloatOfs); + inc(numberSprite4FloatOfs); + inc(numberSprite5FloatOfs); + + inc(mainTime); + + if (mainState = @mainFadeToPicture and mainTime > 200) then GoToNextMainPart(); + if (mainState = @mainFadeToText and mainTime > 100) then GoToNextMainPart(); + if (mainState = @mainPicture and mainTime > 650) then GoToNextMainPart(); + if (mainState = @mainShowText and mainTime > 400) then GoToNextMainPart(); + + GoToPurpleBarRasterStart(); + end; +end; + +procedure GoToNextPart(); +begin + inc(currentPart); + currentPartDone := false; + currentTime := 0; + InitPart(currentPart); +// poke(^$3fff, 0, currentPart); // debug +end; + +interrupt MainRaster(); +begin + StartIRQ(@useKernal); +// bgColBefore := screen_bg_col; +// screen_bg_col := white; + if (currentPartDone) then GoToNextPart(); + scrollx(0); + UpdateCurrentRaster(); + inc(currentTime); +// screen_bg_col := bgColBefore; + CloseIRQ(); +end; + +begin + bgColBefore := screen_bg_col; + fgColBefore := screen_fg_col; + + DisableCIAInterrupts(); + CopyCharsetRomToRam($c0); + + setmemoryconfig(1,@useKernal,0); + + // Some heavy part init here to spare work later + + ClearScreen(0, screen_char_loc2); + + ClearScreen(0, ^@mainpart_bitmapArea); + ClearScreen(0, ^@mainpart_bitmapArea + 1000); + ClearScreen(0, ^@mainpart_bitmapArea + 2000); + ClearScreen(0, ^@mainpart_bitmapArea + 3000); + ClearScreen(0, ^@mainpart_bitmapArea + 4000); + ClearScreen(0, ^@mainpart_bitmapArea + 5000); + ClearScreen(0, ^@mainpart_bitmapArea + 6000); + ClearScreen(0, ^@mainpart_bitmapArea + 7000); + + CreateAddressTable(#mainPartAddressTable, $4400, 40, 25); + CreateAddressTable(#colorAddressTable, $d800, 40, 25); + + Fill(^$0568, KEY_SPACE, 200); + + for i := 0 to 256 do fastPlasma[i] := textPlasmaLumi[textPlasmaX[i]]; + + PreProcessScrollText(); + + // Start demo + + GoToMainRaster(); + EnableRasterIRQ(); + enableirq(); + + Loop(); +end. \ No newline at end of file diff --git a/resources/charsets/alternate_reality_x.bin b/resources/charsets/alternate_reality_x.bin new file mode 100644 index 0000000000000000000000000000000000000000..4252da079c3118b2301b4cf1523327a6afcb79ba GIT binary patch literal 1904 zcmbuAORD8K42BJ!8nhL|oeH#d!^gwN{e;hX2EuGmi}!31c3i3%=T}u zVvv7v3=yAzSWbK>#HK4ZVWsq#R#1_1fgdw0WxwUC)=A-!KYFYlgwjg*Pe_y9D;lnt zHJ>oZE#(DT-ByzjW0rul5;Iwj8JYSwu*fC)>f@~AU28q(c2?}|^Uu00!fG+Y(V-&z zO#5z+-&Ud)oTDbNyMyX#jlsUu9XiS4y!`%61-?EHaVx$-%aNIi0_qd@O)-8G_y$pN zSZF$iZ}iZiWZN}iXDXRs?C&q1-47WmCNPQo^xy72^hFYauQ#|XQRqlQPD;5u2I?e> zr>!WKV_kG4L`VOk`>3l-^Z~U}dU{{U!dn965mAr$IaQNC*eKR)zk|Kr{|nZs2|qcH z#&6WAQX-N{w3!MmK2C{Tm z+ZPi9;H6@n{OUxsz$q+3+m6f%LTgtpXQzq$aCE<;$R2?oKe5y!rkqk zGAw?DheFX6-U)~GRzws=ko9>@R7XIC8Y#Xnu_o0K2g$nWb`-y!z(OpUOY#2f*cG|Y@PrL;I>|(!fu~h06N|H34PIKI9Tj#pmtk=}&?0zqrb!|*p8rAhx z)pypIx+b3ok!QKFAoXi7JX@1z!Z*V&S*Z_Fj=ChTZ*1qHyeP{;^}TIDQLb#?pUBNo z?&A{~KTrKXME?)b|9b7?-|sC63aoeC`HFLkcR(;vE73HhNqJVvt z`A~%T5B=criTQ{6#{5s~8}Ks*kVX4qo1bU;9~akx-?zSV?(aZ}eHq`rUtd?miIzHBy%74ZRu{D6<|9~=9ls*KjCUsYMu z+z~FSwJpD(>Qk{;ELM~s4u^iVTuNO1ZfCu`(o=Le&w{<4x3@q%AF*;y2=pqrr&PeZacw&{Oz{ih+OI0Tdl~`L?E4N zUl+UG$|jr5X4xBynpWj?l?_0a^_wZg50EE&yha2aVTueZ!_3=zD0v6${k|X0g zD4xHE@RdrE;%z1~f$?Q;3jx42-o5w>m@ve$^oLTvC$6{txpn%a>ZEIp??C;r(;gk!+a%=zmln^RaVnw=;1* zj_)4@Os9FNnyzb_Fw>zv?xByAIbX#^)F0nJ=L>Iid|wcQxm_NfC zN#;{7{~z1&AM|X#h<)&wAOAU~l=(dR7ekm2LWJ~m@3~J{tmg&zsAZ5!1-K_*FUfQJToBIXL>N8Z$?oX04e$3Km<2p# literal 0 HcmV?d00001 diff --git a/resources/charsets/broadway_xy.bin b/resources/charsets/broadway_xy.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c29a9a402f26d735760ebbdbc7cc207477c6fdf GIT binary patch literal 2048 zcmah~y>8n`5FUnvm%s@mlPiu!7>S1%xGrJIf+khwFk2ykLLgpDh0DeY6k2pW)$xKk(Tff=%{6 zv*Y|CC-;*M__+Uw-$90sqe+rEVT~o&lLYaL5LuC+DHSwpms^N-BCHqXN{KSwzz(qM z;hL!38rTFJi`mu%muO#+L%d7=ILdZZLOkZ-5w`M!I1Rf{Y*L`~cE!}}0_^68(q ze~bO=_aC$Fs@1XnPVQUkFZrc~d!~Q=DA)6{)bGsy<5gLHf7btypUSFgy+Q8^fSH^- zU!=C|Hj54Ve<9B0;P2pmF^DdYv;WGD_3WDvqNFSA2HPT4V4g z<*1j+*Y(xA>$a%{=U$`lJ-ds4TKsF_9w%v0TgwdJY1lWpiUGM=-932lnJ9|l_yA8r zMcC)6)02-?zUjMmaMtiq^l#xeULj}wEz7dX6!I4_96O73V+#}B4pi4HV#KB>TF(^W z#y6J{8SDI)I}-)LtcvW9|N6MS4LgsIzgo`qh5rGNHJ%C9_=`YP_5C`lz;6w{wQUm+ z#+&fOnq}FL;W>`uJc^QKK^d84ah$*Y^EJ5lmCSQD02GxpPy!Z&-e=MLwyawE`!?{N&72mfsE%Llct&jjiO3)*F^^09$5V+FrFrzMdOa zKIl_~ARq)YWLXSMy3ULB+~^YKE%RdGOKo=iF*gR^gR(wbc~4d?!7vlFV}yLy5L_N^^>eGD4uio-ALoj^hhsYwD*6Q`oWyqK3#}L}*$?T|(3n5sE$4 zk74hHEipA!U3KblDp?jp4ci2<$2mjIi#F@X66|TJjf3TSj$?P!3nxLWF~W;6xtHLc z7sPs*rfnm--xFS}H>G<2+o@i{4S2u&ZiD(0#1Q3qSym#Bm0jx2aRVoDE}i>PmE52Z zS{w8Jp5j9HLICD=gR_MYwXLkp4(VUl*RrUD@O^#^3h`1RE=MgTrEEGSs-h?uuN@Sz zMvP(oL!LHTc;d~owLn&V|K{=eh3g||NUu`woyXWQ6J9wO_5C1TZA)bbm7xov~FVDl{ zAlZjcG(`A+71|Dk#?e3gHP@7bYz(Lx}{Z6#uWYgW~7^pgjPRZ||XXE;= zt1qLq)9qm`P(j(TC)_kY+aN5N;GfxVTU}qT^?88du5q99r|QYh=raZ40mPTg1rDKW zNDVE&@#hd@@K4Go@!rWE;Gws#uXSbm5Cky>5O5Rm{OsQV%yPzk5cBhl7sAsHyT)AX b=c@~K0f!46UDHT)DKl`-g4@E;>@MkVZ-T;J literal 0 HcmV?d00001 diff --git a/resources/charsets/geometrisch_2_x.bin b/resources/charsets/geometrisch_2_x.bin new file mode 100644 index 0000000000000000000000000000000000000000..df93c94ddb252969775f2a2f554f1ffe0a90465b GIT binary patch literal 2048 zcmZ8iy^0$#7*vpnn+2u3&ShG`RtL+;h08p|J&3^uKgc~qN*C6#aMgm^lgUE zC^MfV`z{}AY3G~yq|wjbY29_sdasoC(RN+-9uI!jdcbJFd2bC!rEC;Z_-KcrV9}GN zpw^3=8P<=rK0+_GY-{Km)H1SX`|Jw6SAKl^6{ojXNh`IlWtl3@7gGo$l0%xN4iVEN znD5h+hMRvZrt2*I(=V1}JxBP&|F9Ezjwd`C@J=i5Jl4ltu6`4X5tMR&tb|uA>^hBI zh1d%}hLB?OgH1K`froV+oEr`a=TKw)ulnoGK4-rt@?J=-4G{uHyoM(^AK(aVAcH@g z7pH`O5#l%naJ?vtsEy#I7JfMv^<^WqCP%**56^u(0Z2nliBj9mX0t{0HwOCcV!I|r zzhDn`u^?U-yk2ibk8H_rDlWR5jd3pL2)9^H#9MjFeQN;cJje!B@;}Ua91yNUiCmTi zY-+%fL`*r)bBqHbr8L~~wURh98d3Vpy<|*N-}6_mfhJ9y|E5bk`+dtlJUpycXvouo zU;?Esmzw8Hz@kH{&6zU*LUd(T@6R=sHSXdMPGP&uUsx`Qb8}J|4?T0ljZ0~sec%Z= zXTm%y=kVYcf&(-WoO2<9%sCh#g*Raw3l=?T3TnN`nPL4<>kaf$%eDs2K!RF^a%^9G zp?BF0kKaxI_$29^ceSjX5#}@6+5yQ?_x+48x);oMoYHvnkHyS$pnv+sl7bBRiT@dT z@*GciG~j*8&O5A+IaU2?+C)&w{Rt8-vv8ids}MWk2Wz!yez2*LKJc(^hV#fF;T&qL z|0(_1hZp5`M9vAB621co7;y=n`#cmj}ynv$Fk$K&yU>fa3XhwI@)jQ+|V?Da}~D)@9dh#uLJKUQ3Hyovns z%U=QB)%ukC)&S0Vlnp98F7+qOdK?h0Ly7tg1M{9U;7G#Yi|smNMg+c<@s_WZ#QZ+$ z1#7gzo=B9hAOBfuP{5q}qL*gnb}j$@{(e5AA)ZA0n|U+yOkU9MKUiNQ9dtUU4;R+f zAN2cyM+*;6JDoriMcrPn7er)?$@9Dlk~kg?Eh#k!!)Qb#T-SqTfSE_h7Am?Zp1g{oZUcc{U!K_WXPQpPVyB ziyt=lgBD*(nIt*xPlfOMGNMCXWX0P_{t3bHI)y)9;y5(5U_fifaglIDT9;+1E%_pp zxA>JAB157?cakhmDFjeq^_Tcbmv46Vk8~SDO~pmSb3ZjvIYHtiV6W#U>39 z@xjT-($dn(%F1J!UR_NllS7UlwzNoMYwOkP_wN^jAdcgls;VjqHE8o!WR&FOVKx5> z#WbcQ^6HFSvLD`^ot;-)OCeH1FbDxZ$J<6#LbA_yBjg8D%b~~lRn_S2wf@J)2h#Tu zUtRx5H2iC~;l~yT1pFlFqm8@Z)SF#RUIMi4Cg9KEb)6rB(hEke?c4b4{K3y&7mX?d zX2bIw0t*>xL{!|rzq*>H6z%TpTwGjm4pI)tTAO7V`Y*-nuIo^Gu+Q~%U0f3sXm^_z z3iTO9e4&T_=*j&f!`1f?AIgsqOVnSY{*FttXi!+AJ%P0tfxo7|oo)}Ul!46J0E)tU z&A&0x5N&|gYc>cyn8ZWuxAv>^_PxKgc0nj6y1kyWjq|wu`wy&KFdu}L!?-^z#Q>cR zec9PwyLao}`LE-_=jXv`yNrIK17>ics| zGE&JM2AR(FgCAMWS^aHoObozkfBx9b^|6*6eE*Q2R7x-bg7raT#Qy^m WagK3yNkh*-IK+;+qC3}Dg#Q^xCU7nQ literal 0 HcmV?d00001 diff --git a/resources/charsets/jumping_jack_x.bin b/resources/charsets/jumping_jack_x.bin new file mode 100644 index 0000000000000000000000000000000000000000..6e45a0ba24582d7a88835a41f4a27ada5c244e48 GIT binary patch literal 1024 zcmdT>v2nvN41`Zbnq1VT@JTDUbODQ_WCeFoA%&Y{k`&q^m28i|CMOoKm1eWUWKd?>WG;bQv1 zxkmYiNJpk3Zz}Q%=I34cwA~rePgSiyYu~k<$Nageni>Cx$9sVXJl9~HT-GCHPK$q5 zKertoYeOybjG5$p>ldA*GJlH`?SJD(%-)d9+x-#y*Pd%Oog^pfG@Vnrk!#W>H9h2iP$-Fp3;!k`7&oPdw literal 0 HcmV?d00001 diff --git a/resources/images/piraaattilogo.bitmap.flf b/resources/images/piraaattilogo.bitmap.flf new file mode 100644 index 0000000000000000000000000000000000000000..af00f369fda583553129f949dc2ddf3bc9332b64 GIT binary patch literal 12271 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 literal 0 HcmV?d00001 diff --git a/resources/images/piraattinaamat-2-39x24.flf b/resources/images/piraattinaamat-2-39x24.flf new file mode 100644 index 0000000000000000000000000000000000000000..0fe820f85a31d83a78eb1993e318007810e29747 GIT binary patch literal 11503 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 literal 0 HcmV?d00001 diff --git a/resources/images/piraattinaamat-2-39x24_color.bin b/resources/images/piraattinaamat-2-39x24_color.bin new file mode 100644 index 0000000..e090061 --- /dev/null +++ b/resources/images/piraattinaamat-2-39x24_color.bin @@ -0,0 +1 @@ +!!!!!!!!!//ϛ!!!!{+!!!)z!!!!!q*ߛ*!!!q!!q+!!!!!!qq+**!!)!+*{!!!!qq**)!!!!z!!qq**ϛ!!!z)!qϹ++!!)z**Ϲ*Ѳ))ʼϛђrk˼ϛ˛!q!}˛!!!!/))))Ѣ*q!zzzz˺z))*zzѼ*+ѯzqzѼ**)*zzߏ***Ѽ'))ߒ)*߂*,)*ߒzzq')*ߒ)*)z*!))))zz*!!))r))z*k!!)),)ka \ No newline at end of file diff --git a/resources/images/piraattinaamat-2-39x24_data.bin b/resources/images/piraattinaamat-2-39x24_data.bin new file mode 100644 index 0000000000000000000000000000000000000000..856ee94d742ed1994af8ab82e6024bbb9441ad54 GIT binary patch literal 7488 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 JeE%DO{|jDuOm6@H literal 0 HcmV?d00001 diff --git a/resources/images/piraattinaamat-2_color.bin b/resources/images/piraattinaamat-2_color.bin new file mode 100644 index 0000000000000000000000000000000000000000..0ff3f9d354f75070c766a7d3f359d86d7e2157ca GIT binary patch literal 2002 zcma)4v2G(b5G5%fTykl!JD$!5EL7>ZF>v2>pFnrs#)ujr>cnP^a{$9?XjMki1O@^a zNtaWxaCN1=L1`8+uDCa(<+L{vc4s+n-n^M1WBaCQ9FI~>B#4>$W}HVbE)acsZbhk^{jxsHIWX@+Z@h2%jvb3^RL5W@55hy@m0 z_X}RE8HOGKe4Y;b+4xsGI&h_NJeGE8RdBmLwW*)CY-qyh+eBFbtVD+V^Y#veY(H%2 ze16fznK)D`{*yn%S+^Ko*|G3-leo6zGk=><9{)p zude*C`y(cYK4zh7N7MzfOX)4BfqS^$Zd$)sefE#<{q##huOY+@H5|erWqH6o`umig zyG3Mv_~xgvOCWr~0hsO<2V}73qyOzsmwfche?0Tk(=Bk$`&{=Ely4RX08!UJ4Bk&Y z_;&GMe8={DHuanF?@w>u9DeU(WT)#VMrzmI`v|ew!n=-U0t(o9N}VT%aJTc6(y|26 zDL%4~U=O9P0D+_F!3tqYaF4j$bBZr~1WN8UQL)?PfLu}zq6PQih(n=m3iC`zRZ}Fw zSKQ`^TO}8}&_97>J%^%nTlk`L=dQ=ZV2HW2bR9NM!9em{=w9mP8}W);ZWk*T%1v6j zkXGFh2lCdnN4{0pE?oGU?|K4m?5HP1=`KQT!95MXZlmu}mkO_`VW`Ns5BTuQj619k z*K9hSrruv*3}K$!_H#=EA(nobR(DhKF6aTI8aQT9>LPCaQN(fUc3t;{uYOU3}B0}h^b%}5z zpi*h0wH1m43T-TWS#U%KsI82!bq$|essMo`M{=HVqDDTM5NJdhCBQHd*3gjf=2b;K zG2oQ63b>jZTML1fHPq4&K!_2E(yytFwUXV(}T0~{cfwLMe z6y*VOOLgm?K!NoTPGBQ7$CK682v&2gv;-eILzcocpv^L5O{C$KrR|VenFj_6ScREZ z`IaCebtUjCo3gkLsDNXF(PS%5KpfDR$l!vGF3>BEqE#lOP>#r4SXLk}cL^jacc!KyjF>qsrxc^ABt7Gpt~6$(k2s_O zmBrJQs$`X~FbI*P^iiKiRaH@=L=HCO6h4xTT7?hlNS;zBCx}|$NJZ&`1Yz?qT0E8~ mAeUndP>|CK9|Ik(C*ce|VAu#XrIn-|Xb8;5)K+$W^zj|&t5n$l literal 0 HcmV?d00001 diff --git a/resources/images/piraattinaamat-2_data.bin b/resources/images/piraattinaamat-2_data.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec2be32bdf1db3fa394c5974051ec9ce1b4fee64 GIT binary patch literal 8000 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 literal 0 HcmV?d00001 diff --git a/resources/images/toni.flf b/resources/images/toni.flf new file mode 100644 index 0000000000000000000000000000000000000000..0fda107c7b0efaa36c6deaa03b6039c6fd829c46 GIT binary patch literal 12271 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 d*1hzl}E;}?Bz#yc=p#ZrlATIy_ literal 0 HcmV?d00001 diff --git a/resources/sprites/piraattilogo-hires.bin b/resources/sprites/piraattilogo-hires.bin new file mode 100644 index 0000000000000000000000000000000000000000..d8a4a44e2333c7aab8789c13fda2e1dc11f509fd GIT binary patch literal 512 zcmZwEv1)`s5C-5`gxDOr?G?s-4JAi>mXH_7VWTAAN{V}hJkCf8n>@tG7Pc$b7!WtR zUc^8gzG7#Xf0_*}hzmwQDZJ!!@>CtW?4!xPHr1gS51oph;h00>*4(m-1Qy^8wh~P% zhE{yHyli>8D3^&F)-7k7nDtxi_r<_4n3$RZj6*L9Y2q|;V`5Xt@sy2GHpazC6!#Y+ z|K$PhRw=jz()4~}$!h*T~DvN1$m^a4V8jg$_7 zQ)j=xaoD6#t5Su~W@a?mb$?aH7=QfwJv;mF+S4CDr_+n`F92|eZ|~^9`|1JQ!8N{4 z;5XdD4XkRNuOHGSJ`T(dAnDqc7<_d+9DExw1JrdL$HL3(smO)jsDy*bWH#%0KA*3) zThYPueP8%j9M_F-(;x{aNurdnF~+V{Rh8|7eyzpxT5i_=gt5EruT)u9qIbrqkN%4^ z%L>sIm2f~MJfsrF8G6r>D*dx2y=~hr!UTy&qtV%!9qVaD#bcK4t(6e>6?ViNP8jk$sWBx^#65FeuP_nL z1Yl<_g^!ibGJO}PwTx3)eybeUc=x!_kE>XIZXDx@SiLA5@9TI2tp{(8WxP3-g?Q%f v-syC-TsVW->$99YJxLrlwPUq#Y>eZp@AUh_r6_NLQ~4zR426Fi|1;)0R#v#% literal 0 HcmV?d00001