From fc1028e8533992f73e68ed379bb948fe11d18c75 Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Wed, 26 Jun 2024 11:41:50 +0800 Subject: [PATCH] Remove faulty assumption, do not assert on scsi read, fix faulty error report line --- csr.c | 2 +- emu.c | 16 +++++++--------- mapper.c | 11 ++++++----- scsi_dev_hd.c | 4 +++- uart.c | 2 +- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/csr.c b/csr.c index e96cee0..bc9cafb 100644 --- a/csr.c +++ b/csr.c @@ -251,7 +251,7 @@ unsigned int csr_read32(void *obj, unsigned int a) { unsigned int csr_read8(void *obj, unsigned int a) { //fake using read16 if (a&1) { - return csr_read16(obj, a-1); + return csr_read16(obj, a-1)&0xff; } else { return csr_read16(obj, a)>>8; } diff --git a/emu.c b/emu.c index 321f7e9..4d10f66 100644 --- a/emu.c +++ b/emu.c @@ -314,14 +314,15 @@ static int check_mem_access(unsigned int address, int flags) { int access=mapper_access_allowed(mapper, address, flags); if (access!=ACCESS_ERROR_OK) { if (log_level_active(LOG_SRC_MAPPER, LOG_DEBUG)) { - EMU_LOG_INFO("Illegal access! Access %x\n", address); + EMU_LOG_INFO("Illegal access! Access %x. Generating bus error.\n", address); dump_cpu_state(); dump_callstack(); } csr_set_access_error(csr, cur_cpu, access, address, flags&ACCESS_W); - //note THIS WILL NOT RETURN! - //(m68ki_exception_bus_error ends with a longjmp) + //note: THIS WILL NOT RETURN! + //(m68k_pulse_bus error calls m68ki_exception_bus_error, which + //ends with a longjmp.) m68k_pulse_bus_error(); return 0; } @@ -619,10 +620,6 @@ void setup_nop(const char *name) { void m68k_fc_cb(unsigned int fc) { fc_bits=fc; mapper_set_sysmode(mapper, fc&4); - //Guess: mapid resets on int? - if ((fc&0x7)==7) { - mapper_set_mapid(mapper, 0); - } } //has a level if triggered, otherwise 0 @@ -703,7 +700,7 @@ void m68k_trace_cb(unsigned int pc) { if (ir==0x4E75) callstack_ptr[cur_cpu]--; prev_pc=pc; unsigned int sr=m68k_get_reg(NULL, M68K_REG_SR); - if (do_tracefile) fprintf(tracefile, "%d %d %06x %x\n", insn_id, cur_cpu, pc, sr); + if (do_tracefile&(1<rtcram); diff --git a/mapper.c b/mapper.c index 056c37b..1773df1 100644 --- a/mapper.c +++ b/mapper.c @@ -63,9 +63,12 @@ void mapper_set_mapid(mapper_t *m, uint8_t id) { static int access_allowed_page(mapper_t *m, unsigned int page, int access_flags) { assert(page<4096); unsigned int ac=(m->desc[page].w1<<16)+m->desc[page].w0; + //Set fault to the access flags we need but are not set in the page. int fault=(ac&access_flags)&(ACCESS_R|ACCESS_W|ACCESS_X); int uid=(ac>>W0_UID_SHIFT)&W0_UID_MASK; if ((access_flags&ACCESS_SYSTEM)==0) { + //If there's an uid fault, we set the lower 8 bits to 0xff + //and make the next 8 bits the uid. if (uid != m->cur_id) fault=(uid<<8|0xff); } if (fault) { @@ -73,7 +76,7 @@ static int access_allowed_page(mapper_t *m, unsigned int page, int access_flags) if (fault&(W1_W<<16)) MAPPER_LOG_DEBUG("write violation "); if (fault&(W1_R<<16)) MAPPER_LOG_DEBUG("read violation "); if (fault&(W1_X<<16)) MAPPER_LOG_DEBUG("execute violation "); - if (fault&0xff00) MAPPER_LOG_DEBUG("proc uid %d page uid %d ", m->cur_id, uid); + if (fault&0xff) MAPPER_LOG_DEBUG("proc uid %d page uid %d ", m->cur_id, uid); MAPPER_LOG_DEBUG(")\n"); } return fault; @@ -117,7 +120,6 @@ void mapper_write16(void *obj, unsigned int a, unsigned int val) { } else { m->desc[a/2].w0=val; } - if (a/2==2048) MAPPER_LOG_DEBUG("write page %d, w%d. w0=%x, w1=%x\n", a/2, a&1, m->desc[a/2].w0, m->desc[a/2].w1); } void mapper_write32(void *obj, unsigned int a, unsigned int val) { @@ -129,7 +131,6 @@ void mapper_write32(void *obj, unsigned int a, unsigned int val) { unsigned int mapper_read16(void *obj, unsigned int a) { mapper_t *m=(mapper_t*)obj; a=a/2; //word addr - if (a/2==2048) MAPPER_LOG_DEBUG("read page %d, w%d. w0=%x, w1=%x\n", a/2, a&1, m->desc[a/2].w0, m->desc[a/2].w1); if (a&1) { return m->desc[a/2].w1; } else { @@ -140,9 +141,9 @@ unsigned int mapper_read16(void *obj, unsigned int a) { void mapper_write8(void *obj, unsigned int a, unsigned int val) { int v=mapper_read16(obj, a&~1); if (a&1) { - v=(v&0xFF00)|val; + v=(v&0xFF00)|(val&0xff); } else { - v=(v&0xFF)|(val<<8); + v=(v&0xFF)|((val<<8)&0xff000); } mapper_write16(obj, a&~1, v); } diff --git a/scsi_dev_hd.c b/scsi_dev_hd.c index 5645dd1..60ff988 100644 --- a/scsi_dev_hd.c +++ b/scsi_dev_hd.c @@ -40,6 +40,8 @@ static int hd_handle_cmd(scsi_dev_t *dev, uint8_t *cd, int len) { return SCSI_DEV_DATA_IN; } else if (cd[0]==0x15) { //mode select return SCSI_DEV_DATA_OUT; + } else if (cd[0]==0xa) { //write + return SCSI_DEV_DATA_IN; } else if (cd[0]==0xC2) { //omti config cmd? return SCSI_DEV_DATA_IN; @@ -72,7 +74,7 @@ int hd_handle_data_in(scsi_dev_t *dev, uint8_t *msg, int buflen) { //omti config command? } else { printf("Unknown command: 0x%x\n", hd->cmd[0]); - assert(0 && "hd_handle_data_in: unknown cmd"); +// assert(0 && "hd_handle_data_in: unknown cmd"); } return 0; } diff --git a/uart.c b/uart.c index 552d3ab..a2b3a24 100644 --- a/uart.c +++ b/uart.c @@ -205,7 +205,7 @@ unsigned int uart_read8(void *obj, unsigned int addr) { // Poll for console input if the emulated device might be expecting data // (done at top of function because .has_char_rcv being set will determine // if the character is ever read; so we cannot only do it in read character) - if (u->is_console && !is_in_loopback && !u->chan[chan].has_char_rcv) { + if (chan==1 && u->is_console && !is_in_loopback && !u->chan[chan].has_char_rcv) { int in_ch = uart_poll_for_console_character(); if (in_ch >= 0) { u->chan[chan].char_rcv = in_ch;