fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation

rc759: Use the pri block device to load pri images

+191 -256
+1
Makefile.dep
··· 1200 1200 src/arch/rc759/main.h \ 1201 1201 src/chipset/wd179x.h \ 1202 1202 src/config.h \ 1203 + src/drivers/block/blkpri.h \ 1203 1204 src/drivers/block/blkpsi.h \ 1204 1205 src/drivers/block/block.h \ 1205 1206 src/drivers/pri/pri-enc-mfm.h \
+161 -169
src/arch/rc759/fdc.c
··· 5 5 /***************************************************************************** 6 6 * File name: src/arch/rc759/fdc.c * 7 7 * Created: 2012-07-05 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2012-2014 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2012-2019 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 30 30 #include <chipset/wd179x.h> 31 31 32 32 #include <drivers/block/block.h> 33 + #include <drivers/block/blkpri.h> 33 34 #include <drivers/block/blkpsi.h> 34 35 35 36 #include <drivers/psi/psi.h> ··· 103 104 fdc->fcr = 0; 104 105 105 106 for (i = 0; i < 2; i++) { 106 - fdc->use_fname[i] = 0; 107 - fdc->fname[i] = NULL; 108 107 fdc->diskid[i] = 0xffff; 109 108 fdc->img[i] = NULL; 109 + fdc->img_del[i] = 0; 110 110 fdc->modified[i] = 0; 111 111 } 112 112 } ··· 118 118 for (i = 0; i < 2; i++) { 119 119 rc759_fdc_save (fdc, i); 120 120 121 - pri_img_del (fdc->img[i]); 122 - 123 - free (fdc->fname[i]); 121 + if (fdc->img_del[i]) { 122 + pri_img_del (fdc->img[i]); 123 + } 124 124 } 125 125 126 126 wd179x_free (&fdc->wd179x); ··· 144 144 fdc->diskid[drive] = diskid; 145 145 } 146 146 147 - void rc759_fdc_set_fname (rc759_fdc_t *fdc, unsigned drive, const char *fname) 147 + static 148 + int rc759_fdc_eject_drive (rc759_fdc_t *fdc, unsigned drive) 148 149 { 149 - unsigned n; 150 - char *str; 150 + wd179x_flush (&fdc->wd179x, drive); 151 151 152 - if (drive >= 2) { 153 - return; 152 + if (rc759_fdc_save (fdc, drive)) { 153 + return (1); 154 154 } 155 155 156 - free (fdc->fname[drive]); 157 - fdc->fname[drive] = NULL; 158 - fdc->use_fname[drive] = 0; 156 + wd179x_set_ready (&fdc->wd179x, drive, 0); 159 157 160 - if (fname == NULL) { 161 - return; 158 + if (fdc->img_del[drive]) { 159 + pri_img_del (fdc->img[drive]); 162 160 } 163 161 164 - n = strlen (fname); 162 + fdc->img[drive] = NULL; 163 + fdc->img_del[drive] = 0; 165 164 166 - str = malloc (n + 1); 167 - 168 - if (str == NULL) { 169 - return; 170 - } 165 + fdc->modified[drive] = 0; 171 166 172 - memcpy (str, fname, n + 1); 173 - 174 - fdc->fname[drive] = str; 167 + return (0); 175 168 } 176 169 177 - int rc759_fdc_insert (rc759_fdc_t *fdc, const char *str) 170 + static 171 + int rc759_fdc_insert_drive (rc759_fdc_t *fdc, unsigned drive) 178 172 { 179 - unsigned i; 180 - unsigned drv; 181 - char buf[16]; 173 + wd179x_flush (&fdc->wd179x, drive); 182 174 183 - i = 0; 184 - while ((i < 16) && (str[i] != 0)) { 185 - if (str[i] == ':') { 186 - buf[i] = 0; 187 - break; 188 - } 189 - 190 - buf[i] = str[i]; 191 - 192 - i += 1; 193 - } 194 - 195 - if ((i >= 16) || (i == 0) || (str[i] == 0)) { 175 + if (rc759_fdc_load (fdc, drive)) { 196 176 return (1); 197 177 } 198 178 199 - drv = strtoul (buf, NULL, 0); 200 - str = str + i + 1; 179 + return (0); 180 + } 201 181 202 - if (rc759_fdc_save (fdc, drv)) { 203 - return (1); 204 - } 182 + int rc759_fdc_eject_disk (rc759_fdc_t *fdc, unsigned id) 183 + { 184 + int r; 185 + unsigned i; 205 186 206 - rc759_fdc_set_fname (fdc, drv, str); 187 + r = 0; 207 188 208 - if (rc759_fdc_load (fdc, drv)) { 209 - return (1); 189 + for (i = 0; i < 2; i++) { 190 + if (fdc->diskid[i] == id) { 191 + r |= rc759_fdc_eject_drive (fdc, i); 192 + } 210 193 } 211 194 212 - return (0); 195 + return (r); 213 196 } 214 197 215 - int rc759_fdc_eject (rc759_fdc_t *fdc, const char *str) 198 + int rc759_fdc_insert_disk (rc759_fdc_t *fdc, unsigned id) 216 199 { 217 - unsigned drv; 200 + int r; 201 + unsigned i; 218 202 219 - drv = strtoul (str, NULL, 0); 203 + r = 0; 220 204 221 - if (rc759_fdc_save (fdc, drv)) { 222 - return (1); 205 + for (i = 0; i < 2; i++) { 206 + if (fdc->diskid[i] == id) { 207 + r |= rc759_fdc_insert_drive (fdc, i); 208 + } 223 209 } 224 210 225 - rc759_fdc_set_fname (fdc, drv, NULL); 226 - 227 - if (rc759_fdc_load (fdc, drv)) { 228 - return (1); 229 - } 230 - 231 - return (0); 211 + return (r); 232 212 } 233 213 234 214 unsigned char rc759_fdc_get_reserve (const rc759_fdc_t *fdc) ··· 269 249 } 270 250 271 251 static 272 - pri_img_t *rc759_fdc_load_pri (rc759_fdc_t *fdc, unsigned drive) 273 - { 274 - pri_img_t *img; 275 - 276 - if (fdc->fname[drive] == NULL) { 277 - return (NULL); 278 - } 279 - 280 - img = pri_img_load (fdc->fname[drive], PRI_FORMAT_PBIT); 281 - 282 - return (img); 283 - } 284 - 285 - static 286 - psi_img_t *rc759_fdc_load_block (rc759_fdc_t *fdc, unsigned drive, disk_t *dsk) 252 + psi_img_t *rc759_fdc_load_block (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive) 287 253 { 288 254 unsigned c, h, s; 289 255 unsigned cn, hn, sn; ··· 331 297 } 332 298 333 299 static 334 - pri_img_t *rc759_fdc_load_disk (rc759_fdc_t *fdc, unsigned drive) 300 + int rc759_fdc_load_psi (rc759_fdc_t *fdc, psi_img_t *img, unsigned drive) 335 301 { 336 - disk_t *dsk; 337 - disk_psi_t *dskpsi; 338 - psi_img_t *img, *del; 339 - pri_img_t *ret; 302 + pri_enc_mfm_t par; 340 303 341 - dsk = dsks_get_disk (fdc->dsks, fdc->diskid[drive]); 304 + pri_encode_mfm_init (&par, 500000, 300); 342 305 343 - if (dsk == NULL) { 344 - return (NULL); 345 - } 306 + par.enable_iam = 0; 307 + par.auto_gap3 = 1; 308 + par.gap4a = 96; 309 + par.gap1 = 0; 310 + par.gap3 = 80; 346 311 347 - if (dsk_get_type (dsk) == PCE_DISK_PSI) { 348 - dskpsi = dsk->ext; 349 - img = dskpsi->img; 350 - del = NULL; 351 - } 352 - else { 353 - img = rc759_fdc_load_block (fdc, drive, dsk); 354 - del = img; 355 - } 312 + fdc->img[drive] = pri_encode_mfm (img, &par); 313 + fdc->img_del[drive] = (fdc->img[drive] != NULL); 356 314 357 - if (img == NULL) { 358 - return (NULL); 359 - } 315 + return (0); 316 + } 360 317 361 - ret = pri_encode_mfm_hd_360 (img); 318 + static 319 + int rc759_fdc_load_disk_pri (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive) 320 + { 321 + disk_pri_t *pri; 362 322 363 - psi_img_del (del); 323 + pri = dsk->ext; 364 324 365 - return (ret); 325 + fdc->img[drive] = pri->img; 326 + fdc->img_del[drive] = 0; 327 + 328 + return (0); 366 329 } 367 330 368 - int rc759_fdc_load (rc759_fdc_t *fdc, unsigned drive) 331 + static 332 + int rc759_fdc_load_disk_psi (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive) 369 333 { 370 - pri_img_t *img; 334 + disk_psi_t *psi; 371 335 372 - wd179x_flush (&fdc->wd179x, drive); 336 + psi = dsk->ext; 373 337 374 - wd179x_set_ready (&fdc->wd179x, drive, 0); 338 + if (rc759_fdc_load_psi (fdc, psi->img, drive)) { 339 + return (1); 340 + } 375 341 376 - img = NULL; 377 - 378 - fdc->use_fname[drive] = 0; 342 + return (0); 343 + } 379 344 380 - if (fdc->fname[drive] != NULL) { 381 - img = rc759_fdc_load_pri (fdc, drive); 345 + static 346 + int rc759_fdc_load_disk (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive) 347 + { 348 + int r; 349 + psi_img_t *psi; 382 350 383 - if (img != NULL) { 384 - fdc->use_fname[drive] = 1; 385 - sim_log_deb ("fdc: loading drive %u (pri)\n", drive); 386 - } 351 + if ((psi = rc759_fdc_load_block (fdc, dsk, drive)) == NULL) { 352 + return (1); 387 353 } 388 354 389 - if (img == NULL) { 390 - img = rc759_fdc_load_disk (fdc, drive); 355 + r = rc759_fdc_load_psi (fdc, psi, drive); 356 + 357 + psi_img_del (psi); 358 + 359 + return (r); 360 + } 361 + 362 + int rc759_fdc_load (rc759_fdc_t *fdc, unsigned drive) 363 + { 364 + unsigned type; 365 + disk_t *dsk; 391 366 392 - if (img != NULL) { 393 - sim_log_deb ("fdc: loading drive %u (disk)\n", drive); 394 - } 367 + if (drive >= 2) { 368 + return (1); 395 369 } 396 370 397 - if (img == NULL) { 398 - sim_log_deb ("fdc: loading drive %u failed\n", drive); 371 + rc759_fdc_eject_drive (fdc, drive); 372 + 373 + if ((dsk = dsks_get_disk (fdc->dsks, fdc->diskid[drive])) == NULL) { 399 374 return (1); 400 375 } 401 376 402 - pri_img_del (fdc->img[drive]); 403 - 404 - fdc->img[drive] = img; 377 + type = dsk_get_type (dsk); 405 378 406 - fdc->modified[drive] = 0; 379 + if (type == PCE_DISK_PRI) { 380 + if (rc759_fdc_load_disk_pri (fdc, dsk, drive)) { 381 + return (1); 382 + } 383 + } 384 + else if (type == PCE_DISK_PSI) { 385 + if (rc759_fdc_load_disk_psi (fdc, dsk, drive)) { 386 + return (1); 387 + } 388 + } 389 + else { 390 + if (rc759_fdc_load_disk (fdc, dsk, drive)) { 391 + return (1); 392 + } 393 + } 407 394 408 395 wd179x_set_ready (&fdc->wd179x, drive, 1); 409 396 ··· 411 398 } 412 399 413 400 static 414 - int rc759_fdc_save_block (rc759_fdc_t *fdc, unsigned drive, disk_t *dsk, psi_img_t *img) 401 + int rc759_fdc_save_block (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive, psi_img_t *img) 415 402 { 416 403 unsigned c, h, s; 417 404 unsigned cn, hn, sn; ··· 458 445 } 459 446 460 447 static 461 - int rc759_fdc_save_disk (rc759_fdc_t *fdc, unsigned drive) 448 + int rc759_fdc_save_disk_pri (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive) 462 449 { 463 - int r; 464 - disk_t *dsk; 465 - disk_psi_t *dskpsi; 466 - psi_img_t *img; 450 + disk_pri_t *pri; 467 451 468 - dsk = dsks_get_disk (fdc->dsks, fdc->diskid[drive]); 452 + pri = dsk->ext; 453 + pri->dirty = 1; 469 454 470 - if (dsk == NULL) { 471 - return (1); 472 - } 455 + return (0); 456 + } 473 457 474 - img = pri_decode_mfm (fdc->img[drive], NULL); 458 + static 459 + int rc759_fdc_save_disk_psi (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive) 460 + { 461 + disk_psi_t *psi; 462 + psi_img_t *img; 475 463 476 - if (img == NULL) { 464 + if ((img = pri_decode_mfm (fdc->img[drive], NULL)) == NULL) { 477 465 return (1); 478 466 } 479 467 480 - if (dsk_get_type (dsk) == PCE_DISK_PSI) { 481 - dskpsi = dsk->ext; 482 - psi_img_del (dskpsi->img); 483 - dskpsi->img = img; 484 - dskpsi->dirty = 1; 485 - } 486 - else { 487 - r = rc759_fdc_save_block (fdc, drive, dsk, img); 488 - 489 - psi_img_del (img); 490 - 491 - if (r) { 492 - return (1); 493 - } 494 - } 468 + psi = dsk->ext; 469 + psi_img_del (psi->img); 470 + psi->img = img; 471 + psi->dirty = 1; 495 472 496 473 return (0); 497 474 } 498 475 499 476 static 500 - int rc759_fdc_save_pri (rc759_fdc_t *fdc, unsigned drive) 477 + int rc759_fdc_save_disk (rc759_fdc_t *fdc, disk_t *dsk, unsigned drive) 501 478 { 502 - if (fdc->fname[drive] == NULL) { 503 - return (1); 504 - } 479 + int r; 480 + psi_img_t *img; 505 481 506 - if (pri_img_save (fdc->fname[drive], fdc->img[drive], PRI_FORMAT_NONE)) { 482 + if ((img = pri_decode_mfm (fdc->img[drive], NULL)) == NULL) { 507 483 return (1); 508 484 } 509 485 510 - return (0); 486 + r = rc759_fdc_save_block (fdc, dsk, drive, img); 487 + 488 + psi_img_del (img); 489 + 490 + return (r); 511 491 } 512 492 513 493 int rc759_fdc_save (rc759_fdc_t *fdc, unsigned drive) 514 494 { 495 + unsigned type; 496 + disk_t *dsk; 497 + 498 + if (drive >= 2) { 499 + return (1); 500 + } 501 + 515 502 if (fdc->img[drive] == NULL) { 516 503 return (1); 517 504 } 518 505 506 + wd179x_flush (&fdc->wd179x, drive); 507 + 519 508 if (fdc->modified[drive] == 0) { 520 509 return (0); 521 510 } 522 511 523 - sim_log_deb ("fdc: saving drive %u\n", drive); 512 + if ((dsk = dsks_get_disk (fdc->dsks, fdc->diskid[drive])) == NULL) { 513 + return (1); 514 + } 524 515 525 - if (fdc->use_fname[drive]) { 526 - if (rc759_fdc_save_pri (fdc, drive)) { 527 - sim_log_deb ("fdc: saving drive %u failed (pri)\n", 528 - drive 529 - ); 516 + type = dsk_get_type (dsk); 517 + 518 + if (type == PCE_DISK_PRI) { 519 + if (rc759_fdc_save_disk_pri (fdc, dsk, drive)) { 520 + return (1); 521 + } 522 + } 523 + else if (type == PCE_DISK_PSI) { 524 + if (rc759_fdc_save_disk_psi (fdc, dsk, drive)) { 530 525 return (1); 531 526 } 532 527 } 533 528 else { 534 - if (rc759_fdc_save_disk (fdc, drive)) { 535 - sim_log_deb ("fdc: saving drive %u failed (disk)\n", 536 - drive 537 - ); 529 + if (rc759_fdc_save_disk (fdc, dsk, drive)) { 538 530 return (1); 539 531 } 540 532 }
+4 -7
src/arch/rc759/fdc.h
··· 5 5 /***************************************************************************** 6 6 * File name: src/arch/rc759/fdc.h * 7 7 * Created: 2012-07-05 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2012-2013 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2012-2019 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 39 39 40 40 disks_t *dsks; 41 41 42 - char use_fname[2]; 43 - char *fname[2]; 44 - 45 42 unsigned short diskid[2]; 46 43 47 44 pri_img_t *img[2]; 45 + char img_del[2]; 48 46 49 47 char modified[2]; 50 48 } rc759_fdc_t; ··· 58 56 void rc759_fdc_set_disks (rc759_fdc_t *fdc, disks_t *dsks); 59 57 void rc759_fdc_set_disk_id (rc759_fdc_t *fdc, unsigned drive, unsigned diskid); 60 58 61 - void rc759_fdc_set_fname (rc759_fdc_t *fdc, unsigned drive, const char *fname); 62 - 63 - int rc759_fdc_insert (rc759_fdc_t *fdc, const char *str); 59 + int rc759_fdc_eject_disk (rc759_fdc_t *fdc, unsigned id); 60 + int rc759_fdc_insert_disk (rc759_fdc_t *fdc, unsigned id); 64 61 65 62 unsigned char rc759_fdc_get_reserve (const rc759_fdc_t *fdc); 66 63 void rc759_fdc_set_reserve (rc759_fdc_t *fdc, unsigned char val);
+10 -56
src/arch/rc759/msg.c
··· 48 48 static 49 49 int rc759_set_msg_disk_eject (rc759_t *sim, const char *msg, const char *val) 50 50 { 51 - unsigned drv; 52 - disk_t *dsk; 51 + if (msg_dsk_get_disk_id (val, &sim->disk_id)) { 52 + return (1); 53 + } 53 54 54 - while (*val != 0) { 55 - if (msg_get_prefix_uint (&val, &drv, ":", " \t")) { 56 - pce_log (MSG_ERR, 57 - "*** disk eject error: bad drive (%s)\n", 58 - val 59 - ); 55 + rc759_fdc_eject_disk (&sim->fdc, sim->disk_id); 60 56 61 - return (1); 62 - } 63 - 64 - pce_log (MSG_INF, "ejecting drive %lu\n", drv); 65 - 66 - rc759_fdc_save (&sim->fdc, drv); 67 - rc759_fdc_set_fname (&sim->fdc, drv, NULL); 68 - 69 - dsk = dsks_get_disk (sim->dsks, drv); 70 - dsks_rmv_disk (sim->dsks, dsk); 71 - dsk_del (dsk); 72 - 73 - rc759_fdc_load (&sim->fdc, drv); 74 - } 57 + msg_dsk_emu_disk_eject (val, sim->dsks, &sim->disk_id); 75 58 76 59 return (0); 77 60 } ··· 79 62 static 80 63 int rc759_set_msg_disk_insert (rc759_t *sim, const char *msg, const char *val) 81 64 { 82 - unsigned i; 83 - unsigned drv; 84 - const char *str, *ext; 85 - 86 - str = val; 87 - 88 - if (msg_get_prefix_uint (&str, &drv, ":", " \t")) { 89 - pce_log (MSG_ERR, 90 - "*** disk eject error: bad drive (%s)\n", 91 - val 92 - ); 65 + if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) { 66 + rc759_fdc_eject_disk (&sim->fdc, sim->disk_id); 67 + } 93 68 69 + if (msg_dsk_emu_disk_insert (val, sim->dsks, sim->disk_id)) { 94 70 return (1); 95 71 } 96 72 97 - i = 0; 98 - ext = str; 99 - 100 - while (str[i] != 0) { 101 - if (str[i] == '.') { 102 - ext = str + i; 103 - } 104 - 105 - i += 1; 106 - } 107 - 108 - rc759_fdc_save (&sim->fdc, drv); 109 - 110 - if (strcasecmp (ext, ".pbit") == 0) { 111 - rc759_fdc_set_fname (&sim->fdc, drv, str); 112 - } 113 - else { 114 - if (dsk_insert (sim->dsks, val, 1)) { 115 - return (1); 116 - } 117 - } 118 - 119 - rc759_fdc_load (&sim->fdc, drv); 73 + rc759_fdc_insert_disk (&sim->fdc, sim->disk_id); 120 74 121 75 return (0); 122 76 }
+8 -10
src/arch/rc759/pce-rc759.cfg.in
··· 217 217 218 218 # The floppy disk controller 219 219 fdc { 220 - # The PBIT file attached to the first floppy disk drive. 221 - # If this option is not set, or the file can't be read, 222 - # the disk with ID 0 is used instead. 223 - file0 = "fd0.pbit" 220 + # The disk id used for drive 0. 221 + id0 = 0 224 222 225 - # The PBIT file attached to the second floppy disk drive. 226 - # If this option is not set, or the file can't be read, 227 - # the disk with ID 1 is used instead. 228 - file1 = "fd1.pbit" 223 + # The disk id used for drive 1. 224 + id1 = 1 229 225 } 230 226 231 227 ··· 234 230 drive = 0 235 231 optional = 1 236 232 type = "auto" 233 + file = "fd0.pri" 237 234 file = "fd0.img" 238 - file = "fd0.pfdc" 235 + file = "fd0.psi" 239 236 } 240 237 241 238 # The second floppy drive ··· 243 240 drive = 1 244 241 optional = 1 245 242 type = "auto" 243 + file = "fd1.pri" 246 244 file = "fd1.img" 247 - file = "fd1.pfdc" 245 + file = "fd1.psi" 248 246 }
+7 -14
src/arch/rc759/rc759.c
··· 921 921 static 922 922 void rc759_setup_fdc (rc759_t *sim, ini_sct_t *ini) 923 923 { 924 - const char *fname0, *fname1; 925 - ini_sct_t *sct; 924 + unsigned id0, id1; 925 + ini_sct_t *sct; 926 926 927 927 sct = ini_next_sct (ini, NULL, "fdc"); 928 928 929 - ini_get_string (sct, "file0", &fname0, NULL); 930 - ini_get_string (sct, "file1", &fname1, NULL); 929 + ini_get_uint16 (sct, "id0", &id0, 0); 930 + ini_get_uint16 (sct, "id1", &id1, 1); 931 931 932 - pce_log_tag (MSG_INF, "FDC:", 933 - "file0=%s file1=%s\n", 934 - (fname0 != NULL) ? fname0 : "<none>", 935 - (fname1 != NULL) ? fname1 : "<none>" 936 - ); 932 + pce_log_tag (MSG_INF, "FDC:", "drive0=%u drive1=%u\n", id0, id1); 937 933 938 934 rc759_fdc_init (&sim->fdc); 939 935 ··· 945 941 946 942 rc759_fdc_set_disks (&sim->fdc, sim->dsks); 947 943 948 - rc759_fdc_set_fname (&sim->fdc, 0, fname0); 949 - rc759_fdc_set_fname (&sim->fdc, 1, fname1); 950 - 951 - rc759_fdc_set_disk_id (&sim->fdc, 0, 0); 952 - rc759_fdc_set_disk_id (&sim->fdc, 1, 1); 944 + rc759_fdc_set_disk_id (&sim->fdc, 0, id0); 945 + rc759_fdc_set_disk_id (&sim->fdc, 1, id1); 953 946 954 947 rc759_fdc_load (&sim->fdc, 0); 955 948 rc759_fdc_load (&sim->fdc, 1);