BK 2650 VBA Script26.dec 2010
#define _AFXDLL
#include <afxtempl.h>
#include <windows.h>

void CaptureScreen(const char* filename, CHAR*bitmap, int width, int height)
{
	// create file
	CFile file;
	file.Open( CString(filename), CFile::modeCreate | CFile::modeWrite );

	// save bitmap file headers
	BITMAPFILEHEADER fileHeader;
	BITMAPINFOHEADER infoHeader;

	fileHeader.bfType      = 0x4d42;
	fileHeader.bfSize      = 0;
	fileHeader.bfReserved1 = 0;
	fileHeader.bfReserved2 = 0;
	fileHeader.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*4;

	infoHeader.biSize          = sizeof(infoHeader);
	infoHeader.biWidth         = width;
	infoHeader.biHeight        = height;
	infoHeader.biPlanes        = 1;
	infoHeader.biBitCount      = 8;
	infoHeader.biCompression   = BI_RGB;
	infoHeader.biSizeImage     = 0;
	infoHeader.biXPelsPerMeter = 3780;
	infoHeader.biYPelsPerMeter = 3780;
	infoHeader.biClrUsed       = 0;
	infoHeader.biClrImportant  = 0;

	file.Write((char*)&fileHeader, sizeof(fileHeader));
	file.Write((char*)&infoHeader, sizeof(infoHeader));

	// palette
	for (int i=0; i<256; i++)
	{
		DWORD clr = (i==1) ? RGB(0, 0, 0) : RGB(255, 255, 255);
		file.Write(&clr, 4);
	}

	// dibsection information
	BITMAPINFO info;
	info.bmiHeader = infoHeader; 

	for (int y=height-1; y>=0; y--)
		file.Write(bitmap+y*width, width);

	file.Close();
}

void main()
{
	const int nScreenWidth = 512;
	const int nScreenHeight = 370;

	CFile f;
	f.Open( _T("C:\\Temp\\spectrum.bin"), CFile::modeRead );
	//f.Open( _T("COM1:"), CFile::modeRead );
	// dont forget to setup baud rate and enable DTR&RTS

	int x = 0, y = 0;
	BYTE bRead;
	int nCount = 0;
	BYTE bitmap[nScreenHeight][nScreenWidth] = {0};

	while ( f.Read(&bRead, 1) )
	{
		if ( bRead == 0x1b )
		{
			f.Read(&bRead, 1);
			if ( bRead == 'l' )
			{
				CHAR count[5] = {0};
				f.Read( count, 4 );
				nCount = atoi(count);
				_ASSERT(nCount == 370);
				for (x=0; x<nCount; x++)
				{
					union {
						WORD pix;
						BYTE b[2];
					} p;
					f.Read( &p.b[1], 1 );
					f.Read( &p.b[0], 1 );
					for ( int z = 0; z < 16; z++ )
						if ( p.pix & (1<<(15-z)) )
						{
							int _x = y*16+z;
							int _y = x;
							_ASSERT( _x < nScreenWidth && _y < nScreenHeight );
							bitmap[nScreenHeight-_y-1][_x] = 1;
						}
				}
				y++;
				printf("line=%d\n", y);
				if (y==22)
					break;
			}
			continue;
		}
	}
	f.Close();
	CaptureScreen( "c:\\temp\\spectrum.bmp", (char*)bitmap, nScreenWidth, nScreenHeight );
}