[WIP] PiSCSI boot ROM disabled for now

This commit is contained in:
beeanyew
2021-01-31 12:14:16 +01:00
parent b7b874cf89
commit 04bf2f6153
13 changed files with 288 additions and 227 deletions

View File

@@ -344,6 +344,15 @@ int main(int argc, char *argv[]) {
do_disasm = 1;
printf("Real time disassembly is now %s\n", realtime_disassembly ? "on" : "off");
}
if (c == 'D') {
int r = get_mapped_item_by_address(cfg, 0x08000000);
if (r != -1) {
printf("Dumping first 16MB of mapped range %d.\n", r);
FILE *dmp = fopen("./memdmp.bin", "wb+");
fwrite(cfg->map_data[r], 16 * SIZE_MEGA, 1, dmp);
fclose(dmp);
}
}
if (c == 's' && realtime_disassembly) {
do_disasm = 1;
}
@@ -436,6 +445,11 @@ unsigned int m68k_read_memory_8(unsigned int address) {
return v;
}*/
/*if (m68k_get_reg(NULL, M68K_REG_PC) >= 0x080032F0 && m68k_get_reg(NULL, M68K_REG_PC) <= 0x080032F0 + 0x4000) {
stop_cpu_emulation(1);
}*/
if (mouse_hook_enabled) {
if (address == CIAAPRA) {
unsigned char result = (unsigned int)read8((uint32_t)address);
@@ -482,6 +496,10 @@ unsigned int m68k_read_memory_8(unsigned int address) {
unsigned int m68k_read_memory_16(unsigned int address) {
PLATFORM_CHECK_READ(OP_TYPE_WORD);
/*if (m68k_get_reg(NULL, M68K_REG_PC) >= 0x080032F0 && m68k_get_reg(NULL, M68K_REG_PC) <= 0x080032F0 + 0x4000) {
stop_cpu_emulation(1);
}*/
/*if (address >= 0xE90000 && address < 0xF00000) {
printf("WORD read from DMAC @%.8X:", address);
uint32_t v = cdtv_dmac_read(address & 0xFFFF, OP_TYPE_WORD);
@@ -527,6 +545,10 @@ unsigned int m68k_read_memory_16(unsigned int address) {
unsigned int m68k_read_memory_32(unsigned int address) {
PLATFORM_CHECK_READ(OP_TYPE_LONGWORD);
/*if (m68k_get_reg(NULL, M68K_REG_PC) >= 0x080032F0 && m68k_get_reg(NULL, M68K_REG_PC) <= 0x080032F0 + 0x4000) {
stop_cpu_emulation(1);
}*/
/*if (address >= 0xE90000 && address < 0xF00000) {
printf("LONGWORD read from DMAC @%.8X:", address);
uint32_t v = cdtv_dmac_read(address & 0xFFFF, OP_TYPE_LONGWORD);

View File

@@ -45,7 +45,7 @@ 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 = 0;
extern uint8_t piscsi_diag_read;
extern void stop_cpu_emulation(uint8_t disasm_cur);
@@ -79,7 +79,7 @@ inline int custom_read_amiga(struct emulator_config *cfg, unsigned int addr, uns
if (addr >= piscsi_base && addr < piscsi_base + (64 * SIZE_KILO)) {
printf("[Amiga-Custom] %s read from PISCSI base @$%.8X.\n", op_type_names[type], addr);
stop_cpu_emulation(1);
//stop_cpu_emulation(1);
*val = handle_piscsi_read(addr, type);
return 1;
}
@@ -342,8 +342,8 @@ void setvar_amiga(struct emulator_config *cfg, char *var, char *val) {
printf("[AMIGA] PISCSI Interface Enabled.\n");
piscsi_enabled = 1;
piscsi_init();
ac_z2_type[ac_z2_pic_count] = ACTYPE_PSICSI;
ac_z2_pic_count++;
//ac_z2_type[ac_z2_pic_count] = ACTYPE_PSICSI;
//ac_z2_pic_count++;
adjust_ranges_amiga(cfg);
}
if (piscsi_enabled) {

View File

@@ -1,251 +1,228 @@
/* ConfigDev passed in a3 */
/*
struct ConfigDev {
struct Node cd_Node; // 0 2ptr,2byte,1ptr = 14byte
UBYTE cd_Flags; // 14
UBYTE cd_Pad; // 15
struct ExpansionRom cd_Rom; // 16 16bytes
APTR cd_BoardAddr; // 32
...
*/
.set SysBase,4
.set OpenLibrary,-552
.set CloseLibrary,-414
.set PutStr,-948
.set VPrintf,-954
.set AllocMem,-198
.set FindResident,-96
**
** Sample autoboot code fragment
**
** These are the calling conventions for the Diag routine
**
** A7 -- points to at least 2K of stack
** A6 -- ExecBase
** A5 -- ExpansionBase
** A3 -- your board's ConfigDev structure
** A2 -- Base of diag/init area that was copied
** A0 -- Base of your board
**
** Your Diag routine should return a non-zero value in D0 for success.
** If this value is NULL, then the diag/init area that was copied
** will be returned to the free memory pool.
**
start:
jmp realstart(pc)
handover:
jmp trampoline(pc)
INCLUDE "exec/types.i"
INCLUDE "exec/nodes.i"
INCLUDE "exec/resident.i"
INCLUDE "libraries/configvars.i"
.align 4
realstart:
movea.l SysBase,a6 /* allocate RAM for loading ourselves to */
move.l #0x40000,d0
moveq #0,d1 /* MEMF_ANY */
jsr AllocMem(a6)
tst.l d0
beq allocfail
; LVO's resolved by linking with library amiga.lib
XREF _LVOFindResident
move.l d0, a4 /* load addr */
ROMINFO EQU 0
ROMOFFS EQU $0
move.l (a7)+,a3 /* restore configdev address from stack */
jmp 0x24(a4) /* jmp to handover at new memory location (0x20+0x04) */
* ROMINFO defines whether you want the AUTOCONFIG information in
* the beginning of your ROM (set to 0 if you instead have PALS
* providing the AUTOCONFIG information instead)
*
* ROMOFFS is the offset from your board base where your ROMs appear.
* Your ROMs might appear at offset 0 and contain your AUTOCONFIG
* information in the high nibbles of the first $40 words ($80 bytes).
* Or, your autoconfig ID information may be in a PAL, with your
* ROMs possibly being addressed at some offset (for example $2000)
* from your board base. This ROMOFFS constant will be used as an
* additional offset from your configured board address when patching
* structures which require absolute pointers to ROM code or data.
.align 4
allocfail:
move.l d1,0xdff180
add.l #1,d1
bra allocfail
*----- We'll store Version and Revision in serial number
VERSION EQU 37 ; also the high word of serial number
REVISION EQU 1 ; also the low word of serial number
/* we will arrive here in our copy in amiga RAM */
/* a0 contains board addr, a3 contains configdev addr */
.align 4
trampoline:
lea configdev(pc),a1
move.l a3,(a1) /* store configdev pointer */
* See the Addison-Wesley Amiga Hardware Manual for more info.
move.l a4, a0 /* board addr not needed anymore, keep loadaddr in a0 */
MANUF_ID EQU 2011 ; CBM assigned (2011 for hackers only)
PRODUCT_ID EQU 1 ; Manufacturer picks product ID
/* add resident ---------------------- */
BOARDSIZE EQU $10000 ; How much address space board decodes
SIZE_FLAG EQU 3 ; Autoconfig 3-bit flag for BOARDSIZE
; 0=$800000(8meg) 4=$80000(512K)
; 1=$10000(64K) 5=$100000(1meg)
; 2=$20000(128K) 6=$200000(2meg)
; 3=$40000(256K) 7=$400000(4meg)
CODE
/* mntsd.device is at loadaddr + 0x400 (skip 2 blocks) */
move.l a0,-(a7)
add.l #0x400, a0
/* relocate the binary (hunk) */
jsr relocstart(pc)
move.l (a7)+, a0 /* address of loaded mntsd.device */
move.l a0, a4
move.l a4, a1 /* restore board addr */
AllocMem EQU -198
add.l #0x400+0x180, a1 /* start of mntsd.device + $180 = romtag FIXME */
move.l #0, d1 /* no seglist */
move.l 4,a6
jsr -102(a6) /* InitResident */
/* object = InitResident(resident, segList) */
/* D0 A1 D1 */
******* RomStart ***************************************************
**********************************************************************
/* make dos node --------------------- */
RomStart:
jmp initdos(pc)
******* DiagStart **************************************************
DiagStart: ; This is the DiagArea structure whose relative offset from
; your board base appears as the Init Diag vector in your
; autoconfig ID information. This structure is designed
; to use all relative pointers (no patching needed).
dc.b DAC_WORDWIDE+DAC_CONFIGTIME ; da_Config
dc.b 0 ; da_Flags
dc.w $4000 ; da_Size
dc.w DiagEntry-DiagStart ; da_DiagPoint
dc.w BootEntry-DiagStart ; da_BootPoint
dc.w DevName-DiagStart ; da_Name
dc.w 0 ; da_Reserved01
dc.w 0 ; da_Reserved02
.align 4
configdev:
.long 0
******* Resident Structure *****************************************
Romtag:
dc.w RTC_MATCHWORD ; UWORD RT_MATCHWORD
rt_Match: dc.l Romtag-DiagStart ; APTR RT_MATCHTAG
rt_End: dc.l EndCopy-DiagStart ; APTR RT_ENDSKIP
dc.b RTW_COLDSTART ; UBYTE RT_FLAGS
dc.b VERSION ; UBYTE RT_VERSION
dc.b NT_DEVICE ; UBYTE RT_TYPE
dc.b 20 ; BYTE RT_PRI
rt_Name: dc.l DevName-DiagStart ; APTR RT_NAME
rt_Id: dc.l IdString-DiagStart ; APTR RT_IDSTRING
rt_Init: dc.l Init-RomStart ; APTR RT_INIT
segtprs:
.long 0
.long 0
.align 4
relocstart:
lea.l segptrs(pc), a1
******* 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
move.l 8(a0), d4 /* number of hunks */
move.l #0, d5
DosName: dc.b 'dos.library',0 ; DOS library name
/*
a0: executable base addr
a1: segptrs
a2: addr of hunk0
DosDevName: dc.b 'ABC',0 ; dos device name for MakeDosNode()
; (dos device will be ABC:)
d4: numhunks
d5: pass#
d6: current hunk addr
*/
ds.w 0 ; word align
/* hunk 0 address in memory */
move.l a0, d6
add.l #0x24, d6
move.l d6, a2 /* addr of first hunk */
move.l d6, (a1) /* store pointer to this hunk in segptrs[1] */
******* DiagEntry **************************************************
**********************************************************************
*
* success = DiagEntry(BoardBase,DiagCopy, configDev)
* d0 a0 a2 a3
*
* Called by expansion architecture to relocate any pointers
* in the copied diagnostic area. We will patch the romtag.
* If you have pre-coded your MakeDosNode packet, BootNode,
* or device initialization structures, they would also need
* to be within this copy area, and patched by this routine.
*
**********************************************************************
relocpass:
move.l a2, a3
move.l 0x14(a0), d0 /* ptr to first hunk size */
DiagEntry:
nop
nop
nop
move.l #1,$80000020
lsl.l #2, d0 /* firsthunk + first size */
add.l d0, a3 /* end of first hunk, start of reloc table */
movea.l 4,a6
move.l #$40000,d0
moveq #0,d1
jsr AllocMem(a6)
jsr reloctables(pc)
nop
nop
move.l d0,$80000040
add.l #4, a3 /* skip hunk_end */
add.l #4, a3 /* skip hunk_data */
move.l (a3)+, d0 /* size of data hunk */
lsl.l #2, d0
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
move.l a3, 4(a1) /* store pointer to this hunk in segptrs[1] */
move.l a3, d6 /* save current hunk ptr for patching CHECKME */
add.l d0, a3 /* arrive at reloc tables of data hunk */
jsr reloctables(pc)
lea patchTable-RomStart(a0),a1 ; find patch table
adda.l #ROMOFFS,a1 ; adjusting for ROMOFFS
cmp #1, d5
bge rcomplete
* Patch relative pointers to labels within DiagCopy area
* by adding Diag RAM copy address. These pointers were coded as
* long relative offsets from base of the DiagArea structure.
*
dpatches:
move.l a2,d1 ;d1=base of ram Diag copy
dloop:
move.w (a1)+,d0 ;d0=word offs. into Diag needing patch
bmi.s bpatches ;-1 is end of word patch offset table
add.l d1,0(a2,d0.w) ;add DiagCopy addr to coded rel. offset
bra.s dloop
/* start pass 1 */
move.l #1, d5
move.l a2, d6 /* addr of first hunk */
bra relocpass
* Patches relative pointers to labels within the ROM by adding
* the board base address + ROMOFFS. These pointers were coded as
* long relative offsets from RomStart.
*
bpatches:
move.l a0,d1 ;d1 = board base address
add.l #ROMOFFS,d1 ;add offset to where your ROMs are
rloop:
move.w (a1)+,d0 ;d0=word offs. into Diag needing patch
bmi.s endpatches ;-1 is end of patch offset table
add.l d1,0(a2,d0.w) ;add ROM address to coded relative offset
bra.s rloop
rcomplete:
rts
endpatches:
moveq.l #1,d0 ; indicate "success"
rts
.align 4
reloctables:
move.l (a3)+, d2 /* skip 0000 03ec marker */
reloctable:
move.l (a3)+, d2 /* number of relocs to process */
tst.w d2
beq relocdone /* done if zero */
******* BootEntry **************************************************
**********************************************************************
move.l (a3)+, d1 /* segment number to point to */
BootEntry: 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
jsr (a0) ; and initialize DOS
rts
lsl.l #2, d1
move.l (a1,d1), d1 /* offset to add to target slots */
*
* End of the Diag copy area which is copied to RAM
*
EndCopy:
*************************************************************************
bra rloop
relocloop:
move.l (a3)+, a4
*************************************************************************
*
* Beginning of ROM driver code and data that is accessed only in
* the ROM space. This must all be position-independent.
*
tst.w d5 /* pass = 0? */
beq rloop
patchTable:
* Word offsets into Diag area where pointers need Diag copy address added
dc.w rt_Match-DiagStart
dc.w rt_End-DiagStart
dc.w rt_Name-DiagStart
dc.w rt_Id-DiagStart
dc.w -1
/* pass = 1, so patch */
add.l d6, a4 /* add current hunk address */
add.l d1, (a4) /* the actual patching */
* Word offsets into Diag area where pointers need boardbase+ROMOFFS added
dc.w rt_Init-DiagStart
dc.w -1
move.l d1, 0xdff180
rloop:
dbra d2, relocloop
jmp reloctable(pc)
relocdone:
rts
******* Romtag InitEntry **********************************************
*************************************************************************
.align 4
initdos:
move.l 4,a6
lea expansionname(pc),a1
Init: ; After Diag patching, our romtag will point to this
; routine in ROM so that it can be called at Resident
; initialization time.
; This routine will be similar to a normal expansion device
; initialization routine, but will MakeDosNode then set up a
; BootNode, and Enqueue() on eb_MountList.
;
rts
moveq #37, d0
jsr OpenLibrary(a6) /* open expansion.library */
tst.l d0
beq.s nodos
move.l d0,a6
; Rest of your position-independent device code goes here.
/*movem.l a0-a6/d0-d6,-(a7)
move.l #0xbeef,d2
lea.l fmtdebug(pc),a1
jsr printf(pc)
movem.l (a7)+,a0-a6/d0-d6*/
lea dosnode(pc),a0
lea diskname(pc),a1
move.l a1,(a0) /* store in parmpkt */
lea devicename(pc),a1
move.l a1,4(a0) /* store in parmpkt */
jsr -144(a6) /* MakeDosNode */
move.l d0, a0 /* fresh device node */
/* add boot node --------------------- */
move.l #0, d0
move.l #0, d1
move.l configdev(pc),a1
/*move.l #0, a1*/ /* later put ConfigDev here (a3) */
jsr -36(a6) /* AddBootNode */
move.l a6,a1 /* close expansion library */
move.l 4,a6
jsr CloseLibrary(a6)
moveq #1,d0
move.l (a7)+,a6
rts
nodos:
move.l d1,0xdff180
add.l #1,d1
bra nodos
moveq #1,d0
move.l (a7)+,a6
rts
.align 4
diskname:
.asciz "PDH0"
.align 4
devicename:
.asciz "pi-scsi.device"
.align 4
expansionname:
.asciz "expansion.library"
.align 4
dosnode:
.long 0 /* dos disk name */
.long 0 /* device file name */
.long 0 /* unit */
.long 0 /* flags */
.long 16 /* length of node? */
.long 128 /* longs in a block */
.long 0
.long 4 /* surfaces */
.long 1 /* sectors per block */
.long 256 /* blocks per track */
.long 2 /* reserved bootblocks 256 = 128KB */
.long 0
.long 0
.long 2 /* lowcyl FIXME */
/*.long 2047*/ /* hicyl */
.long 1023
.long 10 /* buffers */
.long 0 /* MEMF_ANY */
.long 0x0001fe00 /* MAXTRANS */
.long 0x7ffffffe /* Mask */
.long -1 /* boot prio */
.long 0x444f5303 /* dostype: DOS3 */
END

View File

@@ -1,4 +1,8 @@
#m68k-amigaos-gcc piscsi-amiga.c -ramiga-dev -noixemul -fbaserel -O2 -o pi-scsi.device -ldebug -lamiga -m68020
m68k-amigaos-gcc -m68020 -O2 -o pi-scsi.device -ramiga-dev -noixemul -fbaserel piscsi-amiga.c -ldebug -lamiga
m68k-amigaos-as -m68000 bootrom.s && m68k-amigaos-objcopy --strip-all ./a.out ./bootrom
m68k-amigaos-gcc -m68020 -O2 -o scsi.device -ramiga-dev -noixemul -fbaserel piscsi-amiga.c -ldebug -lamiga -D_FSCSIDEV
m68k-amigaos-gcc -m68020 -O2 -o 2nd.scsi.device -ramiga-dev -noixemul -fbaserel piscsi-amiga.c -ldebug -lamiga -D_FSCSI2ND
vasmm68k_mot.exe -m68020 -Fhunk -I$VBCC/NDK39/include/include_i bootrom.s -o a.out
#m68k-amigaos-as -m68020 bootrom.s &&
m68k-amigaos-objcopy --strip-all ./a.out ./bootrom
rm ./a.out

View File

@@ -20,9 +20,15 @@ int main(int argc, char *argv[]) {
fclose(rom);
return 1;
}
FILE *device = fopen("pi-scsi.device", "rb");
FILE *device = NULL;
if (argc > 1) {
device = fopen(argv[1], "rb");
}
else {
device = fopen("pi-scsi.device", "rb");
}
if (!device) {
printf("Could not open file pi-scsi.device for reading.\n");
printf("Could not open device file for reading.\n");
fclose(rom);
fclose(out);
return 1;

View File

@@ -81,11 +81,17 @@ struct piscsi_base {
struct ExecBase* SysBase = NULL;
#ifdef _FSCSIDEV
const char DevName[] = "scsi.device";
#elif _FSCSI2ND
const char DevName[] = "2nd.scsi.device";
#else
const char DevName[] = "pi-scsi.device";
#endif
const char DevIdString[] = "Pi-SCSI 0.1";
const UWORD DevVersion = 1;
const UWORD DevRevision = 0;
const UWORD DevVersion = 43;
const UWORD DevRevision = 10;
#include "stabs.h"
@@ -147,6 +153,8 @@ uint32_t __UserDevOpen(struct IOExtTD *iotd, uint32_t num, uint32_t flags) {
struct Node* node = (struct Node*)iotd;
int io_err = IOERR_OPENFAIL;
WRITESHORT(PISCSI_CMD_DEBUGME, 1);
int unit_num = 0;
WRITELONG(PISCSI_CMD_DRVNUM, num);
READLONG(PISCSI_CMD_DRVNUM, unit_num);
@@ -174,10 +182,6 @@ uint32_t __UserDevClose(struct IOExtTD *iotd) {
void exit(int status) { }
int main() {
return 0;
}
ADDTABL_1(__BeginIO,a1);
void __BeginIO(struct IORequest *io) {
if (dev_base == NULL || io == NULL)

Binary file not shown.

View File

@@ -30,5 +30,7 @@ enum piscsi_cmds {
PISCSI_CMD_ADDR2 = 0x14,
PISCSI_CMD_ADDR3 = 0x18,
PISCSI_CMD_ADDR4 = 0x1C,
PISCSI_CMD_DEBUGME = 0x20,
PISCSI_CMD_DRIVER = 0x40,
PISCSI_CMD_ROM = 0x4000,
};

View File

@@ -83,6 +83,7 @@ void piscsi_unmap_drive(uint8_t index) {
}
extern struct emulator_config *cfg;
extern void stop_cpu_emulation(uint8_t disasm_cur);
void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) {
int32_t r;
@@ -167,6 +168,51 @@ void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type) {
piscsi_cur_drive = val;
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");
stop_cpu_emulation(1);
break;
case PISCSI_CMD_DRIVER: {
printf("[PISCSI] Driver copy/patch called, destination address %.8X.\n", val);
int r = get_mapped_item_by_address(cfg, val);
if (r != -1) {
uint32_t addr = val - cfg->map_offset[r];
uint32_t rt_offs = 0;
uint8_t *dst_data = cfg->map_data[r];
memcpy(dst_data + addr, piscsi_rom_ptr + 0x400, 0x3C00);
uint32_t base_offs = be32toh(*((uint32_t *)&dst_data[addr + 0x170])) + 2;
rt_offs = val + 0x16E;
printf ("Offset 1: %.8X -> %.8X\n", base_offs, rt_offs);
*((uint32_t *)&dst_data[addr + 0x170]) = htobe32(rt_offs);
uint32_t offs = be32toh(*((uint32_t *)&dst_data[addr + 0x174]));
printf ("Offset 2: %.8X -> %.8X\n", offs, (offs - base_offs) + rt_offs);
*((uint32_t *)&dst_data[addr + 0x174]) = htobe32((offs - base_offs) + rt_offs);
dst_data[addr + 0x178] |= 0x07;
offs = be32toh(*((uint32_t *)&dst_data[addr + 0x17C]));
printf ("Offset 3: %.8X -> %.8X\n", offs, (offs - base_offs) + rt_offs);
*((uint32_t *)&dst_data[addr + 0x17C]) = htobe32((offs - base_offs) + rt_offs);
offs = be32toh(*((uint32_t *)&dst_data[addr + 0x180]));
printf ("Offset 4: %.8X -> %.8X\n", offs, (offs - base_offs) + rt_offs);
*((uint32_t *)&dst_data[addr + 0x180]) = htobe32((offs - base_offs) + rt_offs);
offs = be32toh(*((uint32_t *)&dst_data[addr + 0x184]));
printf ("Offset 5: %.8X -> %.8X\n", offs, (offs - base_offs) + rt_offs);
*((uint32_t *)&dst_data[addr + 0x184]) = htobe32((offs - base_offs) + rt_offs);
}
else {
for (int i = 0; i < 0x3C00; i++) {
uint8_t src = piscsi_rom_ptr[0x400 + i];
write8(addr + i, src);
}
}
break;
}
default:
printf("[PISCSI] Unhandled %s register write to %.8X: %d\n", op_type_names[type], addr, val);
break;
@@ -205,7 +251,7 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) {
if ((addr & 0xFFFF) >= PISCSI_CMD_ROM) {
uint32_t romoffs = (addr & 0xFFFF) - PISCSI_CMD_ROM;
if (romoffs < 14 && !piscsi_diag_read) {
/*if (romoffs < 14 && !piscsi_diag_read) {
printf("[PISCSI] %s read from DiagArea @$%.4X: ", op_type_names[type], romoffs);
uint32_t v = 0;
switch (type) {
@@ -226,7 +272,7 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) {
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;

Binary file not shown.