OSDN Git Service

[VM][AY_3_891X] Add feature ; dump/set register via debugger.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 15 Aug 2019 12:56:20 +0000 (21:56 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Thu, 15 Aug 2019 12:56:20 +0000 (21:56 +0900)
[VM][AY_3_891X] Fix not supported defines, replace flags.

source/src/debugger.cpp
source/src/vm/ay_3_891x.cpp
source/src/vm/ay_3_891x.h
source/src/vm/common_vm/CMakeLists.txt

index c94ee2f..1031b15 100644 (file)
@@ -20,6 +20,8 @@
 #include <pthread.h>
 #include <time.h>
 #include <sys/time.h>
+#include <string>
+#include <list>
 #ifdef USE_DEBUGGER
 
 static FILEIO* logfile = NULL;
@@ -250,6 +252,16 @@ void show_break_reason(OSD *osd, DEVICE *cpu, DEVICE *target, bool hide_bp)
        }
 }
 
+void set_dbg_completion_list(OSD *osd, std::list<std::string> *p)
+{
+       osd->set_dbg_completion_list(p);
+}
+
+void clear_dbg_completion_list(OSD *osd)
+{
+       osd->clear_dbg_completion_list();
+}
+
 #ifdef _MSC_VER
 unsigned __stdcall debugger_thread(void *lpx)
 #else
@@ -260,6 +272,124 @@ void* debugger_thread(void *lpx)
        p->running = true;
        
        // initialize console
+       std::list<std::string> helplist;
+       std::list<std::string> complist;
+
+       helplist.clear();
+       complist.clear();
+       // Initialize help
+       helplist.push_back("D [<range>] - dump memory");
+       helplist.push_back("E[{B,W,D}] <address> <list> - edit memory (byte,word,dword)");
+       helplist.push_back("EA <address> \"<value>\" - edit memory (ascii)");
+       helplist.push_back("I[{B,W,D}] <port> - input port (byte,word,dword)");
+       helplist.push_back("O[{B,W,D}] <port> <value> - output port (byte,word,dword)");
+       helplist.push_back("R - show register(s)");
+       helplist.push_back("R <reg> <value> - edit register");
+       helplist.push_back("S <range> <list> - search");
+       helplist.push_back("U [<range>] - unassemble");
+       helplist.push_back("UT [<steps> | <steps> <logging_file>] - unassemble back trace");
+       helplist.push_back("H <value> <value> - hexadd");
+       helplist.push_back("N <filename> - name");
+       helplist.push_back("L [<range>] - load binary/hex/symbol file");
+       helplist.push_back("W <range> - write binary/hex file");
+       helplist.push_back("SC - clear symbol(s)");
+       helplist.push_back("SL - list symbol(s)");
+       helplist.push_back("BX [ON|OFF] - ON/OFF to STOP ON EXCEPTION");
+       helplist.push_back("BP <address> - set breakpoint");
+       helplist.push_back("{R,W}BP <address> - set breakpoint (break at memory access)");
+       helplist.push_back("{I,O}BP <port> [<mask>] - set breakpoint (break at i/o access)");
+       helplist.push_back("[{R,W,I,O}]B{C,D,E} {*,<list>} - clear/disable/enable breakpoint(s)");
+       helplist.push_back("[{R,W,I,O}]BL - list breakpoints");
+       helplist.push_back("[{R,W,I,O}]CP <address/port> [<mask>] - set checkpoint (don't break)");
+                               
+       helplist.push_back("G - go (press esc key to break)");
+       helplist.push_back("G <address> - go and break at address (ignore breakpoints)");
+       helplist.push_back("P - trace one opcode (step over, ignore breakpoints)");
+       helplist.push_back("T [<count>] - trace (step in)");
+       helplist.push_back("Q - quit");
+                               
+       helplist.push_back("> <filename> - output logfile");
+       helplist.push_back("< <filename> - input commands from file");
+                               
+       helplist.push_back("! reset [all/cpu/target] - reset");
+       helplist.push_back("! key <code> [<msec>] - press key");
+       helplist.push_back("! device - enumerate debugger available device");
+       helplist.push_back("! device <id/cpu> - select target device");
+       helplist.push_back("! cpu - enumerate debugger available cpu");
+       helplist.push_back("! cpu <id> - select target cpu");
+       helplist.push_back("!! <remark> - do nothing");
+
+       helplist.push_back("<value> - hexa, decimal(%%d), ascii('a')");
+
+       complist.push_back("D [RANGE]");
+       complist.push_back("EB <ADDR> <LIST...>");
+       complist.push_back("EW <ADDR> <LIST...>");
+       complist.push_back("ED  <ADDR> <LIST...>");
+       complist.push_back("EA <ADDR> \"VALUE\"");
+       complist.push_back("IB <PORT>");
+       complist.push_back("IW <PORT>");
+       complist.push_back("ID <PORT>");
+       complist.push_back("OB <PORT>");
+       complist.push_back("OW <PORT>");
+       complist.push_back("OD <PORT>");
+       complist.push_back("R [REG VALUE]");
+       complist.push_back("S <RANGE> <LIST>");
+       complist.push_back("U [RANGE]");
+       complist.push_back("UT [STEPS [LOGGING_FILE]]");
+       complist.push_back("H <VAL1> <VBAL2>");
+       complist.push_back("N <filename>");
+       complist.push_back("L [RANGE]");
+       complist.push_back("W [RANGE]");
+       complist.push_back("SC");
+       complist.push_back("SL");
+       complist.push_back("BX ON");
+       complist.push_back("BX OFF");
+       complist.push_back("BP <ADDRESS>");
+       complist.push_back("RBP <ADDRESS>");
+       complist.push_back("WBP <ADDRESS>");
+       complist.push_back("IBP <PORT> [MASK]");
+       complist.push_back("OBP <PORT> [MASK]");
+       complist.push_back("RBC [* | LIST]");
+       complist.push_back("RBD [* | LIST]");
+       complist.push_back("RBE [* | LIST]");
+       complist.push_back("WBC [* | LIST]");
+       complist.push_back("WBD [* | LIST]");
+       complist.push_back("WBE [* | LIST]");
+       complist.push_back("IBC [* | LIST]");
+       complist.push_back("IBD [* | LIST]");
+       complist.push_back("IBE [* | LIST]");
+       complist.push_back("OBC [* | LIST]");
+       complist.push_back("OBD [* | LIST]");
+       complist.push_back("OBE [* | LIST]");
+       complist.push_back("RBL");
+       complist.push_back("WBL");
+       complist.push_back("IBL");
+       complist.push_back("OBL");
+       complist.push_back("RCP <ADDDRESS/PORT> [MASK]");
+       complist.push_back("WCP <ADDDRESS/PORT> [MASK]");
+       complist.push_back("ICP <ADDDRESS/PORT> [MASK]");
+       complist.push_back("OCP <ADDDRESS/PORT> [MASK]");
+       complist.push_back("G [ADDDRESS]");
+       complist.push_back("P");
+       complist.push_back("T [COUNT]");
+       complist.push_back("Q");
+       complist.push_back("> <FILENAME>");
+       complist.push_back("< <FILENAME>");
+
+       complist.push_back("! reset");
+       complist.push_back("! reset all");
+       complist.push_back("! reset <CPU/TARGET>");
+
+       complist.push_back("! key <CODE> [MSEC]");
+       complist.push_back("! device");
+       complist.push_back("! device <ID/CPU>");
+
+       complist.push_back("! cpu");
+       complist.push_back("! cpu <id>");
+
+       complist.push_back("!! <REM>");
+       set_dbg_completion_list(p->osd, &complist);
+
        _TCHAR buffer[8192];
        bool cp932 = (p->osd->get_console_code_page() == 932);
        
@@ -1459,48 +1589,11 @@ RESTART_GO:
                        } else if(_tcsicmp(params[0], _T("!!")) == 0) {
                                // do nothing
                        } else if(_tcsicmp(params[0], _T("?")) == 0) {
-                               my_printf(p->osd, _T("D [<range>] - dump memory\n"));
-                               my_printf(p->osd, _T("E[{B,W,D}] <address> <list> - edit memory (byte,word,dword)\n"));
-                               my_printf(p->osd, _T("EA <address> \"<value>\" - edit memory (ascii)\n"));
-                               my_printf(p->osd, _T("I[{B,W,D}] <port> - input port (byte,word,dword)\n"));
-                               my_printf(p->osd, _T("O[{B,W,D}] <port> <value> - output port (byte,word,dword)\n"));
-                               my_printf(p->osd, _T("R - show register(s)\n"));
-                               my_printf(p->osd, _T("R <reg> <value> - edit register\n"));
-                               my_printf(p->osd, _T("S <range> <list> - search\n"));
-                               my_printf(p->osd, _T("U [<range>] - unassemble\n"));
-                               my_printf(p->osd, _T("UT [<steps> | <steps> <logging_file>] - unassemble back trace\n"));
-                               my_printf(p->osd, _T("H <value> <value> - hexadd\n"));
-                               my_printf(p->osd, _T("N <filename> - name\n"));
-                               my_printf(p->osd, _T("L [<range>] - load binary/hex/symbol file\n"));
-                               my_printf(p->osd, _T("W <range> - write binary/hex file\n"));
-                               my_printf(p->osd, _T("SC - clear symbol(s)\n"));
-                               my_printf(p->osd, _T("SL - list symbol(s)\n"));
-                               my_printf(p->osd, _T("BX [ON|OFF] - ON/OFF to STOP ON EXCEPTION\n"));
-                               my_printf(p->osd, _T("BP <address> - set breakpoint\n"));
-                               my_printf(p->osd, _T("{R,W}BP <address> - set breakpoint (break at memory access)\n"));
-                               my_printf(p->osd, _T("{I,O}BP <port> [<mask>] - set breakpoint (break at i/o access)\n"));
-                               my_printf(p->osd, _T("[{R,W,I,O}]B{C,D,E} {*,<list>} - clear/disable/enable breakpoint(s)\n"));
-                               my_printf(p->osd, _T("[{R,W,I,O}]BL - list breakpoints\n"));
-                               my_printf(p->osd, _T("[{R,W,I,O}]CP <address/port> [<mask>] - set checkpoint (don't break)\n"));
-                               
-                               my_printf(p->osd, _T("G - go (press esc key to break)\n"));
-                               my_printf(p->osd, _T("G <address> - go and break at address (ignore breakpoints)\n"));
-                               my_printf(p->osd, _T("P - trace one opcode (step over, ignore breakpoints)\n"));
-                               my_printf(p->osd, _T("T [<count>] - trace (step in)\n"));
-                               my_printf(p->osd, _T("Q - quit\n"));
-                               
-                               my_printf(p->osd, _T("> <filename> - output logfile\n"));
-                               my_printf(p->osd, _T("< <filename> - input commands from file\n"));
-                               
-                               my_printf(p->osd, _T("! reset [all/cpu/target] - reset\n"));
-                               my_printf(p->osd, _T("! key <code> [<msec>] - press key\n"));
-                               my_printf(p->osd, _T("! device - enumerate debugger available device\n"));
-                               my_printf(p->osd, _T("! device <id/cpu> - select target device\n"));
-                               my_printf(p->osd, _T("! cpu - enumerate debugger available cpu\n"));
-                               my_printf(p->osd, _T("! cpu <id> - select target cpu\n"));
-                               my_printf(p->osd, _T("!! <remark> - do nothing\n"));
-                               
-                               my_printf(p->osd, _T("<value> - hexa, decimal(%%d), ascii('a')\n"));
+                               for(auto n = helplist.begin(); n != helplist.end(); ++n) {
+                                       std::string tmps = *n;
+                                       my_printf(p->osd, (const _TCHAR *)(tmps.c_str()));
+                                       my_printf(p->osd, _T("\n"));
+                               }
                        } else {
                                my_printf(p->osd, _T("unknown command %s\n"), params[0]);
                        }
index a22d130..26b026f 100644 (file)
@@ -29,6 +29,33 @@ void AY_3_891X::initialize()
        lpf_quality = 1.0;
        hpf_quality = 1.0;
        
+       _HAS_AY_3_8910 = osd->check_feature(_T("HAS_AY_3_8910"));
+       _HAS_AY_3_8912 = osd->check_feature(_T("HAS_AY_3_8912"));
+       _HAS_AY_3_8913 = osd->check_feature(_T("HAS_AY_3_8913"));
+       _SUPPORT_AY_3_891X_PORT_A = false;
+       _SUPPORT_AY_3_891X_PORT_B = false;
+       _IS_AY_3_891X_PORT_MODE = osd->check_feature(_T("AY_3_891X_PORT_MODE"));
+       _AY_3_891X_PORT_MODE = osd->get_feature_uint32_value(_T("AY_3_891X_PORT_MODE"));
+
+       if(_HAS_AY_3_8912) {
+               // AY-3-8912: port b is not supported
+               _SUPPORT_AY_3_891X_PORT_A = true;
+       } else if(!(_HAS_AY_3_8913)) {
+               // AY-3-8913: both port a and port b are not supported
+               // AY-3-8910: both port a and port b are supported
+               _SUPPORT_AY_3_891X_PORT_A = true;
+               _SUPPORT_AY_3_891X_PORT_B = true;
+       }               
+       _SUPPORT_AY_3_891X_PORT = ((_SUPPORT_AY_3_891X_PORT_A) || (_SUPPORT_AY_3_891X_PORT_B));
+       if(_HAS_AY_3_8910) {
+               set_device_name(_T("AY-3-8910 PSG"));
+       } else if(_HAS_AY_3_8912) {
+               set_device_name(_T("AY-3-8912 PSG"));
+       } else if(_HAS_AY_3_8913) {
+               set_device_name(_T("AY-3-8913 PSG"));
+       }
+
+
        if(d_debugger != NULL) {
                d_debugger->set_device_name(_T("Debugger (AY-3-891X PSG)"));
                d_debugger->set_context_mem(this);
@@ -51,15 +78,15 @@ void AY_3_891X::reset()
        timer_event_id = -1;
        this->set_reg(0x27, 0);
        
-#ifdef SUPPORT_AY_3_891X_PORT
-       port[0].first = port[1].first = true;
-       port[0].wreg = port[1].wreg = 0;//0xff;
-#ifdef AY_3_891X_PORT_MODE
-       mode = AY_3_891X_PORT_MODE;
-#else
-       mode = 0;
-#endif
-#endif
+       if(_SUPPORT_AY_3_891X_PORT) {
+               port[0].first = port[1].first = true;
+               port[0].wreg = port[1].wreg = 0;//0xff;
+               if(_IS_AY_3_891X_PORT_MODE) {
+                       mode = _AY_3_891X_PORT_MODE;
+               } else {
+                       mode = 0;
+               }
+       }
        irq_prev = busy = false;
 }
 
@@ -93,31 +120,31 @@ uint32_t AY_3_891X::read_io8(uint32_t addr)
 void AY_3_891X::write_via_debugger_data8(uint32_t addr, uint32_t data)
 {
        if(addr < 16) {
-#ifdef SUPPORT_AY_3_891X_PORT
-               if(addr == 7) {
-#ifdef AY_3_891X_PORT_MODE
-                       mode = (data & 0x3f) | AY_3_891X_PORT_MODE;
-#else
-                       mode = data;
-#endif
-               } else if(addr == 14) {
-#ifdef SUPPORT_AY_3_891X_PORT_A
-                       if(port[0].wreg != data || port[0].first) {
-                               write_signals(&port[0].outputs, data);
-                               port[0].wreg = data;
-                               port[0].first = false;
-                       }
-#endif
-               } else if(addr == 15) {
-#ifdef SUPPORT_AY_3_891X_PORT_B
-                       if(port[1].wreg != data || port[1].first) {
-                               write_signals(&port[1].outputs, data);
-                               port[1].wreg = data;
-                               port[1].first = false;
+               if(_SUPPORT_AY_3_891X_PORT) {
+                       if(addr == 7) {
+                               if(_IS_AY_3_891X_PORT_MODE) {
+                                       mode = (data & 0x3f) | _AY_3_891X_PORT_MODE;
+                               } else {
+                                       mode = data;
+                               }
+                       } else if(addr == 14) {
+                               if(_SUPPORT_AY_3_891X_PORT_A) {
+                                       if(port[0].wreg != data || port[0].first) {
+                                               write_signals(&port[0].outputs, data);
+                                               port[0].wreg = data;
+                                               port[0].first = false;
+                                       }
+                               }
+                       } else if(addr == 15) {
+                               if(_SUPPORT_AY_3_891X_PORT_B) {
+                                       if(port[1].wreg != data || port[1].first) {
+                                               write_signals(&port[1].outputs, data);
+                                               port[1].wreg = data;
+                                               port[1].first = false;
+                                       }
+                               }
                        }
-#endif
                }
-#endif
                update_count();
                this->set_reg(addr, data);
        }
@@ -126,17 +153,17 @@ void AY_3_891X::write_via_debugger_data8(uint32_t addr, uint32_t data)
 uint32_t AY_3_891X::read_via_debugger_data8(uint32_t addr)
 {
        if(addr < 16) {
-#ifdef SUPPORT_AY_3_891X_PORT
-               if(addr == 14) {
-#ifdef SUPPORT_AY_3_891X_PORT_A
-                       return (mode & 0x40) ? port[0].wreg : port[0].rreg;
-#endif
-               } else if(addr == 15) {
-#ifdef SUPPORT_AY_3_891X_PORT_B
-                       return (mode & 0x80) ? port[1].wreg : port[1].rreg;
-#endif
+               if(_SUPPORT_AY_3_891X_PORT) {
+                       if(addr == 14) {
+                               if(_SUPPORT_AY_3_891X_PORT_A) {
+                                       return (mode & 0x40) ? port[0].wreg : port[0].rreg;
+                               }
+                       } else if(addr == 15) {
+                               if(_SUPPORT_AY_3_891X_PORT_B) {
+                                       return (mode & 0x80) ? port[1].wreg : port[1].rreg;
+                               }
+                       }
                }
-#endif
                return opn->GetReg(addr);
        }
        return 0;
@@ -146,14 +173,16 @@ void AY_3_891X::write_signal(int id, uint32_t data, uint32_t mask)
 {
        if(id == SIG_AY_3_891X_MUTE) {
                mute = ((data & mask) != 0);
-#ifdef SUPPORT_AY_3_891X_PORT_A
+
        } else if(id == SIG_AY_3_891X_PORT_A) {
-               port[0].rreg = (port[0].rreg & ~mask) | (data & mask);
-#endif
-#ifdef SUPPORT_AY_3_891X_PORT_B
+               if(_SUPPORT_AY_3_891X_PORT_A) {
+                       port[0].rreg = (port[0].rreg & ~mask) | (data & mask);
+               }
+
        } else if(id == SIG_AY_3_891X_PORT_B) {
-               port[1].rreg = (port[1].rreg & ~mask) | (data & mask);
-#endif
+               if(_SUPPORT_AY_3_891X_PORT_B) {
+                       port[1].rreg = (port[1].rreg & ~mask) | (data & mask);
+               }
        }
 }
 
@@ -280,6 +309,67 @@ void AY_3_891X::update_timing(int new_clocks, double new_frames_per_sec, int new
        clock_const = (uint32_t)((double)chip_clock * 1024.0 * 1024.0 / (double)new_clocks + 0.5);
 }
 
+bool AY_3_891X::write_debug_reg(const _TCHAR *reg, uint32_t data)
+{
+       if((reg[0] == 'R') || (reg[0] == 'r')) {
+               if(strlen(reg) >= 2) {
+                       _TCHAR *eptr;
+                       int regnum = _tcstol(&(reg[1]), &eptr, 16);
+                       if(regnum >= 16) {
+                               return false;
+                       }
+                       opn->SetReg((uint32_t)regnum, data);
+                       return true;
+               }
+               return false;
+       }
+       if(_SUPPORT_AY_3_891X_PORT) {
+               if(_tcsicmp(reg, _T("PAR")) == 0) {
+                       port[0].rreg = data;
+               } else if(_tcsicmp(reg, _T("PAW")) == 0) {
+                       port[0].wreg = data;
+                       write_signals(&port[0].outputs, data);
+               } else if(_tcsicmp(reg, _T("PBR")) == 0) {
+                       port[1].rreg = data;
+               } else if(_tcsicmp(reg, _T("PBW")) == 0) {
+                       port[1].wreg = data;
+                       write_signals(&port[1].outputs, data);
+               } else if(_tcsicmp(reg, _T("MODE")) == 0) {
+                       mode = data;
+               } else {
+                       return false;
+               }
+               return true;
+       }
+       return false;
+}
+
+bool AY_3_891X::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
+{
+       _TCHAR tmps[512] = {0};
+       if(_SUPPORT_AY_3_891X_PORT) {
+               my_stprintf_s(tmps, 512, _T("PORTA: PAR/PAW = %02X/%02X  PORTB: PBR/PBW = %02X/%02X MODE=%02X\n")
+                                         , port[0].rreg, port[0].wreg, port[1].rreg, port[1].wreg, mode
+                       );
+       }
+       _TCHAR tmps2[16 * 12 + 16] = {0};
+       _TCHAR tmps3[16];
+       for(uint32_t i = 0; i < 2; i++) {
+               memset(tmps3, 0x00, sizeof(tmps3));
+               my_stprintf_s(tmps3, 15, _T("+%02d :"), i * 8);
+               _tcsncat(tmps2, tmps3, sizeof(tmps2) - 1);
+               for(uint32_t j = 0; j < 8; j++) {
+                       memset(tmps3, 0x00, sizeof(tmps3));
+                       my_stprintf_s(tmps3, 7, _T(" %02X"), opn->GetReg(i * 8 + j));
+                       _tcsncat(tmps2, tmps3, sizeof(tmps2) - 1);
+               }
+               _tcsncat(tmps2, "\n", sizeof(tmps2) - 1);
+       }       
+       my_stprintf_s(buffer, buffer_len - 1, _T("%sCH=%02X  CHIP_CLOCK=%d\nREG : +0 +1 +2 +3 +4 +5 +6 +7 +8\n%s"),
+                                 tmps, ch, chip_clock, tmps2);
+       return true;
+}
+
 #define STATE_VERSION  5
 
 bool AY_3_891X::process_state(FILEIO* state_fio, bool loading)
@@ -294,14 +384,14 @@ bool AY_3_891X::process_state(FILEIO* state_fio, bool loading)
                return false;
        }
        state_fio->StateValue(ch);
-#ifdef SUPPORT_AY_3_891X_PORT
-       for(int i = 0; i < 2; i++) {
-               state_fio->StateValue(port[i].wreg);
-               state_fio->StateValue(port[i].rreg);
-               state_fio->StateValue(port[i].first);
-       }
+       if(_SUPPORT_AY_3_891X_PORT) {
+               for(int i = 0; i < 2; i++) {
+                       state_fio->StateValue(port[i].wreg);
+                       state_fio->StateValue(port[i].rreg);
+                       state_fio->StateValue(port[i].first);
+               }
+       }
        state_fio->StateValue(mode);
-#endif
        state_fio->StateValue(chip_clock);
        state_fio->StateValue(irq_prev);
        state_fio->StateValue(mute);
index 1d89d1c..7c8ef98 100644 (file)
 #include "device.h"
 #include "fmgen/opna.h"
 
-#if defined(HAS_AY_3_8913)
+//#if defined(HAS_AY_3_8913)
 // AY-3-8913: both port a and port b are not supported
-#elif defined(HAS_AY_3_8912)
+//#elif defined(HAS_AY_3_8912)
 // AY-3-8912: port b is not supported
-#define SUPPORT_AY_3_891X_PORT_A
-#else
+//#define SUPPORT_AY_3_891X_PORT_A
+//#else
 // AY-3-8910: both port a and port b are supported
-#define SUPPORT_AY_3_891X_PORT_A
-#define SUPPORT_AY_3_891X_PORT_B
-#endif
-#if defined(SUPPORT_AY_3_891X_PORT_A) || defined(SUPPORT_AY_3_891X_PORT_B)
-#define SUPPORT_AY_3_891X_PORT
-#endif
+//#define SUPPORT_AY_3_891X_PORT_A
+//#define SUPPORT_AY_3_891X_PORT_B
+//#endif
+//#if defined(SUPPORT_AY_3_891X_PORT_A) || defined(SUPPORT_AY_3_891X_PORT_B)
+//#define SUPPORT_AY_3_891X_PORT
+//#endif
 
-#ifdef SUPPORT_AY_3_891X_PORT_A
 #define SIG_AY_3_891X_PORT_A   0
-#endif
-#ifdef SUPPORT_AY_3_891X_PORT_B
 #define SIG_AY_3_891X_PORT_B   1
-#endif
 #define SIG_AY_3_891X_MUTE     2
 
 class DEBUGGER;
@@ -44,11 +40,20 @@ class AY_3_891X : public DEVICE
 private:
        DEBUGGER *d_debugger;
        FM::OPN* opn;
+
+       bool _HAS_AY_3_8910;
+       bool _HAS_AY_3_8912;
+       bool _HAS_AY_3_8913;
+       bool _SUPPORT_AY_3_891X_PORT_A;
+       bool _SUPPORT_AY_3_891X_PORT_B;
+       bool _SUPPORT_AY_3_891X_PORT;
+       bool _IS_AY_3_891X_PORT_MODE;
+       uint32_t _AY_3_891X_PORT_MODE;
        int base_decibel_fm, base_decibel_psg;
        
        uint8_t ch;
        
-#ifdef SUPPORT_AY_3_891X_PORT
+//#ifdef SUPPORT_AY_3_891X_PORT
        struct {
                uint8_t wreg;
                uint8_t rreg;
@@ -57,7 +62,7 @@ private:
                outputs_t outputs;
        } port[2];
        uint8_t mode;
-#endif
+//#endif
        
        int chip_clock;
        bool irq_prev, mute;
@@ -85,26 +90,26 @@ private:
 public:
        AY_3_891X(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
        {
-#ifdef SUPPORT_AY_3_891X_PORT
+//#ifdef SUPPORT_AY_3_891X_PORT
                for(int i = 0; i < 2; i++) {
                        initialize_output_signals(&port[i].outputs);
                        port[i].wreg = port[i].rreg = 0;//0xff;
                }
-#endif
+//#endif
                base_decibel_fm = base_decibel_psg = 0;
                d_debugger = NULL;
                use_lpf = false;
                use_hpf = false;
                sample_rate = 0;
-#if defined(HAS_AY_3_8910)
-               set_device_name(_T("AY-3-8910 PSG"));
-#elif defined(HAS_AY_3_8912)
-               set_device_name(_T("AY-3-8912 PSG"));
-#elif defined(HAS_AY_3_8913)
-               set_device_name(_T("AY-3-8913 PSG"));
-#else
+               _HAS_AY_3_8910 = false;
+               _HAS_AY_3_8912 = false;
+               _HAS_AY_3_8913 = false;
+               _SUPPORT_AY_3_891X_PORT_A = false;
+               _SUPPORT_AY_3_891X_PORT_B = false;
+               _SUPPORT_AY_3_891X_PORT = false;
+               _IS_AY_3_891X_PORT_MODE = false;
+               _AY_3_891X_PORT_MODE = 0;
                set_device_name(_T("AY-3-891X PSG"));
-#endif
        }
        ~AY_3_891X() {}
        
@@ -138,6 +143,9 @@ public:
        {
                return 16;
        }
+       bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
+       bool write_debug_reg(const _TCHAR *reg, uint32_t data);
+       
        void __FASTCALL write_debug_data8(uint32_t addr, uint32_t data)
        {
                if(addr < 16) {
@@ -154,18 +162,15 @@ public:
        bool process_state(FILEIO* state_fio, bool loading);
        
        // unique functions
-#ifdef SUPPORT_AY_3_891X_PORT_A
        void set_context_port_a(DEVICE* device, int id, uint32_t mask, int shift)
        {
                register_output_signal(&port[0].outputs, device, id, mask, shift);
        }
-#endif
-#ifdef SUPPORT_AY_3_891X_PORT_B
        void set_context_port_b(DEVICE* device, int id, uint32_t mask, int shift)
        {
                register_output_signal(&port[1].outputs, device, id, mask, shift);
        }
-#endif
+
        void set_context_debugger(DEBUGGER* device)
        {
                d_debugger = device;
index 8d99877..98a4064 100644 (file)
@@ -1,6 +1,6 @@
 message("* vm/common_vm")
 
-SET(THIS_LIB_VERSION 2.18.2)
+SET(THIS_LIB_VERSION 2.18.3)
 
 #include(cotire)
 set(s_vm_common_vm_srcs