home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 148.lha / Install_II / Install2.c < prev    next >
C/C++ Source or Header  |  1988-04-25  |  4KB  |  139 lines

  1. /*
  2. ** Install2.c - give preference to MEMF_CHIP and deactivate external drives
  3. ** Copyright (C) 1987 Ralph Babel, Falkenweg 3, D-6204 Taunusstein
  4. ** all rights reserved - alle Rechte vorbehalten
  5. **
  6. ** 23-May-1987 created Install1.c
  7. ** 07-Aug-1987 changed for new boot code
  8. ** 30-Mar-1988 cleanup
  9. */
  10. /*** included files ***/
  11. #include <exec/types.h>
  12. #include <exec/io.h>
  13. #include <exec/memory.h>
  14. #include <devices/bootblock.h>
  15. #include <devices/trackdisk.h>
  16. #include <libraries/dos.h>
  17. #include <libraries/dosextens.h>
  18.  
  19. /*** external function references ***/
  20. APTR AllocMem(ULONG, ULONG);
  21. VOID FreeMem(APTR, ULONG);
  22. struct IOStdReq *CreateStdIO(struct MsgPort *);
  23. VOID DeleteStdIO(struct IOStdReq *);
  24. BYTE OpenDevice(char *, LONG, struct IORequest *, ULONG);
  25. VOID CloseDevice(struct IORequest *);
  26. BYTE DoIO(struct IORequest *);
  27. struct Task *FindTask(char *);
  28. VOID CopyMem(APTR, APTR, ULONG);
  29. VOID printf(char *, );
  30. LONG toupper(LONG);
  31. /*** constants ***/
  32. #define ROOT 880 /* default AmigaDOS root block (3.5 inch) */
  33. /*** structures ***/
  34. struct BootSectors
  35.  {
  36.  struct BootBlock bs_BootBlock;
  37.  UBYTE bs_Data[BOOTSECTS * TD_SECTOR - sizeof(struct BootBlock)];
  38.  };
  39. /*** the boot code ***/
  40. UWORD BootCode[] =
  41.  {
  42.  0x2F02, 0x4EAE, 0xFF7C, 0x226E, 0x0142, 0x6020,
  43.  0x0829, 0x0001, 0x000F, 0x6716, 0x2F09, 0x4EAE,
  44.  0xFF04, 0x225F, 0x137C, 0x000A, 0x0009, 0x41EE,
  45.  0x0142, 0x4EAE, 0xFEF2, 0x2242, 0x2411, 0x66DC,
  46.  0x4EAE, 0xFF76, 0x241F, 0x43FA, 0x0032, 0x4EAE,
  47.  0xFE0E, 0x4A80, 0x6724, 0x2040, 0x41E8, 0x0034,
  48.  0x70FF, 0x20C0, 0x20C0, 0x2080, 0x43FA, 0x0026,
  49.  0x4EAE, 0xFFA0, 0x4A80, 0x670A, 0x2040, 0x2068,
  50.  0x0016, 0x7000, 0x4E75, 0x70FF, 0x4E75, 0x6469,
  51.  0x736B, 0x2E72, 0x6573, 0x6F75, 0x7263, 0x6500,
  52.  0x646F, 0x732E, 0x6C69, 0x6272, 0x6172, 0x7900
  53.  };
  54. /*** entry point ***/
  55. LONG main(argc, argv)
  56. LONG argc;
  57. char *argv[];
  58.  {
  59.  struct BootSectors *bs;
  60.  struct IOStdReq *iosr;
  61.  struct Process *pr;
  62.  ULONG checksum, precsum;
  63.  UWORD i;
  64.  LONG result;
  65.  result = RETURN_WARN; /* user error */
  66.  if(argc == 2
  67.  && toupper(argv[1][0]) == 'D'
  68.  && toupper(argv[1][1]) == 'F'
  69.  && argv[1][2] >= '0' && argv[1][2] <= '3'
  70.  && argv[1][3] == ':'
  71.  && argv[1][4] == '\0')
  72.   {
  73.   result = RETURN_FAIL; /* no resources */
  74.  
  75.   if((bs = (struct BootSectors *)
  76.    AllocMem(sizeof(struct BootSectors), MEMF_CHIP | MEMF_CLEAR)) != NULL)
  77.    {
  78.    pr = (struct Process *)FindTask(NULL);
  79.    if((iosr = CreateStdIO(&pr->pr_MsgPort)) != NULL)
  80.     {
  81.     result = RETURN_ERROR; /* disk error */
  82.     if(OpenDevice(TD_NAME, argv[1][2] - '0', (struct IORequest *)iosr, 0) == 0)
  83.      {
  84.      *(ULONG *)bs->bs_BootBlock.bb_id = BBNAME_DOS;
  85.      bs->bs_BootBlock.bb_dosblock = ROOT;
  86.      CopyMem((APTR)BootCode, (APTR)bs->bs_Data, sizeof(BootCode));
  87.      checksum = 0;
  88.      for(i = 0; i < 256; ++i)
  89.       {
  90.       precsum = checksum;
  91.       if((checksum += ((ULONG *)bs)[i]) < precsum)
  92.        ++checksum;
  93.       }
  94.      bs->bs_BootBlock.bb_chksum = 0xffffffff - checksum;
  95.      iosr->io_Command = CMD_WRITE;
  96.      iosr->io_Length  = sizeof(struct BootSectors);
  97.      iosr->io_Data    = (APTR)bs;
  98.      iosr->io_Offset  = 0;
  99.      if(DoIO((struct IORequest *)iosr) == 0)
  100.       {
  101.       iosr->io_Command = CMD_UPDATE;
  102.       (void)DoIO((struct IORequest *)iosr);
  103.       }
  104.      if(iosr->io_Error != 0)
  105.       {
  106.       printf("%s failed, trackdisk error %ld\n", argv[0], iosr->io_Error);
  107.       }
  108.      else
  109.       {
  110.       result = RETURN_OK; /* everything fine */
  111.       }
  112.      iosr->io_Command = TD_MOTOR;
  113.      iosr->io_Length  = 0;
  114.      (void)DoIO((struct IORequest *)iosr);
  115.      CloseDevice((struct IORequest *)iosr);
  116.      }
  117.     else
  118.      {
  119.      printf("Unable to open trackdisk device, error %ld\n", iosr->io_Error);
  120.      }
  121.     DeleteStdIO(iosr);
  122.     }
  123.    else
  124.     {
  125.     printf("Unable to create IO request\n");
  126.     }
  127.    }
  128.   else
  129.    {
  130.    printf("Insufficient free store\n");
  131.    }
  132.   }
  133.  else
  134.   {
  135.   printf("Usage: %s {DF0:|DF1:|DF2:|DF3:}\n", argv[0]);
  136.   }
  137.  return result;
  138.  }
  139.