void datacrcerror8271() { i8271.result = 0x0E; i8271.status = 0x18; NMI8271(); fdctime = 0; setspindown8271(); // printf("CRCdat 8271\n"); }
void headercrcerror8271() { i8271.result = 0x0C; i8271.status = 0x18; NMI8271(); fdctime = 0; setspindown8271(); // printf("CRChead 8271\n"); }
void notfound8271() { i8271.result = 0x18; i8271.status = 0x18; NMI8271(); fdctime = 0; setspindown8271(); // printf("Not found 8271\n"); }
void callback8271() { int diff=i8271.params[0]-i8271.curtrack[curdrive]; fdctime=0; // printf("Callback 8271 - command %02X\n",i8271.command); switch (i8271.command) { case 0x0B: /*Write*/ if (!i8271.phase) { i8271.curtrack[curdrive]=i8271.params[0]; disc_writesector(curdrive,i8271.cursector,i8271.params[0],(i8271.drvout&0x20)?1:0,0); i8271.phase=1; i8271.status=0x8C; i8271.result=0; NMI8271(); return; } i8271.sectorsleft--; if (!i8271.sectorsleft) { i8271.status=0x18; i8271.result=0; NMI8271(); setspindown8271(); verify8271=0; return; } i8271.cursector++; disc_writesector(curdrive,i8271.cursector,i8271.params[0],(i8271.drvout&0x20)?1:0,0); byte=0; i8271.status=0x8C; i8271.result=0; NMI8271(); break; case 0x13: /*Read*/ case 0x1F: /*Verify*/ if (!i8271.phase) { // printf("Seek to %i\n",i8271.params[0]); i8271.curtrack[curdrive]=i8271.params[0]; // i8271.realtrack+=diff; // disc_seek(0,i8271.realtrack); // printf("Re-seeking - track now %i %i\n",i8271.curtrack,i8271.realtrack); disc_readsector(curdrive,i8271.cursector,i8271.params[0],(i8271.drvout&0x20)?1:0,0); i8271.phase=1; return; } i8271.sectorsleft--; if (!i8271.sectorsleft) { i8271.status=0x18; i8271.result=0; NMI8271(); setspindown8271(); verify8271=0; return; } i8271.cursector++; disc_readsector(curdrive,i8271.cursector,i8271.params[0],(i8271.drvout&0x20)?1:0,0); byte=0; break; case 0x1B: /*Read ID*/ // printf("Read ID callback %i\n",i8271.phase); if (!i8271.phase) { i8271.curtrack[curdrive]=i8271.params[0]; // i8271.realtrack+=diff; // disc_seek(0,i8271.realtrack); disc_readaddress(curdrive,i8271.params[0],(i8271.drvout&0x20)?1:0,0); i8271.phase=1; return; } // printf("Read ID track %i %i\n",i8271.params[0],i8271.sectorsleft); i8271.sectorsleft--; if (!i8271.sectorsleft) { i8271.status=0x18; i8271.result=0; NMI8271(); // printf("8271 : ID read done!\n"); setspindown8271(); return; } i8271.cursector++; disc_readaddress(curdrive,i8271.params[0],(i8271.drvout&0x20)?1:0,0); byte=0; break; case 0x23: /*Format*/ if (!i8271.phase) { i8271.curtrack[curdrive]=i8271.params[0]; disc_writesector(curdrive,i8271.cursector,i8271.params[0],(i8271.drvout&0x20)?1:0,0); i8271.phase=1; i8271.status=0x8C; i8271.result=0; NMI8271(); return; } if (i8271.phase==2) { i8271.status=0x18; i8271.result=0; NMI8271(); setspindown8271(); verify8271=0; return; } disc_format(curdrive,i8271.params[0],(i8271.drvout&0x20)?1:0,0); i8271.phase=2; break; case 0x29: /*Seek*/ i8271.curtrack[curdrive]=i8271.params[0]; // i8271.realtrack+=diff; i8271.status=0x18; i8271.result=0; NMI8271(); // disc_seek(0,i8271.realtrack); // printf("Seek done!\n"); setspindown8271(); break; case 0xFF: break; default: break; printf("Unknown 8271 command %02X 3\n",i8271.command); dumpregs(); exit(-1); } }