From 1deae4565b51c0287994814cd33a33b80c83dcbe Mon Sep 17 00:00:00 2001 From: alpine9000 Date: Mon, 25 Apr 2016 13:40:02 +1000 Subject: [PATCH] big refactor ready for pathway fadeout --- 028.bs/Makefile | 22 +- 028.bs/assets/assets.png | Bin 10168 -> 11254 bytes ...m_section.pal => bottom_section_flags.pal} | 0 028.bs/assets/bottom_section_playarea.pal | 16 + 028.bs/assets/tileFadeFrom.pal | 2 + 028.bs/assets/tileFadeTo.pal | 2 + 028.bs/background.s | 72 ++++ 028.bs/background.tmx | 2 +- 028.bs/blit.s | 13 +- 028.bs/constants.i | 1 + 028.bs/fade.c | 57 ++- 028.bs/foreground.tmx | 2 +- 028.bs/game1.s | 394 +++++++++++++----- 028.bs/image.s | 22 +- 028.bs/init.s | 4 +- 028.bs/player.s | 2 +- 028.bs/splash.s | 1 + tools/fade/Makefile | 6 + tools/fade/fade.c | 179 ++++++++ tools/fade/fade.h | 25 ++ tools/fade/file.c | 39 ++ tools/fade/file.h | 7 + tools/imagecon/palette.c | 7 + 23 files changed, 724 insertions(+), 151 deletions(-) rename 028.bs/assets/{bottom_section.pal => bottom_section_flags.pal} (100%) create mode 100644 028.bs/assets/bottom_section_playarea.pal create mode 100644 028.bs/assets/tileFadeFrom.pal create mode 100644 028.bs/assets/tileFadeTo.pal create mode 100644 028.bs/background.s create mode 100644 tools/fade/Makefile create mode 100644 tools/fade/fade.c create mode 100644 tools/fade/fade.h create mode 100644 tools/fade/file.c create mode 100644 tools/fade/file.h diff --git a/028.bs/Makefile b/028.bs/Makefile index f91a6c5..897d196 100644 --- a/028.bs/Makefile +++ b/028.bs/Makefile @@ -11,7 +11,7 @@ BASE_ADDRESS=4000 NUM_COLORS=8 BOOTBLOCK_ASM=alpine_bootblock.s -OBJS=out/init.o out/utils.o out/image.o out/blit.o out/joystick.o out/player.o out/items.o out/blitmtext.o out/blittext.o out/music.o out/P6112-Play.o out/splash.o +OBJS=out/init.o out/utils.o out/image.o out/blit.o out/joystick.o out/player.o out/items.o out/blitmtext.o out/blittext.o out/music.o out/P6112-Play.o out/splash.o out/background.o IMAGES=foreground.png \ background.png \ @@ -67,6 +67,9 @@ out/foreground.bin: assets/assets.png sed -i '' "1s/.*/ dc.w COLOR00,\$$$(BACKGROUND_COLOR)/" out/foreground-copper-list.s sed -i '' "1s/.*/ dc.w \$$$(BACKGROUND_COLOR)/" out/foreground-palette-table.s sed -i '' "1s/.*/ dc.w \$$$(BACKGROUND_GREY_COLOR)/" out/foreground-grey-table.s + sed -i '' "1s/.*/ dc.w COLOR00,\$$$(BACKGROUND_GREY_COLOR)/" out/foreground-grey-copper.s + sed -i '' "2s/.*/ dc.w COLOR01,\$$888/" out/foreground-grey-copper.s + sed -i '' "3s/.*/ dc.w COLOR02,\$$bbb/" out/foreground-grey-copper.s out/background.bin: assets/assets.png $(IMAGECON) --use-palette=assets/background.pal --input $< $(IMAGECON_ARGS) --colors $(NUM_COLORS) --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-grey-palette --output-palette --output-png --output-copperlist --output out/background --palette-offset 8 @@ -115,16 +118,17 @@ out/font%.bin: assets/font%.png out/splash.bin: assets/splash.png $(IMAGECON) --input $< $(IMAGECON_ARGS) --output-bitplanes --output-grey-palette-asm --output-palette-asm --output-palette --output out/splash --colors=32 --full-color-palette-file --output-png --output-copperlist +out/playarea_fade.s: assets/bottom_section_playarea.pal ../tools/fade/out/fade + ../tools/fade/out/fade --from-grey --to=assets/bottom_section_playarea.pal --output=playarea > out/playarea_fade.s +out/flags_fade.s: assets/bottom_section_flags.pal ../tools/fade/out/fade + ../tools/fade/out/fade --from-grey --to=assets/bottom_section_flags.pal --output=flags > out/flags_fade.s -out/fade.s: assets/bottom_section.pal out/fade - ./out/fade assets/bottom_section.pal bottom > out/fade.s +out/panelFade.s: assets/panel.pal ../tools/fade/out/fade + ../tools/fade/out/fade --from-grey --to=assets/panel.pal --output=panel > out/panelFade.s -out/panelFade.s: assets/panel.pal out/fade - ./out/fade assets/panel.pal panel > out/panelFade.s - -out/fade: fade.c - gcc fade.c -o out/fade +out/tileFade.s: assets/tileFadeFrom.pal assets/tileFadeTo.pal ../tools/fade/out/fade + ../tools/fade/out/fade --colors=2 --from=assets/tileFadeFrom.pal --to=assets/tileFadeTo.pal --output=tileFade > out/tileFade.s out/foreground-map.s: foreground.tmx ../tools/mapgen/out/mapgen --depth=3 --input=foreground.tmx @@ -139,5 +143,5 @@ out/background-map.s: background.tmx rm background-indexes.s out/blit.o: constants.i macros.i -out/main.o: out/background-map.s out/foreground-map.s $(IMAGEDATA) constants.i macros.i Makefile link.script.x assets/palette.pal out/fade.s out/panelFade.s +out/main.o: out/background-map.s out/foreground-map.s $(IMAGEDATA) constants.i macros.i Makefile link.script.x assets/palette.pal out/playarea_fade.s out/flags_fade.s out/panelFade.s out/tileFade.s out/init.o: constants.i Makefile \ No newline at end of file diff --git a/028.bs/assets/assets.png b/028.bs/assets/assets.png index 7e6129c7787d9116689494480ed6b1e29db9c555..d81164c328ad93d99de4ecfab747c0d5e1cb3844 100644 GIT binary patch delta 10258 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

pZe@KC*$nq`-A1lQh6^nkhoM%DqWy$h#Eo#<` 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 delta 9163 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 diff --git a/028.bs/assets/bottom_section.pal b/028.bs/assets/bottom_section_flags.pal similarity index 100% rename from 028.bs/assets/bottom_section.pal rename to 028.bs/assets/bottom_section_flags.pal diff --git a/028.bs/assets/bottom_section_playarea.pal b/028.bs/assets/bottom_section_playarea.pal new file mode 100644 index 0000000..5dd7181 --- /dev/null +++ b/028.bs/assets/bottom_section_playarea.pal @@ -0,0 +1,16 @@ +000 153 238 255 +253 174 017 255 +233 216 100 255 +210 063 006 255 +211 116 039 255 +253 174 017 255 +233 216 100 255 +016 132 233 255 +000 000 014 255 +029 192 255 255 +121 235 255 255 +071 174 192 255 +213 213 213 255 +210 000 039 255 +154 154 154 255 +000 000 000 000 \ No newline at end of file diff --git a/028.bs/assets/tileFadeFrom.pal b/028.bs/assets/tileFadeFrom.pal new file mode 100644 index 0000000..c83884b --- /dev/null +++ b/028.bs/assets/tileFadeFrom.pal @@ -0,0 +1,2 @@ +082 000 015 255 +133 000 026 255 \ No newline at end of file diff --git a/028.bs/assets/tileFadeTo.pal b/028.bs/assets/tileFadeTo.pal new file mode 100644 index 0000000..159bbcb --- /dev/null +++ b/028.bs/assets/tileFadeTo.pal @@ -0,0 +1,2 @@ +253 174 017 255 +233 216 100 255 \ No newline at end of file diff --git a/028.bs/background.s b/028.bs/background.s new file mode 100644 index 0000000..f734d1f --- /dev/null +++ b/028.bs/background.s @@ -0,0 +1,72 @@ + include "includes.i" + + xdef InitialiseBackground + xdef RenderNextBackgroundFrame + xdef backgroundScrollX + xdef backgroundOnscreen + + +InitialiseBackground: + move.l #0,backgroundScrollX + move.l backgroundOffscreen,a0 + move.l #0,d0 + move.l #256,d1 + move.l #0,d2 + jsr BlitFillColor + jsr WaitVerticalBlank + jsr SwitchBuffers + move.l backgroundOffscreen,a0 + move.l #0,d0 + move.l #256,d1 + move.l #0,d2 + jsr BlitFillColor + rts + +RenderBackgroundTile: + ;; a2 - map + move.l backgroundScrollX,d0 + lsr.w #BACKGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels + lsr.w #3,d0 ; bytes to scroll + move.l backgroundOffscreen,a0 + add.l d0,a0 + lea backgroundTilemap,a1 + add.l #BITPLANE_WIDTH_BYTES-2,a0 ; dest + add.w (a2),a1 ; source tile + move.l backgroundScrollX,d2 + lsr.b #BACKGROUND_SCROLL_SHIFT_CONVERT,d2 ; convert to pixels + andi.w #$f,d2 ; find the shift component + jsr BlitTile + rts + +RenderNextBackgroundFrame: + lea backgroundMap,a2 + move.l backgroundScrollX,d0 + lsr.l #BACKGROUND_SCROLL_TILE_INDEX_CONVERT,d0 + and.b #$fe,d0 + add.l d0,a2 + cmp.w #$FFFF,20(a2) + bne .skip + move.l #0,backgroundScrollX +.skip: + bsr RenderBackgroundTile + rts + + +backgroundScrollX: + dc.l 0 +backgroundTilemap: + incbin "out/background.bin" +backgroundMap: + include "out/background-map.s" + dc.w $FFFF +backgroundOnscreen: + dc.l backgroundBitplanes1 +backgroundOffscreen: + dc.l backgroundBitplanes1 + + section .bss +backgroundBitplanes1: + ds.b IMAGESIZE*2 + + + \ No newline at end of file diff --git a/028.bs/background.tmx b/028.bs/background.tmx index 1c96d09..82a87e7 100644 --- a/028.bs/background.tmx +++ b/028.bs/background.tmx @@ -5,7 +5,7 @@ - eJztmkkOwjAMRcsBOEQR04YltAxXYLgA3AHuv8BdoCKrTW3HHdT+xVtUStPkRRnsJk+SZDcrWbLnOnJhuYIVlV0TG2Jb8x6v70nPr4a2adpg6RNcwEUTmcO3jlTHiTgTF2F9byr3MX6bt/nnTzIecAEXsf0qSKmehbCuK5W7EXfi0eHc9hgPuJi2C+t82dN7hx77VKCd96HxyCLWDrgYrwvPtcMTyf7tvQbCBVxw+tzXYvHen+ECLrRU5QumClzABScmX/DPfAQu4QIuukQaR6WKnEgIr3rgAi6kxOTBpXGUJicSWo/azq3ABVx4MpT89xCAC7gYEogv4ULjIjWcwdr4L98WfH8NxZdwARe8nOUMpv0PY3HdxzjABVx4oD0nxsRBVfFVaByk903hAi5iseYiNPeMLXeSm8aBu/C4Bw0X03LxBT9lUNQ= + eJztmssNwjAMQLsANxYA8VsAym8FPgvADrD/AfeAhKKS2olLi/oO74CUhuRZTWI326Ioxh/Mgt/f2CrbVcyFhbAUVsr+bsK9YWyWMaTMCRe4aKJ06GMn7IWDcFQ+8xCeTmN++9PEAxe4yJ1XxUSYKtuehLNwEa5O//+reOBi2C5S35e1sOlwThXW9z4WjxIXuKhx4bl2eKLZv73XQFzgIqTLfS0X7/0ZF7iwUlcvGCq4wEVITr3gk1EP5oILXPwT2jzKUhOJ4dUPLnChJacOrs2jLDWR2HrUdm0FF7jwpC/17z6AC1z0CfJLXFhcpJzB2vgu3xbh/hrLL3GBi7BdyhnM+h3GOw9qKw64wIUH1nNiTh5Ul1/F4qC9b4oLXOSSWouw3DNOuZPcFIfQhcc9aFwMy8ULfVgzRw== diff --git a/028.bs/blit.s b/028.bs/blit.s index 59a0328..82dd42c 100644 --- a/028.bs/blit.s +++ b/028.bs/blit.s @@ -143,18 +143,7 @@ BlueFill: jsr BlitFillColor jsr WaitVerticalBlank jsr SwitchBuffers - move.l backgroundOffscreen,a0 - move.l #0,d0 - move.l #256,d1 - move.l #0,d2 - jsr BlitFillColor - jsr WaitVerticalBlank - jsr SwitchBuffers - move.l backgroundOffscreen,a0 - move.l #0,d0 - move.l #256,d1 - move.l #0,d2 - jsr BlitFillColor + jsr InitialiseBackground movem.l (sp)+,d0-a6 rts diff --git a/028.bs/constants.i b/028.bs/constants.i index 3ab1770..0cebba8 100644 --- a/028.bs/constants.i +++ b/028.bs/constants.i @@ -7,6 +7,7 @@ PLAYER_INITIAL_Y equ $e4-32 PLAYER_BOTTOM_Y equ $e4+16 PLAYER_TOP_Y equ (PLAYER_BOTTOM_Y-(7*16)) PLAYER_JUMP_PIXELS equ 8 +PLAYER_JUMP_SHIFT_CONVERT equ 3 ; x = x / PLAYER_JUMP_PIXELS PLAYER_CHECK_MISS_PIXELS equ 6 PLAYER_PAUSE_PIXELS equ 12 PLAYER_MOVE_PIXELS equ 2 diff --git a/028.bs/fade.c b/028.bs/fade.c index fc6a351..1d31312 100644 --- a/028.bs/fade.c +++ b/028.bs/fade.c @@ -1,18 +1,63 @@ #include +#include typedef struct { unsigned char r, g, b, a; } rgba_t; -#define NUM_COLORS 16 +typedef struct { + int verbose; + int numColors; + char** argv; +} config_t; -rgba_t original[NUM_COLORS]; -rgba_t gray[NUM_COLORS]; -rgba_t progress[NUM_COLORS]; +config_t config = { + .numColors = 16 +}; + +#define MAX_COLORS 32 + +rgba_t original[MAX_COLORS]; +rgba_t gray[MAX_COLORS]; +rgba_t progress[MAX_COLORS]; int main(int argc, char** argv) { + config.argv = argv; + + while (1) { + static struct option long_options[] = { + {"verbose", no_argument, &config.verbose, 1}, + {"colors", required_argument, 0, 'c'}, + {0, 0, 0, 0} + }; + + int option_index = 0; + + c = getopt_long (argc, argv, "n:", long_options, &option_index); + + if (c == -1) + break; + + switch (c) { + case 0: + break; + case 'c': + if (sscanf(optarg, "%d", &config.numColors) != 1) { + abort_("invalid width"); + } + break; + case '?': + usage(); + break; + default: + usage(); + break; + } + } + + FILE* fp = fopen(argv[1], "r"); rgba_t* p = original; @@ -24,7 +69,7 @@ main(int argc, char** argv) rgba_t* g = gray; p = original; - for (int i = 0; i < NUM_COLORS; i++) { + for (int i = 0; i < config.numColors; i++) { g->r = g->g = g->b = (p->r + p->g + p->b) / 3; // printf("%d %d %d\n", g->r, g->g, g->b); g++; @@ -33,7 +78,7 @@ main(int argc, char** argv) for (int s = 1; s <= 16; s++) { printf(".step%d\n", s); - for (int i = 0; i < NUM_COLORS; i++) { + for (int i = 0; i < config.numColors; i++) { int dr = ((((float)original[i].r)-(float)gray[i].r)/16.0)*s; int dg = ((((float)original[i].g)-(float)gray[i].g)/16.0)*s; int db = ((((float)original[i].b)-(float)gray[i].b)/16.0)*s; diff --git a/028.bs/foreground.tmx b/028.bs/foreground.tmx index 8766d69..2a9885a 100644 --- a/028.bs/foreground.tmx +++ b/028.bs/foreground.tmx @@ -8,7 +8,7 @@ - eJy7y8DAwI4D3x2Vo7ucHRAzAbEYFnpUjv5yWjjkiZELB+JeMvSNyuGWoyQ+U4E4mwx9o3L488d5ID6JhYbJwfJAIJrcbmicDJa0NRzkiImzemgc7MYjNxmL3GBKd0NFjlpxXcmAmncGW7obKnKsjLjbYKNy9JcDAOkzS7w= + eJxjZ2BgsGTEjtlH5eguZwekmYBYDAs9Kkd/OS0c8sTIhQNxJRn6RuVwy1ESn6zA/MXNOHjS1nCQA8XLbiDWBYarMSMqDZP7CNVzkgFVbjk0TgZL2hoOcsTE2WNofMkz4pb7TsU0MpLlqBXXdxlQ885gS3dDRW4wtvlGshwAqUxa2g== diff --git a/028.bs/game1.s b/028.bs/game1.s index 92ad5c3..72425ee 100644 --- a/028.bs/game1.s +++ b/028.bs/game1.s @@ -4,22 +4,26 @@ xdef IncrementScore xdef copperList + xdef mpanelCopperList xdef copperListBpl1Ptr - xdef copperListBpl1Ptr2 xdef copperListBpl2Ptr - xdef copperListBpl2Ptr2 - xdef backgroundOnscreen - xdef backgroundOffscreen + + xdef copperListBpl1Ptr_MP + xdef copperListBpl1Ptr2_MP + xdef copperListBpl2Ptr_MP + xdef copperListBpl2Ptr2_MP + xdef foregroundOnscreen xdef foregroundOffscreen xdef foregroundScrollX - xdef backgroundScrollX xdef map xdef itemsMap xdef mapSize xdef moving xdef foregroundScrollPixels +TIMING_TEST equ 0 +TIMING_TEST_MAIN_LOOP equ 1 byteMap: dc.l Entry @@ -37,11 +41,9 @@ Entry: jsr StartMusic - move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6) - jsr ShowSplash - jsr InstallGreyPalette + ;; jsr InstallGreyPalette ;; d0 - fg bitplane pointer offset ;; d1 - bg bitplane pointer offset @@ -49,16 +51,22 @@ Entry: move.l #1,d1 jsr SwitchBuffers - - move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6) move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_MASTER),DMACON(a6) lea panelCopperListBpl1Ptr,a0 lea panel,a1 jsr PokePanelBitplanePointers + + lea panelCopperListBpl1Ptr_MP,a0 + lea panel,a1 + jsr PokePanelBitplanePointers + + lea mpanelCopperListBpl1Ptr,a0 lea mpanel,a1 - jsr PokePanelBitplanePointers + jsr PokePanelBitplanePointers + + bsr ShowMessagePanel jsr Init ; enable the playfield jsr InstallSpriteColorPalette @@ -69,10 +77,10 @@ Entry: Reset: move.w #0,moving - move.l #fade,fadePtr + move.l #playareaFade,playareaFadePtr move.l #panelFade,panelFadePtr + move.l #flagsFade,flagsFadePtr move.l #0,foregroundScrollX - move.l #0,backgroundScrollX move.l #-1,frameCount bsr InitAnimPattern jsr ResetBigBangPattern @@ -83,8 +91,8 @@ Reset: bsr RenderScore MainLoop: - ;; MOVE.W #$0024,BPLCON2(a6) - + MOVE.W #$0024,BPLCON2(a6) + move.l #0,frameCount SetupBoardLoop: add.l #1,frameCount move.l frameCount,d6 @@ -101,6 +109,8 @@ SetupBoardLoop: .gotoGameLoop: add.l #1,d6 jsr WaitVerticalBlank + cmp.l #50,d6 + ble .gotoGameLoop jsr ProcessJoystick ;; cmp.l #FOREGROUND_PLAYAREA_WIDTH_WORDS+50,d6 ;; bne .gotoGameLoop @@ -108,12 +118,18 @@ SetupBoardLoop: beq .gotoGameLoop move.w #0,moving move.l #FOREGROUND_SCROLL_PIXELS,foregroundScrollPixels - move.w #$ffff,mpanelWaitLinePtr + ;; move.w #$ffff,mpanelWaitLinePtr + ;; bsr ClearMPanel + bsr HideMessagePanel FadeInLoop: add.l #1,frameCount move.l frameCount,d6 + + move.l #0,d0 +.loop: jsr WaitVerticalBlank + dbra d0,.loop bsr InstallNextGreyPalette cmp.l #FOREGROUND_PLAYAREA_WIDTH_WORDS+25,d6 bne .c1 @@ -127,7 +143,17 @@ GameLoop: add.l #1,frameCount move.l frameCount,d6 move.l #FOREGROUND_SCROLL_PIXELS,foregroundScrollPixels - jsr WaitVerticalBlank + jsr WaitVerticalBlank + + if TIMING_TEST=1 + if TIMING_TEST_MAIN_LOOP=1 + move.l #4000,d0 +.looooo: + dbra d0,.looooo + move.w #$0f0,COLOR00(a6) + endif + endif + bsr HoriScrollPlayfield jsr SwitchBuffers move.l foregroundScrollX,d0 @@ -142,15 +168,14 @@ GameLoop: jsr CheckPlayerMiss bsr Update bsr RenderNextForegroundFrame - bsr RenderNextBackgroundFrame + jsr RenderNextBackgroundFrame - - if 0 - move.l #002,d0 + if TIMING_TEST=1 + move.l #0,d0 .checkLoop: dbra d0,.checkLoop move.w #$f00,COLOR00(a6) - move.w #$f00,COLOR01(a6) + move.w #$f00,COLOR02(a6) endif bra GameLoop @@ -186,6 +211,20 @@ Update: .c1: .skipForegroundUpdates: rts + + +ShowMessagePanel: + lea mpanelCopperList,a0 + move.l a0,COP1LC(a6) + move.w COPJMP1(a6),d0 + rts + + +HideMessagePanel: + lea copperList,a0 + move.l a0,COP1LC(a6) + move.w COPJMP1(a6),d0 + rts HoriScrollPlayfield: ;; d0 - fg x position in pixels @@ -209,7 +248,9 @@ HoriScrollPlayfield: lsl.w #4,d5 or.w d5,d0 move.w d0,copperListScrollPtr - move.w d0,copperListScrollPtr2 + ;; move.w d0,copperListScrollPtr2 + move.w d0,copperListScrollPtr_MP + move.w d0,copperListScrollPtr2_MP rts @@ -270,18 +311,6 @@ ResetBigBangPattern: dbra d1,.loop1 rts -RenderNextBackgroundFrame: - lea backgroundMap,a2 - move.l backgroundScrollX,d0 - lsr.l #BACKGROUND_SCROLL_TILE_INDEX_CONVERT,d0 - and.b #$fe,d0 - add.l d0,a2 - cmp.w #$FFFF,20(a2) - bne .skip - move.l #0,backgroundScrollX -.skip: - bsr RenderBackgroundTile - rts RenderNextForegroundFrame: lea map,a2 @@ -425,7 +454,7 @@ ClearForegroundTile3: .s1: lea foregroundTilemap,a1 ;; add.w #21520,a1 ; source tile - add.w #$7080,a1 + add.w #$0,a1 .s2: jsr BlitTile rts @@ -458,29 +487,13 @@ ClearForegroundTile: .s1: lea foregroundTilemap,a1 ;; add.w #21520,a1 ; source tile - add.w #$7080,a1 + add.w #$0,a1 .s2: jsr BlitTile .s3: rts -RenderBackgroundTile: - ;; a2 - map - move.l backgroundScrollX,d0 - lsr.w #BACKGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels - lsr.w #3,d0 ; bytes to scroll - move.l backgroundOffscreen,a0 - add.l d0,a0 - lea backgroundTilemap,a1 - add.l #BITPLANE_WIDTH_BYTES-2,a0 ; dest - add.w (a2),a1 ; source tile - move.l backgroundScrollX,d2 - lsr.b #BACKGROUND_SCROLL_SHIFT_CONVERT,d2 ; convert to pixels - andi.w #$f,d2 ; find the shift component - jsr BlitTile - rts - Level3InterruptHandler: movem.l d0-a6,-(sp) @@ -516,7 +529,9 @@ Message: move.w #128,d0 move.w #11,d1 jsr DrawMaskedText8 - move.w #MPANEL_COPPER_WAIT,mpanelWaitLinePtr + ;; move.w #MPANEL_COPPER_WAIT,mpanelWaitLinePtr + ;; jsr EnableMPanel + bsr ShowMessagePanel rts RenderScore: @@ -612,14 +627,115 @@ copperListBpl2Ptr: dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1)) dc.w BPLCON0,(SCREEN_BIT_DEPTH*2<<12)|COLOR_ON|DBLPF - if 0 + + if TIMING_TEST=1 dc.l $fffffffe endif -playAreaCopperPalettePtr: + +playAreaCopperPalettePtr1: + include "out/foreground-copper-list.s" + include "out/background-copper-list.s" + + dc.w $84d1 + dc.w $fffe +flagsCopperPalettePtr1: include "out/foreground-copper-list.s" include "out/background-copper-list.s" + dc.w $94d1 + dc.w $fffe +playAreaCopperPalettePtr2: + include "out/foreground-copper-list.s" + include "out/background-copper-list.s" + + + dc.w $f4d1 + dc.w $fffe +flagsCopperPalettePtr2: + include "out/foreground-copper-list.s" + include "out/background-copper-list.s" + dc.w $ffdf + dc.w $fffe + dc.w $04d1 + dc.w $fffe + +playAreaCopperPalettePtr3: + include "out/foreground-copper-list.s" + include "out/background-copper-list.s" + + + dc.l $fffffffe + + +mpanelCopperList: +panelCopperListBpl1Ptr_MP: + dc.w BPL1PTL,0 + dc.w BPL1PTH,0 + dc.w BPL2PTL,0 + dc.w BPL2PTH,0 + dc.w BPL3PTL,0 + dc.w BPL3PTH,0 + dc.w BPL4PTL,0 + dc.w BPL4PTH,0 + dc.w BPLCON1,0 + dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES) + dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1)) + dc.w BPLCON0,(4<<12)|COLOR_ON ; 4 bit planes + dc.w BPL1MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES + dc.w BPL2MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES + include "out/panel-grey-copper.s" + dc.w $5bd1,$fffe + + + dc.w BPL1MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2 + dc.w BPL2MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2 + + dc.w BPLCON1 +copperListScrollPtr_MP: + dc.w 0 +copperListBpl1Ptr_MP: + ;; this is where bitplanes are assigned to playfields + ;; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0079.html + ;; 3 bitplanes per playfield, playfield1 gets bitplanes 1,3,5 + dc.w BPL1PTL,0 + dc.w BPL1PTH,0 + dc.w BPL3PTL,0 + dc.w BPL3PTH,0 + dc.w BPL5PTL,0 + dc.w BPL5PTH,0 + +copperListBpl2Ptr_MP: + ;; 3 bitplanes per playfield, playfield2 gets bitplanes 2,4,6 + dc.w BPL2PTL,0 + dc.w BPL2PTH,0 + dc.w BPL4PTL,0 + dc.w BPL4PTH,0 + dc.w BPL6PTL,0 + dc.w BPL6PTH,0 + + dc.w DDFSTRT,(RASTER_X_START/2-SCREEN_RES)-8 ; -8 for extra scrolling word + dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1)) + dc.w BPLCON0,(SCREEN_BIT_DEPTH*2<<12)|COLOR_ON|DBLPF + + +playAreaCopperPalettePtr1_MP: + include "out/foreground-grey-copper.s" + include "out/background-grey-copper.s" + + dc.w $84d1 + dc.w $fffe +flagsCopperPalettePtr1_MP: + include "out/foreground-grey-copper.s" + include "out/background-grey-copper.s" + dc.w $94d1 + dc.w $fffe + +playAreaCopperPalettePtr2_MP: + include "out/foreground-grey-copper.s" + include "out/background-grey-copper.s" + + mpanelWaitLinePtr: dc.w MPANEL_COPPER_WAIT dc.w $fffe @@ -639,7 +755,7 @@ mpanelCopperListBpl1Ptr: dc.w BPLCON0,(4<<12)|COLOR_ON ; 4 bit planes dc.w BPL1MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES dc.w BPL2MOD,SCREEN_WIDTH_BYTES*4-SCREEN_WIDTH_BYTES -mpanelCopperPalettePtr: +mpanelCopperPalettePtr_MP: include "out/mpanel-copper-list.s" dc.w $BAd1,$fffe @@ -649,9 +765,9 @@ mpanelCopperPalettePtr: dc.w BPL2MOD,BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES-2 dc.w BPLCON1 -copperListScrollPtr2: +copperListScrollPtr2_MP: dc.w 0 -copperListBpl1Ptr2: +copperListBpl1Ptr2_MP: ;; this is where bitplanes are assigned to playfields ;; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node0079.html ;; 3 bitplanes per playfield, playfield1 gets bitplanes 1,3,5 @@ -662,7 +778,7 @@ copperListBpl1Ptr2: dc.w BPL5PTL,0 dc.w BPL5PTH,0 -copperListBpl2Ptr2: +copperListBpl2Ptr2_MP: ;; 3 bitplanes per playfield, playfield2 gets bitplanes 2,4,6 dc.w BPL2PTL,0 dc.w BPL2PTH,0 @@ -675,11 +791,27 @@ copperListBpl2Ptr2: dc.w DDFSTOP,(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1)) dc.w BPLCON0,(SCREEN_BIT_DEPTH*2<<12)|COLOR_ON|DBLPF -playAreaCopperPalettePtr2: - include "out/foreground-copper-list.s" - include "out/background-copper-list.s" +playAreaCopperPalettePtr3_MP: + include "out/foreground-grey-copper.s" + include "out/background-grey-copper.s" - dc.l $fffffffe + + dc.w $f4d1 + dc.w $fffe +flagsCopperPalettePtr2_MP: + include "out/foreground-grey-copper.s" + include "out/background-grey-copper.s" + dc.w $ffdf + dc.w $fffe + dc.w $04d1 + dc.w $fffe + +playAreaCopperPalettePtr4_MP: + include "out/foreground-grey-copper.s" + include "out/background-grey-copper.s" + + + dc.l $fffffffe InstallSpriteColorPalette: jsr InstallPlayerColorPalette @@ -687,34 +819,42 @@ InstallSpriteColorPalette: rts InstallColorPalette: - lea playAreaCopperPalettePtr,a1 - lea playAreaCopperPalettePtr2,a2 + lea playAreaCopperPalettePtr1,a1 + lea playAreaCopperPalettePtr2,a2 + lea playAreaCopperPalettePtr3,a3 lea playAreaPalette,a0 add.l #2,a1 - add.l #2,a2 + add.l #2,a2 + add.l #2,a3 move.l #15,d0 .loop: move.w (a0),(a1) - move.w (a0),(a2) + move.w (a0),(a2) + move.w (a0),(a3) add.l #2,a0 add.l #4,a1 - add.l #4,a2 + add.l #4,a2 + add.l #4,a3 dbra d0,.loop rts InstallGreyPalette: - lea playAreaCopperPalettePtr,a1 - lea playAreaCopperPalettePtr2,a2 - lea greyPalette,a0 + lea playAreaCopperPalettePtr1,a1 + lea playAreaCopperPalettePtr2,a2 + lea playAreaCopperPalettePtr3,a3 + lea playareaFade,a0 add.l #2,a1 - add.l #2,a2 + add.l #2,a2 + add.l #2,a3 move.l #15,d0 .loop: move.w (a0),(a1) - move.w (a0),(a2) + move.w (a0),(a2) + move.w (a0),(a3) add.l #2,a0 add.l #4,a1 - add.l #4,a2 + add.l #4,a2 + add.l #4,a3 dbra d0,.loop InstallPanelGreyPalette: @@ -727,31 +867,48 @@ InstallPanelGreyPalette: add.l #2,a0 add.l #4,a1 dbra d0,.loop + + +InstallFlagsGreyPalette: + lea flagsCopperPalettePtr1,a1 + lea flagsCopperPalettePtr2,a2 + lea flagsFade,a0 + add.l #2,a1 + add.l #2,a2 + move.l #15,d0 +.loop: + move.w (a0),(a1) + move.w (a0),(a2) + add.l #2,a0 + add.l #4,a1 + add.l #4,a2 + dbra d0,.loop + rts InstallNextGreyPalette: - lea playAreaCopperPalettePtr,a1 - lea playAreaCopperPalettePtr2,a3 - move.l fadePtr,a0 - lea bottomFadeComplete,a2 - cmp.l a2,a0 + lea playAreaCopperPalettePtr1,a1 + lea playAreaCopperPalettePtr2,a2 + lea playAreaCopperPalettePtr3,a3 + move.l playareaFadePtr,a0 + lea playareaFadeComplete,a5 + cmp.l a5,a0 bge .done add.l #2,a1 - add.l #2,a3 + add.l #2,a2 + add.l #2,a3 move.l #15,d0 .loop: move.w (a0),(a1) - move.w (a0),(a3) + move.w (a0),(a2) + move.w (a0),(a3) add.l #2,a0 add.l #4,a1 - add.l #4,a3 + add.l #4,a2 + add.l #4,a3 dbra d0,.loop - move.l frameCount,d0 - lsr.l #1,d0 - btst.l #0,d0 - beq .done - add.l #16*2,fadePtr + add.l #16*2,playareaFadePtr .done InstallNextGreyPanelPalette: @@ -767,12 +924,29 @@ InstallNextGreyPanelPalette: add.l #2,a0 add.l #4,a1 dbra d0,.loop - move.l frameCount,d0 - lsr.l #1,d0 - btst.l #0,d0 - beq .done add.l #16*2,panelFadePtr .done + + +InstallFlagGreyPalette: + lea flagsCopperPalettePtr1,a1 + lea flagsCopperPalettePtr2,a2 + move.l flagsFadePtr,a0 + lea flagsFadeComplete,a5 + cmp.l a5,a0 + bge .done + add.l #2,a1 + add.l #2,a2 + move.l #15,d0 +.loop: + move.w (a0),(a1) + move.w (a0),(a2) + add.l #2,a0 + add.l #4,a1 + add.l #4,a2 + dbra d0,.loop + add.l #16*2,flagsFadePtr +.done rts @@ -781,14 +955,8 @@ foregroundOnscreen: dc.l foregroundBitplanes1 foregroundOffscreen: dc.l foregroundBitplanes2 -backgroundOnscreen: - dc.l backgroundBitplanes1 -backgroundOffscreen: - dc.l backgroundBitplanes1 foregroundTilemap: incbin "out/foreground.bin" -backgroundTilemap: - incbin "out/background.bin" panel: incbin "out/panel.bin" mpanel: @@ -802,15 +970,11 @@ itemsMap: mapSize: dc.l itemsMap-map -backgroundMap: - include "out/background-map.s" - dc.w $FFFF + foregroundScrollPixels: dc.l FOREGROUND_SCROLL_PIXELS foregroundScrollX: dc.l 0 -backgroundScrollX: - dc.l 0 frameCount: dc.l 0 verticalBlankCount: @@ -818,10 +982,12 @@ verticalBlankCount: moving: dc.w 0 -fadePtr: - dc.l fade +playareaFadePtr: + dc.l playareaFade panelFadePtr: dc.l panelFade +flagsFadePtr: + dc.l flagsFade bigBangIndex: ds.l FOREGROUND_PLAYAREA_HEIGHT_WORDS*FOREGROUND_PLAYAREA_WIDTH_WORDS,0 @@ -905,9 +1071,11 @@ deAnimIndexPattern: dc.l 0 dc.l $ffffffff + if 0 greyPalette: include "out/foreground-grey-table.s" - include "out/background-grey-table.s" + include "out/background-grey-table.s" + endif panelGreyPalette: include "out/panel-grey-table.s" @@ -916,21 +1084,21 @@ playAreaPalette: include "out/foreground-palette-table.s" include "out/background-palette-table.s" -fade: - include "out/fade.s" +playareaFade: + include "out/playarea_fade.s" + +flagsFade: + include "out/flags_fade.s" panelFade: include "out/panelFade.s" - + + section .bss foregroundBitplanes1: ds.b IMAGESIZE foregroundBitplanes2: ds.b IMAGESIZE - -backgroundBitplanes1: - ds.b IMAGESIZE*2 - startUserstack: ds.b $1000 ; size of stack userstack: diff --git a/028.bs/image.s b/028.bs/image.s index aec6ba7..1ae3dee 100644 --- a/028.bs/image.s +++ b/028.bs/image.s @@ -14,11 +14,17 @@ SwitchBuffers: move.l a0,foregroundOnscreen move.l a0,a1 lea copperListBpl1Ptr,a0 - bsr.s PokeBitplanePointers + bsr.s PokeBitplanePointers + + lea copperListBpl1Ptr_MP,a0 + bsr.s PokeBitplanePointers add.l #BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*(96-1),d0 - lea copperListBpl1Ptr2,a0 - bsr.s PokeBitplanePointers + ;; lea copperListBpl1Ptr2,a0 + ;; bsr.s PokeBitplanePointers + + lea copperListBpl1Ptr2_MP,a0 + bsr.s PokeBitplanePointers ;; background is not double buffered @@ -29,9 +35,15 @@ SwitchBuffers: lea copperListBpl2Ptr,a0 bsr.s PokeBitplanePointers + lea copperListBpl2Ptr_MP,a0 + bsr.s PokeBitplanePointers + add.l #BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH*(96-48+16),d0 - lea copperListBpl2Ptr2,a0 - bsr.s PokeBitplanePointers + ;; lea copperListBpl2Ptr2,a0 + ;; bsr.s PokeBitplanePointers + + lea copperListBpl2Ptr2_MP,a0 + bsr.s PokeBitplanePointers rts diff --git a/028.bs/init.s b/028.bs/init.s index d770adb..3c4505a 100644 --- a/028.bs/init.s +++ b/028.bs/init.s @@ -29,9 +29,7 @@ Init: ;; install copper list, then enable dma and selected interrupts - lea copperList,a0 - move.l a0,COP1LC(a6) - move.w COPJMP1(a6),d0 + ;; move.w #(DMAF_SPRITE|DMAF_BLITTER|DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),DMACON(a6) move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),DMACON(a6) ;; move.w #PF2PRI,BPLCON2(a6) diff --git a/028.bs/player.s b/028.bs/player.s index f667537..e27693e 100644 --- a/028.bs/player.s +++ b/028.bs/player.s @@ -143,7 +143,7 @@ UpdatePlayer: CalculateScore: move.w playerX,d0 move.w playerMaxX,d1 - lsr.w #3,d0 + lsr.w #PLAYER_JUMP_SHIFT_CONVERT,d0 cmp.w d1,d0 ble .skip move.w d0,playerMaxX diff --git a/028.bs/splash.s b/028.bs/splash.s index 11e7cca..131cca4 100644 --- a/028.bs/splash.s +++ b/028.bs/splash.s @@ -41,6 +41,7 @@ ShowSplash: include "out/splash-palette.s" move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),DMACON(a6) + move.w #(INTF_SETCLR|INTF_VERTB|INTF_INTEN),INTENA(a6) .wait: jsr WaitVerticalBlank jsr ProcessJoystick diff --git a/tools/fade/Makefile b/tools/fade/Makefile new file mode 100644 index 0000000..ca198db --- /dev/null +++ b/tools/fade/Makefile @@ -0,0 +1,6 @@ +PROGRAM=./out/fade +OBJS=out/fade.o out/file.o +LIBS= +EXTRA_CFLAGS= + +include ../../shared/tools.mk diff --git a/tools/fade/fade.c b/tools/fade/fade.c new file mode 100644 index 0000000..cafabba --- /dev/null +++ b/tools/fade/fade.c @@ -0,0 +1,179 @@ +#include +#include +#include +#include +#include +#include + +#include "fade.h" +#include "file.h" + +typedef struct { + int r, g, b, a; +} rgba_t; + + +config_t config = { + .numColors = 16 +}; + +#define MAX_COLORS 32 + +rgba_t original[MAX_COLORS]; +rgba_t from[MAX_COLORS]; +rgba_t progress[MAX_COLORS]; + +void +abort_(const char * s, ...) +{ + fprintf(stderr, "%s: ", config.argv[0]); + va_list args; + va_start(args, s); + vfprintf(stderr, s, args); + fprintf(stderr, "\n"); + va_end(args); + exit(1); +} + +void +usage() +{ + fprintf(stderr, + "%s: --output \n"\ + "options:\n"\ + " --to \n"\ + " --from-grey\n"\ + " --colors (default: 16)\n"\ + " --verbose\n\n"\ + "Exactly one 'to' and 'from' option must be specified\n", config.argv[0]); + exit(1); +} + + +int +main(int argc, char** argv) +{ + int c; + config.argv = argv; + + while (1) { + static struct option long_options[] = { + {"verbose", no_argument, &config.verbose, 1}, + {"from-grey", no_argument, &config.fromGrey, 1}, + {"from-black", no_argument, &config.fromBlack, 1}, + {"to", required_argument, 0, 't'}, + {"from", required_argument, 0, 'f'}, + {"output", required_argument, 0, 'o'}, + {"colors", required_argument, 0, 'c'}, + {0, 0, 0, 0} + }; + + int option_index = 0; + + c = getopt_long (argc, argv, "t:c:o:", long_options, &option_index); + + if (c == -1) + break; + + switch (c) { + case 0: + break; + case 't': + config.toFile = optarg; + break; + case 'f': + config.fromFile = optarg; + break; + case 'o': + config.output = optarg; + break; + case 'c': + if (sscanf(optarg, "%d", &config.numColors) != 1) { + abort_("invalid number of colors"); + } + break; + case '?': + usage(); + break; + default: + usage(); + break; + } + } + + + if (config.toFile == 0 || config.output == 0) { + usage(); + abort(); + } + + if (config.fromFile == 0 && (config.fromGrey == 0 && config.fromBlack == 0 && config.fromFile == 0)) { + usage(); + abort(); + } + + + if (config.toFile) { + FILE* fp = file_openRead(config.toFile); + rgba_t* p = original; + while (fscanf(fp, "%d %d %d %d", &p->r, &p->g, &p->b, &p->a) == 4) { + p++; + } + fclose(fp); + } + + + if (config.fromFile) { + FILE* fp = file_openRead(config.fromFile); + rgba_t* p = from; + while (fscanf(fp, "%d %d %d %d", &p->r, &p->g, &p->b, &p->a) == 4) { + p++; + } + fclose(fp); + } + + + if (config.fromGrey) { + rgba_t* g = from; + rgba_t* p = original; + + for (int i = 0; i < config.numColors; i++) { + g->r = g->g = g->b = (p->r + p->g + p->b) / 3; + g++; + p++; + } + } + + if (config.fromBlack) { + rgba_t* g = from; + for (int i = 0; i < config.numColors; i++) { + g->r = g->g = g->b = 0; + g++; + } + } + + for (int s = 0; s < 16; s++) { + printf(".step%d\n", s); + for (int i = 0; i < config.numColors; i++) { + int dr = ((((float)original[i].r)-(float)from[i].r)/16.0)*s; + int dg = ((((float)original[i].g)-(float)from[i].g)/16.0)*s; + int db = ((((float)original[i].b)-(float)from[i].b)/16.0)*s; + + #if 0 + printf("r:%d %d %d -> %d\n" + "g:%d %d %d -> %d\n" + "b:%d %d %d -> %d\n", + original[i].r,from[i].r, dr, from[i].r+dr, + original[i].g,from[i].g, dg, from[i].g+dg, + original[i].b,from[i].b, db, from[i].b+db); + #endif + + printf("\tdc.w\t$%03x\n", + ((from[i].r+dr)>>4)<<8| + ((from[i].g+dg)>>4)<<4| + ((from[i].b+db)>>4)); + } + } + + printf("%sFadeComplete:\n", config.output); +} diff --git a/tools/fade/fade.h b/tools/fade/fade.h new file mode 100644 index 0000000..f7dbc2b --- /dev/null +++ b/tools/fade/fade.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +typedef struct { + int verbose; + int numColors; + int fromGrey; + int fromBlack; + char* toFile; + char* fromFile; + char* output; + char** argv; +} config_t; + + +extern config_t config; + +extern void +abort_(const char * s, ...); diff --git a/tools/fade/file.c b/tools/fade/file.c new file mode 100644 index 0000000..e1d2624 --- /dev/null +++ b/tools/fade/file.c @@ -0,0 +1,39 @@ +#include "fade.h" + +FILE * +file_openWrite(const char * s, ...) +{ + char buffer[4096]; + va_list args; + va_start(args, s); + vsprintf(buffer, s, args); + va_end(args); + + if (config.verbose) { + printf("Opening %s for writing\n", buffer); + } + + FILE* fp = fopen(buffer, "w+"); + if (!fp) { + abort_("Failed to open %s for writing\n", buffer); + } + return fp; +} + + +FILE * +file_openRead(const char * s, ...) +{ + char buffer[4096]; + va_list args; + va_start(args, s); + vsprintf(buffer, s, args); + va_end(args); + + FILE* fp = fopen(buffer, "r"); + if (!fp) { + abort_("Failed to open %s for reading\n", buffer); + } + return fp; +} + diff --git a/tools/fade/file.h b/tools/fade/file.h new file mode 100644 index 0000000..f68d4fd --- /dev/null +++ b/tools/fade/file.h @@ -0,0 +1,7 @@ +#pragma once + +FILE * +file_openWrite(const char * s, ...); + +FILE * +file_openRead(const char * s, ...); diff --git a/tools/imagecon/palette.c b/tools/imagecon/palette.c index c21295c..2657644 100644 --- a/tools/imagecon/palette.c +++ b/tools/imagecon/palette.c @@ -59,6 +59,7 @@ palette_output(imagecon_image_t* ic, char* outFilename) FILE* paletteGreyFP = 0; FILE* paletteTableFP = 0; FILE* paletteGreyTableFP = 0; + FILE* paletteGreyCopperFP = 0; if (config.outputCopperList) { fp = file_openWrite("%s-copper-list.s", outFilename); @@ -72,6 +73,7 @@ palette_output(imagecon_image_t* ic, char* outFilename) if (config.outputPaletteGrey) { paletteGreyFP = file_openWrite("%s-grey.s", outFilename); paletteGreyTableFP = file_openWrite("%s-grey-table.s", outFilename); + paletteGreyCopperFP = file_openWrite("%s-grey-copper.s", outFilename); fprintf(paletteGreyFP, "\tmovem.l d0-a6,-(sp)\n\tlea CUSTOM,a6\n"); } @@ -118,6 +120,11 @@ palette_output(imagecon_image_t* ic, char* outFilename) if (fp) { fprintf(fp, "\tdc.w $%x,$%x\n", 0x180+((i+config.paletteOffset)*2), RGB24TORGB12(ic->palette[i].r) << 8 | RGB24TORGB12(ic->palette[i].g) << 4 | RGB24TORGB12(ic->palette[i].b)); } + + if (paletteGreyCopperFP) { + unsigned grey = ((RGB24TORGB12(ic->palette[i].r) + RGB24TORGB12(ic->palette[i].g) + RGB24TORGB12(ic->palette[i].b))/3); + fprintf(paletteGreyCopperFP, "\tdc.w $%x,$%03x\n", 0x180+((i+config.paletteOffset)*2), grey << 8 | grey << 4 | grey); + } } if (paletteGreyTableFP) {