mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-03-04 12:29:49 +00:00
depth/resolution switching infrastructure should be complete now; slot ROM
contains all supported depths, default mode is stored in XPRAM upon startup, and added video_switch_to_mode() call (currently unimplemented in all drivers)
This commit is contained in:
parent
1be8a821a8
commit
0fe2584d92
@ -558,6 +558,15 @@ void video_set_palette(uint8 *pal)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switch video mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
void video_switch_to_mode(const video_mode &mode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Video message handling (not neccessary under AmigaOS, handled by periodic_func())
|
* Video message handling (not neccessary under AmigaOS, handled by periodic_func())
|
||||||
*/
|
*/
|
||||||
|
@ -308,6 +308,15 @@ void video_set_palette(uint8 *pal)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switch video mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
void video_switch_to_mode(const video_mode &mode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Close down full-screen mode (if bringing up error alerts is unsafe while in full-screen mode)
|
* Close down full-screen mode (if bringing up error alerts is unsafe while in full-screen mode)
|
||||||
*/
|
*/
|
||||||
|
@ -1356,6 +1356,15 @@ void video_set_palette(uint8 *pal)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switch video mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
void video_switch_to_mode(const video_mode &mode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Suspend/resume emulator
|
* Suspend/resume emulator
|
||||||
*/
|
*/
|
||||||
|
@ -86,6 +86,7 @@ extern void VideoQuitFullScreen(void);
|
|||||||
extern void VideoInterrupt(void);
|
extern void VideoInterrupt(void);
|
||||||
extern void VideoRefresh(void);
|
extern void VideoRefresh(void);
|
||||||
|
|
||||||
|
extern void video_switch_to_mode(const video_mode &mode);
|
||||||
extern void video_set_palette(uint8 *pal);
|
extern void video_set_palette(uint8 *pal);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -139,6 +139,12 @@ bool InitAll(void)
|
|||||||
if (!VideoInit(ROMVersion == ROM_VERSION_64K || ROMVersion == ROM_VERSION_PLUS || ROMVersion == ROM_VERSION_CLASSIC))
|
if (!VideoInit(ROMVersion == ROM_VERSION_64K || ROMVersion == ROM_VERSION_PLUS || ROMVersion == ROM_VERSION_CLASSIC))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Set default video mode
|
||||||
|
XPRAM[0x56] = 0x42; // 'B'
|
||||||
|
XPRAM[0x57] = 0x32; // '2'
|
||||||
|
XPRAM[0x58] = DepthToAppleMode(VideoMonitor.mode.depth);
|
||||||
|
XPRAM[0x59] = 0;
|
||||||
|
|
||||||
#if EMULATED_68K
|
#if EMULATED_68K
|
||||||
// Init 680x0 emulation (this also activates the memory system which is needed for PatchROM())
|
// Init 680x0 emulation (this also activates the memory system which is needed for PatchROM())
|
||||||
if (!Init680x0())
|
if (!Init680x0())
|
||||||
|
@ -43,6 +43,19 @@ static uint8 srom[4096];
|
|||||||
static uint32 p;
|
static uint32 p;
|
||||||
|
|
||||||
|
|
||||||
|
// Check whether a mode with the specified depth exists
|
||||||
|
static bool has_depth(video_depth depth)
|
||||||
|
{
|
||||||
|
vector<video_mode>::const_iterator i = VideoModes.begin(), end = VideoModes.end();
|
||||||
|
while (i != end) {
|
||||||
|
if (i->depth == depth)
|
||||||
|
return true;
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Construct slot declaration ROM and copy it into the Mac ROM (must be called after VideoInit())
|
* Construct slot declaration ROM and copy it into the Mac ROM (must be called after VideoInit())
|
||||||
*/
|
*/
|
||||||
@ -322,35 +335,18 @@ bool InstallSlotROM(void)
|
|||||||
Offs(0x0b, minorLength); // Frame buffer length
|
Offs(0x0b, minorLength); // Frame buffer length
|
||||||
Offs(0x40, gammaDir); // Gamma directory
|
Offs(0x40, gammaDir); // Gamma directory
|
||||||
Rsrc(0x7d, 6); // Video attributes: Default to color, built-in
|
Rsrc(0x7d, 6); // Video attributes: Default to color, built-in
|
||||||
#if 0
|
if (has_depth(VDEPTH_1BIT))
|
||||||
Offs(0x80, vidMode1); // Video mode parameters for 1 bit
|
Offs(0x80, vidMode1); // Video mode parameters for 1 bit
|
||||||
Offs(0x81, vidMode2); // Video mode parameters for 2 bit
|
if (has_depth(VDEPTH_2BIT))
|
||||||
Offs(0x82, vidMode4); // Video mode parameters for 4 bit
|
Offs(0x81, vidMode2); // Video mode parameters for 2 bit
|
||||||
Offs(0x83, vidMode8); // Video mode parameters for 8 bit
|
if (has_depth(VDEPTH_4BIT))
|
||||||
Offs(0x84, vidMode16); // Video mode parameters for 16 bit
|
Offs(0x82, vidMode4); // Video mode parameters for 4 bit
|
||||||
Offs(0x85, vidMode32); // Video mode parameters for 32 bit
|
if (has_depth(VDEPTH_8BIT))
|
||||||
#else
|
Offs(0x83, vidMode8); // Video mode parameters for 8 bit
|
||||||
switch (VideoMonitor.mode.depth) {
|
if (has_depth(VDEPTH_16BIT))
|
||||||
case VDEPTH_1BIT:
|
Offs(0x84, vidMode16); // Video mode parameters for 16 bit
|
||||||
Offs(0x80, vidMode1); // Video mode parameters
|
if (has_depth(VDEPTH_32BIT))
|
||||||
break;
|
Offs(0x85, vidMode32); // Video mode parameters for 32 bit
|
||||||
case VDEPTH_2BIT:
|
|
||||||
Offs(0x80, vidMode2); // Video mode parameters
|
|
||||||
break;
|
|
||||||
case VDEPTH_4BIT:
|
|
||||||
Offs(0x80, vidMode4); // Video mode parameters
|
|
||||||
break;
|
|
||||||
case VDEPTH_8BIT:
|
|
||||||
Offs(0x80, vidMode8); // Video mode parameters
|
|
||||||
break;
|
|
||||||
case VDEPTH_16BIT:
|
|
||||||
Offs(0x80, vidMode16); // Video mode parameters
|
|
||||||
break;
|
|
||||||
case VDEPTH_32BIT:
|
|
||||||
Offs(0x80, vidMode32); // Video mode parameters
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
EndOfList();
|
EndOfList();
|
||||||
|
|
||||||
// CPU sResource
|
// CPU sResource
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
#include "video.h"
|
#include "video.h"
|
||||||
#include "video_defs.h"
|
#include "video_defs.h"
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 1
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ struct {
|
|||||||
|
|
||||||
static bool has_resolution(uint32 id)
|
static bool has_resolution(uint32 id)
|
||||||
{
|
{
|
||||||
vector<video_mode>::const_iterator i = VideoModes.begin(), end = VideoModes.end();
|
std::vector<video_mode>::const_iterator i = VideoModes.begin(), end = VideoModes.end();
|
||||||
while (i != end) {
|
while (i != end) {
|
||||||
if (i->resolution_id == id)
|
if (i->resolution_id == id)
|
||||||
return true;
|
return true;
|
||||||
@ -73,6 +73,22 @@ static bool has_resolution(uint32 id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find specified mode (depth/resolution) (or VideoModes.end() if not found)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static std::vector<video_mode>::const_iterator find_mode(uint16 mode, uint32 id)
|
||||||
|
{
|
||||||
|
std::vector<video_mode>::const_iterator i = VideoModes.begin(), end = VideoModes.end();
|
||||||
|
while (i != end) {
|
||||||
|
if (i->resolution_id == id && DepthToAppleMode(i->depth) == mode)
|
||||||
|
return i;
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find maximum supported depth for given resolution ID
|
* Find maximum supported depth for given resolution ID
|
||||||
*/
|
*/
|
||||||
@ -156,13 +172,18 @@ int16 VideoDriverControl(uint32 pb, uint32 dce)
|
|||||||
case cscSetMode: { // Set color depth
|
case cscSetMode: { // Set color depth
|
||||||
uint16 mode = ReadMacInt16(param + csMode);
|
uint16 mode = ReadMacInt16(param + csMode);
|
||||||
D(bug(" SetMode %04x\n", mode));
|
D(bug(" SetMode %04x\n", mode));
|
||||||
//!! switch mode
|
|
||||||
|
if (mode != VidLocal.current_mode) {
|
||||||
|
std::vector<video_mode>::const_iterator i = find_mode(mode, VidLocal.current_id);
|
||||||
|
if (i == VideoModes.end()) {
|
||||||
|
WriteMacInt32(param + csBaseAddr, VidLocal.desc->mac_frame_base);
|
||||||
|
return paramErr;
|
||||||
|
}
|
||||||
|
video_switch_to_mode(*i);
|
||||||
|
VidLocal.current_mode = mode;
|
||||||
|
}
|
||||||
WriteMacInt32(param + csBaseAddr, VidLocal.desc->mac_frame_base);
|
WriteMacInt32(param + csBaseAddr, VidLocal.desc->mac_frame_base);
|
||||||
//!! VidLocal.current_mode = mode;
|
return noErr;
|
||||||
if (mode != VidLocal.current_mode)
|
|
||||||
return paramErr;
|
|
||||||
else
|
|
||||||
return noErr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case cscSetEntries: { // Set palette
|
case cscSetEntries: { // Set palette
|
||||||
@ -262,14 +283,19 @@ int16 VideoDriverControl(uint32 pb, uint32 dce)
|
|||||||
uint16 mode = ReadMacInt16(param + csMode);
|
uint16 mode = ReadMacInt16(param + csMode);
|
||||||
uint32 id = ReadMacInt32(param + csData);
|
uint32 id = ReadMacInt32(param + csData);
|
||||||
D(bug(" SwitchMode %04x, %08x\n", mode, id));
|
D(bug(" SwitchMode %04x, %08x\n", mode, id));
|
||||||
//!! switch mode
|
|
||||||
|
if (mode != VidLocal.current_mode || id != VidLocal.current_id) {
|
||||||
|
std::vector<video_mode>::const_iterator i = find_mode(mode, id);
|
||||||
|
if (i == VideoModes.end()) {
|
||||||
|
WriteMacInt32(param + csBaseAddr, VidLocal.desc->mac_frame_base);
|
||||||
|
return paramErr;
|
||||||
|
}
|
||||||
|
video_switch_to_mode(*i);
|
||||||
|
VidLocal.current_mode = mode;
|
||||||
|
VidLocal.current_id = id;
|
||||||
|
}
|
||||||
WriteMacInt32(param + csBaseAddr, VidLocal.desc->mac_frame_base);
|
WriteMacInt32(param + csBaseAddr, VidLocal.desc->mac_frame_base);
|
||||||
//!! VidLocal.current_mode = mode;
|
return noErr;
|
||||||
//!! VidLocal.current_id = id;
|
|
||||||
if (mode != VidLocal.current_mode || id != VidLocal.current_id)
|
|
||||||
return paramErr;
|
|
||||||
else
|
|
||||||
return noErr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case cscSavePreferredConfiguration: {
|
case cscSavePreferredConfiguration: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user