From 24f4e0492893576c4d0c2bdc726b1a34160f6d68 Mon Sep 17 00:00:00 2001 From: Wei-ju Wu Date: Wed, 21 Sep 2016 21:00:13 -0700 Subject: [PATCH] outfactored initialization cleanup to common.c in hardware --- hardware/Makefile | 6 ++-- hardware/common.c | 78 +++++++++++++++++++++++++++++++++++++++++++ hardware/common.h | 3 ++ hardware/playfield1.c | 66 ------------------------------------ hardware/sprites.c | 76 ++--------------------------------------- hardware/startup.c | 70 ++------------------------------------ 6 files changed, 89 insertions(+), 210 deletions(-) create mode 100644 hardware/common.c diff --git a/hardware/Makefile b/hardware/Makefile index be7b933..d14184f 100644 --- a/hardware/Makefile +++ b/hardware/Makefile @@ -6,11 +6,11 @@ all: startup sprites playfield1 clean: rm -f *.o startup sprites playfield1 -startup: startup.o +startup: startup.o common.o $(CC) $(CFLAGS) $^ -lamiga -lauto -o $@ -sprites: sprites.o +sprites: sprites.o common.o $(CC) $(CFLAGS) $^ -lamiga -lauto -o $@ -playfield1: playfield1.o +playfield1: playfield1.o common.o $(CC) $(CFLAGS) $^ -lamiga -lauto -o $@ diff --git a/hardware/common.c b/hardware/common.c new file mode 100644 index 0000000..dd93709 --- /dev/null +++ b/hardware/common.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include +#include + +#include + +#include "common.h" + +extern struct Custom custom; +extern struct Library *GfxBase; +static struct Screen *wbscreen; +static ULONG oldresolution; + +static void ApplySpriteFix(void) +{ + if (wbscreen = LockPubScreen(WB_SCREEN_NAME)) { + struct TagItem video_control_tags[] = { + {VTAG_SPRITERESN_GET, SPRITERESN_ECS}, + {TAG_DONE, 0} + }; + struct TagItem video_control_tags2[] = { + {VTAG_SPRITERESN_SET, SPRITERESN_140NS}, + {TAG_DONE, 0} + }; + VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); + oldresolution = video_control_tags[0].ti_Data; + VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags2); + MakeScreen(wbscreen); + RethinkDisplay(); + } +} + +static void UnapplySpriteFix(void) +{ + if (wbscreen) { + struct TagItem video_control_tags[] = { + {VTAG_SPRITERESN_SET, oldresolution}, + {TAG_DONE, 0} + }; + VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); + MakeScreen(wbscreen); + UnlockPubScreen(NULL, wbscreen); + } +} + +BOOL init_display(UWORD lib_version) +{ + BOOL is_pal; + + LoadView(NULL); // clear display, reset hardware registers + WaitTOF(); // 2 WaitTOFs to wait for 1. long frame and + WaitTOF(); // 2. short frame copper lists to finish (if interlaced) + + // Kickstart > 3.0: fix sprite bug + if (lib_version >= 39) { + ApplySpriteFix(); + is_pal = (((struct GfxBase *) GfxBase)->DisplayFlags & PAL) == PAL; + } else { + // Note: FS-UAE reports 0 this, so essentially, there is no information + // for 1.x + printf("PAL/NTSC: %d\n", (int) ((struct ExecBase *) EXEC_BASE)->VBlankFrequency); + is_pal = ((struct ExecBase *) EXEC_BASE)->VBlankFrequency == VFREQ_PAL; + } + return is_pal; +} + +void reset_display(struct View *current_view, UWORD lib_version) +{ + if (lib_version >= 39) UnapplySpriteFix(); + LoadView(current_view); + WaitTOF(); + WaitTOF(); + custom.cop1lc = (ULONG) ((struct GfxBase *) GfxBase)->copinit; + RethinkDisplay(); +} diff --git a/hardware/common.h b/hardware/common.h index e9e76b1..ae0bc4f 100644 --- a/hardware/common.h +++ b/hardware/common.h @@ -50,4 +50,7 @@ #define COP_MOVE(addr, data) addr, data #define COP_WAIT_END 0xffff, 0xfffe +extern BOOL init_display(UWORD lib_version); +extern void reset_display(struct View *current_view, UWORD lib_version); + #endif /* __COMMON_DEFS_H__ */ diff --git a/hardware/playfield1.c b/hardware/playfield1.c index 801b3bb..6eb65e0 100644 --- a/hardware/playfield1.c +++ b/hardware/playfield1.c @@ -54,72 +54,6 @@ static UWORD __chip coplist[] = { COP_WAIT_END }; -static struct Screen *wbscreen; -static ULONG oldresolution; - -static void ApplySpriteFix(void) -{ - if (wbscreen = LockPubScreen(WB_SCREEN_NAME)) { - struct TagItem video_control_tags[] = { - {VTAG_SPRITERESN_GET, SPRITERESN_ECS}, - {TAG_DONE, 0} - }; - struct TagItem video_control_tags2[] = { - {VTAG_SPRITERESN_SET, SPRITERESN_140NS}, - {TAG_DONE, 0} - }; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); - oldresolution = video_control_tags[0].ti_Data; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags2); - MakeScreen(wbscreen); - RethinkDisplay(); - } -} - -static void UnapplySpriteFix(void) -{ - if (wbscreen) { - struct TagItem video_control_tags[] = { - {VTAG_SPRITERESN_SET, oldresolution}, - {TAG_DONE, 0} - }; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); - MakeScreen(wbscreen); - UnlockPubScreen(NULL, wbscreen); - } -} - -static BOOL init_display(UWORD lib_version) -{ - BOOL is_pal; - - LoadView(NULL); // clear display, reset hardware registers - WaitTOF(); // 2 WaitTOFs to wait for 1. long frame and - WaitTOF(); // 2. short frame copper lists to finish (if interlaced) - - // Kickstart > 3.0: fix sprite bug - if (lib_version >= 39) { - ApplySpriteFix(); - is_pal = (((struct GfxBase *) GfxBase)->DisplayFlags & PAL) == PAL; - } else { - // Note: FS-UAE reports 0 this, so essentially, there is no information - // for 1.x - //printf("PAL/NTSC: %d\n", (int) ((struct ExecBase *) EXEC_BASE)->VBlankFrequency); - is_pal = ((struct ExecBase *) EXEC_BASE)->VBlankFrequency == VFREQ_PAL; - } - return is_pal; -} - -static void reset_display(struct View *current_view, UWORD lib_version) -{ - if (lib_version >= 39) UnapplySpriteFix(); - LoadView(current_view); - WaitTOF(); - WaitTOF(); - custom.cop1lc = (ULONG) ((struct GfxBase *) GfxBase)->copinit; - RethinkDisplay(); -} - int main(int argc, char **argv) { // translated startup.asm diff --git a/hardware/sprites.c b/hardware/sprites.c index c1937f9..59615df 100644 --- a/hardware/sprites.c +++ b/hardware/sprites.c @@ -1,15 +1,11 @@ -#include -#include - #include -#include -#include -#include #include -#include +#include + #include #include "common.h" + /* * A simple setup to display a sprite. */ @@ -44,72 +40,6 @@ static UWORD __chip spdat0[] = { 0x0000, 0x0000 }; -static struct Screen *wbscreen; -static ULONG oldresolution; - -static void ApplySpriteFix(void) -{ - if (wbscreen = LockPubScreen(WB_SCREEN_NAME)) { - struct TagItem video_control_tags[] = { - {VTAG_SPRITERESN_GET, SPRITERESN_ECS}, - {TAG_DONE, 0} - }; - struct TagItem video_control_tags2[] = { - {VTAG_SPRITERESN_SET, SPRITERESN_140NS}, - {TAG_DONE, 0} - }; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); - oldresolution = video_control_tags[0].ti_Data; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags2); - MakeScreen(wbscreen); - RethinkDisplay(); - } -} - -static void UnapplySpriteFix(void) -{ - if (wbscreen) { - struct TagItem video_control_tags[] = { - {VTAG_SPRITERESN_SET, oldresolution}, - {TAG_DONE, 0} - }; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); - MakeScreen(wbscreen); - UnlockPubScreen(NULL, wbscreen); - } -} - -static BOOL init_display(UWORD lib_version) -{ - BOOL is_pal; - - LoadView(NULL); // clear display, reset hardware registers - WaitTOF(); // 2 WaitTOFs to wait for 1. long frame and - WaitTOF(); // 2. short frame copper lists to finish (if interlaced) - - // Kickstart > 3.0: fix sprite bug - if (lib_version >= 39) { - ApplySpriteFix(); - is_pal = (((struct GfxBase *) GfxBase)->DisplayFlags & PAL) == PAL; - } else { - // Note: FS-UAE reports 0 this, so essentially, there is no information - // for 1.x - printf("PAL/NTSC: %d\n", (int) ((struct ExecBase *) EXEC_BASE)->VBlankFrequency); - is_pal = ((struct ExecBase *) EXEC_BASE)->VBlankFrequency == VFREQ_PAL; - } - return is_pal; -} - -static void reset_display(struct View *current_view, UWORD lib_version) -{ - if (lib_version >= 39) UnapplySpriteFix(); - LoadView(current_view); - WaitTOF(); - WaitTOF(); - custom.cop1lc = (ULONG) ((struct GfxBase *) GfxBase)->copinit; - RethinkDisplay(); -} - int main(int argc, char **argv) { // translated startup.asm diff --git a/hardware/startup.c b/hardware/startup.c index d9bf395..16d50ae 100644 --- a/hardware/startup.c +++ b/hardware/startup.c @@ -47,73 +47,6 @@ static UWORD __chip coplist_ntsc[] = { COP_WAIT_END }; -static struct Screen *wbscreen; -static ULONG oldresolution; - -static void ApplySpriteFix(void) -{ - if (wbscreen = LockPubScreen(WB_SCREEN_NAME)) { - struct TagItem video_control_tags[] = { - {VTAG_SPRITERESN_GET, SPRITERESN_ECS}, - {TAG_DONE, 0} - }; - struct TagItem video_control_tags2[] = { - {VTAG_SPRITERESN_SET, SPRITERESN_140NS}, - {TAG_DONE, 0} - }; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); - oldresolution = video_control_tags[0].ti_Data; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags2); - MakeScreen(wbscreen); - RethinkDisplay(); - } -} - -static void UnapplySpriteFix(void) -{ - if (wbscreen) { - struct TagItem video_control_tags[] = { - {VTAG_SPRITERESN_SET, oldresolution}, - {TAG_DONE, 0} - }; - VideoControl(wbscreen->ViewPort.ColorMap, video_control_tags); - MakeScreen(wbscreen); - UnlockPubScreen(NULL, wbscreen); - } -} - -static BOOL init_display(UWORD lib_version) -{ - BOOL is_pal; - - LoadView(NULL); // clear display, reset hardware registers - WaitTOF(); // 2 WaitTOFs to wait for 1. long frame and - WaitTOF(); // 2. short frame copper lists to finish (if interlaced) - - // Kickstart > 3.0: fix sprite bug - if (lib_version >= 39) { - ApplySpriteFix(); - is_pal = (((struct GfxBase *) GfxBase)->DisplayFlags & PAL) == PAL; - } else { - // Note: FS-UAE reports 0 this, so essentially, there is no information - // for 1.x - //printf("PAL/NTSC: %d\n", (int) ((struct ExecBase *) EXEC_BASE)->VBlankFrequency); - is_pal = ((struct ExecBase *) EXEC_BASE)->VBlankFrequency == VFREQ_PAL; - } - custom.cop1lc = is_pal ? (ULONG) coplist_pal : (ULONG) coplist_ntsc; - return is_pal; -} - -static void reset_display(struct View *current_view, UWORD lib_version) -{ - if (lib_version >= 39) UnapplySpriteFix(); - LoadView(current_view); - WaitTOF(); - WaitTOF(); - custom.cop1lc = (ULONG) ((struct GfxBase *) GfxBase)->copinit; - RethinkDisplay(); -} - int main(int argc, char **argv) { // translated startup.asm @@ -122,7 +55,8 @@ int main(int argc, char **argv) struct View *current_view = ((struct GfxBase *) GfxBase)->ActiView; UWORD lib_version = ((struct Library *) GfxBase)->lib_Version; - init_display(lib_version); + BOOL is_pal = init_display(lib_version); + custom.cop1lc = is_pal ? (ULONG) coplist_pal : (ULONG) coplist_ntsc; waitmouse();