home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Misc / a2 / Source / dos.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-21  |  1.8 KB  |  108 lines

  1. /*
  2.  *  a2, an Apple II emulator in C
  3.  *  (c) Copyright 1990 by Rich Skrenta
  4.  *
  5.  *  Command line interface written by Tom Markson
  6.  *
  7.  *  Distribution agreement:
  8.  *
  9.  *    You may freely copy or redistribute this software, so long
  10.  *    as there is no profit made from its use, sale, trade or
  11.  *    reproduction.  You may not change this copyright notice,
  12.  *    and it must be included prominently in any copy made.
  13.  *
  14.  *  Send emulator related mail to:  skrenta@blekko.commodore.com
  15.  *                    skrenta@blekko.uucp
  16.  */
  17.  
  18.  
  19. #include    <stdio.h>
  20. #include    "a2.h"
  21.  
  22.  
  23.  
  24. char *rwts_func[] = {"-s", "", "-w", "-?", "-f"};
  25.  
  26.  
  27. void rwts(void)
  28. {
  29. char s[50];
  30. unsigned short iob;
  31. unsigned short buf;
  32. int track;
  33. int sector;
  34. int cmd;
  35. unsigned char zero_buf[256];
  36. int i;
  37.  
  38.     mem[0x48] = Y;
  39.     mem[0x49] = A;
  40.     mem[0x6F8] = 2;
  41.     mem[0x4F8] = 4;
  42.  
  43.     iob = join(Y, A);
  44.  
  45.     track = mem[iob + 4];
  46.     sector = mem[iob + 5];
  47.     buf = join(mem[iob + 8], mem[iob + 9]);
  48.     cmd = mem[iob + 12];
  49.  
  50.     if (cmd > 4)
  51.         cmd = 3;        /* unknown command */
  52.  
  53.     if (mem[iob + 2] == 2)
  54.         drive = 1;
  55.     else
  56.         drive = 0;
  57.  
  58.     if ((cmd == 2 || cmd == 4) && write_prot[drive]) {
  59.         C = 1;
  60.         mem[iob + 13] = 0x10;        /* Write protected */
  61.         DO_RTS;
  62.         return;
  63.     }
  64.  
  65.     if (mem[iob] != 1
  66.     ||  disk[drive] < 0
  67.     ||  track > 35
  68.     ||  sector > 15
  69.     ||  cmd == 3
  70.     ||  buf > 0xFE00) {
  71.         C = 1;
  72.         mem[iob + 13] = 0x40;        /* IO Error */
  73.         DO_RTS;
  74.         return;
  75.     }
  76.  
  77.     sprintf(s, "rwts%s t=%d s=%d%s", rwts_func[cmd],
  78.                 track, sector, drive ? " d2" : "");
  79.     info(s);
  80.  
  81.     switch (cmd) {
  82.     case 0:                    /* seek */
  83.         break;
  84.  
  85.     case 1:                    /* read */
  86.         read_disk(track, sector, &mem[buf]);
  87.         break;
  88.  
  89.     case 2:                    /* write */
  90.         write_disk(track, sector, &mem[buf]);
  91.         break;
  92.  
  93.     case 4:                    /* format */
  94.         for (i = 0; i < 256; i++)
  95.             zero_buf[i] = 0;
  96.  
  97.         for (track = 0; track < 35; track++)
  98.             for (sector = 0; sector < 16; sector++)
  99.                 write_disk(track, sector, zero_buf);
  100.         break;
  101.     }
  102.  
  103.     C = 0;
  104.     A = 0;
  105.     DO_RTS;
  106. }
  107.  
  108.