home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / emulaton / trash80 / !Trash80 / c / EmuDiskTOl < prev    next >
Text File  |  1992-09-27  |  2KB  |  91 lines

  1. #include  <stdio.h>
  2. #include  <string.h>
  3. #include  "bbc.h"
  4.  
  5. #include  "general.h"
  6. #include  "Externals.h"
  7.  
  8. #define BITBUSY (1<<0)
  9. #define BITDRQ (1<<1)
  10. #define BITNOTREADY (1<<7)
  11. FILE *diskfile= NULL;
  12.  
  13. BOOL motorON= FALSE;
  14. u_char track= 0;
  15. u_char sector= 0;
  16. u_int offset= 0;
  17. u_char data = 0; 
  18. u_char status= 0;
  19.  
  20. char lastdirection= (char) -1;
  21.  
  22. static BOOL posfile(FILE *d, int track, u_char sector)
  23. {
  24. u_int iuv= track*2560 + (sector<<8);
  25. BOOL flag = (iuv <= 0x15e00) && (diskfile!= NULL);
  26. if(flag)
  27.     {
  28.     offset= iuv;
  29.     }
  30. return(flag);
  31. }
  32.  
  33. static void HandleCmd(u_char vx)
  34. {
  35. switch(vx & 0xf0)
  36.     {
  37.     case 0x00: /* Position head to track zero */
  38.         track= 0;
  39.     case 0x10: /* Seek */
  40.         sector= 0;
  41.         if(posfile(diskfile, data, sector))
  42.             {
  43.             track= data;
  44.             status &= ~(BITBUSY | BITNOTREADY);
  45.             }
  46.         else    status |= (BITBUSY | BITNOTREADY);
  47.         break;
  48.     case 0x40: /* Step IN without track register update */
  49.     case 0x50: /* Step IN with track register update */
  50.     case 0x60: /* Step OUT without track register update */
  51.     case 0x70: /* Step OUT with track register update */
  52.         lastdirection= (vx & 0x20)!=0 ? -1 : +1;
  53.     case 0x20: /* Step without track register update */
  54.     case 0x30: /* Step with track register update */
  55.         if(posfile(diskfile, (int) track + lastdirection, sector))
  56.             {
  57.             if((vx & 0x10)!=0) track+= lastdirection;
  58.             status &= ~(BITBUSY | BITNOTREADY);
  59.             }
  60.         else    status |= (BITBUSY | BITNOTREADY);
  61.         break;    }
  62. }
  63.  
  64. void WrDisk(u_char lad, u_char vx)
  65. {
  66. switch(lad)
  67.     {
  68.     case 0xe0:
  69.     case 0xe1:
  70.         motorON= (vx == 1);
  71.         break;
  72.     case 0xec:
  73.         HandleCmd(vx);
  74.         break;
  75.     }
  76. }
  77.  
  78. u_char RdDisk(u_int ax)
  79. {
  80. switch(ax & 0xff)
  81.     {
  82.     case 0xed: /* Track register */
  83.         return(track);
  84.     case 0xee: /* Sector register */
  85.         return(sector);
  86.     case 0xef: /* Data register */
  87.         ;
  88.     }
  89. return(0);
  90. }
  91.