#include #include #include #include #include #include #include #include "common.h" extern struct Custom custom; extern struct GfxBase *GfxBase; static struct Screen *wbscreen; static ULONG oldresolution; struct ExecBase **exec_base_ptr = (struct ExecBase **) (4L); 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(void) { UWORD lib_version = GfxBase->LibNode.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 int vblank_freq = (*exec_base_ptr)->VBlankFrequency; printf("Gfx Lib version: %u, Vertical Blank Frequency: %d\n", lib_version, vblank_freq); is_pal = vblank_freq == VFREQ_PAL; } return is_pal; } void reset_display(void) { struct View *current_view = ((struct GfxBase *) GfxBase)->ActiView; UWORD lib_version = GfxBase->LibNode.lib_Version; if (lib_version >= 39) UnapplySpriteFix(); LoadView(current_view); WaitTOF(); WaitTOF(); custom.cop1lc = (ULONG) ((struct GfxBase *) GfxBase)->copinit; RethinkDisplay(); }