home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug103.arc / LGO.C < prev    next >
Text File  |  1979-12-31  |  3KB  |  107 lines

  1. /* 
  2. ** LGO.C -- Small-Mac Load-and-Go Loader
  3. **
  4. **               Copyright 1985 J. E. Hendrix
  5. **
  6. ** Usage: LGO [-G] [-M] program
  7. **
  8. ** -G     Execute program after loading.
  9. **
  10. ** -M     Monitor load address and size.
  11. **
  12. ** "Program" is a file specifier for the program being loaded.
  13. ** Default, and only allowed, extension is LGO.
  14. **
  15. ** Enter control-S to pause and control-C to abort.
  16. */
  17. #include <stdio.h>
  18. #include "notice.h"
  19.  
  20. #define NOCCARGC        /* don't pass arg counts to functions */
  21.  
  22. #define NAMESIZE   15
  23. #define STACK     256        /* allow for stack space */
  24. #define RET       201        /* RET instruction */
  25. #define LGOEXT  ".LGO"
  26.  
  27. /*
  28. ** global variables
  29. */
  30. char
  31.  *base,            /* base address */
  32.  *start,        /* starting address */
  33.   infn[NAMESIZE];    /* input filename */
  34.  
  35. int
  36.   infd,            /* input fd */
  37.   size,            /* program size */
  38.   monitor,        /* monitor activity? */
  39.   go;            /* execute? */
  40.  
  41. /*
  42. ** load program.LGO with format:
  43. **
  44. **            RET <start> <base> <size> <program>
  45. */
  46. main(argc,argv) int argc, argv[]; {
  47.   int i; char str[5];
  48.   fputs("Small-Mac Load-and-Go Loader, ", stderr); fputs(VERSION, stderr);
  49.   fputs(CRIGHT1, stderr);
  50.   getsw(argc, argv);                /* process switches */
  51.   i = 0;
  52.   while(getarg(++i, infn, NAMESIZE, argc, argv) != EOF)    /* get fn */
  53.     if(infn[0] != '-') {i = 0; break;}
  54.   if(i) usage();
  55.   extend(infn, LGOEXT, LGOEXT);
  56.   infd = open(infn, "r");
  57.   read(infd, &base, 1);
  58.   if(base != RET) error("- Invalid LGO Format");
  59.   read(infd, &start, 2);            /* get starting address */
  60.   read(infd, &base,  2);            /* get base address */
  61.   read(infd, &size,  2);            /* get program size */
  62.   if(monitor) {                    /* monitor? */
  63.     fputs("From ",    stdout); itox(base,      str, 5); fputs(str, stdout);
  64.     fputs(", To ",    stdout); itox(base+size, str, 5); fputs(str, stdout);
  65.     fputs(", Size ",  stdout); itox(size,      str, 5); fputs(str, stdout);
  66.     fputs(", Start ", stdout); itox(start,     str, 5);  puts(str);
  67.     }
  68.   malloc(STACK);    /* new machine stack */
  69.   malloc(1);        /* leaves new stack address in HL */
  70.   #asm
  71.   SPHL            ; move stack
  72.   LXI H,0        ; CP/M return
  73.   PUSH H        ; re-stack CP/M return
  74.   #endasm
  75.   read(infd, base, size);            /* load program */
  76.   if(ferror(infd)) error2("- Error Reading ", infn);
  77.   if(go) {        /* execute program? */
  78.     start;        /* leaves starting address in HL */
  79.     #asm
  80.     PCHL        ; Jump to start address with
  81.             ; CP/M return on top of this stack.
  82.     #endasm
  83.     }
  84.   exit(0);
  85.   }
  86.  
  87. /*
  88. ** get switches from command line
  89. */
  90. getsw(argc, argv) int argc, *argv; {
  91.   char arg[NAMESIZE];
  92.   int argnbr; argnbr = 0;
  93.   while(getarg(++argnbr, arg, NAMESIZE, argc, argv) != EOF) {
  94.     if(arg[0] != '-') continue;            /* skip file names */
  95.     if(toupper(arg[1]) == 'G') go = YES;
  96.     else if(toupper(arg[1]) == 'M') monitor = YES;
  97.     else usage();
  98.     }
  99.   }
  100.  
  101. /*
  102. ** abort with a usage message
  103. */
  104. usage() {
  105.   error("Usage: LGO [-G] [-M] program");
  106.   }
  107.