OSDN Git Service

[VM][FMTOWNS][SERIALROM] Implement correctness.Thanks to Soji Yamakawa-San.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 26 Jun 2020 16:46:01 +0000 (01:46 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 26 Jun 2020 16:46:01 +0000 (01:46 +0900)
source/src/vm/fmtowns/fmtowns.cpp
source/src/vm/fmtowns/serialrom.cpp
source/src/vm/fmtowns/serialrom.h

index 87fb6cd..a289cb1 100644 (file)
@@ -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);
index 13511c7..899a6d4 100644 (file)
 
 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);
index 91a46b1..51a700e 100644 (file)
@@ -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;
+       }
 };
 
 }