home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
427.lha
/
pmdcom
/
sources
/
pc8.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-08
|
32KB
|
1,116 lines
/* pmdcom.c ,Lattice 5.04, public domain-use it,abuse it,lose it */
/* Paul DePetrillo August, 1990 */
/* with some help from Rush,Pink Floyd,Mr. Big, MSG, etc. */
#include "pc8.h"
VOID main(argc,argv)
int argc;
char **argv;
{
if (argc >1 && argv[1][0]=='w') custom=0;
doinit();
asyncRexxCmd("init");
SendIO((struct IORequest *)serread_req);
while(go)
{
signals=Wait(windowmask|serialmask|rexxbit);
if (CheckIO((struct IORequest *)serread_req)) doserial();
if (signals & windowmask ) dowindow();
if (signals & rexxbit) dispRexxPort();
}
cleanup(24);
}
void doserial()
{
int actual,i,p,a;
actual=readserial();
if (hostmon) { /* where the protocol autostarts */
actual=XProtocolHostMon(&io,&serbuf[0],actual,512);
if (actual==0) {
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
return;
}
}
for (i=0;i<actual;i++) {
serbuf[i] = serbuf[i] & 0x7f; /* strip high bit */
if (serbuf[i]<32) {
switch (serbuf[i])
{
case 7:
case 8:
case 10:
case 12:
case 13:
case 27:
break;
default: /* convert garbage to spaces */
serbuf[i]=32;
}
}
}
conwrite_req->io_Data=(APTR)&serbuf[0];
conwrite_req->io_Length=actual;
DoIO((struct IORequest *)conwrite_req);
p=actual;
i=0;
if (capture) { /* capture to file with 4k buffer */
while (p>0) {
if ( txtpos==4096 ) {
a=fwrite(&txtbuf[0],512,8,fp);
if (a < 8) {
fclose(fp);
printstr("\nError writing to file.\n");
capture=0;
}
txtpos=0;
}
txtbuf[txtpos++]=serbuf[i++];
--p;
}
}
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
}
int readserial()
{
int len,actual;
serret=(struct IOExtSer *)GetMsg((struct MsgPort *)serial_portr);
actual=1;
serread_req->IOSer.io_Command=SDCMD_QUERY;
DoIO((struct IORequest *)serread_req);
serread_req->IOSer.io_Command=CMD_READ;
len=(struct IORequest *)serread_req->IOSer.io_Actual;
if (len>0) {
if (len>511) len=511;
serread_req->IOSer.io_Data=(APTR)&serbuf[1];
serread_req->IOSer.io_Length=len;
DoIO((struct IORequest *)serread_req);
actual=actual+len;
}
return(actual);
}
VOID dowindow()
{
while(message=(struct IntuiMessage *)GetMsg(window->UserPort))
{
mclass=message->Class;
mcode=message->Code;
iaddress=message->IAddress;
ReplyMsg((struct Message *)message);
switch (mclass) {
case MENUPICK:
domenu();
break;
case VANILLAKEY:
key=(USHORT)mcode;
serwrite_req->IOSer.io_Data=(APTR)&key;
serwrite_req->IOSer.io_Length=1;
DoIO((struct IORequest *)serwrite_req);
break;
default:
break;
}
}
if (doup) { /* enter protocol from here */
doupload(NULL); /* instead of domenu */
doup=0;
}
if (dodwn) {
dodownload(NULL);
dodwn=0;
}
}
VOID domenu()
{
long status;
char tbuffer[75];
while(mcode!=MENUNULL) {
switch(MENUNUM(mcode)) {
case 0:
switch(ITEMNUM(mcode)) {
case 0:
Request(&myreq,window);
break;
case 1:
ColorRequester(1L);
break;
case 2:
if (custom) {
if (tit) {
ShowTitle(screen,FALSE);
tit=0;}
else {
ShowTitle(screen,TRUE);
tit=1;}
}
else {
strcpy(&tbuffer[0],"");
status=GetString(&tbuffer[0],(char *)"Title?", window, 50, 74);
if (status==TRUE) SetWindowTitles(window,&tbuffer[0],NULL);
}
break;
case 3:
go=0; /* user chose quit */
break;
}
break;
case 1:
switch(ITEMNUM(mcode)) {
case 0:
if (capture) closecapture();
else opencapture(NULL);
break;
case 1:
dodwn=1;
break;
case 2:
doup=1;
break;
case 3:
doprotocol(NULL,NULL);
break;
}
break;
case 2:
switch(ITEMNUM(mcode)) {
case 0:
switch(SUBNUM(mcode)) {
case 0:
baud=1200;
break;
case 1:
baud=2400;
break;
case 2:
baud=9600;
break;
}
break;
case 1:
set=(SUBNUM(mcode)+1);
break;
}
setserial(baud,set);
break;
case 3:
asyncRexxCmd(&cmd[(ITEMNUM(mcode)*50)]); /*run a macro*/
break;
} /* end switch(menunum) */
mitem=(struct MenuItem *)ItemAddress((struct Menu *)&mstrip,mcode);
mcode=mitem->NextSelect;
} /* end while menucode!=menunull */
} /* end domenu() */
VOID dodownload(filen)
char *filen;
{
int success;
if (XProtocolBase==NULL) {
if (filen==NULL) {
printstr("\nError: no protocol selected.\n");
return;}
else {
ohshit=10; /* rexx return code */
return;}
}
if (rxreq & (filen==NULL)) {
myfilereq.Title=(UBYTE *)"Download to file:";
success=FileRequester(&myfilereq);
if (success==FALSE) return;
io.xpr_filename=&frpath[0];
}
else io.xpr_filename=filen;
printstr("\nWaiting for start...\n");
AbortIO((struct IORequest *)serread_req);
Wait(serialmask);
WaitIO((struct IORequest *)serread_req);
err=XProtocolReceive(&io);
if (err && filen) ohshit=15;
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
SetWindowTitles(window,0,0);
}
VOID doupload(filen)
char *filen;
{
int success;
if (XProtocolBase==NULL) {
if (filen==NULL) {
printstr("\nError: no protocol selected.\n");
return;}
else {
ohshit=10;
return;}
}
if (sendreq & (filen==NULL)) {
myfilereq.Title=(UBYTE *)"Upload File:";
success=FileRequester(&myfilereq);
if (success==FALSE) return;
else io.xpr_filename=&frpath[0];
}
else io.xpr_filename=filen;
AbortIO((struct IORequest *)serread_req);
Wait(serialmask);
WaitIO((struct IORequest *)serread_req);
printstr("\nWaiting for start...\n");
err=XProtocolSend(&io);
if (err) ohshit=15;
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
SetWindowTitles(window,0,0);
}
VOID doprotocol(proto,op)
char *proto;
char *op;
{
int success;
char t[3];
t[0]=34;
t[1]=34;
t[2]=0;
if (proto==NULL) {
myfilereq.Title=(UBYTE *)"Select Protocol:";
strcpy(&frdir[0],(char *)"libs:");
myfilereq.Dir=&frdir[0];
strcpy(myfilereq.Show,(char *)"xpr#?.library");
myfilereq.File=&frfile[0];
myfilereq.PathName=&frpath[0];
success=FileRequester(&myfilereq);
strcpy(&frdir[0],(char *)"");
strcpy(myfilereq.Show,(char *)"#?");
if (success==FALSE) return;
}
else strcpy(&frpath[0],proto);
if (XProtocolBase != NULL) {
XProtocolCleanup(&io);
CloseLibrary(XProtocolBase);
}
XProtocolBase=OpenLibrary((char *)&frpath[0],0);
if (XProtocolBase==NULL) {
ohshit=10;
printstr("\nError: could not open library.\n");
return;
}
io.xpr_update=xupdate;
io.xpr_fopen=xfopen;
io.xpr_fclose=xfclose;
io.xpr_fread=xfread;
io.xpr_fwrite=xfwrite;
io.xpr_finfo=xfinfo;
io.xpr_fseek=xfseek;
io.xpr_sread=xsread;
io.xpr_swrite=xswrite;
io.xpr_sflush=xsflush;
io.xpr_gets=xgets;
io.xpr_chkabort=xchkabort;
if (proto==NULL) io.xpr_filename=NULL;
else io.xpr_filename=op;
err=XProtocolSetup(&io);
if (err == XPRS_FAILURE) {
XProtocolCleanup(&io);
CloseLibrary(XProtocolBase);
printstr("Error: protocol failed to initialize. Library closed.\n");
hostmon=0;
ohshit=10;
return;
}
if (err & XPRS_HOSTMON) hostmon=1;
else hostmon=0;
if (err & XPRS_NORECREQ) rxreq=0;
else rxreq=1;
if (err & XPRS_NOSNDREQ) sendreq=0;
else sendreq=1;
}
VOID opencapture(file)
char *file;
{
int success;
if (file==NULL) {
myfilereq.Title=(UBYTE *)"Capture to file:";
success=FileRequester(&myfilereq);
if (success==FALSE) return;
}
else strcpy(&frpath[0],file);
fp=fopen(&frpath[0],"w");
if (fp==NULL) {
printstr("\nError:could not open file.\n");
ohshit=10;
return;
}
capture=1;
txtpos=0;
}
VOID closecapture()
{
if (capture==0) return;
if (txtpos==4096) fwrite(&txtbuf[0],512,8,fp);
else {
txtbuf[txtpos]=0;
fputs(&txtbuf[0],fp);}
fclose(fp);
capture=0;
}
VOID printstr(str)
char *str;
{
conwrite_req->io_Data=(APTR)str;
conwrite_req->io_Length=-1;
DoIO((struct IORequest *)conwrite_req);
}
VOID cleanup(anum)
int anum;
{
dnRexxPort();
closecapture();
switch(anum) {
case 24:
if (XProtocolBase) XProtocolCleanup(&io);
case 23:
if (XProtocolBase) CloseLibrary(XProtocolBase);
case 22:
CloseDevice((struct IORequest *)timerreq);
case 21:
DeleteExtIO( (struct IORequest *)timerreq);
case 20:
DeletePort((struct MsgPort *)timer_port);
case 19:
CloseDevice((struct IORequest *)serread_req);
case 18:
CloseDevice((struct IORequest *)serwrite_req);
case 17:
FreeMem(serread_req,sizeof(struct IOExtSer));
case 16:
FreeMem(serwrite_req,sizeof(struct IOExtSer));
case 15:
DeletePort((struct MsgPort *)serial_portr);
case 14:
DeletePort((struct MsgPort *)serial_portw);
case 13:
case 12:
CloseDevice((struct IORequest *)conwrite_req);
case 11:
case 10:
DeleteStdIO(conwrite_req);
case 9:
case 8:
DeletePort((struct MsgPort *)console_portw);
case 7:
if (custom) myprocess->pr_WindowPtr=oldwin;
ClearMenuStrip(window);
CloseWindow(window);
case 5:
if (screen) CloseScreen(screen);
case 3:
CloseLibrary(ReqBase);
case 2:
CloseLibrary(IntuitionBase);
case 1:
exit(1);
}
}
VOID doinit()
{
int error;
IntuitionBase=OpenLibrary("intuition.library",0);
if ( IntuitionBase==NULL ) cleanup(1);
ReqBase=OpenLibrary("req.library",0);
if (ReqBase==NULL) cleanup(2);
if (custom) {
screen=(struct Screen *)OpenScreen(&cns);
if (screen==NULL) cleanup(3);
cnw.Screen=screen;
window=(struct Window *)OpenWindow(&cnw);
if ( window==NULL ) cleanup(5);
ShowTitle(screen,FALSE);
SetMenuStrip(window,(struct Menu *)&mstrip);
myprocess=(struct Process *)FindTask(0);
oldwin=(struct Window *)myprocess->pr_WindowPtr;
myprocess->pr_WindowPtr=(APTR)window;
}
else {
window=(struct Window *)OpenWindow(&wnw);
if ( window==NULL ) cleanup(3);
SetMenuStrip(window,(struct Menu *)&mstrip);
}
console_portw=(struct MsgPort *)CreatePort("conportw",0);
if ( console_portw==NULL ) cleanup(7);
conwrite_req=(struct IOStdReq *)CreateStdIO((struct MsgPort *)console_portw);
if ( conwrite_req==NULL ) cleanup(9);
conwrite_req->io_Data=(APTR)window;
conwrite_req->io_Length=sizeof(*window);
error=OpenDevice("console.device",0,(struct IORequest *)conwrite_req,0);
if ( error != 0 ) cleanup(11);
conwrite_req->io_Command=CMD_WRITE;
serial_portw=(struct MsgPort *)CreatePort("serportw",0);
if ( serial_portw==NULL ) cleanup(13);
serial_portr=(struct MsgPort *)CreatePort("serportr",0);
if ( serial_portr==NULL ) cleanup(14);
serwrite_req=(struct IOExtSer *)AllocMem(sizeof(struct IOExtSer),MEMF_PUBLIC|MEMF_CLEAR);
if ( serwrite_req==NULL ) cleanup(15);
serwrite_req->IOSer.io_Message.mn_ReplyPort=serial_portw;
serwrite_req->io_SerFlags=SERF_SHARED|SERF_XDISABLED;
serread_req=(struct IOExtSer *)AllocMem(sizeof(struct IOExtSer),MEMF_PUBLIC|MEMF_CLEAR);
if ( serread_req==NULL ) cleanup(16);
serread_req->IOSer.io_Message.mn_ReplyPort=serial_portr;
serread_req->io_SerFlags=SERF_SHARED|SERF_XDISABLED;
error=OpenDevice("serial.device",0,(struct IORequest *)serwrite_req,0);
if (error != 0) cleanup(17);
error=OpenDevice("serial.device",0,(struct IORequest *)serread_req,0);
if (error != 0) cleanup(18);
serread_req->io_Baud=1200;
serread_req->io_ReadLen=8;
serread_req->io_WriteLen=8;
serread_req->io_SerFlags &= ~SERF_PARTY_ON;
serread_req->IOSer.io_Command=SDCMD_SETPARAMS;
DoIO((struct IORequest *)serread_req);
serwrite_req->IOSer.io_Command=CMD_WRITE;
serread_req->IOSer.io_Command=CMD_READ;
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
serialmask=(1<<serial_portr->mp_SigBit);
windowmask=(1<<window->UserPort->mp_SigBit);
timer_port=(struct MsgPort *)CreatePort("pdtimer",0);
if ( timer_port==NULL ) cleanup(19);
timerreq=(struct timerequest *)CreateExtIO(timer_port,sizeof(struct timerequest) );
if (timerreq==NULL) cleanup(20);
error=OpenDevice("timer.device",UNIT_VBLANK,(struct IORequest *)timerreq,0);
if (error) cleanup(21);
timermask=(1<<timer_port->mp_SigBit);
rexxbit = upRexxPort("pmdcom", rcl, "pmd", &disp) ;
printstr("\n\n");
if (!(rexxbit)) printstr("Rexxport not active.");
baud=1200;
set=1;
capture=0;
txtpos=0;
strcpy(&words[0],(char *)"macro1"); /* what a waste */
strcpy(&words[50],(char *)"macro2");
strcpy(&words[100],(char *)"macro3");
strcpy(&words[150],(char *)"macro4");
strcpy(&words[200],(char *)"macro5");
strcpy(&words[250],(char *)"macro6");
strcpy(&words[300],(char *)"macro7");
strcpy(&words[350],(char *)"macro8");
strcpy(&words[400],(char *)"macro9");
strcpy(&words[450],(char *)"macro0");
strcpy(&cmd[0],(char *)"macro1");
strcpy(&cmd[50],(char *)"macro2");
strcpy(&cmd[100],(char *)"macro3");
strcpy(&cmd[150],(char *)"macro4");
strcpy(&cmd[200],(char *)"macro5");
strcpy(&cmd[250],(char *)"macro6");
strcpy(&cmd[300],(char *)"macro7");
strcpy(&cmd[350],(char *)"macro8");
strcpy(&cmd[400],(char *)"macro9");
strcpy(&cmd[450],(char *)"macro0");
myfilereq.Dir=&frdir[0];
myfilereq.File=&frfile[0];
myfilereq.PathName=&frpath[0];
}
/* here are the xpr routines */
long __saveds __regargs xsflush()
{
long err;
serread_req->IOSer.io_Command=CMD_CLEAR;
DoIO((struct IORequest *)serread_req);
err=(UBYTE)serread_req->IOSer.io_Error;
serread_req->IOSer.io_Command=CMD_READ;
if (err) return(1);
else return(0);
}
long __saveds __regargs xchkabort()
{
int abort=0;
while(message=(struct IntuiMessage *)GetMsg(window->UserPort))
{
mclass=message->Class;
mcode=message->Code;
iaddress=message->IAddress;
ReplyMsg((struct Message *)message);
switch (mclass) {
case VANILLAKEY:
key=(USHORT)mcode;
if (key==0x1b) abort=1;
break;
default:
break;
}
}
if (abort) {
abort=0;
return(1);
}
else return(0);
}
long __saveds __regargs xfinfo(filename,type)
char *filename;
long type;
{
struct FileInfoBlock fib;
long ret;
if (type==2) return(1); /* cheat, always say it's binary */
ret=dfind(&fib,filename,0);
if (ret) return(0);
ret=fib.fib_Size;
return(ret);
}
long __saveds __regargs xgets(prompt,buffer)
char *prompt,*buffer;
{
long status;
status = GetString(buffer, prompt, window, 50, 255);
return(status);
}
long __saveds __regargs xfopen(filename,accessmode)
char *filename,*accessmode;
{
long ret;
FILE *xfp;
xfp=fopen(filename,accessmode);
ret=(FILE *)xfp;
return(ret);
}
long __saveds __regargs xfclose(xfp)
FILE *xfp;
{
long ret;
ret=fclose(xfp);
return(ret);
}
long __saveds __regargs xfread(buf,size,count,xfp)
char *buf;
long size,count;
FILE *xfp;
{
long ret;
ret=fread(buf,size,count,xfp);
return(ret);
}
long __saveds __regargs xfwrite(buf,size,count,fp)
char *buf;
long size,count;
FILE *fp;
{
long ret;
ret=fwrite(buf,size,count,fp);
return(ret);
}
long __saveds __regargs xfseek(fp,offset,origin)
FILE *fp;
long offset,origin;
{
long ret;
ret=fseek(fp,offset,origin);
return(ret);
}
/* read from serial port, with timeout */
long __saveds __regargs xsread(buff,length,micros)
char *buff;
long length,micros;
{
long secs = 0L;
long i = 0L;
long l;
ULONG sigs;
if (buff == NULL) return(-1L);
if (micros) {
if (micros > 1000000L) { /* recognize this? */
secs = micros / 1000000L;
micros = micros % 1000000L;
}
if (micros<2) micros=3;
timerreq->tr_node.io_Command=TR_ADDREQUEST;
timerreq->tr_time.tv_secs=secs;
timerreq->tr_time.tv_micro=micros;
serread_req->IOSer.io_Command=CMD_READ;
serread_req->IOSer.io_Data=(APTR)buff;
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
SendIO((struct IORequest *)timerreq);
while(1)
{
sigs=Wait(timermask|serialmask);
if (CheckIO((struct IORequest *)serread_req)) {
serret=(struct IOExtSer *)GetMsg(serial_portr);
i++;
buff++;
if (i==length) {
AbortIO((struct IORequest *)timerreq);
Wait(timermask);
WaitIO((struct IORequest *)timerreq);
return(i);
}
serread_req->IOSer.io_Command=CMD_READ;
serread_req->IOSer.io_Data=(APTR)buff;
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
}
if (CheckIO((struct IORequest *)timerreq)) {
timerreq=(struct IORequest *)GetMsg(timer_port);
AbortIO((struct IORequest *)serread_req);
WaitIO((struct IORequest *)serread_req);
return(i);
}
}
}
else {
serread_req->IOSer.io_Command=SDCMD_QUERY;
DoIO((struct IORequest *)serread_req);
l=serread_req->IOSer.io_Actual;
serread_req->IOSer.io_Command=CMD_READ;
if (l) {
serread_req->IOSer.io_Data=(APTR)buff;
serread_req->IOSer.io_Length=l;
DoIO((struct IORequest *)serread_req);
}
return(l);
}
}
long __saveds __regargs xswrite(buf,size)
char *buf;
long size;
{
long ret;
serwrite_req->IOSer.io_Data=(APTR)buf;
serwrite_req->IOSer.io_Length=size;
DoIO((struct IORequest *)serwrite_req);
ret=(ULONG)serwrite_req->IOSer.io_Actual;
return(ret);
}
long __saveds __regargs xupdate(ud) /* display some info about transfer*/
struct XPR_UPDATE *ud;
{
char out[100];
char stat[70];
strcpy(&stat[0],(char *)" ");
if (!tit & custom) {
ShowTitle(screen,TRUE);
tit=1;
}
if (ud->xpru_updatemask & XPRU_PROTOCOL) {
printstr(ud->xpru_protocol);
printstr("\n");}
if (ud->xpru_updatemask & XPRU_FILENAME) {
printstr(ud->xpru_filename);
printstr("\n");}
if (ud->xpru_updatemask & XPRU_MSG) {
printstr(ud->xpru_msg);
printstr("\n");}
if (ud->xpru_updatemask & XPRU_ERRORMSG) {
printstr(ud->xpru_errormsg);
printstr("\n");}
if (ud->xpru_updatemask & XPRU_ERRORS) {
stci_d(&out[0],ud->xpru_errors);
printstr(&out);
printstr(" errors\n");}
if (ud->xpru_updatemask & XPRU_BYTES) {
stci_d(&out[0],ud->xpru_bytes);
strcpy(&stat[0],&out[0]);
strcat(&stat[0],(char *)" bytes ");}
if (ud->xpru_updatemask & XPRU_BLOCKS) {
stci_d(&out[0],ud->xpru_blocks);
strcat(&stat[0],&out[0]);
strcat(&stat[0],(char *)" blocks ");}
if (ud->xpru_updatemask & XPRU_DATARATE) {
stci_d(&out[0],ud->xpru_datarate);
strcat(&stat[0],&out[0]);
strcat(&stat[0],(char *)"cps ");}
if (ud->xpru_updatemask & XPRU_ELAPSEDTIME) {
strcat(&stat[0],ud->xpru_elapsedtime);}
if (ud->xpru_updatemask & XPRU_EXPECTTIME) {
strcat(&stat[0],(char *)"/");
strcat(&stat[0],ud->xpru_expecttime);}
if (custom) SetWindowTitles(window,NULL,(char *)&stat);
else SetWindowTitles(window,(char *)&stat,NULL);
return(0);
}
/* the dispatch function for rexx-see arexx disk, minrexx.c example */
int disp(msg, dat, p)
register struct RexxMsg *msg ;
register struct rexxCommandList *dat ;
char *p ;
{
replyed=0;
((int (*)())(dat->userdata))(msg, p) ;
if (!replyed) replyRexxCmd(msg, 0L, 0L, NULL) ;
return(0);
}
void rexxquitcom(msg, p)
struct RexxMsg *msg ;
char *p ;
{
go=0;
}
void rexxdownload(msg, p)
struct RexxMsg *msg;
char *p;
{
ohshit=0;
dodownload();
if (ohshit) {
replyRexxCmd(msg,ohshit,0,NULL);
replyed=1;
return;
}
}
void rexxupload(msg, p)
struct RexxMsg *msg;
char *p;
{
ohshit=0;
doupload();
if (ohshit) {
replyRexxCmd(msg,ohshit,0,NULL);
replyed=1;
return;
}
}
void rexxecho(msg, p)
struct RexxMsg *msg;
char *p;
{
printstr(p);
printstr("\n");
}
void rexxsend(msg,p)
struct RexMsg *msg;
char *p;
{
int i=0;
char lineout[80];
p=stpblk(p);
while ( (!(*p==0)) & i<78 ) {
if (*p=='^') {
*p++;
lineout[i]=(*p-64);
i++;
*p++;
}
else {
lineout[i]=*p;
i++;
*p++;
}
}
lineout[i]=0;
serwrite_req->IOSer.io_Data=(APTR)&lineout;
serwrite_req->IOSer.io_Length=-1;
DoIO((struct IORequest *)serwrite_req);
}
void rexxgetstr(msg, p)
struct RexxMsg *msg;
char *p;
{
char buffer[256];
long status;
status = GetString(&buffer, p, window, 50, 255);
replyRexxCmd(msg, 0, 0, &buffer);
replyed=1;
return;
}
void rexxmacro(msg,p)
struct RexxMsg *msg;
char *p;
{
char num[10],xword[16],xcmd[50];
p=stpblk(p);
p=stptok(p,&num,10," ");
p=stpblk(p);
p=stptok(p,&xword,16," ");
p=stpblk(p);
p=stptok(p,&xcmd,50," ");
if ( (atoi(&num)<0) | (atoi(&num)>10) ) {
replyRexxCmd(msg,10,0,NULL);
replyed=1;
return;
}
strcpy(&words[(((atoi(&num))-1)*50)],&xword[0]);
strcpy(&cmd[(((atoi(&num))-1)*50)],&xcmd[0]);
}
void rexxproto(msg,p)
struct RexxMsg *msg;
char *p;
{
char a[32],b[32];
p=stpblk(p);
p=stptok(p,&a[0],32," ");
p=stpblk(p);
p=stptok(p,&b[0],32," ");
ohshit=0;
doprotocol(&a[0],&b[0]);
if (ohshit) {
replyRexxCmd(msg,ohshit,0,NULL);
replyed=1;
return;
}
}
void rexxserial(msg,p)
struct RexxMsg *msg;
char *p;
{
int i,e;
char b[10],s[10];
p=stpblk(p);
if (!(*p)) return;
p=stptok(p,&b,10," ");
p=stpblk(p);
p=stptok(p,&s,10," ");
e=setserial(atol(&b),atol(&s));
if (e) {
replyRexxCmd(msg,10,0,NULL);
replyed=1;
return;
}
ClearMenuStrip(window);
for (i=1;i<4;i++) m2i[i].Flags &= ~CHECKED;
if (atol(&b)==1200) i=1;
else if (atol(&b)==2400) i=2;
else i=3;
m2i[i].Flags |= CHECKED;
for (i=5;i<9;i++) m2i[i].Flags &= ~CHECKED;
m2i[atoi(&s)+4].Flags |= CHECKED;
SetMenuStrip(window,(struct Menu *)&mstrip);
}
int setserial(baud,set)
long baud;
long set;
{
int err;
AbortIO((struct IORequest *)serread_req);
Wait(serialmask);
WaitIO((struct IORequest *)serread_req);
serread_req->IOSer.io_Command=CMD_FLUSH;
DoIO((struct IORequest *)serread_req);
serread_req->IOSer.io_Command=CMD_CLEAR;
DoIO((struct IORequest *)serread_req);
serread_req->io_Baud=baud;
if (set==1) {
serread_req->io_ReadLen=8;
serread_req->io_WriteLen=8;
serread_req->io_SerFlags &= ~SERF_PARTY_ON;}
else if (set==2) {
serread_req->io_ReadLen=7;
serread_req->io_WriteLen=7;
serread_req->io_SerFlags &= ~SERF_PARTY_ON;}
else if (set==3) {
serread_req->io_ReadLen=7;
serread_req->io_WriteLen=7;
serread_req->io_SerFlags |= SERF_PARTY_ON;
serread_req->io_SerFlags &= ~SERF_PARTY_ODD;}
else {
serread_req->io_ReadLen=7;
serread_req->io_WriteLen=7;
serread_req->io_SerFlags |= SERF_PARTY_ON;
serread_req->io_SerFlags |= SERF_PARTY_ODD;}
serread_req->IOSer.io_Command=SDCMD_SETPARAMS;
DoIO((struct IORequest *)serread_req);
err=serread_req->IOSer.io_Error;
serread_req->IOSer.io_Command=CMD_READ;
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
return(err);
}
void rexxcapon(msg,p)
struct RexxMsg *msg;
char *p;
{
ohshit=0;
p=stpblk(p);
opencapture(p);
if (ohshit) {
replyRexxCmd(msg,ohshit,0,NULL);
replyed=1;
return;
}
}
void rexxcapoff(msg,p)
struct RexxMsg *msg;
char *p;
{
closecapture();
}
void rexxwaitstr(msg,p) /*apparently this doesn't work to well at */
struct RexxMsg *msg; /* 2400. sorry */
char *p;
{
char dlay[10];
ULONG sig;
int actu,i,d;
p=stpblk(p);
p=stptok(p,&matchstr[0],10," ");
p=stpblk(p);
p=stptok(p,&dlay[0],10," ");
d=atoi(&dlay[0]);
timerreq->tr_node.io_Command=TR_ADDREQUEST;
timerreq->tr_time.tv_secs=d;
timerreq->tr_time.tv_micro=0;
match=1;
matched=0;
matchptr=&matchstr[0];
SendIO((struct IORequest *)timerreq);
while (!matched) {
sig=Wait(serialmask|windowmask|timermask);
if (sig & windowmask) dowindow();
if (CheckIO((struct IORequest *)timerreq)) {
timerreq=(struct IORequest *)GetMsg(timer_port);
replyRexxCmd(msg,15,0,NULL);
replyed=1;
return;
}
if (CheckIO((struct IORequest *)serread_req)) {
actu=readserial();
for (i=0;i<actu;i++) {
if (serbuf[i]==*matchptr) {
matchptr++;
if (!(*matchptr)) {
matched=1;
matchptr=&matchstr[0];
goto here;
}
}
else matchptr=&matchstr[0];
}
here:
if (actu>0) {
for (i=0;i<actu;i++) serbuf[i] &= 0x7f;
conwrite_req->io_Data=(APTR)&serbuf[0];
conwrite_req->io_Length=actu;
DoIO((struct IORequest *)conwrite_req);
}
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
}
}
AbortIO((struct IORequest *)timerreq);
Wait(timermask);
WaitIO((struct IORequest *)timerreq);
}
void rexxpause(msg,p)
struct RexxMsg *msg;
char *p;
{
int i,d,actu;
char dlay[10];
p=stpblk(p);
p=stptok(p,&dlay[0],10," ");
d=atoi(&dlay[0]);
timerreq->tr_node.io_Command=TR_ADDREQUEST;
timerreq->tr_time.tv_secs=d;
timerreq->tr_time.tv_micro=0;
SendIO((struct IORequest *)timerreq);
while(1) {
Wait(timermask|serialmask);
if (CheckIO((struct IORequest *)serread_req)) {
actu=readserial();
if (actu>0) {
for (i=0;i<actu;i++) {
serbuf[i] = serbuf[i] & 0x7f;
if (serbuf[i]<32) {
switch (serbuf[i])
{
case 7: /* where have i seen this before */
case 8:
case 10:
case 12:
case 13:
case 27:
break;
default:
serbuf[i]=32;
}
}
}
conwrite_req->io_Data=(APTR)&serbuf[0];
conwrite_req->io_Length=actu;
DoIO((struct IORequest *)conwrite_req);
}
serread_req->IOSer.io_Data=(APTR)&serbuf[0];
serread_req->IOSer.io_Length=1;
SendIO((struct IORequest *)serread_req);
}
if (CheckIO((struct IORequest *)timerreq)) {
timerreq=(struct IORequest *)GetMsg(timer_port);
return;
}
}
}