/[projet1]/public/oric/hardware/cumulus/fw_dbug/179X.c
Defence Force logotype

Diff of /public/oric/hardware/cumulus/fw_dbug/179X.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1083 by dbug, Sat Jan 18 21:31:24 2014 UTC revision 1084 by dbug, Sun Jan 19 15:34:29 2014 UTC
# Line 53  static rom char str_ORICDISK[] = "ORICDI Line 53  static rom char str_ORICDISK[] = "ORICDI
53  static rom char str_MFM_DISK[] = "MFM_DISK";  static rom char str_MFM_DISK[] = "MFM_DISK";
54    
55  // Sector header.  // Sector header.
56  static rom uint8_t sector_header[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xA1, 0xA1, 0xFB };  static rom uint8_t sector_header[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xA1, 0xA1, 0xFB};
57    
58  #include "CRC.h"  #include "CRC.h"
59    
# Line 62  static uint8_t sector_buffer[1024]; Line 62  static uint8_t sector_buffer[1024];
62    
63  #pragma udata wd179x_data_section  #pragma udata wd179x_data_section
64    
65  static uint8_t command;                 // Command being currently executed.  static uint8_t command; // Command being currently executed.
66  static drive_state* drive;              // Drive being currently accessed.  static drive_state* drive; // Drive being currently accessed.
67  static uint8_t drive_changed;   // Previous command was issued to another drive.  static uint8_t drive_changed; // Previous command was issued to another drive.
68    
69  drive_state wd179x_drive[4];  drive_state wd179x_drive[4];
70    
# Line 74  drive_state wd179x_drive[4]; Line 74  drive_state wd179x_drive[4];
74  #define TrackWriteByte(X) if (!fat32_file_put_byte(&drive->image_file, (X))) { sd_io_error(); return 0; }  #define TrackWriteByte(X) if (!fat32_file_put_byte(&drive->image_file, (X))) { sd_io_error(); return 0; }
75    
76  #pragma code  #pragma code
77    
78  static void sd_io_error(void)  static void sd_io_error(void)
79  {  {
80          ui_set_status(ui_status_sd_io_error);    ui_set_status(ui_status_sd_io_error);
81  }  }
82    
83  static void clear_busy_flag(void)  static void clear_busy_flag(void)
84  {  {
85  /*      TRISD = 0x00;           // MD output.    /*    TRISD = 0x00;           // MD output.
86          PORTD = 0x00;            PORTD = 0x00;
87          PORTB = 0x06;           // MFS = 0, MWE high, MOE high.            PORTB = 0x06;         // MFS = 0, MWE high, MOE high.
88          PORTB = 0x04;           // MFS = 0, MWE low, MOE high.            PORTB = 0x04;         // MFS = 0, MWE low, MOE high.
89          WaitClockCycle;            WaitClockCycle;
90          PORTB = 0x06;           // MFS = 0, MWE high, MOE high.            PORTB = 0x06;                 // MFS = 0, MWE high, MOE high.
91          TRISD = 0xFF;           // MD back to input.*/            TRISD = 0xFF;         // MD back to input.*/
92  }  }
93    
94  static void generate_interrupt_request(void)  static void generate_interrupt_request(void)
95  {  {
96          /*if (command == 0xD8)    /*if (command == 0xD8)
97                  PORTEbits.RE2 = 1;*/            PORTEbits.RE2 = 1;*/
98    
99          PORTB = 0x16;           // MFS = 2, MWE high, MOE high.    PORTB = 0x16; // MFS = 2, MWE high, MOE high.
100          PORTB = 0x14;           // MFS = 2, MWE low, MOE high.    PORTB = 0x14; // MFS = 2, MWE low, MOE high.
101          WaitClockCycle;    WaitClockCycle;
102          PORTB = 0x16;           // MFS = 2, MWE high, MOE high.    PORTB = 0x16; // MFS = 2, MWE high, MOE high.
103    
104          /*PORTEbits.RE2 = 0;*/    /*PORTEbits.RE2 = 0;*/
105  }  }
106    
107  static void generate_data_request(void)  static void generate_data_request(void)
108  {  {
109          PORTB = 0x0E;           // MFS = 1, MWE high, MOE high.    PORTB = 0x0E; // MFS = 1, MWE high, MOE high.
110          PORTB = 0x0C;           // MFS = 1, MWE low, MOE high.    PORTB = 0x0C; // MFS = 1, MWE low, MOE high.
111          WaitClockCycle;    WaitClockCycle;
112          PORTB = 0x0E;           // MFS = 1, MWE high, MOE high.    PORTB = 0x0E; // MFS = 1, MWE high, MOE high.
113  }  }
114    
115  static void write_data_register(uint8_t data)  static void write_data_register(uint8_t data)
116  {  {
117          TRISD = 0x00;           // MD output.    TRISD = 0x00; // MD output.
118          PORTD = data;    PORTD = data;
119          PORTB = 0x1E;           // MFS = 3, MWE high, MOE high.    PORTB = 0x1E; // MFS = 3, MWE high, MOE high.
120          PORTB = 0x1C;           // MFS = 3, MWE low, MOE high.    PORTB = 0x1C; // MFS = 3, MWE low, MOE high.
121          WaitClockCycle;    WaitClockCycle;
122          PORTB = 0x1E;           // MFS = 3, MWE high, MOE high.    PORTB = 0x1E; // MFS = 3, MWE high, MOE high.
123          TRISD = 0xFF;           // MD back to input.    TRISD = 0xFF; // MD back to input.
124  }  }
125    
126  static uint8_t read_data_register(void)  static uint8_t read_data_register(void)
127  {  {
128          uint8_t data;    uint8_t data;
129    
130          PORTB = 0x1A;           // MFS = 3, MWE high, MOE low.    PORTB = 0x1A; // MFS = 3, MWE high, MOE low.
131          Nop();    Nop();
132          data = PORTD;    data = PORTD;
133          PORTB = 0x1E;           // MFS = 3, MWE high, MOE high.    PORTB = 0x1E; // MFS = 3, MWE high, MOE high.
134    
135          return data;    return data;
136  }  }
137    
138  static int8_t read_track_register(void)  static int8_t read_track_register(void)
139  {  {
140          int8_t track;    int8_t track;
141    
142          PORTB = 0x0A;           // MFS = 1, MWE high, MOE low.    PORTB = 0x0A; // MFS = 1, MWE high, MOE low.
143          Nop();    Nop();
144          track = PORTD;    track = PORTD;
145          PORTB = 0x0E;           // MFS = 1, MWE high, MOE high.    PORTB = 0x0E; // MFS = 1, MWE high, MOE high.
146    
147          return track;    return track;
148  }  }
149    
150  static void write_track_register(uint8_t track)  static void write_track_register(uint8_t track)
151  {  {
152          TRISD = 0x00;           // MD output.    TRISD = 0x00; // MD output.
153          PORTD = track;    PORTD = track;
154          PORTB = 0x2E;           // MFS = 5, MWE high, MOE high.    PORTB = 0x2E; // MFS = 5, MWE high, MOE high.
155          PORTB = 0x2C;           // MFS = 5, MWE low, MOE high.    PORTB = 0x2C; // MFS = 5, MWE low, MOE high.
156          WaitClockCycle;    WaitClockCycle;
157          PORTB = 0x2E;           // MFS = 5, MWE high, MOE high.    PORTB = 0x2E; // MFS = 5, MWE high, MOE high.
158          TRISD = 0xFF;           // MD back to input.    TRISD = 0xFF; // MD back to input.
159  }  }
160    
161  static uint8_t read_sector_register(void)  static uint8_t read_sector_register(void)
162  {  {
163          uint8_t sector;    uint8_t sector;
164    
165          PORTB = 0x12;           // MFS = 2, MWE high, MOE low.    PORTB = 0x12; // MFS = 2, MWE high, MOE low.
166          Nop();    Nop();
167          sector = PORTD;    sector = PORTD;
168          PORTB = 0x16;           // MFS = 2, MWE high, MOE high.    PORTB = 0x16; // MFS = 2, MWE high, MOE high.
169    
170          return sector;    return sector;
171  }  }
172    
173  static void write_sector_register(uint8_t sector)  static void write_sector_register(uint8_t sector)
174  {  {
175          TRISD = 0x00;           // MD output.    TRISD = 0x00; // MD output.
176          PORTD = sector;    PORTD = sector;
177          PORTB = 0x06;           // MFS = 0, MWE high, MOE high.    PORTB = 0x06; // MFS = 0, MWE high, MOE high.
178          PORTB = 0x04;           // MFS = 0, MWE low, MOE high.    PORTB = 0x04; // MFS = 0, MWE low, MOE high.
179          WaitClockCycle;    WaitClockCycle;
180          PORTB = 0x06;           // MFS = 0, MWE high, MOE high.    PORTB = 0x06; // MFS = 0, MWE high, MOE high.
181          TRISD = 0xFF;           // MD back to input.    TRISD = 0xFF; // MD back to input.
182  }  }
183    
184  static void write_status_register(uint8_t status)  static void write_status_register(uint8_t status)
185  {  {
186  #ifdef WD179X_DEBUG  #ifdef WD179X_DEBUG
187          //n6610_debug((const far rom char*) "Status: ", status);    //n6610_debug((const far rom char*) "Status: ", status);
188  #endif  #endif
189    
190          TRISD = 0x00;           // MD output.    TRISD = 0x00; // MD output.
191          PORTD = status;    PORTD = status;
192          PORTB = 0x26;           // MFS = 4, MWE high, MOE high.    PORTB = 0x26; // MFS = 4, MWE high, MOE high.
193          PORTB = 0x24;           // MFS = 4, MWE low, MOE high.      PORTB = 0x24; // MFS = 4, MWE low, MOE high.
194          WaitClockCycle;    WaitClockCycle;
195          PORTB = 0x26;           // MFS = 4, MWE high, MOE high.    PORTB = 0x26; // MFS = 4, MWE high, MOE high.
196          TRISD = 0xFF;           // MD back to input.    TRISD = 0xFF; // MD back to input.
197  }  }
198    
199  static void wait_head_step(void)  static void wait_head_step(void)
200  {  {
201          //IMPLEMENTME!    //IMPLEMENTME!
202  }  }
203    
204  static void head_step_out(void)  static void head_step_out(void)
205  {  {
206          drive->track --;                                      drive->track--;
207          if (drive->track < 0)                          if (drive->track < 0)
208                  drive->track = 0;                    drive->track = 0;
209          if (drive->track == 0)    if (drive->track == 0)
210                  drive->type_I_status |= 0x04;      drive->type_I_status |= 0x04;
211    
212          // Update display.    // Update display.
213          ui_update_track(drive);    ui_update_track(drive);
214  }  }
215    
216  static void head_step_in(void)  static void head_step_in(void)
217  {  {
218          drive->track ++;                                            drive->track++;
219          if (drive->track > 83)          // Hard stop.                      if (drive->track > 83) // Hard stop.
220                  drive->track = 83;            drive->track = 83;
221          drive->type_I_status &= 0xFB;    drive->type_I_status &= 0xFB;
222    
223          // Update display.    // Update display.
224          ui_update_track(drive);    ui_update_track(drive);
225  }  }
226    
227  static void step_out(void)  static void step_out(void)
228  {        {
229          wait_head_step();    wait_head_step();
230          head_step_out();    head_step_out();
231          write_status_register(drive->type_I_status);        write_status_register(drive->type_I_status);
232    
233          // Update track register if requested.    // Update track register if requested.
234          if (command & 0x10)    if (command & 0x10)
235          {    {
236                  int8_t track;      int8_t track;
237    
238                  track = read_track_register();      track = read_track_register();
239                  track --;                                        track--;
240                  if (track < 0)                          if (track < 0)
241                          track = 0;                      track = 0;
242                  write_track_register(track);      write_track_register(track);
243          }          }
244  }  }
245    
246  static void step_in(void)  static void step_in(void)
247  {        {
248          wait_head_step();    wait_head_step();
249          head_step_in();    head_step_in();
250          write_status_register(drive->type_I_status);        write_status_register(drive->type_I_status);
251    
252          // Update track register if requested.    // Update track register if requested.
253          if (command & 0x10)    if (command & 0x10)
254          {    {
255                  int8_t track;      int8_t track;
256    
257                  track = read_track_register();      track = read_track_register();
258                  track ++;               // No hard stop (?)      track++; // No hard stop (?)
259                  write_track_register(track);      write_track_register(track);
260          }          }
261  }  }
262    
263  static void restore(void)  static void restore(void)
264  {        {
265          ui_log_command((const far rom char*) "Restore", 0, 0, 0);    ui_log_command((const far rom char*) "Restore", 0, 0, 0);
266    
267          while (drive->track)    while (drive->track)
268          {    {
269                  wait_head_step();      wait_head_step();
270                  head_step_out();      head_step_out();
271                  write_status_register(drive->type_I_status);          write_status_register(drive->type_I_status);
272          }          }
273    
274          write_track_register(0);    write_track_register(0);
275  }  }
276    
277  static void seek(void)  static void seek(void)
278  {        {
279          int8_t track;    int8_t track;
280          int8_t data;    int8_t data;
281    
282          track = read_track_register();    track = read_track_register();
283          data = read_data_register();    data = read_data_register();
284    
285          ui_log_command((const far rom char*) "Seek", track, data, 0);    ui_log_command((const far rom char*) "Seek", track, data, 0);
286    
287          do    do
288          {                  {
289                  wait_head_step();      wait_head_step();
290    
291                  track = read_track_register();      track = read_track_register();
292                  data = read_data_register();      data = read_data_register();
293    
294                  if (track < data)      if (track < data)
295                  {      {
296                          track ++;        track++;
297                          head_step_in();        head_step_in();
298                  }      }
299                  else if (track > data)      else if (track > data)
300                  {      {
301                          track --;        track--;
302                          head_step_out();        head_step_out();
303                  }      }
304                  write_track_register(track);      write_track_register(track);
305                  write_status_register(drive->type_I_status);      write_status_register(drive->type_I_status);
306          }    }
307          while (track != data);      while (track != data);
308  }  }
309    
310  static void wait_for_next_byte(void)  static void wait_for_next_byte(void)
311  {  {
312          // Wait for ~32us.    // Wait for ~32us.
313  /*Delay10TCYx(3);    /*Delay10TCYx(3);
314          Nop();            Nop();
315          Nop();*/            Nop();*/
316    
317          Delay10TCYx(19);    Delay10TCYx(19);
318  }  }
319    
320  static uint8_t sample_side(void)  static uint8_t sample_side(void)
321  {  {
322          uint8_t side_match;    uint8_t side_match;
323          side_match = 1;    side_match = 1;
324    
325          // Sample side input.              // Sample side input.
326          if (PORTAbits.RA2 == 1)    if (PORTAbits.RA2 == 1)
327          {    {
328                  if (drive->side == 0)      if (drive->side == 0)
329                          side_match = 0;        side_match = 0;
330                  drive->side = 1;      drive->side = 1;
331          }    }
332          else    else
333          {    {
334                  if (drive->side == 1)      if (drive->side == 1)
335                          side_match = 0;        side_match = 0;
336                  drive->side = 0;      drive->side = 0;
337          }    }
338    
339          return side_match;    return side_match;
340  }  }
341    
342  static uint8_t needs_reseek(void)  static uint8_t needs_reseek(void)
343  {  {
344          if (!sample_side())    if (!sample_side())
345                  return 1;      return 1;
346            
347          if (drive_changed)    if (drive_changed)
348                  return 1;      return 1;
349    
350          return (fat32_sector_buffer_owner != &(drive->image_file));    return (fat32_sector_buffer_owner != &(drive->image_file));
351  }  }
352    
353  static void sample_DSEL(void)  static void sample_DSEL(void)
354  {  {
355          uint8_t drive_number;    uint8_t drive_number;
356    
357          /* Sample DSEL lines */    /* Sample DSEL lines */
358          drive_number = 0;    drive_number = 0;
359          if (PORTAbits.RA0 == 1)    if (PORTAbits.RA0 == 1)
360                  drive_number ++;      drive_number++;
361          if (PORTAbits.RA1 == 1)    if (PORTAbits.RA1 == 1)
362                  drive_number += 2;      drive_number += 2;
363            
364          /* Find out if the drive has changed */    /* Find out if the drive has changed */
365          if (drive != 0)    if (drive != 0)
366                  drive_changed = (drive->number != drive_number);      drive_changed = (drive->number != drive_number);
367          else    else
368                  drive_changed = 1;      drive_changed = 1;
369    
370          /* Set active drive */    /* Set active drive */
371          drive = &wd179x_drive[drive_number];    drive = &wd179x_drive[drive_number];
372  }  }
373    
374  static uint8_t image_track_seek(void)  static uint8_t image_track_seek(void)
375  {  {
376          uint16_t block;    uint16_t block;
377    
378          // Calculate starting block.    // Calculate starting block.
379          if (drive->image_geometry == IMAGE_GEO_TRACK_FIRST)    if (drive->image_geometry == IMAGE_GEO_TRACK_FIRST)
380                  block = 1 + ((uint16_t) (drive->track + drive->side * drive->image_tracks)) * 25;      block = 1 + ((uint16_t) (drive->track + drive->side * drive->image_tracks)) * 25;
381          else    else
382                  block = 1 + ((uint16_t) (drive->track * drive->image_sides + drive->side)) * 25;      block = 1 + ((uint16_t) (drive->track * drive->image_sides + drive->side)) * 25;
383            
384          drive->track_position = 0;    drive->track_position = 0;
385          return fat32_file_seek(&drive->image_file, (((uint32_t) block) << 8));    return fat32_file_seek(&drive->image_file, (((uint32_t) block) << 8));
386  }  }
387    
388  static void handle_type_I(void)  static void handle_type_I(void)
389  {  {
390          // Set status for a type I command.    // Set status for a type I command.
391          write_status_register(drive->type_I_status);    write_status_register(drive->type_I_status);
392            
393          // Further decode command.    // Further decode command.
394          if (command & 0x40)    if (command & 0x40)
395          {    {
396                  if (command & 0x02)      if (command & 0x02)
397                          // Step-out.        // Step-out.
398                          step_out();        step_out();
399                  else      else
400                          // Step-in.        // Step-in.
401                          step_in();        step_in();
402          }    }
403          else if (command & 0x10)    else if (command & 0x10)
404                  seek();      seek();
405          else    else
406                  restore();      restore();
407    
408          // These commands cannot fail ATM.    // These commands cannot fail ATM.
409          ui_set_status(ui_status_ok);    ui_set_status(ui_status_ok);
410    
411          // Seek in image file.  //?    // Seek in image file.        //?
412          image_track_seek();    image_track_seek();
413    
414          // IRQ.    // IRQ.
415          generate_interrupt_request();    generate_interrupt_request();
416  }  }
417    
418  static uint8_t handle_read_sector(void)  static uint8_t handle_read_sector(void)
419  {  {
420          uint8_t i;    uint8_t i;
421          uint16_t crc;    uint16_t crc;
422          uint8_t* pos;    uint8_t* pos;
423          uint16_t cnt;    uint16_t cnt;
424          uint8_t* buf;    uint8_t* buf;
425          uint8_t byte;    uint8_t byte;
426          uint8_t track;    uint8_t track;
427          uint8_t sector;    uint8_t sector;
428          uint32_t lba;    uint32_t lba;
429    
430          // Update status?    // Update status?
431          //write_status_register(0x0);    //write_status_register(0x0);
432    
433          // Read track and sector registers for verification.    // Read track and sector registers for verification.
434          track = read_track_register();    track = read_track_register();
435          sector = read_sector_register();    sector = read_sector_register();
436    
437          drive->last_read_sector=sector;    drive->last_read_sector = sector;
438            
439          if (needs_reseek())    if (needs_reseek())
440                  if (!image_track_seek())      if (!image_track_seek())
441                  {      {
442                          sd_io_error();        sd_io_error();
443                          return 0;        return 0;
444                  }      }
445    
446          ui_log_command((const far rom char*) "Read Sector", drive->side, track, sector);    ui_log_command((const far rom char*) "Read Sector", drive->side, track, sector);
447    
448          // Update display.    // Update display.
449          ui_update_track(drive);    ui_update_track(drive);
450    
451          if (drive->image_type == IMAGE_DSK_OLD)    if (drive->image_type == IMAGE_DSK_OLD)
452          {    {
453                  /* IMPLEMENTME! */      /* IMPLEMENTME! */
454          }    }
455    
456          if (drive->image_type == IMAGE_DSK_MFM)    if (drive->image_type == IMAGE_DSK_MFM)
457          {    {
458                  // Due to the structure of DSK images, we can deal in 256 byte blocks.      // Due to the structure of DSK images, we can deal in 256 byte blocks.
459                  uint8_t byte;      uint8_t byte;
460                  uint8_t idf;      uint8_t idf;
461                  uint8_t max_idf;      uint8_t max_idf;
462                  uint8_t df;      uint8_t df;
463                  uint16_t length;      uint16_t length;
464                  uint16_t bytes_left;      uint16_t bytes_left;
465    
466                  idf = 0;      idf = 0;
467                  max_idf = 0;      max_idf = 0;
468                  bytes_left = 6250;      bytes_left = 6250;
469                  while (1)      while (1)
470                  {      {
471                          //n6610_debug_message((const far rom char*) "Searching ID Field");        //n6610_debug_message((const far rom char*) "Searching ID Field");
472    
473                          idf = 0;        idf = 0;
474                          while (bytes_left)              while (bytes_left)
475                          {              {
476                                  CheckReadTrackEnd();              CheckReadTrackEnd();
477                                  TrackReadByte(&byte);          TrackReadByte(&byte);
478                                  bytes_left --;            bytes_left--;
479                                  drive->track_position   ++;          drive->track_position++;
480                                    
481                                  if (idf > max_idf)          if (idf > max_idf)
482                                          max_idf = idf;            max_idf = idf;
483    
484                                  if (idf < 3)          if (idf < 3)
485                                          if (byte == 0xA1)            if (byte == 0xA1)
486                                                  idf ++;              idf++;
487                                          else            else
488                                                  idf = 0;              idf = 0;
489                                  else if (idf == 3)          else if (idf == 3)
490                                          if (byte == 0xFE)            if (byte == 0xFE)
491                                                  idf ++;              idf++;
492                                          else            else
493                                                  idf = 0;              idf = 0;
494                                  else if (idf == 4)          else if (idf == 4)
495                                  {          {
496                                          max_idf = byte;            max_idf = byte;
497                                          if (byte == track)            if (byte == track)
498                                                  idf ++;              idf++;
499                                          else            else
500                                                  idf = 0;              idf = 0;
501                                  }          }
502                                  else if (idf == 5)          else if (idf == 5)
503                                  {          {
504                                          if (command & 0x02)            if (command & 0x02)
505                                          {            {
506                                                  if (((command >> 3) & 0x01) == drive->side)              if (((command >> 3) & 0x01) == drive->side)
507                                                          idf ++;                idf++;
508                                                  else              else
509                                                          idf = 0;                idf = 0;
510                                          }            }
511                                          else            else
512                                                  idf ++;              idf++;
513                                  }          }
514                                  else if (idf == 6)          else if (idf == 6)
515                                  {          {
516                                          if (byte == sector)            if (byte == sector)
517                                                  idf ++;              idf++;
518                                          else            else
519                                                  idf = 0;              idf = 0;
520                                  }          }
521                                  else if (idf == 7)          else if (idf == 7)
522                                  {          {
523                                          if (byte < 4)            if (byte < 4)
524                                          {            {
525                                                  length = ((uint16_t) 128) << byte;              length = ((uint16_t) 128) << byte;
526                                                  idf ++;              idf++;
527                                            
528                                                  // We have a complete ID Field.              // We have a complete ID Field.
529                                                  break;              break;
530                                          }            }
531                                          else            else
532                                                  idf = 0;              idf = 0;
533                                  }          }
534                                  else          else
535                                          idf = 0;            idf = 0;
536                          }        }
537            
538                          if (idf != 8)        if (idf != 8)
539                          {        {
540                                  ui_set_status(ui_status_rnf);          ui_set_status(ui_status_rnf);
541                                  ui_log_status(0x10);          ui_log_status(0x10);
542                                  write_status_register(0x10);          write_status_register(0x10);
543                                  break;          break;
544                          }        }
545    
546                          df = 0;        df = 0;
547                          i = 43;        i = 43;
548                          while (bytes_left && i)        while (bytes_left && i)
549                          {        {
550                                  CheckReadTrackEnd();              CheckReadTrackEnd();
551                                  TrackReadByte(&byte);          TrackReadByte(&byte);
552                                  bytes_left --;          bytes_left--;
553                                  drive->track_position   ++;          drive->track_position++;
554                                                                    
555                                  if (df < 3)          if (df < 3)
556                                          if (byte == 0xA1)            if (byte == 0xA1)
557                                                  df ++;              df++;
558                                          else            else
559                                                  df = 0;              df = 0;
560                                  else if (df == 3)          else if (df == 3)
561                                          if (byte == 0xFB)            if (byte == 0xFB)
562                                          {            {
563                                                  df ++;              df++;
564                                            
565                                                  // We have a complete Data Field Header.              // We have a complete Data Field Header.
566                                                  break;              break;
567                                          }            }
568                                          else            else
569                                                  df = 0;              df = 0;
570                                  else          else
571                                          df = 0;            df = 0;
572                          }        }
573    
574                          if (df != 4)        if (df != 4)
575                          {                                      {
576                                  // Could not find a DAM within range, keep searching.          // Could not find a DAM within range, keep searching.
577                                  continue;                continue;
578                          }        }
579    
580                          // Stream the whole data field out of the data bus.                            // Stream the whole data field out of the data bus.
581                          pos = sector_buffer;        pos = sector_buffer;
582                          cnt = length;        cnt = length;
583                          crc = 0xE295;   /* Initialize with A1A1A1FB */        crc = 0xE295; /* Initialize with A1A1A1FB */
584                            
585                          while (cnt)            while (cnt)
586                          {        {
587                                  // Read data byte.          // Read data byte.
588                                  CheckReadTrackEnd();              CheckReadTrackEnd();
589                                  TrackReadByte(&byte);          TrackReadByte(&byte);
590    
591                                  *pos = byte;          *pos = byte;
592                                  crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte];          crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte];
593            
594                                  pos ++;          pos++;
595                                  cnt --;          cnt--;
596                                  drive->track_position   ++;          drive->track_position++;
597                          }              }
598    
599                          pos = sector_buffer;        pos = sector_buffer;
600                          cnt = length;        cnt = length;
601                          while (cnt)            while (cnt)
602                          {        {
603                                  write_data_register(*pos);          write_data_register(*pos);
604                                  generate_data_request();          generate_data_request();
605                                  wait_for_next_byte();          wait_for_next_byte();
606                                  cnt --;          cnt--;
607                                  pos ++;          pos++;
608                          }        }
609    
610                          // Check CRC.        // Check CRC.
611                          CheckReadTrackEnd();        CheckReadTrackEnd();
612                          TrackReadByte(&byte);        TrackReadByte(&byte);
613                          drive->track_position   ++;        drive->track_position++;
614    
615  #ifdef WD179X_CHECK_CRC  #ifdef WD179X_CHECK_CRC
616                          if (byte != (crc >> 8))        if (byte != (crc >> 8))
617                          {        {
618                                  ui_set_status(ui_status_crc_error);          ui_set_status(ui_status_crc_error);
619                                  ui_log_status(0x08);          ui_log_status(0x08);
620                                  write_status_register(0x08);          write_status_register(0x08);
621                                  break;          break;
622                          }        }
623  #endif  #endif
624    
625                          CheckReadTrackEnd();        CheckReadTrackEnd();
626                          TrackReadByte(&byte);        TrackReadByte(&byte);
627                          drive->track_position   ++;        drive->track_position++;
628    
629  #ifdef WD179X_CHECK_CRC  #ifdef WD179X_CHECK_CRC
630                          if (byte != (crc & 0xFF))        if (byte != (crc & 0xFF))
631                          {        {
632                                  ui_set_status(ui_status_crc_error);          ui_set_status(ui_status_crc_error);
633                                  ui_log_status(0x08);          ui_log_status(0x08);
634                                  write_status_register(0x08);          write_status_register(0x08);
635                                  break;          break;
636                          }        }
637  #endif  #endif
638    
639                          // Multiple sectors?        // Multiple sectors?
640                          if (command & 0x10)        if (command & 0x10)
641                          {        {
642                                  sector ++;          sector++;
643                                  // Update sector register?          // Update sector register?
644                          }        }
645                          else        else
646                          {        {
647                                  ui_set_status(ui_status_ok);          ui_set_status(ui_status_ok);
648                                  write_status_register(0x0);          write_status_register(0x0);
649                                  break;            break;
650                          }        }
651            
652                          bytes_left = 6250;        bytes_left = 6250;
653                  }      }
654          }    }
655    
656          return 1;    return 1;
657  }  }
658    
659  static uint8_t handle_write_sector(void)  static uint8_t handle_write_sector(void)
660  {  {
661          uint8_t i;    uint8_t i;
662          uint16_t crc;    uint16_t crc;
663          uint8_t* pos;    uint8_t* pos;
664          uint16_t cnt;    uint16_t cnt;
665          uint8_t* buf;    uint8_t* buf;
666          uint8_t byte;    uint8_t byte;
667          uint8_t track;    uint8_t track;
668          uint8_t sector;    uint8_t sector;
669          uint32_t lba;    uint32_t lba;
670    
671          /* Check for write protect */    /* Check for write protect */
672          if (drive->type_I_status & 0x40)    if (drive->type_I_status & 0x40)
673          {    {
674                  ui_set_status(ui_status_write_protect);      ui_set_status(ui_status_write_protect);
675                  /* FIXME! */      /* FIXME! */
676                  ui_log_status(0x60);      ui_log_status(0x60);
677                  write_status_register(0x60);                  write_status_register(0x60);
678                  return 1;      return 1;
679          }    }
680    
681          // Read track and sector registers for verification.    // Read track and sector registers for verification.
682          track = read_track_register();    track = read_track_register();
683          sector = read_sector_register();    sector = read_sector_register();
684            
685          if (needs_reseek())    if (needs_reseek())
686                  if (!image_track_seek())      if (!image_track_seek())
687                  {      {
688                          sd_io_error();        sd_io_error();
689                          return 0;        return 0;
690                  }      }
691    
692          ui_log_command((const far rom char*) "Write Sector", drive->side, track, sector);    ui_log_command((const far rom char*) "Write Sector", drive->side, track, sector);
693    
694          if (drive->image_type == IMAGE_DSK_OLD)    if (drive->image_type == IMAGE_DSK_OLD)
695          {    {
696    
697          }    }
698    
699          if (drive->image_type == IMAGE_DSK_MFM)    if (drive->image_type == IMAGE_DSK_MFM)
700          {    {
701                  // Due to the structure of DSK images, we can deal in 256 byte blocks.      // Due to the structure of DSK images, we can deal in 256 byte blocks.
702                  uint8_t byte;      uint8_t byte;
703                  uint8_t idf;      uint8_t idf;
704                  uint8_t max_idf;      uint8_t max_idf;
705                  uint8_t df;      uint8_t df;
706                  uint16_t length;      uint16_t length;
707                  uint16_t bytes_left;      uint16_t bytes_left;
708    
709                  idf = 0;      idf = 0;
710                  max_idf = 0;      max_idf = 0;
711                  bytes_left = 6250;      bytes_left = 6250;
712                  while (1)      while (1)
713                  {      {
714                          //n6610_debug_message((const far rom char*) "Searching ID Field");        //n6610_debug_message((const far rom char*) "Searching ID Field");
715    
716                          idf = 0;        idf = 0;
717                          while (bytes_left)              while (bytes_left)
718                          {              {
719                                  CheckReadTrackEnd();          CheckReadTrackEnd();
720                                  TrackReadByte(&byte);          TrackReadByte(&byte);
721                                  bytes_left --;            bytes_left--;
722                                  drive->track_position   ++;          drive->track_position++;
723                                    
724                                  if (idf > max_idf)          if (idf > max_idf)
725                                          max_idf = idf;            max_idf = idf;
726    
727                                  if (idf < 3)          if (idf < 3)
728                                          if (byte == 0xA1)            if (byte == 0xA1)
729                                                  idf ++;              idf++;
730                                          else            else
731                                                  idf = 0;              idf = 0;
732                                  else if (idf == 3)          else if (idf == 3)
733                                          if (byte == 0xFE)            if (byte == 0xFE)
734                                                  idf ++;              idf++;
735                                          else            else
736                                                  idf = 0;              idf = 0;
737                                  else if (idf == 4)          else if (idf == 4)
738                                  {          {
739                                          max_idf = byte;            max_idf = byte;
740                                          if (byte == track)            if (byte == track)
741                                                  idf ++;              idf++;
742                                          else            else
743                                                  idf = 0;              idf = 0;
744                                  }          }
745                                  else if (idf == 5)          else if (idf == 5)
746                                  {          {
747                                          if (command & 0x02)            if (command & 0x02)
748                                          {            {
749                                                  if (((command >> 3) & 0x01) == drive->side)              if (((command >> 3) & 0x01) == drive->side)
750                                                          idf ++;                idf++;
751                                                  else              else
752                                                          idf = 0;                idf = 0;
753                                          }            }
754                                          else            else
755                                                  idf ++;              idf++;
756                                  }          }
757                                  else if (idf == 6)          else if (idf == 6)
758                                  {          {
759                                          if (byte == sector)            if (byte == sector)
760                                                  idf ++;              idf++;
761                                          else            else
762                                                  idf = 0;              idf = 0;
763                                  }          }
764                                  else if (idf == 7)          else if (idf == 7)
765                                  {          {
766                                          if (byte < 4)            if (byte < 4)
767                                          {            {
768                                                  length = ((uint16_t) 128) << byte;              length = ((uint16_t) 128) << byte;
769                                                  idf ++;              idf++;
770                                            
771                                                  // We have a complete ID Field.              // We have a complete ID Field.
772                                                  break;              break;
773                                          }            }
774                                          else            else
775                                                  idf = 0;              idf = 0;
776                                  }          }
777                                  else          else
778                                          idf = 0;            idf = 0;
779                          }        }
780            
781                          if (idf != 8)        if (idf != 8)
782                          {        {
783                                  ui_set_status(ui_status_rnf);          ui_set_status(ui_status_rnf);
784                                  ui_log_status(0x10);          ui_log_status(0x10);
785                                  write_status_register(0x10);          write_status_register(0x10);
786                                  break;          break;
787                          }        }
788    
789                          n6610_set_font(FONT_6X8);        n6610_set_font(FONT_6X8);
790                            
791                          // Generate DRQ.        // Generate DRQ.
792                          generate_data_request();        generate_data_request();
793    
794                          // Count off 22 bytes.        // Count off 22 bytes.
795                          for (i = 0; i < 22; i ++)        for (i = 0; i < 22; i++)
796                          {        {
797                                  // Advance.          // Advance.
798                                  CheckReadTrackEnd();          CheckReadTrackEnd();
799                                  TrackReadByte(&byte);          TrackReadByte(&byte);
800                                  drive->track_position ++;          drive->track_position++;
801    
802                                  wait_for_next_byte();          wait_for_next_byte();
803                          }        }
804    
805                          /* TODO: Check if DRQ's have been serviced */        /* TODO: Check if DRQ's have been serviced */
806                          // Buffer the data from the CPU and calculate CRC.        // Buffer the data from the CPU and calculate CRC.
807                          pos = sector_buffer;        pos = sector_buffer;
808                          cnt = length;        cnt = length;
809                          crc = 0xE295;        crc = 0xE295;
810                          while (cnt)            while (cnt)
811                          {        {
812                                  *pos = byte = read_data_register();          *pos = byte = read_data_register();
813                                  crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte];          crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte];
814                                  generate_data_request();          generate_data_request();
815                                  wait_for_next_byte();          wait_for_next_byte();
816                                  cnt --;          cnt--;
817                                  pos ++;          pos++;
818                          }        }
819    
820                          /* At this point, we can actually signal end of command to the CPU.        /* At this point, we can actually signal end of command to the CPU.
821               * The actual write to SD Card may be deferred.         * The actual write to SD Card may be deferred.
822               */         */
823    
824                          /* Write sector header to SD Card.        /* Write sector header to SD Card.
825               * 6 zero bytes followed by DAM.         * 6 zero bytes followed by DAM.
826                           */         */
827                          for (i = 0; i < 10; i ++)        for (i = 0; i < 10; i++)
828                          {        {
829                                  // Write          // Write
830                                  CheckWriteTrackEnd();          CheckWriteTrackEnd();
831                                  TrackWriteByte(sector_header[i]);          TrackWriteByte(sector_header[i]);
832                                  drive->track_position ++;          drive->track_position++;
833                          }        }
834    
835                          /* Now write data bytes to SD Card */        /* Now write data bytes to SD Card */
836                          cnt = length;        cnt = length;
837                          pos = sector_buffer;        pos = sector_buffer;
838                          while (cnt)            while (cnt)
839                          {        {
840                                  // Write data byte.          // Write data byte.
841                                  CheckWriteTrackEnd();          CheckWriteTrackEnd();
842                                  TrackWriteByte(*pos);            TrackWriteByte(*pos);
843                                  pos ++;          pos++;
844                                  cnt --;          cnt--;
845                                  drive->track_position ++;          drive->track_position++;
846                          }              }
847    
848                          // Write CRC bytes.        // Write CRC bytes.
849                          CheckWriteTrackEnd();        CheckWriteTrackEnd();
850                          TrackWriteByte(crc >> 8);        TrackWriteByte(crc >> 8);
851                          drive->track_position ++;        drive->track_position++;
852    
853                          CheckWriteTrackEnd();        CheckWriteTrackEnd();
854                          TrackWriteByte(crc & 0xFF);        TrackWriteByte(crc & 0xFF);
855                          drive->track_position ++;        drive->track_position++;
856    
857                          fat32_file_flush(&drive->image_file);        fat32_file_flush(&drive->image_file);
858    
859                          // Multiple sectors?        // Multiple sectors?
860                          if (command & 0x10)        if (command & 0x10)
861                          {        {
862                                  sector ++;          sector++;
863                                  // Update sector register?          // Update sector register?
864                          }        }
865                          else        else
866                          {        {
867                                  ui_set_status(ui_status_ok);          ui_set_status(ui_status_ok);
868                                  write_status_register(0x0);          write_status_register(0x0);
869                                  break;            break;
870                          }        }
871            
872                          bytes_left = 6250;        bytes_left = 6250;
873                  }      }
874          }    }
875    
876          return 1;    return 1;
877  }  }
878    
879  static uint8_t handle_type_II(void)  static uint8_t handle_type_II(void)
880  {  {
881          uint8_t result;    uint8_t result;
882            
883          if (command & 0x20)    if (command & 0x20)
884          {    {
885                  // Ready?      // Ready?
886                  if (drive->type_I_status & 0x80)      if (drive->type_I_status & 0x80)
887                  {      {
888                          ui_set_status(ui_status_not_ready);        ui_set_status(ui_status_not_ready);
889                          ui_log_status(0x80);        ui_log_status(0x80);
890                          write_status_register(0x80);        write_status_register(0x80);
891                          result = 1;        result = 1;
892                  }            }
893                  else if (!handle_write_sector())      else if (!handle_write_sector())
894                          result = 0;        result = 0;
895                  else      else
896                          result = 1;        result = 1;
897          }          }
898          else    else
899          {    {
900                  // Ready?      // Ready?
901                  if (drive->type_I_status & 0x80)      if (drive->type_I_status & 0x80)
902                  {      {
903                          ui_set_status(ui_status_not_ready);        ui_set_status(ui_status_not_ready);
904                          ui_log_status(0x80);        ui_log_status(0x80);
905                          write_status_register(0x80);        write_status_register(0x80);
906                          result = 1;        result = 1;
907                  }            }
908                  else if (!handle_read_sector())      else if (!handle_read_sector())
909                          result = 0;        result = 0;
910                  else      else
911                          result = 1;        result = 1;
912          }    }
913    
914          // IRQ.    // IRQ.
915          generate_interrupt_request();    generate_interrupt_request();
916          return result;    return result;
917  }  }
918    
919  static uint8_t handle_read_address(void)  static uint8_t handle_read_address(void)
920  {  {
921          uint8_t i;    uint8_t i;
922          uint8_t byte;    uint8_t byte;
923          uint8_t track;    uint8_t track;
924          uint32_t lba;    uint32_t lba;
925    
926          // Update status?    // Update status?
927          // write_status_register(0x0);    // write_status_register(0x0);
928          ui_log_command((const far rom char*) "Read Address", 0, 0, 0);    ui_log_command((const far rom char*) "Read Address", 0, 0, 0);
929    
930          if (drive->image_type == IMAGE_DSK_OLD)    if (drive->image_type == IMAGE_DSK_OLD)
931          {    {
932    
933          }    }
934    
935          if (drive->image_type == IMAGE_DSK_MFM)    if (drive->image_type == IMAGE_DSK_MFM)
936          {    {
937                  // Due to the structure of DSK images, we can deal in 256 byte blocks.      // Due to the structure of DSK images, we can deal in 256 byte blocks.
938                  uint8_t byte;      uint8_t byte;
939                  uint8_t idf;      uint8_t idf;
940                  uint16_t length;      uint16_t length;
941                  uint16_t side;      uint16_t side;
942                  uint16_t block;      uint16_t block;
943                  uint16_t bytes_left;      uint16_t bytes_left;
944                    
945                  if (needs_reseek())      if (needs_reseek())
946                          if (!image_track_seek())        if (!image_track_seek())
947                          {        {
948                                  sd_io_error();          sd_io_error();
949                                  return 0;          return 0;
950                          }        }
951    
952                  idf = 0;      idf = 0;
953                  bytes_left = 6250;      bytes_left = 6250;
954                  while (bytes_left)            while (bytes_left)
955                  {            {
956                            
957                          CheckReadTrackEnd();        CheckReadTrackEnd();
958                          TrackReadByte(&byte);        TrackReadByte(&byte);
959                          bytes_left --;                          bytes_left--;
960                          drive->track_position   ++;        drive->track_position++;
961                            
962                          if (idf < 3)        if (idf < 3)
963                                  if (byte == 0xA1)          if (byte == 0xA1)
964                                          idf ++;            idf++;
965                                  else          else
966                                          idf = 0;            idf = 0;
967                          else if (idf == 3)        else if (idf == 3)
968                                  if (byte == 0xFE)          if (byte == 0xFE)
969                                  {          {
970                                          idf ++;            idf++;
971                                    
972                                          // We have a complete IDAM.            // We have a complete IDAM.
973                                          break;            break;
974                                  }          }
975                                  else          else
976                                          idf = 0;            idf = 0;
977                  }      }
978    
979                  if (idf != 4)      if (idf != 4)
980                  {      {
981                          ui_set_status(ui_status_rnf);        ui_set_status(ui_status_rnf);
982                          ui_log_status(0x10);        ui_log_status(0x10);
983                          write_status_register(0x10);        write_status_register(0x10);
984                          return 1;        return 1;
985                  }      }
986    
987                  // Stream the address field out of the data bus.                      // Stream the address field out of the data bus.
988                  length = 6;          length = 6;
989                  while (bytes_left && length)          while (bytes_left && length)
990                  {      {
991                          // Read data byte.        // Read data byte.
992                          CheckReadTrackEnd();        CheckReadTrackEnd();
993                          TrackReadByte(&byte);        TrackReadByte(&byte);
994                          bytes_left --;        bytes_left--;
995                          length --;        length--;
996                          drive->track_position   ++;        drive->track_position++;
997    
998                          if (length == 5)        if (length == 5)
999                                  track = byte;          track = byte;
1000    
1001                          write_data_register(byte);        write_data_register(byte);
1002                          generate_data_request();        generate_data_request();
1003                          wait_for_next_byte();        wait_for_next_byte();
1004                  }            }
1005    
1006                  //n6610_debug_message((const far rom char*) "Streaming Done");      //n6610_debug_message((const far rom char*) "Streaming Done");
1007                  ui_log_command((const far rom char*) "Track",  track, 0, 0);      ui_log_command((const far rom char*) "Track", track, 0, 0);
1008            
1009                  ui_set_status(ui_status_ok);      ui_set_status(ui_status_ok);
1010                  write_sector_register(track);      write_sector_register(track);
1011                  write_status_register(0x0);      write_status_register(0x0);
1012          }    }
1013    
1014          return 1;    return 1;
1015  }  }
1016    
1017  static uint8_t handle_type_III(void)  static uint8_t handle_type_III(void)
1018  {  {
1019          uint8_t result;    uint8_t result;
1020            
1021          if ((command & 0x30) == 0x00)    if ((command & 0x30) == 0x00)
1022          {    {
1023                  // Read Address.      // Read Address.
1024    
1025                  // Ready?      // Ready?
1026                  if (drive->type_I_status & 0x80)      if (drive->type_I_status & 0x80)
1027                  {      {
1028                          ui_set_status(ui_status_not_ready);        ui_set_status(ui_status_not_ready);
1029                          ui_log_status(0x80);        ui_log_status(0x80);
1030                          write_status_register(0x80);        write_status_register(0x80);
1031                          result = 1;        result = 1;
1032                  }            }
1033                  else if (!handle_read_address())      else if (!handle_read_address())
1034                  {      {
1035                          // An SD Card error has occurred.        // An SD Card error has occurred.
1036                          // How to setup errors?        // How to setup errors?
1037                          result = 0;        result = 0;
1038                  }                    }
1039                  else      else
1040                          result = 1;        result = 1;
1041          }    }
1042    
1043          // IRQ.    // IRQ.
1044          generate_interrupt_request();    generate_interrupt_request();
1045          return result;    return result;
1046  }  }
1047    
1048  static void handle_type_IV(void)  static void handle_type_IV(void)
1049  {  {
1050          //n6610_debug_message((const far rom char*) "Type IV");    //n6610_debug_message((const far rom char*) "Type IV");
1051  }  }
1052    
1053  void wd179X_handle_command_request(void)  void wd179X_handle_command_request(void)
1054  {  {
1055          // Read the command register.    // Read the command register.
1056          PORTB = 0x02;           // MFS = 0, MWE high, MOE low.    PORTB = 0x02; // MFS = 0, MWE high, MOE low.
1057          Nop();    Nop();
1058          command = PORTD;    command = PORTD;
1059          PORTB = 0x06;           // MFS = 0, MWE high, MOE high.    PORTB = 0x06; // MFS = 0, MWE high, MOE high.
1060    
1061          // Clear command request.    // Clear command request.
1062          PORTB = 0x34;           // MFS = 6, MWE low, MOE high.    PORTB = 0x34; // MFS = 6, MWE low, MOE high.
1063          WaitClockCycle;    WaitClockCycle;
1064          PORTB = 0x36;           // MFS = 6, MWE high, MOE high.    PORTB = 0x36; // MFS = 6, MWE high, MOE high.
1065            
1066          // Sample DSEL.    // Sample DSEL.
1067          sample_DSEL();    sample_DSEL();
1068    
1069          // Decode command type.    // Decode command type.
1070          if (command & 0x80)    if (command & 0x80)
1071                  if (command & 0x40)      if (command & 0x40)
1072                          if ((command & 0x30) == 0x10)        if ((command & 0x30) == 0x10)
1073                                  handle_type_IV();          handle_type_IV();
1074                          else        else
1075                                  handle_type_III();          handle_type_III();
1076                  else      else
1077                     handle_type_II();        handle_type_II();
1078          else    else
1079          handle_type_I();      handle_type_I();
1080    
1081          clear_busy_flag();    clear_busy_flag();
1082  }  }
1083    
1084  uint8_t wd179x_mount_image(uint8_t d, fat32_dir_entry* image)  uint8_t wd179x_mount_image(uint8_t d, fat32_dir_entry* image)
1085  {  {
1086          uint8_t i;    uint8_t i;
1087          uint32_t header_lba;    uint32_t header_lba;
1088    
1089      fat32_file_from_dir_entry(&wd179x_drive[d].image_file, image);
1090      header_lba = fat32_file_get_lba(&wd179x_drive[d].image_file, 0);
1091    
1092          fat32_file_from_dir_entry(&wd179x_drive[d].image_file, image);    /* Read header sector into the sector buffer */
1093          header_lba = fat32_file_get_lba(&wd179x_drive[d].image_file, 0);    if (!fat32_card_read(header_lba))
1094                      {
         /* Read header sector into the sector buffer */  
         if (!fat32_card_read(header_lba))  
         {  
1095  #ifdef WD179X_DEBUG  #ifdef WD179X_DEBUG
1096                  n6610_debug_message((const far rom char*) "SD Card Read Error");      n6610_debug_message((const far rom char*) "SD Card Read Error");
1097  #endif  #endif
1098    
1099                  return 0;      return 0;
1100          }    }
1101    
1102          /* Find out what kind of image it is */    /* Find out what kind of image it is */
1103          wd179x_drive[d].image_type = IMAGE_NONE;    wd179x_drive[d].image_type = IMAGE_NONE;
1104          for (i = 0; i < 8; i ++)    for (i = 0; i < 8; i++)
1105                  if (fat32_sector_buffer[i] != str_ORICDISK[i])      if (fat32_sector_buffer[i] != str_ORICDISK[i])
1106                          break;        break;
1107          if (i == 8)    if (i == 8)
1108                  wd179x_drive[d].image_type = IMAGE_DSK_OLD;      wd179x_drive[d].image_type = IMAGE_DSK_OLD;
1109            
1110          for (i = 0; i < 8; i ++)    for (i = 0; i < 8; i++)
1111                  if (fat32_sector_buffer[i] != str_MFM_DISK[i])      if (fat32_sector_buffer[i] != str_MFM_DISK[i])
1112                          break;        break;
1113          if (i == 8)    if (i == 8)
1114                  wd179x_drive[d].image_type = IMAGE_DSK_MFM;      wd179x_drive[d].image_type = IMAGE_DSK_MFM;
1115    
1116          if (wd179x_drive[d].image_type == IMAGE_NONE)    if (wd179x_drive[d].image_type == IMAGE_NONE)
1117                  return 0;      return 0;
1118    
1119          if (wd179x_drive[d].image_type == IMAGE_DSK_OLD)    if (wd179x_drive[d].image_type == IMAGE_DSK_OLD)
1120          {    {
1121                  // IMPLEMENTME!      // IMPLEMENTME!
1122                  return 0;      return 0;
1123          }    }
1124    
1125          if (wd179x_drive[d].image_type == IMAGE_DSK_MFM)    if (wd179x_drive[d].image_type == IMAGE_DSK_MFM)
1126          {    {
1127                  wd179x_drive[d].image_sides = fat32_sector_buffer[8];      wd179x_drive[d].image_sides = fat32_sector_buffer[8];
1128                  wd179x_drive[d].image_tracks = fat32_sector_buffer[12];      wd179x_drive[d].image_tracks = fat32_sector_buffer[12];
1129                  wd179x_drive[d].image_geometry = fat32_sector_buffer[16];      wd179x_drive[d].image_geometry = fat32_sector_buffer[16];
1130    
1131                  /* Sanity checks */      /* Sanity checks */
1132                  if (wd179x_drive[d].image_sides > 2)      if (wd179x_drive[d].image_sides > 2)
1133                          return 0;        return 0;
1134                  if (wd179x_drive[d].image_geometry != 1 && wd179x_drive[d].image_geometry != 2)      if (wd179x_drive[d].image_geometry != 1 && wd179x_drive[d].image_geometry != 2)
1135                          return 0;        return 0;
1136          }    }
1137    
1138          return 1;    return 1;
1139  }  }
1140    
1141  void wd179x_init(void)  void wd179x_init(void)
1142  {  {
1143          uint8_t i;    uint8_t i;
1144    
1145          // PORTD (MD) Input.    // PORTD (MD) Input.
1146          TRISEbits.PSPMODE = 0;          // PSP off.    TRISEbits.PSPMODE = 0; // PSP off.
1147          TRISD = 0xFF;    TRISD = 0xFF;
1148    
1149          // nMCRQ Input, nMOE, nMWE, MFS Output (high)    // nMCRQ Input, nMOE, nMWE, MFS Output (high)
1150          PORTB = 0xFF;    PORTB = 0xFF;
1151          TRISB = 0x01;    TRISB = 0x01;
1152    
1153          // DSEL, SSEL Input.    // DSEL, SSEL Input.
1154          TRISAbits.TRISA0 = 1;    TRISAbits.TRISA0 = 1;
1155          TRISAbits.TRISA1 = 1;    TRISAbits.TRISA1 = 1;
1156          TRISAbits.TRISA2 = 1;    TRISAbits.TRISA2 = 1;
1157    
1158          // Init drive state.    // Init drive state.
1159          for (i = 0; i < 4; i ++)    for (i = 0; i < 4; i++)
1160          {    {
1161                  wd179x_drive[i].number = i;      wd179x_drive[i].number = i;
1162                  wd179x_drive[i].image_type = IMAGE_NONE;      wd179x_drive[i].image_type = IMAGE_NONE;
1163                  wd179x_drive[i].track = 0;      wd179x_drive[i].track = 0;
1164                  wd179x_drive[i].last_read_sector = 0;      wd179x_drive[i].last_read_sector = 0;
1165                  wd179x_drive[i].side = 0;      wd179x_drive[i].side = 0;
1166                  wd179x_drive[i].type_I_status = 0x64;           // No errors, ready, protected, head loaded, track 0.      wd179x_drive[i].type_I_status = 0x64; // No errors, ready, protected, head loaded, track 0.
1167          }    }
1168          drive = 0;    drive = 0;
1169          drive_changed = 1;    drive_changed = 1;
1170  }  }
1171    

Legend:
Removed from v.1083  
changed lines
  Added in v.1084

  ViewVC Help
Powered by ViewVC 1.1.26