#include #include // Set this to whatever your parallel port's IO address is #define PORTADDRESS 0x378 #define DATA PORTADDRESS+0 #define STATUS PORTADDRESS+1 #define CONTROL PORTADDRESS+2 // This is how the physical connection is made #define DRIVE_TRACK0 // LPT pin 1 <- floppy pin 26 #define DRIVE_SELECT 1 // LPT pin 2 -> floppy pin 14 #define DRIVE_MOTOR 2 // LPT pin 3 -> floppy pin 10 #define DRIVE_DIR 4 // LPT pin 4 -> floppy pin 18 #define DRIVE_STEP 8 // LPT pin 5 -> floppy pin 20 #define DRIVE_WRITE 16 // LPT pin 6 -> floppy pin 24 #define DRIVE_HEAD 32 // LPT pin 7 -> floppy pin 32 typedef short (_stdcall *inpfuncPtr)(short portaddr); typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum); inpfuncPtr inp32fp; oupfuncPtr oup32fp; short Inp32 (short portaddr) { return (inp32fp)(portaddr); } void Out32 (short portaddr, short datum) { (oup32fp)(portaddr,datum); } int InitIOLibrary() { HINSTANCE hLib; hLib = LoadLibrary("inpout32.dll"); if (hLib == NULL) { fprintf(stderr,"LoadLibrary Failed.\n"); return -1; } inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32"); if (inp32fp == NULL) { fprintf(stderr,"GetProcAddress for Inp32 Failed.\n"); return -1; } oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32"); if (oup32fp == NULL) { fprintf(stderr,"GetProcAddress for Oup32 Failed.\n"); return -1; } } int main(int ARGC, char** ARGV) { int n; if (!InitIOLibrary()) { printf("Failed to initialize port I/O library\n"); return -1; } Out32(DATA, 0xFF); // Select drive Out32(DATA, ~DRIVE_SELECT); Sleep(100); // Activate motor Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR)); Sleep(100); // Seek to track 0 while (!(Inp32(CONTROL) & 1)) { Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | !DRIVE_DIR | DRIVE_STEP)); Sleep(1); Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | !DRIVE_DIR)); Sleep(1); } Sleep(100); // Erase tracks for (n = 0; n < 80; n++) { // Activate write line, for a little longer than one rotation of the disk Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | DRIVE_WRITE)); Sleep(250); Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR)); Sleep(1); // Now clear other side of track Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | DRIVE_WRITE | DRIVE_HEAD)); Sleep(250); Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR)); Sleep(1); // Then step to next track Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | DRIVE_DIR | DRIVE_STEP)); Sleep(1); Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | DRIVE_DIR)); Sleep(1); } Sleep(100); // Seek back to track 0 while (!(Inp32(CONTROL) & 1)) { Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | !DRIVE_DIR | DRIVE_STEP)); Sleep(1); Out32(DATA, ~(DRIVE_SELECT | DRIVE_MOTOR | !DRIVE_DIR)); Sleep(1); } Sleep(100); // Unselect drive Out32(DATA, 0xFF); return 0; }