Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

wxmodem for amigaDOS

7 views
Skip to first unread message

Jan Pieter

unread,
May 5, 2004, 6:04:11 PM5/5/04
to
Is there an Amiga terminal program that supports wxmodem? I need it
real bad to upload firmware to my broken ADSL modem. I have source
code for a simple wxmodem uploader, but it is for Linux and I can't get
it to work on my Amiga (with DICE compiler). Anybody out there who can
compile it for the Amiga with gcc or another Amiga C compiler? Here is
that source. Please send the binary to mailto:j...@jp.dhs.org . Many thanks.

Jan Pieter.

#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
#include <fcntl.h>

#define SOH 1
#define EOT 4
#define ACK 6
#define DLE 16
#define XON 17
#define XOFF 19
#define NAK 21
#define SYN 22
#define CAN 24

int calccrc(char *ptr, int count)
{
int crc, i;

crc = 0;
while (--count >= 0) {
crc = crc ^ (int)*ptr++ << 8;
for (i = 0; i < 8; ++i)
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
}
return (crc & 0xFFFF);
}

void fput_esc(unsigned char byte, FILE *ser)
{
switch(byte)
{
case DLE:
case SYN:
case XON:
case XOFF:
fputc(DLE,ser);
fputc(byte^64,ser);
break;
default:
fputc(byte,ser);
break;
}
}

void tx_block(FILE *ser, int packetnum, int maxpacket, unsigned char *block)
{
int n,crc;

fputc(SYN,ser);
fputc(SOH,ser);
fput_esc(packetnum&0xFF,ser);
fput_esc((packetnum&0xFF)^255,ser);
for(n=0; n<128; n++)
fput_esc(block[n],ser);
crc=calccrc(block,128);
fput_esc((crc>>8)&0xff,ser);
fput_esc(crc&0xff,ser);
printf("%d (%d%%)\r",packetnum,100*packetnum/(maxpacket?maxpacket:1));
}

int nonbread(FILE *f)
{
int c;
fcntl(fileno(f),F_SETFL,O_NONBLOCK);
c=fgetc(f);
fcntl(fileno(f),F_SETFL,0);
return c;
}

int main(int argc, char *argv[])
{

FILE *ser = fopen("AUX:","w+");
FILE *inf;
int c,n,crc;
int packet=1;
int len,pos=0,mode,pack;
unsigned char *buf;
char trans[4]={0};

printf("Simple wxmodem transmitter 1.00\n");
printf("By Tony Hoyle. Licensed under the GNU GPL\n");
printf("\n");

if(argc!=3)
{
printf("Usage: %s <filename> <initial cmd>\n",argv[0]);
return -1;
}

inf=fopen(argv[1],"r");
if(!inf)
{
perror("Couldn't open file!\n");
return -1;
}

fseek(inf,0,2);
len=ftell(inf);
fseek(inf,0,0);
buf=malloc(len+128);
fread(buf,len,1,inf);
fclose(inf);

setvbuf(ser,NULL,_IONBF,0);

fprintf(ser,"%s\n",argv[2]);
do
{
while((c=fgetc(ser))!='W')
{
putchar(c);
}
c=fgetc(ser);
if(c!='W') { putchar('W'); putchar(c); }
} while(c!='W');
printf("Upload started...\n");
while(pos<len)
{
if(trans[packet&3]==0)
{
tx_block(ser, packet, len/128, buf+pos);
trans[packet&3]=1;
packet++;
pos+=128;
}
while(len && ((c=nonbread(ser))!=EOF))
{
boo:
switch(c)
{
case ACK:
pack=fgetc(ser);
if(pack==6)
pack=0;
trans[pack&3]=0;
if(pack==0)
{
c=6;
goto boo;
}
break;
case NAK:
pack=fgetc(ser);
printf("\nNak packet %d - terminating\n",pack);
len=0;
break;
case CAN:
printf("\nCancelled\n");
len=0;
break;
default:
printf("\nUnknown %d\n",c);
}
}
}
fputc(EOT,ser);
fclose(ser);
free(buf);
printf("\n");
}


0 new messages