home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 405.lha / AppleII_Emulators_src / src-2 / ados_rwts.c < prev    next >
C/C++ Source or Header  |  1990-06-28  |  6KB  |  222 lines

  1. #include <cpu_prog_model.h>
  2. #include <stdio.h>
  3.  
  4. #define FALSE  0
  5. #define TRUE   1
  6.  
  7.  
  8. typedef struct
  9. {
  10.    short  iob_type,
  11.           slot,
  12.           drive,
  13.           volume,
  14.           track,
  15.           sector,
  16.           dvc    [2],
  17.           buffer [2],
  18.           dummy  [2],
  19.           command,
  20.           error,
  21.           act_volume,
  22.           prev_slot,
  23.           prev_drive;
  24. }  iob;
  25.  
  26. hex_dump( array)
  27. unsigned short array [];
  28. {
  29.    int  loop_1,
  30.         loop_2;
  31.  
  32.    for (loop_1 = 0;loop_1 < 16;loop_1 ++)
  33.    {
  34.       printf("$%04x- ", loop_1 * 16);
  35.       for (loop_2 = 0;loop_2 < 16;loop_2 ++)
  36.          printf("%02x ", array [loop_1 * 16 + loop_2]);
  37.  
  38.       printf("  '");
  39.       for (loop_2 = 0;loop_2 < 16;loop_2 ++)
  40.       {
  41.          char tkn;
  42.  
  43.          tkn = array [loop_1 * 16 + loop_2];
  44.          if ( ((tkn & 0x7F) < 0x20) || ((tkn & 0x7f) == 0x7f) )
  45.             tkn = '.';
  46.  
  47.          printf("%c", tkn);
  48.       }
  49.       printf("'\n");
  50.    }
  51.    printf("\n");
  52. }
  53.  
  54. show_rwts_info( rwts_info)
  55. iob *rwts_info;
  56. {
  57.  
  58.    printf("IOB Type  %02x\n",  rwts_info->iob_type);
  59.    printf("Slot      %02x\n",  rwts_info->slot);
  60.    printf("Drive      %x\n",   rwts_info->drive);
  61.    printf("Volume    %02x\n",  rwts_info->volume);
  62.    printf("Track     %02d\n",  rwts_info->track);
  63.    printf("Sector     %x\n",   rwts_info->sector);
  64.    printf("DVC     %04x \n",  (rwts_info->dvc [1] << 8) | rwts_info->dvc [1]);
  65.    printf("Buffer  %04x \n",  (rwts_info->buffer [1] << 8) |
  66.                                rwts_info->buffer [0]         );
  67.    printf("Command    %x\n",   rwts_info->command);
  68. }
  69.  
  70. short rwts( code)
  71. PM *code;
  72. {
  73.    iob             * rwts_info;
  74.    char              temp_buffer [0x104];
  75.    short             loop;
  76.    unsigned short  * buffer;
  77.  
  78.    rwts_info = (iob *) &(code->Me [(code->Ac << 8) | code->Yr]);
  79.    if (code->Tr)
  80.       show_rwts_info( rwts_info);
  81.  
  82.  
  83. /*
  84. code->Mo = Mode_SLOW;
  85. code->Qu = TRUE;
  86. return;
  87. */
  88.  
  89.    rwts_info->error      = 0x00;
  90.    rwts_info->act_volume = rwts_info->volume;
  91.    rwts_info->prev_slot  = rwts_info->slot;
  92.    rwts_info->prev_drive = rwts_info->drive;
  93.  
  94.    buffer = (unsigned short *) &(code->Me [(rwts_info->buffer [1] << 8) |
  95.                                             rwts_info->buffer [0]         ]);
  96.  
  97.    switch (rwts_info->command)
  98.    {
  99.       case 0x00:
  100. printf("Open drive and move the head\n");
  101.          break;
  102.  
  103.       case 0x01:
  104.          if (disk_open( _READ, rwts_info->slot, rwts_info->drive,
  105.                                                 rwts_info->volume) )
  106.          {
  107.             printf("Can't open the disk\n");
  108.             code->Mo = Mode_SLOW;
  109.             code->Qu = TRUE;
  110.             return;
  111.          }
  112.  
  113.          disk_seek( rwts_info->track, rwts_info->sector, 0x00);
  114.          disk_read( temp_buffer, 0x104);
  115.          disk_close();
  116.          rwts_info->error = 0x00;
  117.  
  118.          for (loop = 0;loop <= 0xff;loop ++)
  119.             buffer [loop] = temp_buffer [4 + loop];
  120.  
  121.          if (code->Tr)
  122.          {
  123.             printf("Read from\n");
  124.             printf("Track $%02x  Sector $%02x\n", temp_buffer [1],
  125.                                                   temp_buffer [2]);
  126.             hex_dump( buffer);
  127.          }
  128.          break;
  129.  
  130.       case 0x02:
  131.          if (disk_open( _MODIFY, rwts_info->slot, rwts_info->drive,
  132.                                                   rwts_info->volume) )
  133.          {
  134.             printf("Can't open the disk\n");
  135.             code->Mo = Mode_SLOW;
  136.             code->Qu = TRUE;
  137.             return;
  138.          }
  139.  
  140.          for (loop = 0;loop <= 0xff;loop ++)
  141.             temp_buffer [4 + loop] = buffer [loop];
  142.  
  143.          temp_buffer [0] = rwts_info->volume;
  144.          temp_buffer [1] = rwts_info->track;
  145.          temp_buffer [2] = rwts_info->sector;
  146.          temp_buffer [3] = 0x55;  /* Dummy */
  147.  
  148.          if (code->Tr)
  149.          {
  150.             printf("Write on\n");
  151.             printf("Track $%02x  Sector $%02x\n", temp_buffer [1],
  152.                                                   temp_buffer [2]);
  153.             hex_dump( buffer);
  154.          }
  155.  
  156.          disk_seek( rwts_info->track, rwts_info->sector, 0x00);
  157.          disk_write( temp_buffer, 0x104);
  158.          disk_close();
  159.  
  160.          rwts_info->error = 0x00;
  161.          break;
  162.  
  163.       case 0x04:
  164.          if (rwts_info->drive == 0x02)
  165.          {
  166.             format_ext_drive( rwts_info->slot);
  167.             break;
  168.          }
  169.  
  170.          if (disk_open( _WRITE, rwts_info->slot, rwts_info->drive,
  171.                                                  rwts_info->volume) )
  172.          {
  173.             printf("Can't open the disk\n");
  174.             code->Mo = Mode_SLOW;
  175.             code->Qu = TRUE;
  176.             return;
  177.          }
  178.  
  179.          for (rwts_info->track = 0;rwts_info->track < 35;rwts_info->track ++)
  180.          {
  181.             for (rwts_info->sector = 0;rwts_info->sector < 16;
  182.                                                         rwts_info->sector ++)
  183.             {
  184.                temp_buffer [0] = rwts_info->volume;
  185.                temp_buffer [1] = rwts_info->track;
  186.                temp_buffer [2] = rwts_info->sector;
  187.                temp_buffer [3] = 0x55;  /* Dummy */
  188.  
  189.                for (loop = 0;loop <= 0xff;loop ++)
  190.                   temp_buffer [4 + loop] = 0x00;
  191.  
  192.                disk_seek( rwts_info->track, rwts_info->sector, 0x00);
  193.                disk_write( temp_buffer, 0x104);
  194.             }
  195.          }
  196.  
  197.          if (code->Tr)
  198.          {
  199.             printf("Format_disk on\n");
  200.             printf("Track $%02x  Sector $%02x\n", temp_buffer [1],
  201.                                                   temp_buffer [2]);
  202.             hex_dump( buffer);
  203.          }
  204.  
  205.          disk_close();
  206.          rwts_info->error = 0x00;
  207.  
  208.          if (code->Br = FALSE)
  209.          {
  210.             printf("Break is false\n");
  211.             code->Mo = Mode_SLOW;
  212.             code->Er = TRUE;
  213.             code->Qu = TRUE;
  214.             return;
  215.          }
  216.          break;
  217.    }
  218.  
  219.    code->Ca = FALSE;   /* Done wery well */
  220.    RTS( code);
  221. }
  222.