Merge from branch 'NTSC_PreMerge':
1.26.0.1 . NTSC video modes (TV Color, TV B&W, Monitor Color, Monitor B&W) . Full Screen using native resolution (not 640x480) NB. 6502 emulation is slower now, which means disk loading (ie. full-speed) is slower. . EG. Aztec.dsk: from F2 boot to "Press any key". (Release build, 50% "TV Color", not run in VS, VAIO laptop) ~4 secs: AppleWin 1.25.0.3 (built with VS2005) ~7 secs: AppleWin 1.26.0.1 (built with VS2008 or VS015)
|
@ -74,6 +74,8 @@
|
||||||
<ClInclude Include="source\Mockingboard.h" />
|
<ClInclude Include="source\Mockingboard.h" />
|
||||||
<ClInclude Include="source\MouseInterface.h" />
|
<ClInclude Include="source\MouseInterface.h" />
|
||||||
<ClInclude Include="source\NoSlotClock.h" />
|
<ClInclude Include="source\NoSlotClock.h" />
|
||||||
|
<ClInclude Include="source\NTSC.h" />
|
||||||
|
<ClInclude Include="source\NTSC_CharSet.h" />
|
||||||
<ClInclude Include="source\ParallelPrinter.h" />
|
<ClInclude Include="source\ParallelPrinter.h" />
|
||||||
<ClInclude Include="source\Pravets.h" />
|
<ClInclude Include="source\Pravets.h" />
|
||||||
<ClInclude Include="source\Registry.h" />
|
<ClInclude Include="source\Registry.h" />
|
||||||
|
@ -154,6 +156,8 @@
|
||||||
<ClCompile Include="source\Mockingboard.cpp" />
|
<ClCompile Include="source\Mockingboard.cpp" />
|
||||||
<ClCompile Include="source\MouseInterface.cpp" />
|
<ClCompile Include="source\MouseInterface.cpp" />
|
||||||
<ClCompile Include="source\NoSlotClock.cpp" />
|
<ClCompile Include="source\NoSlotClock.cpp" />
|
||||||
|
<ClCompile Include="source\NTSC.cpp" />
|
||||||
|
<ClCompile Include="source\NTSC_CharSet.cpp" />
|
||||||
<ClCompile Include="source\ParallelPrinter.cpp" />
|
<ClCompile Include="source\ParallelPrinter.cpp" />
|
||||||
<ClCompile Include="source\Pravets.cpp" />
|
<ClCompile Include="source\Pravets.cpp" />
|
||||||
<ClCompile Include="source\Registry.cpp" />
|
<ClCompile Include="source\Registry.cpp" />
|
||||||
|
|
|
@ -169,6 +169,12 @@
|
||||||
<ClCompile Include="source\Debugger\Util_MemoryTextFile.cpp">
|
<ClCompile Include="source\Debugger\Util_MemoryTextFile.cpp">
|
||||||
<Filter>Source Files\Debugger</Filter>
|
<Filter>Source Files\Debugger</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="source\NTSC.cpp">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="source\NTSC_CharSet.cpp">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="source\Pravets.cpp">
|
<ClCompile Include="source\Pravets.cpp">
|
||||||
<Filter>Source Files\Model</Filter>
|
<Filter>Source Files\Model</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -423,6 +429,12 @@
|
||||||
<ClInclude Include="source\DiskDefs.h">
|
<ClInclude Include="source\DiskDefs.h">
|
||||||
<Filter>Source Files\Disk</Filter>
|
<Filter>Source Files\Disk</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<ClInclude Include="source\NTSC.h">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
>>>>>>> NTSC_PreMerge
|
||||||
<ClInclude Include="source\Pravets.h">
|
<ClInclude Include="source\Pravets.h">
|
||||||
<Filter>Source Files\Model</Filter>
|
<Filter>Source Files\Model</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -438,6 +450,12 @@
|
||||||
<ClInclude Include="source\SaveState_Structs_v1.h">
|
<ClInclude Include="source\SaveState_Structs_v1.h">
|
||||||
<Filter>Source Files\_Headers</Filter>
|
<Filter>Source Files\_Headers</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<ClInclude Include="source\NTSC_CharSet.h">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
>>>>>>> NTSC_PreMerge
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Image Include="resource\Applewin.bmp">
|
<Image Include="resource\Applewin.bmp">
|
||||||
|
|
|
@ -74,6 +74,8 @@
|
||||||
<ClInclude Include="source\Mockingboard.h" />
|
<ClInclude Include="source\Mockingboard.h" />
|
||||||
<ClInclude Include="source\MouseInterface.h" />
|
<ClInclude Include="source\MouseInterface.h" />
|
||||||
<ClInclude Include="source\NoSlotClock.h" />
|
<ClInclude Include="source\NoSlotClock.h" />
|
||||||
|
<ClInclude Include="source\NTSC.h" />
|
||||||
|
<ClInclude Include="source\NTSC_CharSet.h" />
|
||||||
<ClInclude Include="source\ParallelPrinter.h" />
|
<ClInclude Include="source\ParallelPrinter.h" />
|
||||||
<ClInclude Include="source\Pravets.h" />
|
<ClInclude Include="source\Pravets.h" />
|
||||||
<ClInclude Include="source\Registry.h" />
|
<ClInclude Include="source\Registry.h" />
|
||||||
|
@ -154,6 +156,8 @@
|
||||||
<ClCompile Include="source\Mockingboard.cpp" />
|
<ClCompile Include="source\Mockingboard.cpp" />
|
||||||
<ClCompile Include="source\MouseInterface.cpp" />
|
<ClCompile Include="source\MouseInterface.cpp" />
|
||||||
<ClCompile Include="source\NoSlotClock.cpp" />
|
<ClCompile Include="source\NoSlotClock.cpp" />
|
||||||
|
<ClCompile Include="source\NTSC.cpp" />
|
||||||
|
<ClCompile Include="source\NTSC_CharSet.cpp" />
|
||||||
<ClCompile Include="source\ParallelPrinter.cpp" />
|
<ClCompile Include="source\ParallelPrinter.cpp" />
|
||||||
<ClCompile Include="source\Pravets.cpp" />
|
<ClCompile Include="source\Pravets.cpp" />
|
||||||
<ClCompile Include="source\Registry.cpp" />
|
<ClCompile Include="source\Registry.cpp" />
|
||||||
|
|
|
@ -169,6 +169,12 @@
|
||||||
<ClCompile Include="source\Debugger\Util_MemoryTextFile.cpp">
|
<ClCompile Include="source\Debugger\Util_MemoryTextFile.cpp">
|
||||||
<Filter>Source Files\Debugger</Filter>
|
<Filter>Source Files\Debugger</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="source\NTSC.cpp">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="source\NTSC_CharSet.cpp">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="source\Pravets.cpp">
|
<ClCompile Include="source\Pravets.cpp">
|
||||||
<Filter>Source Files\Model</Filter>
|
<Filter>Source Files\Model</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -423,6 +429,12 @@
|
||||||
<ClInclude Include="source\DiskDefs.h">
|
<ClInclude Include="source\DiskDefs.h">
|
||||||
<Filter>Source Files\Disk</Filter>
|
<Filter>Source Files\Disk</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<ClInclude Include="source\NTSC.h">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
>>>>>>> NTSC_PreMerge
|
||||||
<ClInclude Include="source\Pravets.h">
|
<ClInclude Include="source\Pravets.h">
|
||||||
<Filter>Source Files\Model</Filter>
|
<Filter>Source Files\Model</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -438,6 +450,12 @@
|
||||||
<ClInclude Include="source\SaveState_Structs_v1.h">
|
<ClInclude Include="source\SaveState_Structs_v1.h">
|
||||||
<Filter>Source Files\_Headers</Filter>
|
<Filter>Source Files\_Headers</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<ClInclude Include="source\NTSC_CharSet.h">
|
||||||
|
<Filter>Source Files\Video</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
>>>>>>> NTSC_PreMerge
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Image Include="resource\Applewin.bmp">
|
<Image Include="resource\Applewin.bmp">
|
||||||
|
|
|
@ -265,6 +265,7 @@
|
||||||
<ClCompile Include="source\Debugger\Debugger_Parser.cpp" />
|
<ClCompile Include="source\Debugger\Debugger_Parser.cpp" />
|
||||||
<ClCompile Include="source\Debugger\Debugger_Range.cpp" />
|
<ClCompile Include="source\Debugger\Debugger_Range.cpp" />
|
||||||
<ClCompile Include="source\Debugger\Debugger_Symbols.cpp" />
|
<ClCompile Include="source\Debugger\Debugger_Symbols.cpp" />
|
||||||
|
<ClCompile Include="source\NTSC.cpp" />
|
||||||
<ClCompile Include="source\StdAfx.cpp">
|
<ClCompile Include="source\StdAfx.cpp">
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug NoDX|Win32'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug NoDX|Win32'">Create</PrecompiledHeader>
|
||||||
|
@ -395,6 +396,7 @@
|
||||||
<ClInclude Include="source\Debugger\Debugger_Symbols.h" />
|
<ClInclude Include="source\Debugger\Debugger_Symbols.h" />
|
||||||
<ClInclude Include="source\Debugger\Debugger_Types.h" />
|
<ClInclude Include="source\Debugger\Debugger_Types.h" />
|
||||||
<ClInclude Include="source\Debugger\Util_MemoryTextFile.h" />
|
<ClInclude Include="source\Debugger\Util_MemoryTextFile.h" />
|
||||||
|
<ClInclude Include="source\NTSC.h" />
|
||||||
<ClInclude Include="source\Tfe\Bittypes.h" />
|
<ClInclude Include="source\Tfe\Bittypes.h" />
|
||||||
<ClInclude Include="source\Tfe\Bpf.h" />
|
<ClInclude Include="source\Tfe\Bpf.h" />
|
||||||
<ClInclude Include="source\Tfe\Ip6_misc.h" />
|
<ClInclude Include="source\Tfe\Ip6_misc.h" />
|
||||||
|
@ -465,6 +467,14 @@
|
||||||
<ClInclude Include="resource\winres.h" />
|
<ClInclude Include="resource\winres.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="resource\ApplewinLogo.bmp" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_OFF.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_OFF_LAT.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_OFF_P8.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_ON.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_ON_LAT.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_ON_P8.BMP" />
|
||||||
|
<None Include="RESOURCE\Pravets8M.rom" />
|
||||||
<None Include="source\CPU\cpu_general.inl" />
|
<None Include="source\CPU\cpu_general.inl" />
|
||||||
<None Include="source\CPU\cpu_instructions.inl" />
|
<None Include="source\CPU\cpu_instructions.inl" />
|
||||||
<None Include="docs\CodingConventions.txt" />
|
<None Include="docs\CodingConventions.txt" />
|
||||||
|
|
|
@ -212,6 +212,9 @@
|
||||||
<ClCompile Include="source\StdAfx.cpp">
|
<ClCompile Include="source\StdAfx.cpp">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="source\NTSC.cpp">
|
||||||
|
<Filter>Source\Video</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="source\Applewin.h">
|
<ClInclude Include="source\Applewin.h">
|
||||||
|
@ -451,6 +454,9 @@
|
||||||
<ClInclude Include="source\StdAfx.h">
|
<ClInclude Include="source\StdAfx.h">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="source\NTSC.h">
|
||||||
|
<Filter>Source\Video</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="source\CPU\cpu_general.inl">
|
<None Include="source\CPU\cpu_general.inl">
|
||||||
|
@ -606,6 +612,16 @@
|
||||||
<None Include="resource\ThunderClockPlus.rom">
|
<None Include="resource\ThunderClockPlus.rom">
|
||||||
<Filter>Resources</Filter>
|
<Filter>Resources</Filter>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="resource\ApplewinLogo.bmp">
|
||||||
|
<Filter>Resources</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="RESOURCE\LED_CAPS_OFF.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_ON.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_OFF_P8.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_ON_P8.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_OFF_LAT.BMP" />
|
||||||
|
<None Include="RESOURCE\LED_CAPS_ON_LAT.BMP" />
|
||||||
|
<None Include="RESOURCE\Pravets8M.rom" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="RESOURCE\APPLEWIN.RC">
|
<ResourceCompile Include="RESOURCE\APPLEWIN.RC">
|
||||||
|
|
|
@ -870,6 +870,22 @@
|
||||||
RelativePath=".\source\Frame.h"
|
RelativePath=".\source\Frame.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\source\NTSC.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\source\NTSC.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\source\NTSC_CharSet.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\source\NTSC_CharSet.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\source\Video.cpp"
|
RelativePath=".\source\Video.cpp"
|
||||||
>
|
>
|
||||||
|
@ -1066,6 +1082,10 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\resource\ApplewinLogo.bmp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="RESOURCE\CAPSOFF.BMP"
|
RelativePath="RESOURCE\CAPSOFF.BMP"
|
||||||
>
|
>
|
||||||
|
@ -1094,6 +1114,10 @@
|
||||||
RelativePath=".\resource\CHARSET8C.bmp"
|
RelativePath=".\resource\CHARSET8C.bmp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\resource\CHARSET8M.BMP"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="RESOURCE\COLOR.BMP"
|
RelativePath="RESOURCE\COLOR.BMP"
|
||||||
>
|
>
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
/*
|
/*
|
||||||
|
.1 Fixed: Implemented missing debugger "CD" command
|
||||||
|
2.9.0.0 Added: ntsc save [filename], ntsc load [filename], to save/load the NTSC palette.
|
||||||
|
Default filename is "AppleWinNTSC4096x4@32.data"
|
||||||
|
To load this file in GIMP: Open, Select File Type: "Raw image data", Raw image data (*.data), RGB Alpha, Width: 4096, Height: 4
|
||||||
|
to save this file in GIMP: Open, Export To, Select File Type (By Extension) Raw image data, RGB Type: Standard (R,G,B)
|
||||||
|
|
||||||
.12 Fixed: [PVS-Studio] Fixed false positive of buffer overflow with MIP_RANDOM
|
.12 Fixed: [PVS-Studio] Fixed false positive of buffer overflow with MIP_RANDOM
|
||||||
.11 Fixed: [PVS-Studio] Fixed missing call to sprintf() in ConfigSave_PrepareHeader()
|
.11 Fixed: [PVS-Studio] Fixed missing call to sprintf() in ConfigSave_PrepareHeader()
|
||||||
.10 Fixed: [PVS-Studio] Fixed no-op in _6502_GetStackReturnAddress()
|
.10 Fixed: [PVS-Studio] Fixed no-op in _6502_GetStackReturnAddress()
|
||||||
|
@ -337,7 +343,6 @@
|
||||||
|
|
||||||
2.6.0.8 Released with AppleWin 1.16.1
|
2.6.0.8 Released with AppleWin 1.16.1
|
||||||
|
|
||||||
>>>>>>> .r619
|
|
||||||
2.6.0.6 Released with AppleWin 1.15
|
2.6.0.6 Released with AppleWin 1.15
|
||||||
.6 Added new command '@' to display the search results
|
.6 Added new command '@' to display the search results
|
||||||
.5 Fixed display results of Searching to be colorized
|
.5 Fixed display results of Searching to be colorized
|
||||||
|
|
|
@ -69,11 +69,11 @@ LED_CAPSON_P8_BITMAP BITMAP "LED_CAPS_ON_P8.BMP"
|
||||||
LED_LATOFF_BITMAP BITMAP "LED_CAPS_OFF_LAT.BMP"
|
LED_LATOFF_BITMAP BITMAP "LED_CAPS_OFF_LAT.BMP"
|
||||||
LED_LATON_BITMAP BITMAP "LED_CAPS_ON_LAT.BMP"
|
LED_LATON_BITMAP BITMAP "LED_CAPS_ON_LAT.BMP"
|
||||||
CHARSET82 BITMAP "CHARSET82.BMP"
|
CHARSET82 BITMAP "CHARSET82.BMP"
|
||||||
CHARSET8M BITMAP "CHARSET8C.BMP"
|
CHARSET8M BITMAP "CHARSET8M.BMP"
|
||||||
CHARSET8C BITMAP "CHARSET8C.BMP"
|
CHARSET8C BITMAP "CHARSET8C.BMP"
|
||||||
HELP_BUTTON BITMAP "HELP.BMP"
|
HELP_BUTTON BITMAP "HELP.BMP"
|
||||||
DRIVESWAP_BUTTON BITMAP "DRIVESWAP.BMP"
|
DRIVESWAP_BUTTON BITMAP "DRIVESWAP.BMP"
|
||||||
IDB_APPLEWIN BITMAP "Applewin.bmp"
|
IDB_APPLEWIN BITMAP "ApplewinLogo.bmp"
|
||||||
IDB_DEBUG_FONT_7X8 BITMAP "Debug_Font.bmp"
|
IDB_DEBUG_FONT_7X8 BITMAP "Debug_Font.bmp"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -250,8 +250,8 @@ DISK_ICON ICON "DISK.ICO"
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,25,0,4
|
FILEVERSION 1,26,0,1
|
||||||
PRODUCTVERSION 1,25,0,4
|
PRODUCTVERSION 1,26,0,1
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -269,12 +269,12 @@ BEGIN
|
||||||
VALUE "Comments", "https://github.com/AppleWin"
|
VALUE "Comments", "https://github.com/AppleWin"
|
||||||
VALUE "CompanyName", "AppleWin"
|
VALUE "CompanyName", "AppleWin"
|
||||||
VALUE "FileDescription", "Apple //e Emulator for Windows"
|
VALUE "FileDescription", "Apple //e Emulator for Windows"
|
||||||
VALUE "FileVersion", "1, 25, 0, 4"
|
VALUE "FileVersion", "1, 26, 0, 1"
|
||||||
VALUE "InternalName", "APPLEWIN"
|
VALUE "InternalName", "APPLEWIN"
|
||||||
VALUE "LegalCopyright", " 1994-2015 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski, Nick Westgate, Linards Ticmanis"
|
VALUE "LegalCopyright", " 1994-2015 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski, Nick Westgate, Linards Ticmanis"
|
||||||
VALUE "OriginalFilename", "APPLEWIN.EXE"
|
VALUE "OriginalFilename", "APPLEWIN.EXE"
|
||||||
VALUE "ProductName", "Apple //e Emulator"
|
VALUE "ProductName", "Apple //e Emulator"
|
||||||
VALUE "ProductVersion", "1, 25, 0, 4"
|
VALUE "ProductVersion", "1, 26, 0, 1"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
After Width: | Height: | Size: 630 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 8.1 KiB |
|
@ -51,6 +51,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#include "Speech.h"
|
#include "Speech.h"
|
||||||
#endif
|
#endif
|
||||||
#include "Video.h"
|
#include "Video.h"
|
||||||
|
#include "NTSC.h"
|
||||||
|
|
||||||
#include "Configuration\About.h"
|
#include "Configuration\About.h"
|
||||||
#include "Configuration\PropertySheet.h"
|
#include "Configuration\PropertySheet.h"
|
||||||
|
@ -78,6 +79,7 @@ TCHAR g_sDebugDir [MAX_PATH] = TEXT(""); // TODO: Not currently used
|
||||||
TCHAR g_sScreenShotDir[MAX_PATH] = TEXT(""); // TODO: Not currently used
|
TCHAR g_sScreenShotDir[MAX_PATH] = TEXT(""); // TODO: Not currently used
|
||||||
TCHAR g_sCurrentDir[MAX_PATH] = TEXT(""); // Also Starting Dir. Debugger uses this when load/save
|
TCHAR g_sCurrentDir[MAX_PATH] = TEXT(""); // Also Starting Dir. Debugger uses this when load/save
|
||||||
BOOL restart = 0;
|
BOOL restart = 0;
|
||||||
|
bool g_bRestartFullScreen = false;
|
||||||
|
|
||||||
DWORD g_dwSpeed = SPEED_NORMAL; // Affected by Config dialog's speed slider bar
|
DWORD g_dwSpeed = SPEED_NORMAL; // Affected by Config dialog's speed slider bar
|
||||||
double g_fCurrentCLK6502 = CLK_6502; // Affected by Config dialog's speed slider bar
|
double g_fCurrentCLK6502 = CLK_6502; // Affected by Config dialog's speed slider bar
|
||||||
|
@ -191,6 +193,7 @@ void ContinueExecution(void)
|
||||||
? g_bScrollLock_FullSpeed
|
? g_bScrollLock_FullSpeed
|
||||||
: (GetKeyState(VK_SCROLL) < 0);
|
: (GetKeyState(VK_SCROLL) < 0);
|
||||||
|
|
||||||
|
const bool bWasFullSpeed = g_bFullSpeed;
|
||||||
g_bFullSpeed = ( (g_dwSpeed == SPEED_MAX) ||
|
g_bFullSpeed = ( (g_dwSpeed == SPEED_MAX) ||
|
||||||
bScrollLock_FullSpeed ||
|
bScrollLock_FullSpeed ||
|
||||||
(DiskIsSpinning() && enhancedisk && !Spkr_IsActive() && !MB_IsActive()) );
|
(DiskIsSpinning() && enhancedisk && !Spkr_IsActive() && !MB_IsActive()) );
|
||||||
|
@ -212,6 +215,12 @@ void ContinueExecution(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (bWasFullSpeed)
|
||||||
|
{
|
||||||
|
VideoRedrawScreenDuringFullSpeed(0, true); // Invalidate the copies of video memory
|
||||||
|
VideoRedrawScreenAfterFullSpeed(g_dwCyclesThisFrame);
|
||||||
|
}
|
||||||
|
|
||||||
// Don't call Spkr_Demute()
|
// Don't call Spkr_Demute()
|
||||||
MB_Demute();
|
MB_Demute();
|
||||||
SysClk_StartTimerUsec(nExecutionPeriodUsec);
|
SysClk_StartTimerUsec(nExecutionPeriodUsec);
|
||||||
|
@ -241,7 +250,13 @@ void ContinueExecution(void)
|
||||||
if (g_dwCyclesThisFrame >= dwClksPerFrame)
|
if (g_dwCyclesThisFrame >= dwClksPerFrame)
|
||||||
{
|
{
|
||||||
g_dwCyclesThisFrame -= dwClksPerFrame;
|
g_dwCyclesThisFrame -= dwClksPerFrame;
|
||||||
VideoEndOfVideoFrame();
|
|
||||||
|
if (g_bFullSpeed)
|
||||||
|
{
|
||||||
|
VideoRedrawScreenDuringFullSpeed(g_dwCyclesThisFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
VideoRefreshScreen(0); // Just copy the output of our Apple framebuffer to the system Back Buffer
|
||||||
MB_EndOfVideoFrame();
|
MB_EndOfVideoFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,13 +404,13 @@ void SetCharsetType(void)
|
||||||
{
|
{
|
||||||
switch ( GetApple2Type() )
|
switch ( GetApple2Type() )
|
||||||
{
|
{
|
||||||
case A2TYPE_APPLE2: g_nCharsetType = 0; break;
|
case A2TYPE_APPLE2: g_nCharsetType = 0; break;
|
||||||
case A2TYPE_APPLE2PLUS: g_nCharsetType = 0; break;
|
case A2TYPE_APPLE2PLUS: g_nCharsetType = 0; break;
|
||||||
case A2TYPE_APPLE2E: g_nCharsetType = 0; break;
|
case A2TYPE_APPLE2E: g_nCharsetType = 0; break;
|
||||||
case A2TYPE_APPLE2EENHANCED:g_nCharsetType = 0; break;
|
case A2TYPE_APPLE2EENHANCED:g_nCharsetType = 0; break;
|
||||||
case A2TYPE_PRAVETS82: g_nCharsetType = 1; break;
|
case A2TYPE_PRAVETS82: g_nCharsetType = 1; break;
|
||||||
case A2TYPE_PRAVETS8A: g_nCharsetType = 2; break;
|
case A2TYPE_PRAVETS8M: g_nCharsetType = 2; break; //This charset has a very small difference with the PRAVETS82 one, and probably has some misplaced characters.
|
||||||
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.
|
case A2TYPE_PRAVETS8A: g_nCharsetType = 3; break;
|
||||||
default:
|
default:
|
||||||
_ASSERT(0);
|
_ASSERT(0);
|
||||||
g_nCharsetType = 0;
|
g_nCharsetType = 0;
|
||||||
|
@ -413,6 +428,10 @@ void LoadConfiguration(void)
|
||||||
if ((dwComputerType >= A2TYPE_MAX) || (dwComputerType >= A2TYPE_UNDEFINED && dwComputerType < A2TYPE_CLONE))
|
if ((dwComputerType >= A2TYPE_MAX) || (dwComputerType >= A2TYPE_UNDEFINED && dwComputerType < A2TYPE_CLONE))
|
||||||
dwComputerType = A2TYPE_APPLE2EENHANCED;
|
dwComputerType = A2TYPE_APPLE2EENHANCED;
|
||||||
|
|
||||||
|
// Remap the bad Pravets models (before AppleWin v1.26)
|
||||||
|
if (dwComputerType == A2TYPE_BAD_PRAVETS82) dwComputerType = A2TYPE_PRAVETS82;
|
||||||
|
if (dwComputerType == A2TYPE_BAD_PRAVETS8M) dwComputerType = A2TYPE_PRAVETS8M;
|
||||||
|
|
||||||
apple2Type = (eApple2Type) dwComputerType;
|
apple2Type = (eApple2Type) dwComputerType;
|
||||||
}
|
}
|
||||||
else // Support older AppleWin registry entries
|
else // Support older AppleWin registry entries
|
||||||
|
@ -588,7 +607,7 @@ void LoadConfiguration(void)
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
void SetCurrentImageDir(const char* pszImageDir)
|
bool SetCurrentImageDir(const char* pszImageDir)
|
||||||
{
|
{
|
||||||
strcpy(g_sCurrentDir, pszImageDir);
|
strcpy(g_sCurrentDir, pszImageDir);
|
||||||
|
|
||||||
|
@ -599,7 +618,10 @@ void SetCurrentImageDir(const char* pszImageDir)
|
||||||
g_sCurrentDir[ nLen + 1 ] = 0;
|
g_sCurrentDir[ nLen + 1 ] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetCurrentDirectory(g_sCurrentDir);
|
if( SetCurrentDirectory(g_sCurrentDir) )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -1003,9 +1025,6 @@ int APIENTRY WinMain(HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
|
||||||
DiskInitialize();
|
DiskInitialize();
|
||||||
LogFileOutput("Init: DiskInitialize()\n");
|
LogFileOutput("Init: DiskInitialize()\n");
|
||||||
|
|
||||||
CreateColorMixMap(); // For tv emulation mode
|
|
||||||
LogFileOutput("Init: CreateColorMixMap()\n");
|
|
||||||
|
|
||||||
int nError = 0; // TODO: Show error MsgBox if we get a DiskInsert error
|
int nError = 0; // TODO: Show error MsgBox if we get a DiskInsert error
|
||||||
if (szImageName_drive1)
|
if (szImageName_drive1)
|
||||||
{
|
{
|
||||||
|
@ -1136,6 +1155,12 @@ int APIENTRY WinMain(HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
|
||||||
EnterMessageLoop();
|
EnterMessageLoop();
|
||||||
LogFileOutput("Main: LeaveMessageLoop()\n");
|
LogFileOutput("Main: LeaveMessageLoop()\n");
|
||||||
|
|
||||||
|
if (restart)
|
||||||
|
{
|
||||||
|
bSetFullScreen = g_bRestartFullScreen;
|
||||||
|
g_bRestartFullScreen = false;
|
||||||
|
}
|
||||||
|
|
||||||
MB_Reset();
|
MB_Reset();
|
||||||
LogFileOutput("Main: MB_Reset()\n");
|
LogFileOutput("Main: MB_Reset()\n");
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
|
|
||||||
void SetCurrentCLK6502();
|
void SetCurrentCLK6502();
|
||||||
void SetCurrentImageDir(const char* pszImageDir);
|
bool SetCurrentImageDir(const char* pszImageDir);
|
||||||
void SetCharsetType(void);
|
void SetCharsetType(void);
|
||||||
|
|
||||||
extern const UINT16* GetAppleWinVersion(void);
|
extern const UINT16* GetAppleWinVersion(void);
|
||||||
|
@ -31,6 +31,7 @@ extern TCHAR g_sProgramDir[MAX_PATH];
|
||||||
extern TCHAR g_sCurrentDir[MAX_PATH];
|
extern TCHAR g_sCurrentDir[MAX_PATH];
|
||||||
|
|
||||||
extern BOOL restart;
|
extern BOOL restart;
|
||||||
|
extern bool g_bRestartFullScreen;
|
||||||
|
|
||||||
extern DWORD g_dwSpeed;
|
extern DWORD g_dwSpeed;
|
||||||
extern double g_fCurrentCLK6502;
|
extern double g_fCurrentCLK6502;
|
||||||
|
|
|
@ -96,6 +96,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#include "Speech.h"
|
#include "Speech.h"
|
||||||
#endif
|
#endif
|
||||||
#include "Video.h"
|
#include "Video.h"
|
||||||
|
#include "NTSC.h"
|
||||||
|
|
||||||
#include "z80emu.h"
|
#include "z80emu.h"
|
||||||
#include "Z80VICE\z80.h"
|
#include "Z80VICE\z80.h"
|
||||||
|
@ -104,25 +105,27 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#include "Debugger\Debug.h"
|
#include "Debugger\Debug.h"
|
||||||
#include "YamlHelper.h"
|
#include "YamlHelper.h"
|
||||||
|
|
||||||
|
// 6502 Accumulator Bit Flags
|
||||||
#define AF_SIGN 0x80
|
#define AF_SIGN 0x80
|
||||||
#define AF_OVERFLOW 0x40
|
#define AF_OVERFLOW 0x40
|
||||||
#define AF_RESERVED 0x20
|
#define AF_RESERVED 0x20
|
||||||
#define AF_BREAK 0x10
|
#define AF_BREAK 0x10
|
||||||
#define AF_DECIMAL 0x08
|
#define AF_DECIMAL 0x08
|
||||||
#define AF_INTERRUPT 0x04
|
#define AF_INTERRUPT 0x04
|
||||||
#define AF_ZERO 0x02
|
#define AF_ZERO 0x02
|
||||||
#define AF_CARRY 0x01
|
#define AF_CARRY 0x01
|
||||||
|
|
||||||
#define SHORTOPCODES 22
|
#define SHORTOPCODES 22
|
||||||
#define BENCHOPCODES 33
|
#define BENCHOPCODES 33
|
||||||
|
|
||||||
// What is this 6502 code?
|
// What is this 6502 code? Compressed 6502 code -- see: CpuSetupBenchmark()
|
||||||
static BYTE benchopcode[BENCHOPCODES] = {0x06,0x16,0x24,0x45,0x48,0x65,0x68,0x76,
|
static BYTE benchopcode[BENCHOPCODES] = {
|
||||||
0x84,0x85,0x86,0x91,0x94,0xA4,0xA5,0xA6,
|
0x06,0x16,0x24,0x45,0x48,0x65,0x68,0x76,
|
||||||
0xB1,0xB4,0xC0,0xC4,0xC5,0xE6,
|
0x84,0x85,0x86,0x91,0x94,0xA4,0xA5,0xA6,
|
||||||
0x19,0x6D,0x8D,0x99,0x9D,0xAD,0xB9,0xBD,
|
0xB1,0xB4,0xC0,0xC4,0xC5,0xE6,
|
||||||
0xDD,0xED,0xEE};
|
0x19,0x6D,0x8D,0x99,0x9D,0xAD,0xB9,0xBD,
|
||||||
|
0xDD,0xED,0xEE
|
||||||
|
};
|
||||||
|
|
||||||
regsrec regs;
|
regsrec regs;
|
||||||
unsigned __int64 g_nCumulativeCycles = 0;
|
unsigned __int64 g_nCumulativeCycles = 0;
|
||||||
|
|
|
@ -43,6 +43,10 @@ static DWORD Cpu6502 (DWORD uTotalCycles)
|
||||||
UINT uExtraCycles = 0;
|
UINT uExtraCycles = 0;
|
||||||
BYTE iOpcode;
|
BYTE iOpcode;
|
||||||
|
|
||||||
|
// NTSC_BEGIN
|
||||||
|
ULONG uPreviousCycles = uExecutedCycles;
|
||||||
|
// NTSC_END
|
||||||
|
|
||||||
if (GetActiveCpu() == CPU_Z80)
|
if (GetActiveCpu() == CPU_Z80)
|
||||||
{
|
{
|
||||||
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
||||||
|
@ -315,6 +319,14 @@ static DWORD Cpu6502 (DWORD uTotalCycles)
|
||||||
#undef $
|
#undef $
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NTSC_BEGIN
|
||||||
|
if (!g_bFullSpeed)
|
||||||
|
{
|
||||||
|
ULONG uElapsedCycles = uExecutedCycles - uPreviousCycles;
|
||||||
|
NTSC_VideoUpdateCycles( uElapsedCycles );
|
||||||
|
}
|
||||||
|
// NTSC_END
|
||||||
|
|
||||||
CheckInterruptSources(uExecutedCycles);
|
CheckInterruptSources(uExecutedCycles);
|
||||||
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||||
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||||
|
|
|
@ -46,6 +46,10 @@ static DWORD Cpu65C02 (DWORD uTotalCycles)
|
||||||
UINT uExtraCycles = 0;
|
UINT uExtraCycles = 0;
|
||||||
BYTE iOpcode;
|
BYTE iOpcode;
|
||||||
|
|
||||||
|
// NTSC_BEGIN
|
||||||
|
ULONG uPreviousCycles = uExecutedCycles;
|
||||||
|
// NTSC_END
|
||||||
|
|
||||||
if (GetActiveCpu() == CPU_Z80)
|
if (GetActiveCpu() == CPU_Z80)
|
||||||
{
|
{
|
||||||
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
||||||
|
@ -318,6 +322,14 @@ static DWORD Cpu65C02 (DWORD uTotalCycles)
|
||||||
#undef $
|
#undef $
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NTSC_BEGIN
|
||||||
|
if (!g_bFullSpeed)
|
||||||
|
{
|
||||||
|
ULONG uElapsedCycles = uExecutedCycles - uPreviousCycles;
|
||||||
|
NTSC_VideoUpdateCycles( uElapsedCycles );
|
||||||
|
}
|
||||||
|
// NTSC_END
|
||||||
|
|
||||||
CheckInterruptSources(uExecutedCycles);
|
CheckInterruptSources(uExecutedCycles);
|
||||||
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||||
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||||
|
|
|
@ -120,6 +120,10 @@ static DWORD Cpu65D02 (DWORD uTotalCycles)
|
||||||
UINT uExtraCycles = 0;
|
UINT uExtraCycles = 0;
|
||||||
BYTE iOpcode;
|
BYTE iOpcode;
|
||||||
|
|
||||||
|
// NTSC_BEGIN
|
||||||
|
ULONG uPreviousCycles = uExecutedCycles;
|
||||||
|
// NTSC_END
|
||||||
|
|
||||||
if (GetActiveCpu() == CPU_Z80)
|
if (GetActiveCpu() == CPU_Z80)
|
||||||
{
|
{
|
||||||
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
|
||||||
|
@ -403,6 +407,14 @@ static DWORD Cpu65D02 (DWORD uTotalCycles)
|
||||||
}
|
}
|
||||||
#undef $
|
#undef $
|
||||||
|
|
||||||
|
// NTSC_BEGIN
|
||||||
|
if (!g_bFullSpeed)
|
||||||
|
{
|
||||||
|
ULONG uElapsedCycles = uExecutedCycles - uPreviousCycles;
|
||||||
|
NTSC_VideoUpdateCycles( uElapsedCycles );
|
||||||
|
}
|
||||||
|
// NTSC_END
|
||||||
|
|
||||||
CheckInterruptSources(uExecutedCycles);
|
CheckInterruptSources(uExecutedCycles);
|
||||||
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
NMI(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||||
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
IRQ(uExecutedCycles, uExtraCycles, flagc, flagn, flagv, flagz);
|
||||||
|
|
|
@ -8,6 +8,7 @@ const double CLK_6502 = ((_M14 * 65.0) / 912.0); // 65 cycles per 912 14M clocks
|
||||||
// See: http://www.apple2info.net/hardware/softcard/SC-SWHW_a2in.pdf
|
// See: http://www.apple2info.net/hardware/softcard/SC-SWHW_a2in.pdf
|
||||||
const double CLK_Z80 = (CLK_6502 * 2);
|
const double CLK_Z80 = (CLK_6502 * 2);
|
||||||
|
|
||||||
|
// TODO: Clean up from Common.h, Video.cpp, and NTSC.h !!!
|
||||||
const UINT uCyclesPerLine = 65; // 25 cycles of HBL & 40 cycles of HBL'
|
const UINT uCyclesPerLine = 65; // 25 cycles of HBL & 40 cycles of HBL'
|
||||||
const UINT uVisibleLinesPerFrame = 64*3; // 192
|
const UINT uVisibleLinesPerFrame = 64*3; // 192
|
||||||
const UINT uLinesPerFrame = 262; // 64 in each third of the screen & 70 in VBL
|
const UINT uLinesPerFrame = 262; // 64 in each third of the screen & 70 in VBL
|
||||||
|
@ -177,10 +178,12 @@ enum eApple2Type {
|
||||||
//
|
//
|
||||||
// Clones start here:
|
// Clones start here:
|
||||||
A2TYPE_CLONE=APPLECLONE_MASK,
|
A2TYPE_CLONE=APPLECLONE_MASK,
|
||||||
A2TYPE_PRAVETS=APPLECLONE_MASK|APPLE2E_MASK,
|
A2TYPE_PRAVETS=APPLECLONE_MASK,
|
||||||
A2TYPE_PRAVETS82=A2TYPE_PRAVETS,
|
A2TYPE_PRAVETS82=A2TYPE_PRAVETS, // Apple ][ clone
|
||||||
A2TYPE_PRAVETS8M,
|
A2TYPE_PRAVETS8M, // Apple ][ clone
|
||||||
A2TYPE_PRAVETS8A,
|
A2TYPE_BAD_PRAVETS82=A2TYPE_PRAVETS|APPLE2E_MASK, // Wrongly tagged as Apple //e clone (< AppleWin 1.26)
|
||||||
|
A2TYPE_BAD_PRAVETS8M, // Wrongly tagged as Apple //e clone (< AppleWin 1.26)
|
||||||
|
A2TYPE_PRAVETS8A, // Apple //e clone
|
||||||
A2TYPE_MAX
|
A2TYPE_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ BOOL CPageConfig::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_MONOCOLOR:
|
case IDC_MONOCOLOR:
|
||||||
VideoChooseColor();
|
VideoChooseMonochromeColor();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_CHECK_CONFIRM_REBOOT:
|
case IDC_CHECK_CONFIRM_REBOOT:
|
||||||
|
|
|
@ -40,6 +40,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#include "..\Frame.h"
|
#include "..\Frame.h"
|
||||||
#include "..\Keyboard.h"
|
#include "..\Keyboard.h"
|
||||||
#include "..\Memory.h"
|
#include "..\Memory.h"
|
||||||
|
#include "..\NTSC.h"
|
||||||
#include "..\Video.h"
|
#include "..\Video.h"
|
||||||
|
|
||||||
// #define DEBUG_COMMAND_HELP 1
|
// #define DEBUG_COMMAND_HELP 1
|
||||||
|
@ -47,7 +48,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#define ALLOW_INPUT_LOWERCASE 1
|
#define ALLOW_INPUT_LOWERCASE 1
|
||||||
|
|
||||||
// See /docs/Debugger_Changelog.txt for full details
|
// See /docs/Debugger_Changelog.txt for full details
|
||||||
const int DEBUGGER_VERSION = MAKE_VERSION(2,8,0,12);
|
const int DEBUGGER_VERSION = MAKE_VERSION(2,9,0,1);
|
||||||
|
|
||||||
|
|
||||||
// Public _________________________________________________________________________________________
|
// Public _________________________________________________________________________________________
|
||||||
|
@ -310,7 +311,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
bool g_bTraceHeader = false; // semaphore, flag header to be printed
|
bool g_bTraceHeader = false; // semaphore, flag header to be printed
|
||||||
|
|
||||||
DWORD extbench = 0;
|
DWORD extbench = 0;
|
||||||
bool g_bDebuggerViewingAppleOutput = false;
|
int g_bDebuggerViewingAppleOutput = false; // NOTE: alias for bVideoModeFlags!
|
||||||
|
|
||||||
bool g_bIgnoreNextKey = false;
|
bool g_bIgnoreNextKey = false;
|
||||||
|
|
||||||
|
@ -379,6 +380,19 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
WORD DisasmCalcAddressFromLines( WORD iAddress, int nLines );
|
WORD DisasmCalcAddressFromLines( WORD iAddress, int nLines );
|
||||||
|
|
||||||
|
|
||||||
|
// File _______________________________________________________________________
|
||||||
|
|
||||||
|
int _GetFileSize( FILE *hFile )
|
||||||
|
{
|
||||||
|
fseek( hFile, 0, SEEK_END );
|
||||||
|
int nFileBytes = ftell( hFile );
|
||||||
|
fseek( hFile, 0, SEEK_SET );
|
||||||
|
|
||||||
|
return nFileBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Bookmarks __________________________________________________________________
|
// Bookmarks __________________________________________________________________
|
||||||
|
|
||||||
|
|
||||||
|
@ -3999,6 +4013,7 @@ Update_t CmdMemoryFill (int nArgs)
|
||||||
static TCHAR g_sMemoryLoadSaveFileName[ MAX_PATH ] = TEXT("");
|
static TCHAR g_sMemoryLoadSaveFileName[ MAX_PATH ] = TEXT("");
|
||||||
|
|
||||||
|
|
||||||
|
// "PWD"
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
Update_t CmdConfigGetDebugDir (int nArgs)
|
Update_t CmdConfigGetDebugDir (int nArgs)
|
||||||
{
|
{
|
||||||
|
@ -4009,9 +4024,30 @@ Update_t CmdConfigGetDebugDir (int nArgs)
|
||||||
return ConsoleUpdate();
|
return ConsoleUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "CD"
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
Update_t CmdConfigSetDebugDir (int nArgs)
|
Update_t CmdConfigSetDebugDir (int nArgs)
|
||||||
{
|
{
|
||||||
|
//if( nArgs > 2 )
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// PWD directory
|
||||||
|
#if _WIN32
|
||||||
|
// http://msdn.microsoft.com/en-us/library/aa365530(VS.85).aspx
|
||||||
|
TCHAR sPath[ MAX_PATH + 1 ];
|
||||||
|
_tcscpy( sPath, g_sCurrentDir ); // TODO: debugger dir has no ` CONSOLE_COLOR_ESCAPE_CHAR ?!?!
|
||||||
|
_tcscat( sPath, g_aArgs[ 1 ].sArg );
|
||||||
|
|
||||||
|
if( SetCurrentImageDir( sPath ) )
|
||||||
|
nArgs = 0; // intentional fall into
|
||||||
|
#else
|
||||||
|
#error "Need chdir() implemented"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// PWD
|
||||||
|
if( nArgs == 0 )
|
||||||
|
return CmdConfigGetDebugDir(0);
|
||||||
|
|
||||||
return ConsoleUpdate();
|
return ConsoleUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4095,9 +4131,7 @@ Update_t CmdMemoryLoad (int nArgs)
|
||||||
FILE *hFile = fopen( sLoadSaveFilePath, "rb" );
|
FILE *hFile = fopen( sLoadSaveFilePath, "rb" );
|
||||||
if (hFile)
|
if (hFile)
|
||||||
{
|
{
|
||||||
fseek( hFile, 0, SEEK_END );
|
int nFileBytes = _GetFileSize( hFile );
|
||||||
int nFileBytes = ftell( hFile );
|
|
||||||
fseek( hFile, 0, SEEK_SET );
|
|
||||||
|
|
||||||
if (nFileBytes > _6502_MEM_END)
|
if (nFileBytes > _6502_MEM_END)
|
||||||
nFileBytes = _6502_MEM_END + 1; // Bank-switched RAMR/ROM is only 16-bit
|
nFileBytes = _6502_MEM_END + 1; // Bank-switched RAMR/ROM is only 16-bit
|
||||||
|
@ -4217,12 +4251,12 @@ Update_t CmdMemoryLoad (int nArgs)
|
||||||
,{ ".hgr2", 0x4000, 0x2000 }
|
,{ ".hgr2", 0x4000, 0x2000 }
|
||||||
// TODO: extension ".dhgr", ".dhgr2"
|
// TODO: extension ".dhgr", ".dhgr2"
|
||||||
};
|
};
|
||||||
const int nFileTypes = sizeof( aFileTypes ) / sizeof( KnownFileType_t );
|
const int nFileTypes = sizeof( aFileTypes ) / sizeof( KnownFileType_t );
|
||||||
const KnownFileType_t *pFileType = NULL;
|
const KnownFileType_t *pFileType = NULL;
|
||||||
|
|
||||||
char *pFileName = g_aArgs[ 1 ].sArg;
|
char *pFileName = g_aArgs[ 1 ].sArg;
|
||||||
int nLen = strlen( pFileName );
|
int nLen = strlen( pFileName );
|
||||||
char *pEnd = pFileName + + nLen - 1;
|
char *pEnd = pFileName + nLen - 1;
|
||||||
while( pEnd > pFileName )
|
while( pEnd > pFileName )
|
||||||
{
|
{
|
||||||
if( *pEnd == '.' )
|
if( *pEnd == '.' )
|
||||||
|
@ -4297,9 +4331,7 @@ Update_t CmdMemoryLoad (int nArgs)
|
||||||
FILE *hFile = fopen( sLoadSaveFilePath, "rb" );
|
FILE *hFile = fopen( sLoadSaveFilePath, "rb" );
|
||||||
if (hFile)
|
if (hFile)
|
||||||
{
|
{
|
||||||
fseek( hFile, 0, SEEK_END );
|
int nFileBytes = _GetFileSize( hFile );
|
||||||
int nFileBytes = ftell( hFile );
|
|
||||||
fseek( hFile, 0, SEEK_SET );
|
|
||||||
|
|
||||||
if (nFileBytes > _6502_MEM_END)
|
if (nFileBytes > _6502_MEM_END)
|
||||||
nFileBytes = _6502_MEM_END + 1; // Bank-switched RAM/ROM is only 16-bit
|
nFileBytes = _6502_MEM_END + 1; // Bank-switched RAM/ROM is only 16-bit
|
||||||
|
@ -4401,7 +4433,6 @@ Update_t CmdMemoryMove (int nArgs)
|
||||||
return UPDATE_CONSOLE_DISPLAY;
|
return UPDATE_CONSOLE_DISPLAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
#if 0 // Original
|
#if 0 // Original
|
||||||
Update_t CmdMemorySave (int nArgs)
|
Update_t CmdMemorySave (int nArgs)
|
||||||
|
@ -4652,6 +4683,7 @@ Update_t CmdMemorySave (int nArgs)
|
||||||
{
|
{
|
||||||
ConsoleBufferPush( TEXT( "Warning: File already exists. Overwriting." ) );
|
ConsoleBufferPush( TEXT( "Warning: File already exists. Overwriting." ) );
|
||||||
fclose( hFile );
|
fclose( hFile );
|
||||||
|
// TODO: BUG: Is this a bug/feature that we can over-write files and the user has no control over that?
|
||||||
}
|
}
|
||||||
|
|
||||||
hFile = fopen( sLoadSaveFilePath, "wb" );
|
hFile = fopen( sLoadSaveFilePath, "wb" );
|
||||||
|
@ -4842,6 +4874,359 @@ void Util_CopyTextToClipboard ( const size_t nSize, const char *pText )
|
||||||
// GlobalFree() ??
|
// GlobalFree() ??
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
Update_t CmdNTSC (int nArgs)
|
||||||
|
{
|
||||||
|
int iParam;
|
||||||
|
int nFound = FindParam( g_aArgs[ 1 ].sArg, MATCH_EXACT, iParam, _PARAM_GENERAL_BEGIN, _PARAM_GENERAL_END );
|
||||||
|
|
||||||
|
struct KnownFileType_t
|
||||||
|
{
|
||||||
|
char *pExtension;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum KnownFileType_e
|
||||||
|
{
|
||||||
|
TYPE_UNKNOWN
|
||||||
|
,TYPE_BMP
|
||||||
|
,TYPE_RAW
|
||||||
|
,NUM_FILE_TYPES
|
||||||
|
};
|
||||||
|
|
||||||
|
const KnownFileType_t aFileTypes[ NUM_FILE_TYPES ] =
|
||||||
|
{
|
||||||
|
{ "" } // n/a
|
||||||
|
,{ ".bmp" }
|
||||||
|
,{ ".data" }
|
||||||
|
// ,{ ".raw" }
|
||||||
|
// ,{ ".ntsc" }
|
||||||
|
};
|
||||||
|
const int nFileType = sizeof( aFileTypes ) / sizeof( KnownFileType_t );
|
||||||
|
const KnownFileType_t *pFileType = NULL;
|
||||||
|
/* */ KnownFileType_e iFileType = TYPE_UNKNOWN;
|
||||||
|
|
||||||
|
#if _DEBUG
|
||||||
|
assert( (nFileType == NUM_FILE_TYPES) );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *pFileName = (nArgs > 1) ? g_aArgs[ 2 ].sArg : "";
|
||||||
|
int nLen = strlen( pFileName );
|
||||||
|
char *pEnd = pFileName + nLen - 1;
|
||||||
|
while( pEnd > pFileName )
|
||||||
|
{
|
||||||
|
if( *pEnd == '.' )
|
||||||
|
{
|
||||||
|
for( int i = TYPE_BMP; i < NUM_FILE_TYPES; i++ )
|
||||||
|
{
|
||||||
|
if( strcmp( pEnd, aFileTypes[i].pExtension ) == 0 )
|
||||||
|
{
|
||||||
|
pFileType = &aFileTypes[i];
|
||||||
|
iFileType = (KnownFileType_e) i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( pFileType )
|
||||||
|
break;
|
||||||
|
|
||||||
|
pEnd--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( nLen == 0 )
|
||||||
|
pFileName = "AppleWinNTSC4096x4@32.data";
|
||||||
|
|
||||||
|
static TCHAR sPaletteFilePath[ MAX_PATH ];
|
||||||
|
_tcscpy( sPaletteFilePath, g_sCurrentDir );
|
||||||
|
_tcscat( sPaletteFilePath, pFileName );
|
||||||
|
|
||||||
|
class ConsoleFilename
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void update( const char *pPrefixText )
|
||||||
|
{
|
||||||
|
TCHAR text[ CONSOLE_WIDTH ] = TEXT("");
|
||||||
|
sprintf( text, "%s: %s", pPrefixText, sPaletteFilePath );
|
||||||
|
ConsoleBufferPush( text ); // "Saved."
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Swizzle32
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void RGBAswapBGRA( size_t nSize, const uint8_t *pSrc, uint8_t *pDst ) // Note: pSrc and pDst _may_ alias; code handles this properly
|
||||||
|
{
|
||||||
|
const uint8_t* pEnd = pSrc + nSize;
|
||||||
|
while ( pSrc < pEnd )
|
||||||
|
{
|
||||||
|
const uint8_t r = pSrc[2];
|
||||||
|
const uint8_t g = pSrc[1];
|
||||||
|
const uint8_t b = pSrc[0];
|
||||||
|
const uint8_t a = 255; // Force A=1, 100% opacity; as pSrc[3] might not be 255
|
||||||
|
|
||||||
|
*pDst++ = r;
|
||||||
|
*pDst++ = g;
|
||||||
|
*pDst++ = b;
|
||||||
|
*pDst++ = a;
|
||||||
|
pSrc += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ABGRswizzleBGRA( size_t nSize, const uint8_t *pSrc, uint8_t *pDst ) // Note: pSrc and pDst _may_ alias; code handles this properly
|
||||||
|
{
|
||||||
|
const uint8_t* pEnd = pSrc + nSize;
|
||||||
|
while ( pSrc < pEnd )
|
||||||
|
{
|
||||||
|
const uint8_t r = pSrc[3];
|
||||||
|
const uint8_t g = pSrc[2];
|
||||||
|
const uint8_t b = pSrc[1];
|
||||||
|
const uint8_t a = 255; // Force A=1, 100% opacity; as pSrc[3] might not be 255
|
||||||
|
|
||||||
|
*pDst++ = b;
|
||||||
|
*pDst++ = g;
|
||||||
|
*pDst++ = r;
|
||||||
|
*pDst++ = a;
|
||||||
|
pSrc += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
static void ABGRswizzleRGBA( size_t nSize, const uint8_t *pSrc, uint8_t *pDst ) // Note: pSrc and pDst _may_ alias; code handles this properly
|
||||||
|
{
|
||||||
|
const uint8_t* pEnd = pSrc + nSize;
|
||||||
|
while ( pSrc < pEnd )
|
||||||
|
{
|
||||||
|
const uint8_t r = pSrc[3];
|
||||||
|
const uint8_t g = pSrc[2];
|
||||||
|
const uint8_t b = pSrc[1];
|
||||||
|
const uint8_t a = 255; // Force A=1, 100% opacity; as pSrc[3] might not be 255
|
||||||
|
|
||||||
|
*pDst++ = r;
|
||||||
|
*pDst++ = g;
|
||||||
|
*pDst++ = b;
|
||||||
|
*pDst++ = a;
|
||||||
|
pSrc += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
class Transpose4096x4
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
. Source layout = 4096x4 @ 32-bit
|
||||||
|
. +----+----+----+----+----+
|
||||||
|
. |BGRA|BGRA|BGRA|... |BGRA| phase 0
|
||||||
|
. +----+----+----+----+----+
|
||||||
|
. |BGRA|BGRA|BGRA|... |BGRA| phase 1
|
||||||
|
. +----+----+----+----+----|
|
||||||
|
. |BGRA|BGRA|BGRA|... |BGRA| phase 2
|
||||||
|
. +----+----+----+----+----+
|
||||||
|
. |BGRA|BGRA|BGRA|... |BGRA| phase 3
|
||||||
|
. +----+----+----+----+----+
|
||||||
|
. 0 1 2 4095 column
|
||||||
|
.
|
||||||
|
. Destination layout = 64x256 @ 32-bit
|
||||||
|
. | phase 0 | phase 1 | phase 2 | phase 3 |
|
||||||
|
. +----+----+----+----+----+----+----+----+
|
||||||
|
. |BGRA|BGRA|BGRA|BGRA|BGRA|BGRA|BGRA|BGRA| row 0
|
||||||
|
. +----+----+----+----+----+----+----+----+
|
||||||
|
. |BGRA|BGRA|BGRA|BGRA|BGRA|BGRA|BGRA|BGRA| row 1
|
||||||
|
. +----+----+----+----+----+----+----+----+
|
||||||
|
. |... |... |... |... |... |... |... |... |
|
||||||
|
. +----+----+----+----+----+----+----+----+
|
||||||
|
. |BGRA|BGRA|BGRA|BGRA|BGRA|BGRA|BGRA|BGRA| row 255
|
||||||
|
. +----+----+----+----+----+----+----+----+
|
||||||
|
. \ 16 px / \ 16 px / \ 16 px / \ 16 px / = 64 pixels
|
||||||
|
. 64 byte 64 byte 64 byte 64 byte
|
||||||
|
*/
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void transposeTo64x256( size_t nSize, const uint8_t *pSrc, uint8_t *pDst )
|
||||||
|
{
|
||||||
|
/* */ uint8_t *pTmp = pDst;
|
||||||
|
const uint32_t nBPP = 4; // bytes per pixel
|
||||||
|
|
||||||
|
for( int iPhase = 0; iPhase < 4; iPhase++ )
|
||||||
|
{
|
||||||
|
pDst = pTmp + (iPhase * 16 * nBPP); // dst is 16-px column
|
||||||
|
|
||||||
|
for( int x = 0; x < 4096/16; x++ ) // 4096px/16 px = 256 columns
|
||||||
|
{
|
||||||
|
for( int i = 0; i < 16*nBPP; i++ ) // 16 px, 32-bit
|
||||||
|
*pDst++ = *pSrc++;
|
||||||
|
|
||||||
|
pDst -= (16*nBPP);
|
||||||
|
pDst += (64*nBPP); // move to next scan line
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void transposeFrom64x256( size_t nSize, const uint8_t *pSrc, uint8_t *pDst )
|
||||||
|
{
|
||||||
|
const uint8_t *pTmp = pSrc;
|
||||||
|
const uint32_t nBPP = 4; // bytes per pixel
|
||||||
|
|
||||||
|
for( int iPhase = 0; iPhase < 4; iPhase++ )
|
||||||
|
{
|
||||||
|
pSrc = pTmp + (iPhase * 16 * nBPP); // src is 16-px column
|
||||||
|
for( int y = 0; y < 256; y++ )
|
||||||
|
{
|
||||||
|
for( int i = 0; i < 16*nBPP; i++ ) // 16 px, 32-bit
|
||||||
|
*pDst++ = *pSrc++;
|
||||||
|
|
||||||
|
pSrc -= (16*nBPP);
|
||||||
|
pSrc += (64*nBPP); // move to next scan line
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool bColorTV = (g_eVideoType == VT_COLOR_TV);
|
||||||
|
|
||||||
|
uint32_t* pChromaTable = NTSC_VideoGetChromaTable( false, bColorTV );
|
||||||
|
char aStatusText[64] = "Loaded";
|
||||||
|
|
||||||
|
//uint8_t* pTmp = (uint8_t*) pChromaTable;
|
||||||
|
//*pTmp++ = 0xFF; // b
|
||||||
|
//*pTmp++ = 0x00; // g
|
||||||
|
//*pTmp++ = 0x00; // r
|
||||||
|
//*pTmp++ = 0xFF; // a
|
||||||
|
|
||||||
|
if (nFound)
|
||||||
|
{
|
||||||
|
if (iParam == PARAM_RESET)
|
||||||
|
{
|
||||||
|
NTSC_VideoInitChroma();
|
||||||
|
ConsoleBufferPush( TEXT(" Resetting NTSC palette." ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (iParam == PARAM_SAVE)
|
||||||
|
{
|
||||||
|
FILE *pFile = fopen( sPaletteFilePath, "w+b" );
|
||||||
|
if( pFile )
|
||||||
|
{
|
||||||
|
size_t nWrote = 0;
|
||||||
|
uint8_t *pSwizzled = new uint8_t[ g_nChromaSize ];
|
||||||
|
|
||||||
|
if( iFileType == TYPE_BMP )
|
||||||
|
{
|
||||||
|
// need to save 32-bit bpp as 24-bit bpp
|
||||||
|
// VideoSaveScreenShot()
|
||||||
|
Transpose4096x4::transposeTo64x256( g_nChromaSize, (uint8_t*) pChromaTable, pSwizzled );
|
||||||
|
|
||||||
|
// Write BMP header
|
||||||
|
WinBmpHeader_t bmp, *pBmp = &bmp;
|
||||||
|
Video_SetBitmapHeader( pBmp, 64, 256, 32 );
|
||||||
|
fwrite( pBmp, sizeof( WinBmpHeader_t ), 1, pFile );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// RAW has no header
|
||||||
|
Swizzle32::RGBAswapBGRA( g_nChromaSize, (uint8_t*) pChromaTable, pSwizzled );
|
||||||
|
}
|
||||||
|
|
||||||
|
nWrote = fwrite( pSwizzled, g_nChromaSize, 1, pFile );
|
||||||
|
fclose( pFile );
|
||||||
|
delete [] pSwizzled;
|
||||||
|
|
||||||
|
if (nWrote == 1)
|
||||||
|
{
|
||||||
|
ConsoleFilename::update( "Saved" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ConsoleBufferPush( TEXT( "Error saving." ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ConsoleFilename::update( "File" );
|
||||||
|
ConsoleBufferPush( TEXT( "Error couldn't open file for writing." ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (iParam == PARAM_LOAD)
|
||||||
|
{
|
||||||
|
FILE *pFile = fopen( sPaletteFilePath, "rb" );
|
||||||
|
if( pFile )
|
||||||
|
{
|
||||||
|
strcpy( aStatusText, "Loaded" );
|
||||||
|
|
||||||
|
// Get File Size
|
||||||
|
size_t nFileSize = _GetFileSize( pFile );
|
||||||
|
uint8_t *pSwizzled = new uint8_t[ g_nChromaSize ];
|
||||||
|
bool bSwizzle = true;
|
||||||
|
|
||||||
|
if( iFileType == TYPE_BMP )
|
||||||
|
{
|
||||||
|
WinBmpHeader4_t bmp, *pBmp = &bmp;
|
||||||
|
fread( pBmp, sizeof( WinBmpHeader4_t ), 1, pFile );
|
||||||
|
fseek( pFile, pBmp->nOffsetData, SEEK_SET );
|
||||||
|
|
||||||
|
if( 0
|
||||||
|
|| (pBmp->nWidthPixels != 64 )
|
||||||
|
|| (pBmp->nHeightPixels != 256)
|
||||||
|
|| (pBmp->nBitsPerPixel != 32 )
|
||||||
|
|| (pBmp->nOffsetData > nFileSize)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
strcpy( aStatusText, "Bitmap not 64x256@32" );
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pBmp->nStructSize == 0x28)
|
||||||
|
{
|
||||||
|
if( pBmp->nCompression == 0) // BI_RGB mode
|
||||||
|
bSwizzle = false;
|
||||||
|
}
|
||||||
|
else // 0x7C version4 bitmap
|
||||||
|
{
|
||||||
|
if( pBmp->nCompression == 3 ) // BI_BITFIELDS
|
||||||
|
{
|
||||||
|
if((pBmp->nRedMask == 0xFF000000 ) // Gimp writes in ABGR order
|
||||||
|
&& (pBmp->nGreenMask == 0x00FF0000 )
|
||||||
|
&& (pBmp->nBlueMask == 0x0000FF00 ))
|
||||||
|
bSwizzle = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( nFileSize != g_nChromaSize )
|
||||||
|
{
|
||||||
|
sprintf( aStatusText, "Raw size != %d", 64*256*4 );
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t nRead = fread( pSwizzled, g_nChromaSize, 1, pFile );
|
||||||
|
|
||||||
|
if( iFileType == TYPE_BMP )
|
||||||
|
{
|
||||||
|
Transpose4096x4::transposeFrom64x256( g_nChromaSize, pSwizzled, (uint8_t*) pChromaTable );
|
||||||
|
if( bSwizzle )
|
||||||
|
Swizzle32::ABGRswizzleBGRA( g_nChromaSize, (uint8_t*) pChromaTable, (uint8_t*) pChromaTable );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Swizzle32::RGBAswapBGRA( g_nChromaSize, pSwizzled, (uint8_t*) pChromaTable );
|
||||||
|
|
||||||
|
_error:
|
||||||
|
fclose( pFile );
|
||||||
|
delete [] pSwizzled;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy( aStatusText, "File: " );
|
||||||
|
ConsoleBufferPush( TEXT( "Error couldn't open file for reading." ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
ConsoleFilename::update( aStatusText );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return HelpLastCommand();
|
||||||
|
}
|
||||||
|
// else
|
||||||
|
|
||||||
|
return ConsoleUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
int CmdTextSave (int nArgs)
|
int CmdTextSave (int nArgs)
|
||||||
|
@ -6072,100 +6457,104 @@ enum ViewVideoPage_t
|
||||||
|
|
||||||
Update_t _ViewOutput( ViewVideoPage_t iPage, VideoUpdateFuncPtr_t pfUpdate );
|
Update_t _ViewOutput( ViewVideoPage_t iPage, VideoUpdateFuncPtr_t pfUpdate );
|
||||||
|
|
||||||
Update_t _ViewOutput( ViewVideoPage_t iPage, VideoUpdateFuncPtr_t pfUpdate )
|
Update_t _ViewOutput( ViewVideoPage_t iPage, int bVideoModeFlags )
|
||||||
{
|
{
|
||||||
VideoSetForceFullRedraw();
|
VideoSetForceFullRedraw();
|
||||||
_Video_Dirty();
|
|
||||||
switch( iPage )
|
switch( iPage )
|
||||||
{
|
{
|
||||||
case VIEW_PAGE_X: _Video_SetupBanks( VideoGetSWPAGE2() ); break; // Page Current
|
case VIEW_PAGE_X: bVideoModeFlags |= _Video_SetupBanks( VideoGetSWPAGE2() ); break; // Page Current
|
||||||
case VIEW_PAGE_1: _Video_SetupBanks( false ); break; // Page 1
|
case VIEW_PAGE_1: bVideoModeFlags |= _Video_SetupBanks( false ); break; // Page 1
|
||||||
case VIEW_PAGE_2: _Video_SetupBanks( true ); break; // Page 2 !
|
case VIEW_PAGE_2: bVideoModeFlags |= _Video_SetupBanks( true ); break; // Page 2 !
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_Video_RedrawScreen( pfUpdate );
|
#if _DEBUG
|
||||||
g_bDebuggerViewingAppleOutput = true;
|
if (bVideoModeFlags == 0)
|
||||||
|
MessageBoxA( NULL, "bVideoModeFlags = ZERO !?", "Information", MB_OK );
|
||||||
|
#endif
|
||||||
|
g_bDebuggerViewingAppleOutput = bVideoModeFlags;
|
||||||
|
VideoRefreshScreen( bVideoModeFlags );
|
||||||
return UPDATE_NOTHING; // intentional
|
return UPDATE_NOTHING; // intentional
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text 40
|
// Text 40
|
||||||
Update_t CmdViewOutput_Text4X (int nArgs)
|
Update_t CmdViewOutput_Text4X (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_X, Update40ColCell );
|
return _ViewOutput( VIEW_PAGE_X, VF_TEXT );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_Text41 (int nArgs)
|
Update_t CmdViewOutput_Text41 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_1, Update40ColCell );
|
return _ViewOutput( VIEW_PAGE_1, VF_TEXT );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_Text42 (int nArgs)
|
Update_t CmdViewOutput_Text42 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_2, Update40ColCell );
|
return _ViewOutput( VIEW_PAGE_2, VF_TEXT );
|
||||||
}
|
}
|
||||||
// Text 80
|
// Text 80
|
||||||
Update_t CmdViewOutput_Text8X (int nArgs)
|
Update_t CmdViewOutput_Text8X (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_X, Update80ColCell );
|
return _ViewOutput( VIEW_PAGE_X, VF_TEXT | VF_80COL );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_Text81 (int nArgs)
|
Update_t CmdViewOutput_Text81 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_1, Update80ColCell );
|
return _ViewOutput( VIEW_PAGE_1, VF_TEXT | VF_80COL );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_Text82 (int nArgs)
|
Update_t CmdViewOutput_Text82 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_2, Update80ColCell );
|
return _ViewOutput( VIEW_PAGE_2, VF_TEXT | VF_80COL );
|
||||||
}
|
}
|
||||||
// Lo-Res
|
// Lo-Res
|
||||||
Update_t CmdViewOutput_GRX (int nArgs)
|
Update_t CmdViewOutput_GRX (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_X, UpdateLoResCell );
|
return _ViewOutput( VIEW_PAGE_X, VF_80STORE ); // NTSC VideoRefresh() Hack: flags != 0
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_GR1 (int nArgs)
|
Update_t CmdViewOutput_GR1 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_1, UpdateLoResCell );
|
return _ViewOutput( VIEW_PAGE_1, VF_80STORE ); // NTSC VideoRefresh() Hack: flags != 0
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_GR2 (int nArgs)
|
Update_t CmdViewOutput_GR2 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_2, UpdateLoResCell );
|
return _ViewOutput( VIEW_PAGE_2, VF_80STORE ); // NTSC VideoRefresh() Hack: flags != 0
|
||||||
}
|
}
|
||||||
// Double Lo-Res
|
// Double Lo-Res
|
||||||
Update_t CmdViewOutput_DGRX (int nArgs)
|
Update_t CmdViewOutput_DGRX (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_X, UpdateDLoResCell );
|
return _ViewOutput( VIEW_PAGE_X, VF_DHIRES | VF_80COL );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_DGR1 (int nArgs)
|
Update_t CmdViewOutput_DGR1 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_1, UpdateDLoResCell );
|
return _ViewOutput( VIEW_PAGE_1, VF_DHIRES | VF_80COL );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_DGR2 (int nArgs)
|
Update_t CmdViewOutput_DGR2 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_2, UpdateDLoResCell );
|
return _ViewOutput( VIEW_PAGE_2, VF_DHIRES | VF_80COL );
|
||||||
}
|
}
|
||||||
// Hi-Res
|
// Hi-Res
|
||||||
Update_t CmdViewOutput_HGRX (int nArgs)
|
Update_t CmdViewOutput_HGRX (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_X, UpdateHiResCell );
|
return _ViewOutput( VIEW_PAGE_X, VF_HIRES );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_HGR1 (int nArgs)
|
Update_t CmdViewOutput_HGR1 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_1, UpdateHiResCell );
|
return _ViewOutput( VIEW_PAGE_1, VF_HIRES );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_HGR2 (int nArgs)
|
Update_t CmdViewOutput_HGR2 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_2, UpdateHiResCell );
|
return _ViewOutput( VIEW_PAGE_2, VF_HIRES );
|
||||||
}
|
}
|
||||||
// Double Hi-Res
|
// Double Hi-Res
|
||||||
Update_t CmdViewOutput_DHGRX (int nArgs)
|
Update_t CmdViewOutput_DHGRX (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_X, UpdateDHiResCell );
|
return _ViewOutput( VIEW_PAGE_X, VF_HIRES | VF_DHIRES | VF_80COL );
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_DHGR1 (int nArgs)
|
Update_t CmdViewOutput_DHGR1 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_1, UpdateDHiResCell );
|
return _ViewOutput( VIEW_PAGE_1, VF_HIRES | VF_DHIRES | VF_80COL);
|
||||||
}
|
}
|
||||||
Update_t CmdViewOutput_DHGR2 (int nArgs)
|
Update_t CmdViewOutput_DHGR2 (int nArgs)
|
||||||
{
|
{
|
||||||
return _ViewOutput( VIEW_PAGE_2, UpdateDHiResCell );
|
return _ViewOutput( VIEW_PAGE_2, VF_HIRES | VF_DHIRES | VF_80COL );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Watches ________________________________________________________________________________________
|
// Watches ________________________________________________________________________________________
|
||||||
|
@ -7327,6 +7716,9 @@ bool InternalSingleStep ()
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
|
#define TRACELINE_WITH_VIDEO_SCANNER_POS 0
|
||||||
|
|
||||||
void OutputTraceLine ()
|
void OutputTraceLine ()
|
||||||
{
|
{
|
||||||
DisasmLine_t line;
|
DisasmLine_t line;
|
||||||
|
@ -7344,8 +7736,13 @@ void OutputTraceLine ()
|
||||||
g_bTraceHeader = false;
|
g_bTraceHeader = false;
|
||||||
|
|
||||||
fprintf( g_hTraceFile,
|
fprintf( g_hTraceFile,
|
||||||
|
#if TRACELINE_WITH_VIDEO_SCANNER_POS
|
||||||
|
// "0000 0000 00 00 00 0000 -------- 0000:90 90 90 NOP"
|
||||||
|
"Vert Horz A: X: Y: SP: Flags Addr:Opcode Mnemonic\n"
|
||||||
|
#else
|
||||||
// "00 00 00 0000 -------- 0000:90 90 90 NOP"
|
// "00 00 00 0000 -------- 0000:90 90 90 NOP"
|
||||||
"A: X: Y: SP: Flags Addr:Opcode Mnemonic\n"
|
"A: X: Y: SP: Flags Addr:Opcode Mnemonic\n"
|
||||||
|
#endif
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7358,6 +7755,21 @@ void OutputTraceLine ()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TRACELINE_WITH_VIDEO_SCANNER_POS
|
||||||
|
fprintf( g_hTraceFile,
|
||||||
|
// "a=%02x x=%02x y=%02x sp=%03x ps=%s %s\n",
|
||||||
|
"%04X %04X %02X %02X %02X %04X %s %s\n",
|
||||||
|
g_nVideoClockVert,
|
||||||
|
g_nVideoClockHorz,
|
||||||
|
(unsigned)regs.a,
|
||||||
|
(unsigned)regs.x,
|
||||||
|
(unsigned)regs.y,
|
||||||
|
(unsigned)regs.sp,
|
||||||
|
(char*) sFlags
|
||||||
|
, sDisassembly
|
||||||
|
//, sTarget // TODO: Show target?
|
||||||
|
);
|
||||||
|
#else
|
||||||
fprintf( g_hTraceFile,
|
fprintf( g_hTraceFile,
|
||||||
// "a=%02x x=%02x y=%02x sp=%03x ps=%s %s\n",
|
// "a=%02x x=%02x y=%02x sp=%03x ps=%s %s\n",
|
||||||
"%02X %02X %02X %04X %s %s\n",
|
"%02X %02X %02X %04X %s %s\n",
|
||||||
|
@ -7369,6 +7781,7 @@ void OutputTraceLine ()
|
||||||
, sDisassembly
|
, sDisassembly
|
||||||
//, sTarget // TODO: Show target?
|
//, sTarget // TODO: Show target?
|
||||||
);
|
);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7821,8 +8234,8 @@ void DebugContinueStepping ()
|
||||||
{
|
{
|
||||||
if (nStepsTaken == 0x10000) // HACK_MAGIC_NUM
|
if (nStepsTaken == 0x10000) // HACK_MAGIC_NUM
|
||||||
VideoRedrawScreen();
|
VideoRedrawScreen();
|
||||||
else
|
// else
|
||||||
VideoRefreshScreen();
|
// VideoRefreshScreen();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
extern int g_aDisasmTargets[ MAX_DISPLAY_LINES ];
|
extern int g_aDisasmTargets[ MAX_DISPLAY_LINES ];
|
||||||
|
|
||||||
// Display
|
// Display
|
||||||
extern bool g_bDebuggerViewingAppleOutput;
|
extern int g_bDebuggerViewingAppleOutput;
|
||||||
|
|
||||||
// Font
|
// Font
|
||||||
extern int g_nFontHeight;
|
extern int g_nFontHeight;
|
||||||
|
|
|
@ -470,6 +470,10 @@ int _6502_GetOpmodeOpbyte ( const int nBaseAddress, int & iOpmode_, int & nOpby
|
||||||
if (! g_aOpcodes)
|
if (! g_aOpcodes)
|
||||||
{
|
{
|
||||||
MessageBox( g_hFrameWindow, "Debugger not properly initialized", "ERROR", MB_OK );
|
MessageBox( g_hFrameWindow, "Debugger not properly initialized", "ERROR", MB_OK );
|
||||||
|
|
||||||
|
g_aOpcodes = & g_aOpcodes65C02[ 0 ]; // Enhanced Apple //e
|
||||||
|
g_aOpmodes[ AM_2 ].m_nBytes = 2;
|
||||||
|
g_aOpmodes[ AM_3 ].m_nBytes = 3;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
RGB(255,255, 0), RGB(223,223, 0), RGB(191,191, 0), RGB(159,159, 0), RGB(127,127, 0), RGB( 95, 95, 0), RGB( 63, 63, 0), RGB( 31, 31, 0), // 011 // Yellow
|
RGB(255,255, 0), RGB(223,223, 0), RGB(191,191, 0), RGB(159,159, 0), RGB(127,127, 0), RGB( 95, 95, 0), RGB( 63, 63, 0), RGB( 31, 31, 0), // 011 // Yellow
|
||||||
RGB( 0, 0,255), RGB( 0, 0,223), RGB( 0, 0,191), RGB( 0, 0,159), RGB( 0, 0,127), RGB( 0, 0, 95), RGB( 0, 0, 63), RGB( 0, 0, 31), // 100 // Blue
|
RGB( 0, 0,255), RGB( 0, 0,223), RGB( 0, 0,191), RGB( 0, 0,159), RGB( 0, 0,127), RGB( 0, 0, 95), RGB( 0, 0, 63), RGB( 0, 0, 31), // 100 // Blue
|
||||||
RGB(255, 0,255), RGB(223, 0,223), RGB(191, 0,191), RGB(159, 0,159), RGB(127, 0,127), RGB( 95, 0, 95), RGB( 63, 0, 63), RGB( 31, 0, 31), // 101 // Magenta
|
RGB(255, 0,255), RGB(223, 0,223), RGB(191, 0,191), RGB(159, 0,159), RGB(127, 0,127), RGB( 95, 0, 95), RGB( 63, 0, 63), RGB( 31, 0, 31), // 101 // Magenta
|
||||||
RGB( 0,255,255), RGB( 0,223,223), RGB( 0,191,191), RGB( 0,159,159), RGB( 0,127,127), RGB( 0, 95, 95), RGB( 0, 63, 63), RGB( 0, 31, 31), // 110 // Cyan
|
RGB( 0,255,255), RGB( 0,223,223), RGB( 0,191,191), RGB( 0,159,159), RGB( 0,127,127), RGB( 0, 95, 95), RGB( 0, 63, 63), RGB( 0, 31, 31), // 110 // Cyan
|
||||||
RGB(255,255,255), RGB(223,223,223), RGB(191,191,191), RGB(159,159,159), RGB(127,127,127), RGB( 95, 95, 95), RGB( 63, 63, 63), RGB( 31, 31, 31), // 111 // White/Gray
|
RGB(255,255,255), RGB(223,223,223), RGB(191,191,191), RGB(159,159,159), RGB(127,127,127), RGB( 95, 95, 95), RGB( 63, 63, 63), RGB( 31, 31, 31), // 111 // White/Gray
|
||||||
|
|
||||||
// Custom Colors
|
// Custom Colors
|
||||||
|
|
|
@ -40,11 +40,14 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
Command_t g_aCommands[] =
|
Command_t g_aCommands[] =
|
||||||
{
|
{
|
||||||
// Assembler
|
// Assembler
|
||||||
|
// {TEXT("!") , CmdAssemberMini , CMD_ASSEMBLER_MINI , "Mini assembler" },
|
||||||
{TEXT("A") , CmdAssemble , CMD_ASSEMBLE , "Assemble instructions" },
|
{TEXT("A") , CmdAssemble , CMD_ASSEMBLE , "Assemble instructions" },
|
||||||
// CPU (Main)
|
// CPU (Main)
|
||||||
{TEXT(".") , CmdCursorJumpPC , CMD_CURSOR_JUMP_PC , "Locate the cursor in the disasm window" }, // centered
|
{TEXT(".") , CmdCursorJumpPC , CMD_CURSOR_JUMP_PC , "Locate the cursor in the disasm window" }, // centered
|
||||||
{TEXT("=") , CmdCursorSetPC , CMD_CURSOR_SET_PC , "Sets the PC to the current instruction" },
|
{TEXT("=") , CmdCursorSetPC , CMD_CURSOR_SET_PC , "Sets the PC to the current instruction" },
|
||||||
{TEXT("G") , CmdGo , CMD_GO , "Run [until PC = address]" },
|
// {TEXT("g") , CmdGoNormalSpeed , CMD_GO_NORMAL , "Run @ normal speed [until PC == address]" },
|
||||||
|
// {TEXT("G") , CmdGoFullSpeed , CMD_GO_FULL , "Run @ full speed [until PC == address]" },
|
||||||
|
{TEXT("G") , CmdGo , CMD_GO , "Run @ full speed [until PC == address]" },
|
||||||
{TEXT("IN") , CmdIn , CMD_IN , "Input byte from IO $C0xx" },
|
{TEXT("IN") , CmdIn , CMD_IN , "Input byte from IO $C0xx" },
|
||||||
{TEXT("KEY") , CmdKey , CMD_INPUT_KEY , "Feed key into emulator" },
|
{TEXT("KEY") , CmdKey , CMD_INPUT_KEY , "Feed key into emulator" },
|
||||||
{TEXT("JSR") , CmdJSR , CMD_JSR , "Call sub-routine" },
|
{TEXT("JSR") , CmdJSR , CMD_JSR , "Call sub-routine" },
|
||||||
|
@ -201,6 +204,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
{TEXT("SH") , CmdMemorySearchHex , CMD_MEMORY_SEARCH_HEX , "Search memory for hex values" },
|
{TEXT("SH") , CmdMemorySearchHex , CMD_MEMORY_SEARCH_HEX , "Search memory for hex values" },
|
||||||
{TEXT("F") , CmdMemoryFill , CMD_MEMORY_FILL , "Memory fill" },
|
{TEXT("F") , CmdMemoryFill , CMD_MEMORY_FILL , "Memory fill" },
|
||||||
|
|
||||||
|
{TEXT("NTSC") , CmdNTSC , CMD_NTSC , "Save/Load the NTSC palette" },
|
||||||
{TEXT("TSAVE") , CmdTextSave , CMD_TEXT_SAVE , "Save text screen" },
|
{TEXT("TSAVE") , CmdTextSave , CMD_TEXT_SAVE , "Save text screen" },
|
||||||
// Output / Scripts
|
// Output / Scripts
|
||||||
{TEXT("CALC") , CmdOutputCalc , CMD_OUTPUT_CALC , "Display mini calc result" },
|
{TEXT("CALC") , CmdOutputCalc , CMD_OUTPUT_CALC , "Display mini calc result" },
|
||||||
|
|
|
@ -562,13 +562,18 @@ void StretchBltMemToFrameDC(void)
|
||||||
int nViewportCX, nViewportCY;
|
int nViewportCX, nViewportCY;
|
||||||
GetViewportCXCY(nViewportCX, nViewportCY);
|
GetViewportCXCY(nViewportCX, nViewportCY);
|
||||||
|
|
||||||
|
int xdest = GetFullScreenOffsetX();
|
||||||
|
int ydest = GetFullScreenOffsetY();
|
||||||
|
int wdest = nViewportCX;
|
||||||
|
int hdest = nViewportCY;
|
||||||
|
|
||||||
BOOL bRes = StretchBlt(
|
BOOL bRes = StretchBlt(
|
||||||
FrameGetDC(), // HDC hdcDest,
|
FrameGetDC(), // HDC hdcDest,
|
||||||
0, 0, // int nXOriginDest, int nYOriginDest,
|
xdest, ydest, // int nXOriginDest, int nYOriginDest,
|
||||||
nViewportCX, nViewportCY, // int nWidthDest, int nHeightDest,
|
wdest, hdest, // int nWidthDest, int nHeightDest,
|
||||||
GetDebuggerMemDC(), // HDC hdcSrc,
|
GetDebuggerMemDC(), // HDC hdcSrc,
|
||||||
0, 0, // int nXOriginSrc, int nYOriginSrc,
|
0, 0, // int nXOriginSrc, int nYOriginSrc,
|
||||||
FRAMEBUFFER_W, FRAMEBUFFER_H, // int nWidthSrc, int nHeightSrc,
|
FRAMEBUFFER_BORDERLESS_W, FRAMEBUFFER_BORDERLESS_H, // int nWidthSrc, int nHeightSrc,
|
||||||
SRCCOPY // DWORD dwRop
|
SRCCOPY // DWORD dwRop
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -442,6 +442,7 @@
|
||||||
// , CMD_MEMORY_SEARCH_APPLE // Flashing Chars, Hi-Bit Set
|
// , CMD_MEMORY_SEARCH_APPLE // Flashing Chars, Hi-Bit Set
|
||||||
, CMD_MEMORY_SEARCH_HEX
|
, CMD_MEMORY_SEARCH_HEX
|
||||||
, CMD_MEMORY_FILL
|
, CMD_MEMORY_FILL
|
||||||
|
, CMD_NTSC
|
||||||
, CMD_TEXT_SAVE
|
, CMD_TEXT_SAVE
|
||||||
// Output
|
// Output
|
||||||
, CMD_OUTPUT_CALC
|
, CMD_OUTPUT_CALC
|
||||||
|
@ -555,7 +556,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
// Assembler
|
// Assembler
|
||||||
Update_t CmdAssemble (int nArgs);
|
Update_t CmdAssemble (int nArgs);
|
||||||
|
|
||||||
// Disassembler Data
|
// Disassembler Data
|
||||||
Update_t CmdDisasmDataDefCode (int nArgs);
|
Update_t CmdDisasmDataDefCode (int nArgs);
|
||||||
|
@ -577,89 +578,89 @@
|
||||||
Update_t CmdDisasmDataDefAddress16(int nArgs);
|
Update_t CmdDisasmDataDefAddress16(int nArgs);
|
||||||
|
|
||||||
// CPU
|
// CPU
|
||||||
Update_t CmdCursorJumpPC(int nArgs);
|
Update_t CmdCursorJumpPC (int nArgs);
|
||||||
Update_t CmdCursorSetPC (int nArgs);
|
Update_t CmdCursorSetPC (int nArgs);
|
||||||
Update_t CmdBreakInvalid(int nArgs); // Breakpoint IFF Full-speed!
|
Update_t CmdBreakInvalid (int nArgs); // Breakpoint IFF Full-speed!
|
||||||
Update_t CmdBreakOpcode (int nArgs); // Breakpoint IFF Full-speed!
|
Update_t CmdBreakOpcode (int nArgs); // Breakpoint IFF Full-speed!
|
||||||
Update_t CmdGo (int nArgs);
|
Update_t CmdGo (int nArgs);
|
||||||
Update_t CmdIn (int nArgs);
|
Update_t CmdIn (int nArgs);
|
||||||
Update_t CmdKey (int nArgs);
|
Update_t CmdKey (int nArgs);
|
||||||
Update_t CmdJSR (int nArgs);
|
Update_t CmdJSR (int nArgs);
|
||||||
Update_t CmdNOP (int nArgs);
|
Update_t CmdNOP (int nArgs);
|
||||||
Update_t CmdOut (int nArgs);
|
Update_t CmdOut (int nArgs);
|
||||||
Update_t CmdStepOver (int nArgs);
|
Update_t CmdStepOver (int nArgs);
|
||||||
Update_t CmdStepOut (int nArgs);
|
Update_t CmdStepOut (int nArgs);
|
||||||
Update_t CmdTrace (int nArgs); // alias for CmdStepIn
|
Update_t CmdTrace (int nArgs); // alias for CmdStepIn
|
||||||
Update_t CmdTraceFile (int nArgs);
|
Update_t CmdTraceFile (int nArgs);
|
||||||
Update_t CmdTraceLine (int nArgs);
|
Update_t CmdTraceLine (int nArgs);
|
||||||
Update_t CmdUnassemble (int nArgs); // code dump, aka, Unassemble
|
Update_t CmdUnassemble (int nArgs); // code dump, aka, Unassemble
|
||||||
// Bookmarks
|
// Bookmarks
|
||||||
Update_t CmdBookmark (int nArgs);
|
Update_t CmdBookmark (int nArgs);
|
||||||
Update_t CmdBookmarkAdd (int nArgs);
|
Update_t CmdBookmarkAdd (int nArgs);
|
||||||
Update_t CmdBookmarkClear (int nArgs);
|
Update_t CmdBookmarkClear (int nArgs);
|
||||||
Update_t CmdBookmarkList (int nArgs);
|
Update_t CmdBookmarkList (int nArgs);
|
||||||
Update_t CmdBookmarkGoto (int nArgs);
|
Update_t CmdBookmarkGoto (int nArgs);
|
||||||
// Update_t CmdBookmarkLoad (int nArgs);
|
// Update_t CmdBookmarkLoad (int nArgs);
|
||||||
Update_t CmdBookmarkSave (int nArgs);
|
Update_t CmdBookmarkSave (int nArgs);
|
||||||
// Breakpoints
|
// Breakpoints
|
||||||
Update_t CmdBreakpoint (int nArgs);
|
Update_t CmdBreakpoint (int nArgs);
|
||||||
Update_t CmdBreakpointAddSmart(int nArgs);
|
Update_t CmdBreakpointAddSmart (int nArgs);
|
||||||
Update_t CmdBreakpointAddReg (int nArgs);
|
Update_t CmdBreakpointAddReg (int nArgs);
|
||||||
Update_t CmdBreakpointAddPC (int nArgs);
|
Update_t CmdBreakpointAddPC (int nArgs);
|
||||||
Update_t CmdBreakpointAddIO (int nArgs);
|
Update_t CmdBreakpointAddIO (int nArgs);
|
||||||
Update_t CmdBreakpointAddMem (int nArgs);
|
Update_t CmdBreakpointAddMem (int nArgs);
|
||||||
Update_t CmdBreakpointClear (int nArgs);
|
Update_t CmdBreakpointClear (int nArgs);
|
||||||
Update_t CmdBreakpointDisable (int nArgs);
|
Update_t CmdBreakpointDisable (int nArgs);
|
||||||
Update_t CmdBreakpointEdit (int nArgs);
|
Update_t CmdBreakpointEdit (int nArgs);
|
||||||
Update_t CmdBreakpointEnable (int nArgs);
|
Update_t CmdBreakpointEnable (int nArgs);
|
||||||
Update_t CmdBreakpointList (int nArgs);
|
Update_t CmdBreakpointList (int nArgs);
|
||||||
// Update_t CmdBreakpointLoad (int nArgs);
|
// Update_t CmdBreakpointLoad (int nArgs);
|
||||||
Update_t CmdBreakpointSave (int nArgs);
|
Update_t CmdBreakpointSave (int nArgs);
|
||||||
// Benchmark
|
// Benchmark
|
||||||
Update_t CmdBenchmark (int nArgs);
|
Update_t CmdBenchmark (int nArgs);
|
||||||
Update_t CmdBenchmarkStart (int nArgs); //Update_t CmdSetupBenchmark (int nArgs);
|
Update_t CmdBenchmarkStart (int nArgs); //Update_t CmdSetupBenchmark (int nArgs);
|
||||||
Update_t CmdBenchmarkStop (int nArgs); //Update_t CmdExtBenchmark (int nArgs);
|
Update_t CmdBenchmarkStop (int nArgs); //Update_t CmdExtBenchmark (int nArgs);
|
||||||
Update_t CmdProfile (int nArgs);
|
Update_t CmdProfile (int nArgs);
|
||||||
Update_t CmdProfileStart (int nArgs);
|
Update_t CmdProfileStart (int nArgs);
|
||||||
Update_t CmdProfileStop (int nArgs);
|
Update_t CmdProfileStop (int nArgs);
|
||||||
// Config
|
// Config
|
||||||
// Update_t CmdConfigMenu (int nArgs);
|
// Update_t CmdConfigMenu (int nArgs);
|
||||||
// Update_t CmdConfigBase (int nArgs);
|
// Update_t CmdConfigBase (int nArgs);
|
||||||
// Update_t CmdConfigBaseHex (int nArgs);
|
// Update_t CmdConfigBaseHex (int nArgs);
|
||||||
// Update_t CmdConfigBaseDec (int nArgs);
|
// Update_t CmdConfigBaseDec (int nArgs);
|
||||||
Update_t CmdConfigColorMono (int nArgs);
|
Update_t CmdConfigColorMono (int nArgs);
|
||||||
Update_t CmdConfigDisasm (int nArgs);
|
Update_t CmdConfigDisasm (int nArgs);
|
||||||
Update_t CmdConfigFont (int nArgs);
|
Update_t CmdConfigFont (int nArgs);
|
||||||
Update_t CmdConfigHColor (int nArgs);
|
Update_t CmdConfigHColor (int nArgs);
|
||||||
Update_t CmdConfigLoad (int nArgs);
|
Update_t CmdConfigLoad (int nArgs);
|
||||||
Update_t CmdConfigSave (int nArgs);
|
Update_t CmdConfigSave (int nArgs);
|
||||||
Update_t CmdConfigSetFont (int nArgs);
|
Update_t CmdConfigSetFont (int nArgs);
|
||||||
Update_t CmdConfigGetFont (int nArgs);
|
Update_t CmdConfigGetFont (int nArgs);
|
||||||
Update_t CmdConfigGetDebugDir (int nArgs);
|
Update_t CmdConfigGetDebugDir (int nArgs);
|
||||||
Update_t CmdConfigSetDebugDir (int nArgs);
|
Update_t CmdConfigSetDebugDir (int nArgs);
|
||||||
// Cursor
|
// Cursor
|
||||||
Update_t CmdCursorFollowTarget(int nArgs);
|
Update_t CmdCursorFollowTarget (int nArgs);
|
||||||
Update_t CmdCursorLineDown (int nArgs);
|
Update_t CmdCursorLineDown (int nArgs);
|
||||||
Update_t CmdCursorLineUp (int nArgs);
|
Update_t CmdCursorLineUp (int nArgs);
|
||||||
Update_t CmdCursorJumpRetAddr (int nArgs);
|
Update_t CmdCursorJumpRetAddr (int nArgs);
|
||||||
Update_t CmdCursorRunUntil (int nArgs);
|
Update_t CmdCursorRunUntil (int nArgs);
|
||||||
Update_t CmdCursorPageDown (int nArgs);
|
Update_t CmdCursorPageDown (int nArgs);
|
||||||
Update_t CmdCursorPageDown256 (int nArgs);
|
Update_t CmdCursorPageDown256 (int nArgs);
|
||||||
Update_t CmdCursorPageDown4K (int nArgs);
|
Update_t CmdCursorPageDown4K (int nArgs);
|
||||||
Update_t CmdCursorPageUp (int nArgs);
|
Update_t CmdCursorPageUp (int nArgs);
|
||||||
Update_t CmdCursorPageUp256 (int nArgs);
|
Update_t CmdCursorPageUp256 (int nArgs);
|
||||||
Update_t CmdCursorPageUp4K (int nArgs);
|
Update_t CmdCursorPageUp4K (int nArgs);
|
||||||
// Disk
|
// Disk
|
||||||
Update_t CmdDisk (int nArgs);
|
Update_t CmdDisk (int nArgs);
|
||||||
// Help
|
// Help
|
||||||
Update_t CmdHelpList (int nArgs);
|
Update_t CmdHelpList (int nArgs);
|
||||||
Update_t CmdHelpSpecific (int Argss);
|
Update_t CmdHelpSpecific (int Argss);
|
||||||
Update_t CmdVersion (int nArgs);
|
Update_t CmdVersion (int nArgs);
|
||||||
Update_t CmdMOTD (int nArgs);
|
Update_t CmdMOTD (int nArgs);
|
||||||
// Flags
|
// Flags
|
||||||
Update_t CmdFlag (int nArgs);
|
Update_t CmdFlag (int nArgs);
|
||||||
Update_t CmdFlagClear (int nArgs);
|
Update_t CmdFlagClear (int nArgs);
|
||||||
Update_t CmdFlagSet (int nArgs);
|
Update_t CmdFlagSet (int nArgs);
|
||||||
// Memory (Data)
|
// Memory (Data)
|
||||||
Update_t CmdMemoryCompare (int nArgs);
|
Update_t CmdMemoryCompare (int nArgs);
|
||||||
Update_t CmdMemoryMiniDumpHex (int nArgs);
|
Update_t CmdMemoryMiniDumpHex (int nArgs);
|
||||||
|
@ -672,13 +673,14 @@
|
||||||
Update_t CmdMemoryEnterByte (int nArgs);
|
Update_t CmdMemoryEnterByte (int nArgs);
|
||||||
Update_t CmdMemoryEnterWord (int nArgs);
|
Update_t CmdMemoryEnterWord (int nArgs);
|
||||||
Update_t CmdMemoryFill (int nArgs);
|
Update_t CmdMemoryFill (int nArgs);
|
||||||
|
Update_t CmdNTSC (int nArgs);
|
||||||
Update_t CmdTextSave (int nArgs);
|
Update_t CmdTextSave (int nArgs);
|
||||||
|
|
||||||
Update_t CmdMemoryLoad (int nArgs);
|
Update_t CmdMemoryLoad (int nArgs);
|
||||||
Update_t CmdMemoryMove (int nArgs);
|
Update_t CmdMemoryMove (int nArgs);
|
||||||
Update_t CmdMemorySave (int nArgs);
|
Update_t CmdMemorySave (int nArgs);
|
||||||
Update_t CmdMemorySearch (int nArgs);
|
Update_t CmdMemorySearch (int nArgs);
|
||||||
Update_t _SearchMemoryDisplay (int nArgs=0);
|
Update_t _SearchMemoryDisplay (int nArgs=0); // TODO: CLEANUP
|
||||||
// Update_t CmdMemorySearchLowBit (int nArgs);
|
// Update_t CmdMemorySearchLowBit (int nArgs);
|
||||||
// Update_t CmdMemorySearchHiBit (int nArgs);
|
// Update_t CmdMemorySearchHiBit (int nArgs);
|
||||||
Update_t CmdMemorySearchAscii (int nArgs);
|
Update_t CmdMemorySearchAscii (int nArgs);
|
||||||
|
@ -691,101 +693,100 @@
|
||||||
Update_t CmdOutputPrintf (int nArgs);
|
Update_t CmdOutputPrintf (int nArgs);
|
||||||
Update_t CmdOutputRun (int nArgs);
|
Update_t CmdOutputRun (int nArgs);
|
||||||
// Registers
|
// Registers
|
||||||
Update_t CmdRegisterSet (int nArgs);
|
Update_t CmdRegisterSet (int nArgs);
|
||||||
// Source Level Debugging
|
// Source Level Debugging
|
||||||
Update_t CmdSource (int nArgs);
|
Update_t CmdSource (int nArgs);
|
||||||
Update_t CmdSync (int nArgs);
|
Update_t CmdSync (int nArgs);
|
||||||
// Stack
|
// Stack
|
||||||
Update_t CmdStackPush (int nArgs);
|
Update_t CmdStackPush (int nArgs);
|
||||||
Update_t CmdStackPop (int nArgs);
|
Update_t CmdStackPop (int nArgs);
|
||||||
Update_t CmdStackPopPseudo (int nArgs);
|
Update_t CmdStackPopPseudo (int nArgs);
|
||||||
Update_t CmdStackReturn (int nArgs);
|
Update_t CmdStackReturn (int nArgs);
|
||||||
// Symbols
|
// Symbols
|
||||||
Update_t CmdSymbols (int nArgs);
|
Update_t CmdSymbols (int nArgs);
|
||||||
Update_t CmdSymbolsClear (int nArgs);
|
Update_t CmdSymbolsClear (int nArgs);
|
||||||
Update_t CmdSymbolsList (int nArgs);
|
Update_t CmdSymbolsList (int nArgs);
|
||||||
Update_t CmdSymbolsLoad (int nArgs);
|
Update_t CmdSymbolsLoad (int nArgs);
|
||||||
Update_t CmdSymbolsInfo (int nArgs);
|
Update_t CmdSymbolsInfo (int nArgs);
|
||||||
Update_t CmdSymbolsSave (int nArgs);
|
Update_t CmdSymbolsSave (int nArgs);
|
||||||
|
|
||||||
Update_t CmdSymbolsCommand (int nArgs);
|
Update_t CmdSymbolsCommand (int nArgs);
|
||||||
// Update_t CmdSymbolsMain (int nArgs);
|
// Update_t CmdSymbolsMain (int nArgs);
|
||||||
// Update_t CmdSymbolsBasic (int nArgs);
|
// Update_t CmdSymbolsBasic (int nArgs);
|
||||||
// Update_t CmdSymbolsUser (int nArgs);
|
// Update_t CmdSymbolsUser (int nArgs);
|
||||||
// Update_t CmdSymbolsAssembly (int nArgs);
|
// Update_t CmdSymbolsAssembly (int nArgs);
|
||||||
// Update_t CmdSymbolsSource (int nArgs);
|
// Update_t CmdSymbolsSource (int nArgs);
|
||||||
|
|
||||||
// View
|
// View
|
||||||
Update_t CmdViewOutput_Text4X (int nArgs);
|
Update_t CmdViewOutput_Text4X (int nArgs);
|
||||||
Update_t CmdViewOutput_Text41 (int nArgs);
|
Update_t CmdViewOutput_Text41 (int nArgs);
|
||||||
Update_t CmdViewOutput_Text42 (int nArgs);
|
Update_t CmdViewOutput_Text42 (int nArgs);
|
||||||
Update_t CmdViewOutput_Text8X (int nArgs);
|
Update_t CmdViewOutput_Text8X (int nArgs);
|
||||||
Update_t CmdViewOutput_Text81 (int nArgs);
|
Update_t CmdViewOutput_Text81 (int nArgs);
|
||||||
Update_t CmdViewOutput_Text82 (int nArgs);
|
Update_t CmdViewOutput_Text82 (int nArgs);
|
||||||
|
|
||||||
Update_t CmdViewOutput_GRX (int nArgs);
|
Update_t CmdViewOutput_GRX (int nArgs);
|
||||||
Update_t CmdViewOutput_GR1 (int nArgs);
|
Update_t CmdViewOutput_GR1 (int nArgs);
|
||||||
Update_t CmdViewOutput_GR2 (int nArgs);
|
Update_t CmdViewOutput_GR2 (int nArgs);
|
||||||
Update_t CmdViewOutput_DGRX (int nArgs);
|
Update_t CmdViewOutput_DGRX (int nArgs);
|
||||||
Update_t CmdViewOutput_DGR1 (int nArgs);
|
Update_t CmdViewOutput_DGR1 (int nArgs);
|
||||||
Update_t CmdViewOutput_DGR2 (int nArgs);
|
Update_t CmdViewOutput_DGR2 (int nArgs);
|
||||||
|
|
||||||
Update_t CmdViewOutput_HGRX (int nArgs);
|
Update_t CmdViewOutput_HGRX (int nArgs);
|
||||||
Update_t CmdViewOutput_HGR1 (int nArgs);
|
Update_t CmdViewOutput_HGR1 (int nArgs);
|
||||||
Update_t CmdViewOutput_HGR2 (int nArgs);
|
Update_t CmdViewOutput_HGR2 (int nArgs);
|
||||||
Update_t CmdViewOutput_DHGRX (int nArgs);
|
Update_t CmdViewOutput_DHGRX (int nArgs);
|
||||||
Update_t CmdViewOutput_DHGR1 (int nArgs);
|
Update_t CmdViewOutput_DHGR1 (int nArgs);
|
||||||
Update_t CmdViewOutput_DHGR2 (int nArgs);
|
Update_t CmdViewOutput_DHGR2 (int nArgs);
|
||||||
// Watch
|
// Watch
|
||||||
Update_t CmdWatch (int nArgs);
|
Update_t CmdWatch (int nArgs);
|
||||||
Update_t CmdWatchAdd (int nArgs);
|
Update_t CmdWatchAdd (int nArgs);
|
||||||
Update_t CmdWatchClear (int nArgs);
|
Update_t CmdWatchClear (int nArgs);
|
||||||
Update_t CmdWatchDisable (int nArgs);
|
Update_t CmdWatchDisable (int nArgs);
|
||||||
Update_t CmdWatchEnable (int nArgs);
|
Update_t CmdWatchEnable (int nArgs);
|
||||||
Update_t CmdWatchList (int nArgs);
|
Update_t CmdWatchList (int nArgs);
|
||||||
// Update_t CmdWatchLoad (int nArgs);
|
// Update_t CmdWatchLoad (int nArgs);
|
||||||
Update_t CmdWatchSave (int nArgs);
|
Update_t CmdWatchSave (int nArgs);
|
||||||
// Window
|
// Window
|
||||||
Update_t CmdWindow (int nArgs);
|
Update_t CmdWindow (int nArgs);
|
||||||
Update_t CmdWindowCycleNext (int nArgs);
|
Update_t CmdWindowCycleNext (int nArgs);
|
||||||
Update_t CmdWindowCyclePrev (int nArgs);
|
Update_t CmdWindowCyclePrev (int nArgs);
|
||||||
Update_t CmdWindowLast (int nArgs);
|
Update_t CmdWindowLast (int nArgs);
|
||||||
|
|
||||||
Update_t CmdWindowShowCode (int nArgs);
|
Update_t CmdWindowShowCode (int nArgs);
|
||||||
Update_t CmdWindowShowCode1 (int nArgs);
|
Update_t CmdWindowShowCode1 (int nArgs);
|
||||||
Update_t CmdWindowShowCode2 (int nArgs);
|
Update_t CmdWindowShowCode2 (int nArgs);
|
||||||
Update_t CmdWindowShowData (int nArgs);
|
Update_t CmdWindowShowData (int nArgs);
|
||||||
Update_t CmdWindowShowData1 (int nArgs);
|
Update_t CmdWindowShowData1 (int nArgs);
|
||||||
Update_t CmdWindowShowData2 (int nArgs);
|
Update_t CmdWindowShowData2 (int nArgs);
|
||||||
Update_t CmdWindowShowSymbols1(int nArgs);
|
Update_t CmdWindowShowSymbols1 (int nArgs);
|
||||||
Update_t CmdWindowShowSymbols2(int nArgs);
|
Update_t CmdWindowShowSymbols2 (int nArgs);
|
||||||
Update_t CmdWindowShowSource (int nArgs);
|
Update_t CmdWindowShowSource (int nArgs);
|
||||||
Update_t CmdWindowShowSource1 (int nArgs);
|
Update_t CmdWindowShowSource1 (int nArgs);
|
||||||
Update_t CmdWindowShowSource2 (int nArgs);
|
Update_t CmdWindowShowSource2 (int nArgs);
|
||||||
|
|
||||||
Update_t CmdWindowViewCode (int nArgs);
|
Update_t CmdWindowViewCode (int nArgs);
|
||||||
Update_t CmdWindowViewConsole (int nArgs);
|
Update_t CmdWindowViewConsole (int nArgs);
|
||||||
Update_t CmdWindowViewData (int nArgs);
|
Update_t CmdWindowViewData (int nArgs);
|
||||||
Update_t CmdWindowViewOutput (int nArgs);
|
Update_t CmdWindowViewOutput (int nArgs);
|
||||||
Update_t CmdWindowViewSource (int nArgs);
|
Update_t CmdWindowViewSource (int nArgs);
|
||||||
Update_t CmdWindowViewSymbols (int nArgs);
|
Update_t CmdWindowViewSymbols (int nArgs);
|
||||||
|
|
||||||
Update_t CmdWindowWidthToggle (int nArgs);
|
Update_t CmdWindowWidthToggle (int nArgs);
|
||||||
|
|
||||||
// Update_t CmdZeroPageShow (int nArgs);
|
|
||||||
// Update_t CmdZeroPageHide (int nArgs);
|
|
||||||
// Update_t CmdZeroPageToggle (int nArgs);
|
|
||||||
|
|
||||||
// ZeroPage
|
// ZeroPage
|
||||||
Update_t CmdZeroPage (int nArgs);
|
// Update_t CmdZeroPageShow (int nArgs);
|
||||||
Update_t CmdZeroPageAdd (int nArgs);
|
// Update_t CmdZeroPageHide (int nArgs);
|
||||||
Update_t CmdZeroPageClear (int nArgs);
|
// Update_t CmdZeroPageToggle (int nArgs);
|
||||||
Update_t CmdZeroPageDisable (int nArgs);
|
Update_t CmdZeroPage (int nArgs);
|
||||||
Update_t CmdZeroPageEnable (int nArgs);
|
Update_t CmdZeroPageAdd (int nArgs);
|
||||||
Update_t CmdZeroPageList (int nArgs);
|
Update_t CmdZeroPageClear (int nArgs);
|
||||||
// Update_t CmdZeroPageLoad (int nArgs);
|
Update_t CmdZeroPageDisable (int nArgs);
|
||||||
Update_t CmdZeroPageSave (int nArgs);
|
Update_t CmdZeroPageEnable (int nArgs);
|
||||||
Update_t CmdZeroPagePointer (int nArgs);
|
Update_t CmdZeroPageList (int nArgs);
|
||||||
|
// Update_t CmdZeroPageLoad (int nArgs);
|
||||||
|
Update_t CmdZeroPageSave (int nArgs);
|
||||||
|
Update_t CmdZeroPagePointer (int nArgs);
|
||||||
|
|
||||||
|
|
||||||
// Cursor _________________________________________________________________________________________
|
// Cursor _________________________________________________________________________________________
|
||||||
|
|
|
@ -1041,7 +1041,9 @@ eDetectResult C2IMGHelper::DetectHdr(LPBYTE& pImage, DWORD& dwImageSize, DWORD&
|
||||||
if (dwImageSize < sizeof(Header2IMG) || pHdr->FormatID != FormatID_2IMG || pHdr->HeaderSize != sizeof(Header2IMG))
|
if (dwImageSize < sizeof(Header2IMG) || pHdr->FormatID != FormatID_2IMG || pHdr->HeaderSize != sizeof(Header2IMG))
|
||||||
return eMismatch;
|
return eMismatch;
|
||||||
|
|
||||||
if (pHdr->Version != 1)
|
// https://github.com/AppleWin/AppleWin/issues/317
|
||||||
|
// Work around some lazy implementations of the spec that set this value to 0 instead of the correct 1.
|
||||||
|
if (pHdr->Version > 1)
|
||||||
return eMismatch;
|
return eMismatch;
|
||||||
|
|
||||||
if (dwImageSize < sizeof(Header2IMG)+pHdr->DiskDataLength)
|
if (dwImageSize < sizeof(Header2IMG)+pHdr->DiskDataLength)
|
||||||
|
|
351
source/Frame.cpp
|
@ -56,6 +56,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#include "Configuration\PropertySheet.h"
|
#include "Configuration\PropertySheet.h"
|
||||||
#include "Debugger\Debug.h"
|
#include "Debugger\Debug.h"
|
||||||
|
|
||||||
|
#define DIRECTX_PAGE_FLIP 1
|
||||||
|
|
||||||
//#define ENABLE_MENU 0
|
//#define ENABLE_MENU 0
|
||||||
|
|
||||||
// Magic numbers (used by FrameCreateWindow to calc width/height):
|
// Magic numbers (used by FrameCreateWindow to calc width/height):
|
||||||
|
@ -63,10 +65,10 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#define MAGICY 5 // 3D border between Apple window & Title bar
|
#define MAGICY 5 // 3D border between Apple window & Title bar
|
||||||
|
|
||||||
static const int kDEFAULT_VIEWPORT_SCALE = 2;
|
static const int kDEFAULT_VIEWPORT_SCALE = 2;
|
||||||
static int g_nViewportCX = FRAMEBUFFER_W * kDEFAULT_VIEWPORT_SCALE;
|
int g_nViewportCX = FRAMEBUFFER_BORDERLESS_W * kDEFAULT_VIEWPORT_SCALE;
|
||||||
static int g_nViewportCY = FRAMEBUFFER_H * kDEFAULT_VIEWPORT_SCALE;
|
int g_nViewportCY = FRAMEBUFFER_BORDERLESS_H * kDEFAULT_VIEWPORT_SCALE;
|
||||||
static int g_nViewportScale = kDEFAULT_VIEWPORT_SCALE; // saved REGSAVE
|
static int g_nViewportScale = kDEFAULT_VIEWPORT_SCALE; // saved REGSAVE
|
||||||
static int g_nMaxViewportScale = kDEFAULT_VIEWPORT_SCALE;
|
static int g_nMaxViewportScale = kDEFAULT_VIEWPORT_SCALE; // Max scale in Windowed mode with borders, buttons etc (full-screen may be +1)
|
||||||
|
|
||||||
#define BUTTONX (g_nViewportCX + VIEWPORTX*2)
|
#define BUTTONX (g_nViewportCX + VIEWPORTX*2)
|
||||||
#define BUTTONY 0
|
#define BUTTONY 0
|
||||||
|
@ -142,10 +144,14 @@ static int viewporty = VIEWPORTY; // Default to Normal (non-FullScreen
|
||||||
int g_nCharsetType = 0;
|
int g_nCharsetType = 0;
|
||||||
|
|
||||||
// Direct Draw -- For Full Screen
|
// Direct Draw -- For Full Screen
|
||||||
LPDIRECTDRAW g_pDD = (LPDIRECTDRAW)0;
|
LPDIRECTDRAW g_pDD = (LPDIRECTDRAW)0;
|
||||||
LPDIRECTDRAWSURFACE g_pDDPrimarySurface = (LPDIRECTDRAWSURFACE)0;
|
LPDIRECTDRAWSURFACE g_pDDPrimarySurface = (LPDIRECTDRAWSURFACE)0;
|
||||||
IDirectDrawPalette* g_pDDPal = (IDirectDrawPalette*)0;
|
#if DIRECTX_PAGE_FLIP
|
||||||
|
LPDIRECTDRAWSURFACE g_pDDBackSurface = (LPDIRECTDRAWSURFACE)0;
|
||||||
|
#endif
|
||||||
|
HDC g_hDDdc = 0;
|
||||||
|
int g_nDDFullScreenW = 640;
|
||||||
|
int g_nDDFullScreenH = 480;
|
||||||
|
|
||||||
static bool g_bShowingCursor = true;
|
static bool g_bShowingCursor = true;
|
||||||
static bool g_bLastCursorInAppleViewport = false;
|
static bool g_bLastCursorInAppleViewport = false;
|
||||||
|
@ -164,6 +170,19 @@ bool g_bScrollLock_FullSpeed = false;
|
||||||
bool g_bFreshReset = false;
|
bool g_bFreshReset = false;
|
||||||
static bool g_bFullScreen32Bit = true;
|
static bool g_bFullScreen32Bit = true;
|
||||||
|
|
||||||
|
#if 0 // enable non-integral full-screen scaling
|
||||||
|
#define FULLSCREEN_SCALE_TYPE float
|
||||||
|
#else
|
||||||
|
#define FULLSCREEN_SCALE_TYPE int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static RECT g_main_window_saved_rect;
|
||||||
|
static int g_main_window_saved_style;
|
||||||
|
static int g_main_window_saved_exstyle;
|
||||||
|
static FULLSCREEN_SCALE_TYPE g_win_fullscreen_scale = 1;
|
||||||
|
static int g_win_fullscreen_offsetx = 0;
|
||||||
|
static int g_win_fullscreen_offsety = 0;
|
||||||
|
|
||||||
// __ Prototypes __________________________________________________________________________________
|
// __ Prototypes __________________________________________________________________________________
|
||||||
static void DrawCrosshairs (int x, int y);
|
static void DrawCrosshairs (int x, int y);
|
||||||
static void FrameSetCursorPosByMousePos(int x, int y, int dx, int dy, bool bLeavingAppleScreen);
|
static void FrameSetCursorPosByMousePos(int x, int y, int dx, int dy, bool bLeavingAppleScreen);
|
||||||
|
@ -439,6 +458,8 @@ static void DrawButton (HDC passdc, int number) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
|
// NB. x=y=0 means erase only
|
||||||
static void DrawCrosshairs (int x, int y) {
|
static void DrawCrosshairs (int x, int y) {
|
||||||
static int lastx = 0;
|
static int lastx = 0;
|
||||||
static int lasty = 0;
|
static int lasty = 0;
|
||||||
|
@ -448,6 +469,7 @@ static void DrawCrosshairs (int x, int y) {
|
||||||
|
|
||||||
// ERASE THE OLD CROSSHAIRS
|
// ERASE THE OLD CROSSHAIRS
|
||||||
if (lastx && lasty)
|
if (lastx && lasty)
|
||||||
|
#if 0
|
||||||
if (g_bIsFullScreen) {
|
if (g_bIsFullScreen) {
|
||||||
int loop = 4;
|
int loop = 4;
|
||||||
while (loop--) {
|
while (loop--) {
|
||||||
|
@ -461,7 +483,25 @@ static void DrawCrosshairs (int x, int y) {
|
||||||
FillRect(dc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
|
FillRect(dc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
#else
|
||||||
|
if (g_bIsFullScreen)
|
||||||
|
{
|
||||||
|
int loop = 4;
|
||||||
|
while (loop--) {
|
||||||
|
RECT rect = {0,0,5,5};
|
||||||
|
switch (loop) {
|
||||||
|
case 0: OffsetRect(&rect, GetFullScreenOffsetX()+lastx-2, GetFullScreenOffsetY()+viewporty-5); break;
|
||||||
|
case 1: OffsetRect(&rect, GetFullScreenOffsetX()+lastx-2, GetFullScreenOffsetY()+viewporty+g_nViewportCY); break;
|
||||||
|
case 2: OffsetRect(&rect, GetFullScreenOffsetX()+viewportx-5, GetFullScreenOffsetY()+lasty-2); break;
|
||||||
|
case 3: OffsetRect(&rect, GetFullScreenOffsetX()+viewportx+g_nViewportCX, GetFullScreenOffsetY()+lasty-2); break;
|
||||||
|
}
|
||||||
|
FillRect(dc, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
int loop = 5;
|
int loop = 5;
|
||||||
while (loop--) {
|
while (loop--) {
|
||||||
switch (loop) {
|
switch (loop) {
|
||||||
|
@ -486,21 +526,42 @@ static void DrawCrosshairs (int x, int y) {
|
||||||
|
|
||||||
// DRAW THE NEW CROSSHAIRS
|
// DRAW THE NEW CROSSHAIRS
|
||||||
if (x && y) {
|
if (x && y) {
|
||||||
int loop = 4;
|
if (g_bIsFullScreen)
|
||||||
while (loop--) {
|
{
|
||||||
if ((loop == 1) || (loop == 2))
|
int loop = 4;
|
||||||
SelectObject(dc,GetStockObject(WHITE_PEN));
|
while (loop--) {
|
||||||
else
|
if ((loop == 1) || (loop == 2))
|
||||||
SelectObject(dc,GetStockObject(BLACK_PEN));
|
SelectObject(dc,GetStockObject(WHITE_PEN));
|
||||||
LINE(x+loop-2,viewporty-5,
|
else
|
||||||
x+loop-2,viewporty);
|
SelectObject(dc,GetStockObject(BLACK_PEN));
|
||||||
LINE(x+loop-2,viewporty+g_nViewportCY+4,
|
LINE(GetFullScreenOffsetX()+x+loop-2, GetFullScreenOffsetY()+viewporty-5,
|
||||||
x+loop-2,viewporty+g_nViewportCY-1);
|
GetFullScreenOffsetX()+x+loop-2, GetFullScreenOffsetY()+viewporty);
|
||||||
LINE(viewportx-5, y+loop-2,
|
LINE(GetFullScreenOffsetX()+x+loop-2, GetFullScreenOffsetY()+viewporty+g_nViewportCY+4,
|
||||||
viewportx, y+loop-2);
|
GetFullScreenOffsetX()+x+loop-2, GetFullScreenOffsetY()+viewporty+g_nViewportCY-1);
|
||||||
LINE(viewportx+g_nViewportCX+4,y+loop-2,
|
LINE(GetFullScreenOffsetX()+viewportx-5, GetFullScreenOffsetY()+y+loop-2,
|
||||||
viewportx+g_nViewportCX-1,y+loop-2);
|
GetFullScreenOffsetX()+viewportx, GetFullScreenOffsetY()+y+loop-2);
|
||||||
}
|
LINE(GetFullScreenOffsetX()+viewportx+g_nViewportCX+4, GetFullScreenOffsetY()+y+loop-2,
|
||||||
|
GetFullScreenOffsetX()+viewportx+g_nViewportCX-1, GetFullScreenOffsetY()+y+loop-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int loop = 4;
|
||||||
|
while (loop--) {
|
||||||
|
if ((loop == 1) || (loop == 2))
|
||||||
|
SelectObject(dc,GetStockObject(WHITE_PEN));
|
||||||
|
else
|
||||||
|
SelectObject(dc,GetStockObject(BLACK_PEN));
|
||||||
|
LINE(x+loop-2,viewporty-5,
|
||||||
|
x+loop-2,viewporty);
|
||||||
|
LINE(x+loop-2,viewporty+g_nViewportCY+4,
|
||||||
|
x+loop-2,viewporty+g_nViewportCY-1);
|
||||||
|
LINE(viewportx-5, y+loop-2,
|
||||||
|
viewportx, y+loop-2);
|
||||||
|
LINE(viewportx+g_nViewportCX+4,y+loop-2,
|
||||||
|
viewportx+g_nViewportCX-1,y+loop-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#undef LINE
|
#undef LINE
|
||||||
lastx = x;
|
lastx = x;
|
||||||
|
@ -517,8 +578,6 @@ static void DrawFrameWindow ()
|
||||||
? BeginPaint(g_hFrameWindow,&ps)
|
? BeginPaint(g_hFrameWindow,&ps)
|
||||||
: GetDC(g_hFrameWindow));
|
: GetDC(g_hFrameWindow));
|
||||||
|
|
||||||
VideoRealizePalette(dc);
|
|
||||||
|
|
||||||
if (!g_bIsFullScreen)
|
if (!g_bIsFullScreen)
|
||||||
{
|
{
|
||||||
// DRAW THE 3D BORDER AROUND THE EMULATED SCREEN
|
// DRAW THE 3D BORDER AROUND THE EMULATED SCREEN
|
||||||
|
@ -564,11 +623,9 @@ static void DrawFrameWindow ()
|
||||||
else if (g_nAppMode == MODE_DEBUG)
|
else if (g_nAppMode == MODE_DEBUG)
|
||||||
DebugDisplay(1);
|
DebugDisplay(1);
|
||||||
else
|
else
|
||||||
// Win7: In fullscreen mode with 1 redraw, the screen doesn't get redraw.
|
VideoRedrawScreen(0); // TODO: Presume this is correct with new fullscreen window mode
|
||||||
// TC: 07/01/2015: Tryed with MP's double-buffered DX full-screen code, but still the same.
|
//VideoRedrawScreen(g_bIsFullScreen ? 1 : 0); // On WM_PAINT: delay 1 refresh before rendering full-screen
|
||||||
VideoRedrawScreen(g_bIsFullScreen ? 2 : 1); // TC: 22/06/2014: Why 2 redraws in full-screen mode (32-bit only)? (8-bit doesn't need this nor does Win8, just Win7 or older OS's)
|
|
||||||
|
|
||||||
// DD Full-Screen Palette: BUGFIX: needs to come _after_ all drawing...
|
|
||||||
if (g_bPaintingWindow)
|
if (g_bPaintingWindow)
|
||||||
EndPaint(g_hFrameWindow,&ps);
|
EndPaint(g_hFrameWindow,&ps);
|
||||||
else
|
else
|
||||||
|
@ -907,9 +964,6 @@ static void EraseButton (int number) {
|
||||||
rect.top = buttony+number*BUTTONCY;
|
rect.top = buttony+number*BUTTONCY;
|
||||||
rect.bottom = rect.top+BUTTONCY;
|
rect.bottom = rect.top+BUTTONCY;
|
||||||
|
|
||||||
// TODO: DD Full-Screen Palette
|
|
||||||
// if( !g_bIsFullScreen )
|
|
||||||
|
|
||||||
InvalidateRect(g_hFrameWindow,&rect,1);
|
InvalidateRect(g_hFrameWindow,&rect,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -937,6 +991,8 @@ LRESULT CALLBACK FrameWndProc (
|
||||||
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
LogFileOutput("WM_CLOSE\n");
|
LogFileOutput("WM_CLOSE\n");
|
||||||
|
if (g_bIsFullScreen && restart)
|
||||||
|
g_bRestartFullScreen = true;
|
||||||
if (g_bIsFullScreen)
|
if (g_bIsFullScreen)
|
||||||
SetNormalMode();
|
SetNormalMode();
|
||||||
if (!IsIconic(window))
|
if (!IsIconic(window))
|
||||||
|
@ -1183,10 +1239,9 @@ LRESULT CALLBACK FrameWndProc (
|
||||||
DrawStatusArea( (HDC)0, DRAW_TITLE );
|
DrawStatusArea( (HDC)0, DRAW_TITLE );
|
||||||
|
|
||||||
VideoReinitialize();
|
VideoReinitialize();
|
||||||
if ((g_nAppMode != MODE_LOGO) || ((g_nAppMode == MODE_DEBUG) && (g_bDebuggerViewingAppleOutput)))
|
if (g_nAppMode != MODE_LOGO)
|
||||||
{
|
{
|
||||||
VideoRedrawScreen();
|
VideoRefreshScreen( g_nAppMode == MODE_DEBUG ? g_bDebuggerViewingAppleOutput : 0);
|
||||||
g_bDebuggerViewingAppleOutput = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Config_Save_Video();
|
Config_Save_Video();
|
||||||
|
@ -1490,26 +1545,10 @@ LRESULT CALLBACK FrameWndProc (
|
||||||
// message must not realize its palette, unless it determines that
|
// message must not realize its palette, unless it determines that
|
||||||
// wParam does not contain its own window handle.
|
// wParam does not contain its own window handle.
|
||||||
if ((HWND)wparam == window)
|
if ((HWND)wparam == window)
|
||||||
{
|
break;
|
||||||
#if DEBUG_DD_PALETTE
|
|
||||||
if( g_bIsFullScreen )
|
|
||||||
OutputDebugString( "WM_PALETTECHANGED: Full Screen\n" );
|
|
||||||
else
|
|
||||||
OutputDebugString( "WM_PALETTECHANGED: Windowed\n" );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// else fall through
|
// else fall through
|
||||||
|
|
||||||
case WM_QUERYNEWPALETTE:
|
case WM_QUERYNEWPALETTE:
|
||||||
#if DEBUG_DD_PALETTE
|
|
||||||
if( g_bIsFullScreen )
|
|
||||||
OutputDebugString( "WM_QUERYNEWPALETTE: Full Screen\n" );
|
|
||||||
else
|
|
||||||
OutputDebugString( "WM_QUERYNEWPALETTE: Windowed\n" );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TODO: DD Full-Screen Palette
|
|
||||||
DrawFrameWindow();
|
DrawFrameWindow();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1578,7 +1617,6 @@ LRESULT CALLBACK FrameWndProc (
|
||||||
OutputDebugString( "WM_SYSCOLORCHANGE: Windowed\n" );
|
OutputDebugString( "WM_SYSCOLORCHANGE: Windowed\n" );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO: DD Full-Screen Palette
|
|
||||||
DeleteGdiObjects();
|
DeleteGdiObjects();
|
||||||
CreateGdiObjects();
|
CreateGdiObjects();
|
||||||
break;
|
break;
|
||||||
|
@ -1738,7 +1776,6 @@ static void ScreenWindowResize(const bool bCtrlKey)
|
||||||
nOldViewportScale = g_nViewportScale;
|
nOldViewportScale = g_nViewportScale;
|
||||||
FrameResizeWindow(1); // reset to 1x
|
FrameResizeWindow(1); // reset to 1x
|
||||||
SetFullScreenMode();
|
SetFullScreenMode();
|
||||||
//VideoRedrawScreen(1); // [TC-10/06/2014] Remove this once checked it's not needed by Win8
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2064,6 +2101,16 @@ void SetFullScreen32Bit(bool b32Bit)
|
||||||
g_bFullScreen32Bit = b32Bit;
|
g_bFullScreen32Bit = b32Bit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GetFullScreenOffsetX(void)
|
||||||
|
{
|
||||||
|
return g_win_fullscreen_offsetx;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetFullScreenOffsetY(void)
|
||||||
|
{
|
||||||
|
return g_win_fullscreen_offsety;
|
||||||
|
}
|
||||||
|
|
||||||
void SetFullScreenMode ()
|
void SetFullScreenMode ()
|
||||||
{
|
{
|
||||||
#ifdef NO_DIRECT_X
|
#ifdef NO_DIRECT_X
|
||||||
|
@ -2072,31 +2119,78 @@ void SetFullScreenMode ()
|
||||||
|
|
||||||
#else // NO_DIRECT_X
|
#else // NO_DIRECT_X
|
||||||
|
|
||||||
g_bIsFullScreen = true;
|
MONITORINFO monitor_info;
|
||||||
|
FULLSCREEN_SCALE_TYPE width, height, scalex, scaley;
|
||||||
|
int top, left;
|
||||||
|
|
||||||
|
const int A2_WINDOW_WIDTH = FRAMEBUFFER_BORDERLESS_W;
|
||||||
|
const int A2_WINDOW_HEIGHT = FRAMEBUFFER_BORDERLESS_H;
|
||||||
|
|
||||||
buttonover = -1;
|
buttonover = -1;
|
||||||
|
#if 0
|
||||||
|
// FS: 640x480
|
||||||
buttonx = FSBUTTONX;
|
buttonx = FSBUTTONX;
|
||||||
buttony = FSBUTTONY;
|
buttony = FSBUTTONY;
|
||||||
viewportx = FSVIEWPORTX;
|
viewportx = FSVIEWPORTX;
|
||||||
viewporty = FSVIEWPORTY;
|
viewporty = FSVIEWPORTY;
|
||||||
GetWindowRect(g_hFrameWindow,&framerect);
|
#endif
|
||||||
SetWindowLong(g_hFrameWindow,GWL_STYLE,WS_POPUP | WS_SYSMENU | WS_VISIBLE);
|
|
||||||
|
|
||||||
DDSURFACEDESC ddsd;
|
g_main_window_saved_style = GetWindowLong(g_hFrameWindow, GWL_STYLE);
|
||||||
ddsd.dwSize = sizeof(ddsd);
|
g_main_window_saved_exstyle = GetWindowLong(g_hFrameWindow, GWL_EXSTYLE);
|
||||||
ddsd.dwFlags = DDSD_CAPS;
|
GetWindowRect(g_hFrameWindow, &g_main_window_saved_rect);
|
||||||
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
SetWindowLong(g_hFrameWindow, GWL_STYLE, g_main_window_saved_style & ~(WS_CAPTION | WS_THICKFRAME));
|
||||||
if (DirectDrawCreate(NULL,&g_pDD,NULL) != DD_OK ||
|
SetWindowLong(g_hFrameWindow, GWL_EXSTYLE, g_main_window_saved_exstyle & ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
|
||||||
g_pDD->SetCooperativeLevel(g_hFrameWindow,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK ||
|
|
||||||
g_pDD->SetDisplayMode(640,480,g_bFullScreen32Bit ? 32 : 8) != DD_OK ||
|
monitor_info.cbSize = sizeof(monitor_info);
|
||||||
g_pDD->CreateSurface(&ddsd,&g_pDDPrimarySurface,NULL) != DD_OK)
|
GetMonitorInfo(MonitorFromWindow(g_hFrameWindow, MONITOR_DEFAULTTONEAREST), &monitor_info);
|
||||||
{
|
left = monitor_info.rcMonitor.left;
|
||||||
g_pDDPrimarySurface = NULL;
|
top = monitor_info.rcMonitor.top;
|
||||||
SetNormalMode();
|
width = (FULLSCREEN_SCALE_TYPE)(monitor_info.rcMonitor.right - monitor_info.rcMonitor.left);
|
||||||
return;
|
height = (FULLSCREEN_SCALE_TYPE)(monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top);
|
||||||
}
|
scalex = width / A2_WINDOW_WIDTH;
|
||||||
|
scaley = height / A2_WINDOW_HEIGHT;
|
||||||
|
g_win_fullscreen_scale = (scalex <= scaley) ? scalex : scaley;
|
||||||
|
g_win_fullscreen_offsetx = ((int)width - (int)(g_win_fullscreen_scale * A2_WINDOW_WIDTH)) / 2;
|
||||||
|
g_win_fullscreen_offsety = ((int)height - (int)(g_win_fullscreen_scale * A2_WINDOW_HEIGHT)) / 2;
|
||||||
|
SetWindowPos(g_hFrameWindow, NULL, left, top, (int)width, (int)height, SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
|
||||||
|
g_bIsFullScreen = true;
|
||||||
|
|
||||||
// TODO: DD Full-Screen Palette
|
#if 1
|
||||||
// if( !g_bIsFullScreen )
|
// FS: desktop
|
||||||
|
SetViewportScale(g_win_fullscreen_scale, true);
|
||||||
|
|
||||||
|
buttonx = GetFullScreenOffsetX() + g_nViewportCX + VIEWPORTX*2;
|
||||||
|
buttony = GetFullScreenOffsetY();
|
||||||
|
viewportx = VIEWPORTX;
|
||||||
|
viewporty = VIEWPORTY;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// GetWindowRect(g_hFrameWindow,&framerect);
|
||||||
|
// SetWindowLong(g_hFrameWindow,GWL_STYLE,WS_POPUP | WS_SYSMENU | WS_VISIBLE);
|
||||||
|
//
|
||||||
|
// DDSURFACEDESC ddsd;
|
||||||
|
// ddsd.dwSize = sizeof(ddsd);
|
||||||
|
// ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
|
||||||
|
// ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
|
||||||
|
// ddsd.dwBackBufferCount = 1;
|
||||||
|
//
|
||||||
|
// DDSCAPS ddscaps;
|
||||||
|
// ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
|
||||||
|
//
|
||||||
|
// if ( 0
|
||||||
|
// || DD_OK != DirectDrawCreate(NULL,&g_pDD,NULL)
|
||||||
|
// || DD_OK != g_pDD->SetCooperativeLevel(g_hFrameWindow,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)
|
||||||
|
// || DD_OK != g_pDD->SetDisplayMode(g_nDDFullScreenW,g_nDDFullScreenH,32)
|
||||||
|
// || DD_OK != g_pDD->CreateSurface(&ddsd,&g_pDDPrimarySurface,NULL)
|
||||||
|
//#if DIRECTX_PAGE_FLIP
|
||||||
|
// || DD_OK != g_pDDPrimarySurface->GetAttachedSurface( &ddscaps, &g_pDDBackSurface)
|
||||||
|
//#endif
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// g_pDDPrimarySurface = NULL;
|
||||||
|
// SetNormalMode();
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
InvalidateRect(g_hFrameWindow,NULL,1);
|
InvalidateRect(g_hFrameWindow,NULL,1);
|
||||||
|
|
||||||
|
@ -2106,39 +2200,44 @@ void SetFullScreenMode ()
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
void SetNormalMode ()
|
void SetNormalMode ()
|
||||||
{
|
{
|
||||||
g_bIsFullScreen = false;
|
// g_bIsFullScreen = false;
|
||||||
buttonover = -1;
|
buttonover = -1;
|
||||||
buttonx = BUTTONX;
|
buttonx = BUTTONX;
|
||||||
buttony = BUTTONY;
|
buttony = BUTTONY;
|
||||||
viewportx = VIEWPORTX;
|
viewportx = VIEWPORTX;
|
||||||
viewporty = VIEWPORTY;
|
viewporty = VIEWPORTY;
|
||||||
g_pDD->RestoreDisplayMode();
|
|
||||||
g_pDD->SetCooperativeLevel(NULL,DDSCL_NORMAL);
|
|
||||||
SetWindowLong(g_hFrameWindow,GWL_STYLE,
|
|
||||||
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
|
|
||||||
WS_VISIBLE);
|
|
||||||
SetWindowPos(g_hFrameWindow,0,framerect.left,
|
|
||||||
framerect.top,
|
|
||||||
framerect.right - framerect.left,
|
|
||||||
framerect.bottom - framerect.top,
|
|
||||||
SWP_NOZORDER | SWP_FRAMECHANGED);
|
|
||||||
|
|
||||||
// DD Full-Screen Palette: BUGFIX: Re-attach new palette on next new surface
|
g_win_fullscreen_offsetx = 0;
|
||||||
// Delete Palette
|
g_win_fullscreen_offsety = 0;
|
||||||
if (g_pDDPal)
|
g_win_fullscreen_scale = 1;
|
||||||
{
|
SetWindowLong(g_hFrameWindow, GWL_STYLE, g_main_window_saved_style);
|
||||||
g_pDDPal->Release();
|
SetWindowLong(g_hFrameWindow, GWL_EXSTYLE, g_main_window_saved_exstyle);
|
||||||
g_pDDPal = (LPDIRECTDRAWPALETTE)0;
|
SetWindowPos(g_hFrameWindow, NULL,
|
||||||
}
|
g_main_window_saved_rect.left,
|
||||||
|
g_main_window_saved_rect.top,
|
||||||
|
g_main_window_saved_rect.right - g_main_window_saved_rect.left,
|
||||||
|
g_main_window_saved_rect.bottom - g_main_window_saved_rect.top,
|
||||||
|
SWP_SHOWWINDOW);
|
||||||
|
g_bIsFullScreen = false;
|
||||||
|
|
||||||
if (g_pDDPrimarySurface)
|
//g_pDD->RestoreDisplayMode();
|
||||||
{
|
//g_pDD->SetCooperativeLevel(NULL,DDSCL_NORMAL);
|
||||||
g_pDDPrimarySurface->Release();
|
//SetWindowLong(g_hFrameWindow,GWL_STYLE,
|
||||||
g_pDDPrimarySurface = (LPDIRECTDRAWSURFACE)0;
|
// WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
|
||||||
}
|
// WS_VISIBLE);
|
||||||
|
//SetWindowPos(g_hFrameWindow,0,framerect.left,
|
||||||
|
// framerect.top,
|
||||||
|
// framerect.right - framerect.left,
|
||||||
|
// framerect.bottom - framerect.top,
|
||||||
|
// SWP_NOZORDER | SWP_FRAMECHANGED);
|
||||||
|
//if (g_pDDPrimarySurface)
|
||||||
|
//{
|
||||||
|
// g_pDDPrimarySurface->Release();
|
||||||
|
// g_pDDPrimarySurface = (LPDIRECTDRAWSURFACE)0;
|
||||||
|
//}
|
||||||
|
|
||||||
g_pDD->Release();
|
//g_pDD->Release();
|
||||||
g_pDD = (LPDIRECTDRAW)0;
|
//g_pDD = (LPDIRECTDRAW)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -2178,14 +2277,14 @@ int GetViewportScale(void)
|
||||||
return g_nViewportScale;
|
return g_nViewportScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SetViewportScale(int nNewScale)
|
int SetViewportScale(int nNewScale, bool bForce /*=false*/)
|
||||||
{
|
{
|
||||||
if (nNewScale > g_nMaxViewportScale)
|
if (!bForce && nNewScale > g_nMaxViewportScale)
|
||||||
nNewScale = g_nMaxViewportScale;
|
nNewScale = g_nMaxViewportScale;
|
||||||
|
|
||||||
g_nViewportScale = nNewScale;
|
g_nViewportScale = nNewScale;
|
||||||
g_nViewportCX = g_nViewportScale * FRAMEBUFFER_W;
|
g_nViewportCX = g_nViewportScale * FRAMEBUFFER_BORDERLESS_W;
|
||||||
g_nViewportCY = g_nViewportScale * FRAMEBUFFER_H;
|
g_nViewportCY = g_nViewportScale * FRAMEBUFFER_BORDERLESS_H;
|
||||||
|
|
||||||
return nNewScale;
|
return nNewScale;
|
||||||
}
|
}
|
||||||
|
@ -2284,8 +2383,8 @@ void FrameCreateWindow(void)
|
||||||
int nOldViewportCX = g_nViewportCX;
|
int nOldViewportCX = g_nViewportCX;
|
||||||
int nOldViewportCY = g_nViewportCY;
|
int nOldViewportCY = g_nViewportCY;
|
||||||
|
|
||||||
g_nViewportCX = FRAMEBUFFER_W * 2;
|
g_nViewportCX = FRAMEBUFFER_BORDERLESS_W * 2;
|
||||||
g_nViewportCY = FRAMEBUFFER_H * 2;
|
g_nViewportCY = FRAMEBUFFER_BORDERLESS_H * 2;
|
||||||
GetWidthHeight(nWidth, nHeight); // Probe with 2x dimensions
|
GetWidthHeight(nWidth, nHeight); // Probe with 2x dimensions
|
||||||
|
|
||||||
g_nViewportCX = nOldViewportCX;
|
g_nViewportCX = nOldViewportCX;
|
||||||
|
@ -2376,14 +2475,22 @@ HDC FrameGetDC () {
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
HDC FrameGetVideoDC (LPBYTE *pAddr_, LONG *pPitch_)
|
HDC FrameGetVideoDC (LPBYTE *pAddr_, LONG *pPitch_)
|
||||||
{
|
{
|
||||||
|
HDC hDC = 0;
|
||||||
|
|
||||||
// ASSERT( pAddr_ );
|
// ASSERT( pAddr_ );
|
||||||
// ASSERT( pPitch_ );
|
// ASSERT( pPitch_ );
|
||||||
if (g_bIsFullScreen && g_bAppActive && !g_bPaintingWindow)
|
if (false) // TODO: ...
|
||||||
|
//if (g_bIsFullScreen && g_bAppActive && !g_bPaintingWindow)
|
||||||
{
|
{
|
||||||
RECT rect = { FSVIEWPORTX,
|
// Reference: http://archive.gamedev.net/archive/reference/articles/article608.html
|
||||||
FSVIEWPORTY,
|
// NTSC TODO: Are these coordinates correct?? Coordinates don't seem to matter on Win7 fullscreen!?
|
||||||
FSVIEWPORTX+g_nViewportCX,
|
// g_nViewportCX = FRAMEBUFFER_W * kDEFAULT_VIEWPORT_SCALE;
|
||||||
FSVIEWPORTY+g_nViewportCY};
|
RECT rect = {
|
||||||
|
FSVIEWPORTX,
|
||||||
|
FSVIEWPORTY,
|
||||||
|
FSVIEWPORTX+g_nViewportCX,
|
||||||
|
FSVIEWPORTY+g_nViewportCY
|
||||||
|
};
|
||||||
DDSURFACEDESC surfacedesc;
|
DDSURFACEDESC surfacedesc;
|
||||||
surfacedesc.dwSize = sizeof(surfacedesc);
|
surfacedesc.dwSize = sizeof(surfacedesc);
|
||||||
// TC: Use DDLOCK_WAIT - see Bug #13425
|
// TC: Use DDLOCK_WAIT - see Bug #13425
|
||||||
|
@ -2391,23 +2498,23 @@ HDC FrameGetVideoDC (LPBYTE *pAddr_, LONG *pPitch_)
|
||||||
{
|
{
|
||||||
g_pDDPrimarySurface->Restore();
|
g_pDDPrimarySurface->Restore();
|
||||||
g_pDDPrimarySurface->Lock(&rect,&surfacedesc,DDLOCK_WAIT,NULL);
|
g_pDDPrimarySurface->Lock(&rect,&surfacedesc,DDLOCK_WAIT,NULL);
|
||||||
|
|
||||||
// DD Full Screen Palette
|
|
||||||
// if (g_pDDPal)
|
|
||||||
// {
|
|
||||||
// g_pDDPrimarySurface->SetPalette(g_pDDPal); // this sets the palette for the primary surface
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
*pAddr_ = (LPBYTE)surfacedesc.lpSurface + (g_nViewportCY-1) * surfacedesc.lPitch;
|
*pAddr_ = (LPBYTE)surfacedesc.lpSurface + (g_nViewportCY-1) * surfacedesc.lPitch;
|
||||||
*pPitch_ = -surfacedesc.lPitch;
|
*pPitch_ = -surfacedesc.lPitch;
|
||||||
return (HDC)0;
|
|
||||||
|
if( g_pDDPrimarySurface->GetDC( &hDC ) == DD_OK )
|
||||||
|
g_hDDdc = hDC; // intentional "null" copy
|
||||||
|
else
|
||||||
|
hDC = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*pAddr_ = g_pFramebufferbits;
|
*pAddr_ = g_pFramebufferbits;
|
||||||
*pPitch_ = FRAMEBUFFER_W;
|
*pPitch_ = FRAMEBUFFER_W;
|
||||||
return FrameGetDC();
|
hDC = FrameGetDC();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return hDC;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -2449,7 +2556,8 @@ void FrameReleaseDC () {
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
void FrameReleaseVideoDC ()
|
void FrameReleaseVideoDC ()
|
||||||
{
|
{
|
||||||
if (g_bIsFullScreen && g_bAppActive && !g_bPaintingWindow)
|
if (false) // TODO: ...
|
||||||
|
//if (g_bIsFullScreen && g_bAppActive && !g_bPaintingWindow)
|
||||||
{
|
{
|
||||||
// THIS IS CORRECT ACCORDING TO THE DIRECTDRAW DOCS
|
// THIS IS CORRECT ACCORDING TO THE DIRECTDRAW DOCS
|
||||||
RECT rect = {
|
RECT rect = {
|
||||||
|
@ -2458,10 +2566,19 @@ void FrameReleaseVideoDC ()
|
||||||
FSVIEWPORTX+g_nViewportCX,
|
FSVIEWPORTX+g_nViewportCX,
|
||||||
FSVIEWPORTY+g_nViewportCY
|
FSVIEWPORTY+g_nViewportCY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//g_pDDBackSurface->BltFast( 0, 0, g_pDDPrimarySurface, &rcRect,DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
|
||||||
|
#if DIRECTX_PAGE_FLIP
|
||||||
|
g_pDDBackSurface->Flip( g_pDDPrimarySurface, 0 );
|
||||||
|
#endif
|
||||||
|
|
||||||
g_pDDPrimarySurface->Unlock(&rect);
|
g_pDDPrimarySurface->Unlock(&rect);
|
||||||
|
|
||||||
// BUT THIS SEEMS TO BE WORKING
|
// BUT THIS SEEMS TO BE WORKING
|
||||||
g_pDDPrimarySurface->Unlock(NULL);
|
g_pDDPrimarySurface->Unlock(NULL);
|
||||||
|
|
||||||
|
g_pDDPrimarySurface->ReleaseDC( g_hDDdc ); // NTSC Full Screen
|
||||||
|
g_hDDdc = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,27 +11,47 @@
|
||||||
#define VIEWPORTY 5
|
#define VIEWPORTY 5
|
||||||
|
|
||||||
// 560 = Double Hi-Res
|
// 560 = Double Hi-Res
|
||||||
// 384 = Doule Scan Line
|
// 384 = Double Scan Line
|
||||||
#define FRAMEBUFFER_W 560
|
#define FRAMEBUFFER_BORDERLESS_W 560
|
||||||
#define FRAMEBUFFER_H 384
|
#define FRAMEBUFFER_BORDERLESS_H 384
|
||||||
|
// NTSC_BEGIN
|
||||||
|
#if 0
|
||||||
|
// TC: No good as NTSC render code writes to border area:
|
||||||
|
// . NTSC.cpp: updateVideoScannerHorzEOL(): "NOTE: This writes out-of-bounds for a 560x384 framebuffer"
|
||||||
|
#define BORDER_W 0
|
||||||
|
#define BORDER_H 0
|
||||||
|
#define FRAMEBUFFER_W FRAMEBUFFER_BORDERLESS_W
|
||||||
|
#define FRAMEBUFFER_H FRAMEBUFFER_BORDERLESS_H
|
||||||
|
#else
|
||||||
|
#define BORDER_W 20
|
||||||
|
#define BORDER_H 18
|
||||||
|
#define FRAMEBUFFER_W (FRAMEBUFFER_BORDERLESS_W + BORDER_W*2)
|
||||||
|
#define FRAMEBUFFER_H (FRAMEBUFFER_BORDERLESS_H + BORDER_H*2)
|
||||||
|
#endif
|
||||||
|
// NTSC_END
|
||||||
|
|
||||||
// Direct Draw -- For Full Screen
|
// Direct Draw -- For Full Screen
|
||||||
extern LPDIRECTDRAW g_pDD;
|
extern LPDIRECTDRAW g_pDD;
|
||||||
extern LPDIRECTDRAWSURFACE g_pDDPrimarySurface;
|
extern LPDIRECTDRAWSURFACE g_pDDPrimarySurface;
|
||||||
extern IDirectDrawPalette* g_pDDPal;
|
extern int g_nDDFullScreenW;
|
||||||
|
extern int g_nDDFullScreenH;
|
||||||
|
|
||||||
// Win32
|
// Win32
|
||||||
extern HWND g_hFrameWindow;
|
extern HWND g_hFrameWindow;
|
||||||
extern BOOL g_bIsFullScreen;
|
extern BOOL g_bIsFullScreen;
|
||||||
|
extern int g_nViewportCX;
|
||||||
|
extern int g_nViewportCY;
|
||||||
extern BOOL g_bConfirmReboot; // saved PageConfig REGSAVE
|
extern BOOL g_bConfirmReboot; // saved PageConfig REGSAVE
|
||||||
extern BOOL g_bMultiMon;
|
extern BOOL g_bMultiMon;
|
||||||
|
|
||||||
|
|
||||||
// Emulator
|
// Emulator
|
||||||
extern bool g_bFreshReset;
|
extern bool g_bFreshReset;
|
||||||
extern std::string PathFilename[2];
|
extern std::string PathFilename[2];
|
||||||
extern bool g_bScrollLock_FullSpeed;
|
extern bool g_bScrollLock_FullSpeed;
|
||||||
extern int g_nCharsetType;
|
extern int g_nCharsetType;
|
||||||
|
|
||||||
|
|
||||||
// Prototypes
|
// Prototypes
|
||||||
void CtrlReset();
|
void CtrlReset();
|
||||||
|
|
||||||
|
@ -44,7 +64,7 @@
|
||||||
void FrameReleaseVideoDC ();
|
void FrameReleaseVideoDC ();
|
||||||
void FrameSetCursorPosByMousePos();
|
void FrameSetCursorPosByMousePos();
|
||||||
int GetViewportScale(void);
|
int GetViewportScale(void);
|
||||||
int SetViewportScale(int nNewScale);
|
int SetViewportScale(int nNewScale, bool bForce = false);
|
||||||
void GetViewportCXCY(int& nViewportCX, int& nViewportCY);
|
void GetViewportCXCY(int& nViewportCX, int& nViewportCY);
|
||||||
bool GetFullScreen32Bit(void);
|
bool GetFullScreen32Bit(void);
|
||||||
void SetFullScreen32Bit(bool b32Bit);
|
void SetFullScreen32Bit(bool b32Bit);
|
||||||
|
@ -59,3 +79,5 @@
|
||||||
WPARAM wparam,
|
WPARAM wparam,
|
||||||
LPARAM lparam );
|
LPARAM lparam );
|
||||||
|
|
||||||
|
int GetFullScreenOffsetX(void);
|
||||||
|
int GetFullScreenOffsetY(void);
|
||||||
|
|
|
@ -40,6 +40,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
#include "Memory.h"
|
#include "Memory.h"
|
||||||
#include "Mockingboard.h"
|
#include "Mockingboard.h"
|
||||||
#include "MouseInterface.h"
|
#include "MouseInterface.h"
|
||||||
|
#include "NTSC.h"
|
||||||
#include "NoSlotClock.h"
|
#include "NoSlotClock.h"
|
||||||
#include "ParallelPrinter.h"
|
#include "ParallelPrinter.h"
|
||||||
#include "Registry.h"
|
#include "Registry.h"
|
||||||
|
@ -234,7 +235,7 @@ static BYTE __stdcall IORead_C01x(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG
|
||||||
case 0x6: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
case 0x6: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
||||||
case 0x7: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
case 0x7: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
||||||
case 0x8: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
case 0x8: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
||||||
case 0x9: return VideoCheckVbl(pc, addr, bWrite, d, nCyclesLeft);
|
case 0x9: return VideoCheckVbl(nCyclesLeft);
|
||||||
case 0xA: return VideoCheckMode(pc, addr, bWrite, d, nCyclesLeft);
|
case 0xA: return VideoCheckMode(pc, addr, bWrite, d, nCyclesLeft);
|
||||||
case 0xB: return VideoCheckMode(pc, addr, bWrite, d, nCyclesLeft);
|
case 0xB: return VideoCheckMode(pc, addr, bWrite, d, nCyclesLeft);
|
||||||
case 0xC: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
case 0xC: return MemCheckPaging(pc, addr, bWrite, d, nCyclesLeft);
|
||||||
|
@ -1495,13 +1496,35 @@ void MemReset()
|
||||||
|
|
||||||
BYTE MemReadFloatingBus(const ULONG uExecutedCycles)
|
BYTE MemReadFloatingBus(const ULONG uExecutedCycles)
|
||||||
{
|
{
|
||||||
return*(LPBYTE)(mem + VideoGetScannerAddress(NULL, uExecutedCycles));
|
#if 0
|
||||||
|
// NTSC: It is tempting to replace with
|
||||||
|
// return NTSC_VideoGetScannerAddress( uExecutedCycles );
|
||||||
|
// But that breaks "Rainbow" Bug #254 if NTSC_VideoGetScannerAddress() is not correct.
|
||||||
|
// This is out of sync with VideoGetScannerAddress() due to two reasons:
|
||||||
|
// a) returning a cached copy of g_aHorzClockMemAddress
|
||||||
|
// Fixed by calling: updateVideoScannerAddressTXT or updateVideoScannerAddressHGR()
|
||||||
|
// b) A bug? in APPLE_IIE_HORZ_CLOCK_OFFSET[0][8] containing the incorrect value of 0x006F
|
||||||
|
uint16_t addr1 = NTSC_VideoGetScannerAddress( uExecutedCycles );
|
||||||
|
uint16_t addr2 = VideoGetScannerAddress(NULL, uExecutedCycles);
|
||||||
|
uint8_t byte1 = mem[ addr1 ];
|
||||||
|
uint8_t byte2 = mem[ addr2 ];
|
||||||
|
|
||||||
|
if( byte1 != byte2 )
|
||||||
|
mem[ 0x2000 ] ^= 0xFF;
|
||||||
|
#endif
|
||||||
|
// return mem[ VideoGetScannerAddress(NULL, uExecutedCycles) ];
|
||||||
|
uint16_t addr = NTSC_VideoGetScannerAddress( uExecutedCycles );
|
||||||
|
return mem[ addr ] ; // cycles is ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
BYTE MemReadFloatingBus(const BYTE highbit, const ULONG uExecutedCycles)
|
BYTE MemReadFloatingBus(const BYTE highbit, const ULONG uExecutedCycles)
|
||||||
{
|
{
|
||||||
|
// NTSC: It is tempting to replace with
|
||||||
|
// return NTSC_VideoGetScannerAddress( uExecutedCycles );
|
||||||
|
// But that breaks "Rainbow" Bug #254
|
||||||
|
// BYTE r= NTSC_VideoGetByte( uExecutedCycles );
|
||||||
BYTE r = *(LPBYTE)(mem + VideoGetScannerAddress(NULL, uExecutedCycles));
|
BYTE r = *(LPBYTE)(mem + VideoGetScannerAddress(NULL, uExecutedCycles));
|
||||||
return (r & ~0x80) | ((highbit) ? 0x80 : 0);
|
return (r & ~0x80) | ((highbit) ? 0x80 : 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -741,7 +741,7 @@ static void Votrax_Write(BYTE nDevice, BYTE nValue)
|
||||||
|
|
||||||
static void MB_Update()
|
static void MB_Update()
|
||||||
{
|
{
|
||||||
char szDbg[200];
|
//char szDbg[200];
|
||||||
|
|
||||||
if (!MockingboardVoice.bActive)
|
if (!MockingboardVoice.bActive)
|
||||||
return;
|
return;
|
||||||
|
@ -828,9 +828,9 @@ static void MB_Update()
|
||||||
if((dwByteOffset > dwCurrentPlayCursor) && (dwByteOffset < dwCurrentWriteCursor))
|
if((dwByteOffset > dwCurrentPlayCursor) && (dwByteOffset < dwCurrentWriteCursor))
|
||||||
{
|
{
|
||||||
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
||||||
sprintf(szDbg, "%010.3f: [MBUpdt] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X xxx\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
//sprintf(szDbg, "%010.3f: [MBUpdt] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X xxx\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
||||||
OutputDebugString(szDbg);
|
//OutputDebugString(szDbg);
|
||||||
if (g_fh) fprintf(g_fh, "%s", szDbg);
|
//if (g_fh) fprintf(g_fh, "%s", szDbg);
|
||||||
|
|
||||||
dwByteOffset = dwCurrentWriteCursor;
|
dwByteOffset = dwCurrentWriteCursor;
|
||||||
}
|
}
|
||||||
|
@ -841,9 +841,9 @@ static void MB_Update()
|
||||||
if((dwByteOffset > dwCurrentPlayCursor) || (dwByteOffset < dwCurrentWriteCursor))
|
if((dwByteOffset > dwCurrentPlayCursor) || (dwByteOffset < dwCurrentWriteCursor))
|
||||||
{
|
{
|
||||||
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
||||||
sprintf(szDbg, "%010.3f: [MBUpdt] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X XXX\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
//sprintf(szDbg, "%010.3f: [MBUpdt] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X XXX\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
||||||
OutputDebugString(szDbg);
|
//OutputDebugString(szDbg);
|
||||||
if (g_fh) fprintf(g_fh, "%s", szDbg);
|
//if (g_fh) fprintf(g_fh, "%s", szDbg);
|
||||||
|
|
||||||
dwByteOffset = dwCurrentWriteCursor;
|
dwByteOffset = dwCurrentWriteCursor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Constants
|
||||||
|
const int VIDEO_SCANNER_6502_CYCLES = 17030;
|
||||||
|
|
||||||
|
// Globals (Public)
|
||||||
|
extern uint16_t g_nVideoClockVert;
|
||||||
|
extern uint16_t g_nVideoClockHorz;
|
||||||
|
extern uint32_t g_nChromaSize;
|
||||||
|
|
||||||
|
// Prototypes (Public) ________________________________________________
|
||||||
|
extern void NTSC_SetVideoMode( int bVideoModeFlags );
|
||||||
|
extern void NTSC_SetVideoStyle();
|
||||||
|
extern void NTSC_SetVideoTextMode( int cols );
|
||||||
|
extern uint32_t*NTSC_VideoGetChromaTable( bool bHueTypeMonochrome, bool bMonitorTypeColorTV );
|
||||||
|
extern uint16_t NTSC_VideoGetScannerAddress( unsigned long cycles6502 );
|
||||||
|
extern void NTSC_VideoInit( uint8_t *pFramebuffer );
|
||||||
|
extern void NTSC_VideoReinitialize( DWORD cyclesThisFrame );
|
||||||
|
extern void NTSC_VideoInitAppleType();
|
||||||
|
extern void NTSC_VideoInitChroma();
|
||||||
|
extern bool NTSC_VideoIsVbl();
|
||||||
|
extern void NTSC_VideoUpdateCycles( long cycles6502 );
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
AppleWin : An Apple //e emulator for Windows
|
||||||
|
|
||||||
|
Copyright (C) 2010-2011, William S Simms
|
||||||
|
Copyright (C) 2016, Tom Charlesworth
|
||||||
|
|
||||||
|
AppleWin is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
AppleWin is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with AppleWin; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include "AppleWin.h"
|
||||||
|
|
||||||
|
#include "NTSC_CharSet.h"
|
||||||
|
|
||||||
|
unsigned char csbits_enhanced2e[2][256][8]; // Enhanced //e
|
||||||
|
unsigned char csbits_2e[2][256][8]; // Original //e (no mousetext)
|
||||||
|
unsigned char csbits_a2[1][256][8]; // ][ and ][+
|
||||||
|
unsigned char csbits_pravets82[1][256][8]; // Pravets 82
|
||||||
|
unsigned char csbits_pravets8M[1][256][8]; // Pravets 8M
|
||||||
|
unsigned char csbits_pravets8C[2][256][8]; // Pravets 8A & 8C
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
static const UINT bitmapWidth = 256;
|
||||||
|
static const UINT bitmapWidthBytes = bitmapWidth/8;
|
||||||
|
static const UINT bitmapHeight = 768;
|
||||||
|
|
||||||
|
static const UINT charWidth = 16;
|
||||||
|
static const UINT charWidthBytes = 16/8;
|
||||||
|
static const UINT charHeight = 16;
|
||||||
|
|
||||||
|
static void get_csbits_xy(csbits_t csbits, UINT ch, UINT cx, UINT cy, const BYTE* pBitmap)
|
||||||
|
{
|
||||||
|
_ASSERT(ch < 256);
|
||||||
|
_ASSERT((cx < bitmapWidth/charWidth) && (cy < bitmapHeight/charHeight));
|
||||||
|
|
||||||
|
pBitmap += cy*charHeight*bitmapWidthBytes + cx*charWidthBytes;
|
||||||
|
|
||||||
|
for (UINT y=0; y<8; y++)
|
||||||
|
{
|
||||||
|
BYTE n = 0;
|
||||||
|
for (int x=0; x<14; x+=2)
|
||||||
|
{
|
||||||
|
UINT xp = x/8;
|
||||||
|
BYTE d = pBitmap[xp];
|
||||||
|
UINT b = 7 - x%8;
|
||||||
|
if (d & (1<<b)) n |= 0x80;
|
||||||
|
n >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
csbits[0][ch][y] = n;
|
||||||
|
pBitmap += bitmapWidthBytes*2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void get_csbits(csbits_t csbits, const char* resourceName, const UINT cy0)
|
||||||
|
{
|
||||||
|
const UINT bufferSize = bitmapWidthBytes*bitmapHeight;
|
||||||
|
BYTE* pBuffer = new BYTE [bufferSize];
|
||||||
|
|
||||||
|
HBITMAP hCharBitmap = LoadBitmap(g_hInstance, resourceName);
|
||||||
|
GetBitmapBits(hCharBitmap, bufferSize, pBuffer);
|
||||||
|
|
||||||
|
for (UINT cy=cy0, ch=0; cy<cy0+16; cy++)
|
||||||
|
{
|
||||||
|
for (UINT cx=0; cx<16; cx++)
|
||||||
|
{
|
||||||
|
get_csbits_xy(csbits, ch++, cx, cy, pBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DeleteObject(hCharBitmap);
|
||||||
|
|
||||||
|
delete [] pBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void make_csbits(void)
|
||||||
|
{
|
||||||
|
get_csbits(&csbits_enhanced2e[0], TEXT("CHARSET40"), 0); // Enhanced //e: Alt char set off
|
||||||
|
get_csbits(&csbits_enhanced2e[1], TEXT("CHARSET40"), 16); // Enhanced //e: Alt char set on (mousetext)
|
||||||
|
get_csbits(&csbits_a2[0], TEXT("CHARSET40"), 32); // Apple ][, ][+
|
||||||
|
get_csbits(&csbits_pravets82[0], TEXT("CHARSET82"), 0); // Pravets 82
|
||||||
|
get_csbits(&csbits_pravets8M[0], TEXT("CHARSET8M"), 0); // Pravets 8M
|
||||||
|
get_csbits(&csbits_pravets8C[0], TEXT("CHARSET8C"), 0); // Pravets 8A / 8C: Alt char set off
|
||||||
|
get_csbits(&csbits_pravets8C[1], TEXT("CHARSET8C"), 16); // Pravets 8A / 8C: Alt char set on
|
||||||
|
|
||||||
|
// Original //e is just Enhanced //e with the 32 mousetext chars [0x40..0x5F] replaced by the non-alt charset chars [0x40..0x5F]
|
||||||
|
memcpy(csbits_2e, csbits_enhanced2e, sizeof(csbits_enhanced2e));
|
||||||
|
memcpy(&csbits_2e[1][64], &csbits_2e[0][64], 32*8);
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
typedef unsigned char (*csbits_t)[256][8];
|
||||||
|
|
||||||
|
extern unsigned char csbits_enhanced2e[2][256][8]; // Enhanced //e
|
||||||
|
extern unsigned char csbits_2e[2][256][8]; // Original //e (no mousetext)
|
||||||
|
extern unsigned char csbits_a2[1][256][8]; // ][ and ][+
|
||||||
|
extern unsigned char csbits_pravets82[1][256][8]; // Pravets 82
|
||||||
|
extern unsigned char csbits_pravets8M[1][256][8]; // Pravets 8M
|
||||||
|
extern unsigned char csbits_pravets8C[2][256][8]; // Pravets 8A & 8C
|
||||||
|
|
||||||
|
void make_csbits(void);
|
|
@ -208,6 +208,8 @@ static void Snapshot_LoadState_v1() // .aws v1.0.0.1, up to (and including) Appl
|
||||||
SetLoadedSaveStateFlag(true);
|
SetLoadedSaveStateFlag(true);
|
||||||
|
|
||||||
MemUpdatePaging(TRUE);
|
MemUpdatePaging(TRUE);
|
||||||
|
|
||||||
|
VideoReinitialize(); // g_CharsetType changed
|
||||||
}
|
}
|
||||||
catch(std::string szMessage)
|
catch(std::string szMessage)
|
||||||
{
|
{
|
||||||
|
|
|
@ -822,7 +822,7 @@ static ULONG Spkr_SubmitWaveBuffer_FullSpeed(short* pSpeakerBuffer, ULONG nNumSa
|
||||||
|
|
||||||
static ULONG Spkr_SubmitWaveBuffer(short* pSpeakerBuffer, ULONG nNumSamples)
|
static ULONG Spkr_SubmitWaveBuffer(short* pSpeakerBuffer, ULONG nNumSamples)
|
||||||
{
|
{
|
||||||
char szDbg[200];
|
//char szDbg[200];
|
||||||
nDbgSpkrCnt++;
|
nDbgSpkrCnt++;
|
||||||
|
|
||||||
if(!SpeakerVoice.bActive)
|
if(!SpeakerVoice.bActive)
|
||||||
|
@ -870,9 +870,9 @@ static ULONG Spkr_SubmitWaveBuffer(short* pSpeakerBuffer, ULONG nNumSamples)
|
||||||
if((dwByteOffset > dwCurrentPlayCursor) && (dwByteOffset < dwCurrentWriteCursor))
|
if((dwByteOffset > dwCurrentPlayCursor) && (dwByteOffset < dwCurrentWriteCursor))
|
||||||
{
|
{
|
||||||
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
||||||
sprintf(szDbg, "%010.3f: [Submit] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X xxx\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
//sprintf(szDbg, "%010.3f: [Submit] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X xxx\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
||||||
OutputDebugString(szDbg);
|
//OutputDebugString(szDbg);
|
||||||
if (g_fh) fprintf(g_fh, szDbg);
|
//if (g_fh) fprintf(g_fh, szDbg);
|
||||||
|
|
||||||
dwByteOffset = dwCurrentWriteCursor;
|
dwByteOffset = dwCurrentWriteCursor;
|
||||||
nNumSamplesError = 0;
|
nNumSamplesError = 0;
|
||||||
|
@ -885,9 +885,9 @@ static ULONG Spkr_SubmitWaveBuffer(short* pSpeakerBuffer, ULONG nNumSamples)
|
||||||
if((dwByteOffset > dwCurrentPlayCursor) || (dwByteOffset < dwCurrentWriteCursor))
|
if((dwByteOffset > dwCurrentPlayCursor) || (dwByteOffset < dwCurrentWriteCursor))
|
||||||
{
|
{
|
||||||
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
double fTicksSecs = (double)GetTickCount() / 1000.0;
|
||||||
sprintf(szDbg, "%010.3f: [Submit] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X XXX\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
//sprintf(szDbg, "%010.3f: [Submit] PC=%08X, WC=%08X, Diff=%08X, Off=%08X, NS=%08X XXX\n", fTicksSecs, dwCurrentPlayCursor, dwCurrentWriteCursor, dwCurrentWriteCursor-dwCurrentPlayCursor, dwByteOffset, nNumSamples);
|
||||||
OutputDebugString(szDbg);
|
//OutputDebugString(szDbg);
|
||||||
if (g_fh) fprintf(g_fh, "%s", szDbg);
|
//if (g_fh) fprintf(g_fh, "%s", szDbg);
|
||||||
|
|
||||||
dwByteOffset = dwCurrentWriteCursor;
|
dwByteOffset = dwCurrentWriteCursor;
|
||||||
nNumSamplesError = 0;
|
nNumSamplesError = 0;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
// . See: http://support.embarcadero.com/article/35754
|
// . See: http://support.embarcadero.com/article/35754
|
||||||
// . "GetOpenFileName() fails under Windows 95/98/NT/ME due to incorrect OPENFILENAME structure size"
|
// . "GetOpenFileName() fails under Windows 95/98/NT/ME due to incorrect OPENFILENAME structure size"
|
||||||
#define _WIN32_WINNT 0x0400
|
#define _WIN32_WINNT 0x0400
|
||||||
|
#define WINVER 0x500
|
||||||
|
|
||||||
// Mouse Wheel is not supported on Win95.
|
// Mouse Wheel is not supported on Win95.
|
||||||
// If we didn't care about supporting Win95 (compile/run-time errors)
|
// If we didn't care about supporting Win95 (compile/run-time errors)
|
||||||
|
@ -14,7 +15,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Not needed in VC7.1, but needed in VC Express
|
// Not needed in VC7.1, but needed in VC Express
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
#include <crtdbg.h>
|
#include <crtdbg.h>
|
||||||
#include <dsound.h>
|
#include <dsound.h>
|
||||||
|
@ -27,6 +28,9 @@
|
||||||
#if _MSC_VER >= 1600 // <stdint.h> supported from VS2010 (cl.exe v16.00)
|
#if _MSC_VER >= 1600 // <stdint.h> supported from VS2010 (cl.exe v16.00)
|
||||||
#include <stdint.h> // cleanup WORD DWORD -> uint16_t uint32_t
|
#include <stdint.h> // cleanup WORD DWORD -> uint16_t uint32_t
|
||||||
#else
|
#else
|
||||||
|
typedef UINT8 uint8_t;
|
||||||
|
typedef UINT16 uint16_t;
|
||||||
|
typedef UINT32 uint32_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
2298
source/Video.cpp
190
source/Video.h
|
@ -6,73 +6,177 @@
|
||||||
// NOTE: Used/Serialized by: g_eVideoType
|
// NOTE: Used/Serialized by: g_eVideoType
|
||||||
enum VideoType_e
|
enum VideoType_e
|
||||||
{
|
{
|
||||||
VT_MONO_HALFPIXEL_REAL // uses custom monochrome
|
VT_MONO_CUSTOM
|
||||||
, VT_COLOR_STANDARD
|
, VT_COLOR_MONITOR
|
||||||
, VT_COLOR_TEXT_OPTIMIZED
|
, VT_MONO_TV
|
||||||
, VT_COLOR_TVEMU
|
, VT_COLOR_TV
|
||||||
, VT_MONO_AMBER // now half pixel
|
, VT_MONO_AMBER
|
||||||
, VT_MONO_GREEN // now half pixel
|
, VT_MONO_GREEN
|
||||||
, VT_MONO_WHITE // now half pixel
|
, VT_MONO_WHITE
|
||||||
, NUM_VIDEO_MODES
|
, NUM_VIDEO_MODES
|
||||||
};
|
};
|
||||||
|
|
||||||
extern TCHAR g_aVideoChoices[];
|
extern TCHAR g_aVideoChoices[];
|
||||||
extern char *g_apVideoModeDesc[ NUM_VIDEO_MODES ];
|
extern char *g_apVideoModeDesc[ NUM_VIDEO_MODES ];
|
||||||
|
|
||||||
enum AppleFont_e
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
// Each cell has a reserved aligned pixel area (grid spacing)
|
||||||
|
APPLE_FONT_CELL_WIDTH = 16,
|
||||||
|
APPLE_FONT_CELL_HEIGHT = 16,
|
||||||
|
|
||||||
|
// 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, // ][
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
/// turn of MSVC struct member padding
|
||||||
|
#pragma pack(push,1)
|
||||||
|
#define PACKED
|
||||||
|
#else
|
||||||
|
#define PACKED // TODO: FIXME: gcc/clang __attribute__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct bgra_t
|
||||||
{
|
{
|
||||||
// 40-Column mode is 1x Zoom (default)
|
uint8_t b;
|
||||||
// 80-Column mode is ~0.75x Zoom (7 x 16)
|
uint8_t g;
|
||||||
// Tiny mode is 0.5 zoom (7x8) for debugger
|
uint8_t r;
|
||||||
APPLE_FONT_WIDTH = 14, // in pixels
|
uint8_t a; // reserved on Win32
|
||||||
APPLE_FONT_HEIGHT = 16, // in pixels
|
|
||||||
|
|
||||||
// Each cell has a reserved aligned pixel area (grid spacing)
|
|
||||||
APPLE_FONT_CELL_WIDTH = 16,
|
|
||||||
APPLE_FONT_CELL_HEIGHT = 16,
|
|
||||||
|
|
||||||
// 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, // ][
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct WinBmpHeader_t
|
||||||
|
{
|
||||||
|
// BITMAPFILEHEADER // Addr Size
|
||||||
|
uint8_t nCookie[2] ; // 0x00 0x02 BM
|
||||||
|
uint32_t nSizeFile ; // 0x02 0x04 0 = ignore
|
||||||
|
uint16_t nReserved1 ; // 0x06 0x02
|
||||||
|
uint16_t nReserved2 ; // 0x08 0x02
|
||||||
|
uint32_t nOffsetData ; // 0x0A 0x04
|
||||||
|
// == 0x0D (14)
|
||||||
|
|
||||||
|
// BITMAPINFOHEADER
|
||||||
|
uint32_t nStructSize ; // 0x0E 0x04 biSize
|
||||||
|
uint32_t nWidthPixels ; // 0x12 0x04 biWidth
|
||||||
|
uint32_t nHeightPixels ; // 0x16 0x04 biHeight
|
||||||
|
uint16_t nPlanes ; // 0x1A 0x02 biPlanes
|
||||||
|
uint16_t nBitsPerPixel ; // 0x1C 0x02 biBitCount
|
||||||
|
uint32_t nCompression ; // 0x1E 0x04 biCompression 0 = BI_RGB
|
||||||
|
uint32_t nSizeImage ; // 0x22 0x04 0 = ignore
|
||||||
|
uint32_t nXPelsPerMeter ; // 0x26 0x04
|
||||||
|
uint32_t nYPelsPerMeter ; // 0x2A 0x04
|
||||||
|
uint32_t nPaletteColors ; // 0x2E 0x04
|
||||||
|
uint32_t nImportantColors; // 0x32 0x04
|
||||||
|
// == 0x28 (40)
|
||||||
|
|
||||||
|
// RGBQUAD
|
||||||
|
// pixelmap
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WinCIEXYZ
|
||||||
|
{
|
||||||
|
uint32_t r; // fixed point 2.30
|
||||||
|
uint32_t g; // fixed point 2.30
|
||||||
|
uint32_t b; // fixed point 2.30
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WinBmpHeader4_t
|
||||||
|
{
|
||||||
|
// BITMAPFILEHEADER // Addr Size
|
||||||
|
uint8_t nCookie[2] ; // 0x00 0x02 BM
|
||||||
|
uint32_t nSizeFile ; // 0x02 0x04 0 = ignore
|
||||||
|
uint16_t nReserved1 ; // 0x06 0x02
|
||||||
|
uint16_t nReserved2 ; // 0x08 0x02
|
||||||
|
uint32_t nOffsetData ; // 0x0A 0x04
|
||||||
|
// ==== 0x0D (14)
|
||||||
|
|
||||||
|
// BITMAPINFOHEADER
|
||||||
|
uint32_t nStructSize ; // 0x0E 0x04 biSize
|
||||||
|
uint32_t nWidthPixels ; // 0x12 0x04 biWidth
|
||||||
|
uint32_t nHeightPixels ; // 0x16 0x04 biHeight
|
||||||
|
uint16_t nPlanes ; // 0x1A 0x02 biPlanes
|
||||||
|
uint16_t nBitsPerPixel ; // 0x1C 0x02 biBitCount
|
||||||
|
uint32_t nCompression ; // 0x1E 0x04 biCompression 0 = BI_RGB
|
||||||
|
uint32_t nSizeImage ; // 0x22 0x04 0 = ignore
|
||||||
|
uint32_t nXPelsPerMeter ; // 0x26 0x04
|
||||||
|
uint32_t nYPelsPerMeter ; // 0x2A 0x04
|
||||||
|
uint32_t nPaletteColors ; // 0x2E 0x04
|
||||||
|
uint32_t nImportantColors; // 0x32 0x04
|
||||||
|
// ==== 0x28 (40)
|
||||||
|
|
||||||
|
//BITMAPV4HEADER new fields
|
||||||
|
uint32_t nRedMask ; // 0x36 0x04
|
||||||
|
uint32_t nGreenMask ; // 0x3A 0x04
|
||||||
|
uint32_t nBlueMask ; // 0x3E 0x04
|
||||||
|
uint32_t nAlphaMask ; // 0x42 0x04
|
||||||
|
uint32_t nType ; // 0x46 0x04
|
||||||
|
|
||||||
|
uint32_t Rx, Ry, Rz ; // 0x4A 0x0C
|
||||||
|
uint32_t Gx, Gy, Gz ; // 0x56 0x0C
|
||||||
|
uint32_t Bx, By, Bz ; // 0x62 0x0C
|
||||||
|
|
||||||
|
uint32_t nRedGamma ; // 0x6E 0x04
|
||||||
|
uint32_t nGreenGamma ; // 0x72 0x04
|
||||||
|
uint32_t nBlueGamma ; // 0x76 0x04
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma pack(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Globals __________________________________________________________
|
// Globals __________________________________________________________
|
||||||
|
|
||||||
extern HBITMAP g_hLogoBitmap;
|
extern HBITMAP g_hLogoBitmap;
|
||||||
|
|
||||||
extern COLORREF monochrome; // saved
|
extern COLORREF g_nMonochromeRGB; // saved to Registry
|
||||||
extern DWORD g_eVideoType; // saved
|
extern uint32_t g_uVideoMode;
|
||||||
extern DWORD g_uHalfScanLines; // saved
|
extern DWORD g_eVideoType; // saved to Registry
|
||||||
extern LPBYTE g_pFramebufferbits;
|
extern DWORD g_uHalfScanLines; // saved to Registry
|
||||||
|
extern uint8_t *g_pFramebufferbits;
|
||||||
|
|
||||||
typedef bool (*VideoUpdateFuncPtr_t)(int,int,int,int,int);
|
typedef bool (*VideoUpdateFuncPtr_t)(int,int,int,int,int);
|
||||||
|
|
||||||
// Prototypes _______________________________________________________
|
// Prototypes _______________________________________________________
|
||||||
|
|
||||||
void CreateColorMixMap();
|
|
||||||
|
|
||||||
BOOL VideoApparentlyDirty ();
|
BOOL VideoApparentlyDirty ();
|
||||||
void VideoBenchmark ();
|
void VideoBenchmark ();
|
||||||
void VideoChooseColor ();
|
void VideoChooseMonochromeColor (); // FIXME: Should be moved to PageConfig and call VideoSetMonochromeColor()
|
||||||
void VideoDestroy ();
|
void VideoDestroy ();
|
||||||
void VideoDrawLogoBitmap(HDC hDstDC, int xoff, int yoff, int srcw, int srch, int scale);
|
|
||||||
void VideoDisplayLogo ();
|
void VideoDisplayLogo ();
|
||||||
void VideoInitialize ();
|
void VideoInitialize ();
|
||||||
void VideoRealizePalette (HDC);
|
void VideoRealizePalette (HDC);
|
||||||
VideoUpdateFuncPtr_t VideoRedrawScreen (UINT);
|
void VideoRedrawScreenDuringFullSpeed(DWORD dwCyclesThisFrame, bool bInvalidate = false);
|
||||||
VideoUpdateFuncPtr_t VideoRedrawScreen ();
|
void VideoRedrawScreenAfterFullSpeed(DWORD dwCyclesThisFrame);
|
||||||
VideoUpdateFuncPtr_t VideoRefreshScreen ();
|
void VideoRedrawScreen (UINT uDelayRefresh = 0);
|
||||||
|
void VideoRefreshScreen (int bVideoFlags, UINT uDelayRefresh =0 );
|
||||||
void VideoReinitialize ();
|
void VideoReinitialize ();
|
||||||
void VideoResetState ();
|
void VideoResetState ();
|
||||||
WORD VideoGetScannerAddress(bool* pbVblBar_OUT, const DWORD uExecutedCycles);
|
WORD VideoGetScannerAddress(bool* pbVblBar_OUT, const DWORD uExecutedCycles);
|
||||||
bool VideoGetVbl(DWORD uExecutedCycles);
|
bool VideoGetVbl(DWORD uExecutedCycles);
|
||||||
void VideoEndOfVideoFrame(void);
|
|
||||||
|
|
||||||
bool VideoGetSW80COL(void);
|
bool VideoGetSW80COL(void);
|
||||||
bool VideoGetSWDHIRES(void);
|
bool VideoGetSWDHIRES(void);
|
||||||
|
@ -89,9 +193,7 @@ void VideoSetSnapshot_v1(const UINT AltCharSet, const UINT VideoMode);
|
||||||
void VideoSaveSnapshot(class YamlSaveHelper& yamlSaveHelper);
|
void VideoSaveSnapshot(class YamlSaveHelper& yamlSaveHelper);
|
||||||
void VideoLoadSnapshot(class YamlLoadHelper& yamlLoadHelper);
|
void VideoLoadSnapshot(class YamlLoadHelper& yamlLoadHelper);
|
||||||
|
|
||||||
void _Video_Dirty();
|
int _Video_SetupBanks( bool bBank2 );
|
||||||
void _Video_RedrawScreen( VideoUpdateFuncPtr_t update, bool bMixed = false );
|
|
||||||
void _Video_SetupBanks( bool bBank2 );
|
|
||||||
bool Update40ColCell (int x, int y, int xpixel, int ypixel, int offset);
|
bool Update40ColCell (int x, int y, int xpixel, int ypixel, int offset);
|
||||||
bool Update80ColCell (int x, int y, int xpixel, int ypixel, int offset);
|
bool Update80ColCell (int x, int y, int xpixel, int ypixel, int offset);
|
||||||
bool UpdateLoResCell (int x, int y, int xpixel, int ypixel, int offset);
|
bool UpdateLoResCell (int x, int y, int xpixel, int ypixel, int offset);
|
||||||
|
@ -109,10 +211,12 @@ enum VideoScreenShot_e
|
||||||
SCREENSHOT_280x192
|
SCREENSHOT_280x192
|
||||||
};
|
};
|
||||||
void Video_TakeScreenShot( int iScreenShotType );
|
void Video_TakeScreenShot( int iScreenShotType );
|
||||||
|
void Video_SetBitmapHeader( WinBmpHeader_t *pBmp, int nWidth, int nHeight, int nBitsPerPixel );
|
||||||
|
|
||||||
|
|
||||||
// Win32/MSVC: __stdcall
|
// Win32/MSVC: __stdcall
|
||||||
BYTE VideoCheckMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);
|
BYTE VideoCheckMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);
|
||||||
BYTE VideoCheckVbl (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);
|
BYTE VideoCheckVbl ( ULONG uExecutedCycles );
|
||||||
BYTE VideoSetMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);
|
BYTE VideoSetMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);
|
||||||
|
|
||||||
void Config_Load_Video(void);
|
void Config_Load_Video(void);
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "../../source/CPU.h"
|
#include "../../source/CPU.h"
|
||||||
|
|
||||||
// From Applewin.cpp
|
// From Applewin.cpp
|
||||||
|
bool g_bFullSpeed = false;
|
||||||
enum AppMode_e g_nAppMode = MODE_RUNNING;
|
enum AppMode_e g_nAppMode = MODE_RUNNING;
|
||||||
|
|
||||||
// From Memory.cpp
|
// From Memory.cpp
|
||||||
|
@ -98,6 +99,11 @@ DWORD z80_mainloop(ULONG uTotalCycles, ULONG uExecutedCycles)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// From NTSC.cpp
|
||||||
|
void NTSC_VideoUpdateCycles( long cycles6502 )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
|
|
||||||
#include "../../source/cpu/cpu_general.inl"
|
#include "../../source/cpu/cpu_general.inl"
|
||||||
|
|