From ed138fbd47db1ffd8bdd8494053d60111d8f3d86 Mon Sep 17 00:00:00 2001 From: beeanyew Date: Wed, 3 Feb 2021 12:26:19 +0100 Subject: [PATCH] Fix PiSCSI device selection bug --- README.md | 9 +- platforms/amiga/amiga-platform.c | 2 - .../device_driver_amiga/2nd.scsi.device | Bin 2892 -> 2920 bytes .../amiga/piscsi/device_driver_amiga/bootrom | Bin 264 -> 348 bytes .../piscsi/device_driver_amiga/bootrom.s | 63 +++-- .../piscsi/device_driver_amiga/pi-scsi.device | Bin 2892 -> 2920 bytes .../piscsi/device_driver_amiga/piscsi-amiga.c | 59 ++++- .../piscsi/device_driver_amiga/scsi.device | Bin 2888 -> 2916 bytes platforms/amiga/piscsi/piscsi-enums.h | 29 ++- platforms/amiga/piscsi/piscsi.c | 222 ++++++++++++------ platforms/amiga/piscsi/piscsi.h | 1 + platforms/amiga/piscsi/piscsi.rom | Bin 16384 -> 16384 bytes 12 files changed, 273 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index 0753d3b..522176c 100644 --- a/README.md +++ b/README.md @@ -47,15 +47,12 @@ Simple quickstart to start the pistorm emulator -run : `./run.sh` +run : `sudo ./emulator` to exit emulation -`ctrl+c` +`ctrl+c` or pressing `q` on the keyboard connected to the Raspberry Pi. -If you want to use the minimal hdd image you need to unpack it : -run : `tar xvfz hd0.tar.gz` - -**Currently the emulation is a bit buggy on IDE Interrupts, so it takes ages to boot from the emulated HDD. This will be fixed soon :) +The IDE emulation can take both hard drive images generated using `makedisk` in the `ide` directory (these have a 1KB header) or headerless RDSK/RDB images created for instance in WinUAE or as empty files. The IDE emulation currently has a quirk that may require you to reduce/increase the size of the image file by 2MB in order for it to work. ** FPGA bitstream update : diff --git a/platforms/amiga/amiga-platform.c b/platforms/amiga/amiga-platform.c index da302ac..6404695 100644 --- a/platforms/amiga/amiga-platform.c +++ b/platforms/amiga/amiga-platform.c @@ -45,7 +45,6 @@ extern unsigned char cdtv_sram[32 * SIZE_KILO]; static uint8_t rtg_enabled = 0, piscsi_enabled = 0, pinet_enabled = 0; extern uint32_t piscsi_base; -extern uint8_t piscsi_diag_read; extern void stop_cpu_emulation(uint8_t disasm_cur); @@ -398,7 +397,6 @@ void handle_reset_amiga(struct emulator_config *cfg) { ac_z2_done = 0; ac_z2_current_pic = 0; ac_z3_current_pic = 0; - piscsi_diag_read = 0; adjust_ranges_amiga(cfg); } diff --git a/platforms/amiga/piscsi/device_driver_amiga/2nd.scsi.device b/platforms/amiga/piscsi/device_driver_amiga/2nd.scsi.device index 3454d1b7b835edabe9d097baf56b45c14a63f257..635812749bddd79583c446233827454a959bc56a 100644 GIT binary patch delta 350 zcmX>j_CjoeIPX6O1_mAm2IiLx42=Ias>m`kewpmV+!$}9qRSvq#;H`(z`!8zY?aa> zr2|ThO1TUiPL4vF4En|gf#M8`4h#xT3@Y+!@_w;?r9|jpg6K#%Gg*vfF5|k%TUc5d z^Cnxd7Bl)xUdI|3J5Px-oq=J73dmN5hux36Rh=0`R6Q9afKKE9$~*zPz(D}$0+R;C z3qZ2*d=F#Ok;9KzR1BYL1 m0>dAh$-me;8GlS};pk#w7nm%-=?vtAa4u%l+5Ceugb@IMLt)MU delta 322 zcmaDMc1CQ1IPZ4`1_mAm2IiLx42<75s>m`k-k9vf+!(B*qRSvq#;H`(095d7m9i6q zfU*OFh_WMtgwY-bMnwk(1t$g-c{O>zSie#vwM<~Od_c8AK(%5BwF#FdE3wRFTsHXt zODkjAWH;7gMwiLESOY_+DRHJVFicPZ+w`#eakr{7gNUjpg9Ol796*^nCLsGV7+4rM zoEUuWv&evK^jg8d0+hSr)ad%_?>P}hp+g0X7aD`QHUPy_82%ef&S3Lo{55$KTeSQ< z<39|HKwmJy%t&DPui(@G^Z`c#!@q*bChQX#pG-c+ZZEhb;gGfm1CO>R1BYL10>dAl i$zmLxjCUq4;OJsv`!ZRF(;3Jq;9Sh8uvvsFgb@H-omk5N diff --git a/platforms/amiga/piscsi/device_driver_amiga/bootrom b/platforms/amiga/piscsi/device_driver_amiga/bootrom index 15361d1c29827209dea21bf409cadb9569c4b451..1bfe54662a83766a84c74eccb25dfa8d9d916f37 100644 GIT binary patch literal 348 zcmbQh;K0BT!?1`!g8>M<{s0L+AU?sU$}9q;L81;od@Ud|*g4o!AviBFJ5|9sKd+=H zKPM-(h#|leEM8`yXULF}U#yptnN*ZmRLS7zfB1IcW*%bOS&622*MT-pP&4k1#&=vNBX&xESq`Pcs`e(QinIw)i?i1|(MD`gO1 z5MhvEQ276!LFNB{upVY)Jzx>drljVTFaZ4t#6UlQ0P`mR D;6Y!W delta 217 zcmcb^)WPI5fx&@+A&6lgg9ZZ-c>Mtqd_a7GQI%N)NP|QzfcTzKUW#6Ea&e|!N@`hV zaw776lsy76yhQ2ETRxt^5l83Y8BuFfceMITSH~WSw6! z=7B_kaNYk|AUZ+G`31uTB`yQWY_`jr7#I@1DRErd1GI|)AyUBTSL*!hf78TWGFpD6 n3=GWgyBHW);(fyW-7@o1f>Mh!Q&RIvfLa)V_y|ZZP|YU*?9V(Q diff --git a/platforms/amiga/piscsi/device_driver_amiga/bootrom.s b/platforms/amiga/piscsi/device_driver_amiga/bootrom.s index a8e8a5a..10ffdd4 100644 --- a/platforms/amiga/piscsi/device_driver_amiga/bootrom.s +++ b/platforms/amiga/piscsi/device_driver_amiga/bootrom.s @@ -24,7 +24,7 @@ XREF _LVOFindResident ROMINFO EQU 0 -ROMOFFS EQU $0 +ROMOFFS EQU $4000 * ROMINFO defines whether you want the AUTOCONFIG information in * the beginning of your ROM (set to 0 if you instead have PALS @@ -92,8 +92,8 @@ rt_Init: dc.l Init-RomStart ; APTR RT_INIT ******* Strings referenced in Diag Copy area ************************ -DevName: dc.b '2nd.scsi.device',0 ; Name string -IdString dc.b 'PISCSI ',48+VERSION,'.',48+REVISION ; Id string +DevName: dc.b 'PiSCSI Snake Controller',0 ; Name string +IdString dc.b 'PISCSI v0.1',0 ; Id string DosName: dc.b 'dos.library',0 ; DOS library name @@ -121,28 +121,12 @@ DiagEntry: nop nop move.l #1,$80000020 - - movea.l 4,a6 - move.l #$40000,d0 - moveq #0,d1 - jsr AllocMem(a6) - nop nop - move.l d0,$80000040 - - move.l d0,a1 - move.l #0,d1 - movea.l 4,a6 - add.l #$16e,a1 - nop nop nop - jsr -102(a6) nop nop - bra.s endpatches - lea patchTable-RomStart(a0),a1 ; find patch table adda.l #ROMOFFS,a1 ; adjusting for ROMOFFS @@ -180,7 +164,15 @@ endpatches: ******* BootEntry ************************************************** ********************************************************************** -BootEntry: lea DosName(PC),a1 ; 'dos.library',0 +BootEntry: + move.l #2,$80000020 + nop + nop + nop + nop + nop + + lea DosName(PC),a1 ; 'dos.library',0 jsr _LVOFindResident(a6) ; find the DOS resident tag move.l d0,a0 ; in order to bootstrap move.l RT_INIT(A0),a0 ; set vector to DOS INIT @@ -221,8 +213,35 @@ Init: ; After Diag patching, our romtag will point to this ; initialization routine, but will MakeDosNode then set up a ; BootNode, and Enqueue() on eb_MountList. ; - rts + move.l #3,$80000020 + nop + nop + nop + nop + + move.l #4,$80000020 + movea.l 4,a6 + move.l #$40000,d0 + moveq #0,d1 + jsr AllocMem(a6) + + move.l d0,$80000040 + nop + nop + + move.l d0,a1 + move.l #0,d1 + movea.l 4,a6 + add.l #$16e,a1 + move.l #5,$80000020 + nop + nop + nop + jsr -102(a6) + nop + nop - ; Rest of your position-independent device code goes here. + moveq.l #1,d0 ; indicate "success" + rts END diff --git a/platforms/amiga/piscsi/device_driver_amiga/pi-scsi.device b/platforms/amiga/piscsi/device_driver_amiga/pi-scsi.device index fdf0587836fdf1d2ae741272f37c8d8408a9f200..cf4826887981037c291ca71081f0c997c8668409 100644 GIT binary patch delta 350 zcmX>j_CjoeIPX6O1_mAm2IiLx42=Ias>m`kewpmV+!$}9qRSvq#;H`(z`!8zY?aa> zr2|ThO1TUiPL4vF4En|gf#M8`4h#xT3@Y+!@_w;?r9|jpg6K#%Gg*vfF5|k%TUc5d z^Cnxd7Bl)xUdI|3J5Px-oq=J73dmN5hux36Rh=0`R6Q9afKKE9$~*zPz(D}$0+R;C z3qZ2*d=F#Ok;9KzR1BYL1 m0>dAh$-me;8GlS};pk#w7nm%-=?vtAa4u%l+5Ceugb@IMLt)MU delta 322 zcmaDMc1CQ1IPZ4`1_mAm2IiLx42<75s>m`k-k9vf+!(B*qRSvq#;H`(095d7m9i6q zfU*OFh_WMtgwY-bMnwk(1t$g-c{O>zSie#vwM<~Od_c8AK(%5BwF#FdE3wRFTsHXt zODkjAWH;7gMwiLESOY_+DRHJVFicPZ+w`#eakr{7gNUjpg9Ol796*^nCLsGV7+4rM zoEUuWv&evK^jg8d0+hSr)ad%_?>P}hp+g0X7aD`QHUPy_82%ef&S3Lo{55$KTeSQ< z<39|HKwmJy%t&DPui(@G^Z`c#!@q*bChQX#pG-c+ZZEhb;gGfm1CO>R1BYL10>dAl i$zmLxjCUq4;OJsv`!ZRF(;3Jq;9Sh8uvvsFgb@H-omk5N diff --git a/platforms/amiga/piscsi/device_driver_amiga/piscsi-amiga.c b/platforms/amiga/piscsi/device_driver_amiga/piscsi-amiga.c index 6b387be..be3738e 100644 --- a/platforms/amiga/piscsi/device_driver_amiga/piscsi-amiga.c +++ b/platforms/amiga/piscsi/device_driver_amiga/piscsi-amiga.c @@ -102,6 +102,10 @@ struct WBStartup *_WBenchMsg = NULL; //#define exit(...) //#define debug(...) #define KPrintF(...) +#define debug(...) +#define debugval(...) +//#define debug(c, v) WRITESHORT(c, v) +//#define debugval(c, v) WRITELONG(c, v) //#define bug(x,args...) KPrintF(x ,##args); //#define debug(x,args...) bug("%s:%ld " x "\n", __func__, (unsigned long)__LINE__ ,##args) @@ -117,6 +121,7 @@ uint32_t __UserDevInit(struct Device* dev) { SysBase = *(struct ExecBase **)4L; KPrintF("Initializing devices.\n"); + debug(PISCSI_DBG_MSG, DBG_INIT); dev_base = AllocMem(sizeof(struct piscsi_base), MEMF_PUBLIC | MEMF_CLEAR); dev_base->pi_dev = dev; @@ -135,6 +140,11 @@ uint32_t __UserDevInit(struct Device* dev) { READSHORT(PISCSI_CMD_HEADS, dev_base->units[i].h); READSHORT(PISCSI_CMD_SECS, dev_base->units[i].s); KPrintF("C/H/S: %ld / %ld / %ld\n", dev_base->units[i].c, dev_base->units[i].h, dev_base->units[i].s); + + debugval(PISCSI_DBG_VAL1, dev_base->units[i].c); + debugval(PISCSI_DBG_VAL2, dev_base->units[i].h); + debugval(PISCSI_DBG_VAL3, dev_base->units[i].s); + debug(PISCSI_DBG_MSG, DBG_CHS); } dev_base->units[i].change_num++; // Send any reset signal to the "SCSI" device here. @@ -145,6 +155,7 @@ uint32_t __UserDevInit(struct Device* dev) { uint32_t __UserDevCleanup(void) { KPrintF("Cleaning up.\n"); + debug(PISCSI_DBG_MSG, DBG_CLEANUP); FreeMem(dev_base, sizeof(struct piscsi_base)); return 0; } @@ -159,6 +170,10 @@ uint32_t __UserDevOpen(struct IOExtTD *iotd, uint32_t num, uint32_t flags) { WRITELONG(PISCSI_CMD_DRVNUM, num); READLONG(PISCSI_CMD_DRVNUM, unit_num); + debugval(PISCSI_DBG_VAL1, unit_num); + debugval(PISCSI_DBG_VAL2, flags); + debugval(PISCSI_DBG_VAL3, num); + debug(PISCSI_DBG_MSG, DBG_OPENDEV); KPrintF("Opening device %ld Flags: %ld (%lx)\n", unit_num, flags, flags); if (iotd && unit_num < NUM_UNITS) { @@ -194,6 +209,10 @@ void __BeginIO(struct IORequest *io) { if (node == NULL || u == NULL) return; + debugval(PISCSI_DBG_VAL1, io->io_Command); + debugval(PISCSI_DBG_VAL2, io->io_Flags); + debugval(PISCSI_DBG_VAL3, (io->io_Flags & IOF_QUICK)); + debug(PISCSI_DBG_MSG, DBG_BEGINIO); KPrintF("io_Command = %ld, io_Flags = 0x%lx quick = %lx\n", io->io_Command, io->io_Flags, (io->io_Flags & IOF_QUICK)); io->io_Error = piscsi_perform_io(u, io); @@ -204,6 +223,7 @@ void __BeginIO(struct IORequest *io) { ADDTABL_1(__AbortIO,a1); void __AbortIO(struct IORequest* io) { + debug(PISCSI_DBG_MSG, DBG_ABORTIO); KPrintF("AbortIO!\n"); if (!io) return; io->io_Error = IOERR_ABORTED; @@ -244,13 +264,13 @@ uint8_t piscsi_rw(struct piscsi_unit *u, struct IORequest *io, uint32_t offset, WRITELONG(PISCSI_CMD_ADDR1, (offset >> 9)); WRITELONG(PISCSI_CMD_ADDR2, len); WRITELONG(PISCSI_CMD_ADDR3, (uint32_t)data); - WRITESHORT(PISCSI_CMD_WRITE, 1); + WRITESHORT(PISCSI_CMD_WRITE, u->unit_num); } else { //KPrintF("read %lx %lx -> %lx\n", offset, len, (uint32_t)data); WRITELONG(PISCSI_CMD_ADDR1, (offset >> 9)); WRITELONG(PISCSI_CMD_ADDR2, len); WRITELONG(PISCSI_CMD_ADDR3, (uint32_t)data); - WRITESHORT(PISCSI_CMD_READ, 1); + WRITESHORT(PISCSI_CMD_READ, u->unit_num); } if (sderr) { @@ -295,6 +315,13 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) scsi->scsi_Command[1], scsi->scsi_Command[2], scsi->scsi_CmdLength); + debugval(PISCSI_DBG_VAL1, iostd->io_Length); + debugval(PISCSI_DBG_VAL2, scsi->scsi_Command[0]); + debugval(PISCSI_DBG_VAL3, scsi->scsi_Command[1]); + debugval(PISCSI_DBG_VAL4, scsi->scsi_Command[2]); + debugval(PISCSI_DBG_VAL5, scsi->scsi_CmdLength); + debug(PISCSI_DBG_MSG, DBG_SCSICMD); + //maxblocks = u->s * u->c * u->h; if (scsi->scsi_CmdLength < 6) { @@ -312,12 +339,10 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) switch (scsi->scsi_Command[0]) { case 0x00: // TEST_UNIT_READY - KPrintF("SCSI command: Test Unit Ready.\n"); err = 0; break; case 0x12: // INQUIRY - KPrintF("SCSI command: Inquiry.\n"); for (i = 0; i < scsi->scsi_Length; i++) { uint8_t val = 0; @@ -373,19 +398,19 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) if (scsi->scsi_Command[0] == 0x08) { //KPrintF("scsi_read %lx %lx\n",block,blocks); - KPrintF("SCSI read %lx %lx -> %lx\n", block, blocks, (uint32_t)data); + //KPrintF("SCSI read %lx %lx -> %lx\n", block, blocks, (uint32_t)data); WRITELONG(PISCSI_CMD_ADDR2, block); WRITELONG(PISCSI_CMD_ADDR2, (blocks << 9)); WRITELONG(PISCSI_CMD_ADDR3, (uint32_t)data); - WRITESHORT(PISCSI_CMD_READ, 1); + WRITESHORT(PISCSI_CMD_READ, u->unit_num); } else { //KPrintF("scsi_write %lx %lx\n",block,blocks); - KPrintF("SCSI write %lx -> %lx %lx\n", (uint32_t)data, block, blocks); + //KPrintF("SCSI write %lx -> %lx %lx\n", (uint32_t)data, block, blocks); WRITELONG(PISCSI_CMD_ADDR2, block); WRITELONG(PISCSI_CMD_ADDR2, (blocks << 9)); WRITELONG(PISCSI_CMD_ADDR3, (uint32_t)data); - WRITESHORT(PISCSI_CMD_WRITE, 1); + WRITESHORT(PISCSI_CMD_WRITE, u->unit_num); } scsi->scsi_Actual = scsi->scsi_Length; @@ -393,7 +418,7 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) break; case 0x25: // READ CAPACITY (10) - KPrintF("SCSI command: Read Capacity.\n"); + //KPrintF("SCSI command: Read Capacity.\n"); if (scsi->scsi_CmdLength < 10) { err = HFERR_BadStatus; break; @@ -422,7 +447,7 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) break; case 0x1a: // MODE SENSE (6) - KPrintF("SCSI command: Mode Sense.\n"); + //KPrintF("SCSI command: Mode Sense.\n"); data[0] = 3 + 8 + 0x16; data[1] = 0; // MEDIUM TYPE data[2] = 0; @@ -437,6 +462,7 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) switch (((UWORD)scsi->scsi_Command[2] << 8) | scsi->scsi_Command[3]) { case 0x0300: { // Format Device Mode KPrintF("Grabbing SCSI format device mode data.\n"); + debug(PISCSI_DBG_MSG, DBG_SCSI_FORMATDEVICE); uint8_t *datext = data + 12; datext[0] = 0x03; datext[1] = 0x16; @@ -457,6 +483,7 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) } case 0x0400: // Rigid Drive Geometry KPrintF("Grabbing SCSI rigid drive geometry.\n"); + debug(PISCSI_DBG_MSG, DBG_SCSI_RDG); uint8_t *datext = data + 12; datext[0] = 0x04; *((uint32_t *)&datext[1]) = u->c; @@ -476,6 +503,8 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) default: KPrintF("[WARN] Unhandled mode sense thing: %lx\n", ((UWORD)scsi->scsi_Command[2] << 8) | scsi->scsi_Command[3]); + debugval(PISCSI_DBG_VAL1, (((UWORD)scsi->scsi_Command[2] << 8) | scsi->scsi_Command[3])); + debug(PISCSI_DBG_MSG, DBG_SCSI_UNKNOWN_MODESENSE); err = HFERR_BadStatus; break; } @@ -486,12 +515,16 @@ uint8_t piscsi_scsi(struct piscsi_unit *u, struct IORequest *io) break; default: + debugval(PISCSI_DBG_VAL1, scsi->scsi_Command[0]); + debug(PISCSI_DBG_MSG, DBG_SCSI_UNKNOWN_COMMAND); KPrintF("Unknown/unhandled SCSI command %lx.\n", scsi->scsi_Command[0]); err = HFERR_BadStatus; break; } if (err != 0) { + debugval(PISCSI_DBG_VAL1, err); + debug(PISCSI_DBG_MSG, DBG_SCSIERR); KPrintF("Some SCSI error occured: %ld\n", err); scsi->scsi_Actual = 0; } @@ -521,6 +554,10 @@ uint8_t piscsi_perform_io(struct piscsi_unit *u, struct IORequest *io) { return io->io_Error; } + debugval(PISCSI_DBG_VAL1, io->io_Command); + debugval(PISCSI_DBG_VAL2, io->io_Flags); + debugval(PISCSI_DBG_VAL3, iostd->io_Length); + debug(PISCSI_DBG_MSG, DBG_IOCMD); //KPrintF("cmd: %s\n",cmd_name(io->io_Command)); //KPrintF("IO %lx Start, io_Flags = %ld, io_Command = %ld\n", io, io->io_Flags, io->io_Command); @@ -569,7 +606,7 @@ uint8_t piscsi_perform_io(struct piscsi_unit *u, struct IORequest *io) { break; default: { int cmd = io->io_Command; - KPrintF("Unknown IO command: %ld\n", cmd); + debug(PISCSI_DBG_MSG, DBG_IOCMD_UNHANDLED); err = IOERR_NOCMD; break; } diff --git a/platforms/amiga/piscsi/device_driver_amiga/scsi.device b/platforms/amiga/piscsi/device_driver_amiga/scsi.device index d14887766f40ac30efd28929980a22ad4e843176..fdc43816623d5c78ca6ba4bc435a7b451b6856b1 100644 GIT binary patch delta 312 zcmX>h_C#!gIPYHu1_mAm2IiLx42*v_sz@?3ewl2?+^A}#qRSvq#;H`(z`!8zY?aa> zr2|ThO1TUiPL4vF4En|gf#M94?=ed%;*w=jbYM_$Vn{eMS%_sW~fnkOU$OeXo-H*Ffof$+_JsBi`&fx&cJOSJ0AON(@q+zlGo4Dj1 zr$*Obe~*bU3LPq7ywDibwP6JVOA5n(jmZIQo{XO+&ti*KpN7z7d;n-NlVSz~3((aJ z2@L-woEm^`;z(flmoQm`eInzD$;;U71v?TBX?rm6XnQhn_{AnL{IQw*jlB~X3Jn}x YOzb?9c{rVcoB+zSie#vwM<~Od_c8AK(%5BwF#Fd%dyO5TsC0T=sSb!?7 zI5oQd`g=}lT+9{8GlV)#}+L=&-f1mBhbZ6Ff$Su{wp{& z0A0(G!0@kNvH|-<#wU{xvD*tSNjRkK!N8;K$-vfd == -1) { printf ("[PISCSI] BUG: Attempted read from unmapped drive %d.\n", piscsi_cur_drive); break; } printf("[PISCSI] %d byte READ from block %d to address %.8X\n", piscsi_u32[1], piscsi_u32[0], piscsi_u32[2]); + d->lba = piscsi_u32[0]; r = get_mapped_item_by_address(cfg, piscsi_u32[2]); if (r != -1 && cfg->map_type[r] == MAPTYPE_RAM) { printf("[PISCSI] \"DMA\" Read goes to mapped range %d.\n", r); @@ -119,11 +253,13 @@ void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) { } break; case PISCSI_CMD_WRITE: + d = &devs[val]; if (d->fd == -1) { printf ("[PISCSI] BUG: Attempted write to unmapped drive %d.\n", piscsi_cur_drive); break; } - printf("[PISCSI] %d byte WRITE to block %d to address %.8X\n", piscsi_u32[1], piscsi_u32[0], piscsi_u32[2]); + d->lba = piscsi_u32[0]; + printf("[PISCSI] %d byte WRITE to block %d from address %.8X\n", piscsi_u32[1], piscsi_u32[0], piscsi_u32[2]); r = get_mapped_item_by_address(cfg, piscsi_u32[2]); if (r != -1) { printf("[PISCSI] \"DMA\" Write comes from mapped range %d.\n", r); @@ -142,22 +278,11 @@ void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) { } } break; - case PISCSI_CMD_ADDR1: - piscsi_u32[0] = val; - printf("[PISCSI] Write to ADDR1: %.8x\n", piscsi_u32[0]); - break; - case PISCSI_CMD_ADDR2: - piscsi_u32[1] = val; - printf("[PISCSI] Write to ADDR2: %.8x\n", piscsi_u32[1]); - break; - case PISCSI_CMD_ADDR3: - piscsi_u32[2] = val; - printf("[PISCSI] Write to ADDR3: %.8x\n", piscsi_u32[2]); - break; - case PISCSI_CMD_ADDR4: - piscsi_u32[3] = val; - printf("[PISCSI] Write to ADDR4: %.8x\n", piscsi_u32[3]); + case PISCSI_CMD_ADDR1: case PISCSI_CMD_ADDR2: case PISCSI_CMD_ADDR3: case PISCSI_CMD_ADDR4: { + int i = ((addr & 0xFFFF) - PISCSI_CMD_ADDR1) / 4; + piscsi_u32[i] = val; break; + } case PISCSI_CMD_DRVNUM: if (val != 0) { if (val < 10) // Kludge for GiggleDisk @@ -172,7 +297,7 @@ void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) { printf("[PISCSI] (%s) Drive number set to %d (%d)\n", op_type_names[type], piscsi_cur_drive, val); break; case PISCSI_CMD_DEBUGME: - printf("[PISCSI] DebugMe triggered.\n"); + printf("[PISCSI] DebugMe triggered (%d).\n", val); stop_cpu_emulation(1); break; case PISCSI_CMD_DRIVER: { @@ -216,66 +341,28 @@ void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) { } break; } + case PISCSI_DBG_VAL1: case PISCSI_DBG_VAL2: case PISCSI_DBG_VAL3: case PISCSI_DBG_VAL4: + case PISCSI_DBG_VAL5: case PISCSI_DBG_VAL6: case PISCSI_DBG_VAL7: case PISCSI_DBG_VAL8: { + int i = ((addr & 0xFFFF) - PISCSI_DBG_VAL1) / 4; + piscsi_dbg[i] = val; + break; + } + case PISCSI_DBG_MSG: + print_piscsi_debug_message(val); + break; default: - printf("[PISCSI] Unhandled %s register write to %.8X: %d\n", op_type_names[type], addr, val); + printf("[PISCSI] WARN: Unhandled %s register write to %.8X: %d\n", op_type_names[type], addr, val); break; } } -uint8_t piscsi_diag_area[] = { - 0x90, - 0x00, - 0x00, 0x40, - 0x2C, 0x00, - 0x2C, 0x00, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, -}; - -uint8_t fastata_diag_area[] = { - 0x90, - 0x00, - 0x00, 0x10, - 0x9e, 0x08, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x02, - 0x00, 0x00, -}; - -uint8_t piscsi_diag_read; - #define PIB 0x00 uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) { if (type) {} - uint8_t *diag_area = piscsi_diag_area; if ((addr & 0xFFFF) >= PISCSI_CMD_ROM) { uint32_t romoffs = (addr & 0xFFFF) - PISCSI_CMD_ROM; - /*if (romoffs < 14 && !piscsi_diag_read) { - printf("[PISCSI] %s read from DiagArea @$%.4X: ", op_type_names[type], romoffs); - uint32_t v = 0; - switch (type) { - case OP_TYPE_BYTE: - v = diag_area[romoffs]; - printf("%.2X\n", v); - break; - case OP_TYPE_WORD: - v = *((uint16_t *)&diag_area[romoffs]); - printf("%.4X\n", v); - break; - case OP_TYPE_LONGWORD: - v = (*((uint16_t *)&diag_area[romoffs]) << 16) | *((uint16_t *)&diag_area[romoffs + 2]); - //v = *((uint32_t *)&diag_area[romoffs]); - printf("%.8X\n", v); - break; - } - if (romoffs == 0x0D) - piscsi_diag_read = 1; - return v; - }*/ if (romoffs < (piscsi_rom_size + PIB)) { printf("[PISCSI] %s read from Boot ROM @$%.4X (%.8X): ", op_type_names[type], romoffs, addr); uint32_t v = 0; @@ -289,7 +376,6 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) { printf("%.4X\n", v); break; case OP_TYPE_LONGWORD: - //v = (*((uint16_t *)&piscsi_rom_ptr[romoffs - 14]) << 16) | *((uint16_t *)&piscsi_rom_ptr[romoffs - 12]); v = be32toh(*((uint32_t *)&piscsi_rom_ptr[romoffs - PIB])); printf("%.8X\n", v); break; @@ -337,7 +423,3 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) { return 0; } - -void piscsi_block_op(uint8_t type, uint8_t num, uint32_t dest, uint32_t len) { - if (type || num || dest || len) {} -} diff --git a/platforms/amiga/piscsi/piscsi.h b/platforms/amiga/piscsi/piscsi.h index b0148e2..562b81f 100644 --- a/platforms/amiga/piscsi/piscsi.h +++ b/platforms/amiga/piscsi/piscsi.h @@ -11,4 +11,5 @@ struct piscsi_dev { uint16_t h, s; uint64_t fs; int32_t fd; + uint32_t lba; }; diff --git a/platforms/amiga/piscsi/piscsi.rom b/platforms/amiga/piscsi/piscsi.rom index 96db6f657bae1231f00a4b7609db1005f7156160..1f2bb2d7208c21e764dc8f7518c80815ce214791 100644 GIT binary patch delta 764 zcmZ`#Pe>F|9RA+ytUJ5zE}N|8g3;`_%Npjt^b|tlPXD%IvXvmHaMoN>+;+EFl?uVx zLr{59UPJ_Shz{am355>f!90YA4pGoaf-J;^=nxUInA4l_pdEU{?>*l4`@Zk@%`*&Q z7-Vu9GH?aY(FC^6Y_ZMHYK24{L3UcG%<5C`aG%nb5c{&Jk+i7fvZHz~lS%97P1yK& zdus;wjg}`d0CDHOvnv}|QOfcpBu{&2r0U~5p#7GF4~y2k zT_jJ`G24Lq*FdS557iR$l*J*`snhBh0tli3qG=*xnzqKVS7Rf*g&e*GUhD=B=;%^Q z=F!F_2Fq41N!DStl`_fN0_Pr!lKI5qUvAR~-$K?F zlDx`!qzNYG#TyXleANKWyXt7G>md0>RaY^3B+`PwxZCCg*5{;UX-O(dj2rK%IfS;( zH%trq!xakuugisHh;eA|s3bfkCAuWsC0TmXT_ES^YxjkgXOjCm@Hk?nz?Z47Q&9!M zXae;ttiU?o>}hg?rF=-r{Qf*Kv1u0*y^TL-utzi zER>_)T0H|feKc{NU1j>hdx{Lv@7^{Npbfs*feprTGR|OXG-Xx4p3da16&MQFCe?g* vIIcoheP=`K4B;8^Vj-;`Pme2^Tp`UMZjH+RW|E{6{+N@QIpl>||D}$F|82`Q5QD@iPO=T4Y!)bQSz(1)8MFg$0X00uwtr$Vrj=EDW>ALQ$65(MC zI;0onL5HAD5#m8YJBf%$bPTZ$9ioULRH8aWhh=N~Mhg2L-+SNt{eJKJ^DK*57E|XC z1fp2SF_3lTX!DY9v08_ZP8&T%{;o9{Z!(9>L{r?DObi+53HOG2!*X9!%X~!E8*V|A z&p-sy(3bM2wQ+6SzhMDEC76cIhIU!fMrkeOAK0g^gm$o{xSFeO7QR{r^q-2fy+*Zg zfTWl<5z6N8%&%4}+63VEHUo&U$mQ7-U0*xq{bnesmyy#a^ z;t#^-Z%1Y88rYE_WEFv$qcvK;Hu0ZU*w=bVTSnT71FgQz73m>+!Z)P5>^kpsnyiDb zIxqFzSDZJ1xq#gWKFofctqs9f8%8DdE)ny#&8|00|0=17ycetOid_p3iF>V1pUeJw z>0@P^DYi8ooq0-l9QkHG>;%&wA>=S=ce75wl zzFB_(?)oq!tzSnj!YkbO%6F(ON6fbN!Lf8E+)dXAf95{VGCb!#&cGWyb%%eDs(>`{ zfy{vIv9vKVHe?ctq8*;{+!h>#{EO#e)mK79684!!y2F?Zjf|NFLBbyI@z$4Kv%}cv YKq5&2h2Qyh($ -- 2.39.5