230 lines
6.7 KiB
C++
230 lines
6.7 KiB
C++
/*
|
|
Copyleft {C} 2014 Michael Pohoreski
|
|
License: GPL2
|
|
|
|
MSVC2010 Debug:
|
|
Configuration Properties, Debugging
|
|
Command Arguments: hgr/archon.hgr2
|
|
Working Directory: $(ProjectDir)
|
|
*/
|
|
|
|
// Includes _______________________________________________________________
|
|
#include "StdAfx.h"
|
|
|
|
// uint8_t csbits[ 1024 ];
|
|
// void make_csbits() {};
|
|
uint8_t *MemGetMainPtr( uint16_t address );
|
|
uint8_t *MemGetAuxPtr ( uint16_t address );
|
|
|
|
#if 1
|
|
#include "wsvideo.cpp"
|
|
#include "cs.cpp"
|
|
#else
|
|
#define FRAMEBUFFER_W 600
|
|
#define FRAMEBUFFER_H 420
|
|
#endif
|
|
|
|
// Types __________________________________________________________________
|
|
|
|
enum
|
|
{
|
|
_8K = 8 * 1024,
|
|
_64K = 64 * 1024
|
|
};
|
|
|
|
enum TargaImageType_e
|
|
{
|
|
TARGA_RGB = 2,
|
|
TARGA_HEADER_SIZE = 0x12
|
|
};
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma pack(push,1)
|
|
#endif // _MSC_VER
|
|
struct TargaHeader_t
|
|
{ // Addr Bytes
|
|
uint8_t nIdBytes ; // 00 01 size of ID field that follows 18 byte header (0 usually)
|
|
uint8_t bHasPalette ; // 01 01
|
|
uint8_t iImageType ; // 02 01 type of image 0=none,1=indexed,2=rgb,3=grey,+8=rle packed
|
|
|
|
int16_t iPaletteFirstColor ; // 03 02
|
|
int16_t nPaletteColors ; // 05 02
|
|
uint8_t nPaletteBitsPerEntry ; // 07 01 number of bits per palette entry 15,16,24,32
|
|
|
|
int16_t nOriginX ; // 08 02 image x origin
|
|
int16_t nOriginY ; // 0A 02 image y origin
|
|
int16_t nWidthPixels ; // 0C 02
|
|
int16_t nHeightPixels ; // 0E 02
|
|
uint8_t nBitsPerPixel ; // 10 01 image bits per pixel 8,16,24,32
|
|
uint8_t iDescriptor ; // 11 01 image descriptor bits (vh flip bits)
|
|
|
|
// pixel data...
|
|
uint8_t aPixelData[1] ; // 12 ?? variable length RGB data
|
|
};
|
|
#ifdef _MSC_VER
|
|
#pragma pack(pop)
|
|
#endif // _MSC_VER
|
|
|
|
enum VideoFlag_e
|
|
{
|
|
VF_80COL = 0x00000001,
|
|
VF_DHIRES = 0x00000002,
|
|
VF_HIRES = 0x00000004,
|
|
VF_MASK2 = 0x00000008,
|
|
VF_MIXED = 0x00000010,
|
|
VF_PAGE2 = 0x00000020,
|
|
VF_TEXT = 0x00000040
|
|
};
|
|
|
|
// Globals (Private ) _____________________________________________________
|
|
uint8_t gaMemMain[ _64K ];
|
|
uint8_t gaMemAux [ _64K ];
|
|
uint32_t gaFrameBuffer[ FRAMEBUFFER_H ][ FRAMEBUFFER_W ];
|
|
|
|
int g_bVideoMode;
|
|
|
|
// Prototypes _____________________________________________________________
|
|
void convert( const char *pSrcFileName );
|
|
void init_mem();
|
|
void init_videomode();
|
|
void hgr2rgb();
|
|
void rgb2tga( TargaHeader_t *pTargaHeader );
|
|
|
|
|
|
// Implementation _________________________________________________________
|
|
|
|
//========================================================================
|
|
void convert( const char *pSrcFileName )
|
|
{
|
|
char aDstFileName[ 256 ];
|
|
char *pDstFileName = aDstFileName;
|
|
size_t nLen = strlen( pSrcFileName );
|
|
|
|
strcpy( aDstFileName , pSrcFileName );
|
|
strcat( pDstFileName + nLen, ".tga" );
|
|
|
|
printf( "Src: '%s'\n", pSrcFileName );
|
|
printf( "Dst: '%s'\n", pDstFileName );
|
|
|
|
FILE *pSrcFile = fopen( pSrcFileName, "rb" );
|
|
FILE *pDstFile = fopen( pDstFileName, "w+b" );
|
|
|
|
if( pSrcFile )
|
|
{
|
|
size_t nPageHGR = 0x2000;
|
|
fread( gaMemMain + nPageHGR, _8K, 1, pSrcFile );
|
|
|
|
TargaHeader_t tga;
|
|
hgr2rgb();
|
|
rgb2tga( &tga );
|
|
|
|
fwrite( (void*)&tga , TARGA_HEADER_SIZE , 1, pDstFile );
|
|
fwrite( (void*)&gaFrameBuffer, sizeof( gaFrameBuffer ), 1, pDstFile );
|
|
}
|
|
else
|
|
printf( "ERROR: Couldn't open source file: '%s'\n", pSrcFileName );
|
|
|
|
fclose( pDstFile );
|
|
fclose( pSrcFile );
|
|
}
|
|
|
|
//========================================================================
|
|
void hgr2rgb()
|
|
{
|
|
g_pFuncVideoUpdate( VIDEO_SCANNER_6502_CYCLES );
|
|
}
|
|
|
|
//========================================================================
|
|
void init_mem()
|
|
{
|
|
memset( gaMemMain, 0, sizeof( gaMemMain ) );
|
|
memset( gaMemMain, 0, sizeof( gaMemAux ) );
|
|
|
|
memset( gaFrameBuffer, 0, sizeof( gaFrameBuffer ) );
|
|
}
|
|
|
|
void init_videomode()
|
|
{
|
|
// From Video.cpp VideoSetMode()
|
|
wsTextPage = 1;
|
|
wsHiresPage = 1;
|
|
if (g_bVideoMode & VF_PAGE2) {
|
|
if (0 == (g_bVideoMode & VF_MASK2)) {
|
|
wsTextPage = 2;
|
|
wsHiresPage = 2;
|
|
}
|
|
}
|
|
|
|
if (g_bVideoMode & VF_TEXT) {
|
|
if (g_bVideoMode & VF_80COL)
|
|
g_pFuncVideoUpdate = wsUpdateVideoText80;
|
|
else
|
|
g_pFuncVideoUpdate = wsUpdateVideoText40;
|
|
}
|
|
else if (g_bVideoMode & VF_HIRES) {
|
|
if (g_bVideoMode & VF_DHIRES)
|
|
if (g_bVideoMode & VF_80COL)
|
|
g_pFuncVideoUpdate = wsUpdateVideoDblHires;
|
|
else
|
|
g_pFuncVideoUpdate = wsUpdateVideoHires0;
|
|
else
|
|
g_pFuncVideoUpdate = wsUpdateVideoHires;
|
|
}
|
|
else {
|
|
if (g_bVideoMode & VF_DHIRES)
|
|
if (g_bVideoMode & VF_80COL)
|
|
g_pFuncVideoUpdate = wsUpdateVideoDblLores;
|
|
else
|
|
g_pFuncVideoUpdate = wsUpdateVideo7MLores;
|
|
else
|
|
g_pFuncVideoUpdate = wsUpdateVideoLores;
|
|
}
|
|
}
|
|
|
|
uint8_t *MemGetMainPtr( uint16_t address )
|
|
{
|
|
return &gaMemMain[ address ];
|
|
}
|
|
|
|
uint8_t *MemGetAuxPtr ( uint16_t address )
|
|
{
|
|
return &gaMemAux[ address ];
|
|
}
|
|
|
|
//========================================================================
|
|
void rgb2tga( TargaHeader_t *pTargaHeader )
|
|
{
|
|
memset( (void*)pTargaHeader, 0, sizeof( TargaHeader_t ) );
|
|
|
|
pTargaHeader->iImageType = TARGA_RGB;
|
|
pTargaHeader->nWidthPixels = FRAMEBUFFER_W;
|
|
pTargaHeader->nHeightPixels = FRAMEBUFFER_H;
|
|
pTargaHeader->nBitsPerPixel = 24;
|
|
}
|
|
|
|
//========================================================================
|
|
int main( const int nArg, const char *aArg[] )
|
|
{
|
|
init_mem();
|
|
|
|
// From: Video.cpp wsVideoCreateDIBSection()
|
|
uint8_t *g_pFramebufferbits = (uint8_t*) &gaFrameBuffer[0][0];
|
|
for (int y = 0; y < 384; y++)
|
|
wsLines[y] = g_pFramebufferbits + 4 * FRAMEBUFFER_W * ((FRAMEBUFFER_H - 1) - y - 18) + 80;
|
|
|
|
wsVideoInitModel( 1 ); // Apple //e
|
|
wsVideoInit();
|
|
wsVideoStyle( 1, 1 );
|
|
|
|
g_bVideoMode = VF_HIRES;
|
|
init_videomode();
|
|
|
|
if( nArg > 1 )
|
|
{
|
|
convert( aArg[1] );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|