home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff224.lzh / KickMem / KickMem1.c < prev    next >
C/C++ Source or Header  |  1989-06-20  |  6KB  |  184 lines

  1. /*  KickMem V1.0 for version 1.3 kickstart, by Dave Williams 
  2.     18 May 1989
  3.  
  4.                Use FixHunk to direct data hunks to Chip Memory
  5.  
  6. */
  7. #include <stdio.h>  
  8. #include "exec/types.h"
  9. #include "exec/nodes.h"
  10. #include "exec/lists.h"
  11. #include "exec/memory.h"
  12. #include "exec/interrupts.h"
  13. #include "exec/ports.h"
  14. #include "exec/libraries.h"
  15. #include "exec/io.h"
  16. #include "exec/tasks.h"
  17. #include "exec/execbase.h"
  18. #include "exec/devices.h"
  19. #include "devices/trackdisk.h"
  20.  
  21. #define BLOCKSIZE TD_SECTOR
  22.  
  23. short error;
  24. struct MsgPort *diskport;
  25. struct IOExtTD *diskreq;
  26. BYTE diskbuffer[BLOCKSIZE];
  27. BYTE patchbuffer [] = {0x8c,0xfe};  /* pointer to addmem */
  28. BYTE mainbuffer [] = {             /* AddMem code */
  29.        0x4e,0xf9,0x00,0xfe,
  30.        0x8d,0x6a,0x48,0xe7,
  31.        0xe0,0xc2,0x2c,0x78,
  32.        0x00,0x04,0x20,0x3c,
  33.        0x00,0x08,0x00,0x00,  /* $00080000 = how much to add */
  34.        0x22,0x3c,0x00,0x01,
  35.        0x00,0x05,0x74,0x00,
  36.        0x20,0x7c,0x00,0x08,  /* $00080000 = address of extra memory */
  37.        0x00,0x00,0x93,0xc9,
  38.        0x4e,0xae,0xfd,0x96,
  39.        0x4c,0xdf,0x43,0x07,
  40.        0x4e,0xf9,0x00,0xfe,
  41.        0x88,0xd6,0x4e,0x71   
  42.      };
  43. BYTE checksumbuffer[] = {0x81,0xa1,0xbb,0x42}; /* I got this from SumKick*/
  44.  
  45. extern struct MsgPort *CreatePort();
  46. extern struct IORequest *CreateExtIO();
  47.  
  48. ReadSector(trk,sec)
  49. SHORT trk,sec;
  50. {
  51.         LONG offset;
  52.     
  53.         diskreq->iotd_Req.io_Length = BLOCKSIZE;
  54.         diskreq->iotd_Req.io_Data = (APTR)diskbuffer;            
  55.         diskreq->iotd_Req.io_Command = CMD_READ;
  56.         offset = TD_SECTOR * ((trk * NUMSECS) + sec);
  57.         diskreq->iotd_Req.io_Offset = offset;        
  58.         DoIO(diskreq);
  59.         if (diskreq->iotd_Req.io_Error != 0)
  60.         printf("ERROR: Disk Error %ld on Trk %ld Sec %ld\n",
  61.                diskreq->iotd_Req.io_Error,trk,sec);
  62.            return(0);
  63. }
  64.  
  65. WriteSector(trk,sec)
  66. SHORT trk,sec;
  67. {
  68.         LONG offset;
  69.  
  70.         diskreq->iotd_Req.io_Length = BLOCKSIZE;
  71.         diskreq->iotd_Req.io_Data = (APTR)diskbuffer;            
  72.         diskreq->iotd_Req.io_Command = CMD_WRITE;
  73.         offset = TD_SECTOR * ((trk * NUMSECS) + sec);
  74.         diskreq->iotd_Req.io_Offset = offset;        
  75.         DoIO(diskreq);
  76.         diskreq->iotd_Req.io_Command = CMD_UPDATE;
  77.         DoIO(diskreq);
  78.         if (diskreq->iotd_Req.io_Error != 0)
  79.         printf("ERROR: Disk Error %ld on Trk %ld Sec %ld\n",
  80.                 diskreq->iotd_Req.io_Error,trk,sec);
  81.            return(0);
  82. }
  83.  
  84. void Gracefulexit()
  85. {
  86.         diskreq->iotd_Req.io_Length = 0;
  87.         diskreq->iotd_Req.io_Command = TD_MOTOR;
  88.         DoIO(diskreq);
  89.         CloseDevice(diskreq);
  90.         DeleteExtIO(diskreq, sizeof(struct IOExtTD));
  91.         DeletePort(diskport);
  92.         exit(0);
  93. }             
  94.     
  95. void main()
  96. {
  97.         char c; 
  98.         SHORT track,sector,myoffset;
  99.  
  100.         printf("\nKickMem 1.0, Public Domain 1989, By Dave Williams\n");
  101.         printf("\nPLACE KickStart V1.2 disk to be modified in drive df1:\n");
  102.         printf("Press return to CONTINUE or 'q' return to ABORT.\n:");  
  103.         c = getchar();
  104.         if(c != '\n'){exit(TRUE);};               
  105.         diskport = CreatePort(0,0);
  106.         if(diskport == 0) exit (TRUE);
  107.         diskreq = (struct IOExtTD*)CreateExtIO(diskport,sizeof(struct IOExtTD));
  108.         if(diskreq == 0) {DeletePort(diskport); exit(TRUE);}
  109.         error=OpenDevice(TD_NAME,1,diskreq,0);
  110.         if(error != 0){
  111.                  printf("OpenDevice returned %ld error \n",error);
  112.                  exit (TRUE);
  113.         }
  114.         diskreq->iotd_Req.io_Command = TD_CHANGESTATE;
  115.         DoIO(diskreq);
  116.         if(diskreq->iotd_Req.io_Actual != 0){
  117.                printf("ERROR: Who are you kidding? There's no disk in df1:\n");
  118.                exit (TRUE);
  119.         }
  120.         diskreq->iotd_Req.io_Command = TD_PROTSTATUS;
  121.         DoIO(diskreq);
  122.         if(diskreq->iotd_Req.io_Actual != 0){
  123.                 printf("ERROR: Disk write protected\n");
  124.             exit (TRUE);
  125.         }
  126.        /*=================BLOCK #36==================*/
  127.        
  128.         track = 3;    /* Check for version 33.18 disk resource */
  129.         sector = 3;
  130.         ReadSector(track,sector);
  131.         if(diskbuffer[449]!= '3'|| diskbuffer[450]!= '3' || 
  132.            diskbuffer[451]!= '.' ||  diskbuffer[452]!= '1' ||
  133.            diskbuffer[453]!= '8'){
  134.                 printf("ERROR: Not a Version 33.18 Kickstart disk\n");
  135.                 Gracefulexit();
  136.         }
  137.       
  138.        
  139.        /*===============BLOCK #2=====================*/
  140.        
  141.        track = 0;    /* Disable kickstart from adding to CHIP_MEM */
  142.        sector = 2;
  143.        ReadSector(track,sector);
  144.        diskbuffer[15]= 0x08; 
  145.        WriteSector(track,sector);
  146.   
  147.        /*==============BLOCK #325===================*/
  148.        
  149.         track = 29;  /* grab strap pointer to point to addmem code */
  150.         sector = 6;
  151.         ReadSector(track,sector);
  152.         for(myoffset= 156;myoffset < 158;myoffset++){
  153.         diskbuffer[myoffset]= patchbuffer[myoffset-156]; 
  154.          }
  155.          WriteSector(track,sector);
  156.  
  157.        /*=================BLOCK #327=================*/
  158.        
  159.         track = 29;     /* main addmem code */
  160.         sector = 8;
  161.         ReadSector(track,sector);
  162.         for(myoffset= 248;myoffset < 300;myoffset++){
  163.             diskbuffer[myoffset]= mainbuffer[myoffset-248]; 
  164.         }
  165.         WriteSector(track,sector);
  166.  
  167.      /* =============BLOCK #512=================== */
  168.        
  169.         track = 46;  /* Oh yes we can't forget the checksum */        
  170.         sector = 6;
  171.         ReadSector(track,sector);
  172.         for(myoffset= 488;myoffset < 492 ;myoffset++){
  173.                  diskbuffer[myoffset] = checksumbuffer[myoffset-488]; 
  174.         }      
  175.         WriteSector(track,sector);
  176.         
  177.   
  178.       /* ========== Exit we're done ============= */
  179.  
  180.         printf("KickMem Completed.\n");
  181.         Gracefulexit();
  182. }                    
  183.    
  184.