aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/lib/adafruit_floppy/examples/mfm_test/mfm_test.ino
blob: 07206f1338d5472b61a5598171dba3671e5da319 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <Adafruit_Floppy.h>



// If using SAMD51, turn on TINYUSB USB stack
#if defined(ADAFRUIT_FEATHER_M4_EXPRESS)
  #define DENSITY_PIN  A0    // IDC 2
  #define INDEX_PIN    A1    // IDC 8
  #define SELECT_PIN   A2    // IDC 12
  #define MOTOR_PIN    A3    // IDC 16
  #define DIR_PIN      A4    // IDC 18
  #define STEP_PIN     A5    // IDC 20
  #define WRDATA_PIN   13    // IDC 22 (not used during read)
  #define WRGATE_PIN   12    // IDC 24 (not used during read)
  #define TRK0_PIN     11    // IDC 26
  #define PROT_PIN     10    // IDC 28
  #define READ_PIN      9    // IDC 30
  #define SIDE_PIN      6    // IDC 32
  #define READY_PIN     5    // IDC 34
#if F_CPU != 180000000L
  #warning "please set CPU speed to 180MHz overclock"
#endif
#elif defined (ARDUINO_ADAFRUIT_FEATHER_RP2040)
  #define DENSITY_PIN  A0    // IDC 2
  #define INDEX_PIN    A1    // IDC 8
  #define SELECT_PIN   A2    // IDC 12
  #define MOTOR_PIN    A3    // IDC 16
  #define DIR_PIN      24    // IDC 18
  #define STEP_PIN     25    // IDC 20
  #define WRDATA_PIN   13    // IDC 22 (not used during read)
  #define WRGATE_PIN   12    // IDC 24 (not used during read)
  #define TRK0_PIN     11    // IDC 26
  #define PROT_PIN     10    // IDC 28
  #define READ_PIN      9    // IDC 30
  #define SIDE_PIN      8    // IDC 32
  #define READY_PIN     7    // IDC 34
#if F_CPU != 200000000L
  #warning "please set CPU speed to 200MHz overclock"
#endif
#elif defined (ARDUINO_RASPBERRY_PI_PICO)
  #define DENSITY_PIN  2     // IDC 2
  #define INDEX_PIN    3     // IDC 8
  #define SELECT_PIN   4     // IDC 12
  #define MOTOR_PIN    5     // IDC 16
  #define DIR_PIN      6     // IDC 18
  #define STEP_PIN     7     // IDC 20
  #define WRDATA_PIN   8     // IDC 22 (not used during read)
  #define WRGATE_PIN   9     // IDC 24 (not used during read)
  #define TRK0_PIN    10     // IDC 26
  #define PROT_PIN    11     // IDC 28
  #define READ_PIN    12     // IDC 30
  #define SIDE_PIN    13     // IDC 32
  #define READY_PIN   14     // IDC 34
#if F_CPU != 200000000L
  #warning "please set CPU speed to 200MHz overclock"
#endif
#else
#error "Please set up pin definitions!"
#endif

Adafruit_Floppy floppy(DENSITY_PIN, INDEX_PIN, SELECT_PIN,
                       MOTOR_PIN, DIR_PIN, STEP_PIN,
                       WRDATA_PIN, WRGATE_PIN, TRK0_PIN,
                       PROT_PIN, READ_PIN, SIDE_PIN, READY_PIN);

// You can select IBMPC1440K or IBMPC360K (check adafruit_floppy_disk_t options!)
Adafruit_MFM_Floppy mfm_floppy(&floppy, IBMPC360K);


uint32_t time_stamp = 0;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);      
  while (!Serial) delay(100);

  delay(500); // wait for serial to open
  Serial.println("its time for a nice floppy transfer!");

  floppy.debug_serial = &Serial;

  if (! mfm_floppy.begin()) {
    Serial.println("Failed to spin up motor & find index pulse");
    while (1) yield();
  }
}

uint8_t track = 0;
bool head = 0;
void loop() {
  int32_t captured_sectors;
  
  Serial.printf("Seeking track %d head %d\n", track, head);
  captured_sectors = mfm_floppy.readTrack(track, head);
  if (captured_sectors < 0) {
    Serial.println("Failed to seek to track");
    while (1) yield();
  }
 
  Serial.printf("Captured %d sectors\n", captured_sectors);

  Serial.print("Validity: ");
  for(size_t i=0; i < mfm_floppy.sectors_per_track(); i++) {
    Serial.print(mfm_floppy.track_validity[i] ? "V" : "?");
  }
  Serial.print("\n");
  for(size_t sector=0; sector < mfm_floppy.sectors_per_track(); sector++) {
    if (!mfm_floppy.track_validity[sector]) {
      continue; // skip it, not valid
    }
    for(size_t i=0; i<512; i+=16) {
      size_t addr = sector * 512 + i;
      Serial.printf("%08x", addr);
      for(size_t j=0; j<16; j++) {
         Serial.printf(" %02x", mfm_floppy.track_data[addr+j]);
      }
      Serial.print(" | ");
      for(size_t j=0; j<16; j++) {
        uint8_t d = mfm_floppy.track_data[addr+j];
        if (! isprint(d)) {
          d = ' ';
        }
        Serial.write(d);
      }
      Serial.print("\n");
    }
  }

  // advance to next track
  if (!head) {  // we were on side 0
    head = 1;   // go to side 1
  } else {      // we were on side 1?
    track = (track + 1) % mfm_floppy.tracks_per_side(); // next track!
    head = 0;   // and side 0
  }
  
  delay(1000);
}