Re: [hatari-devel] Problem with printer output? |
[ Thread Index | Date Index | More lists.tuxfamily.org/hatari-devel Archives ]
Hi, On lauantai 04 helmikuu 2012, Matthias Arndt wrote: > The printer.c file is probably still of Winston heritage. I didn'T touch > it back then, only replaced some few lines to make it Unix and libc > compatible. Feel free to change anything to make it more compatible and > sane. Either there shouldn't be buffering at all, like with midi.c, or if it should be buffered, I would prefer relying on C-lib and removing the manual buffered. See the attached (non-tested) patch. I'm not sure what's the point in closing the printer file if there hasn't been any printing for 4s. Does anybody know why it does that? > > In TOS v2, running MINIMAL.PRG didn't result in any > > Printer_TransferByteTo() calls, but "Print screen" did. > > > > On the listed working TOS versions, MINIMAL.PRG running results > > in Printer_TransferByteTo() calls though. > > > > When I printed in psg.c, the PORTA value, during the printing... > > > >[...] > > > > I.e. the bits 0x4 and 0x2 are being toggled, although the code checks > > for bit 0x20 being toggled: .... > > [1] TOS Print screen gives same PORTA output as I get for Fwrites > > to PRN: in the working TOS versions. > > > > Any idea what's wrong? > > Not really. Back then I simply asume as soon as the STROBE is set, a > byte needs to be send to the printer. If that is wrong, ofocurse the > whole thing was whacky from the first commit. I never claimed it was a > perfect 100% solution, just a hack, that worked for the time being. Does somebody have a real Atari machine with TOS v1.02 - v2.06 *and* a printer, and if yes, could you try whether booting with the attached floppy disk contents[1] produces any printer output? [1] which just has minimal.prg + small test text in auto/ folder. - Eero
Attachment:
bootauto.st.gz
Description: GNU Zip compressed data
diff -r e9fa6df86f6a src/change.c --- a/src/change.c Sun Feb 05 20:36:10 2012 +0100 +++ b/src/change.c Wed Feb 08 23:54:57 2012 +0200 @@ -152,6 +152,7 @@ bool bReInitIoMem = false; bool bScreenModeChange = false; bool bReInitMidi = false; + bool bReInitPrinter = false; bool bFloppyInsert[MAX_FLOPPYDRIVES]; int i; @@ -182,7 +183,8 @@ || strcmp(changed->Printer.szPrintToFileName,current->Printer.szPrintToFileName)) { Dprintf("- printer>\n"); - Printer_CloseAllConnections(); + Printer_UnInit(); + bReInitPrinter = true; } /* Did set new RS232 parameters? */ @@ -373,6 +375,13 @@ IoMem_Init(); } + /* Re-init Printer emulation? */ + if (bReInitPrinter) + { + Dprintf("- printer<\n"); + Printer_Init(); + } + /* Re-init MIDI emulation? */ if (bReInitMidi) { diff -r e9fa6df86f6a src/includes/printer.h --- a/src/includes/printer.h Sun Feb 05 20:36:10 2012 +0100 +++ b/src/includes/printer.h Wed Feb 08 23:54:57 2012 +0200 @@ -6,7 +6,6 @@ extern void Printer_Init(void); extern void Printer_UnInit(void); -extern void Printer_CloseAllConnections(void); extern bool Printer_TransferByteTo(Uint8 Byte); extern void Printer_CheckIdleStatus(void); diff -r e9fa6df86f6a src/printer.c --- a/src/printer.c Sun Feb 05 20:36:10 2012 +0100 +++ b/src/printer.c Wed Feb 08 23:54:57 2012 +0200 @@ -17,62 +17,50 @@ #include "file.h" #include "paths.h" #include "printer.h" +#include "log.h" -/* #define PRINTER_DEBUG */ +#define PRINTER_DEBUG 0 +#if PRINTER_DEBUG +#define Dprintf(a) printf a +#else +#define Dprintf(a) +#endif -#define PRINTER_FILENAME "hatari.prn" +/* After ~4 seconds (4*50 VBLs), flush & close printer */ +#define PRINTER_IDLE_CLOSE (4*50) -#define PRINTER_IDLE_CLOSE (4*50) /* After 4 seconds, close printer */ - -#define PRINTER_BUFFER_SIZE 2048 /* 2k buffer which when full will be written to printer/file */ - -static Uint8 PrinterBuffer[PRINTER_BUFFER_SIZE]; /* Buffer to store character before output */ -static size_t nPrinterBufferChars; /* # characters in above buffer */ -static bool bConnectedPrinter; static int nIdleCount; +static int bUnflushed; static FILE *pPrinterHandle; -/* internal functions */ -static void Printer_ResetInternalBuffer(void); -static bool Printer_EmptyInternalBuffer(void); -static void Printer_AddByteToInternalBuffer(Uint8 Byte); - - /*-----------------------------------------------------------------------*/ /** * Initialise Printer */ void Printer_Init(void) { -#ifdef PRINTER_DEBUG - fprintf(stderr,"Printer_Init()\n"); -#endif + char *separator; + Dprintf((stderr, "Printer_Init()\n")); - /* A valid file name for printing is already set up in configuration.c. - * But we check it again since the user might have entered an invalid - * file name in the hatari.cfg file... */ - if (strlen(ConfigureParams.Printer.szPrintToFileName) <= 1) - { - const char *psHomeDir; - psHomeDir = Paths_GetHatariHome(); + /* disabled from config/command line? */ + if (!ConfigureParams.Printer.szPrintToFileName[0]) + return; - /* construct filename for printing.... */ - if (strlen(psHomeDir)+1+strlen(PRINTER_FILENAME) < sizeof(ConfigureParams.Printer.szPrintToFileName)) - { - sprintf(ConfigureParams.Printer.szPrintToFileName, "%s%c%s", - psHomeDir, PATHSEP, PRINTER_FILENAME); - } - else - { - strcpy(ConfigureParams.Printer.szPrintToFileName, PRINTER_FILENAME); - } + /* printer name without path? */ + separator = strrchr(ConfigureParams.Printer.szPrintToFileName, PATHSEP); + if (!separator) + return; + + *separator = '\0'; + if (!File_DirExists(ConfigureParams.Printer.szPrintToFileName)) { + Log_AlertDlg(LOG_ERROR, "Printer output file directory inaccessible. Printing disabled."); + ConfigureParams.Printer.bEnablePrinting = false; } + *separator = PATHSEP; -#ifdef PRINTER_DEBUG - fprintf(stderr,"Filename for printing: %s \n", ConfigureParams.Printer.szPrintToFileName); -#endif + Dprintf((stderr, "Filename for printing: %s \n", ConfigureParams.Printer.szPrintToFileName)); } @@ -82,86 +70,12 @@ */ void Printer_UnInit(void) { - /* Close any open files */ - Printer_CloseAllConnections(); - -#ifdef PRINTER_DEBUG - fprintf(stderr,"Printer_UnInit()\n"); -#endif -} - - -/*-----------------------------------------------------------------------*/ -/** - * Close all open output file, empty buffers etc. - */ -void Printer_CloseAllConnections(void) -{ - /* Empty buffer */ - Printer_EmptyInternalBuffer(); + Dprintf((stderr, "Printer_UnInit()\n")); /* Close any open files */ pPrinterHandle = File_Close(pPrinterHandle); - - /* Signal finished with printing */ - bConnectedPrinter = false; -} - - -/*-----------------------------------------------------------------------*/ -/** - * Reset Printer Buffer - */ -static void Printer_ResetInternalBuffer(void) -{ - nPrinterBufferChars = 0; -} - - -/*-----------------------------------------------------------------------*/ -/** - * Empty Printer Buffer - */ -static bool Printer_EmptyInternalBuffer(void) -{ - /* Write bytes to file */ - if (nPrinterBufferChars > 0) - { - if (pPrinterHandle) - { - size_t n; - /* Write bytes out */ - n = fwrite((Uint8 *)PrinterBuffer, sizeof(Uint8), - nPrinterBufferChars, pPrinterHandle); - if (n < nPrinterBufferChars) - { - /* we wrote less then expected! */ - fprintf(stderr, "Printer_EmptyInternalBuffer():" - "ERROR not all chars were written\n"); - } - } - - /* Reset */ - Printer_ResetInternalBuffer(); - - return true; - } - /* Nothing to do */ - return false; -} - - -/*-----------------------------------------------------------------------*/ -/** - * Add byte to our internal buffer, and when full write out - needed to speed - */ -static void Printer_AddByteToInternalBuffer(Uint8 Byte) -{ - /* Is buffer full? If so empty */ - if (nPrinterBufferChars == PRINTER_BUFFER_SIZE) - Printer_EmptyInternalBuffer(); - /* Add character */ - PrinterBuffer[nPrinterBufferChars++] = Byte; + bUnflushed = false; + nIdleCount = 0; } @@ -178,25 +92,24 @@ return false; /* Failed if printing disabled */ /* Have we made a connection to our printer/file? */ - if (!bConnectedPrinter) + if (!pPrinterHandle) { /* open printer file... */ pPrinterHandle = File_Open(ConfigureParams.Printer.szPrintToFileName, "a+"); - bConnectedPrinter = (pPrinterHandle != NULL); - - /* Reset the printer */ - Printer_ResetInternalBuffer(); + if (!pPrinterHandle) + { + Log_AlertDlg(LOG_ERROR, "Printer output file open failed. Printing disabled."); + ConfigureParams.Printer.bEnablePrinting = false; + return false; + } } - - /* Is all OK? */ - if (bConnectedPrinter) + if (fputc(Byte, pPrinterHandle) != Byte) { - /* Add byte to our buffer. */ - Printer_AddByteToInternalBuffer(Byte); - return true; /* OK */ + fprintf(stderr, "ERROR: Printer_TransferByteTo() writing failed!\n"); + return false; } - else - return false; /* Failed */ + bUnflushed = true; + return true; } @@ -208,8 +121,10 @@ void Printer_CheckIdleStatus(void) { /* Is anything waiting for printer? */ - if (Printer_EmptyInternalBuffer()) + if (bUnflushed) { + fflush(pPrinterHandle); + bUnflushed = false; nIdleCount = 0; } else @@ -219,8 +134,7 @@ if (nIdleCount >= PRINTER_IDLE_CLOSE) { /* Close printer output */ - Printer_CloseAllConnections(); - nIdleCount = 0; + Printer_UnInit(); } } }
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |