From: K.Ohta Date: Fri, 26 Jun 2020 16:46:01 +0000 (+0900) Subject: [VM][FMTOWNS][SERIALROM] Implement correctness.Thanks to Soji Yamakawa-San. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=d2322eb3793c06a3056ed10245d49c6a865a79d4;p=csp-qt%2Fcommon_source_project-fm7.git [VM][FMTOWNS][SERIALROM] Implement correctness.Thanks to Soji Yamakawa-San. --- diff --git a/source/src/vm/fmtowns/fmtowns.cpp b/source/src/vm/fmtowns/fmtowns.cpp index 87fb6cdee..a289cb143 100644 --- a/source/src/vm/fmtowns/fmtowns.cpp +++ b/source/src/vm/fmtowns/fmtowns.cpp @@ -658,6 +658,10 @@ void VM::set_machine_type(uint16_t machine_id, uint16_t cpu_id) scsi->set_cpu_id(cpu_id); scsi->set_machine_id(machine_id); } + if(serialrom != NULL) { + serialrom->set_cpu_id(cpu_id); + serialrom->set_machine_id(machine_id); + } #if defined(HAS_20PIX_FONTS) if(fontrom_20pix != NULL) { fontrom_20pix->set_cpu_id(cpu_id); diff --git a/source/src/vm/fmtowns/serialrom.cpp b/source/src/vm/fmtowns/serialrom.cpp index 13511c75f..899a6d4fc 100644 --- a/source/src/vm/fmtowns/serialrom.cpp +++ b/source/src/vm/fmtowns/serialrom.cpp @@ -12,45 +12,13 @@ namespace FMTOWNS { -// POS=rom bit position, c=data -void SERIAL_ROM::store_reversed_byte(uint8_t pos, uint8_t c) -{ - int npos = (256 - (uint16_t)pos) >> 3; - int bitpos = (256 - (uint16_t)pos) & 7; - uint8_t dst = 0x00; - for(int i = 0; i < 8; i++) { - dst <<= 1; - dst = dst | ((c >> i)& 0x01); - } - if(bitpos == 0) { - rom[npos] = dst; - } else { - pair16_t tmp; - pair16_t mask; - tmp.b.l = rom[npos]; - if(npos < 31) { - tmp.b.h = rom[npos + 1]; - } else { - tmp.b.h = 0x00; - } - mask.b.h = 0x00; - mask.b.l = 0xff; - mask.w <<= bitpos; - tmp.w = tmp.w & (~mask.w); - uint16_t data; - data = dst; - data <<= bitpos; - tmp.w = tmp.w | data; - if(npos < 31) { - rom[npos + 1] = tmp.b.h; - } - rom[npos] = tmp.b.l; - } -} uint8_t SERIAL_ROM::read_rom_bits(uint8_t pos) { - return ((rom[pos >> 3] >> (pos & 7)) & 0x01); + uint8_t bytepos = 31 - (pos >> 3); + uint8_t bit = 1 << (pos & 7); + uint8_t val = ((rom[bytepos] & bit) != 0) ? 1 : 0; + return val; } void SERIAL_ROM::initialize() @@ -66,6 +34,20 @@ void SERIAL_ROM::initialize() memset(tmprom, 0xff, sizeof(tmprom)); bool loaded = false; FILEIO *fio = new FILEIO(); + + // Default values are from Tsugaru, physmem.cpp. + unsigned char defSerialROM[32]= + { + 0x04,0x65,0x54,0xA4,0x95,0x45,0x35,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0x0C,0x02,0x00,0x00,0x00,0x15,0xE0,0x00,0x00, + }; + memcpy(tmprom, defSerialROM, + (sizeof(tmprom) > sizeof(defSerialROM)) ? sizeof(defSerialROM) : sizeof(tmprom)); + + // Q: Is override machineid? 20200627 K.O + tmprom[24] = (machine_id >> 8); + tmprom[25] = (machine_id & 0xf8) | (cpu_id & 0x07); + if(fio->Fopen(create_local_path(_T("MYTOWNS.ROM")), FILEIO_READ_BINARY)) { // FONT fio->Fread(tmprom, sizeof(tmprom), 1); fio->Fclose(); @@ -75,42 +57,6 @@ void SERIAL_ROM::initialize() fio->Fclose(); loaded = true; } - if(loaded) { - // Q: IS MYTOWNS.ROM reverse bit-order? 20191117 K.O - //memcpy(rom, tmprom, sizeof(rom)); - for(uint8_t i = 0; i < 32; i++) { - store_reversed_byte(i << 3, tmprom[i]); - } - } else { - rom[255 >> 3] = rom[255 >> 3] & 0x0f; // Clear head of 4 bits. - static const _TCHAR signature[] = _T("FUJITSU"); - for(int i = 0; i < strlen(signature); i++) { - store_reversed_byte((uint8_t)(244 - (i * 8)), signature[i]); - } - // ToDo: Reserved BITs (bit 195 - bit 72) - // Machine ID - store_reversed_byte(64, 0x01); - store_reversed_byte(56, 0x01); - // SERIAL (DUMMY) - static const uint8_t serial_num[5] = {0xbc, 0xde, 0xf0, 0x12, 0x34}; - uint8_t tmp1 = rom[48 >> 3]; - uint8_t tmp2 = serial_num[0] & 0x0f; - uint8_t dst = 0; - for(int i = 0; i < 4; i++) { - dst <<= 1; - dst = dst | (tmp2 & 0x01); - tmp2 >>= 1; - } - tmp1 = tmp1 & 0xf0; - rom[48 >> 3] = tmp1 | (dst & 0x0f); - for(int i = 1; i < 5; i++) { - store_reversed_byte(20 + ((4 - i) << 3), serial_num[i]); - } - // Clear bit 19 - bit0 - rom[16 >> 3] = rom[16 >> 3] & 0xf0; - rom[8 >> 3] = 0x00; - rom[0 >> 3] = 0x00; - } } void SERIAL_ROM::reset() @@ -226,80 +172,18 @@ bool SERIAL_ROM::write_debug_reg(const _TCHAR *reg, uint32_t data) { _TCHAR numseg[8] = {'\0'}; int noff = 0; - if((reg[0] == 'R') || (reg[0] == 'r')){ - if(strlen(reg) < 2) return false; - if((reg[1] == 'R') || (reg[1] == 'r')) { // Reversed bit - noff = 1; - } - for(int i = 0; i < 2; i++) { - if(reg[i + noff + 1] == '\0') break; - if((reg[i + noff + 1] < '0') || (reg[i + noff + 1] >'9')) break; - numseg[i] = reg[i + noff + 1]; - } - if(strlen(numseg) < 1) return false; - int pos = atoi(numseg); - if((pos < 0) || (pos > 31)) return false; - if((reg[1] == 'R') || (reg[1] == 'r')) { // Reversed bit - uint8_t dst = 0; - for(int i = 0; i <8; i++) { - dst <<= 1; - dst = dst | (data & 0x01); - data >>= 1; - } - rom[pos] = dst; - } else { - rom[pos] = data; - } - return true; - } else if((reg[0] == 'B') || (reg[0] == 'b')){ - if(strlen(reg) < 2) return false; - if((reg[1] == 'R') || (reg[1] == 'r')) { // Reversed bit - noff = 1; - } - for(int i = 0; i < 3; i++) { - if(reg[i + noff + 1] == '\0') break; - if((reg[i + noff + 1] < '0') || (reg[i + noff + 1] >'9')) break; - numseg[i] = reg[i + noff + 1]; - } - if(strlen(numseg) < 1) return false; - int bitpos = atoi(numseg); - if((bitpos < 0) || (bitpos > 255)) return false; - int bytepos = bitpos >> 3; - int offs = bitpos & 7; - uint8_t dst = rom[bytepos]; - if((reg[1] == 'R') || (reg[1] == 'r')) { // Reversed bit - offs = 7 - offs; - } - dst = dst & (~(0x01 << offs)); - dst = dst | ((data & 0x01) << offs); - rom[bytepos] = dst; - return true; - } + // ToDo: Implement return false; } bool SERIAL_ROM::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) { - uint8_t reverse_mem[32]; - memset(reverse_mem, 0x00, sizeof(reverse_mem)); - for(int i = 0; i < 32; i++) { - uint8_t dst = 0x00; - uint8_t src = rom[i]; - for(int j = 0; j < 8; j++) { - dst <<= 1; - dst |= (src & 0x01); - src >>= 1; - } - reverse_mem[i] = dst; - } // Dump raw value my_tcscat_s(buffer, buffer_len, _T("** INFO:\n")); my_tcscat_s(buffer, buffer_len, _T("ROM value is enable to modify, \n")); my_tcscat_s(buffer, buffer_len, _T(" R00-R32 : Overwrite rom raw value by byte\n")); - my_tcscat_s(buffer, buffer_len, _T(" RR00-RR32 : Overwrite rom reversed value by byte\n")); my_tcscat_s(buffer, buffer_len, _T(" B000-B256 : Overwrite bit foo to (value != 0) ? 1 : 0\n")); - my_tcscat_s(buffer, buffer_len, _T(" BR000-BR256 : Overwrite bit foo to (value != 0) ? 1 : 0 by reversed order.\n\n")); my_tcscat_s(buffer, buffer_len, _T("** STATS:\n")); my_tcscat_s(buffer, buffer_len, @@ -322,18 +206,6 @@ bool SERIAL_ROM::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) rom[n * 4 + 4], rom[n * 4 + 5], rom[n * 4 + 6], rom[n * 4 + 7]) ); } - my_tcscat_s(buffer, buffer_len, _T("\n")); - my_tcscat_s(buffer, buffer_len, _T("** BIT REVERSED VALUE:\n")); - my_tcscat_s(buffer, buffer_len, _T(" +0 +1 +2 +3 +4 +5 +6 +7\n")); - my_tcscat_s(buffer, buffer_len, _T(" ------------------------------\n")); - for(int n = 0; n < 4; n++) { - my_tcscat_s(buffer, buffer_len, - create_string(_T("+%02X %02X %02X %02X %02X %02X %02X %02X %02X\n"), - n * 4, - reverse_mem[n * 4 + 0], reverse_mem[n * 4 + 1], reverse_mem[n * 4 + 2], reverse_mem[n * 4 + 3], - reverse_mem[n * 4 + 4], reverse_mem[n * 4 + 5], reverse_mem[n * 4 + 6], reverse_mem[n * 4 + 7]) - ); - } return true; } @@ -347,6 +219,8 @@ bool SERIAL_ROM::process_state(FILEIO* state_fio, bool loading) if(!state_fio->StateCheckInt32(this_device_id)) { return false; } + state_fio->StateValue(machine_id); + state_fio->StateValue(cpu_id); state_fio->StateValue(cs); state_fio->StateValue(clk); state_fio->StateValue(reset_reg); diff --git a/source/src/vm/fmtowns/serialrom.h b/source/src/vm/fmtowns/serialrom.h index 91a46b1ad..51a700e3e 100644 --- a/source/src/vm/fmtowns/serialrom.h +++ b/source/src/vm/fmtowns/serialrom.h @@ -23,17 +23,22 @@ class SERIAL_ROM : public DEVICE { private: uint8_t read_rom_bits(uint8_t pos); - void store_reversed_byte(uint8_t pos, uint8_t c); - protected: bool cs; bool clk; bool reset_reg; int reset_state; + uint8_t rom_addr; uint8_t rom[32]; + + uint16_t machine_id; + uint8_t cpu_id; public: - SERIAL_ROM(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu) { + SERIAL_ROM(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu) + { + machine_id = 0x0100; + cpu_id = 0x01; set_device_name(_T("FMTOWNS_SERIAL_ROM")); } ~SERIAL_ROM() {} @@ -51,6 +56,15 @@ public: bool process_state(FILEIO* state_fio, bool loading); + // unique function + void set_machine_id(uint16_t val) + { + machine_id = val & 0xfff8; + } + void set_cpu_id(uint16_t val) + { + cpu_id = val & 0x07; + } }; }