mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-01-22 01:31:25 +00:00
First pass of NTSC integration
This commit is contained in:
parent
7ba8128530
commit
e116014742
@ -265,6 +265,7 @@
|
||||
<ClCompile Include="source\Debugger\Debugger_Parser.cpp" />
|
||||
<ClCompile Include="source\Debugger\Debugger_Range.cpp" />
|
||||
<ClCompile Include="source\Debugger\Debugger_Symbols.cpp" />
|
||||
<ClCompile Include="source\NTSC.cpp" />
|
||||
<ClCompile Include="source\StdAfx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug NoDX|Win32'">Create</PrecompiledHeader>
|
||||
@ -392,6 +393,7 @@
|
||||
<ClInclude Include="source\Debugger\Debugger_Symbols.h" />
|
||||
<ClInclude Include="source\Debugger\Debugger_Types.h" />
|
||||
<ClInclude Include="source\Debugger\Util_MemoryTextFile.h" />
|
||||
<ClInclude Include="source\NTSC.h" />
|
||||
<ClInclude Include="source\Tfe\Bittypes.h" />
|
||||
<ClInclude Include="source\Tfe\Bpf.h" />
|
||||
<ClInclude Include="source\Tfe\Ip6_misc.h" />
|
||||
|
@ -51,6 +51,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "Speech.h"
|
||||
#endif
|
||||
#include "Video.h"
|
||||
#include "NTSC.h"
|
||||
|
||||
#include "Configuration\About.h"
|
||||
#include "Configuration\PropertySheet.h"
|
||||
@ -408,7 +409,7 @@ void LoadConfiguration(void)
|
||||
case A2TYPE_PRAVETS8M: g_nCharsetType = 3; break; //This charset has a very small difference with the PRAVETS82 one an probably has some misplaced characters. Still the Pravets82 charset is used, because setting charset to 3 results in some problems.
|
||||
}
|
||||
|
||||
//
|
||||
NTSC_VideoInitAppleType();
|
||||
|
||||
if (!REGLOAD(TEXT(REGVALUE_JOYSTICK0_EMU_TYPE), &joytype[JN_JOYSTICK0]))
|
||||
LoadConfigOldJoystick(JN_JOYSTICK0);
|
||||
|
@ -96,6 +96,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "Speech.h"
|
||||
#endif
|
||||
#include "Video.h"
|
||||
#include "NTSC.h"
|
||||
|
||||
#include "z80emu.h"
|
||||
#include "Z80VICE\z80.h"
|
||||
@ -103,25 +104,27 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#include "Debugger\Debug.h"
|
||||
|
||||
|
||||
#define AF_SIGN 0x80
|
||||
#define AF_OVERFLOW 0x40
|
||||
#define AF_RESERVED 0x20
|
||||
#define AF_BREAK 0x10
|
||||
#define AF_DECIMAL 0x08
|
||||
#define AF_INTERRUPT 0x04
|
||||
#define AF_ZERO 0x02
|
||||
#define AF_CARRY 0x01
|
||||
// 6502 Accumulator Bit Flags
|
||||
#define AF_SIGN 0x80
|
||||
#define AF_OVERFLOW 0x40
|
||||
#define AF_RESERVED 0x20
|
||||
#define AF_BREAK 0x10
|
||||
#define AF_DECIMAL 0x08
|
||||
#define AF_INTERRUPT 0x04
|
||||
#define AF_ZERO 0x02
|
||||
#define AF_CARRY 0x01
|
||||
|
||||
#define SHORTOPCODES 22
|
||||
#define BENCHOPCODES 33
|
||||
|
||||
// What is this 6502 code?
|
||||
static BYTE benchopcode[BENCHOPCODES] = {0x06,0x16,0x24,0x45,0x48,0x65,0x68,0x76,
|
||||
0x84,0x85,0x86,0x91,0x94,0xA4,0xA5,0xA6,
|
||||
0xB1,0xB4,0xC0,0xC4,0xC5,0xE6,
|
||||
0x19,0x6D,0x8D,0x99,0x9D,0xAD,0xB9,0xBD,
|
||||
0xDD,0xED,0xEE};
|
||||
// What is this 6502 code? Compressed 6502 code -- see: CpuSetupBenchmark()
|
||||
static BYTE benchopcode[BENCHOPCODES] = {
|
||||
0x06,0x16,0x24,0x45,0x48,0x65,0x68,0x76,
|
||||
0x84,0x85,0x86,0x91,0x94,0xA4,0xA5,0xA6,
|
||||
0xB1,0xB4,0xC0,0xC4,0xC5,0xE6,
|
||||
0x19,0x6D,0x8D,0x99,0x9D,0xAD,0xB9,0xBD,
|
||||
0xDD,0xED,0xEE
|
||||
};
|
||||
|
||||
regsrec regs;
|
||||
unsigned __int64 g_nCumulativeCycles = 0;
|
||||
|
@ -44,6 +44,11 @@ static DWORD Cpu6502 (DWORD uTotalCycles)
|
||||
UINT uExtraCycles = 0;
|
||||
BYTE iOpcode;
|
||||
|
||||
// NTSC_BEGIN
|
||||
ULONG uElapsedCycles;
|
||||
ULONG uPreviousCycles = uExecutedCycles;
|
||||
// NTSC_END
|
||||
|
||||
if (g_ActiveCPU == CPU_Z80)
|
||||
{
|
||||
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
||||
@ -315,6 +320,14 @@ static DWORD Cpu6502 (DWORD uTotalCycles)
|
||||
}
|
||||
}
|
||||
|
||||
// NTSC_BEGIN
|
||||
uElapsedCycles = uExecutedCycles - uPreviousCycles;
|
||||
if( g_bFullSpeed )
|
||||
NTSC_VideoUpdateCycles( uElapsedCycles );
|
||||
else
|
||||
g_pNTSC_FuncVideoUpdate( uElapsedCycles );
|
||||
// NTSC_END
|
||||
|
||||
CheckInterruptSources(uExecutedCycles);
|
||||
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||
|
@ -47,6 +47,11 @@ static DWORD Cpu65C02 (DWORD uTotalCycles)
|
||||
UINT uExtraCycles = 0;
|
||||
BYTE iOpcode;
|
||||
|
||||
// NTSC_BEGIN
|
||||
ULONG uElapsedCycles;
|
||||
ULONG uPreviousCycles = uExecutedCycles;
|
||||
// NTSC_END
|
||||
|
||||
if (g_ActiveCPU == CPU_Z80)
|
||||
{
|
||||
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
||||
@ -319,6 +324,14 @@ static DWORD Cpu65C02 (DWORD uTotalCycles)
|
||||
#undef $
|
||||
}
|
||||
|
||||
// NTSC_BEGIN
|
||||
uElapsedCycles = uExecutedCycles - uPreviousCycles;
|
||||
if( g_bFullSpeed )
|
||||
NTSC_VideoUpdateCycles( uElapsedCycles );
|
||||
else
|
||||
g_pNTSC_FuncVideoUpdate( uElapsedCycles );
|
||||
// NTSC_END
|
||||
|
||||
CheckInterruptSources(uExecutedCycles);
|
||||
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||
|
@ -106,6 +106,11 @@ static DWORD Cpu65D02 (DWORD uTotalCycles)
|
||||
UINT uExtraCycles = 0;
|
||||
BYTE iOpcode;
|
||||
|
||||
// NTSC_BEGIN
|
||||
ULONG uElapsedCycles;
|
||||
ULONG uPreviousCycles = uExecutedCycles;
|
||||
// NTSC_END
|
||||
|
||||
if (g_ActiveCPU == CPU_Z80)
|
||||
{
|
||||
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
||||
@ -648,6 +653,14 @@ static DWORD Cpu65D02 (DWORD uTotalCycles)
|
||||
}
|
||||
#undef $
|
||||
|
||||
// NTSC_BEGIN
|
||||
uElapsedCycles = uExecutedCycles - uPreviousCycles;
|
||||
if( g_bFullSpeed )
|
||||
NTSC_VideoUpdateCycles( uElapsedCycles );
|
||||
else
|
||||
g_pNTSC_FuncVideoUpdate( uElapsedCycles );
|
||||
// NTSC_END
|
||||
|
||||
CheckInterruptSources(uExecutedCycles);
|
||||
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||
|
@ -114,7 +114,7 @@ BOOL CPageConfig::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM
|
||||
break;
|
||||
|
||||
case IDC_MONOCOLOR:
|
||||
VideoChooseColor();
|
||||
VideoChooseMonochromeColor();
|
||||
break;
|
||||
|
||||
case IDC_CHECK_CONFIRM_REBOOT:
|
||||
|
@ -12,8 +12,15 @@
|
||||
|
||||
// 560 = Double Hi-Res
|
||||
// 384 = Doule Scan Line
|
||||
// NTSC_BEGIN
|
||||
#if 0
|
||||
#define FRAMEBUFFER_W 560
|
||||
#define FRAMEBUFFER_H 384
|
||||
#else
|
||||
#define FRAMEBUFFER_W 600
|
||||
#define FRAMEBUFFER_H 420
|
||||
#endif
|
||||
// NTSC_END
|
||||
|
||||
// Direct Draw -- For Full Screen
|
||||
extern LPDIRECTDRAW g_pDD;
|
||||
|
@ -40,6 +40,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "Speaker.h"
|
||||
#include "Video.h"
|
||||
|
||||
// Prototypes (Public)
|
||||
// Note: This is here and not in Video.h to prevent header include bloat.
|
||||
// i.e. so we don't need to incude "Structs.h" for NTSC.cpp
|
||||
DWORD VideoGetSnapshot(SS_IO_Video* pSS);
|
||||
DWORD VideoSetSnapshot(SS_IO_Video* pSS);
|
||||
|
||||
#define DEFAULT_SNAPSHOT_NAME "SaveState.aws"
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <stdint.h> // uint8_t
|
||||
|
||||
#include <windows.h>
|
||||
#include <winuser.h> // WM_MOUSEWHEEL
|
||||
|
144
source/Video.cpp
144
source/Video.cpp
@ -35,6 +35,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "Memory.h"
|
||||
#include "Registry.h"
|
||||
#include "Video.h"
|
||||
#include "NTSC.h"
|
||||
|
||||
#include "..\resource\resource.h"
|
||||
#include "Configuration\PropertySheet.h"
|
||||
@ -195,17 +196,6 @@ const BYTE DoubleHiresPalIndex[16] = {
|
||||
const int SRCOFFS_DHIRES = (SRCOFFS_HIRES + 512); // 1168
|
||||
const int SRCOFFS_TOTAL = (SRCOFFS_DHIRES + 2560); // 3278
|
||||
|
||||
enum VideoFlag_e
|
||||
{
|
||||
VF_80COL = 0x00000001,
|
||||
VF_DHIRES = 0x00000002,
|
||||
VF_HIRES = 0x00000004,
|
||||
VF_80STORE= 0x00000008,
|
||||
VF_MIXED = 0x00000010,
|
||||
VF_PAGE2 = 0x00000020,
|
||||
VF_TEXT = 0x00000040
|
||||
};
|
||||
|
||||
#define SW_80COL (g_uVideoMode & VF_80COL)
|
||||
#define SW_DHIRES (g_uVideoMode & VF_DHIRES)
|
||||
#define SW_HIRES (g_uVideoMode & VF_HIRES)
|
||||
@ -223,6 +213,13 @@ const BYTE DoubleHiresPalIndex[16] = {
|
||||
|
||||
#define HGR_MATRIX_YOFFSET 2 // For tv emulation HGR Video Mode
|
||||
|
||||
// Globals (Public)
|
||||
|
||||
uint8_t *g_pFramebufferbits = NULL; // last drawn frame
|
||||
int g_nAltCharSetOffset = 0; // alternate character set
|
||||
|
||||
// Globals (Private)
|
||||
|
||||
// video scanner constants
|
||||
int const kHBurstClock = 53; // clock when Color Burst starts
|
||||
int const kHBurstClocks = 4; // clocks per Color Burst duration
|
||||
@ -246,7 +243,6 @@ static COLORREF customcolors[256]; // MONOCHROME is last custom color
|
||||
|
||||
static HBITMAP g_hDeviceBitmap;
|
||||
static HDC g_hDeviceDC;
|
||||
LPBYTE g_pFramebufferbits = NULL; // last drawn frame
|
||||
static LPBITMAPINFO g_pFramebufferinfo = NULL;
|
||||
|
||||
static LPBYTE g_aFrameBufferOffset[FRAMEBUFFER_H]; // array of pointers to start of each scanline
|
||||
@ -270,7 +266,6 @@ static BYTE colormixbuffer[6];
|
||||
static WORD colormixmap[6][6][6];
|
||||
//
|
||||
|
||||
static int g_nAltCharSetOffset = 0; // alternate character set
|
||||
|
||||
static /*bool*/ UINT g_VideoForceFullRedraw = 1;
|
||||
static bool g_bVideoUpdatedThisFrame = false;
|
||||
@ -451,6 +446,9 @@ void CreateFrameOffsetTable (LPBYTE addr, LONG pitch)
|
||||
//===========================================================================
|
||||
void VideoInitialize ()
|
||||
{
|
||||
// RESET THE VIDEO MODE SWITCHES AND THE CHARACTER SET OFFSET
|
||||
VideoResetState();
|
||||
|
||||
// CREATE A BUFFER FOR AN IMAGE OF THE LAST DRAWN MEMORY
|
||||
vidlastmem = (LPBYTE)VirtualAlloc(NULL,0x10000,MEM_COMMIT,PAGE_READWRITE);
|
||||
ZeroMemory(vidlastmem,0x10000);
|
||||
@ -466,47 +464,15 @@ void VideoInitialize ()
|
||||
PAGE_READWRITE);
|
||||
|
||||
ZeroMemory(g_pFramebufferinfo,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));
|
||||
g_pFramebufferinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
g_pFramebufferinfo->bmiHeader.biWidth = FRAMEBUFFER_W;
|
||||
g_pFramebufferinfo->bmiHeader.biHeight = FRAMEBUFFER_H;
|
||||
g_pFramebufferinfo->bmiHeader.biPlanes = 1;
|
||||
g_pFramebufferinfo->bmiHeader.biBitCount = 8;
|
||||
g_pFramebufferinfo->bmiHeader.biClrUsed = 256;
|
||||
g_pFramebufferinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
g_pFramebufferinfo->bmiHeader.biWidth = FRAMEBUFFER_W;
|
||||
g_pFramebufferinfo->bmiHeader.biHeight = FRAMEBUFFER_H;
|
||||
g_pFramebufferinfo->bmiHeader.biPlanes = 1;
|
||||
g_pFramebufferinfo->bmiHeader.biBitCount = 32;
|
||||
g_pFramebufferinfo->bmiHeader.biCompression = BI_RGB;
|
||||
g_pFramebufferinfo->bmiHeader.biClrUsed = 0;
|
||||
|
||||
// CREATE A BITMAPINFO STRUCTURE FOR THE SOURCE IMAGE
|
||||
g_pSourceHeader = (LPBITMAPINFO)VirtualAlloc(
|
||||
NULL,
|
||||
sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD),
|
||||
MEM_COMMIT,
|
||||
PAGE_READWRITE);
|
||||
|
||||
ZeroMemory(g_pSourceHeader,sizeof(BITMAPINFOHEADER));
|
||||
g_pSourceHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
g_pSourceHeader->bmiHeader.biWidth = SRCOFFS_TOTAL;
|
||||
g_pSourceHeader->bmiHeader.biHeight = 512;
|
||||
g_pSourceHeader->bmiHeader.biPlanes = 1;
|
||||
g_pSourceHeader->bmiHeader.biBitCount = 8;
|
||||
g_pSourceHeader->bmiHeader.biClrUsed = 256;
|
||||
|
||||
// VideoReinitialize() ... except we set the frame buffer palette....
|
||||
V_CreateIdentityPalette();
|
||||
|
||||
//RGB() -> none
|
||||
//PALETTERGB() -> PC_EXPLICIT
|
||||
//??? RGB() -> PC_NOCOLLAPSE
|
||||
for( int iColor = 0; iColor < NUM_COLOR_PALETTE; iColor++ )
|
||||
customcolors[ iColor ] = ((DWORD)PC_EXPLICIT << 24) | RGB(
|
||||
g_pFramebufferinfo->bmiColors[iColor].rgbRed,
|
||||
g_pFramebufferinfo->bmiColors[iColor].rgbGreen,
|
||||
g_pFramebufferinfo->bmiColors[iColor].rgbBlue
|
||||
);
|
||||
|
||||
// CREATE THE FRAME BUFFER DIB SECTION AND DEVICE CONTEXT,
|
||||
// CREATE THE SOURCE IMAGE DIB SECTION AND DRAW INTO THE SOURCE BIT BUFFER
|
||||
V_CreateDIBSections();
|
||||
|
||||
// RESET THE VIDEO MODE SWITCHES AND THE CHARACTER SET OFFSET
|
||||
VideoResetState();
|
||||
NTSC_VideoCreateDIBSection();
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
@ -2329,8 +2295,9 @@ BYTE VideoCheckVbl (WORD, WORD, BYTE, BYTE, ULONG uExecutedCycles)
|
||||
return (r & ~0x80) | ((bVblBar) ? 0x80 : 0);
|
||||
}
|
||||
|
||||
// This is called from PageConfig
|
||||
//===========================================================================
|
||||
void VideoChooseColor ()
|
||||
void VideoChooseMonochromeColor ()
|
||||
{
|
||||
CHOOSECOLOR cc;
|
||||
ZeroMemory(&cc,sizeof(CHOOSECOLOR));
|
||||
@ -2595,6 +2562,20 @@ VideoUpdateFuncPtr_t VideoRefreshScreen ()
|
||||
DebugRefresh(0);
|
||||
#endif
|
||||
|
||||
// NTSC_BEGIN: wsVideoRefresh()
|
||||
LPBYTE pDstFrameBufferBits = 0;
|
||||
LONG pitch = 0;
|
||||
HDC hFrameDC = FrameGetVideoDC(&pDstFrameBufferBits,&pitch);
|
||||
|
||||
if (hFrameDC)
|
||||
{
|
||||
// StretchBlt(hFrameDC,0,0,VIEWPORTCX,VIEWPORTCY,g_hDeviceDC,0,0,FRAMEBUFFER_W,FRAMEBUFFER_H,SRCCOPY);
|
||||
StretchBlt(hFrameDC,0,0,FRAMEBUFFER_W,FRAMEBUFFER_H,g_hDeviceDC,0,0,FRAMEBUFFER_W,FRAMEBUFFER_H,SRCCOPY);
|
||||
GdiFlush();
|
||||
}
|
||||
return NULL;
|
||||
// NTSC_END
|
||||
|
||||
// CHECK EACH CELL FOR CHANGED BYTES. REDRAW PIXELS FOR THE CHANGED BYTES
|
||||
// IN THE FRAME BUFFER. MARK CELLS IN WHICH REDRAWING HAS TAKEN PLACE AS
|
||||
// DIRTY.
|
||||
@ -2779,8 +2760,8 @@ void _Video_RedrawScreen( VideoUpdateFuncPtr_t pfUpdate, bool bMixed )
|
||||
//===========================================================================
|
||||
void VideoReinitialize ()
|
||||
{
|
||||
V_CreateIdentityPalette();
|
||||
V_CreateDIBSections();
|
||||
NTSC_VideoInitAppleType();
|
||||
NTSC_SetVideoStyle();
|
||||
}
|
||||
|
||||
|
||||
@ -2803,10 +2784,10 @@ BYTE VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles)
|
||||
|
||||
switch (address)
|
||||
{
|
||||
case 0x00: g_uVideoMode &= ~VF_80STORE; break;
|
||||
case 0x01: g_uVideoMode |= VF_80STORE; break;
|
||||
case 0x0C: if (!IS_APPLE2) g_uVideoMode &= ~VF_80COL; break;
|
||||
case 0x0D: if (!IS_APPLE2) g_uVideoMode |= VF_80COL; break;
|
||||
case 0x00: g_uVideoMode &= ~VF_80STORE; ; break;
|
||||
case 0x01: g_uVideoMode |= VF_80STORE; ; break;
|
||||
case 0x0C: if (!IS_APPLE2) g_uVideoMode &= ~VF_80COL; NTSC_SetVideoTextMode(40); break;
|
||||
case 0x0D: if (!IS_APPLE2) g_uVideoMode |= VF_80COL; NTSC_SetVideoTextMode(80); break;
|
||||
case 0x0E: if (!IS_APPLE2) g_nAltCharSetOffset = 0; break; // Alternate char set off
|
||||
case 0x0F: if (!IS_APPLE2) g_nAltCharSetOffset = 256; break; // Alternate char set on
|
||||
case 0x50: g_uVideoMode &= ~VF_TEXT; break;
|
||||
@ -2821,6 +2802,10 @@ BYTE VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles)
|
||||
case 0x5F: if (!IS_APPLE2) g_uVideoMode &= ~VF_DHIRES; break;
|
||||
}
|
||||
|
||||
// NTSC_BEGIN
|
||||
NTSC_SetVideoMode( g_uVideoMode );
|
||||
// NTSC_END
|
||||
|
||||
if (SW_80STORE)
|
||||
g_uVideoMode &= ~VF_PAGE2;
|
||||
|
||||
@ -3316,7 +3301,7 @@ void Video_MakeScreenShot(FILE *pFile)
|
||||
// Write Pixel Data
|
||||
// No need to use GetDibBits() since we already have http://msdn.microsoft.com/en-us/library/ms532334.aspx
|
||||
// @reference: "Storing an Image" http://msdn.microsoft.com/en-us/library/ms532340(VS.85).aspx
|
||||
pSrc = ((u8*)g_pFramebufferbits);
|
||||
pSrc = ((uint8_t*)g_pFramebufferbits);
|
||||
nLen = g_tBmpHeader.nWidthPixels * g_tBmpHeader.nHeightPixels * g_tBmpHeader.nBitsPerPixel / 8;
|
||||
|
||||
if( g_iScreenshotType == SCREENSHOT_280x192 )
|
||||
@ -3351,10 +3336,10 @@ void Video_MakeScreenShot(FILE *pFile)
|
||||
TargaHeader_t *pHeader = &g_tTargaHeader;
|
||||
memset( (void*)pHeader, 0, sizeof( TargaHeader_t ) );
|
||||
|
||||
pHeader->iImageType = TARGA_RGB;
|
||||
pHeader->iImageType = TARGA_RGB;
|
||||
pHeader->nWidthPixels = FRAMEBUFFER_W;
|
||||
pHeader->nHeightPixels = FRAMEBUFFER_H;
|
||||
pHeader->nBitsPerPixel = 24;
|
||||
pHeader->nBitsPerPixel = 24;
|
||||
#endif // SCREENSHOT_TGA
|
||||
|
||||
}
|
||||
@ -3393,3 +3378,36 @@ void Config_Save_Video()
|
||||
REGSAVE(TEXT(REGVALUE_VIDEO_HALF_SCAN_LINES),g_uHalfScanLines);
|
||||
REGSAVE(TEXT(REGVALUE_VIDEO_MONO_COLOR ),monochrome);
|
||||
}
|
||||
|
||||
// ____________________________________________________________________
|
||||
|
||||
//===========================================================================
|
||||
void NTSC_VideoCreateDIBSection()
|
||||
{
|
||||
// CREATE THE DEVICE CONTEXT
|
||||
HWND window = GetDesktopWindow();
|
||||
HDC dc = GetDC(window);
|
||||
if (g_hDeviceDC)
|
||||
{
|
||||
DeleteDC(g_hDeviceDC);
|
||||
}
|
||||
g_hDeviceDC = CreateCompatibleDC(dc);
|
||||
|
||||
// CREATE THE FRAME BUFFER DIB SECTION
|
||||
if (g_hDeviceBitmap)
|
||||
DeleteObject(g_hDeviceBitmap);
|
||||
g_hDeviceBitmap = CreateDIBSection(
|
||||
dc,
|
||||
g_pFramebufferinfo,
|
||||
DIB_RGB_COLORS,
|
||||
(LPVOID *)&g_pFramebufferbits,0,0
|
||||
);
|
||||
SelectObject(g_hDeviceDC,g_hDeviceBitmap);
|
||||
|
||||
// CREATE THE OFFSET TABLE FOR EACH SCAN LINE IN THE FRAME BUFFER
|
||||
// DRAW THE SOURCE IMAGE INTO THE SOURCE BIT BUFFER
|
||||
ZeroMemory( g_pFramebufferbits, FRAMEBUFFER_W*FRAMEBUFFER_H*4 );
|
||||
|
||||
NTSC_VideoInit( g_pFramebufferbits );
|
||||
}
|
||||
|
||||
|
@ -8,8 +8,8 @@
|
||||
{
|
||||
VT_MONO_HALFPIXEL_REAL // uses custom monochrome
|
||||
, VT_COLOR_STANDARD
|
||||
, VT_COLOR_TEXT_OPTIMIZED
|
||||
, VT_COLOR_TVEMU
|
||||
, VT_COLOR_TEXT_OPTIMIZED
|
||||
, VT_COLOR_TVEMU
|
||||
, VT_MONO_AMBER // now half pixel
|
||||
, VT_MONO_GREEN // now half pixel
|
||||
, VT_MONO_WHITE // now half pixel
|
||||
@ -19,28 +19,39 @@
|
||||
extern TCHAR g_aVideoChoices[];
|
||||
extern char *g_apVideoModeDesc[ NUM_VIDEO_MODES ];
|
||||
|
||||
enum AppleFont_e
|
||||
{
|
||||
// 40-Column mode is 1x Zoom (default)
|
||||
// 80-Column mode is ~0.75x Zoom (7 x 16)
|
||||
// Tiny mode is 0.5 zoom (7x8) for debugger
|
||||
APPLE_FONT_WIDTH = 14, // in pixels
|
||||
APPLE_FONT_HEIGHT = 16, // in pixels
|
||||
enum VideoFlag_e
|
||||
{
|
||||
VF_80COL = 0x00000001,
|
||||
VF_DHIRES = 0x00000002,
|
||||
VF_HIRES = 0x00000004,
|
||||
VF_80STORE= 0x00000008, // was called VF_MASK2
|
||||
VF_MIXED = 0x00000010,
|
||||
VF_PAGE2 = 0x00000020,
|
||||
VF_TEXT = 0x00000040
|
||||
};
|
||||
|
||||
// Each cell has a reserved aligned pixel area (grid spacing)
|
||||
APPLE_FONT_CELL_WIDTH = 16,
|
||||
APPLE_FONT_CELL_HEIGHT = 16,
|
||||
enum AppleFont_e
|
||||
{
|
||||
// 40-Column mode is 1x Zoom (default)
|
||||
// 80-Column mode is ~0.75x Zoom (7 x 16)
|
||||
// Tiny mode is 0.5 zoom (7x8) for debugger
|
||||
APPLE_FONT_WIDTH = 14, // in pixels
|
||||
APPLE_FONT_HEIGHT = 16, // in pixels
|
||||
|
||||
// The bitmap contains 3 regions
|
||||
// Each region is 256x256 pixels = 16x16 chars
|
||||
APPLE_FONT_X_REGIONSIZE = 256, // in pixelx
|
||||
APPLE_FONT_Y_REGIONSIZE = 256, // in pixels
|
||||
// Each cell has a reserved aligned pixel area (grid spacing)
|
||||
APPLE_FONT_CELL_WIDTH = 16,
|
||||
APPLE_FONT_CELL_HEIGHT = 16,
|
||||
|
||||
// Starting Y offsets (pixels) for the regions
|
||||
APPLE_FONT_Y_APPLE_2PLUS = 0, // ][+
|
||||
APPLE_FONT_Y_APPLE_80COL = 256, // //e (inc. Mouse Text)
|
||||
APPLE_FONT_Y_APPLE_40COL = 512, // ][
|
||||
};
|
||||
// The bitmap contains 3 regions
|
||||
// Each region is 256x256 pixels = 16x16 chars
|
||||
APPLE_FONT_X_REGIONSIZE = 256, // in pixelx
|
||||
APPLE_FONT_Y_REGIONSIZE = 256, // in pixels
|
||||
|
||||
// Starting Y offsets (pixels) for the regions
|
||||
APPLE_FONT_Y_APPLE_2PLUS = 0, // ][+
|
||||
APPLE_FONT_Y_APPLE_80COL = 256, // //e (inc. Mouse Text)
|
||||
APPLE_FONT_Y_APPLE_40COL = 512, // ][
|
||||
};
|
||||
|
||||
// Globals __________________________________________________________
|
||||
|
||||
@ -49,7 +60,8 @@ extern HBITMAP g_hLogoBitmap;
|
||||
extern COLORREF monochrome; // saved
|
||||
extern DWORD g_eVideoType; // saved
|
||||
extern DWORD g_uHalfScanLines; // saved
|
||||
extern LPBYTE g_pFramebufferbits;
|
||||
extern uint8_t *g_pFramebufferbits;
|
||||
extern int g_nAltCharSetOffset; // alternate character set
|
||||
|
||||
typedef bool (*VideoUpdateFuncPtr_t)(int,int,int,int,int);
|
||||
|
||||
@ -59,7 +71,7 @@ void CreateColorMixMap();
|
||||
|
||||
BOOL VideoApparentlyDirty ();
|
||||
void VideoBenchmark ();
|
||||
void VideoChooseColor ();
|
||||
void VideoChooseMonochromeColor (); // FIXME: Should be moved to PageConfig and call VideoSetMonochromeColor()
|
||||
void VideoDestroy ();
|
||||
void VideoDrawLogoBitmap(HDC hDstDC, int xoff, int yoff, int srcw, int srch, int scale);
|
||||
void VideoDisplayLogo ();
|
||||
@ -85,9 +97,6 @@ bool VideoGetSWAltCharSet(void);
|
||||
|
||||
void VideoSetForceFullRedraw(void);
|
||||
|
||||
DWORD VideoGetSnapshot(SS_IO_Video* pSS);
|
||||
DWORD VideoSetSnapshot(SS_IO_Video* pSS);
|
||||
|
||||
void _Video_Dirty();
|
||||
void _Video_RedrawScreen( VideoUpdateFuncPtr_t update, bool bMixed = false );
|
||||
void _Video_SetupBanks( bool bBank2 );
|
||||
|
Loading…
x
Reference in New Issue
Block a user