home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
atarist.zip
/
asttty.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-06-19
|
13KB
|
517 lines
/*********************************/
/* IBM Block Terminal Emulation */
/* written by B. Nebel, March 86 */
/* Version 1.2 of 5/10/86 */
/*********************************/
/* include files */
/*****************/
#include "define.h" /* common C defintions */
#include "osbind.h" /* binding of TOS */
#include "gemdefs.h" /* GEM defintions */
/* some ASCII codes */
/********************/
#define NUL 0x00 /* ^@ */
#define SOH 0x01 /* ^A */
#define ETX 0x03 /* ^C */
#define BEL 0x07 /* ^G */
#define BS 0x08 /* ^H */
#define HT 0x08 /* ^I */
#define LF 0x0A /* ^J */
#define VT 0x0B /* ^K */
#define FF 0x0C /* ^L */
#define CR 0x0D /* ^M */
#define DC1 0x11 /* ^S */
#define DC3 0x13 /* ^Q */
#define SUB 0x1A /* ^Z */
#define ESC 0x1B /* ^[ */
#define DEL 0x7F
/* Some Scan Codes */
/*******************/
#define CLR_HOME_KEY 0x47
#define UP_KEY 0x48
#define LEFT_KEY 0x4B
#define RIGHT_KEY 0x4D
#define DOWN_KEY 0x50
#define INSERT_KEY 0x52
#define UNDO_KEY 0x61
#define HELP_KEY 0x62
/* global constant parameters */
/******************************/
#define ACCESSORY YES
#define MENU_NAME " IBM Terminal" /* name of menu entry */
#define MAX_LL 80 /* line length */
#define MAX_BUF 20 /* ring buffers */
/* external functions */
/**********************/
/* GEMDOS (osbind.h) */
/* Crawio, Cauxin, Cauxout, Cauxis, Malloc, Mfree */
/* XBIOS (osbind.h) */
/* Rsconf */
/* VDI */
extern int v_opnvwk();
extern int v_clsvwk();
extern int v_enter_cur();
extern int v_exit_cur();
extern int v_curright();
extern int v_curleft();
extern int v_curhome();
extern int v_eeos();
extern int v_eeol();
extern int vs_curaddress();
extern int vq_curaddress();
extern int v_curtext();
extern int vq_chcells();
extern int vro_copyfm();
/* AES */
extern int appl_init();
extern int appl_exit();
extern int graf_handle();
extern int graf_mouse();
extern int graf_growbox();
extern int menu_register();
extern int evnt_mesag();
extern int evnt_timer();
extern int wind_create();
extern int wind_open();
extern int wind_close();
extern int wind_delete();
extern int wind_get();
extern int wind_update();
extern int form_alert();
extern int gl_apid;
/* Global Variables */
/********************/
int menu_id, vdi_handle, wi_handle; /* some handles */
int gl_hchar, gl_wchar, gl_wbox, gl_hbox; /* sizes given back by VDI */
int xdesk, ydesk, hdesk, wdesk; /* desktop size and loc. */
int last_entry, next_entry; /* ptr to ring buffer */
char ring_buffer [MAX_BUF] [MAX_LL]; /* the ring buffer */
int ring_filled[MAX_BUF]; /* fill counter for ring buf */
int aux_received; /* if <> 0 someth. rec. by aux */
FDB scrn_mfdb; /* mfdbs for saving menu bar */
FDB save_mfdb;
int work_in[11]; /* params for vdi_opnvwk */
int work_out[57];
int pxy[8]; /* param for raster copy */
long int buff_loc = NIL; /* save buffer for menu bar */
long buff_size; /* buffer size */
int menbbuf[1000]; /* buffer for menu bar */
/* static allocation because
Malloc allocates too much */
int contrl[12]; /* VDI/AES glob. params */
int intin[128];
int ptsin[128];
int intout[128];
int ptsout[128];
/**********************************/
/* Initializations & Terminations */
/**********************************/
open_vdi()
/* open virtual work station */
{
int i;
vdi_handle = graf_handle(&gl_wchar, &gl_hchar, &gl_wbox, &gl_hbox);
for (i = 1; i < 10; i++)
{ work_in[i] = 1; }
work_in[10] = 2;
v_opnvwk(work_in, &vdi_handle, work_out);
wind_get(0,WF_WORKXYWH,&xdesk,&ydesk,&wdesk,&hdesk);
}
int init_terminal()
/* init virtual workstation as a terminal */
{
graf_mouse(M_OFF,NIL);
if (!(save_menu_bar())) return FALSE;
wi_handle = wind_create(0,xdesk,ydesk,wdesk,hdesk);
graf_growbox(xdesk,ydesk,gl_wbox,gl_hbox,xdesk,ydesk,wdesk,hdesk);
wind_open(wi_handle,xdesk,ydesk,wdesk,hdesk);
v_enter_cur(vdi_handle);
v_curhome(vdi_handle);
v_eeos(vdi_handle);
return TRUE;
}
int save_menu_bar()
/* save menu bar in a area to be allocated */
{
vq_extnd(vdi_handle, 0, work_out);
save_mfdb.fd_w = work_out[0] + 1;
save_mfdb.fd_h = ydesk;
save_mfdb.fd_wdwidth = save_mfdb.fd_w >> 4;
save_mfdb.fd_stand = 0;
vq_extnd(vdi_handle, 1, work_out);
save_mfdb.fd_nplanes = work_out[4];
buff_size = (save_mfdb.fd_w >> 3) * save_mfdb.fd_h * save_mfdb.fd_nplanes;
buff_loc = save_mfdb.fd_addr =
/* ((buff_loc == NIL) ? (Malloc(buff_size)) : buff_loc);
* I use static allocation because Malloc stole me 50 K!
*/
&menbbuf[0];
scrn_mfdb.fd_addr = 0;
if (buff_loc == NIL)
{form_alert(1,"[1][Nicht genug Speicherplatz vorhanden][Abort]");
return FALSE;};
pxy[0] = pxy[4] = 0;
pxy[1] = pxy[5] = 0;
pxy[2] = pxy[6] = save_mfdb.fd_w - 1;
pxy[3] = pxy[7] = ydesk - 1;
vro_cpyfm(vdi_handle,3,pxy,&scrn_mfdb,&save_mfdb);
return TRUE;
}
close_vdi()
/* close virtual workstation */
v_clsvwk(vdi_handle);
exit_terminal()
/* exit terminal mode */
{
v_exit_cur(vdi_handle);
restore_menu_bar();
wind_close(wi_handle);
wind_delete(wi_handle);
graf_shrinkbox(xdesk,ydesk,gl_wbox,gl_hbox,xdesk,ydesk,wdesk,hdesk);
#if !ACCESSORY
graf_mouse(M_ON,NIL);
#endif
}
restore_menu_bar()
{
vro_cpyfm(vdi_handle,3,pxy,&save_mfdb,&scrn_mfdb);
/* Mfree(buff_loc); Do not free because it doesn't work right! */
graf_mouse(M_ON,NIL);
}
/*****************/
/* VDI Functions */
/*****************/
vdi_ch(ch)
int ch;
Crawio(ch);
vdi_line(string)
char string[];
{
v_curtext(vdi_handle,string);
vdi_ch(CR);
vdi_ch(LF);
}
/**********************/
/* Terminal Functions */
/**********************/
help()
{
v_curhome(vdi_handle);
v_eeos(vdi_handle);
vdi_line("**********************");
vdi_line("* IBM Block Terminal *");
vdi_line("**********************");
vdi_line("");
vdi_line("BACKSPACE - letztes Zeichen lschen");
vdi_line("DELETE - aktuelles Zeichen lschen");
vdi_line("INSERT - lsche Zeile");
vdi_line("RETURN und ENTER - sende Zeile");
vdi_line("CLR HOME - sende BREAK Sequenz");
vdi_line("Pfeile links/rechts - Cursor in der Zeile bewegen");
vdi_line("Pfeile oben/unten - letzte/nchste Zeile editieren");
vdi_line("HELP - Ausgabe dieser Meldung");
vdi_line("UNDO - zurck zum Desktop");
vdi_line("");
}
flush_rs232_buffer()
while (Cauxis() != 0) Cauxin();
flush_terminal_buffer()
while (Crawio(0xFF) != 0);
wait_for_char(scan_code,ch)
char *scan_code,*ch;
{
long result;
do {*scan_code = NUL;
if ((result = Crawio(0xFF)) != 0)
{
*ch = result & 0xFF;
*scan_code = result >> 16 ;
}
else
{if (Cauxis() != 0)
{result = Cauxin();
*ch = result & 0x7F;
if (*ch <= '~')
{
vdi_ch(*ch);
aux_received = YES;
};
};
};
}
while (*scan_code == NUL);
}
send_break()
{char tsr;
tsr = (Rsconf(-1,-1,-1,-1,-1,-1) >> 16) & 0xFF;
Rsconf(-1,-1,-1,-1,(tsr | 0x08),-1);
evnt_timer(750,0);
Rsconf(-1,-1,-1,-1,tsr,-1);
}
ring_bell()
vdi_ch(BEL);
redisplay(from,to,line)
int from, to;
char line[];
{
int i,r,c;
vq_curaddress(vdi_handle,&r,&c);
for (i = from; i <= to; i++) vdi_ch(line[i]);
v_eeol(vdi_handle);
vs_curaddress(vdi_handle,r,c);
}
move_right(dummy)
int dummy;
v_curright(vdi_handle);
move_left(vcol)
int vcol;
{
int r,c;
vq_chcells(vdi_handle,&r,&c);
if (c >= vcol) v_curleft(vdi_handle);
}
shift_right(from, to, line)
int from, to;
char line[];
{
int i;
for (i = to ; i >= from ; i--) line[i+1] = line[i];
}
shift_left(from, to, line)
int from, to;
char line[];
{
int i;
for (i = from; i <= to; i++) line[i] = line[i+1];
}
copy_buf_entry(src,dst)
char src[];
char dst[];
{
int i;
for (i = 0; i < MAX_LL; i++) dst[i] = src[i];
}
int dec_entry(e)
int *e;
return ((--(*e) < 0) ? (*e = MAX_BUF - 1) : (*e));
int inc_entry(e)
int *e;
return ((++(*e) >= MAX_BUF) ? (*e = 0) : (*e));
int get_line(filled, line)
int *filled;
char line[];
{
int pos, scol, srow;
char ch, scan_code;
aux_received = NO;
pos = 0;
*filled = 0;
vq_curaddress(vdi_handle,&srow,&scol);
while (TRUE)
{
wait_for_char(&scan_code,&ch);
if (aux_received)
{vq_curaddress(vdi_handle,&srow,&scol);
redisplay(0,*filled-1,line);
vs_curaddress(vdi_handle,srow,scol+pos);
aux_received = NO;
};
if (ch != NUL)
{if ((ch >= ' ') && (ch <= '~'))
{if (*filled >= MAX_LL)
ring_bell();
else
{shift_right(pos, (*filled)-1, line);
line[pos] = ch;
redisplay(pos,*filled,line);
(*filled)++;
pos++;
move_right(scol+pos);
};
}
else
switch (ch)
{case CR: vdi_ch(CR); return TRUE;
case BS: if (pos == 0)
ring_bell();
else
{move_left(scol+pos);
shift_left(--pos,--(*filled),line);
redisplay(pos,(*filled)-1,line);
};
break;
case DEL: if (pos == *filled)
ring_bell();
else
{shift_left(pos,--(*filled),line);
redisplay(pos,(*filled)-1,line);
};
break;
default: ring_bell(); break;
};
}
else
switch (scan_code)
{case UNDO_KEY:
return FALSE;
case LEFT_KEY:
if (pos == 0) ring_bell(); else move_left(scol+pos--);
break;
case RIGHT_KEY:
if (pos == *filled) ring_bell(); else move_right(scol+pos++);
break;
case UP_KEY:
pos = *filled = ring_filled[dec_entry(&last_entry)];
copy_buf_entry(ring_buffer[last_entry],line);
vs_curaddress(vdi_handle,srow,scol);
redisplay(0,(*filled)-1,line);
vs_curaddress(vdi_handle,srow,scol+pos);
break;
case DOWN_KEY:
pos = *filled = ring_filled[inc_entry(&last_entry)];
copy_buf_entry(ring_buffer[last_entry],line);
vs_curaddress(vdi_handle,srow,scol);
redisplay(0,(*filled)-1,line);
vs_curaddress(vdi_handle,srow,scol+pos);
break;
case HELP_KEY:
help();
vq_curaddress(vdi_handle,&srow,&scol);
redisplay(0,*filled-1,line);
vs_curaddress(vdi_handle,srow,scol+pos);
break;
case CLR_HOME_KEY:
vs_curaddress(vdi_handle,srow,scol);
v_eeol(vdi_handle);
pos = *filled = 0;
send_break();
aux_received = TRUE;
break;
case INSERT_KEY:
vs_curaddress(vdi_handle,srow,scol);
v_eeol(vdi_handle);
pos = *filled = 0;
break;
default: ring_bell(); break;
};
};
}
send_line(filled,line)
int filled;
char line[];
{
int i;
for (i = 0; i < filled; i++) Cauxout(line[i]);
Cauxout(CR);
}
terminal()
{
char this_line[MAX_LL];
int this_fill;
vdi_ch(ESC);
vdi_ch('w');
help();
flush_rs232_buffer();
flush_terminal_buffer();
while (TRUE)
{if (!get_line(&this_fill,this_line)) break;
send_line(this_fill,this_line);
if (this_fill != 0)
{ring_filled[next_entry] = this_fill;
copy_buf_entry(this_line,ring_buffer[next_entry]);
inc_entry(&next_entry);
};
last_entry = next_entry;
};
}
init_accessory()
menu_id = menu_register(gl_apid,MENU_NAME);
handle_events()
{
int mbuf[10];
while (TRUE)
{evnt_mesag(mbuf);
{if ((mbuf[0] == AC_OPEN) && (mbuf[4] == menu_id))
{wind_update(BEG_UPDATE);
open_vdi();
if (init_terminal())
{terminal ();
exit_terminal();
};
close_vdi();
wind_update(END_UPDATE);
};
};
};
}
main()
{appl_init();
#if ACCESSORY
init_accessory();
handle_events();
#else
open_vdi();
if (init_terminal())
{terminal();
exit_terminal();};
close_vdi();
appl_exit();
#endif
}