gsplus/src/scc_imagewriter.c

143 lines
4.0 KiB
C

/*
GSPLUS - Advanced Apple IIGS Emulator Environment
Based on the KEGS emulator written by Kent Dickey
See COPYRIGHT.txt for Copyright information
See LICENSE.txt for license (GPL v2)
*/
/* This is an interface between the SCC emulation and the Virtual Imagewriter. */
#include "defc.h"
#include "scc.h"
#include "imagewriter.h"
extern Scc scc_stat[2];
extern word32 g_vbl_count;
extern int g_imagewriter;
extern int g_imagewriter_dpi;
extern char* g_imagewriter_output;
extern int g_imagewriter_multipage;
extern int g_imagewriter_timeout;
extern int g_imagewriter_paper;
extern int g_imagewriter_banner;
word32 imagewriter_vbl_count = 0;
int imagewriter_port_block = 0;
int iw_scc_write = 0;
int scc_imagewriter_init(int port) {
Scc *scc_ptr;
scc_ptr = &(scc_stat[port]);
imagewriter_init(g_imagewriter_dpi,g_imagewriter_paper,g_imagewriter_banner,g_imagewriter_output,g_imagewriter_multipage);
scc_ptr->state = 4;
return 4;
}
/** Transfer data from Imagewriter to the SCC **/
void scc_imagewriter_fill_readbuf(int port, int space_left, double dcycs) {
if (iw_scc_write)
{
size_t bytes_read;
size_t i;
byte data[9];
if (g_imagewriter == 1)
{
//Imagewriter LQ self ID string. Tell machine we have a color ribbon and sheet feeder installed.
data[0] = 0; //Start bit
data[1] ='L'; //Printer type is Imagewriter LQ
data[2] ='Q'; //(cont)
data[3] ='1'; //15 inch carriage width
data[4] ='C'; //Color ribbon installed
data[5] ='F'; //Sheet feeder installed, no envelope attachment
data[6] ='1'; //Number of sheet feeder bins
data[7] = 0x0D; //CR terminates string
data[8] = 0; //Stop bit
bytes_read = 9;
}
else
{
//Imagewriter II self ID string. Tell machine we have a color ribbon and sheet feeder installed.
data[0] = 0; //Start bit
data[1] ='I'; //Printer type is Imagewriter II
data[2] ='W'; //(cont)
data[3] ='1'; //10 inch carriage width
data[4] ='0'; //(cont)
data[5] ='C'; //Color ribbon installed
data[6] ='F'; //Sheet feeder installed
data[7] = 0; //Stop bit
bytes_read = 8;
}
for(i = 0; i < bytes_read; i++) {
scc_add_to_readbuf(port, data[i], dcycs);
}
iw_scc_write = 0;
}
}
/** Transfer data from the SCC to the Imagewriter. **/
void scc_imagewriter_empty_writebuf(int port, double dcycs) {
Scc* scc_ptr;
int rdptr;
int wrptr;
int len;
int done;
//int ret;
unsigned long bytes_written;
scc_ptr = &(scc_stat[port]);
done = 0;
while(!done) {
rdptr = scc_ptr->out_rdptr;
wrptr = scc_ptr->out_wrptr;
if(rdptr == wrptr) {
//printf("...rdptr == wrptr\n");
done = 1;
break;
}
len = wrptr - rdptr;
if(len < 0) {
len = SCC_OUTBUF_SIZE - rdptr;
}
if(len > 32) {
len = 32;
}
if(len <= 0) {
done = 1;
break;
}
bytes_written = 1;
imagewriter_port_block = 1;
imagewriter_loop(scc_ptr->out_buf[rdptr]);
imagewriter_vbl_count = g_vbl_count+(g_imagewriter_timeout*60);
imagewriter_port_block = 0;
//printf("Write Imagewriter ret: %d, bytes_written:%d, len:%d\n", ret,
//(int)bytes_written, len);
if (bytes_written == 0) {
done = 1;
break;
} else {
rdptr = rdptr + bytes_written;
if(rdptr >= SCC_OUTBUF_SIZE) {
rdptr = rdptr - SCC_OUTBUF_SIZE;
}
scc_ptr->out_rdptr = rdptr;
}
}
}
//This function handles the automatic timeout of the virtual printer if an
//application doesn't send a form feed at the end of the page. It also
//allows multipage mode Postscript and native printer documents to
//print somewhat how a regular application would.
void imagewriter_update() {
if (imagewriter_port_block != 1 && imagewriter_vbl_count != 0 && g_vbl_count >= imagewriter_vbl_count)
{
printf("Calling imagewriter_update and flushing!\n");
imagewriter_feed();
imagewriter_vbl_count = 0;
}
return;
}