/*********************************************************************
*  a terminal program that has ascii and xmodem transfer capability
*
*  use esc to abort xmodem transfer
*
*  written by Michael Mounier
*  new version by Dave Wecker 860621
************************************************************************/

/*  compiler directives to fetch the necessary header files */
#include <exec/types.h>
#include <exec/exec.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/text.h>
#include <graphics/regions.h>
#include <graphics/copper.h>
#include <graphics/gels.h>
#include <devices/serial.h>
#include <devices/keymap.h>
#include <hardware/blit.h>
#include <stdio.h>
#include <ctype.h>
#include <libraries/dos.h>
#include <functions.h>

#undef NULL
#define   NULL   ((void *)0)

#define INTUITION_REV 1L
#define GRAPHICS_REV  1L

/* things for xmodem send and recieve */
#define SECSIZ   0x80
#define TTIME    10          /* number of seconds for timeout */
#define BufSize  0x1000      /* Text buffer */
#define ERRORMAX 10          /* Max errors before abort */
#define RETRYMAX 10          /* Maximum retrys before abort */
#define SOH      1           /* Start of sector char */
#define EOT      4           /* end of transmission char */
#define ACK      6           /* acknowledge sector transmission */
#define NAK      21          /* error in transmission detected */

#define FILEMAX 6    /* number of file menu items */
#define RSMAX 5      /* speed menu items */
#define XFMAX 2      /* transfer mode items */
#define MAXMENU 3    /* total number of menu entries */

#define MINX    3L
#define MAXX    627L
#define MINY    18L
#define MAXY    202L

extern struct MsgPort *CreatePort();

#ifdef MODULE_MAIN
char    bufr[BufSize];
int     fd, timeout = FALSE;
long    bytes_xferred;
int     imagemode = TRUE;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

struct NewScreen NewScreen = {
   0,0,640,400,1,       /* left, top, width, height, depth */
   0,1,(HIRES|LACE),    /* DetailPen, BlockPen, ViewModes */
   CUSTOMSCREEN,NULL,   /* Type, Font */
   (UBYTE *)"VT100 Terminal Screen", /* Title */
   NULL,NULL };         /* Gadgets, Bitmap */

struct NewWindow NewWindow = {
   0,100,640,212,     /* left, top, width, height */
   0,1,              /* detailpen, blockpen */
   CLOSEWINDOW | RAWKEY | MENUPICK | NEWSIZE,
   WINDOWCLOSE | SMART_REFRESH | ACTIVATE | WINDOWDRAG
   | WINDOWDEPTH | WINDOWSIZING | REPORTMOUSE, /* Flags */
   NULL,NULL,        /* FirstGadget, CheckMark */
   (UBYTE *)
   "VT100 Terminal Window                                                  ",
   NULL,             /* set screen after open screen */
   NULL,             /* bitmap */
   640, 212, 640, 212,/* minw, minh, maxw, maxh */
   CUSTOMSCREEN      /* Type */
};

struct Screen *myscreen;            /* ptr to applications screen */
struct Window *mywindow;            /* ptr to applications window */
struct ViewPort *myviewport;
struct ColorMap *mycolormap;
USHORT *mycolortable;
struct IntuiMessage *NewMessage;    /* msg structure for GetMsg() */

struct MenuItem FileItem[FILEMAX];
struct IntuiText FileText[FILEMAX];
struct MenuItem RSItem[RSMAX];
struct IntuiText RSText[RSMAX];
struct MenuItem XFItem[XFMAX];
struct IntuiText XFText[XFMAX];
struct Menu menu[MAXMENU];
struct IOExtSer *Read_Request;
char rs_in[2];
struct IOExtSer *Write_Request;
char rs_out[2];
short x,y,curmode;

#else /* not MODULE_MAIN */
extern char    bufr[BufSize];
extern int     fd, timeout;
extern long    bytes_xferred;
extern int     imagemode;

extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;

extern struct NewScreen NewScreen;
extern struct NewWindow NewWindow;
extern struct Screen *myscreen;
extern struct Window *mywindow;
extern struct ViewPort *myviewport;
extern struct ColorMap *mycolormap;
extern USHORT *mycolortable;
extern struct IntuiMessage *NewMessage;
extern struct MenuItem FileItem[FILEMAX];
extern struct IntuiText FileText[FILEMAX];
extern struct MenuItem RSItem[RSMAX];
extern struct IntuiText RSText[RSMAX];
extern struct MenuItem XFItem[XFMAX];
extern struct IntuiText XFText[XFMAX];
extern struct Menu menu[MAXMENU];
extern struct IOExtSer *Read_Request;
extern char rs_in[2];
extern struct IOExtSer *Write_Request;
extern char rs_out[2];
extern short x,y,curmode;
#endif /* not MODULE_MAIN */

#ifndef MODULE_INIT
extern InitDevs(),InitFileItems(),InitRSItems(),InitXFItems(),InitMenu();
#endif

#ifndef MODULE_WINDOW
extern filename(),emits(),emit(),cursoroff(),cursoron(),toasc();
#endif

#ifndef MODULE_XMODEM
extern sendchar(), sendstring(), readchar(),
       XMODEM_Read_File(), XMODEM_Send_File();
#endif

#ifndef MODULE_REMOTE
extern doremote();
#endif

#ifndef MODULE_KERMIT
extern doksend(),dokreceive();
#endif

