src/mess/machine/c1541.c
| r7260 | r7261 | |
| 165 | 165 | typedef struct _c1541_t c1541_t; |
| 166 | 166 | struct _c1541_t |
| 167 | 167 | { |
| 168 | | /* abstractions */ |
| 169 | | int address; /* serial bus address - 8 */ |
| 170 | | UINT8 track_buffer[G64_BUFFER_SIZE]; /* track data buffer */ |
| 171 | | int track_len; /* track length */ |
| 172 | | int buffer_pos; /* current byte position within track buffer */ |
| 173 | | int bit_pos; /* current bit position within track buffer byte */ |
| 174 | | int bit_count; /* current data byte bit counter */ |
| 175 | | UINT16 data; /* data shift register */ |
| 168 | /* IEC bus */ |
| 169 | int address; /* device address - 8 */ |
| 170 | int atna; /* attention acknowledge */ |
| 171 | int data_out; /* serial bus data output */ |
| 176 | 172 | |
| 173 | /* IEEE-488 bus */ |
| 174 | int nrfd_out; /* not ready for data */ |
| 175 | int ndac_out; /* not data accepted */ |
| 176 | |
| 177 | /* motors */ |
| 178 | int stp; /* stepper motor phase */ |
| 179 | int mtr; /* spindle motor on */ |
| 180 | |
| 181 | /* track */ |
| 182 | UINT8 track_buffer[G64_BUFFER_SIZE]; /* track data buffer */ |
| 183 | int track_len; /* track length */ |
| 184 | int buffer_pos; /* current byte position within track buffer */ |
| 185 | int bit_pos; /* current bit position within track buffer byte */ |
| 186 | int bit_count; /* current data byte bit counter */ |
| 187 | UINT16 data; /* data shift register */ |
| 188 | UINT8 yb; /* GCR data byte to write */ |
| 189 | |
| 177 | 190 | /* signals */ |
| 178 | | UINT8 yb; /* GCR data byte to write */ |
| 179 | | int byte; /* byte ready */ |
| 180 | | int atna; /* attention acknowledge */ |
| 181 | | int ds; /* density select */ |
| 182 | | int stp; /* stepping motor */ |
| 183 | | int soe; /* s? output enable */ |
| 184 | | int mode; /* mode (0 = write, 1 = read) */ |
| 185 | | int via0_irq; /* VIA #0 interrupt request */ |
| 186 | | int via1_irq; /* VIA #1 interrupt request */ |
| 191 | int ds; /* density select */ |
| 192 | int soe; /* s? output enable */ |
| 193 | int byte; /* byte ready */ |
| 194 | int mode; /* mode (0 = write, 1 = read) */ |
| 187 | 195 | |
| 188 | | /* serial bus */ |
| 189 | | int data_out; /* serial bus data output */ |
| 196 | /* interrupts */ |
| 197 | int via0_irq; /* VIA #0 interrupt request */ |
| 198 | int via1_irq; /* VIA #1 interrupt request */ |
| 190 | 199 | |
| 191 | | /* IEEE-488 bus */ |
| 192 | | int nrfd_out; /* not ready for data */ |
| 193 | | int ndac_out; /* not data accepted */ |
| 194 | | |
| 195 | 200 | /* devices */ |
| 196 | 201 | running_device *cpu; |
| 197 | 202 | running_device *via0; |
| r7260 | r7261 | |
| 732 | 737 | via6522_interface c1541_via1_intf |
| 733 | 738 | -------------------------------------------------*/ |
| 734 | 739 | |
| 740 | static void read_current_track(c1541_t *c1541) |
| 741 | { |
| 742 | c1541->track_len = G64_BUFFER_SIZE; |
| 743 | c1541->buffer_pos = G64_DATA_START; |
| 744 | c1541->bit_pos = 7; |
| 745 | c1541->bit_count = 0; |
| 746 | |
| 747 | /* read track data */ |
| 748 | floppy_drive_read_track_data_info_buffer(c1541->image, 0, c1541->track_buffer, &c1541->track_len); |
| 749 | |
| 750 | /* extract track length */ |
| 751 | c1541->track_len = G64_DATA_START + ((c1541->track_buffer[1] << 8) | c1541->track_buffer[0]); |
| 752 | } |
| 753 | |
| 754 | static void spindle_motor(c1541_t *c1541, int mtr) |
| 755 | { |
| 756 | if (c1541->mtr != mtr) |
| 757 | { |
| 758 | if (mtr) |
| 759 | { |
| 760 | /* read track data */ |
| 761 | read_current_track(c1541); |
| 762 | } |
| 763 | |
| 764 | floppy_mon_w(c1541->image, !mtr); |
| 765 | timer_enable(c1541->bit_timer, mtr); |
| 766 | |
| 767 | c1541->mtr = mtr; |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | static void step_motor(c1541_t *c1541, int stp) |
| 772 | { |
| 773 | if (c1541->stp != stp) |
| 774 | { |
| 775 | int tracks = 0; |
| 776 | |
| 777 | switch (c1541->stp) |
| 778 | { |
| 779 | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 780 | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 781 | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 782 | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 783 | } |
| 784 | |
| 785 | if (tracks != 0) |
| 786 | { |
| 787 | /* step read/write head */ |
| 788 | floppy_drive_seek(c1541->image, tracks); |
| 789 | |
| 790 | /* read new track data */ |
| 791 | read_current_track(c1541); |
| 792 | } |
| 793 | |
| 794 | c1541->stp = stp; |
| 795 | } |
| 796 | } |
| 797 | |
| 735 | 798 | static WRITE_LINE_DEVICE_HANDLER( via1_irq_w ) |
| 736 | 799 | { |
| 737 | 800 | c1541_t *c1541 = get_safe_token(device->owner); |
| r7260 | r7261 | |
| 833 | 896 | |
| 834 | 897 | c1541_t *c1541 = get_safe_token(device->owner); |
| 835 | 898 | |
| 899 | /* stepper motor */ |
| 836 | 900 | int stp = data & 0x03; |
| 837 | | int ds = (data >> 5) & 0x03; |
| 838 | | int mtr = BIT(data, 2); |
| 901 | step_motor(c1541, stp); |
| 839 | 902 | |
| 840 | | /* stepper motor */ |
| 841 | | if (c1541->stp != stp) |
| 842 | | { |
| 843 | | int tracks = 0; |
| 844 | | |
| 845 | | switch (c1541->stp) |
| 846 | | { |
| 847 | | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 848 | | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 849 | | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 850 | | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 851 | | } |
| 852 | | |
| 853 | | if (tracks != 0) |
| 854 | | { |
| 855 | | c1541->track_len = G64_BUFFER_SIZE; |
| 856 | | c1541->buffer_pos = G64_DATA_START; |
| 857 | | c1541->bit_pos = 7; |
| 858 | | c1541->bit_count = 0; |
| 859 | | |
| 860 | | /* step read/write head */ |
| 861 | | floppy_drive_seek(c1541->image, tracks); |
| 862 | | |
| 863 | | /* read track data */ |
| 864 | | floppy_drive_read_track_data_info_buffer(c1541->image, 0, c1541->track_buffer, &c1541->track_len); |
| 865 | | |
| 866 | | /* extract track length */ |
| 867 | | c1541->track_len = G64_DATA_START + ((c1541->track_buffer[1] << 8) | c1541->track_buffer[0]); |
| 868 | | } |
| 869 | | |
| 870 | | c1541->stp = stp; |
| 871 | | } |
| 872 | | |
| 873 | 903 | /* spindle motor */ |
| 874 | | floppy_mon_w(c1541->image, !mtr); |
| 875 | | timer_enable(c1541->bit_timer, mtr); |
| 904 | int mtr = BIT(data, 2); |
| 905 | spindle_motor(c1541, mtr); |
| 876 | 906 | |
| 877 | 907 | /* activity LED */ |
| 878 | 908 | |
| 879 | 909 | /* density select */ |
| 910 | int ds = (data >> 5) & 0x03; |
| 911 | |
| 880 | 912 | if (c1541->ds != ds) |
| 881 | 913 | { |
| 882 | 914 | timer_adjust_periodic(c1541->bit_timer, attotime_zero, 0, ATTOTIME_IN_HZ(C2040_BITRATE[ds]/4)); |
src/mess/machine/c1551.c
| r7260 | r7261 | |
| 44 | 44 | typedef struct _c1551_t c1551_t; |
| 45 | 45 | struct _c1551_t |
| 46 | 46 | { |
| 47 | | UINT8 track_buffer[G64_BUFFER_SIZE]; /* track data buffer */ |
| 48 | | int track_len; /* track length */ |
| 49 | | int buffer_pos; /* current byte position within track buffer */ |
| 50 | | int bit_pos; /* current bit position within track buffer byte */ |
| 51 | | int bit_count; /* current data byte bit counter */ |
| 52 | | UINT16 data; /* data shift register */ |
| 47 | /* motors */ |
| 48 | int stp; /* stepper motor phase */ |
| 49 | int mtr; /* spindle motor on */ |
| 50 | |
| 51 | /* track */ |
| 52 | UINT8 track_buffer[G64_BUFFER_SIZE]; /* track data buffer */ |
| 53 | int track_len; /* track length */ |
| 54 | int buffer_pos; /* current byte position within track buffer */ |
| 55 | int bit_pos; /* current bit position within track buffer byte */ |
| 56 | int bit_count; /* current data byte bit counter */ |
| 57 | UINT16 data; /* data shift register */ |
| 58 | UINT8 yb; /* GCR data byte to write */ |
| 53 | 59 | |
| 54 | 60 | /* signals */ |
| 55 | | UINT8 yb; /* GCR data byte to write */ |
| 56 | | int byte; /* byte ready */ |
| 57 | | int atna; /* attention acknowledge */ |
| 58 | | int ds; /* density select */ |
| 59 | | int stp; /* stepping motor */ |
| 60 | | int soe; /* s? output enable */ |
| 61 | | int mode; /* mode (0 = write, 1 = read) */ |
| 61 | int ds; /* density select */ |
| 62 | int soe; /* s? output enable */ |
| 63 | int byte; /* byte ready */ |
| 64 | int mode; /* mode (0 = write, 1 = read) */ |
| 62 | 65 | |
| 63 | 66 | /* devices */ |
| 64 | 67 | running_device *cpu; |
| r7260 | r7261 | |
| 140 | 143 | c1551_port_r - M6510T port read |
| 141 | 144 | -------------------------------------------------*/ |
| 142 | 145 | |
| 146 | static void read_current_track(c1551_t *c1551) |
| 147 | { |
| 148 | c1551->track_len = G64_BUFFER_SIZE; |
| 149 | c1551->buffer_pos = G64_DATA_START; |
| 150 | c1551->bit_pos = 7; |
| 151 | c1551->bit_count = 0; |
| 152 | |
| 153 | /* read track data */ |
| 154 | floppy_drive_read_track_data_info_buffer(c1551->image, 0, c1551->track_buffer, &c1551->track_len); |
| 155 | |
| 156 | /* extract track length */ |
| 157 | c1551->track_len = G64_DATA_START + ((c1551->track_buffer[1] << 8) | c1551->track_buffer[0]); |
| 158 | } |
| 159 | |
| 160 | static void spindle_motor(c1551_t *c1551, int mtr) |
| 161 | { |
| 162 | if (c1551->mtr != mtr) |
| 163 | { |
| 164 | if (mtr) |
| 165 | { |
| 166 | /* read track data */ |
| 167 | read_current_track(c1551); |
| 168 | } |
| 169 | |
| 170 | floppy_mon_w(c1551->image, !mtr); |
| 171 | timer_enable(c1551->bit_timer, mtr); |
| 172 | |
| 173 | c1551->mtr = mtr; |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | static void step_motor(c1551_t *c1551, int stp) |
| 178 | { |
| 179 | if (c1551->stp != stp) |
| 180 | { |
| 181 | int tracks = 0; |
| 182 | |
| 183 | switch (c1551->stp) |
| 184 | { |
| 185 | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 186 | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 187 | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 188 | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 189 | } |
| 190 | |
| 191 | if (tracks != 0) |
| 192 | { |
| 193 | /* step read/write head */ |
| 194 | floppy_drive_seek(c1551->image, tracks); |
| 195 | |
| 196 | /* read new track data */ |
| 197 | read_current_track(c1551); |
| 198 | } |
| 199 | |
| 200 | c1551->stp = stp; |
| 201 | } |
| 202 | } |
| 203 | |
| 143 | 204 | static READ8_DEVICE_HANDLER( c1551_port_r ) |
| 144 | 205 | { |
| 145 | 206 | /* |
| 146 | 207 | |
| 147 | 208 | bit description |
| 148 | 209 | |
| 149 | | P0 STEP0 |
| 150 | | P1 STEP1 |
| 151 | | P2 MOTOR ON |
| 152 | | P3 ACT |
| 153 | | P4 WPRT |
| 210 | P0 STP0A |
| 211 | P1 STP0B |
| 212 | P2 MTR0 |
| 213 | P3 ACT0 |
| 214 | P4 WPS |
| 154 | 215 | P5 DS0 |
| 155 | 216 | P6 DS1 |
| 156 | | P7 BYTE READY |
| 217 | P7 BYTE LTCHED |
| 157 | 218 | |
| 158 | 219 | */ |
| 159 | 220 | |
| r7260 | r7261 | |
| 163 | 224 | /* write protect sense */ |
| 164 | 225 | data |= !floppy_wpt_r(c1551->image) << 4; |
| 165 | 226 | |
| 166 | | /* byte ready */ |
| 227 | /* byte latched */ |
| 167 | 228 | data |= !(c1551->soe && c1551->byte) << 7; |
| 168 | 229 | |
| 169 | 230 | return data; |
| r7260 | r7261 | |
| 179 | 240 | |
| 180 | 241 | bit description |
| 181 | 242 | |
| 182 | | P0 STEP0 |
| 183 | | P1 STEP1 |
| 184 | | P2 MOTOR ON |
| 185 | | P3 ACT |
| 186 | | P4 WPRT |
| 243 | P0 STP0A |
| 244 | P1 STP0B |
| 245 | P2 MTR0 |
| 246 | P3 ACT0 |
| 247 | P4 WPS |
| 187 | 248 | P5 DS0 |
| 188 | 249 | P6 DS1 |
| 189 | | P7 BYTE READY |
| 250 | P7 BYTE LTCHED |
| 190 | 251 | |
| 191 | 252 | */ |
| 192 | 253 | |
| 193 | 254 | c1551_t *c1551 = get_safe_token(device->owner); |
| 194 | 255 | |
| 256 | /* stepper motor */ |
| 195 | 257 | int stp = data & 0x03; |
| 196 | | int ds = (data >> 5) & 0x03; |
| 197 | | int mtr = BIT(data, 2); |
| 258 | step_motor(c1551, stp); |
| 198 | 259 | |
| 199 | | /* stepper motor */ |
| 200 | | if (c1551->stp != stp) |
| 201 | | { |
| 202 | | int tracks = 0; |
| 203 | | |
| 204 | | switch (c1551->stp) |
| 205 | | { |
| 206 | | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 207 | | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 208 | | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 209 | | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 210 | | } |
| 211 | | |
| 212 | | if (tracks != 0) |
| 213 | | { |
| 214 | | c1551->track_len = G64_BUFFER_SIZE; |
| 215 | | c1551->buffer_pos = G64_DATA_START; |
| 216 | | c1551->bit_pos = 7; |
| 217 | | c1551->bit_count = 0; |
| 218 | | |
| 219 | | /* step read/write head */ |
| 220 | | floppy_drive_seek(c1551->image, tracks); |
| 221 | | |
| 222 | | /* read track data */ |
| 223 | | floppy_drive_read_track_data_info_buffer(c1551->image, 0, c1551->track_buffer, &c1551->track_len); |
| 224 | | |
| 225 | | /* extract track length */ |
| 226 | | c1551->track_len = G64_DATA_START + ((c1551->track_buffer[1] << 8) | c1551->track_buffer[0]); |
| 227 | | } |
| 228 | | |
| 229 | | c1551->stp = stp; |
| 230 | | } |
| 231 | | |
| 232 | 260 | /* spindle motor */ |
| 233 | | floppy_mon_w(c1551->image, !mtr); |
| 234 | | timer_enable(c1551->bit_timer, mtr); |
| 261 | int mtr = BIT(data, 2); |
| 262 | spindle_motor(c1551, mtr); |
| 235 | 263 | |
| 236 | 264 | /* activity LED */ |
| 237 | 265 | |
| 238 | 266 | /* density select */ |
| 267 | int ds = (data >> 5) & 0x03; |
| 268 | |
| 239 | 269 | if (c1551->ds != ds) |
| 240 | 270 | { |
| 241 | 271 | timer_adjust_periodic(c1551->bit_timer, attotime_zero, 0, ATTOTIME_IN_HZ(C2040_BITRATE[ds]/4)); |
| r7260 | r7261 | |
| 264 | 294 | |
| 265 | 295 | bit description |
| 266 | 296 | |
| 267 | | PA0 6523 P0 |
| 268 | | PA1 6523 P1 |
| 269 | | PA2 6523 P2 |
| 270 | | PA3 6523 P3 |
| 271 | | PA4 6523 P4 |
| 272 | | PA5 6523 P5 |
| 273 | | PA6 6523 P6 |
| 274 | | PA7 6523 P7 |
| 297 | PA0 TCBM PA0 |
| 298 | PA1 TCBM PA1 |
| 299 | PA2 TCBM PA2 |
| 300 | PA3 TCBM PA3 |
| 301 | PA4 TCBM PA4 |
| 302 | PA5 TCBM PA5 |
| 303 | PA6 TCBM PA6 |
| 304 | PA7 TCBM PA7 |
| 275 | 305 | |
| 276 | 306 | */ |
| 277 | 307 | |
| r7260 | r7261 | |
| 284 | 314 | |
| 285 | 315 | bit description |
| 286 | 316 | |
| 287 | | PA0 6523 P0 |
| 288 | | PA1 6523 P1 |
| 289 | | PA2 6523 P2 |
| 290 | | PA3 6523 P3 |
| 291 | | PA4 6523 P4 |
| 292 | | PA5 6523 P5 |
| 293 | | PA6 6523 P6 |
| 294 | | PA7 6523 P7 |
| 317 | PA0 TCBM PA0 |
| 318 | PA1 TCBM PA1 |
| 319 | PA2 TCBM PA2 |
| 320 | PA3 TCBM PA3 |
| 321 | PA4 TCBM PA4 |
| 322 | PA5 TCBM PA5 |
| 323 | PA6 TCBM PA6 |
| 324 | PA7 TCBM PA7 |
| 295 | 325 | |
| 296 | 326 | */ |
| 297 | 327 | } |
| r7260 | r7261 | |
| 346 | 376 | |
| 347 | 377 | bit description |
| 348 | 378 | |
| 349 | | PC0 6523 _IRQ |
| 350 | | PC1 6523 _RES |
| 351 | | PC2 interface J1 |
| 352 | | PC3 6523 pin 20 |
| 353 | | PC4 SOE |
| 379 | PC0 TCBM STATUS0 |
| 380 | PC1 TCBM STATUS1 |
| 381 | PC2 TCBM DEV |
| 382 | PC3 TCBM ACK |
| 383 | PC4 MODE |
| 354 | 384 | PC5 JP1 |
| 355 | 385 | PC6 _SYNC |
| 356 | | PC7 6523 phi2 |
| 386 | PC7 TCBM DAV |
| 357 | 387 | |
| 358 | 388 | */ |
| 359 | 389 | |
| r7260 | r7261 | |
| 372 | 402 | |
| 373 | 403 | bit description |
| 374 | 404 | |
| 375 | | PC0 6523 _IRQ |
| 376 | | PC1 6523 _RES |
| 377 | | PC2 interface J1 |
| 378 | | PC3 6523 pin 20 |
| 379 | | PC4 SOE |
| 405 | PC0 TCBM STATUS0 |
| 406 | PC1 TCBM STATUS1 |
| 407 | PC2 TCBM DEV |
| 408 | PC3 TCBM ACK |
| 409 | PC4 MODE |
| 380 | 410 | PC5 JP1 |
| 381 | 411 | PC6 _SYNC |
| 382 | | PC7 6523 phi2 |
| 412 | PC7 TCBM DAV |
| 383 | 413 | |
| 384 | 414 | */ |
| 385 | 415 | |
| r7260 | r7261 | |
| 445 | 475 | ROM( c1551 ) |
| 446 | 476 | -------------------------------------------------*/ |
| 447 | 477 | |
| 448 | | ROM_START( c1551 ) |
| 478 | ROM_START( c1551 ) // schematic 251860 |
| 449 | 479 | ROM_REGION( 0x4000, "c1551", ROMREGION_LOADBYNAME ) |
| 450 | 480 | ROM_LOAD( "318001-01.u4", 0x0000, 0x4000, CRC(6d16d024) SHA1(fae3c788ad9a6cc2dbdfbcf6c0264b2ca921d55e) ) |
| 451 | 481 | ROM_END |
| r7260 | r7261 | |
| 481 | 511 | state_save_register_device_item(device, 0, c1551->data); |
| 482 | 512 | state_save_register_device_item(device, 0, c1551->yb); |
| 483 | 513 | state_save_register_device_item(device, 0, c1551->byte); |
| 484 | | state_save_register_device_item(device, 0, c1551->atna); |
| 485 | 514 | state_save_register_device_item(device, 0, c1551->ds); |
| 486 | 515 | state_save_register_device_item(device, 0, c1551->stp); |
| 487 | 516 | state_save_register_device_item(device, 0, c1551->soe); |
src/mess/machine/c1571.c
| r7260 | r7261 | |
| 50 | 50 | typedef struct _c1571_t c1571_t; |
| 51 | 51 | struct _c1571_t |
| 52 | 52 | { |
| 53 | | /* abstractions */ |
| 54 | | int address; /* device number */ |
| 55 | | UINT8 track_buffer[G64_BUFFER_SIZE]; /* track data buffer */ |
| 56 | | int track_len; /* track length */ |
| 57 | | int buffer_pos; /* current byte position within track buffer */ |
| 58 | | int bit_pos; /* current bit position within track buffer byte */ |
| 59 | | int bit_count; /* current data byte bit counter */ |
| 60 | | UINT16 data; /* data shift register */ |
| 53 | /* IEC bus */ |
| 54 | int address; /* device number */ |
| 55 | int data_out; /* serial data out */ |
| 56 | int atn_ack; /* attention acknowledge */ |
| 57 | int ser_dir; /* fast serial direction */ |
| 58 | int sp_out; /* fast serial data out */ |
| 59 | int cnt_out; /* fast serial clock out */ |
| 61 | 60 | |
| 61 | /* motors */ |
| 62 | int stp; /* stepper motor phase */ |
| 63 | int mtr; /* spindle motor on */ |
| 64 | |
| 65 | /* track */ |
| 66 | UINT8 track_buffer[G64_BUFFER_SIZE]; /* track data buffer */ |
| 67 | int track_len; /* track length */ |
| 68 | int buffer_pos; /* current byte position within track buffer */ |
| 69 | int bit_pos; /* current bit position within track buffer byte */ |
| 70 | int bit_count; /* current data byte bit counter */ |
| 71 | UINT16 data; /* data shift register */ |
| 72 | UINT8 yb; /* GCR data byte to write */ |
| 73 | |
| 62 | 74 | /* signals */ |
| 63 | | UINT8 yb; /* GCR data byte to write */ |
| 64 | | int byte; /* byte ready */ |
| 65 | | int atna; /* attention acknowledge */ |
| 66 | | int ds; /* density select */ |
| 67 | | int stp; /* stepping motor */ |
| 68 | | int soe; /* s? output enable */ |
| 69 | | int mode; /* mode (0 = write, 1 = read) */ |
| 70 | | int side; /* disk side select */ |
| 75 | int ds; /* density select */ |
| 76 | int soe; /* s? output enable */ |
| 77 | int byte; /* byte ready */ |
| 78 | int mode; /* mode (0 = write, 1 = read) */ |
| 79 | int side; /* disk side select */ |
| 71 | 80 | |
| 72 | | int data_out; /* serial data out */ |
| 73 | | int atn_ack; /* attention acknowledge */ |
| 74 | | int ser_dir; /* fast serial direction */ |
| 75 | | int sp_out; /* fast serial data out */ |
| 76 | | int cnt_out; /* fast serial clock out */ |
| 77 | | |
| 78 | 81 | /* interrupts */ |
| 79 | | int via0_irq; /* VIA #0 interrupt request */ |
| 80 | | int via1_irq; /* VIA #1 interrupt request */ |
| 81 | | int cia_irq; /* CIA interrupt request */ |
| 82 | int via0_irq; /* VIA #0 interrupt request */ |
| 83 | int via1_irq; /* VIA #1 interrupt request */ |
| 84 | int cia_irq; /* CIA interrupt request */ |
| 82 | 85 | |
| 83 | 86 | /* devices */ |
| 84 | 87 | running_device *cpu; |
| r7260 | r7261 | |
| 462 | 465 | via6522_interface c1571_via1_intf |
| 463 | 466 | -------------------------------------------------*/ |
| 464 | 467 | |
| 468 | static void read_current_track(c1571_t *c1571) |
| 469 | { |
| 470 | c1571->track_len = G64_BUFFER_SIZE; |
| 471 | c1571->buffer_pos = G64_DATA_START; |
| 472 | c1571->bit_pos = 7; |
| 473 | c1571->bit_count = 0; |
| 474 | |
| 475 | /* read track data */ |
| 476 | floppy_drive_read_track_data_info_buffer(c1571->image, c1571->side, c1571->track_buffer, &c1571->track_len); |
| 477 | |
| 478 | /* extract track length */ |
| 479 | c1571->track_len = G64_DATA_START + ((c1571->track_buffer[1] << 8) | c1571->track_buffer[0]); |
| 480 | } |
| 481 | |
| 482 | static void spindle_motor(c1571_t *c1571, int mtr) |
| 483 | { |
| 484 | if (c1571->mtr != mtr) |
| 485 | { |
| 486 | if (mtr) |
| 487 | { |
| 488 | /* read track data */ |
| 489 | read_current_track(c1571); |
| 490 | } |
| 491 | |
| 492 | floppy_mon_w(c1571->image, !mtr); |
| 493 | timer_enable(c1571->bit_timer, mtr); |
| 494 | |
| 495 | c1571->mtr = mtr; |
| 496 | } |
| 497 | } |
| 498 | |
| 499 | static void step_motor(c1571_t *c1571, int stp) |
| 500 | { |
| 501 | if (c1571->stp != stp) |
| 502 | { |
| 503 | int tracks = 0; |
| 504 | |
| 505 | switch (c1571->stp) |
| 506 | { |
| 507 | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 508 | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 509 | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 510 | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 511 | } |
| 512 | |
| 513 | if (tracks != 0) |
| 514 | { |
| 515 | /* step read/write head */ |
| 516 | floppy_drive_seek(c1571->image, tracks); |
| 517 | |
| 518 | /* read new track data */ |
| 519 | read_current_track(c1571); |
| 520 | } |
| 521 | |
| 522 | c1571->stp = stp; |
| 523 | } |
| 524 | } |
| 525 | |
| 465 | 526 | static WRITE_LINE_DEVICE_HANDLER( via1_irq_w ) |
| 466 | 527 | { |
| 467 | 528 | c1571_t *c1571 = get_safe_token(device->owner); |
| r7260 | r7261 | |
| 558 | 619 | */ |
| 559 | 620 | |
| 560 | 621 | c1571_t *c1571 = get_safe_token(device->owner); |
| 561 | | int stp = data & 0x03; |
| 562 | | int ds = (data >> 5) & 0x03; |
| 563 | | int mtr = BIT(data, 2); |
| 564 | 622 | |
| 565 | 623 | /* stepper motor */ |
| 566 | | if (c1571->stp != stp) |
| 567 | | { |
| 568 | | int tracks = 0; |
| 624 | int stp = data & 0x03; |
| 625 | step_motor(c1571, stp); |
| 569 | 626 | |
| 570 | | switch (c1571->stp) |
| 571 | | { |
| 572 | | case 0: if (stp == 1) tracks++; else if (stp == 3) tracks--; break; |
| 573 | | case 1: if (stp == 2) tracks++; else if (stp == 0) tracks--; break; |
| 574 | | case 2: if (stp == 3) tracks++; else if (stp == 1) tracks--; break; |
| 575 | | case 3: if (stp == 0) tracks++; else if (stp == 2) tracks--; break; |
| 576 | | } |
| 577 | | |
| 578 | | if (tracks != 0) |
| 579 | | { |
| 580 | | c1571->track_len = G64_BUFFER_SIZE; |
| 581 | | c1571->buffer_pos = G64_DATA_START; |
| 582 | | c1571->bit_pos = 7; |
| 583 | | c1571->bit_count = 0; |
| 584 | | |
| 585 | | /* step read/write head */ |
| 586 | | floppy_drive_seek(c1571->image, tracks); |
| 587 | | |
| 588 | | /* read track data */ |
| 589 | | floppy_drive_read_track_data_info_buffer(c1571->image, c1571->side, c1571->track_buffer, &c1571->track_len); |
| 590 | | |
| 591 | | /* extract track length */ |
| 592 | | c1571->track_len = G64_DATA_START + ((c1571->track_buffer[1] << 8) | c1571->track_buffer[0]); |
| 593 | | } |
| 594 | | |
| 595 | | c1571->stp = stp; |
| 596 | | } |
| 597 | | |
| 598 | 627 | /* spindle motor */ |
| 599 | | floppy_mon_w(c1571->image, !mtr); |
| 600 | | timer_enable(c1571->bit_timer, mtr); |
| 628 | int mtr = BIT(data, 2); |
| 629 | spindle_motor(c1571, mtr); |
| 601 | 630 | |
| 602 | 631 | /* activity LED */ |
| 603 | 632 | |
| 604 | 633 | /* density select */ |
| 634 | int ds = (data >> 5) & 0x03; |
| 635 | |
| 605 | 636 | if (c1571->ds != ds) |
| 606 | 637 | { |
| 607 | 638 | timer_adjust_periodic(c1571->bit_timer, attotime_zero, 0, ATTOTIME_IN_HZ(C2040_BITRATE[ds]/4)); |