src/mess/machine/c2040.c
| r7259 | r7260 | |
| 11 | 11 | |
| 12 | 12 | TODO: |
| 13 | 13 | |
| 14 | | - 8050 e27 |
| 15 | | - save state |
| 14 | - 8050 illegal track or sector 0,255 |
| 15 | - 4040 bumps head before reading directory |
| 16 | - Micropolis 8x50 stepper motor is same as 4040, except it takes 4 pulses to step a track instead of 1 |
| 17 | - save states |
| 16 | 18 | - remove via_pb_r |
| 17 | 19 | - write to disk |
| 18 | | - alloca buffers |
| 20 | - allocate buffers dynamically |
| 19 | 21 | - activity/error LEDs |
| 20 | 22 | |
| 21 | 23 | */ |
| r7259 | r7260 | |
| 64 | 66 | struct _c2040_unit_t |
| 65 | 67 | { |
| 66 | 68 | int stp; /* stepper motor phase */ |
| 69 | int mtr; /* spindle motor on */ |
| 67 | 70 | |
| 68 | 71 | /* track */ |
| 69 | 72 | UINT8 track_buffer[G64_BUFFER_SIZE]; /* track data buffer */ |
| r7259 | r7260 | |
| 211 | 214 | int ready = !(c2040->bit_count==9); |
| 212 | 215 | int error = !(ready | BIT(c2040->e, 3)); |
| 213 | 216 | |
| 214 | | logerror("d %u offs %04x/%04x G64 %02x READY %u PA %02x DATA %03x GCR %02x SYNC %u ERROR %u I %04x\n", c2040->drive, c2040->unit[c2040->drive].buffer_pos-1, c2040->unit[c2040->drive].track_len, |
| 217 | logerror("d %u offs %04x/%04x G64 %02x READY %u PA %02x DATA %03x GCR %02x SYNC %u ERROR %u I %04x\n", c2040->drive, c2040->unit[c2040->drive].buffer_pos, c2040->unit[c2040->drive].track_len, |
| 215 | 218 | c2040->unit[c2040->drive].track_buffer[c2040->unit[c2040->drive].buffer_pos], |
| 216 | 219 | ready, pa, c2040->sr & 0x3ff, c2040->e, SYNC, error, c2040->i); |
| 217 | 220 | } |
| r7259 | r7260 | |
| 247 | 250 | c2040->unit[c2040->drive].bit_pos = 7; |
| 248 | 251 | c2040->unit[c2040->drive].buffer_pos++; |
| 249 | 252 | |
| 250 | | if (c2040->unit[c2040->drive].buffer_pos == c2040->unit[c2040->drive].track_len + 2) |
| 253 | if (c2040->unit[c2040->drive].buffer_pos >= c2040->unit[c2040->drive].track_len) |
| 251 | 254 | { |
| 252 | 255 | /* loop to the start of the track */ |
| 253 | 256 | c2040->unit[c2040->drive].buffer_pos = G64_DATA_START; |
| r7259 | r7260 | |
| 271 | 274 | { |
| 272 | 275 | /* set byte ready flag */ |
| 273 | 276 | c2040->ready = ready; |
| 274 | | } |
| 275 | 277 | |
| 276 | | if ((device->type == C8050) || (device->type == C8250) || (device->type == SFD1001)) |
| 277 | | { |
| 278 | | cpu_set_input_line(c2040->cpu_fdc, M6502_SET_OVERFLOW, ready); |
| 278 | via_ca1_w(c2040->via, ready); |
| 279 | via_cb1_w(c2040->via, ERROR); |
| 280 | |
| 281 | if ((device->type == C8050) || (device->type == C8250) || (device->type == SFD1001)) |
| 282 | { |
| 283 | cpu_set_input_line(c2040->cpu_fdc, M6502_SET_OVERFLOW, ready ? CLEAR_LINE : ASSERT_LINE); |
| 284 | } |
| 279 | 285 | } |
| 280 | | |
| 281 | | via_ca1_w(c2040->via, ready); |
| 282 | | via_cb1_w(c2040->via, ERROR); |
| 283 | 286 | } |
| 284 | 287 | |
| 285 | 288 | /*------------------------------------------------- |
| r7259 | r7260 | |
| 660 | 663 | c2040->unit[unit].track_len = G64_DATA_START + ((c2040->unit[unit].track_buffer[1] << 8) | c2040->unit[unit].track_buffer[0]); |
| 661 | 664 | } |
| 662 | 665 | |
| 663 | | static void step_motor(c2040_t *c2040, int unit, int stp) |
| 666 | static void spindle_motor(c2040_t *c2040, int unit, int mtr) |
| 664 | 667 | { |
| 668 | if (c2040->unit[unit].mtr != mtr) |
| 669 | { |
| 670 | if (mtr) |
| 671 | { |
| 672 | /* read track data */ |
| 673 | read_current_track(c2040, unit); |
| 674 | } |
| 675 | |
| 676 | floppy_mon_w(c2040->unit[unit].image, !mtr); |
| 677 | |
| 678 | c2040->unit[unit].mtr = mtr; |
| 679 | } |
| 680 | } |
| 681 | |
| 682 | static void micropolis_step_motor(c2040_t *c2040, int unit, int stp) |
| 683 | { |
| 665 | 684 | if (c2040->unit[unit].stp != stp) |
| 666 | 685 | { |
| 667 | 686 | int tracks = 0; |
| r7259 | r7260 | |
| 754 | 773 | |
| 755 | 774 | /* stepper motor 1 */ |
| 756 | 775 | int s1 = data & 0x03; |
| 757 | | step_motor(c2040, 1, s1); |
| 776 | micropolis_step_motor(c2040, 1, s1); |
| 758 | 777 | |
| 759 | 778 | /* stepper motor 0 */ |
| 760 | 779 | int s0 = (data >> 2) & 0x03; |
| 761 | | step_motor(c2040, 0, s0); |
| 780 | micropolis_step_motor(c2040, 0, s0); |
| 762 | 781 | |
| 763 | 782 | /* spindle motor 1 */ |
| 764 | 783 | int mtr1 = BIT(data, 4); |
| 765 | | floppy_mon_w(c2040->unit[1].image, !mtr1); |
| 784 | spindle_motor(c2040, 1, mtr1); |
| 766 | 785 | |
| 767 | 786 | /* spindle motor 0 */ |
| 768 | 787 | int mtr0 = BIT(data, 5); |
| 769 | | floppy_mon_w(c2040->unit[0].image, !mtr0); |
| 788 | spindle_motor(c2040, 0, mtr0); |
| 770 | 789 | |
| 771 | 790 | timer_enable(c2040->bit_timer, mtr1 | mtr0); |
| 772 | 791 | } |
| r7259 | r7260 | |
| 830 | 849 | via6522_interface c8050_via_intf um3 |
| 831 | 850 | -------------------------------------------------*/ |
| 832 | 851 | |
| 833 | | static void c8050_step_motor(c2040_t *c2040, int unit, int stp) |
| 852 | static void mpi_step_motor(c2040_t *c2040, int unit, int mtr, int stp) |
| 834 | 853 | { |
| 835 | | if (c2040->unit[unit].stp != stp) |
| 854 | if (!mtr && (c2040->unit[unit].stp != stp)) |
| 836 | 855 | { |
| 837 | 856 | int tracks = 0; |
| 838 | 857 | |
| r7259 | r7260 | |
| 903 | 922 | |
| 904 | 923 | c2040_t *c2040 = get_safe_token(device->owner); |
| 905 | 924 | |
| 925 | /* spindle motor 1 */ |
| 926 | int mtr1 = BIT(data, 4); |
| 927 | spindle_motor(c2040, 1, mtr1); |
| 928 | |
| 929 | /* spindle motor 0 */ |
| 930 | int mtr0 = BIT(data, 5); |
| 931 | spindle_motor(c2040, 0, mtr0); |
| 932 | |
| 906 | 933 | /* stepper motor 1 */ |
| 907 | 934 | int s1 = data & 0x03; |
| 908 | | c8050_step_motor(c2040, 1, s1); |
| 935 | mpi_step_motor(c2040, 0, mtr1, s1); |
| 909 | 936 | |
| 910 | 937 | /* stepper motor 0 */ |
| 911 | 938 | int s0 = (data >> 2) & 0x03; |
| 912 | | c8050_step_motor(c2040, 0, s0); |
| 939 | mpi_step_motor(c2040, 0, mtr0, s0); |
| 913 | 940 | |
| 914 | | /* spindle motor 1 */ |
| 915 | | int mtr1 = BIT(data, 4); |
| 916 | | floppy_mon_w(c2040->unit[1].image, !mtr1); |
| 917 | | |
| 918 | | /* spindle motor 0 */ |
| 919 | | int mtr0 = BIT(data, 5); |
| 920 | | floppy_mon_w(c2040->unit[0].image, !mtr0); |
| 921 | | |
| 922 | 941 | timer_enable(c2040->bit_timer, mtr1 | mtr0); |
| 923 | 942 | |
| 924 | 943 | /* TODO pull sync */ |
| r7259 | r7260 | |
| 1082 | 1101 | PB1 DS0 |
| 1083 | 1102 | PB2 DS1 |
| 1084 | 1103 | PB3 WPS |
| 1085 | | PB4 ODD HD, SIDE SELECT (0=78-154, 1=1-77) |
| 1104 | PB4 DRIVE TYPE (0=2A, 1=2C) |
| 1086 | 1105 | PB5 |
| 1087 | 1106 | PB6 (0=DS, 1=SS) |
| 1088 | 1107 | PB7 M6504 IRQ |
| r7259 | r7260 | |
| 1096 | 1115 | /* write protect sense */ |
| 1097 | 1116 | data |= floppy_wpt_r(c2040->unit[c2040->drive].image) << 3; |
| 1098 | 1117 | |
| 1118 | /* drive type */ |
| 1119 | data |= 0x10; |
| 1120 | |
| 1099 | 1121 | /* single/dual sided */ |
| 1100 | 1122 | data |= (device->type == C8050) << 6; |
| 1101 | 1123 | |
| r7259 | r7260 | |
| 1112 | 1134 | PB1 DS0 |
| 1113 | 1135 | PB2 DS1 |
| 1114 | 1136 | PB3 WPS |
| 1115 | | PB4 ODD HD, SIDE SELECT (0=78-154, 1=1-77) |
| 1137 | PB4 ODD HD (0=78-154, 1=1-77) |
| 1116 | 1138 | PB5 |
| 1117 | 1139 | PB6 (0=DS, 1=SS) |
| 1118 | 1140 | PB7 M6504 IRQ |
| r7259 | r7260 | |
| 1124 | 1146 | /* drive select */ |
| 1125 | 1147 | if ((device->type == C8050) || (device->type == C8250)) |
| 1126 | 1148 | { |
| 1127 | | //TODO c2040->drive = BIT(newdata, 0); |
| 1149 | c2040->drive = BIT(newdata, 0); |
| 1128 | 1150 | } |
| 1129 | 1151 | |
| 1130 | 1152 | /* density select */ |
| r7259 | r7260 | |
| 1430 | 1452 | ROM_LOAD( "901482-03.ul1", 0x0000, 0x2000, CRC(09a609b9) SHA1(166d8bfaaa9c4767f9b17ad63fc7ae77c199a64e) ) |
| 1431 | 1453 | ROM_LOAD( "901482-04.uh1", 0x2000, 0x2000, CRC(1bcf9df9) SHA1(217f4a8b348658bb365f4a1de21ecbaa6402b1c0) ) |
| 1432 | 1454 | /* 2364-091 ROM DOS 2.5 rev */ |
| 1433 | | ROM_LOAD( "901482-07.ul1", 0x0000, 0x2000, CRC(c7532d90) SHA1(0b6d1e55afea612516df5f07f4a6dccd3bd73963) ) |
| 1434 | | ROM_LOAD( "901482-06.uh1", 0x2000, 0x2000, CRC(3cbd2756) SHA1(7f5fbed0cddb95138dd99b8fe84fddab900e3650) ) |
| 1455 | ROM_LOAD( "901482-06.ul1", 0x0000, 0x2000, CRC(3cbd2756) SHA1(7f5fbed0cddb95138dd99b8fe84fddab900e3650) ) |
| 1456 | ROM_LOAD( "901482-07.uh1", 0x2000, 0x2000, CRC(c7532d90) SHA1(0b6d1e55afea612516df5f07f4a6dccd3bd73963) ) |
| 1435 | 1457 | /* 2364 ROM DOS 2.7 */ |
| 1436 | 1458 | ROM_LOAD( "901887-01.ul1", 0x0000, 0x2000, CRC(0073b8b2) SHA1(b10603195f240118fe5fb6c6dfe5c5097463d890) ) |
| 1437 | 1459 | ROM_LOAD( "901888-01.uh1", 0x2000, 0x2000, CRC(de9b6132) SHA1(2e6c2d7ca934e5c550ad14bd5e9e7749686b7af4) ) |