#include "csource/VT340/VT340_models.h"
#include "ownincs/xem.h"

#ifndef abs
#define abs(x) ((x)<0?-(x):(x))
#endif

#define M_BOLD			(1<<28)
#define M_INVERSID	(1<<29)

#define UPPER_SIDE	3
#define LOWER_SIDE	4
#define HORIZ_ONLY	6

#define DCS_BUFLEN 2048

#define SETS 4		/* VT340 has 4 charset-registers.. */
enum { ASCII=0, DEC_SUPPLEMENTAL, ISO_SUPPLEMENTAL, GRAPHICS, TECHNICAL, FONTS };

#define F_GXGL				(1<<0)	/* für fstat */

#define T_USE_REGION		(1<<0)	/* für tstat */
#define T_WRAP				(1<<1)

#define U_CURSOR			(1<<0)	/* für ustat */
#define U_INSERT			(1<<1)
#define U_NEWLINE			(1<<2)
#define U_KEYAPP			(1<<3)
#define U_CURAPP			(1<<4)
#define U_HOST_STATUSLINE_ACTIVE	(1<<5)
#define U_HOST_STATUSLINE		(1<<6)

#define P_BSDEL			(1<<0)	/* für pstat */
#define P_24LINES			(1<<1)
#define P_ADJUST_LINES	(1<<2)
#define P_ISO_LATIN1		(1<<3)
#define P_CONVERT			(1<<4)
#define P_DESTRUCTIVEBS	(1<<5)
#define P_DESTRUCTIVEFF	(1<<6)
#define P_DESTRUCTIVEDEL	(1<<7)
#define P_SMOOTH_SCROLL	(1<<8)
#define P_ANSI_MODE		(1<<9)	/* else VT-52 */
#define P_VT340_MODE		(1<<10)	/* else VT-102 */
#define P_OWN_STATUSLINE (1<<11)

#define G_AUTO_PRINT		(1<<0)	/* für gstat */
#define G_AUTO_PRINT_INACTIVE (1<<1)
#define G_PRINT_CONTROL	(1<<2)
#define G_FULLSCREEN		(1<<3)
#define G_FORMFEED		(1<<4)

#define SCREEN_BUF 32
#define ANSWER_BACK 32

#define NUL         '\x00'
#define ENQ         '\x05'
#define BEL         '\x07'
#define BS          '\x08'
#define HT          '\x09'
#define LF          '\x0A'
#define VT          '\x0B'
#define FF          '\x0C'
#define CR          '\x0D'
#define SO          '\x0E'
#define SI          '\x0F'
#define DLE         '\x10'
#define XON         '\x11'
#define XOFF        '\x13'
#define CAN         '\x18'
#define SUB         '\x1A'
#define ESC         '\x1B'
#define FS          '\x1C'
#define GS          '\x1D'
#define US          '\x1F'
#define DEL         '\x7F'
#define IND         '\x84'
#define NEL         '\x85'
#define HTS         '\x88'
#define PLD         '\x8B'
#define PLU         '\x8C'
#define RI          '\x8D'
#define SS2         '\x8E'
#define SS3         '\x8F'
#define DCS         '\x90'
#define PU1         '\x91'
#define PU2         '\x92'
#define STS         '\x93'
#define CSI         '\x9B'
#define ST          '\x9C'
#define OSC         '\x9D'
#define PM          '\x9E'
#define APC         '\x9F'
#define END         '\xFF'

#define XSIZE			8
#define FONT_YSIZE	8
#define BOTLINE		6
#define ARGUMENTS		16
#define MAXCOLUMNS	200	/* das entspricht einer Auflösung */
#define MAXROWS		200	/* von 1600 x 1600 Pixel bei einem 8'er Font..*/ 

#define REFRESH_CLASS_BIT (1<<0)
#define REFRESH_OPTS (1<<1)
#define REFRESH_LEDS (1<<2)

#define BACKGROUND_PEN	0

#define MAXARGS 23
#define MAXINTER 10

#define ERASEABLE 'e'
#define DONT_ERASE 'n'

enum	{ IDENT_VT100, IDENT_VT101, IDENT_VT102, IDENT_VT220, IDENT_VT340 };


struct SpecialKey {
	UBYTE	Key;
	VOID	(*Routine)(struct VT340Console *);
};

struct VT340Console {
	struct XEM_IO *io;
	struct List *macrokeys;
	struct RastPort *rp;

	BPTR	prt;

	UBYTE	inESC;
	UBYTE	inCSI;
	UBYTE	inTEK;
	UBYTE	inDCS;
	UBYTE	inPrivate;
	UBYTE isReady;		/* TRUE, if XEmulatorOpenConsole() was successful.. */

	ULONG	rexxsig;
	APTR	rexxvars;

	BOOL	bold;
	BOOL	mono;
	UWORD foreground_pen;
	BOOL	hold_screen;

	UWORD	gset[SETS];
	UWORD	s_gset[SETS];
	UBYTE *fonts[FONTS];
	struct TextFont *dc_font;		/* display_controls font */
	struct TextFont *topazfont;	/* status-line font */
	struct Remember *font_remember;

	UBYTE *text_raster;
	UBYTE *erase_raster;
	UWORD raster_width;
	UWORD raster_height;

	UWORD lset;
	UWORD slset;
	UWORD s_lset;
	UWORD rset;
	UWORD s_rset;

	ULONG argc;

	UBYTE	*DCS_buffer;

	UWORD statusline;
	UWORD columns;
	UWORD	width;
	UWORD firstline;
	UWORD lastline;

	UWORD	top;
	UWORD	bot;
	UWORD	col;
	UWORD s_col;
	UWORD m_col;
	UWORD	row;
	UWORD s_row;
	UWORD m_row;

	ULONG	attr, s_attr;
	UWORD	apen, s_apen;
	UWORD	bpen, s_bpen;

	UWORD	upss;		/* User Preferred Supplemental set */

	UWORD	gstat;

	UWORD pstat;	/* private settings */
	UWORD r_pstat;

	UWORD	tstat;	/* settings that will be saved */
	UWORD	s_tstat;
	UWORD	r_tstat;

	UWORD	fstat;	/* textfont settings */

	UWORD	ustat;	/* user settings */
	UWORD	r_ustat;

	BOOL	CSIcmd;
	BOOL	ESCcmd;
	UWORD	firstarg;

	UWORD col0;
	UWORD col1;

	UWORD	ysize;	/* Höhe der zu bearbeitenden Linie..!! */
	UWORD	ordcol;
	UWORD	ordc;
	UWORD icnt;			/* offset für inter.. */


	UBYTE *buf;
	UBYTE *conv;

/* VT-52 area */
	BOOL VT52_dca;		/* this f*cking Direct Cursor Address */


/* TEKTRONIX TEK-4010/4014/4100 area.. */

	struct	Screen	*TEKscreen;
	struct	Window	*TEKwindow;
	struct	RastPort	*TEKrp;
	struct	AreaInfo TEKai;
	struct	TmpRas	TEKtr;
	VOID *TEKfillras;

	BOOL	TEKescmode;
	BOOL	TEKboxmode;
	BOOL	TEKcolormode;
	BOOL	TEKscale;

	enum {ALPHA=1, LINE, MOVE, POINT};
	UWORD TEKmainmode;
	UWORD	TEKlace;		/* interlace TEK screen  0=no  1=yes */
	UWORD TEK4100;
	UWORD TEKapen;
	UWORD buffer[250];

	ULONG	TEKx;			/*  X-Pos */
	ULONG	TEKy;			/*  Y-Pos */
	ULONG	TEKhix;		/* High X */
	ULONG	TEKloy;		/* Low  Y */
	ULONG	TEKhiy;		/* High Y */ 
	ULONG	TEKlastx;	/* Last X */
	ULONG	TEKlasty;	/* Last Y */
	ULONG	TEKcolorindex;
	ULONG	TEKred;
	ULONG	TEKgreen;
	ULONG	TEKlastval;

	UBYTE TEKlastc;

/* UBYTE-Array.. */
	UBYTE special_map[256];
	UBYTE rexxname[8];
	UBYTE screen_buf[SCREEN_BUF];
	UBYTE answer_back[ANSWER_BACK];
	UBYTE	ordtext[MAXCOLUMNS];
	UBYTE	tabs[MAXCOLUMNS];
	UBYTE rows[MAXROWS];
	UBYTE args[MAXARGS+1];/* in inESC wird der KommandoChar mit abgespeichert */
	UBYTE	inter[MAXINTER+1];		/* intermediates like '#' '?'.. */

	UBYTE	lastPRIVc;	/* only used by Privacy messages */
	UBYTE	DECSCA;
	UBYTE	identify;
	UBYTE	r_identify;
	UBYTE leds;
};

