mirror of
https://github.com/digarok/gsplus.git
synced 2024-11-24 06:34:02 +00:00
143 lines
4.0 KiB
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;
|
|
}
|