linapple-pie/src/ParallelPrinter.cpp

174 lines
5.5 KiB
C++

/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski, Nick Westgate
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
*/
/* Description: Parallel Printer Interface Card emulation
*
* Author: Nick Westgate
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
//#pragma hdrstop
//#include "resource.h"
char Parallel_bin[] =
"\x18\xB0\x38\x48\x8A\x48\x98\x48\x08\x78\x20\x58\xFF\xBA\x68\x68"
"\x68\x68\xA8\xCA\x9A\x68\x28\xAA\x90\x38\xBD\xB8\x05\x10\x19\x98"
"\x29\x7F\x49\x30\xC9\x0A\x90\x3B\xC9\x78\xB0\x29\x49\x3D\xF0\x21"
"\x98\x29\x9F\x9D\x38\x06\x90\x7E\xBD\xB8\x06\x30\x14\xA5\x24\xDD"
"\x38\x07\xB0\x0D\xC9\x11\xB0\x09\x09\xF0\x3D\x38\x07\x65\x24\x85"
"\x24\x4A\x38\xB0\x6D\x18\x6A\x3D\xB8\x06\x90\x02\x49\x81\x9D\xB8"
"\x06\xD0\x53\xA0\x0A\x7D\x38\x05\x88\xD0\xFA\x9D\xB8\x04\x9D\x38"
"\x05\x38\xB0\x43\xC5\x24\x90\x3A\x68\xA8\x68\xAA\x68\x4C\xF0\xFD"
"\x90\xFE\xB0\xFE\x99\x80\xC0\x90\x37\x49\x07\xA8\x49\x0A\x0A\xD0"
"\x06\xB8\x85\x24\x9D\x38\x07\xBD\xB8\x06\x4A\x70\x02\xB0\x23\x0A"
"\x0A\xA9\x27\xB0\xCF\xBD\x38\x07\xFD\xB8\x04\xC9\xF8\x90\x03\x69"
"\x27\xAC\xA9\x00\x85\x24\x18\x7E\xB8\x05\x68\xA8\x68\xAA\x68\x60"
"\x90\x27\xB0\x00\x10\x11\xA9\x89\x9D\x38\x06\x9D\xB8\x06\xA9\x28"
"\x9D\xB8\x04\xA9\x02\x85\x36\x98\x5D\x38\x06\x0A\xF0\x90\x5E\xB8"
"\x05\x98\x48\x8A\x0A\x0A\x0A\x0A\xA8\xBD\x38\x07\xC5\x24\x68\xB0"
"\x05\x48\x29\x80\x09\x20\x2C\x58\xFF\xF0\x03\xFE\x38\x07\x70\x84"
;
static DWORD inactivity = 0;
static FILE* file = NULL;
DWORD const PRINTDRVR_SIZE = 0x100;
//===========================================================================
static BYTE /*__stdcall*/ PrintStatus(WORD, WORD, BYTE, BYTE, ULONG);
static BYTE /*__stdcall*/ PrintTransmit(WORD, WORD, BYTE, BYTE value, ULONG);
VOID PrintLoadRom(LPBYTE pCxRomPeripheral, const UINT uSlot)
{
// HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_PRINTDRVR_FW), "FIRMWARE");
// if(hResInfo == NULL)
// return;
//
// DWORD dwResSize = SizeofResource(NULL, hResInfo);
// if(dwResSize != PRINTDRVR_SIZE)
// return;
//
// HGLOBAL hResData = LoadResource(NULL, hResInfo);
// if(hResData == NULL)
// return;
// #define IDR_PRINTDRVR_FW "Parallel.rom"
// char BUFFER[PRINTDRVR_SIZE];
// FILE * hdfile = NULL;
// hdfile = fopen(IDR_PRINTDRVR_FW, "rb");
// if(hdfile == NULL) return; // no file?
// UINT nbytes = fread(BUFFER, 1, PRINTDRVR_SIZE, hdfile);
// fclose(hdfile);
// if(nbytes != PRINTDRVR_SIZE) return; // have not read enough?
//
BYTE* pData = (BYTE*) Parallel_bin; // NB. Don't need to unlock resource
// if(pData == NULL)
// return;
memcpy(pCxRomPeripheral + uSlot*256, pData, PRINTDRVR_SIZE);
//
RegisterIoHandler(uSlot, PrintStatus, PrintTransmit, NULL, NULL, NULL, NULL);
}
//===========================================================================
static BOOL CheckPrint()
{
inactivity = 0;
if (file == NULL)
{
/* TCHAR filepath[MAX_PATH * 2];
_tcsncpy(filepath, g_sProgramDir, MAX_PATH);
_tcsncat(filepath, _T("Printer.txt"), MAX_PATH);*/
file = fopen(g_sParallelPrinterFile, "ab"); // always for appending?
}
return (file != NULL);
}
//===========================================================================
static void ClosePrint()
{
if (file != NULL)
{
fclose(file);
file = NULL;
}
inactivity = 0;
}
//===========================================================================
void PrintDestroy()
{
ClosePrint();
}
//===========================================================================
void PrintUpdate(DWORD totalcycles)
{
if (file == NULL)
{
return;
}
if ((inactivity += totalcycles) > (10 * 1000 * 1000)) // around 10 seconds
{
// inactive, so close the file (next print will overwrite it)
ClosePrint();
}
}
//===========================================================================
void PrintReset()
{
ClosePrint();
}
//===========================================================================
static BYTE /*__stdcall*/ PrintStatus(WORD, WORD, BYTE, BYTE, ULONG)
{
CheckPrint();
return 0xFF; // status - TODO?
}
//===========================================================================
static BYTE /*__stdcall*/ PrintTransmit(WORD, WORD, BYTE, BYTE value, ULONG)
{
if (!CheckPrint())
{
return 0;
}
char c = value & 0x7F;
fwrite(&c, 1, 1, file);
return 0;
}
//===========================================================================