diff options
author | cracyc <cracyc@users.noreply.github.com> | 2022-06-21 15:12:53 -0500 |
---|---|---|
committer | cracyc <cracyc@users.noreply.github.com> | 2022-06-21 15:12:53 -0500 |
commit | 61b9ae3a5b4386a1525c79208be7304fad9f05ee (patch) | |
tree | 2e79565cd9689bf73440ea0a129f4ab64a090622 /src/devices/machine | |
parent | 89d81a5b5163d4ee4fc3f6fc0cc469e066611b13 (diff) |
pwrview: fdc work
upd765: fix command decoding
Diffstat (limited to 'src/devices/machine')
-rw-r--r-- | src/devices/machine/upd765.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp index b65afca6de1..39e0a402fd6 100644 --- a/src/devices/machine/upd765.cpp +++ b/src/devices/machine/upd765.cpp @@ -1325,17 +1325,31 @@ int upd765_family_device::check_command() // MSDOS 6.22 format uses 0xcd to format a track, which makes one // think only the bottom 5 bits are decoded. + // The real 765 completely decodes the commands that don't have + // variable upper bits. Some later superio chips don't. + // The MCS Powerview depends on this. - switch(command[0] & 0x1f) { - case 0x02: - return command_pos == 9 ? C_READ_TRACK : C_INCOMPLETE; - + switch(command[0]) { case 0x03: return command_pos == 3 ? C_SPECIFY : C_INCOMPLETE; case 0x04: return command_pos == 2 ? C_SENSE_DRIVE_STATUS : C_INCOMPLETE; + case 0x07: + return command_pos == 2 ? C_RECALIBRATE : C_INCOMPLETE; + + case 0x08: + return C_SENSE_INTERRUPT_STATUS; + + case 0x0f: + return command_pos == 3 ? C_SEEK : C_INCOMPLETE; + } + + switch(command[0] & 0x1f) { + case 0x02: + return command_pos == 9 ? C_READ_TRACK : C_INCOMPLETE; + case 0x05: case 0x09: return command_pos == 9 ? C_WRITE_DATA : C_INCOMPLETE; @@ -1344,21 +1358,12 @@ int upd765_family_device::check_command() case 0x0c: return command_pos == 9 ? C_READ_DATA : C_INCOMPLETE; - case 0x07: - return command_pos == 2 ? C_RECALIBRATE : C_INCOMPLETE; - - case 0x08: - return C_SENSE_INTERRUPT_STATUS; - case 0x0a: return command_pos == 2 ? C_READ_ID : C_INCOMPLETE; case 0x0d: return command_pos == 6 ? C_FORMAT_TRACK : C_INCOMPLETE; - case 0x0f: - return command_pos == 3 ? C_SEEK : C_INCOMPLETE; - case 0x11: return command_pos == 9 ? C_SCAN_EQUAL : C_INCOMPLETE; |