mirror of
https://github.com/ogoguel/activegs-ios.git
synced 2025-01-02 09:30:10 +00:00
172 lines
3.5 KiB
C++
172 lines
3.5 KiB
C++
/*
|
|
ActiveGS, Copyright 2004-2016 Olivier Goguel, https://github.com/ogoguel/ActiveGS
|
|
Based on Kegs, Copyright 2004 Kent Dickey, https://kegs.sourceforge.net
|
|
This code is covered by the GNU GPL licence
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#ifdef INCLUDE_RCSID_C
|
|
const char rcsid_scc_h[] = "@(#)$KmKId: scc.h,v 1.17 2004-12-03 14:03:12-05 kentd Exp $";
|
|
#endif
|
|
|
|
#include <ctype.h>
|
|
|
|
#ifdef _WIN32
|
|
# include <winsock2.h>
|
|
#else
|
|
# include <sys/socket.h>
|
|
# include <netinet/in.h>
|
|
# include <netdb.h>
|
|
#endif
|
|
|
|
#if defined(HPUX) || defined(__linux__) || defined(SOLARIS) || defined(DRIVER_IOS) || defined(DRIVER_OSX) || defined(__MACH__) || defined(_WIN32)
|
|
# define SCC_SOCKETS
|
|
#endif
|
|
|
|
|
|
/* my scc port 0 == channel A, port 1 = channel B */
|
|
|
|
#define SCC_INBUF_SIZE 512 /* must be a power of 2 */
|
|
#define SCC_OUTBUF_SIZE 512 /* must be a power of 2 */
|
|
|
|
#define SCC_MODEM_MAX_CMD_STR 128
|
|
|
|
#ifndef SOCKET
|
|
# define SOCKET word32 /* for non-windows */
|
|
#endif
|
|
|
|
|
|
#ifdef _WIN32
|
|
#pragma pack(push,PRAGMA_PACK_SIZE)
|
|
#endif
|
|
|
|
STRUCT(Scc) {
|
|
int port;
|
|
int state;
|
|
int accfd;
|
|
SOCKET sockfd;
|
|
int socket_state;
|
|
int rdwrfd;
|
|
void *host_handle;
|
|
void *host_handle2;
|
|
int host_aux1;
|
|
int read_called_this_vbl;
|
|
int write_called_this_vbl;
|
|
|
|
int mode;
|
|
int reg_ptr;
|
|
int reg[16];
|
|
|
|
int rx_queue_depth;
|
|
byte rx_queue[4];
|
|
|
|
int in_rdptr;
|
|
int in_wrptr;
|
|
byte in_buf[SCC_INBUF_SIZE];
|
|
|
|
int out_rdptr;
|
|
int out_wrptr;
|
|
byte out_buf[SCC_OUTBUF_SIZE];
|
|
|
|
int br_is_zero;
|
|
int tx_buf_empty;
|
|
int wantint_rx;
|
|
int wantint_tx;
|
|
int wantint_zerocnt;
|
|
int dcd;
|
|
|
|
_ALIGNED(8) double br_dcycs;
|
|
_ALIGNED(8) double tx_dcycs ;
|
|
_ALIGNED(8) double rx_dcycs;
|
|
|
|
int br_event_pending;
|
|
int rx_event_pending;
|
|
int tx_event_pending;
|
|
|
|
int char_size;
|
|
int baud_rate;
|
|
_ALIGNED(8) double out_char_dcycs;
|
|
|
|
int socket_num_rings;
|
|
int socket_last_ring_dcycs;
|
|
word32 modem_mode;
|
|
int modem_dial_or_acc_mode;
|
|
int modem_plus_mode;
|
|
int modem_s0_val;
|
|
int telnet_mode;
|
|
int telnet_iac;
|
|
word32 telnet_local_mode[2];
|
|
word32 telnet_remote_mode[2];
|
|
word32 telnet_reqwill_mode[2];
|
|
word32 telnet_reqdo_mode[2];
|
|
int modem_cmd_len;
|
|
byte modem_cmd_str[SCC_MODEM_MAX_CMD_STR + 5];
|
|
} XCODE_PRAGMA_PACK ;
|
|
|
|
|
|
|
|
|
|
#define SCCMODEM_NOECHO 0x0001
|
|
#define SCCMODEM_NOVERBOSE 0x0002
|
|
|
|
|
|
class s_scc : public serialized
|
|
{
|
|
public:
|
|
Scc scc_stat[2];
|
|
int g_scc_overflow ;
|
|
int g_wsastartup_called;
|
|
|
|
s_scc()
|
|
{
|
|
INIT_SERIALIZED();
|
|
}
|
|
|
|
|
|
#define SERIALIZE_SOCKET(X,N) int old_##N = X.sockfd; X.sockfd=0;
|
|
#define UNSERIALIZE_SOCKET(X,N) X.sockfd = old_##N ;
|
|
|
|
void in(serialize* _s)
|
|
{
|
|
byte* ptr = (byte*)_s->data;
|
|
int ssize = *(int*)ptr;
|
|
if (ssize!= sizeof(*this))
|
|
ALIGNMENT_ERROR("scc",ssize,sizeof(*this));
|
|
ptr += sizeof(ssize);
|
|
memcpy(this,ptr,sizeof(*this));
|
|
|
|
// TODO UNSERIALIZE SOCKET
|
|
}
|
|
|
|
int out(serialize* _s, int _fastalloc)
|
|
{
|
|
|
|
int ssize = sizeof(*this);
|
|
int size = ssize + sizeof(ssize);
|
|
_s->size = size;
|
|
_s->fastalloc = _fastalloc;
|
|
_s->data = (void*)x_malloc(size,_fastalloc);
|
|
byte* ptr = (byte*) _s->data;
|
|
|
|
memcpy(ptr,&ssize,sizeof(ssize));
|
|
ptr+=sizeof(ssize);
|
|
|
|
SERIALIZE_SOCKET(scc_stat[0],stat0);
|
|
SERIALIZE_SOCKET(scc_stat[1],stat1);
|
|
|
|
memcpy(ptr,this,sizeof(*this));
|
|
|
|
UNSERIALIZE_SOCKET(scc_stat[0],stat0);
|
|
UNSERIALIZE_SOCKET(scc_stat[1],stat1);
|
|
|
|
return size;
|
|
}
|
|
|
|
} XCODE_PRAGMA_PACK;
|
|
|
|
#ifdef _WIN32
|
|
#pragma pack(pop)
|
|
#endif
|
|
|
|
extern s_scc g_scc; |