@@ -93,11 +93,12 @@ typedef union {
9393typedef struct {
9494 UNIT * uptr ;
9595 DISK_INFO * imd ;
96- uint8 ntracks ; /* number of tracks */
97- uint8 nheads ; /* number of heads */
98- uint32 sectsize ; /* sector size, not including pre/postamble */
99- uint8 track ; /* Current Track */
100- uint8 ready ; /* Is drive ready? */
96+ uint8 ntracks ; /* number of tracks */
97+ uint8 nheads ; /* number of heads */
98+ uint32 sectsize ; /* sector size, not including pre/postamble */
99+ uint8 track ; /* Current Track */
100+ uint8 ready ; /* Is drive ready? */
101+ int rpm ; /* Drive RPM */
101102} WD179X_DRIVE_INFO ;
102103
103104typedef struct {
@@ -338,6 +339,14 @@ static t_stat wd179x_reset(DEVICE *dptr)
338339 return SCPE_OK ;
339340}
340341
342+ void wd179x_set_rpm (int rpm )
343+ {
344+ if (wd179x_info -> sel_drive > WD179X_MAX_DRIVES ) {
345+ return ;
346+ }
347+ wd179x_info -> drive [wd179x_info -> sel_drive & 3 ].rpm = rpm ;
348+ }
349+
341350void wd179x_connect_external_fifo (uint16 fifo_len , uint8 * storage )
342351{
343352 wd179x_info -> external_fifo_len = fifo_len ;
@@ -1210,11 +1219,24 @@ static uint8 Do1793Command(uint8 cCommand)
12101219 if (cCommand & 0x04 ) {
12111220 wd179x_info -> index_pulse_wait = TRUE;
12121221 if (wd179x_info -> sel_drive < WD179X_MAX_DRIVES ) {
1213- if (pDrive -> uptr -> u3 == IMAGE_TYPE_IMD ) {
1214- sim_activate (wd179x_unit , ((wd179x_info -> drive [wd179x_info -> sel_drive ].imd -> ntracks % 77 ) == 0 ) ? CROMFDC_8IN_ROT : CROMFDC_5IN_ROT ); /* Generate INDEX pulse */
1215- } else {
1216- sim_activate (wd179x_unit , CROMFDC_8IN_ROT ); /* Generate INDEX pulse */
1222+ int rot = 0 ;
1223+
1224+ switch (pDrive -> rpm ) {
1225+ case 300 :
1226+ rot = CROMFDC_5IN_ROT ;
1227+ break ;
1228+ case 360 :
1229+ rot = CROMFDC_8IN_ROT ;
1230+ break ;
1231+ default : /* RPM not set, infer from the disk image, if possible. */
1232+ if (pDrive -> uptr -> u3 == IMAGE_TYPE_IMD ) {
1233+ rot = ((wd179x_info -> drive [wd179x_info -> sel_drive ].imd -> ntracks % 77 ) == 0 ) ? CROMFDC_8IN_ROT : CROMFDC_5IN_ROT ;
1234+ }
1235+ else {
1236+ rot = CROMFDC_8IN_ROT ;
1237+ }
12171238 }
1239+ sim_activate (wd179x_unit , rot ); /* Generate INDEX pulse */
12181240 }
12191241 } else {
12201242 wd179x_info -> intrq = 1 ;
0 commit comments