Lines Matching refs:drive

57 void set_diskette_current_cyl(uint8_t drive, uint8_t cyl)
59 if (drive > 1)
60 BX_PANIC("set_diskette_current_cyl: drive > 1\n");
61 write_byte(0x0040, 0x0094+drive, cyl);
139 void floppy_prepare_controller(uint16_t drive)
148 // turn on motor of selected drive, DMA & int enabled, normal operation
150 if (drive)
155 dor |= drive;
166 // wait for drive readiness
188 bx_bool floppy_media_known(uint16_t drive)
194 if (drive)
201 if (drive)
213 bx_bool floppy_read_id(uint16_t drive)
221 floppy_prepare_controller(drive);
225 outb(0x03f5, drive); // 0=drive0, 1=drive1, head always 0
254 bx_bool floppy_drive_recal(uint16_t drive)
259 floppy_prepare_controller(drive);
263 outb(0x03f5, drive); // 0=drive0, 1=drive1
286 if (drive) {
300 bx_bool floppy_media_sense(uint16_t drive)
306 if (floppy_drive_recal(drive) == 0)
318 // 5-4 last diskette drive step rate selected
324 // Bitfields for diskette drive media state:
330 // 3 drive capable of supporting 4MB media
341 // @todo: break out drive type determination
343 if (drive == 0)
348 // 360K 5.25" drive
354 // 1.2 MB 5.25" drive
360 // 720K 3.5" drive
366 // 1.44 MB 3.5" drive
372 // 2.88 MB 3.5" drive
392 while (!floppy_read_id(drive)) {
411 if (drive == 0)
422 bx_bool floppy_drive_exists(uint16_t drive)
426 // check CMOS to see if drive exists
427 // @todo: break out drive type determination
429 if (drive == 0)
451 uint8_t drive, num_sectors, track, sector, head;
466 drive = GET_ELDL();
467 if (drive > 1) {
473 // @todo: break out drive type determination
475 if (drive == 0)
480 SET_AH(0x80); // drive not responding
492 set_diskette_current_cyl(drive, 0); // current cylinder
511 drive = GET_ELDL();
513 if ( (drive > 1) || (head > 1) ||
515 BX_INFO("%s: drive>1 || head>1 ...\n", __func__);
523 // see if drive exists
524 if (floppy_drive_exists(drive) == 0) {
532 // see if media in drive, and type is known
533 if (floppy_media_known(drive) == 0) {
534 if (floppy_media_sense(drive) == 0) {
604 floppy_prepare_controller(drive);
608 outb(0x03f5, (head << 2) | drive); // HD DR1 DR2
626 SET_AH(0x80); // drive not ready (timeout)
648 SET_AH(0x80); // drive not ready (timeout)
679 set_diskette_current_cyl(drive, track);
741 floppy_prepare_controller(drive);
745 outb(0x03f5, (head << 2) | drive); // HD DR1 DR2
763 SET_AH(0x80); // drive not ready (timeout)
784 SET_AH(0x80); // drive not ready (timeout)
818 set_diskette_current_cyl(drive, track);
827 set_diskette_current_cyl(drive, track);
841 drive = GET_ELDL();
843 if ((drive > 1) || (head > 1) || (track > 79) ||
850 // see if drive exists
851 if (floppy_drive_exists(drive) == 0) {
852 SET_AH(0x80); // drive not responding
858 // see if media in drive, and type is known
859 if (floppy_media_known(drive) == 0) {
860 if (floppy_media_sense(drive) == 0) {
906 floppy_prepare_controller(drive);
910 outb(0x03f5, (head << 2) | drive); // HD DR1 DR2
915 outb(0x03f5, (head << 2) | drive); // HD DR1 DR2
930 SET_AH(0x80); // drive not ready (timeout)
950 SET_AH(0x80); // drive not ready (timeout)
983 set_diskette_current_cyl(drive, 0);
988 case 0x08: // read diskette drive parameters
990 drive = GET_ELDL();
992 if (drive > 1) {
1004 // @todo: break out drive type determination
1012 if (drive == 0)
1070 case 0x15: // read diskette drive type
1072 drive = GET_ELDL();
1073 if (drive > 1) {
1079 // @todo: break out drive type determination
1081 if (drive == 0)
1087 SET_AH(0); // drive not present
1089 SET_AH(2); // drive present, supports change line
1091 SET_AH(1); // drive present, does not support change line
1098 drive = GET_ELDL();
1099 if (drive > 1) {
1100 SET_AH(0x01); // invalid drive
1115 drive = GET_ELDL();
1125 BX_DEBUG_INT13_FL("floppy f17 - drive: %d, format type: %d\n", drive, val8);
1127 if (drive > 1) {
1128 SET_AH(0x01); // invalid drive
1134 // see if drive exists
1135 if (floppy_drive_exists(drive) == 0) {
1142 // Get current drive state. Set 'base_address' to media status offset address
1143 base_address = (drive) ? 0x0091 : 0x0090;
1151 // 360K media in 360K drive
1155 // 360K media in 1.2M drive
1159 // 1.2M media in 1.2M drive
1163 // 720K media in 720K drive
1189 drive = GET_ELDL();
1195 BX_DEBUG_INT13_FL("floppy f18 - drive: %d, max cylinder/track number: %d, sectors-per-tracks: %d\n",
1196 drive, track, num_sectors);
1198 if (drive > 1) {
1199 SET_AH(0x01); // invalid drive
1205 // see if drive exists
1206 if (floppy_drive_exists(drive) == 0) {
1213 // see if media in drive, and media type is known
1214 if (floppy_media_known(drive) == 0) {
1215 if (floppy_media_sense(drive) == 0) {
1216 SET_AH(0x0C); // drive/media type unknown
1223 // @todo: break out drive type determination
1225 if (drive == 0)
1230 // Get current drive state. Set 'base_address' to media status offset address
1231 base_address = (drive) ? 0x0091 : 0x0090;
1244 if (track == 39 && num_sectors == 9) { // 360K disk in 1.2M drive
1246 } else if (track == 79 && num_sectors == 15) { // 1.2M disk in 1.2M drive
1257 if (num_sectors == 9) { // 720K disk in 1.44M drive
1259 } else if (num_sectors == 18) { // 1.44M disk in 1.44M drive
1266 if (num_sectors == 9) { // 720K disk in 2.88M drive
1268 } else if (num_sectors == 18) { // 1.44M disk in 2.88M drive
1270 } else if (num_sectors == 36) { // 2.88M disk in 2.88M drive
1282 // for current drive type - or drive type is unknown!
1341 void determine_floppy_media(uint16_t drive)
1346 if (drive==1)
1352 if (drive == 0) {
1353 DOR = 0x1c; // DOR: drive0 motor on, DMA&int enabled, normal op, drive select 0
1356 DOR = 0x2d; // DOR: drive1 motor on, DMA&int enabled, normal op, drive select 1
1361 // Drive not determined means no drive exists, done.
1375 // turn on drive motor