1
0
mirror of https://github.com/weiju/amiga-stuff synced 2025-12-08 14:58:33 +00:00
Files
amiga-stuff/hardware/common.c
Wei-ju Wu b31f5a40aa hardware: clean out main modules
made the init_display() and reset_display() functions
more indepenent from their callers
2016-09-21 21:19:59 -07:00

82 lines
2.4 KiB
C

#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
#include <exec/execbase.h>
#include <graphics/gfxbase.h>
#include <graphics/videocontrol.h>
#include <hardware/custom.h>
#include <stdio.h>
#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(void)
{
UWORD lib_version = ((struct Library *) GfxBase)->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(void)
{
struct View *current_view = ((struct GfxBase *) GfxBase)->ActiView;
UWORD lib_version = ((struct Library *) GfxBase)->lib_Version;
if (lib_version >= 39) UnapplySpriteFix();
LoadView(current_view);
WaitTOF();
WaitTOF();
custom.cop1lc = (ULONG) ((struct GfxBase *) GfxBase)->copinit;
RethinkDisplay();
}