*** empty log message ***
This commit is contained in:
parent
a5f4b01d82
commit
1b162c577e
19
mach/i80/dl/Makefile
Normal file
19
mach/i80/dl/Makefile
Normal 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
5
mach/i80/dl/README
Normal 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
135
mach/i80/dl/mccpm.c
Normal 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
139
mach/i80/dl/nascom.c
Normal 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);
|
||||
}
|
Loading…
Reference in a new issue