*** empty log message ***

This commit is contained in:
em 1985-03-18 13:46:31 +00:00
parent a5f4b01d82
commit 1b162c577e
4 changed files with 298 additions and 0 deletions

19
mach/i80/dl/Makefile Normal file
View file

@ -0,0 +1,19 @@
head: mccpm nascom
mccpm: mccpm.c
cc -o mccpm mccpm.c
nascom: nascom.c
cc -o nascom nascom.c
install:
@echo Nothing is installed
clean:
rm nascom mccpm
pr:
@pr `pwd`/Makefile `pwd`/mccpm.c `pwd`/nascom.c
opr:
make pr | opr

5
mach/i80/dl/README Normal file
View file

@ -0,0 +1,5 @@
This directory contains files mccpm.c and nascom.c.
The first one downloads the mc/cpm
computer, using the standard Intel hex-dump format.
The output appears on standard output.
The latter does the same for the Nascom.

135
mach/i80/dl/mccpm.c Normal file
View file

@ -0,0 +1,135 @@
/*
* dit programma leest een a.out file
* voor een kleine uP (adres space = 64K)
* en levert aan de standaard output een
* download formaat voor de MCCPM computer.
*
*/
#define MAXBYTE 24
#include <stdio.h>
char hex[] = "0123456789ABCDEF";
FILE *fp, *fopen();
char **s;
int bytes, bytcnt, checksum;
unsigned pc;
unsigned offset;
unsigned htou();
main (argc,argv)
int argc;
char *argv[];
{
if (argc > 3)
fatal ("usage: %s filename [start-adres]\n",argv[0]);
offset = 0;
if (argc == 3)
if (!(offset = htou(argv[2])))
fatal ("adres error %s\n", argv[2]);
if ((fp = fopen (*++argv,"r")) == NULL)
fatal ("can't open %s\n",*argv);
else {
s = argv;
convert ();
fclose (fp);
}
}
convert ()
{
int c;
do
{
pc = getword ();
pc -= offset;
bytes = getword ();
bytes = getword ();
while (bytes != 0)
{
bytcnt = (bytes < MAXBYTE) ? bytes : MAXBYTE;
bytes -= bytcnt;
checksum = 0;
Irecord ();
}
c = getc (fp);
ungetc (c, fp);
}
while (c != EOF);
printf (":00000001FF\n");
}
Irecord ()
{
printf (":");
outbyte (bytcnt);
bytcnt += 4;
outbyte (pc >> 8);
outbyte (pc);
outbyte (0);
record ();
}
record ()
{
while (bytcnt != 0)
{
outbyte (getbyte ());
pc ++;
}
outbyte (-checksum);
putchar ('\n');
putchar (0);
putchar (0);
}
outbyte (b)
int b;
{
checksum = (checksum + b) & 0xFF;
putchar (hex[(b>>4) & 0xF]);
putchar (hex[b & 0xF]);
-- bytcnt;
}
getword ()
{
int c;
c = getbyte ();
return ((getbyte () << 8) | c );
}
getbyte ()
{
int c;
if ((c = getc (fp)) == EOF) fatal ("end of %s\n",*s);
return (c);
}
fatal (s,a)
{
printf (s,a);
exit (-1);
}
/* convert a string of hex digits to an unsigned 16 bit number */
unsigned htou(t)
char *t;
{
unsigned n = 0;
char c;
while(c = *t++){
if(c >= '0' && c <= '9')
c -= '0';
else if(c >= 'a' && c <= 'f')
c -= 'a' - 10;
else if(c >= 'A' && c <= 'F')
c -= 'A' - 10;
else
return(0);
n = n * 16 + c;
}
return(n);
}

139
mach/i80/dl/nascom.c Normal file
View file

@ -0,0 +1,139 @@
/*
* Download Z80 load module into the NASCOM
*
* Johan Stevenson, Vrije Universiteit, Amsterdam
*/
#include <stdio.h>
#include <assert.h>
#include <sgtty.h>
#include <signal.h>
int check;
int nascom = 1;
int nl = '\037';
int zero = 0;
int disp = 0;
char hex[] = "0123456789ABCDEF";
struct sgttyb ttynormal;
struct sgttyb ttyraw;
int rawmode = 0;
stop(code) {
if (rawmode)
stty(1, &ttynormal);
exit(code);
}
main(argc,argv) char **argv; {
register unsigned nd,pc;
register char *s;
while (argc > 1 && argv[1][0] == '-') {
switch (argv[1][1]) {
case 'u':
/* unix output */
nascom = 0;
nl = '\n';
break;
case 'e':
/* fill EPROM. make minimal change */
zero = 0xFF;
break;
case 'd':
/* displacement at load time */
disp = atoi(&argv[1][2]);
break;
}
argc--;
argv++;
}
s = "a.out";
if (argc == 2)
s = argv[1];
else if (argc != 1) {
fprintf(stderr,"usage: %s [flags] [object file]\n",argv[0]);
stop(-1);
}
if (freopen(s,"r",stdin) == NULL) {
fprintf(stderr,"%s: can't open %s\n",argv[0],s);
stop(-1);
}
if (nascom) {
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, stop);
signal(SIGTERM, stop);
if (gtty(1, &ttynormal) < 0) {
fprintf(stderr, "no tty\n");
stop(-1);
}
rawmode++;
ttyraw = ttynormal;
ttyraw.sg_flags |= RAW;
ttyraw.sg_ispeed = B1200;
ttyraw.sg_ospeed = B1200;
stty(1, &ttyraw);
sleep(5);
}
for (;;) {
pc = get2c(stdin);
if (feof(stdin))
break;
nd = get2c(stdin);
nd = get2c(stdin);
if (nd > 256) {
fprintf(stderr,"bad format on %s\n",s);
stop(1);
}
while (nd > 8) {
data(8,pc);
nd -= 8;
pc += 8;
}
if (nd > 0)
data(nd,pc);
assert(feof(stdin) == 0);
}
putchar('.');
putchar(nl);
if (nascom)
sleep(5);
stop(0);
}
data(nd,pc) {
register i;
check = 0;
pc += disp;
byte(pc>>8);
byte(pc);
for (i = 0; i < nd; i++) {
putchar(' ');
byte(getc(stdin));
}
while (i < 8) {
putchar(' ');
byte(zero);
i++;
}
putchar(' ');
byte(check);
putchar(nl);
}
byte(b) {
check += b;
putchar(hex[(b>>4) & 017]);
putchar(hex[b & 017]);
}
get2c(f) FILE *f; {
register c;
c = getc(f);
return((getc(f) << 8) | c);
}