OSDN Git Service

[VM][COMMON_VM] Add DATAREC, MCS48 and UPD7801 to libCSPcommon_vm .UPD7810 will not...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 26 May 2017 19:14:19 +0000 (04:14 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 26 May 2017 19:14:19 +0000 (04:14 +0900)
45 files changed:
source/build-cmake/bmjr/CMakeLists.txt
source/build-cmake/cmake/config_commonsource.cmake
source/build-cmake/cmake/config_emufm7.cmake
source/build-cmake/cmake/config_emumastersystem.cmake
source/build-cmake/cmake/config_emupasopia.cmake
source/build-cmake/cmake/config_msx.cmake
source/build-cmake/cmake/config_mz2500.cmake
source/build-cmake/cmake/config_mz700.cmake
source/build-cmake/cmake/config_mz80.cmake
source/build-cmake/cmake/config_pc6001.cmake
source/build-cmake/cmake/config_pc8201.cmake
source/build-cmake/cmake/config_pc8801.cmake
source/build-cmake/cmake/config_phc25.cmake
source/build-cmake/cmake/config_smc777.cmake
source/build-cmake/cmake/config_tk80.cmake
source/build-cmake/cmake/config_x1.cmake
source/build-cmake/fm16pi/CMakeLists.txt
source/build-cmake/fp1100/CMakeLists.txt
source/build-cmake/fp200/CMakeLists.txt
source/build-cmake/hc20/CMakeLists.txt
source/build-cmake/hc40/CMakeLists.txt
source/build-cmake/jr100/CMakeLists.txt
source/build-cmake/jr800/CMakeLists.txt
source/build-cmake/m5/CMakeLists.txt
source/build-cmake/multi8/CMakeLists.txt
source/build-cmake/mycomz80a/CMakeLists.txt
source/build-cmake/pc2001/CMakeLists.txt
source/build-cmake/phc20/CMakeLists.txt
source/build-cmake/pyuta/CMakeLists.txt
source/build-cmake/rx78/CMakeLists.txt
source/build-cmake/sc3000/CMakeLists.txt
source/build-cmake/scv/CMakeLists.txt
source/build-cmake/smb80te/CMakeLists.txt
source/build-cmake/yalky/CMakeLists.txt
source/src/qt/osd.cpp
source/src/vm/common_vm/CMakeLists.txt
source/src/vm/datarec.cpp
source/src/vm/datarec.h
source/src/vm/event.h
source/src/vm/mcs48.cpp
source/src/vm/mcs48.h
source/src/vm/mcs48_base.cpp [new file with mode: 0644]
source/src/vm/mcs48_flags.h [new file with mode: 0644]
source/src/vm/upd7801.cpp
source/src/vm/upd7801.h

index 0ea89a1..c00d43f 100644 (file)
@@ -21,11 +21,11 @@ set(USE_FMGEN OFF)
 set(VMFILES_BASE
   mc6800.cpp
 
-  datarec.cpp
   event.cpp
 )
 set(VMFILES_LIB
-  mc6820.cpp
+         datarec.cpp
+         mc6820.cpp
 )
 
 set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
index 1ab0287..329e626 100644 (file)
@@ -18,7 +18,7 @@ if(USE_DEVICES_SHARED_LIB)
        mc6809.cpp
   )
   set(MCS48_CPPS
-       libcpu_newdev/mcs48.cpp
+       mcs48.cpp
        )
   set(IX86_CPPS
        libcpu_newdev/i86.cpp
@@ -29,7 +29,7 @@ if(USE_DEVICES_SHARED_LIB)
 else()
   set(I386_CPPS i386.cpp)
   set(MC6809_CPPS mc6809_base.cpp mc6809.cpp)
-  set(MCS48_CPPS mcs48.cpp)
+  set(MCS48_CPPS mcs48_base.cpp mcs48.cpp)
   set(IX86_CPPS i86.cpp)
   set(Z80_CPPS   z80_base.cpp z80.cpp)
   set(VMFILES ${VMFILES} ${VMFILES_LIB})
index d18493b..cb89b74 100644 (file)
@@ -14,12 +14,12 @@ set(WITH_MOUSE ON)
 set(WITH_JOYSTICK ON)
 
 set(VMFILES
-                  datarec.cpp
                   event.cpp
                   io.cpp
 )
 
 set(VMFILES_LIB
+                  datarec.cpp
                   ym2203.cpp
                   pcm1bit.cpp
                   disk.cpp
index 9405e32..4bd30f4 100644 (file)
@@ -42,11 +42,11 @@ if(BUILD_GAMEGEAR)
   set(EXEC_TARGET emugamegear)
   add_definitions(-D_GAMEGEAR)
   set(VMFILES ${VMFILES}
-                  datarec.cpp
                   )
  set(VMFILES_LIB ${VMFILES_LIB}
-                  sn76489an.cpp
                   315-5124.cpp
+                  datarec.cpp
+                  sn76489an.cpp
                   upd765a.cpp
                   disk.cpp
 )                 
index 554d634..daf966b 100644 (file)
@@ -16,18 +16,18 @@ set(VMFILES
                   
                   z80ctc.cpp
                   
-                  datarec.cpp
                   io.cpp
                   event.cpp
 )
 set(VMFILES_LIB
-          ls393.cpp
-          not.cpp
-          z80pio.cpp
-          pcm1bit.cpp
-          upd765a.cpp
-          disk.cpp
-          hd46505.cpp
+                  datarec.cpp
+                  ls393.cpp
+                  not.cpp
+                  z80pio.cpp
+                  pcm1bit.cpp
+                  upd765a.cpp
+                  disk.cpp
+                  hd46505.cpp
 )
 
 if(NOT BUILD_PASOPIA)
index 4c402d8..72b04b1 100644 (file)
@@ -8,13 +8,13 @@ message("** Start of configure CommonSourceProject,MSX Series Qt **")
 message("")
 
 set(VMFILES_BASE
-       datarec.cpp
        event.cpp
        io.cpp
        memory.cpp
 )
 
 set(VMFILES_LIB
+       datarec.cpp
        ay_3_891x.cpp
        i8255.cpp
        not.cpp
index 39cbcf0..51bf2aa 100644 (file)
@@ -22,7 +22,6 @@ set(VMFILES_LIB_2500
 )
 
 set(VMFILES_BASE
-                  datarec.cpp
                   mz1p17.cpp
                   
                   event.cpp
@@ -31,6 +30,7 @@ set(VMFILES_BASE
                   
                   )
 set(VMFILES_LIB
+                  datarec.cpp
                   i8253.cpp
                   i8255.cpp
 
index b0e1e26..6a38fd5 100644 (file)
@@ -11,8 +11,6 @@ set(WITH_MOUSE ON)
 
 set(FLAG_USE_Z80 ON)
 set(VMFILES_BASE
-                  datarec.cpp
-                  
                   event.cpp
                   io.cpp
                   memory.cpp
@@ -28,6 +26,7 @@ set(VMFILES_MZ1500 ${VMFILES_MZ800}
 )
 
 set(VMFILES_LIB
+          datarec.cpp
           i8255.cpp
           i8253.cpp
                   
index 4100351..3e03be1 100644 (file)
@@ -16,7 +16,6 @@ set(WITH_MOUSE OFF)
 set(VMFILES_BASE
                   i8253.cpp
                   i8255.cpp
-                  datarec.cpp
                   prnfile.cpp
                   mz1p17.cpp
                   event.cpp
@@ -26,6 +25,7 @@ set(VMFILES_BASE
 
 set(VMFILES_LIB
           beep.cpp
+          datarec.cpp
           ls393.cpp
           pcm1bit.cpp
 )                 
index 4b0281b..f92a549 100644 (file)
@@ -17,16 +17,16 @@ set(VMFILES
                   event.cpp
                   io.cpp
                   memory.cpp
-                  datarec.cpp
 )
 
 set(VMFILES_LIB
+           datarec.cpp
                pc6031.cpp
                pc80s31k.cpp
                upd765a.cpp
-               disk.cpp
                ym2203.cpp
                prnfile.cpp
+               disk.cpp
 )
 set(FLAG_USE_MCS48 ON)
 set(FLAG_USE_Z80 ON)
index a95b6bc..414aef6 100644 (file)
@@ -14,11 +14,11 @@ set(VMFILES
           i8080.cpp
                   
           io.cpp
-          datarec.cpp
                   
           event.cpp
 )
 set(VMFILES_LIB
+          datarec.cpp
           i8155.cpp
           pcm1bit.cpp
           upd1990a.cpp
index ff072aa..36ca71e 100644 (file)
@@ -9,13 +9,13 @@ set(WITH_MOUSE ON)
 
 set(VMFILES
                   z80ctc.cpp
-                  datarec.cpp
                   event.cpp
                   io.cpp
                   memory.cpp
 )
 set(VMFILES_LIB
                beep.cpp
+               datarec.cpp
                i8251.cpp
                i8255.cpp
   
index b04c4af..e9548b9 100644 (file)
@@ -13,16 +13,15 @@ set(WITH_JOYSTICK ON)
 
 set(FLAG_USE_Z80 ON)
 set(VMFILES
-                  mc6847.cpp
-                  ym2203.cpp
-                  
-                  datarec.cpp
                   io.cpp
                   
                   event.cpp
 )
 set(VMFILES_LIB
+                  datarec.cpp
+                  mc6847.cpp
                   not.cpp
+                  ym2203.cpp
 )
 
 set(BUILD_SHARED_LIBS OFF)
index 5448123..4c55e9f 100644 (file)
@@ -19,13 +19,14 @@ if(BUILD_SMC70)
   set(VMFILES_BASE
                   msm58321.cpp
                   
-                  datarec.cpp
                   event.cpp
                   )
 set(VMFILES_LIB
+          datarec.cpp
           hd46505.cpp
-          pcm1bit.cpp
           mb8877.cpp
+          msm58321_base.cpp
+          pcm1bit.cpp
           disk.cpp
 )
  add_definitions(-D_SMC70)
@@ -34,11 +35,10 @@ elseif(BUILD_SMC777)
   
   set(EXEC_TARGET emusmc777)
   set(VMFILES_BASE
-                       hd46505.cpp
-                       datarec.cpp
                        event.cpp
    )
    set(VMFILES_LIB
+               datarec.cpp
                hd46505.cpp
                sn76489an.cpp   
                pcmibit.cpp
index 3d90c63..112b4db 100644 (file)
@@ -31,8 +31,8 @@ if(BUILD_TK80BS)
     add_definitions(-D_TK80BS)
     set(EXEC_TARGET emutk80bs)
     set(VM_NAME tk80bs)
-    set(VMFILES_LIB ${VMFILES_LIB} i8251.cpp)
-    set(VMFILES_BASE ${VMFILES_BASE} datarec.cpp io.cpp)
+    set(VMFILES_LIB ${VMFILES_LIB} datarec.cpp i8251.cpp)
+    set(VMFILES_BASE ${VMFILES_BASE} io.cpp)
     set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/tk80bs.qrc)
 elseif(BUILD_TK80)
     add_definitions(-D_TK80)
@@ -45,8 +45,8 @@ elseif(BUILD_TK85)
     add_definitions(-D_TK85)
     set(EXEC_TARGET emutk85)
     set(VM_NAME tk80bs)
-    set(VMFILES_LIB ${VMFILES_LIB} )
-    set(VMFILES_BASE ${VMFILES_BASE} datarec.cpp io.cpp)
+    set(VMFILES_LIB ${VMFILES_LIB} datarec.cpp )
+    set(VMFILES_BASE ${VMFILES_BASE} io.cpp)
     set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/tk85.qrc)
 endif()
 
index d3aae42..0666bf6 100644 (file)
@@ -15,7 +15,6 @@ set(WITH_MOUSE ON)
 set(VMFILES
                   z80ctc.cpp
 
-                  datarec.cpp
                   event.cpp
                   
                   io.cpp
@@ -24,8 +23,9 @@ set(VMFILES
 set(VMFILES_LIB
                   ay_3_891x.cpp
                   beep.cpp
-                  i8255.cpp
+                  datarec.cpp
                   hd46505.cpp
+                  i8255.cpp
                   mb8877.cpp
                   upd1990a.cpp
                   ym2151.cpp
index c6c1d57..a171c93 100644 (file)
@@ -23,13 +23,13 @@ set(WITH_MOUSE ON)
 set(VMFILES
 #                 i286.cpp
                   msm58321.cpp
-#                 datarec.cpp
                   event.cpp
                   io.cpp
                   memory.cpp
 )
 
 set(VMFILES_LIB
+#                 datarec.cpp
                   i8253.cpp
                   i8255.cpp
                   i8259.cpp
index bcc56a9..df2c3a7 100644 (file)
@@ -21,18 +21,13 @@ set(WITH_MOUSE OFF)
 
 set(FLAG_USE_Z80 ON)
 set(VMFILES
-                  upd7801.cpp
-#                 hd46505.cpp
-#                 upd765a.cpp
-#                 ym2203.cpp
-#                 disk.cpp                
-                  datarec.cpp
-
-                  event.cpp
-                  io.cpp
-                  memory.cpp
+                 event.cpp
+                 io.cpp
+                 memory.cpp
 )
 set(VMFILES_LIB
+                  datarec.cpp
+                  upd7801.cpp
                   upd765a.cpp
 #                 pcm1bit.cpp
                   ym2203.cpp
index b9f702a..b7d22ce 100644 (file)
@@ -22,11 +22,11 @@ set(WITH_MOUSE OFF)
 set(VMFILES
                   i8080.cpp
                   
-                  datarec.cpp
                   memory.cpp
                   event.cpp
 )
 set(VMFILES_LIB
+                  datarec.cpp
                   i8080_base.cpp
                   rp5c01.cpp
 )
index e98f797..c9fe6c7 100644 (file)
@@ -24,13 +24,14 @@ set(FLAG_USE_Z80 ON)
 
 set(VMFILES_BASE
       mc6800.cpp
-      datarec.cpp
+
       event.cpp
       io.cpp
       memory.cpp
 )
 set(VMFILES_LIB
       beep.cpp
+      datarec.cpp
       i8255.cpp
       hd146818p.cpp
       
index 7cbe17b..ca8ccf0 100644 (file)
@@ -23,11 +23,11 @@ set(WITH_MOUSE OFF)
 
 set(FLAG_USE_Z80 ON)
 set(VMFILES_BASE
-      datarec.cpp
       event.cpp
 )
 set(VMFILES_LIB
       beep.cpp
+      datarec.cpp
       ptf20.cpp
       disk.cpp
       
index 2784051..80e2eca 100644 (file)
@@ -22,17 +22,16 @@ set(WITH_JOYSTICK ON)
 set(WITH_MOUSE OFF)
 
 set(VMFILES_BASE
-  mc6800.cpp
+               mc6800.cpp
+               sy6522.cpp
 
-  sy6522.cpp
-  datarec.cpp
-  
-  event.cpp
+               event.cpp
 )
 
 set(VMFILES_LIB 
-  pcm1bit.cpp
-  not.cpp
+               datarec.cpp
+               not.cpp
+               pcm1bit.cpp
 )
 
 set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
index 13de60e..5c72377 100644 (file)
@@ -22,17 +22,15 @@ set(WITH_JOYSTICK ON)
 set(WITH_MOUSE OFF)
 
 set(VMFILES_BASE
-  mc6800.cpp
-
-  memory.cpp
-  datarec.cpp
-  
-  event.cpp
+               mc6800.cpp
+               memory.cpp
+               event.cpp
 )
 
 set(VMFILES_LIB 
-  hd44102.cpp
-  pcm1bit.cpp
+               datarec.cpp
+               hd44102.cpp
+               pcm1bit.cpp
 )
 
 set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
index 6d05184..dd59910 100644 (file)
@@ -26,12 +26,12 @@ set(VMFILES_BASE
       z80ctc.cpp
       memory.cpp
   
-      datarec.cpp
       io.cpp
       event.cpp
 )
 
 set(VMFILES_LIB
+      datarec.cpp
       sn76489an.cpp
       tms9918a.cpp
 )
index 63063c9..6a2b2f4 100644 (file)
@@ -18,11 +18,11 @@ set(EXEC_TARGET emumulti8)
 set(FLAG_USE_Z80 ON)
 set(VMFILES_BASE
                   io.cpp
-                  datarec.cpp
                   
                   event.cpp
 )
 set(VMFILES_LIB
+                  datarec.cpp
                   hd46505.cpp
                   i8251.cpp
                   i8253.cpp
index 72c0c87..7ccafb2 100644 (file)
@@ -17,17 +17,18 @@ set(VM_NAME mycomz80a)
 set(USE_FMGEN OFF)
 set(FLAG_USE_Z80 ON)
 set(VMFILES
+               msm5832.cpp
+               datarec.cpp
        
-       i8255.cpp
-       msm5832.cpp
-       datarec.cpp
-       
-       event.cpp
-       io.cpp
+               event.cpp
+               io.cpp
 )
 set(VMFILES_LIB
-       hd46505.cpp
-       sn76489an.cpp
+               datarec.cpp
+               hd46505.cpp
+               i8255.cpp
+               msm58321_base.cpp
+               sn76489an.cpp
 )      
 
 set(BUILD_MYCOMZ80A ON CACHE BOOL "Build EMU-MYCOMZ80A")
index 230e96c..bc148cd 100644 (file)
@@ -20,18 +20,17 @@ set(WITH_MOUSE OFF)
 set(WITH_DEBUGGER ON)
 
 set(VMFILES
-#                 upd16434.cpp
                   upd7810.cpp
                   
-                  datarec.cpp
                   memory.cpp
 
                   event.cpp
 )
 set(VMFILES_LIB
+                  datarec.cpp
+                  pcm1bit.cpp
                   upd16434.cpp
                   upd1990a.cpp
-                  pcm1bit.cpp
 )
 set(BUILD_SHARED_LIBS OFF)
 set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
index 01ce5a4..73a8d0d 100644 (file)
@@ -17,13 +17,11 @@ set(VM_NAME phc20)
 set(USE_FMGEN OFF)
 set(FLAG_USE_Z80 ON)
 set(VMFILES
-  
-                  mc6847.cpp
-
-                  datarec.cpp
                   event.cpp
 )
 set(VMFILES_LIB
+                  mc6847.cpp
+                  datarec.cpp
 )
 set(BUILD_SHARED_LIBS OFF)
 set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
index 8887dda..bc73f55 100644 (file)
@@ -21,11 +21,11 @@ set(WITH_MOUSE ON)
 
 set(VMFILES_BASE
                   tms9995.cpp
-                  datarec.cpp
                   event.cpp
                   memory.cpp
 )
 set(VMFILES_LIB
+                  datarec.cpp
                   sn76489an.cpp
                   tms9918a.cpp
 )                 
index b6bebd1..d56e104 100644 (file)
@@ -20,12 +20,11 @@ set(WITH_MOUSE ON)
 
 set(FLAG_USE_Z80 ON)
 set(VMFILES
-                  datarec.cpp
-                  
                   io.cpp
                   event.cpp
 )
 set(VMFILES_LIB
+                  datarec.cpp
                   sn76489an.cpp
 )
                 
index 0c305b7..39f53ba 100644 (file)
@@ -20,14 +20,14 @@ set(WITH_MOUSE ON)
 
 set(FLAG_USE_Z80 ON)
 set(VMFILES
-                  i8255.cpp
-                  datarec.cpp
                   io.cpp
                   event.cpp
 )
 
 set(VMFILES_LIB
+                  datarec.cpp
                   i8251.cpp
+                  i8255.cpp
                   sn76489an.cpp
                   tms9918a.cpp
                   upd765a.cpp
index 24d17c5..f8cd0c0 100644 (file)
@@ -19,10 +19,11 @@ set(WITH_JOYSTICK ON)
 set(WITH_MOUSE OFF)
 
 set(VMFILES
-                  upd7801.cpp
-                  
                   event.cpp
 )
+set(VMFILES_LIB
+                  upd7801.cpp
+)                 
 
 set(BUILD_SHARED_LIBS OFF)
 set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
index f41a94f..7a559fd 100644 (file)
@@ -23,13 +23,13 @@ set(WITH_MOUSE ON)
 set(FLAG_USE_Z80 ON)
 set(VMFILES_BASE
        io.cpp
-       datarec.cpp
        event.cpp
 )
 
 set(VMFILES_LIB
-       z80pio.cpp
+       datarec.cpp
        not.cpp
+       z80pio.cpp
 )   
 
 set(USE_OPENMP ON CACHE BOOL "Build using OpenMP")
index 56f5e6a..6666c95 100644 (file)
@@ -23,12 +23,12 @@ set(WITH_DEBUGGER ON)
 
 set(VMFILES_BASE
        i8080.cpp
-       datarec.cpp
        memory.cpp
        event.cpp
 )
 
 set(VMFILES_LIB
+       datarec.cpp
        i8080_base.cpp
        i8155.cpp
        not.cpp
index 5544dd9..b5dda59 100644 (file)
@@ -732,10 +732,10 @@ void OSD::set_features_vm(void)
        add_feature(_T("SUPPORT_AY_3_891X_PORT_B"), 1);
 #endif
 #ifdef DATAREC_FAST_FWD_SPEED
-       add_feature(_T("DATAREC_FAST_FWD_SPEED"), (int)DATAREC_FAST_FWD_SPEED);
+       add_feature(_T("DATAREC_FAST_FWD_SPEED"), (double)DATAREC_FAST_FWD_SPEED);
 #endif
 #ifdef DATAREC_FAST_REW_SPEED
-       add_feature(_T("DATAREC_FAST_REW_SPEED"), (int)DATAREC_FAST_REW_SPEED);
+       add_feature(_T("DATAREC_FAST_REW_SPEED"), (double)DATAREC_FAST_REW_SPEED);
 #endif
 #ifdef DATAREC_PCM_VOLUME
        add_feature(_T("DATAREC_PCM_VOLUME"), (int)DATAREC_PCM_VOLUME);
@@ -1017,6 +1017,9 @@ void OSD::set_features_misc(void)
 #ifdef DATAREC_SOUND_LEFT
        add_feature(_T("DATAREC_SOUND_LEFT"), 1);
 #endif
+#ifdef DATAREC_SOUND_RIGHT
+       add_feature(_T("DATAREC_SOUND_RIGHT"), 1);
+#endif
 }
 
 void OSD::set_features(void)
index 9950204..32ef046 100644 (file)
@@ -6,7 +6,7 @@ set(s_vm_common_vm_srcs
        ../and.cpp
        ../ay_3_891x.cpp
        ../beep.cpp
-#      ../datarec.cpp
+       ../datarec.cpp
        ../disk.cpp
        
        ../hd146818p.cpp
@@ -40,7 +40,7 @@ set(s_vm_common_vm_srcs
        ../mc6844.cpp
        ../mc6847_base.cpp
        ../mc6850.cpp
-#      ../mcs48.cpp
+       ../mcs48_base.cpp
        ../msm5205.cpp
        ../msm58321_base.cpp
 #      ../mz1p17.cpp
@@ -74,8 +74,9 @@ set(s_vm_common_vm_srcs
        ../upd7220_base.cpp
        ../upd765a.cpp
        ../upd7752.cpp
-#      ../upd7801.cpp
-#      ../upd7810.cpp
+       ../upd7801.cpp
+# 20170527 UPD7180 will not add to lbCSP_common_vm.
+##     ../upd7810.cpp
 # 20170518/MSX: Use v9938.cpp and define "-D_MSX_VDP_MESS" instead of v99x8.cpp .
        ../v9938.cpp
 ##     ../v99x8.cpp
@@ -89,8 +90,6 @@ set(s_vm_common_vm_srcs
        ../z80pio.cpp
        ../z80sio.cpp
 
-
-       ../libcpu_newdev/mcs48_base.cpp
        ../libcpu_newdev/i86_base.cpp
 
        ../libcpu_newdev/libcpu_i386/i386_opdef.cpp
@@ -120,8 +119,8 @@ else()
     ${s_vm_common_vm_srcs}
   )
   set_target_properties(CSPcommon_vm PROPERTIES 
-     SOVERSION 1.1.9
-     VERSION 1.1.9
+     SOVERSION 1.1.10
+     VERSION 1.1.10
   )
   INSTALL(TARGETS CSPcommon_vm DESTINATION ${LIBCSP_INSTALL_DIR})
 endif()
index 09f8bb3..189eaa3 100644 (file)
@@ -8,22 +8,41 @@
 */
 
 #include "datarec.h"
-#include "event.h"
+//#include "event.h"
 #include "noise.h"
 
 #define EVENT_SIGNAL   0
 #define EVENT_SOUND    1
 
-#ifndef DATAREC_FAST_FWD_SPEED
-#define DATAREC_FAST_FWD_SPEED 10
-#endif
-#ifndef DATAREC_FAST_REW_SPEED
-#define DATAREC_FAST_REW_SPEED 10
-#endif
+//#ifndef DATAREC_FAST_FWD_SPEED
+//#define DATAREC_FAST_FWD_SPEED       10
+//#endif
+//#ifndef DATAREC_FAST_REW_SPEED
+//#define DATAREC_FAST_REW_SPEED       10
+//#endif
 
 void DATAREC::initialize()
 {
        DEVICE::initialize();
+       __DATAREC_SOUND = osd->check_feature(_T("DATAREC_SOUND"));
+       if(osd->check_feature(_T("DATAREC_PCM_VOLUME"))) {
+               pcm_max_vol = (int)osd->get_feature_int_value(_T("DATAREC_PCM_VOLUME"));
+       }
+       __DATAREC_SOUND_LEFT  = osd->check_feature(_T("DATAREC_SOUND_LEFT"));
+       __DATAREC_SOUND_RIGHT = osd->check_feature(_T("DATAREC_SOUND_RIGHT"));
+
+       __DATAREC_FAST_FWD_SPEED = 10.0;
+       if(osd->check_feature(_T("DATAREC_FAST_FWD_SPEED"))) {
+               __DATAREC_FAST_FWD_SPEED = osd->get_feature_double_value(_T("DATAREC_FAST_FWD_SPEED"));
+       }
+       __DATAREC_FAST_REW_SPEED = 10.0;
+       if(osd->check_feature(_T("DATAREC_FAST_REW_SPEED"))) {
+               __DATAREC_FAST_REW_SPEED = osd->get_feature_double_value(_T("DATAREC_FAST_REW_SPEED"));
+       }
+       __TYPE_MZ80B = false;
+       if(osd->check_feature(_T("_MZ80B")))  __TYPE_MZ80B = true;
+       if(osd->check_feature(_T("_MZ2000"))) __TYPE_MZ80B = true;
+       if(osd->check_feature(_T("_MZ2200"))) __TYPE_MZ80B = true;
        play_fio = new FILEIO();
        rec_fio = new FILEIO();
        
@@ -35,9 +54,9 @@ void DATAREC::initialize()
        realtime = false;
        
        buffer = buffer_bak = NULL;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
        sound_buffer = NULL;
-#endif
+//#endif
        apss_buffer = NULL;
        buffer_ptr = buffer_length = 0;
        is_wav = is_tap = is_t77 = false;
@@ -45,9 +64,9 @@ void DATAREC::initialize()
        
        pcm_changed = 0;
        pcm_last_vol_l = pcm_last_vol_r = 0;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
        sound_last_vol_l = sound_last_vol_r = 0;
-#endif
+//#endif
        
        // initialize noise
        if(d_noise_play != NULL) {
@@ -132,12 +151,17 @@ void DATAREC::event_frame()
        if(pcm_changed) {
                pcm_changed--;
        }
-#ifdef DATAREC_SOUND
-       if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape && sound_sample == 0) {
-#else
-       if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape) {
-#endif
-               request_skip_frames();
+//#ifdef DATAREC_SOUND
+       if(__DATAREC_SOUND) {
+               if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape && sound_sample == 0) {
+                       request_skip_frames();
+               }
+       } else {
+//#else
+               if(remote && (play || rec) && ff_rew == 0 && signal_changed > 10 && !config.sound_play_tape) {
+//#endif
+                       request_skip_frames();
+               }
        }
        signal_changed = 0;
 }
@@ -161,13 +185,15 @@ void DATAREC::event_callback(int event_id, int err)
                                        } else {
                                                signal = false;
                                        }
-#ifdef DATAREC_SOUND
-                                       if(sound_buffer != NULL && ff_rew == 0) {
-                                               sound_sample = sound_buffer[buffer_ptr];
-                                       } else {
-                                               sound_sample = 0;
+//#ifdef DATAREC_SOUND
+                                       if(__DATAREC_SOUND) {
+                                               if(sound_buffer != NULL && ff_rew == 0) {
+                                                       sound_sample = sound_buffer[buffer_ptr];
+                                               } else {
+                                                       sound_sample = 0;
+                                               }
                                        }
-#endif
+//#endif
                                }
                                if(ff_rew < 0) {
                                        if((buffer_ptr = max(buffer_ptr - 1, 0)) == 0) {
@@ -402,9 +428,9 @@ void DATAREC::update_event()
        if(remote && (play || rec)) {
                if(register_id == -1) {
                        if(ff_rew > 0) {
-                               register_event(this, EVENT_SIGNAL, sample_usec / DATAREC_FAST_FWD_SPEED, true, &register_id);
+                               register_event(this, EVENT_SIGNAL, sample_usec / __DATAREC_FAST_FWD_SPEED, true, &register_id);
                        } else if(ff_rew < 0) {
-                               register_event(this, EVENT_SIGNAL, sample_usec / DATAREC_FAST_REW_SPEED, true, &register_id);
+                               register_event(this, EVENT_SIGNAL, sample_usec / __DATAREC_FAST_REW_SPEED, true, &register_id);
                        } else {
                                if(rec) {
                                        my_stprintf_s(message, 1024, _T("Record"));
@@ -434,11 +460,13 @@ void DATAREC::update_event()
        }
        
        // update signals
-#ifdef DATAREC_SOUND
-       if(!(play && remote)) {
-               sound_sample = 0;
+//#ifdef DATAREC_SOUND
+       if(__DATAREC_SOUND) {
+               if(!(play && remote)) {
+                       sound_sample = 0;
+               }
        }
-#endif
+//#endif
        write_signals(&outputs_remote, remote ? 0xffffffff : 0);
        write_signals(&outputs_rotate, (register_id != -1) ? 0xffffffff : 0);
        write_signals(&outputs_end, (buffer_ptr == buffer_length) ? 0xffffffff : 0);
@@ -647,12 +675,14 @@ void DATAREC::close_file()
                free(buffer_bak);
                buffer_bak = NULL;
        }
-#ifdef DATAREC_SOUND
-       if(sound_buffer != NULL) {
-               free(sound_buffer);
-               sound_buffer = NULL;
+//#ifdef DATAREC_SOUND
+       if(__DATAREC_SOUND) {
+               if(sound_buffer != NULL) {
+                       free(sound_buffer);
+                       sound_buffer = NULL;
+               }
        }
-#endif
+//#endif
        if(apss_buffer != NULL) {
                free(apss_buffer);
                apss_buffer = NULL;
@@ -683,7 +713,6 @@ void adjust_zero_position(int16_t *wav_buffer, int samples, int sample_rate)
        }
        free(zero_buffer);
 }
-
 int DATAREC::load_wav_image(int offset)
 {
        // check wave header
@@ -739,34 +768,52 @@ int DATAREC::load_wav_image(int offset)
                                tmp_ptr = 0; \
                        } \
                }
-               
-#ifdef DATAREC_SOUND
-               if(!config.wave_shaper[drive_num] || header.channels > 1) {
-#else
-               if(!config.wave_shaper[drive_num]) {
-#endif
+
+               bool __t = false;
+               if(__DATAREC_SOUND) {
+                  if(!config.wave_shaper[drive_num] || header.channels > 1) {
+                          __t = true;
+                  }
+               } else {
+                       if(!config.wave_shaper[drive_num]) {
+                               __t = true;
+                       }
+               }
+//#ifdef DATAREC_SOUND
+//             if(!config.wave_shaper[drive_num] || header.channels > 1) {
+//#else
+//             if(!config.wave_shaper[drive_num]) {
+//#endif
+               if(__t) {
                        // load samples
-#ifdef DATAREC_SOUND
-                       if(header.channels > 1) {
-                               sound_buffer_length = samples * sizeof(int16_t);
-                               sound_buffer = (int16_t *)malloc(sound_buffer_length);
+//#ifdef DATAREC_SOUND
+                       if(__DATAREC_SOUND) {
+                               if(header.channels > 1) {
+                                       sound_buffer_length = samples * sizeof(int16_t);
+                                       sound_buffer = (int16_t *)malloc(sound_buffer_length);
+                               }
                        }
-#endif
+//#endif
                        int16_t *wav_buffer = (int16_t *)malloc(samples * sizeof(int16_t));
                        for(int i = 0, tmp_ptr = 0; i < samples; i++) {
                                int16_t sample[16];
                                GET_SAMPLE
                                int16_t sample_signal = sample[0];
-#ifdef DATAREC_SOUND
-                               if(header.channels > 1) {
-#ifdef DATAREC_SOUND_LEFT
-                                       sample_signal = sample[1];
-                                       sound_buffer[i] = sample[0];
-#else
-                                       sound_buffer[i] = sample[1];
-#endif
+//#ifdef DATAREC_SOUND
+                               if(__DATAREC_SOUND) {
+                                       if(header.channels > 1) {
+//#ifdef DATAREC_SOUND_LEFT
+                                               if(__DATAREC_SOUND_LEFT) {
+                                                       sample_signal = sample[1];
+                                                       sound_buffer[i] = sample[0];
+                                               } else {
+//#else
+                                                       sound_buffer[i] = sample[1];
+                                               }
+//#endif
+                                       }
                                }
-#endif
+//#endif
                                wav_buffer[i] = sample_signal;
                        }
                        adjust_zero_position(wav_buffer, samples, header.sample_rate);
@@ -777,7 +824,7 @@ int DATAREC::load_wav_image(int offset)
                        int top_index = 0;
                        int16_t max_sample = 0, min_sample = 0;
                        
-                       for(int i = 0, tmp_ptr = 0; i < samples; i++) {
+                       for(int i = 0 /*, tmp_ptr = 0 */; i < samples; i++) {
                                int16_t sample_signal = wav_buffer[i];
                                bool signal = (sample_signal > 0);
                                
@@ -937,12 +984,14 @@ int DATAREC::load_wav_image(int offset)
                                }
                                if(t == 1) {
                                        buffer = (uint8_t *)malloc(loaded_samples);
-#ifdef DATAREC_SOUND
-                                       if(header.channels > 1) {
-                                               sound_buffer_length = loaded_samples * sizeof(int16_t);
-                                               sound_buffer = (int16_t *)malloc(sound_buffer_length);
+//#ifdef DATAREC_SOUND
+                                       if(__DATAREC_SOUND) {
+                                               if(header.channels > 1) {
+                                                       sound_buffer_length = loaded_samples * sizeof(int16_t);
+                                                       sound_buffer = (int16_t *)malloc(sound_buffer_length);
+                                               }
                                        }
-#endif
+//#endif
                                        loaded_samples = 0;
                                }
                        }
@@ -954,6 +1003,7 @@ int DATAREC::load_wav_image(int offset)
        return loaded_samples;
 }
 
+
 void DATAREC::save_wav_image()
 {
        // write samples remained in buffer
@@ -1056,7 +1106,7 @@ int DATAREC::load_tap_image()
 {
        // get file size
        play_fio->Fseek(0, FILEIO_SEEK_END);
-       int file_size = play_fio->Ftell();
+       //int file_size = play_fio->Ftell();
        play_fio->Fseek(0, FILEIO_SEEK_SET);
        
        // check header
@@ -1124,31 +1174,17 @@ int DATAREC::load_tap_image()
        } \
 }
 
-#if defined(_MZ80B) || defined(_MZ2000) || defined(_MZ2200)
-#define MZT_PUT_BIT(bit, len) { \
-       for(int l = 0; l < (len); l++) { \
-               if(bit) { \
-                       MZT_PUT_SIGNAL(1, (int)(120.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
-                       MZT_PUT_SIGNAL(0, (int)(120.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
-               } else { \
-                       MZT_PUT_SIGNAL(1, (int)(60.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
-                       MZT_PUT_SIGNAL(0, (int)(60.0 / 16.0 * sample_rate / 22050.0 + 0.5)); \
-               } \
-       } \
-}
-#else
 #define MZT_PUT_BIT(bit, len) { \
        for(int l = 0; l < (len); l++) { \
                if(bit) { \
-                       MZT_PUT_SIGNAL(1, (int)(24.0 * sample_rate / 48000.0 + 0.5)); \
-                       MZT_PUT_SIGNAL(0, (int)(29.0 * sample_rate / 48000.0 + 0.5)); \
+                       MZT_PUT_SIGNAL(1, len1); \
+                       MZT_PUT_SIGNAL(0, len2); \
                } else { \
-                       MZT_PUT_SIGNAL(1, (int)(11.0 * sample_rate / 48000.0 + 0.5)); \
-                       MZT_PUT_SIGNAL(0, (int)(15.0 * sample_rate / 48000.0 + 0.5)); \
+                       MZT_PUT_SIGNAL(1, len3); \
+                       MZT_PUT_SIGNAL(0, len4); \
                } \
        } \
 }
-#endif
 
 #define MZT_PUT_BYTE(byte) { \
        MZT_PUT_BIT(1, 1); \
@@ -1175,9 +1211,20 @@ int DATAREC::load_tap_image()
 
 int DATAREC::load_mzt_image()
 {
+       int len1, len2, len3, len4;
+       if(__TYPE_MZ80B) {
+               len1 = len2 = (int)(120.0 / 16.0 * sample_rate / 22050.0 + 0.5);
+               len3 = len4 = (int)(60.0 / 16.0 * sample_rate / 22050.0 + 0.5);
+       } else {
+               len1 = (int)(24.0 * sample_rate / 48000.0 + 0.5);
+               len2 = (int)(29.0 * sample_rate / 48000.0 + 0.5);
+               len3 = (int)(11.0 * sample_rate / 48000.0 + 0.5);
+               len4 = (int)(15.0 * sample_rate / 48000.0 + 0.5);
+       }
        sample_rate = 48000;
        sample_usec = 1000000. / sample_rate;
        
+       
        // get file size
        play_fio->Fseek(0, FILEIO_SEEK_END);
        int file_size = play_fio->Ftell();
@@ -1219,40 +1266,43 @@ int DATAREC::load_mzt_image()
 #endif
                // output to buffer
                MZT_PUT_SIGNAL(0, sample_rate);
-#if defined(_MZ80B) || defined(_MZ2000) || defined(_MZ2200)
+//#if defined(_MZ80B) || defined(_MZ2000) || defined(_MZ2200)
+               if(__TYPE_MZ80B) {
                // Bin2Wav Ver 0.03
-               MZT_PUT_BIT(0, 22000);
-               MZT_PUT_BIT(1, 40);
-               MZT_PUT_BIT(0, 41);
-               MZT_PUT_BLOCK(header, 128);
-               MZT_PUT_BIT(1, 1);
-               MZT_PUT_SIGNAL(1, (int)(22.0 * sample_rate / 22050.0 + 0.5));
-               MZT_PUT_SIGNAL(0, (int)(22.0 * sample_rate / 22050.0 + 0.5));
-               MZT_PUT_SIGNAL(0, sample_rate);
-               MZT_PUT_BIT(0, 11000);
-               MZT_PUT_BIT(1, 20);
-               MZT_PUT_BIT(0, 21);
-               MZT_PUT_BLOCK(ram + offs, size);
-               MZT_PUT_BIT(1, 1);
-#else
-               // format info written in \8e\8e\8c±\82É\8fo\82éX1
-               MZT_PUT_BIT(0, 10000);
-               MZT_PUT_BIT(1, 40);
-               MZT_PUT_BIT(0, 40);
-               MZT_PUT_BIT(1, 1);
-               MZT_PUT_BLOCK(header, 128);
-               MZT_PUT_BIT(1, 1);
-               MZT_PUT_BIT(0, 256);
-               MZT_PUT_BLOCK(header, 128);
-               MZT_PUT_BIT(1, 1);
-               MZT_PUT_SIGNAL(0, sample_rate);
-               MZT_PUT_BIT(0, 10000);
-               MZT_PUT_BIT(1, 20);
-               MZT_PUT_BIT(0, 20);
-               MZT_PUT_BIT(1, 1);
-               MZT_PUT_BLOCK(ram + offs, size);
-               MZT_PUT_BIT(1, 1);
-#endif
+                       MZT_PUT_BIT(0, 22000);
+                       MZT_PUT_BIT(1, 40);
+                       MZT_PUT_BIT(0, 41);
+                       MZT_PUT_BLOCK(header, 128);
+                       MZT_PUT_BIT(1, 1);
+                       MZT_PUT_SIGNAL(1, (int)(22.0 * sample_rate / 22050.0 + 0.5));
+                       MZT_PUT_SIGNAL(0, (int)(22.0 * sample_rate / 22050.0 + 0.5));
+                       MZT_PUT_SIGNAL(0, sample_rate);
+                       MZT_PUT_BIT(0, 11000);
+                       MZT_PUT_BIT(1, 20);
+                       MZT_PUT_BIT(0, 21);
+                       MZT_PUT_BLOCK(ram + offs, size);
+                       MZT_PUT_BIT(1, 1);
+               } else {
+//#else
+                       // format info written in \8e\8e\8c±\82É\8fo\82éX1
+                       MZT_PUT_BIT(0, 10000);
+                       MZT_PUT_BIT(1, 40);
+                       MZT_PUT_BIT(0, 40);
+                       MZT_PUT_BIT(1, 1);
+                       MZT_PUT_BLOCK(header, 128);
+                       MZT_PUT_BIT(1, 1);
+                       MZT_PUT_BIT(0, 256);
+                       MZT_PUT_BLOCK(header, 128);
+                       MZT_PUT_BIT(1, 1);
+                       MZT_PUT_SIGNAL(0, sample_rate);
+                       MZT_PUT_BIT(0, 10000);
+                       MZT_PUT_BIT(1, 20);
+                       MZT_PUT_BIT(0, 20);
+                       MZT_PUT_BIT(1, 1);
+                       MZT_PUT_BLOCK(ram + offs, size);
+                       MZT_PUT_BIT(1, 1);
+               }
+//#endif
        }
        return ptr;
 }
@@ -1642,34 +1692,36 @@ void DATAREC::mix(int32_t* buffer, int cnt)
        pcm_prev_clock = get_current_clock();
        pcm_positive_clocks = pcm_negative_clocks = 0;
        
-#ifdef DATAREC_SOUND
-       if(/*config.sound_play_tape && */remote && play && ff_rew == 0) {
-               sound_last_vol_l = apply_volume(sound_sample, sound_volume_l);
-               sound_last_vol_r = apply_volume(sound_sample, sound_volume_r);
-               buffer = buffer_tmp; // restore
-               for(int i = 0; i < cnt; i++) {
-                       *buffer += sound_last_vol_l; // L
-                       *buffer += sound_last_vol_r; // R
-               }
-       } else if(sound_last_vol_l || sound_last_vol_r) {
-               // suppress petite noise when go to mute
-               for(int i = 0; i < cnt; i++) {
-                       *buffer++ += sound_last_vol_l; // L
-                       *buffer++ += sound_last_vol_r; // R
-                       
-                       if(sound_last_vol_l > 0) {
-                               sound_last_vol_l--;
-                       } else if(sound_last_vol_l < 0) {
-                               sound_last_vol_l++;
+//#ifdef DATAREC_SOUND
+       if(__DATAREC_SOUND) {
+               if(/*config.sound_play_tape && */remote && play && ff_rew == 0) {
+                       sound_last_vol_l = apply_volume(sound_sample, sound_volume_l);
+                       sound_last_vol_r = apply_volume(sound_sample, sound_volume_r);
+                       buffer = buffer_tmp; // restore
+                       for(int i = 0; i < cnt; i++) {
+                               *buffer += sound_last_vol_l; // L
+                               *buffer += sound_last_vol_r; // R
                        }
-                       if(sound_last_vol_r > 0) {
-                               sound_last_vol_r--;
-                       } else if(sound_last_vol_r < 0) {
-                               sound_last_vol_r++;
+               } else if(sound_last_vol_l || sound_last_vol_r) {
+                       // suppress petite noise when go to mute
+                       for(int i = 0; i < cnt; i++) {
+                               *buffer++ += sound_last_vol_l; // L
+                               *buffer++ += sound_last_vol_r; // R
+                               
+                               if(sound_last_vol_l > 0) {
+                                       sound_last_vol_l--;
+                               } else if(sound_last_vol_l < 0) {
+                                       sound_last_vol_l++;
+                               }
+                               if(sound_last_vol_r > 0) {
+                                       sound_last_vol_r--;
+                               } else if(sound_last_vol_r < 0) {
+                                       sound_last_vol_r++;
+                               }
                        }
                }
        }
-#endif
+//#endif
 }
 
 void DATAREC::set_volume(int ch, int decibel_l, int decibel_r)
@@ -1677,11 +1729,13 @@ void DATAREC::set_volume(int ch, int decibel_l, int decibel_r)
        if(ch == 0) {
                pcm_volume_l = decibel_to_volume(decibel_l);
                pcm_volume_r = decibel_to_volume(decibel_r);
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
        } else if(ch == 1) {
-               sound_volume_l = decibel_to_volume(decibel_l);
-               sound_volume_r = decibel_to_volume(decibel_r);
-#endif
+               if(__DATAREC_SOUND) {
+                       sound_volume_l = decibel_to_volume(decibel_l);
+                       sound_volume_r = decibel_to_volume(decibel_r);
+               }
+//#endif
        }
 }
 
@@ -1788,15 +1842,17 @@ void DATAREC::save_state(FILEIO* state_fio)
        } else {
                state_fio->FputInt32(0);
        }
-#ifdef DATAREC_SOUND
-       if(sound_buffer) {
-               state_fio->FputInt32(sound_buffer_length);
-               state_fio->Fwrite(sound_buffer, sound_buffer_length, 1);
-       } else {
-               state_fio->FputInt32(0);
+//#ifdef DATAREC_SOUND
+       if(__DATAREC_SOUND) {
+               if(sound_buffer) {
+                       state_fio->FputInt32(sound_buffer_length);
+                       state_fio->Fwrite(sound_buffer, sound_buffer_length, 1);
+               } else {
+                       state_fio->FputInt32(0);
+               }
+               state_fio->FputInt16(sound_sample);
        }
-       state_fio->FputInt16(sound_sample);
-#endif
+//#endif
        state_fio->FputBool(is_wav);
        state_fio->FputBool(is_tap);
        state_fio->FputBool(is_t77);
@@ -1864,13 +1920,15 @@ bool DATAREC::load_state(FILEIO* state_fio)
                buffer_bak = (uint8_t *)malloc(length_tmp);
                state_fio->Fread(buffer_bak, length_tmp, 1);
        }
-#ifdef DATAREC_SOUND
-       if((sound_buffer_length = state_fio->FgetInt32()) != 0) {
-               sound_buffer = (int16_t *)malloc(sound_buffer_length);
-               state_fio->Fread(sound_buffer, sound_buffer_length, 1);
+//#ifdef DATAREC_SOUND
+       if(__DATAREC_SOUND) {
+               if((sound_buffer_length = state_fio->FgetInt32()) != 0) {
+                       sound_buffer = (int16_t *)malloc(sound_buffer_length);
+                       state_fio->Fread(sound_buffer, sound_buffer_length, 1);
+               }
+               sound_sample = state_fio->FgetInt16();
        }
-       sound_sample = state_fio->FgetInt16();
-#endif
+//#endif
        is_wav = state_fio->FgetBool();
        is_tap = state_fio->FgetBool();
        is_t77 = state_fio->FgetBool();
@@ -1889,9 +1947,9 @@ bool DATAREC::load_state(FILEIO* state_fio)
        
        // post process
        pcm_last_vol_l = pcm_last_vol_r = 0;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
        sound_last_vol_l = sound_last_vol_r = 0;
-#endif
+//#endif
        return true;
 }
 
index fd213bd..de9b0b2 100644 (file)
@@ -10,8 +10,8 @@
 #ifndef _DREC_H_
 #define _DREC_H_
 
-#include "vm.h"
-#include "../emu.h"
+//#include "vm.h"
+//#include "../emu.h"
 #include "device.h"
 
 #define SIG_DATAREC_MIC                0
@@ -55,10 +55,10 @@ private:
        double sample_usec;
        int buffer_ptr, buffer_length;
        uint8_t *buffer, *buffer_bak;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
        int sound_buffer_length;
        int16_t *sound_buffer, sound_sample;
-#endif
+//#endif
        bool is_wav, is_tap, is_t77;
        double ave_hi_freq;
        
@@ -73,11 +73,19 @@ private:
        int pcm_max_vol;
        int32_t pcm_last_vol_l, pcm_last_vol_r;
        int pcm_volume_l, pcm_volume_r;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
        int32_t sound_last_vol_l, sound_last_vol_r;
        int sound_volume_l, sound_volume_r;
-#endif
+//#endif
        _TCHAR message[1024];
+
+
+       bool __DATAREC_SOUND;
+       bool __DATAREC_SOUND_LEFT;
+       bool __DATAREC_SOUND_RIGHT;
+       bool __TYPE_MZ80B;
+       double __DATAREC_FAST_FWD_SPEED;
+       double __DATAREC_FAST_REW_SPEED;
        
        void update_event();
        void update_realtime_render();
@@ -106,15 +114,18 @@ public:
                d_noise_play = NULL;
                d_noise_stop = NULL;
                d_noise_fast = NULL;
-#ifdef DATAREC_PCM_VOLUME
-               pcm_max_vol = DATAREC_PCM_VOLUME;
-#else
+//#ifdef DATAREC_PCM_VOLUME
+//             pcm_max_vol = DATAREC_PCM_VOLUME;
+//#else
                pcm_max_vol = 8000;
-#endif
+//#endif
                pcm_volume_l = pcm_volume_r = 1024;
-#ifdef DATAREC_SOUND
+//#ifdef DATAREC_SOUND
                sound_volume_l = sound_volume_r = 1024;
-#endif
+//#endif
+               __TYPE_MZ80B = false;
+               __DATAREC_SOUND = __DATAREC_SOUND_LEFT = __DATAREC_SOUND_RIGHT = false;
+               __DATAREC_FAST_FWD_SPEED = __DATAREC_FAST_REW_SPEED = 10.0;
                my_tcscpy_s(message, 1023, _T("Stop"));
                set_device_name(_T("Data Recorder"));
        }
index fbbaf09..0683840 100644 (file)
@@ -114,7 +114,6 @@ public:
                lines_per_frame = 0;
                next_frames_per_sec = FRAMES_PER_SEC;
                next_lines_per_frame = LINES_PER_FRAME;
-               
                // reset before other device may call set_realtime_render()
                memset(dev_need_mix, 0, sizeof(dev_need_mix));
                need_mix = 0;
index b1c162e..3db410b 100644 (file)
@@ -7,7 +7,10 @@
 
        [ MCS48 ]
 */
+#include "vm.h"
+#include "../emu.h"
 
+#include "mcs48_flags.h"
 #include "mcs48.h"
 #ifdef USE_DEBUGGER
 #include "debugger.h"
 #pragma warning( disable : 4244 )
 #endif
 
-#define INLINE inline
-
-/***************************************************************************
-    CONSTANTS
-***************************************************************************/
-
-/* timer/counter enable bits */
-#define TIMER_ENABLED   0x01
-#define COUNTER_ENABLED 0x02
-
-/* flag bits */
-#define C_FLAG          0x80
-#define A_FLAG          0x40
-#define F_FLAG          0x20
-#define B_FLAG          0x10
-
-/* status bits (UPI-41) */
-#define STS_F1          0x08
-#define STS_F0          0x04
-
-/* 8243 expander operations */
-enum
-{
-       MCS48_EXPANDER_OP_READ = 0,
-       MCS48_EXPANDER_OP_WRITE = 1,
-       MCS48_EXPANDER_OP_OR = 2,
-       MCS48_EXPANDER_OP_AND = 3
-};
-
-/***************************************************************************
-    TYPE DEFINITIONS
-***************************************************************************/
-
-/* live processor state */
-struct mcs48_state
-{
-       UINT16      prevpc;             /* 16-bit previous program counter */
-       UINT16      pc;                 /* 16-bit program counter */
-
-       UINT8       a;                  /* 8-bit accumulator */
-       int         regptr;             /* offset of r0-r7 */
-       UINT8       psw;                /* 8-bit cpustate->psw */
-       UINT8       p1;                 /* 8-bit latched port 1 */
-       UINT8       p2;                 /* 8-bit latched port 2 */
-       UINT8       timer;              /* 8-bit timer */
-       UINT8       prescaler;          /* 5-bit timer prescaler */
-       UINT8       t1_history;         /* 8-bit history of the T1 input */
-       UINT8       sts;                /* 8-bit status register */
-
-       UINT8       int_state;          /* INT signal status */
-       UINT8       irq_state;          /* TRUE if an IRQ is pending */
-       UINT8       irq_in_progress;    /* TRUE if an IRQ is in progress */
-       UINT8       timer_overflow;     /* TRUE on a timer overflow; cleared by taking interrupt */
-       UINT8       timer_flag;         /* TRUE on a timer overflow; cleared on JTF */
-       UINT8       tirq_enabled;       /* TRUE if the timer IRQ is enabled */
-       UINT8       xirq_enabled;       /* TRUE if the external IRQ is enabled */
-       UINT8       t0_clk_enabled;     /* TRUE if ent0_clk is called */
-       UINT8       timecount_enabled;  /* bitmask of timer/counter enabled */
-
-       UINT16      a11;                /* A11 value, either 0x000 or 0x800 */
-
-       DEVICE *    mem;
-       DEVICE *    io;
-       DEVICE *    intr;
-
-       int         icount;
-
-       UINT8       rom[0x1000];
-//     UINT8       ram[0x100];
-};
-
-/* opcode table entry */
-typedef int (*mcs48_ophandler)(mcs48_state *state);
-
-/***************************************************************************
-    MACROS
-***************************************************************************/
-
-#define program_r(a)    cpustate->rom[(a) & 0xfff]
-
-#define ram_r(a)        cpustate->mem->read_data8(a)
-#define ram_w(a,V)      cpustate->mem->write_data8(a, V)
-#define reg_r(a)        cpustate->mem->read_data8(cpustate->regptr + a)
-#define reg_w(a,V)      cpustate->mem->write_data8(cpustate->regptr + a, V)
-
-#define ext_r(a)        cpustate->io->read_io8(a)
-#define ext_w(a,V)      cpustate->io->write_io8(a, V)
-#define port_r(a)       cpustate->io->read_io8(MCS48_PORT_P0 + a)
-#define port_w(a,V)     cpustate->io->write_io8(MCS48_PORT_P0 + a, V)
-#define test_r(a)       cpustate->io->read_io8(MCS48_PORT_T0 + a)
-#define test_w(a,V)     cpustate->io->write_io8(MCS48_PORT_T0 + a, V)
-#define bus_r()         cpustate->io->read_io8(MCS48_PORT_BUS)
-#define bus_w(V)        cpustate->io->write_io8(MCS48_PORT_BUS, V)
-#define prog_w(V)       cpustate->io->write_io8(MCS48_PORT_PROG, V)
-
-/***************************************************************************
-    FUNCTION PROTOTYPES
-***************************************************************************/
-
-static int check_irqs(mcs48_state *cpustate);
-
-/***************************************************************************
-    INLINE FUNCTIONS
-***************************************************************************/
-
-/*-------------------------------------------------
-    opcode_fetch - fetch an opcode byte
--------------------------------------------------*/
-
-INLINE UINT8 opcode_fetch(mcs48_state *cpustate)
-{
-       return cpustate->rom[cpustate->pc++ & 0xfff];
-}
-
-/*-------------------------------------------------
-    argument_fetch - fetch an opcode argument
-    byte
--------------------------------------------------*/
-
-INLINE UINT8 argument_fetch(mcs48_state *cpustate)
-{
-       return cpustate->rom[cpustate->pc++ & 0xfff];
-}
-
-/*-------------------------------------------------
-    update_regptr - update the regptr member to
-    point to the appropriate register bank
--------------------------------------------------*/
-
-INLINE void update_regptr(mcs48_state *cpustate)
-{
-       cpustate->regptr = ((cpustate->psw & B_FLAG) ? 24 : 0);
-}
-
-/*-------------------------------------------------
-    push_pc_psw - push the cpustate->pc and cpustate->psw values onto
-    the stack
--------------------------------------------------*/
-
-INLINE void push_pc_psw(mcs48_state *cpustate)
-{
-       UINT8 sp = cpustate->psw & 0x07;
-       ram_w(8 + 2*sp, cpustate->pc);
-       ram_w(9 + 2*sp, ((cpustate->pc >> 8) & 0x0f) | (cpustate->psw & 0xf0));
-       cpustate->psw = (cpustate->psw & 0xf8) | ((sp + 1) & 0x07);
-}
-
-/*-------------------------------------------------
-    pull_pc_psw - pull the PC and PSW values from
-    the stack
--------------------------------------------------*/
-
-INLINE void pull_pc_psw(mcs48_state *cpustate)
-{
-       UINT8 sp = (cpustate->psw - 1) & 0x07;
-       cpustate->pc = ram_r(8 + 2*sp);
-       cpustate->pc |= ram_r(9 + 2*sp) << 8;
-       cpustate->psw = ((cpustate->pc >> 8) & 0xf0) | 0x08 | sp;
-       cpustate->pc &= 0xfff;
-       update_regptr(cpustate);
-}
-
-/*-------------------------------------------------
-    pull_pc - pull the PC value from the stack,
-    leaving the upper part of PSW intact
--------------------------------------------------*/
-
-INLINE void pull_pc(mcs48_state *cpustate)
-{
-       UINT8 sp = (cpustate->psw - 1) & 0x07;
-       cpustate->pc = ram_r(8 + 2*sp);
-       cpustate->pc |= ram_r(9 + 2*sp) << 8;
-       cpustate->pc &= 0xfff;
-       cpustate->psw = (cpustate->psw & 0xf0) | 0x08 | sp;
-}
-
-/*-------------------------------------------------
-    execute_add - perform the logic of an ADD
-    instruction
--------------------------------------------------*/
-
-INLINE void execute_add(mcs48_state *cpustate, UINT8 dat)
-{
-       UINT16 temp = cpustate->a + dat;
-       UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f);
-
-       cpustate->psw &= ~(C_FLAG | A_FLAG);
-       cpustate->psw |= (temp4 << 2) & A_FLAG;
-       cpustate->psw |= (temp >> 1) & C_FLAG;
-       cpustate->a = temp;
-}
-
-/*-------------------------------------------------
-    execute_addc - perform the logic of an ADDC
-    instruction
--------------------------------------------------*/
-
-INLINE void execute_addc(mcs48_state *cpustate, UINT8 dat)
-{
-       UINT8 carryin = (cpustate->psw & C_FLAG) >> 7;
-       UINT16 temp = cpustate->a + dat + carryin;
-       UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f) + carryin;
-
-       cpustate->psw &= ~(C_FLAG | A_FLAG);
-       cpustate->psw |= (temp4 << 2) & A_FLAG;
-       cpustate->psw |= (temp >> 1) & C_FLAG;
-       cpustate->a = temp;
-}
-
-/*-------------------------------------------------
-    execute_jmp - perform the logic of a JMP
-    instruction
--------------------------------------------------*/
-
-INLINE void execute_jmp(mcs48_state *cpustate, UINT16 address)
-{
-       UINT16 a11 = (cpustate->irq_in_progress) ? 0 : cpustate->a11;
-       cpustate->pc = address | a11;
-}
-
-/*-------------------------------------------------
-    execute_call - perform the logic of a CALL
-    instruction
--------------------------------------------------*/
-
-INLINE void execute_call(mcs48_state *cpustate, UINT16 address)
-{
-       push_pc_psw(cpustate);
-       execute_jmp(cpustate, address);
-}
-
-/*-------------------------------------------------
-    execute_jcc - perform the logic of a
-    conditional jump instruction
--------------------------------------------------*/
-
-INLINE void execute_jcc(mcs48_state *cpustate, UINT8 result)
-{
-       UINT8 offset = argument_fetch(cpustate);
-       if (result != 0)
-               cpustate->pc = ((cpustate->pc - 1) & 0xf00) | offset;
-}
-
-/*-------------------------------------------------
-    expander_operation - perform an operation via
-    the 8243 expander chip
--------------------------------------------------*/
-
-INLINE void expander_operation(mcs48_state *cpustate, UINT8 operation, UINT8 port)
-{
-       /* put opcode/data on low 4 bits of P2 */
-       port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (operation << 2) | (port & 3));
-
-       /* generate high-to-low transition on PROG line */
-       prog_w(0);
-
-       /* put data on low 4 bits of P2 */
-       if (operation != 0)
-               port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (cpustate->a & 0x0f));
-       else
-               cpustate->a = port_r(2) | 0x0f;
-
-       /* generate low-to-high transition on PROG line */
-       prog_w(1);
-}
-
-/***************************************************************************
-    OPCODE HANDLERS
-***************************************************************************/
-
-#define OPHANDLER(_name) static int _name(mcs48_state *cpustate)
-
-OPHANDLER( illegal )
-{
-//     logerror("MCS-48 PC:%04X - Illegal opcode = %02x\n", cpustate->pc - 1, program_r(cpustate->pc - 1));
-       return 1;
-}
-
-OPHANDLER( add_a_r0 )       { execute_add(cpustate, reg_r(0)); return 1; }
-OPHANDLER( add_a_r1 )       { execute_add(cpustate, reg_r(1)); return 1; }
-OPHANDLER( add_a_r2 )       { execute_add(cpustate, reg_r(2)); return 1; }
-OPHANDLER( add_a_r3 )       { execute_add(cpustate, reg_r(3)); return 1; }
-OPHANDLER( add_a_r4 )       { execute_add(cpustate, reg_r(4)); return 1; }
-OPHANDLER( add_a_r5 )       { execute_add(cpustate, reg_r(5)); return 1; }
-OPHANDLER( add_a_r6 )       { execute_add(cpustate, reg_r(6)); return 1; }
-OPHANDLER( add_a_r7 )       { execute_add(cpustate, reg_r(7)); return 1; }
-OPHANDLER( add_a_xr0 )      { execute_add(cpustate, ram_r(reg_r(0))); return 1; }
-OPHANDLER( add_a_xr1 )      { execute_add(cpustate, ram_r(reg_r(1))); return 1; }
-OPHANDLER( add_a_n )        { execute_add(cpustate, argument_fetch(cpustate)); return 2; }
-
-OPHANDLER( adc_a_r0 )       { execute_addc(cpustate, reg_r(0)); return 1; }
-OPHANDLER( adc_a_r1 )       { execute_addc(cpustate, reg_r(1)); return 1; }
-OPHANDLER( adc_a_r2 )       { execute_addc(cpustate, reg_r(2)); return 1; }
-OPHANDLER( adc_a_r3 )       { execute_addc(cpustate, reg_r(3)); return 1; }
-OPHANDLER( adc_a_r4 )       { execute_addc(cpustate, reg_r(4)); return 1; }
-OPHANDLER( adc_a_r5 )       { execute_addc(cpustate, reg_r(5)); return 1; }
-OPHANDLER( adc_a_r6 )       { execute_addc(cpustate, reg_r(6)); return 1; }
-OPHANDLER( adc_a_r7 )       { execute_addc(cpustate, reg_r(7)); return 1; }
-OPHANDLER( adc_a_xr0 )      { execute_addc(cpustate, ram_r(reg_r(0))); return 1; }
-OPHANDLER( adc_a_xr1 )      { execute_addc(cpustate, ram_r(reg_r(1))); return 1; }
-OPHANDLER( adc_a_n )        { execute_addc(cpustate, argument_fetch(cpustate)); return 2; }
-
-OPHANDLER( anl_a_r0 )       { cpustate->a &= reg_r(0); return 1; }
-OPHANDLER( anl_a_r1 )       { cpustate->a &= reg_r(1); return 1; }
-OPHANDLER( anl_a_r2 )       { cpustate->a &= reg_r(2); return 1; }
-OPHANDLER( anl_a_r3 )       { cpustate->a &= reg_r(3); return 1; }
-OPHANDLER( anl_a_r4 )       { cpustate->a &= reg_r(4); return 1; }
-OPHANDLER( anl_a_r5 )       { cpustate->a &= reg_r(5); return 1; }
-OPHANDLER( anl_a_r6 )       { cpustate->a &= reg_r(6); return 1; }
-OPHANDLER( anl_a_r7 )       { cpustate->a &= reg_r(7); return 1; }
-OPHANDLER( anl_a_xr0 )      { cpustate->a &= ram_r(reg_r(0)); return 1; }
-OPHANDLER( anl_a_xr1 )      { cpustate->a &= ram_r(reg_r(1)); return 1; }
-OPHANDLER( anl_a_n )        { cpustate->a &= argument_fetch(cpustate); return 2; }
-
-OPHANDLER( anl_bus_n )      { bus_w(bus_r() & argument_fetch(cpustate)); return 2; }
-OPHANDLER( anl_p1_n )       { port_w(1, cpustate->p1 &= argument_fetch(cpustate)); return 2; }
-OPHANDLER( anl_p2_n )       { port_w(2, cpustate->p2 &= argument_fetch(cpustate)); return 2; }
-OPHANDLER( anld_p4_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 4); return 2; }
-OPHANDLER( anld_p5_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 5); return 2; }
-OPHANDLER( anld_p6_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 6); return 2; }
-OPHANDLER( anld_p7_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 7); return 2; }
-
-OPHANDLER( call_0 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
-OPHANDLER( call_1 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
-OPHANDLER( call_2 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
-OPHANDLER( call_3 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
-OPHANDLER( call_4 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
-OPHANDLER( call_5 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
-OPHANDLER( call_6 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
-OPHANDLER( call_7 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
-
-OPHANDLER( clr_a )          { cpustate->a = 0; return 1; }
-OPHANDLER( clr_c )          { cpustate->psw &= ~C_FLAG; return 1; }
-OPHANDLER( clr_f0 )         { cpustate->psw &= ~F_FLAG; cpustate->sts &= ~STS_F0; return 1; }
-OPHANDLER( clr_f1 )         { cpustate->sts &= ~STS_F1; return 1; }
-
-OPHANDLER( cpl_a )          { cpustate->a ^= 0xff; return 1; }
-OPHANDLER( cpl_c )          { cpustate->psw ^= C_FLAG; return 1; }
-OPHANDLER( cpl_f0 )         { cpustate->psw ^= F_FLAG; cpustate->sts ^= STS_F0; return 1; }
-OPHANDLER( cpl_f1 )         { cpustate->sts ^= STS_F1; return 1; }
-
-OPHANDLER( da_a )
-{
-       if ((cpustate->a & 0x0f) > 0x09 || (cpustate->psw & A_FLAG))
-       {
-               cpustate->a += 0x06;
-               if ((cpustate->a & 0xf0) == 0x00)
-                       cpustate->psw |= C_FLAG;
-       }
-       if ((cpustate->a & 0xf0) > 0x90 || (cpustate->psw & C_FLAG))
-       {
-               cpustate->a += 0x60;
-               cpustate->psw |= C_FLAG;
-       }
-       else
-               cpustate->psw &= ~C_FLAG;
-       return 1;
-}
-
-OPHANDLER( dec_a )          { cpustate->a--; return 1; }
-OPHANDLER( dec_r0 )         { reg_w(0, reg_r(0) - 1); return 1; }
-OPHANDLER( dec_r1 )         { reg_w(1, reg_r(1) - 1); return 1; }
-OPHANDLER( dec_r2 )         { reg_w(2, reg_r(2) - 1); return 1; }
-OPHANDLER( dec_r3 )         { reg_w(3, reg_r(3) - 1); return 1; }
-OPHANDLER( dec_r4 )         { reg_w(4, reg_r(4) - 1); return 1; }
-OPHANDLER( dec_r5 )         { reg_w(5, reg_r(5) - 1); return 1; }
-OPHANDLER( dec_r6 )         { reg_w(6, reg_r(6) - 1); return 1; }
-OPHANDLER( dec_r7 )         { reg_w(7, reg_r(7) - 1); return 1; }
-
-OPHANDLER( dis_i )          { cpustate->xirq_enabled = FALSE; return 1; }
-OPHANDLER( dis_tcnti )      { cpustate->tirq_enabled = FALSE; cpustate->timer_overflow = FALSE; return 1; }
-
-OPHANDLER( djnz_r0 )        { UINT8 r0 = reg_r(0); reg_w(0, --r0); execute_jcc(cpustate, r0 != 0); return 2; }
-OPHANDLER( djnz_r1 )        { UINT8 r1 = reg_r(1); reg_w(1, --r1); execute_jcc(cpustate, r1 != 0); return 2; }
-OPHANDLER( djnz_r2 )        { UINT8 r2 = reg_r(2); reg_w(2, --r2); execute_jcc(cpustate, r2 != 0); return 2; }
-OPHANDLER( djnz_r3 )        { UINT8 r3 = reg_r(3); reg_w(3, --r3); execute_jcc(cpustate, r3 != 0); return 2; }
-OPHANDLER( djnz_r4 )        { UINT8 r4 = reg_r(4); reg_w(4, --r4); execute_jcc(cpustate, r4 != 0); return 2; }
-OPHANDLER( djnz_r5 )        { UINT8 r5 = reg_r(5); reg_w(5, --r5); execute_jcc(cpustate, r5 != 0); return 2; }
-OPHANDLER( djnz_r6 )        { UINT8 r6 = reg_r(6); reg_w(6, --r6); execute_jcc(cpustate, r6 != 0); return 2; }
-OPHANDLER( djnz_r7 )        { UINT8 r7 = reg_r(7); reg_w(7, --r7); execute_jcc(cpustate, r7 != 0); return 2; }
-
-OPHANDLER( en_i )           { cpustate->xirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
-OPHANDLER( en_tcnti )       { cpustate->tirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
-OPHANDLER( ent0_clk )       { cpustate->t0_clk_enabled = TRUE; return 1; }
-
-OPHANDLER( in_a_p1 )        { cpustate->a = port_r(1) & cpustate->p1; return 2; }
-OPHANDLER( in_a_p2 )        { cpustate->a = port_r(2) & cpustate->p2; return 2; }
-OPHANDLER( ins_a_bus )      { cpustate->a = bus_r(); return 2; }
-
-OPHANDLER( inc_a )          { cpustate->a++; return 1; }
-OPHANDLER( inc_r0 )         { reg_w(0, reg_r(0) + 1); return 1; }
-OPHANDLER( inc_r1 )         { reg_w(1, reg_r(1) + 1); return 1; }
-OPHANDLER( inc_r2 )         { reg_w(2, reg_r(2) + 1); return 1; }
-OPHANDLER( inc_r3 )         { reg_w(3, reg_r(3) + 1); return 1; }
-OPHANDLER( inc_r4 )         { reg_w(4, reg_r(4) + 1); return 1; }
-OPHANDLER( inc_r5 )         { reg_w(5, reg_r(5) + 1); return 1; }
-OPHANDLER( inc_r6 )         { reg_w(6, reg_r(6) + 1); return 1; }
-OPHANDLER( inc_r7 )         { reg_w(7, reg_r(7) + 1); return 1; }
-OPHANDLER( inc_xr0 )        { UINT8 r0 = reg_r(0); ram_w(r0, ram_r(r0) + 1); return 1; }
-OPHANDLER( inc_xr1 )        { UINT8 r1 = reg_r(1); ram_w(r1, ram_r(r1) + 1); return 1; }
-
-OPHANDLER( jb_0 )           { execute_jcc(cpustate, (cpustate->a & 0x01) != 0); return 2; }
-OPHANDLER( jb_1 )           { execute_jcc(cpustate, (cpustate->a & 0x02) != 0); return 2; }
-OPHANDLER( jb_2 )           { execute_jcc(cpustate, (cpustate->a & 0x04) != 0); return 2; }
-OPHANDLER( jb_3 )           { execute_jcc(cpustate, (cpustate->a & 0x08) != 0); return 2; }
-OPHANDLER( jb_4 )           { execute_jcc(cpustate, (cpustate->a & 0x10) != 0); return 2; }
-OPHANDLER( jb_5 )           { execute_jcc(cpustate, (cpustate->a & 0x20) != 0); return 2; }
-OPHANDLER( jb_6 )           { execute_jcc(cpustate, (cpustate->a & 0x40) != 0); return 2; }
-OPHANDLER( jb_7 )           { execute_jcc(cpustate, (cpustate->a & 0x80) != 0); return 2; }
-OPHANDLER( jc )             { execute_jcc(cpustate, (cpustate->psw & C_FLAG) != 0); return 2; }
-OPHANDLER( jf0 )            { execute_jcc(cpustate, (cpustate->psw & F_FLAG) != 0); return 2; }
-OPHANDLER( jf1 )            { execute_jcc(cpustate, (cpustate->sts & STS_F1) != 0); return 2; }
-OPHANDLER( jnc )            { execute_jcc(cpustate, (cpustate->psw & C_FLAG) == 0); return 2; }
-OPHANDLER( jni )            { execute_jcc(cpustate, cpustate->int_state == 0); return 2; }
-OPHANDLER( jnt_0 )          { execute_jcc(cpustate, test_r(0) == 0); return 2; }
-OPHANDLER( jnt_1 )          { execute_jcc(cpustate, test_r(1) == 0); return 2; }
-OPHANDLER( jnz )            { execute_jcc(cpustate, cpustate->a != 0); return 2; }
-OPHANDLER( jtf )            { execute_jcc(cpustate, cpustate->timer_flag); cpustate->timer_flag = FALSE; return 2; }
-OPHANDLER( jt_0 )           { execute_jcc(cpustate, test_r(0) != 0); return 2; }
-OPHANDLER( jt_1 )           { execute_jcc(cpustate, test_r(1) != 0); return 2; }
-OPHANDLER( jz )             { execute_jcc(cpustate, cpustate->a == 0); return 2; }
-
-OPHANDLER( jmp_0 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
-OPHANDLER( jmp_1 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
-OPHANDLER( jmp_2 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
-OPHANDLER( jmp_3 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
-OPHANDLER( jmp_4 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
-OPHANDLER( jmp_5 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
-OPHANDLER( jmp_6 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
-OPHANDLER( jmp_7 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
-OPHANDLER( jmpp_xa )        { cpustate->pc &= 0xf00; cpustate->pc |= program_r(cpustate->pc | cpustate->a); return 2; }
-
-OPHANDLER( mov_a_n )        { cpustate->a = argument_fetch(cpustate); return 2; }
-OPHANDLER( mov_a_psw )      { cpustate->a = cpustate->psw; return 1; }
-OPHANDLER( mov_a_r0 )       { cpustate->a = reg_r(0); return 1; }
-OPHANDLER( mov_a_r1 )       { cpustate->a = reg_r(1); return 1; }
-OPHANDLER( mov_a_r2 )       { cpustate->a = reg_r(2); return 1; }
-OPHANDLER( mov_a_r3 )       { cpustate->a = reg_r(3); return 1; }
-OPHANDLER( mov_a_r4 )       { cpustate->a = reg_r(4); return 1; }
-OPHANDLER( mov_a_r5 )       { cpustate->a = reg_r(5); return 1; }
-OPHANDLER( mov_a_r6 )       { cpustate->a = reg_r(6); return 1; }
-OPHANDLER( mov_a_r7 )       { cpustate->a = reg_r(7); return 1; }
-OPHANDLER( mov_a_xr0 )      { cpustate->a = ram_r(reg_r(0)); return 1; }
-OPHANDLER( mov_a_xr1 )      { cpustate->a = ram_r(reg_r(1)); return 1; }
-OPHANDLER( mov_a_t )        { cpustate->a = cpustate->timer; return 1; }
-
-OPHANDLER( mov_psw_a )      { cpustate->psw = cpustate->a; update_regptr(cpustate); return 1; }
-OPHANDLER( mov_r0_a )       { reg_w(0, cpustate->a); return 1; }
-OPHANDLER( mov_r1_a )       { reg_w(1, cpustate->a); return 1; }
-OPHANDLER( mov_r2_a )       { reg_w(2, cpustate->a); return 1; }
-OPHANDLER( mov_r3_a )       { reg_w(3, cpustate->a); return 1; }
-OPHANDLER( mov_r4_a )       { reg_w(4, cpustate->a); return 1; }
-OPHANDLER( mov_r5_a )       { reg_w(5, cpustate->a); return 1; }
-OPHANDLER( mov_r6_a )       { reg_w(6, cpustate->a); return 1; }
-OPHANDLER( mov_r7_a )       { reg_w(7, cpustate->a); return 1; }
-OPHANDLER( mov_r0_n )       { reg_w(0, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r1_n )       { reg_w(1, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r2_n )       { reg_w(2, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r3_n )       { reg_w(3, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r4_n )       { reg_w(4, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r5_n )       { reg_w(5, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r6_n )       { reg_w(6, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_r7_n )       { reg_w(7, argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_t_a )        { cpustate->timer = cpustate->a; return 1; }
-OPHANDLER( mov_xr0_a )      { ram_w(reg_r(0), cpustate->a); return 1; }
-OPHANDLER( mov_xr1_a )      { ram_w(reg_r(1), cpustate->a); return 1; }
-OPHANDLER( mov_xr0_n )      { ram_w(reg_r(0), argument_fetch(cpustate)); return 2; }
-OPHANDLER( mov_xr1_n )      { ram_w(reg_r(1), argument_fetch(cpustate)); return 2; }
-
-OPHANDLER( movd_a_p4 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 4); return 2; }
-OPHANDLER( movd_a_p5 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 5); return 2; }
-OPHANDLER( movd_a_p6 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 6); return 2; }
-OPHANDLER( movd_a_p7 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 7); return 2; }
-OPHANDLER( movd_p4_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 4); return 2; }
-OPHANDLER( movd_p5_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 5); return 2; }
-OPHANDLER( movd_p6_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 6); return 2; }
-OPHANDLER( movd_p7_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 7); return 2; }
-
-OPHANDLER( movp_a_xa )      { cpustate->a = program_r((cpustate->pc & 0xf00) | cpustate->a); return 2; }
-OPHANDLER( movp3_a_xa )     { cpustate->a = program_r(0x300 | cpustate->a); return 2; }
-
-OPHANDLER( movx_a_xr0 )     { cpustate->a = ext_r(reg_r(0)); return 2; }
-OPHANDLER( movx_a_xr1 )     { cpustate->a = ext_r(reg_r(1)); return 2; }
-OPHANDLER( movx_xr0_a )     { ext_w(reg_r(0), cpustate->a); return 2; }
-OPHANDLER( movx_xr1_a )     { ext_w(reg_r(1), cpustate->a); return 2; }
-
-OPHANDLER( nop )            { return 1; }
-
-OPHANDLER( orl_a_r0 )       { cpustate->a |= reg_r(0); return 1; }
-OPHANDLER( orl_a_r1 )       { cpustate->a |= reg_r(1); return 1; }
-OPHANDLER( orl_a_r2 )       { cpustate->a |= reg_r(2); return 1; }
-OPHANDLER( orl_a_r3 )       { cpustate->a |= reg_r(3); return 1; }
-OPHANDLER( orl_a_r4 )       { cpustate->a |= reg_r(4); return 1; }
-OPHANDLER( orl_a_r5 )       { cpustate->a |= reg_r(5); return 1; }
-OPHANDLER( orl_a_r6 )       { cpustate->a |= reg_r(6); return 1; }
-OPHANDLER( orl_a_r7 )       { cpustate->a |= reg_r(7); return 1; }
-OPHANDLER( orl_a_xr0 )      { cpustate->a |= ram_r(reg_r(0)); return 1; }
-OPHANDLER( orl_a_xr1 )      { cpustate->a |= ram_r(reg_r(1)); return 1; }
-OPHANDLER( orl_a_n )        { cpustate->a |= argument_fetch(cpustate); return 2; }
-
-OPHANDLER( orl_bus_n )      { bus_w(bus_r() | argument_fetch(cpustate)); return 2; }
-OPHANDLER( orl_p1_n )       { port_w(1, cpustate->p1 |= argument_fetch(cpustate)); return 2; }
-OPHANDLER( orl_p2_n )       { port_w(2, cpustate->p2 |= argument_fetch(cpustate)); return 2; }
-OPHANDLER( orld_p4_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 4); return 2; }
-OPHANDLER( orld_p5_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 5); return 2; }
-OPHANDLER( orld_p6_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 6); return 2; }
-OPHANDLER( orld_p7_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 7); return 2; }
-
-OPHANDLER( outl_bus_a )     { bus_w(cpustate->a); return 2; }
-OPHANDLER( outl_p1_a )      { port_w(1, cpustate->p1 = cpustate->a); return 2; }
-OPHANDLER( outl_p2_a )      { port_w(2, cpustate->p2 = cpustate->a); return 2; }
-
-OPHANDLER( ret )            { pull_pc(cpustate); return 2; }
-OPHANDLER( retr )
-{
-       pull_pc_psw(cpustate);
-
-       /* implicitly clear the IRQ in progress flip flop and re-check interrupts */
-       cpustate->irq_in_progress = FALSE;
-       return 2 + check_irqs(cpustate);
-}
-
-OPHANDLER( rl_a )           { cpustate->a = (cpustate->a << 1) | (cpustate->a >> 7); return 1; }
-OPHANDLER( rlc_a )          { UINT8 newc = cpustate->a & C_FLAG; cpustate->a = (cpustate->a << 1) | (cpustate->psw >> 7); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
-
-OPHANDLER( rr_a )           { cpustate->a = (cpustate->a >> 1) | (cpustate->a << 7); return 1; }
-OPHANDLER( rrc_a )          { UINT8 newc = (cpustate->a << 7) & C_FLAG; cpustate->a = (cpustate->a >> 1) | (cpustate->psw & C_FLAG); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
-
-OPHANDLER( sel_mb0 )        { cpustate->a11 = 0x000; return 1; }
-OPHANDLER( sel_mb1 )        { cpustate->a11 = 0x800; return 1; }
-
-OPHANDLER( sel_rb0 )        { cpustate->psw &= ~B_FLAG; update_regptr(cpustate); return 1; }
-OPHANDLER( sel_rb1 )        { cpustate->psw |=  B_FLAG; update_regptr(cpustate); return 1; }
-
-OPHANDLER( stop_tcnt )      { cpustate->timecount_enabled = 0; return 1; }
-
-OPHANDLER( strt_cnt )       { cpustate->timecount_enabled = COUNTER_ENABLED; cpustate->t1_history = test_r(1); return 1; }
-OPHANDLER( strt_t )         { cpustate->timecount_enabled = TIMER_ENABLED; cpustate->prescaler = 0; return 1; }
-
-OPHANDLER( swap_a )         { cpustate->a = (cpustate->a << 4) | (cpustate->a >> 4); return 1; }
-
-OPHANDLER( xch_a_r0 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(0); reg_w(0, tmp); return 1; }
-OPHANDLER( xch_a_r1 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(1); reg_w(1, tmp); return 1; }
-OPHANDLER( xch_a_r2 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(2); reg_w(2, tmp); return 1; }
-OPHANDLER( xch_a_r3 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(3); reg_w(3, tmp); return 1; }
-OPHANDLER( xch_a_r4 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(4); reg_w(4, tmp); return 1; }
-OPHANDLER( xch_a_r5 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(5); reg_w(5, tmp); return 1; }
-OPHANDLER( xch_a_r6 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(6); reg_w(6, tmp); return 1; }
-OPHANDLER( xch_a_r7 )       { UINT8 tmp = cpustate->a; cpustate->a = reg_r(7); reg_w(7, tmp); return 1; }
-OPHANDLER( xch_a_xr0 )      { UINT8 r0 = reg_r(0); UINT8 tmp = cpustate->a; cpustate->a = ram_r(r0); ram_w(r0, tmp); return 1; }
-OPHANDLER( xch_a_xr1 )      { UINT8 r1 = reg_r(1); UINT8 tmp = cpustate->a; cpustate->a = ram_r(r1); ram_w(r1, tmp); return 1; }
-
-OPHANDLER( xchd_a_xr0 )     { UINT8 r0 = reg_r(0); UINT8 oldram = ram_r(r0); ram_w(r0, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
-OPHANDLER( xchd_a_xr1 )     { UINT8 r1 = reg_r(1); UINT8 oldram = ram_r(r1); ram_w(r1, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
-
-OPHANDLER( xrl_a_r0 )       { cpustate->a ^= reg_r(0); return 1; }
-OPHANDLER( xrl_a_r1 )       { cpustate->a ^= reg_r(1); return 1; }
-OPHANDLER( xrl_a_r2 )       { cpustate->a ^= reg_r(2); return 1; }
-OPHANDLER( xrl_a_r3 )       { cpustate->a ^= reg_r(3); return 1; }
-OPHANDLER( xrl_a_r4 )       { cpustate->a ^= reg_r(4); return 1; }
-OPHANDLER( xrl_a_r5 )       { cpustate->a ^= reg_r(5); return 1; }
-OPHANDLER( xrl_a_r6 )       { cpustate->a ^= reg_r(6); return 1; }
-OPHANDLER( xrl_a_r7 )       { cpustate->a ^= reg_r(7); return 1; }
-OPHANDLER( xrl_a_xr0 )      { cpustate->a ^= ram_r(reg_r(0)); return 1; }
-OPHANDLER( xrl_a_xr1 )      { cpustate->a ^= ram_r(reg_r(1)); return 1; }
-OPHANDLER( xrl_a_n )        { cpustate->a ^= argument_fetch(cpustate); return 2; }
-
-/***************************************************************************
-    OPCODE TABLES
-***************************************************************************/
-
-static const mcs48_ophandler opcode_table[256]=
-{
-       nop,        illegal,    outl_bus_a,add_a_n,   jmp_0,     en_i,       illegal,   dec_a,         /* 00 */
-       ins_a_bus,  in_a_p1,    in_a_p2,   illegal,   movd_a_p4, movd_a_p5,  movd_a_p6, movd_a_p7,
-       inc_xr0,    inc_xr1,    jb_0,      adc_a_n,   call_0,    dis_i,      jtf,       inc_a,         /* 10 */
-       inc_r0,     inc_r1,     inc_r2,    inc_r3,    inc_r4,    inc_r5,     inc_r6,    inc_r7,
-       xch_a_xr0,  xch_a_xr1,  illegal,   mov_a_n,   jmp_1,     en_tcnti,   jnt_0,     clr_a,         /* 20 */
-       xch_a_r0,   xch_a_r1,   xch_a_r2,  xch_a_r3,  xch_a_r4,  xch_a_r5,   xch_a_r6,  xch_a_r7,
-       xchd_a_xr0, xchd_a_xr1, jb_1,      illegal,   call_1,    dis_tcnti,  jt_0,      cpl_a,         /* 30 */
-       illegal,    outl_p1_a,  outl_p2_a, illegal,   movd_p4_a, movd_p5_a,  movd_p6_a, movd_p7_a,
-       orl_a_xr0,  orl_a_xr1,  mov_a_t,   orl_a_n,   jmp_2,     strt_cnt,   jnt_1,     swap_a,        /* 40 */
-       orl_a_r0,   orl_a_r1,   orl_a_r2,  orl_a_r3,  orl_a_r4,  orl_a_r5,   orl_a_r6,  orl_a_r7,
-       anl_a_xr0,  anl_a_xr1,  jb_2,      anl_a_n,   call_2,    strt_t,     jt_1,      da_a,          /* 50 */
-       anl_a_r0,   anl_a_r1,   anl_a_r2,  anl_a_r3,  anl_a_r4,  anl_a_r5,   anl_a_r6,  anl_a_r7,
-       add_a_xr0,  add_a_xr1,  mov_t_a,   illegal,   jmp_3,     stop_tcnt,  illegal,   rrc_a,         /* 60 */
-       add_a_r0,   add_a_r1,   add_a_r2,  add_a_r3,  add_a_r4,  add_a_r5,   add_a_r6,  add_a_r7,
-       adc_a_xr0,  adc_a_xr1,  jb_3,      illegal,   call_3,    ent0_clk,   jf1,       rr_a,          /* 70 */
-       adc_a_r0,   adc_a_r1,   adc_a_r2,  adc_a_r3,  adc_a_r4,  adc_a_r5,   adc_a_r6,  adc_a_r7,
-       movx_a_xr0, movx_a_xr1, illegal,   ret,       jmp_4,     clr_f0,     jni,       illegal,       /* 80 */
-       orl_bus_n,  orl_p1_n,   orl_p2_n,  illegal,   orld_p4_a, orld_p5_a,  orld_p6_a, orld_p7_a,
-       movx_xr0_a, movx_xr1_a, jb_4,      retr,      call_4,    cpl_f0,     jnz,       clr_c,         /* 90 */
-       anl_bus_n,  anl_p1_n,   anl_p2_n,  illegal,   anld_p4_a, anld_p5_a,  anld_p6_a, anld_p7_a,
-       mov_xr0_a,  mov_xr1_a,  illegal,   movp_a_xa, jmp_5,     clr_f1,     illegal,   cpl_c,         /* A0 */
-       mov_r0_a,   mov_r1_a,   mov_r2_a,  mov_r3_a,  mov_r4_a,  mov_r5_a,   mov_r6_a,  mov_r7_a,
-       mov_xr0_n,  mov_xr1_n,  jb_5,      jmpp_xa,   call_5,    cpl_f1,     jf0,       illegal,       /* B0 */
-       mov_r0_n,   mov_r1_n,   mov_r2_n,  mov_r3_n,  mov_r4_n,  mov_r5_n,   mov_r6_n,  mov_r7_n,
-       illegal,    illegal,    illegal,   illegal,   jmp_6,     sel_rb0,    jz,        mov_a_psw,     /* C0 */
-       dec_r0,     dec_r1,     dec_r2,    dec_r3,    dec_r4,    dec_r5,     dec_r6,    dec_r7,
-       xrl_a_xr0,  xrl_a_xr1,  jb_6,      xrl_a_n,   call_6,    sel_rb1,    illegal,   mov_psw_a,     /* D0 */
-       xrl_a_r0,   xrl_a_r1,   xrl_a_r2,  xrl_a_r3,  xrl_a_r4,  xrl_a_r5,   xrl_a_r6,  xrl_a_r7,
-       illegal,    illegal,    illegal,   movp3_a_xa,jmp_7,     sel_mb0,    jnc,       rl_a,          /* E0 */
-       djnz_r0,    djnz_r1,    djnz_r2,   djnz_r3,   djnz_r4,   djnz_r5,    djnz_r6,   djnz_r7,
-       mov_a_xr0,  mov_a_xr1,  jb_7,      illegal,   call_7,    sel_mb1,    jc,        rlc_a,         /* F0 */
-       mov_a_r0,   mov_a_r1,   mov_a_r2,  mov_a_r3,  mov_a_r4,  mov_a_r5,   mov_a_r6,  mov_a_r7
-};
-
 /***************************************************************************
     INITIALIZATION/RESET
 ***************************************************************************/
@@ -668,106 +64,17 @@ void MCS48::release()
        free(opaque);
 }
 
-void MCS48::reset()
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       
-       /* confirmed from reset description */
-       cpustate->pc = 0;
-       cpustate->psw = (cpustate->psw & (C_FLAG | A_FLAG)) | 0x08;
-       cpustate->a11 = 0x000;
-//     bus_w(0xff);
-       cpustate->p1 = 0xff;
-       cpustate->p2 = 0xff;
-//     port_w(1, cpustate->p1);
-//     port_w(2, cpustate->p2);
-       cpustate->tirq_enabled = FALSE;
-       cpustate->xirq_enabled = FALSE;
-       cpustate->t0_clk_enabled = FALSE;
-       cpustate->timecount_enabled = 0;
-       cpustate->timer_flag = FALSE;
-       cpustate->sts = 0;
-       
-       cpustate->icount = 0;
-       
-       /* confirmed from interrupt logic description */
-       cpustate->int_state = TRUE;
-       cpustate->irq_state = cpustate->irq_in_progress = FALSE;
-       cpustate->timer_overflow = FALSE;
-}
-
-void MCS48::load_rom_image(const _TCHAR *file_path)
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       
-       memset(cpustate->rom, 0, sizeof(cpustate->rom));
-       
-       FILEIO* fio = new FILEIO();
-       if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
-               fio->Fread(cpustate->rom, sizeof(cpustate->rom), 1);
-               fio->Fclose();
-       }
-       delete fio;
-}
-
-uint8_t *MCS48::get_rom_ptr()
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       return cpustate->rom;
-}
-
 /***************************************************************************
     EXECUTION
 ***************************************************************************/
 
-/*-------------------------------------------------
-    check_irqs - check for and process IRQs
--------------------------------------------------*/
-
-static int check_irqs(mcs48_state *cpustate)
-{
-       /* if something is in progress, we do nothing */
-       if (cpustate->irq_in_progress)
-               return 0;
-
-       /* external interrupts take priority */
-       if (cpustate->irq_state && cpustate->xirq_enabled)
-       {
-               cpustate->irq_state = FALSE;
-               cpustate->irq_in_progress = TRUE;
-
-               /* transfer to location 0x03 */
-               push_pc_psw(cpustate);
-               cpustate->pc = 0x03;
-
-               /* indicate we took the external IRQ */
-               if (cpustate->intr != NULL)
-                       cpustate->intr->get_intr_ack();
-               return 2;
-       }
-
-       /* timer overflow interrupts follow */
-       if (cpustate->timer_overflow && cpustate->tirq_enabled)
-       {
-               cpustate->irq_in_progress = TRUE;
-
-               /* transfer to location 0x07 */
-               push_pc_psw(cpustate);
-               cpustate->pc = 0x07;
-
-               /* timer overflow flip-flop is reset once taken */
-               cpustate->timer_overflow = FALSE;
-               return 2;
-       }
-       return 0;
-}
 
 /*-------------------------------------------------
     burn_cycles - burn cycles, processing timers
     and counters
 -------------------------------------------------*/
 
-static void burn_cycles(mcs48_state *cpustate, int count)
+void MCS48::burn_cycles(mcs48_state *cpustate, int count)
 {
        int timerover = FALSE;
 
@@ -776,13 +83,13 @@ static void burn_cycles(mcs48_state *cpustate, int count)
        {
                for(int i = 0; i < count * 5; i++)
                {
-                       test_w(0, 1);
-                       test_w(0, 0);
+                       __mcs48_test_w(0, 1);
+                       __mcs48_test_w(0, 0);
                }
        }
 
        /* if the timer is enabled, accumulate prescaler cycles */
-       if (cpustate->timecount_enabled & TIMER_ENABLED)
+       if (cpustate->timecount_enabled & __MCS48_TIMER_ENABLED)
        {
                UINT8 oldtimer = cpustate->timer;
                cpustate->prescaler += count;
@@ -792,10 +99,10 @@ static void burn_cycles(mcs48_state *cpustate, int count)
        }
 
        /* if the counter is enabled, poll the T1 test input once for each cycle */
-       else if (cpustate->timecount_enabled & COUNTER_ENABLED)
+       else if (cpustate->timecount_enabled & __MCS48_COUNTER_ENABLED)
                for ( ; count > 0; count--)
                {
-                       cpustate->t1_history = (cpustate->t1_history << 1) | (test_r(1) & 1);
+                       cpustate->t1_history = (cpustate->t1_history << 1) | (__mcs48_test_r(1) & 1);
                        if ((cpustate->t1_history & 3) == 2)
                                timerover = (++cpustate->timer == 0);
                }
@@ -859,10 +166,7 @@ int MCS48::run(int icount)
                        
                        /* fetch next opcode */
                        cpustate->prevpc = cpustate->pc;
-                       unsigned opcode = opcode_fetch(cpustate);
-
-                       /* process opcode and count cycles */
-                       curcycles = (*opcode_table[opcode])(cpustate);
+                       curcycles = op_call(cpustate);
 
                        /* burn the cycles */
                        cpustate->icount -= curcycles * 15;
@@ -880,10 +184,7 @@ int MCS48::run(int icount)
 #endif
                        /* fetch next opcode */
                        cpustate->prevpc = cpustate->pc;
-                       unsigned opcode = opcode_fetch(cpustate);
-
-                       /* process opcode and count cycles */
-                       curcycles = (*opcode_table[opcode])(cpustate);
+                       curcycles = op_call(cpustate);
 
                        /* burn the cycles */
                        cpustate->icount -= curcycles * 15;
@@ -897,426 +198,9 @@ int MCS48::run(int icount)
        return base_icount - cpustate->icount;
 }
 
-uint32_t MCS48::get_pc()
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       return cpustate->prevpc;
-}
-
-uint32_t MCS48::get_next_pc()
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       return cpustate->pc;
-}
-
-/***************************************************************************
-    GENERAL CONTEXT ACCESS
-***************************************************************************/
-
-void MCS48::write_signal(int id, uint32_t data, uint32_t mask)
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       
-       if(id == SIG_CPU_IRQ) {
-               UINT8 prev = cpustate->int_state;
-               cpustate->int_state = ((data & mask) != 0);
-               // INT H->L
-               if(prev && !cpustate->int_state) {
-                       cpustate->irq_state = TRUE;
-               }
-       }
-}
-
-#ifdef USE_DEBUGGER
-void MCS48::write_debug_data8(uint32_t addr, uint32_t data)
-{
-       d_mem_stored->write_data8(addr, data);
-}
-
-uint32_t MCS48::read_debug_data8(uint32_t addr)
-{
-       return d_mem_stored->read_data8(addr);
-}
-
-void MCS48::write_debug_io8(uint32_t addr, uint32_t data)
-{
-       d_io_stored->write_io8(addr, data);
-}
-
-uint32_t MCS48::read_debug_io8(uint32_t addr)
-{
-       return d_io_stored->read_io8(addr);
-}
-
-bool MCS48::write_debug_reg(const _TCHAR *reg, uint32_t data)
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       
-       if(_tcsicmp(reg, _T("R0")) == 0) {
-               reg_w(0, data);
-       } else if(_tcsicmp(reg, _T("R1")) == 0) {
-               reg_w(1, data);
-       } else if(_tcsicmp(reg, _T("R2")) == 0) {
-               reg_w(2, data);
-       } else if(_tcsicmp(reg, _T("R3")) == 0) {
-               reg_w(3, data);
-       } else if(_tcsicmp(reg, _T("R4")) == 0) {
-               reg_w(4, data);
-       } else if(_tcsicmp(reg, _T("R5")) == 0) {
-               reg_w(5, data);
-       } else if(_tcsicmp(reg, _T("R6")) == 0) {
-               reg_w(6, data);
-       } else if(_tcsicmp(reg, _T("R7")) == 0) {
-               reg_w(7, data);
-       } else {
-               return false;
-       }
-       return true;
-}
-
-void MCS48::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
-{
-/*
-R0 = 00  R1 = 00  R2 = 00  R3 = 00 (R0)= 00 (R1)= 00 (SP-1)= 0000  PC = 0000
-R4 = 00  R5 = 00  R6 = 00  R7 = 00  AC = 00  SP = 00 [MB F1 C AC F0 BS]
-*/
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       UINT8 sp = 8 + 2 * (cpustate->psw & 7);
-       UINT8 prev_sp = 8 + 2 * ((cpustate->psw - 1) & 7);
-       
-       my_stprintf_s(buffer, buffer_len,
-       _T("R0 = %02X  R1 = %02X  R2 = %02X  R3 = %02X (R0)= %02X (R1)= %02X (SP-1)= %04X  PC = %04X\nR4 = %02X  R5 = %02X  R6 = %02X  R7 = %02X  AC = %02X  SP = %02X [%s %s %s %s %s %s]"),
-       reg_r(0), reg_r(1), reg_r(2), reg_r(3), d_mem_stored->read_data8(reg_r(0)), d_mem_stored->read_data8(reg_r(1)),
-       d_mem_stored->read_data8(prev_sp) | (d_mem_stored->read_data8(prev_sp + 1) << 8), cpustate->pc,
-       reg_r(4), reg_r(5), reg_r(6), reg_r(7), cpustate->a, sp,
-       (cpustate->a11 == 0x800) ? _T("MB") : _T("--"), (cpustate->sts & STS_F1) ? _T("F1") : _T("--"),
-       (cpustate->psw & C_FLAG) ? _T("C" ) : _T("-" ), (cpustate->psw & A_FLAG) ? _T("AC") : _T("--"),
-       (cpustate->psw & F_FLAG) ? _T("F0") : _T("--"), (cpustate->psw & B_FLAG) ? _T("BS") : _T("--"));
-}
-
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/***************************************************************************
-
-    mcs48dsm.c
-
-    Simple MCS-48/UPI-41 disassembler.
-    Written by Aaron Giles
-
-***************************************************************************/
-
-int MCS48::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
-{
-       mcs48_state *cpustate = (mcs48_state *)opaque;
-       uint32_t ptr = pc;
-       
-       #define upi41 false
-       
-       switch (program_r(ptr++))
-       {
-               case 0x00:      my_stprintf_s(buffer, buffer_len, _T("nop"));                                                                                                       break;
-               case 0x02:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("out  bus,a"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("out  dbb,a"));                                                                                                break;
-               case 0x03:      my_stprintf_s(buffer, buffer_len, _T("add  a,#$%02X"), program_r(ptr++));                                                                           break;
-               case 0x04:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | program_r(ptr++)));             break;
-               case 0x05:      my_stprintf_s(buffer, buffer_len, _T("en   i"));                                                                                                    break;
-               case 0x07:      my_stprintf_s(buffer, buffer_len, _T("dec  a"));                                                                                                    break;
-               case 0x08:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("in   a,bus"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-               case 0x09:      my_stprintf_s(buffer, buffer_len, _T("in   a,p1"));                                                                                                 break;
-               case 0x0a:      my_stprintf_s(buffer, buffer_len, _T("in   a,p2"));                                                                                                 break;
-               case 0x0c:      my_stprintf_s(buffer, buffer_len, _T("movd a,p4"));                                                                                                 break;
-               case 0x0d:      my_stprintf_s(buffer, buffer_len, _T("movd a,p5"));                                                                                                 break;
-               case 0x0e:      my_stprintf_s(buffer, buffer_len, _T("movd a,p6"));                                                                                                 break;
-               case 0x0f:      my_stprintf_s(buffer, buffer_len, _T("movd a,p7"));                                                                                                 break;
-               case 0x10:      my_stprintf_s(buffer, buffer_len, _T("inc  @r0"));                                                                                                  break;
-               case 0x11:      my_stprintf_s(buffer, buffer_len, _T("inc  @r1"));                                                                                                  break;
-               case 0x12:      my_stprintf_s(buffer, buffer_len, _T("jb0  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x13:      my_stprintf_s(buffer, buffer_len, _T("addc a,#$%02X"), program_r(ptr++));                                                                           break;
-               case 0x14:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | program_r(ptr++)));             break;
-               case 0x15:      my_stprintf_s(buffer, buffer_len, _T("dis  i"));                                                                                                    break;
-               case 0x16:      my_stprintf_s(buffer, buffer_len, _T("jtf  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x17:      my_stprintf_s(buffer, buffer_len, _T("inc  a"));                                                                                                    break;
-               case 0x18:      my_stprintf_s(buffer, buffer_len, _T("inc  r0"));                                                                                                   break;
-               case 0x19:      my_stprintf_s(buffer, buffer_len, _T("inc  r1"));                                                                                                   break;
-               case 0x1a:      my_stprintf_s(buffer, buffer_len, _T("inc  r2"));                                                                                                   break;
-               case 0x1b:      my_stprintf_s(buffer, buffer_len, _T("inc  r3"));                                                                                                   break;
-               case 0x1c:      my_stprintf_s(buffer, buffer_len, _T("inc  r4"));                                                                                                   break;
-               case 0x1d:      my_stprintf_s(buffer, buffer_len, _T("inc  r5"));                                                                                                   break;
-               case 0x1e:      my_stprintf_s(buffer, buffer_len, _T("inc  r6"));                                                                                                   break;
-               case 0x1f:      my_stprintf_s(buffer, buffer_len, _T("inc  r7"));                                                                                                   break;
-               case 0x20:      my_stprintf_s(buffer, buffer_len, _T("xch  a,@r0"));                                                                                                break;
-               case 0x21:      my_stprintf_s(buffer, buffer_len, _T("xch  a,@r1"));                                                                                                break;
-               case 0x22:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("in   a,dbb"));                                                                                                break;
-               case 0x23:      my_stprintf_s(buffer, buffer_len, _T("mov  a,#$%02X"), program_r(ptr++));                                                                           break;
-               case 0x24:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | program_r(ptr++)));             break;
-               case 0x25:      my_stprintf_s(buffer, buffer_len, _T("en   tcnti"));                                                                                                break;
-               case 0x26:      my_stprintf_s(buffer, buffer_len, _T("jnt0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x27:      my_stprintf_s(buffer, buffer_len, _T("clr  a"));                                                                                                    break;
-               case 0x28:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r0"));                                                                                                 break;
-               case 0x29:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r1"));                                                                                                 break;
-               case 0x2a:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r2"));                                                                                                 break;
-               case 0x2b:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r3"));                                                                                                 break;
-               case 0x2c:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r4"));                                                                                                 break;
-               case 0x2d:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r5"));                                                                                                 break;
-               case 0x2e:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r6"));                                                                                                 break;
-               case 0x2f:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r7"));                                                                                                 break;
-               case 0x30:      my_stprintf_s(buffer, buffer_len, _T("xchd a,@r0"));                                                                                                break;
-               case 0x31:      my_stprintf_s(buffer, buffer_len, _T("xchd a,@r1"));                                                                                                break;
-               case 0x32:      my_stprintf_s(buffer, buffer_len, _T("jb1  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x34:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | program_r(ptr++)));             break;
-               case 0x35:      my_stprintf_s(buffer, buffer_len, _T("dis  tcnti"));                                                                                                break;
-               case 0x36:      my_stprintf_s(buffer, buffer_len, _T("jt0  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x37:      my_stprintf_s(buffer, buffer_len, _T("cpl  a"));                                                                                                    break;
-               case 0x39:      my_stprintf_s(buffer, buffer_len, _T("outl p1,a"));                                                                                                 break;
-               case 0x3a:      my_stprintf_s(buffer, buffer_len, _T("outl p2,a"));                                                                                                 break;
-               case 0x3c:      my_stprintf_s(buffer, buffer_len, _T("movd p4,a"));                                                                                                 break;
-               case 0x3d:      my_stprintf_s(buffer, buffer_len, _T("movd p5,a"));                                                                                                 break;
-               case 0x3e:      my_stprintf_s(buffer, buffer_len, _T("movd p6,a"));                                                                                                 break;
-               case 0x3f:      my_stprintf_s(buffer, buffer_len, _T("movd p7,a"));                                                                                                 break;
-               case 0x40:      my_stprintf_s(buffer, buffer_len, _T("orl  a,@r0"));                                                                                                break;
-               case 0x41:      my_stprintf_s(buffer, buffer_len, _T("orl  a,@r1"));                                                                                                break;
-               case 0x42:      my_stprintf_s(buffer, buffer_len, _T("mov  a,t"));                                                                                                  break;
-               case 0x43:      my_stprintf_s(buffer, buffer_len, _T("orl  a,#$%02X"), program_r(ptr++));                                                                           break;
-               case 0x44:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | program_r(ptr++)));             break;
-               case 0x45:      my_stprintf_s(buffer, buffer_len, _T("strt cnt"));                                                                                                  break;
-               case 0x46:      my_stprintf_s(buffer, buffer_len, _T("jnt1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x47:      my_stprintf_s(buffer, buffer_len, _T("swap a"));                                                                                                    break;
-               case 0x48:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r0"));                                                                                                 break;
-               case 0x49:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r1"));                                                                                                 break;
-               case 0x4a:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r2"));                                                                                                 break;
-               case 0x4b:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r3"));                                                                                                 break;
-               case 0x4c:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r4"));                                                                                                 break;
-               case 0x4d:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r5"));                                                                                                 break;
-               case 0x4e:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r6"));                                                                                                 break;
-               case 0x4f:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r7"));                                                                                                 break;
-               case 0x50:      my_stprintf_s(buffer, buffer_len, _T("anl  a,@r0"));                                                                                                break;
-               case 0x51:      my_stprintf_s(buffer, buffer_len, _T("anl  a,@r1"));                                                                                                break;
-               case 0x52:      my_stprintf_s(buffer, buffer_len, _T("jb2  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x53:      my_stprintf_s(buffer, buffer_len, _T("anl  a,#$%02X"), program_r(ptr++));                                                                           break;
-               case 0x54:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | program_r(ptr++)));             break;
-               case 0x55:      my_stprintf_s(buffer, buffer_len, _T("strt t"));                                                                                                    break;
-               case 0x56:      my_stprintf_s(buffer, buffer_len, _T("jt1  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x57:      my_stprintf_s(buffer, buffer_len, _T("da   a"));                                                                                                    break;
-               case 0x58:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r0"));                                                                                                 break;
-               case 0x59:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r1"));                                                                                                 break;
-               case 0x5a:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r2"));                                                                                                 break;
-               case 0x5b:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r3"));                                                                                                 break;
-               case 0x5c:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r4"));                                                                                                 break;
-               case 0x5d:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r5"));                                                                                                 break;
-               case 0x5e:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r6"));                                                                                                 break;
-               case 0x5f:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r7"));                                                                                                 break;
-               case 0x60:      my_stprintf_s(buffer, buffer_len, _T("add  a,@r0"));                                                                                                break;
-               case 0x61:      my_stprintf_s(buffer, buffer_len, _T("add  a,@r1"));                                                                                                break;
-               case 0x62:      my_stprintf_s(buffer, buffer_len, _T("mov  t,a"));                                                                                                  break;
-               case 0x64:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | program_r(ptr++)));             break;
-               case 0x65:      my_stprintf_s(buffer, buffer_len, _T("stop tcnt"));                                                                                                 break;
-               case 0x67:      my_stprintf_s(buffer, buffer_len, _T("rrc  a"));                                                                                                    break;
-               case 0x68:      my_stprintf_s(buffer, buffer_len, _T("add  a,r0"));                                                                                                 break;
-               case 0x69:      my_stprintf_s(buffer, buffer_len, _T("add  a,r1"));                                                                                                 break;
-               case 0x6a:      my_stprintf_s(buffer, buffer_len, _T("add  a,r2"));                                                                                                 break;
-               case 0x6b:      my_stprintf_s(buffer, buffer_len, _T("add  a,r3"));                                                                                                 break;
-               case 0x6c:      my_stprintf_s(buffer, buffer_len, _T("add  a,r4"));                                                                                                 break;
-               case 0x6d:      my_stprintf_s(buffer, buffer_len, _T("add  a,r5"));                                                                                                 break;
-               case 0x6e:      my_stprintf_s(buffer, buffer_len, _T("add  a,r6"));                                                                                                 break;
-               case 0x6f:      my_stprintf_s(buffer, buffer_len, _T("add  a,r7"));                                                                                                 break;
-               case 0x70:      my_stprintf_s(buffer, buffer_len, _T("addc a,@r0"));                                                                                                break;
-               case 0x71:      my_stprintf_s(buffer, buffer_len, _T("addc a,@r1"));                                                                                                break;
-               case 0x72:      my_stprintf_s(buffer, buffer_len, _T("jb3  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x74:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | program_r(ptr++)));             break;
-               case 0x75:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("ent0 clk"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-               case 0x76:      my_stprintf_s(buffer, buffer_len, _T("jf1  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x77:      my_stprintf_s(buffer, buffer_len, _T("rr   a"));                                                                                                    break;
-               case 0x78:      my_stprintf_s(buffer, buffer_len, _T("addc a,r0"));                                                                                                 break;
-               case 0x79:      my_stprintf_s(buffer, buffer_len, _T("addc a,r1"));                                                                                                 break;
-               case 0x7a:      my_stprintf_s(buffer, buffer_len, _T("addc a,r2"));                                                                                                 break;
-               case 0x7b:      my_stprintf_s(buffer, buffer_len, _T("addc a,r3"));                                                                                                 break;
-               case 0x7c:      my_stprintf_s(buffer, buffer_len, _T("addc a,r4"));                                                                                                 break;
-               case 0x7d:      my_stprintf_s(buffer, buffer_len, _T("addc a,r5"));                                                                                                 break;
-               case 0x7e:      my_stprintf_s(buffer, buffer_len, _T("addc a,r6"));                                                                                                 break;
-               case 0x7f:      my_stprintf_s(buffer, buffer_len, _T("addc a,r7"));                                                                                                 break;
-               case 0x80:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("movx a,@r0"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-               case 0x81:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("movx a,@r1"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-               case 0x83:      my_stprintf_s(buffer, buffer_len, _T("ret"));                                                                                                       break;
-               case 0x84:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | program_r(ptr++)));             break;
-               case 0x85:      my_stprintf_s(buffer, buffer_len, _T("clr  f0"));                                                                                                   break;
-               case 0x86:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("jni  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("jobf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x88:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("orl  bus,#$%02X"), program_r(ptr++));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-               case 0x89:      my_stprintf_s(buffer, buffer_len, _T("orl  p1,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0x8a:      my_stprintf_s(buffer, buffer_len, _T("orl  p2,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0x8c:      my_stprintf_s(buffer, buffer_len, _T("orld p4,a"));                                                                                                 break;
-               case 0x8d:      my_stprintf_s(buffer, buffer_len, _T("orld p5,a"));                                                                                                 break;
-               case 0x8e:      my_stprintf_s(buffer, buffer_len, _T("orld p6,a"));                                                                                                 break;
-               case 0x8f:      my_stprintf_s(buffer, buffer_len, _T("orld p7,a"));                                                                                                 break;
-               case 0x90:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("movx @r0,a"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("mov  sts,a"));                                                                                                break;
-               case 0x91:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("movx @r1,a"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-               case 0x92:      my_stprintf_s(buffer, buffer_len, _T("jb4  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x93:      my_stprintf_s(buffer, buffer_len, _T("retr"));                                                                                                      break;
-               case 0x94:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | program_r(ptr++)));             break;
-               case 0x95:      my_stprintf_s(buffer, buffer_len, _T("cpl  f0"));                                                                                                   break;
-               case 0x96:      my_stprintf_s(buffer, buffer_len, _T("jnz  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0x97:      my_stprintf_s(buffer, buffer_len, _T("clr  c"));                                                                                                    break;
-               case 0x98:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("anl  bus,#$%02X"), program_r(ptr++));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-               case 0x99:      my_stprintf_s(buffer, buffer_len, _T("anl  p1,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0x9a:      my_stprintf_s(buffer, buffer_len, _T("anl  p2,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0x9c:      my_stprintf_s(buffer, buffer_len, _T("anld p4,a"));                                                                                                 break;
-               case 0x9d:      my_stprintf_s(buffer, buffer_len, _T("anld p5,a"));                                                                                                 break;
-               case 0x9e:      my_stprintf_s(buffer, buffer_len, _T("anld p6,a"));                                                                                                 break;
-               case 0x9f:      my_stprintf_s(buffer, buffer_len, _T("anld p7,a"));                                                                                                 break;
-               case 0xa0:      my_stprintf_s(buffer, buffer_len, _T("mov  @r0,a"));                                                                                                break;
-               case 0xa1:      my_stprintf_s(buffer, buffer_len, _T("mov  @r1,a"));                                                                                                break;
-               case 0xa3:      my_stprintf_s(buffer, buffer_len, _T("movp a,@a"));                                                                                                 break;
-               case 0xa4:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | program_r(ptr++)));             break;
-               case 0xa5:      my_stprintf_s(buffer, buffer_len, _T("clr  f1"));                                                                                                   break;
-               case 0xa7:      my_stprintf_s(buffer, buffer_len, _T("cpl  c"));                                                                                                    break;
-               case 0xa8:      my_stprintf_s(buffer, buffer_len, _T("mov  r0,a"));                                                                                                 break;
-               case 0xa9:      my_stprintf_s(buffer, buffer_len, _T("mov  r1,a"));                                                                                                 break;
-               case 0xaa:      my_stprintf_s(buffer, buffer_len, _T("mov  r2,a"));                                                                                                 break;
-               case 0xab:      my_stprintf_s(buffer, buffer_len, _T("mov  r3,a"));                                                                                                 break;
-               case 0xac:      my_stprintf_s(buffer, buffer_len, _T("mov  r4,a"));                                                                                                 break;
-               case 0xad:      my_stprintf_s(buffer, buffer_len, _T("mov  r5,a"));                                                                                                 break;
-               case 0xae:      my_stprintf_s(buffer, buffer_len, _T("mov  r6,a"));                                                                                                 break;
-               case 0xaf:      my_stprintf_s(buffer, buffer_len, _T("mov  r7,a"));                                                                                                 break;
-               case 0xb0:      my_stprintf_s(buffer, buffer_len, _T("mov  @r0,#$%02X"), program_r(ptr++));                                                                         break;
-               case 0xb1:      my_stprintf_s(buffer, buffer_len, _T("mov  @r1,#$%02X"), program_r(ptr++));                                                                         break;
-               case 0xb2:      my_stprintf_s(buffer, buffer_len, _T("jb5  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0xb3:      my_stprintf_s(buffer, buffer_len, _T("jmpp @a"));                                                                                                   break;
-               case 0xb4:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | program_r(ptr++)));             break;
-               case 0xb5:      my_stprintf_s(buffer, buffer_len, _T("cpl  f1"));                                                                                                   break;
-               case 0xb6:      my_stprintf_s(buffer, buffer_len, _T("jf0  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0xb8:      my_stprintf_s(buffer, buffer_len, _T("mov  r0,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xb9:      my_stprintf_s(buffer, buffer_len, _T("mov  r1,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xba:      my_stprintf_s(buffer, buffer_len, _T("mov  r2,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xbb:      my_stprintf_s(buffer, buffer_len, _T("mov  r3,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xbc:      my_stprintf_s(buffer, buffer_len, _T("mov  r4,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xbd:      my_stprintf_s(buffer, buffer_len, _T("mov  r5,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xbe:      my_stprintf_s(buffer, buffer_len, _T("mov  r6,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xbf:      my_stprintf_s(buffer, buffer_len, _T("mov  r7,#$%02X"), program_r(ptr++));                                                                          break;
-               case 0xc4:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | program_r(ptr++)));             break;
-               case 0xc5:      my_stprintf_s(buffer, buffer_len, _T("sel  rb0"));                                                                                                  break;
-               case 0xc6:      my_stprintf_s(buffer, buffer_len, _T("jz   %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0xc7:      my_stprintf_s(buffer, buffer_len, _T("mov  a,psw"));                                                                                                break;
-               case 0xc8:      my_stprintf_s(buffer, buffer_len, _T("dec  r0"));                                                                                                   break;
-               case 0xc9:      my_stprintf_s(buffer, buffer_len, _T("dec  r1"));                                                                                                   break;
-               case 0xca:      my_stprintf_s(buffer, buffer_len, _T("dec  r2"));                                                                                                   break;
-               case 0xcb:      my_stprintf_s(buffer, buffer_len, _T("dec  r3"));                                                                                                   break;
-               case 0xcc:      my_stprintf_s(buffer, buffer_len, _T("dec  r4"));                                                                                                   break;
-               case 0xcd:      my_stprintf_s(buffer, buffer_len, _T("dec  r5"));                                                                                                   break;
-               case 0xce:      my_stprintf_s(buffer, buffer_len, _T("dec  r6"));                                                                                                   break;
-               case 0xcf:      my_stprintf_s(buffer, buffer_len, _T("dec  r7"));                                                                                                   break;
-               case 0xd0:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,@r0"));                                                                                                break;
-               case 0xd1:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,@r1"));                                                                                                break;
-               case 0xd2:      my_stprintf_s(buffer, buffer_len, _T("jb6  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0xd3:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,#$%02X"), program_r(ptr++));                                                                           break;
-               case 0xd4:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | program_r(ptr++)));             break;
-               case 0xd5:      my_stprintf_s(buffer, buffer_len, _T("sel  rb1"));                                                                                                  break;
-               case 0xd6:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("illegal"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("jnibf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));     break;
-               case 0xd7:      my_stprintf_s(buffer, buffer_len, _T("mov  psw,a"));                                                                                                break;
-               case 0xd8:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r0"));                                                                                                 break;
-               case 0xd9:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r1"));                                                                                                 break;
-               case 0xda:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r2"));                                                                                                 break;
-               case 0xdb:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r3"));                                                                                                 break;
-               case 0xdc:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r4"));                                                                                                 break;
-               case 0xdd:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r5"));                                                                                                 break;
-               case 0xde:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r6"));                                                                                                 break;
-               case 0xdf:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r7"));                                                                                                 break;
-               case 0xe3:      my_stprintf_s(buffer, buffer_len, _T("movp3 a,@a"));                                                                                                break;
-               case 0xe4:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | program_r(ptr++)));             break;
-               case 0xe5:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("sel  mb0"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("en   dma"));                                                                                                  break;
-               case 0xe6:      my_stprintf_s(buffer, buffer_len, _T("jnc  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0xe7:      my_stprintf_s(buffer, buffer_len, _T("rl   a"));                                                                                                    break;
-               case 0xe8:      my_stprintf_s(buffer, buffer_len, _T("djnz r0,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xe9:      my_stprintf_s(buffer, buffer_len, _T("djnz r1,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xea:      my_stprintf_s(buffer, buffer_len, _T("djnz r2,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xeb:      my_stprintf_s(buffer, buffer_len, _T("djnz r3,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xec:      my_stprintf_s(buffer, buffer_len, _T("djnz r4,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xed:      my_stprintf_s(buffer, buffer_len, _T("djnz r5,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xee:      my_stprintf_s(buffer, buffer_len, _T("djnz r6,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xef:      my_stprintf_s(buffer, buffer_len, _T("djnz r7,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));   break;
-               case 0xf0:      my_stprintf_s(buffer, buffer_len, _T("mov  a,@r0"));                                                                                                break;
-               case 0xf1:      my_stprintf_s(buffer, buffer_len, _T("mov  a,@r1"));                                                                                                break;
-               case 0xf2:      my_stprintf_s(buffer, buffer_len, _T("jb7  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0xf4:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | program_r(ptr++)));             break;
-               case 0xf5:  if (!upi41)
-                               my_stprintf_s(buffer, buffer_len, _T("sel  mb1"));
-                           else
-                               my_stprintf_s(buffer, buffer_len, _T("en   flags"));                                                                                                break;
-               case 0xf6:      my_stprintf_s(buffer, buffer_len, _T("jc   %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | program_r(ptr++)));      break;
-               case 0xf7:      my_stprintf_s(buffer, buffer_len, _T("rlc  a"));                                                                                                    break;
-               case 0xf8:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r0"));                                                                                                 break;
-               case 0xf9:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r1"));                                                                                                 break;
-               case 0xfa:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r2"));                                                                                                 break;
-               case 0xfb:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r3"));                                                                                                 break;
-               case 0xfc:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r4"));                                                                                                 break;
-               case 0xfd:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r5"));                                                                                                 break;
-               case 0xfe:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r6"));                                                                                                 break;
-               case 0xff:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r7"));                                                                                                 break;
-               default:        my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
-
-       }
-       return ptr - pc;
-}
-#endif
 
 #define STATE_VERSION  1
 
-void MCS48MEM::save_state(FILEIO* state_fio)
-{
-       state_fio->FputUint32(STATE_VERSION);
-       state_fio->FputInt32(this_device_id);
-       
-       state_fio->Fwrite(ram, sizeof(ram), 1);
-}
-
-bool MCS48MEM::load_state(FILEIO* state_fio)
-{
-       if(state_fio->FgetUint32() != STATE_VERSION) {
-               return false;
-       }
-       if(state_fio->FgetInt32() != this_device_id) {
-               return false;
-       }
-       state_fio->Fread(ram, sizeof(ram), 1);
-       return true;
-}
-
 void MCS48::save_state(FILEIO* state_fio)
 {
        state_fio->FputUint32(STATE_VERSION);
index 9420ee4..08d869d 100644 (file)
 #ifndef _MCS84_H_ 
 #define _MCS48_H_
 
-#if defined(USE_SHARED_DLL)
-#include "libcpu_newdev/mcs48.h"
-#else
-#include "vm.h"
-#include "../emu.h"
+//#include "vm.h"
+//#include "../emu.h"
 #include "device.h"
 
+#include "mcs48_flags.h"
+#ifndef INLINE
+#define INLINE inline
+#endif
+
 #define MCS48_PORT_P0  0x100   /* Not used */
 #define MCS48_PORT_P1  0x101   /* P10-P17 */
 #define MCS48_PORT_P2  0x102   /* P20-P28 */
 #define MCS48_PORT_BUS 0x120   /* DB0-DB7 */
 #define MCS48_PORT_PROG        0x121   /* PROG line to 8243 expander */
 
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
 class DEBUGGER;
-#endif
+//#endif
+
+/***************************************************************************
+    CONSTANTS
+***************************************************************************/
+
+/* timer/counter enable bits */
+#define __MCS48_TIMER_ENABLED   0x01
+#define __MCS48_COUNTER_ENABLED 0x02
+
+/***************************************************************************
+    TYPE DEFINITIONS
+***************************************************************************/
+
+/* live processor state */
+struct mcs48_state
+{
+       UINT16      prevpc;             /* 16-bit previous program counter */
+       UINT16      pc;                 /* 16-bit program counter */
+
+       UINT8       a;                  /* 8-bit accumulator */
+       int         regptr;             /* offset of r0-r7 */
+       UINT8       psw;                /* 8-bit cpustate->psw */
+       UINT8       p1;                 /* 8-bit latched port 1 */
+       UINT8       p2;                 /* 8-bit latched port 2 */
+       UINT8       timer;              /* 8-bit timer */
+       UINT8       prescaler;          /* 5-bit timer prescaler */
+       UINT8       t1_history;         /* 8-bit history of the T1 input */
+       UINT8       sts;                /* 8-bit status register */
+
+       UINT8       int_state;          /* INT signal status */
+       UINT8       irq_state;          /* TRUE if an IRQ is pending */
+       UINT8       irq_in_progress;    /* TRUE if an IRQ is in progress */
+       UINT8       timer_overflow;     /* TRUE on a timer overflow; cleared by taking interrupt */
+       UINT8       timer_flag;         /* TRUE on a timer overflow; cleared on JTF */
+       UINT8       tirq_enabled;       /* TRUE if the timer IRQ is enabled */
+       UINT8       xirq_enabled;       /* TRUE if the external IRQ is enabled */
+       UINT8       t0_clk_enabled;     /* TRUE if ent0_clk is called */
+       UINT8       timecount_enabled;  /* bitmask of timer/counter enabled */
+
+       UINT16      a11;                /* A11 value, either 0x000 or 0x800 */
+
+       DEVICE *    mem;
+       DEVICE *    io;
+       DEVICE *    intr;
+
+       int         icount;
+
+       UINT8       rom[0x1000];
+//     UINT8       ram[0x100];
+};
+/***************************************************************************
+    MACROS
+***************************************************************************/
+
+#define __mcs48_program_r(a)    cpustate->rom[(a) & 0xfff]
+
+#define __mcs48_ram_r(a)        cpustate->mem->read_data8(a)
+#define __mcs48_ram_w(a,V)      cpustate->mem->write_data8(a, V)
+#define __mcs48_reg_r(a)        cpustate->mem->read_data8(cpustate->regptr + a)
+#define __mcs48_reg_w(a,V)      cpustate->mem->write_data8(cpustate->regptr + a, V)
+
+#define __mcs48_ext_r(a)        cpustate->io->read_io8(a)
+#define __mcs48_ext_w(a,V)      cpustate->io->write_io8(a, V)
+#define __mcs48_port_r(a)       cpustate->io->read_io8(MCS48_PORT_P0 + a)
+#define __mcs48_port_w(a,V)     cpustate->io->write_io8(MCS48_PORT_P0 + a, V)
+#define __mcs48_test_r(a)       cpustate->io->read_io8(MCS48_PORT_T0 + a)
+#define __mcs48_test_w(a,V)     cpustate->io->write_io8(MCS48_PORT_T0 + a, V)
+#define __mcs48_bus_r()         cpustate->io->read_io8(MCS48_PORT_BUS)
+#define __mcs48_bus_w(V)        cpustate->io->write_io8(MCS48_PORT_BUS, V)
+#define __mcs48_prog_w(V)       cpustate->io->write_io8(MCS48_PORT_PROG, V)
+
+
+
+#define __MCS48_OPHANDLER(_name) int MCS48_BASE::_name(mcs48_state *cpustate)
+#define __MCS48_OPHANDLER_D(_name) int _name(mcs48_state *cpustate)
 
 class MCS48MEM : public DEVICE
 {
@@ -54,49 +131,361 @@ public:
        bool load_state(FILEIO* state_fio);
 };
 
-class MCS48 : public DEVICE
+class MCS48_BASE : public DEVICE
 {
+protected:
+       inline UINT8 argument_fetch(mcs48_state *cpustate);
+       inline void pull_pc(mcs48_state *cpustate);
+       inline void execute_add(mcs48_state *cpustate, UINT8 dat);
+       inline void execute_addc(mcs48_state *cpustate, UINT8 dat);
+       inline void execute_jmp(mcs48_state *cpustate, UINT16 address);
+       inline void execute_call(mcs48_state *cpustate, UINT16 address);
+       inline void execute_jcc(mcs48_state *cpustate, UINT8 result);
+       inline void expander_operation(mcs48_state *cpustate, UINT8 operation, UINT8 port);
+
 private:
+       __MCS48_OPHANDLER_D( illegal );
+       __MCS48_OPHANDLER_D( add_a_r0 );
+       __MCS48_OPHANDLER_D( add_a_r1 );
+       __MCS48_OPHANDLER_D( add_a_r2 );
+       __MCS48_OPHANDLER_D( add_a_r3 );
+       __MCS48_OPHANDLER_D( add_a_r4 );
+       __MCS48_OPHANDLER_D( add_a_r5 );
+       __MCS48_OPHANDLER_D( add_a_r6 );
+       __MCS48_OPHANDLER_D( add_a_r7 );
+       __MCS48_OPHANDLER_D( add_a_xr0 );
+       __MCS48_OPHANDLER_D( add_a_xr1 );
+       __MCS48_OPHANDLER_D( add_a_n );
+
+       __MCS48_OPHANDLER_D( adc_a_r0 );
+       __MCS48_OPHANDLER_D( adc_a_r1 );
+       __MCS48_OPHANDLER_D( adc_a_r2 );
+       __MCS48_OPHANDLER_D( adc_a_r3 );
+       __MCS48_OPHANDLER_D( adc_a_r4 );
+       __MCS48_OPHANDLER_D( adc_a_r5 );
+       __MCS48_OPHANDLER_D( adc_a_r6 );
+       __MCS48_OPHANDLER_D( adc_a_r7 );
+       __MCS48_OPHANDLER_D( adc_a_xr0 );
+       __MCS48_OPHANDLER_D( adc_a_xr1 );
+       __MCS48_OPHANDLER_D( adc_a_n );  
+
+       __MCS48_OPHANDLER_D( anl_a_r0 );
+       __MCS48_OPHANDLER_D( anl_a_r1 );
+       __MCS48_OPHANDLER_D( anl_a_r2 );
+       __MCS48_OPHANDLER_D( anl_a_r3 );
+       __MCS48_OPHANDLER_D( anl_a_r4 );
+       __MCS48_OPHANDLER_D( anl_a_r5 );
+       __MCS48_OPHANDLER_D( anl_a_r6 );
+       __MCS48_OPHANDLER_D( anl_a_r7 );
+       __MCS48_OPHANDLER_D( anl_a_xr0 );
+       __MCS48_OPHANDLER_D( anl_a_xr1 );
+       __MCS48_OPHANDLER_D( anl_a_n );
+       
+       __MCS48_OPHANDLER_D( anl_bus_n );
+       __MCS48_OPHANDLER_D( anl_p1_n );
+       __MCS48_OPHANDLER_D( anl_p2_n );
+       __MCS48_OPHANDLER_D( anld_p4_a );
+       __MCS48_OPHANDLER_D( anld_p5_a );
+       __MCS48_OPHANDLER_D( anld_p6_a );
+       __MCS48_OPHANDLER_D( anld_p7_a );
+
+       __MCS48_OPHANDLER_D( call_0 );
+       __MCS48_OPHANDLER_D( call_1 );
+       __MCS48_OPHANDLER_D( call_2 );
+       __MCS48_OPHANDLER_D( call_3 );
+       __MCS48_OPHANDLER_D( call_4 );
+       __MCS48_OPHANDLER_D( call_5 );
+       __MCS48_OPHANDLER_D( call_6 );
+       __MCS48_OPHANDLER_D( call_7 );
+
+       __MCS48_OPHANDLER_D( clr_a );
+       __MCS48_OPHANDLER_D( clr_c );
+       __MCS48_OPHANDLER_D( clr_f0 );
+       __MCS48_OPHANDLER_D( clr_f1 );
+
+       __MCS48_OPHANDLER_D( cpl_a );
+       __MCS48_OPHANDLER_D( cpl_c );
+       __MCS48_OPHANDLER_D( cpl_f0 );
+       __MCS48_OPHANDLER_D( cpl_f1 );
+
+       __MCS48_OPHANDLER_D( da_a );
+
+       __MCS48_OPHANDLER_D( dec_a );
+       __MCS48_OPHANDLER_D( dec_r0 );
+       __MCS48_OPHANDLER_D( dec_r1 );
+       __MCS48_OPHANDLER_D( dec_r2 );
+       __MCS48_OPHANDLER_D( dec_r3 );
+       __MCS48_OPHANDLER_D( dec_r4 );
+       __MCS48_OPHANDLER_D( dec_r5 );
+       __MCS48_OPHANDLER_D( dec_r6 );
+       __MCS48_OPHANDLER_D( dec_r7 );
+
+       __MCS48_OPHANDLER_D( dis_i );
+       __MCS48_OPHANDLER_D( dis_tcnti );
+
+       __MCS48_OPHANDLER_D( djnz_r0 );
+       __MCS48_OPHANDLER_D( djnz_r1 );
+       __MCS48_OPHANDLER_D( djnz_r2 );
+       __MCS48_OPHANDLER_D( djnz_r3 );
+       __MCS48_OPHANDLER_D( djnz_r4 );
+       __MCS48_OPHANDLER_D( djnz_r5 );
+       __MCS48_OPHANDLER_D( djnz_r6 );
+       __MCS48_OPHANDLER_D( djnz_r7 );
+
+       __MCS48_OPHANDLER_D( en_i );
+       __MCS48_OPHANDLER_D( en_tcnti );
+       __MCS48_OPHANDLER_D( ent0_clk );
+
+       __MCS48_OPHANDLER_D( in_a_p1 );
+       __MCS48_OPHANDLER_D( in_a_p2 );
+       __MCS48_OPHANDLER_D( ins_a_bus );
+
+       __MCS48_OPHANDLER_D( inc_a );
+       __MCS48_OPHANDLER_D( inc_r0 );
+       __MCS48_OPHANDLER_D( inc_r1 );
+       __MCS48_OPHANDLER_D( inc_r2 );
+       __MCS48_OPHANDLER_D( inc_r3 );
+       __MCS48_OPHANDLER_D( inc_r4 );
+       __MCS48_OPHANDLER_D( inc_r5 );
+       __MCS48_OPHANDLER_D( inc_r6 );
+       __MCS48_OPHANDLER_D( inc_r7 );
+       __MCS48_OPHANDLER_D( inc_xr0 );
+       __MCS48_OPHANDLER_D( inc_xr1 );
+
+       __MCS48_OPHANDLER_D( jb_0 );
+       __MCS48_OPHANDLER_D( jb_1 );
+       __MCS48_OPHANDLER_D( jb_2 );
+       __MCS48_OPHANDLER_D( jb_3 );
+       __MCS48_OPHANDLER_D( jb_4 );
+       __MCS48_OPHANDLER_D( jb_5 );
+       __MCS48_OPHANDLER_D( jb_6 );
+       __MCS48_OPHANDLER_D( jb_7 );
+       __MCS48_OPHANDLER_D( jc );
+       __MCS48_OPHANDLER_D( jf0 );
+       __MCS48_OPHANDLER_D( jf1 );
+       __MCS48_OPHANDLER_D( jnc );
+       __MCS48_OPHANDLER_D( jni );
+       __MCS48_OPHANDLER_D( jnt_0 );
+       __MCS48_OPHANDLER_D( jnt_1 );
+       __MCS48_OPHANDLER_D( jnz );
+       __MCS48_OPHANDLER_D( jtf );
+       __MCS48_OPHANDLER_D( jt_0 );
+       __MCS48_OPHANDLER_D( jt_1 );
+       __MCS48_OPHANDLER_D( jz );
+
+       __MCS48_OPHANDLER_D( jmp_0 );
+       __MCS48_OPHANDLER_D( jmp_1 );
+       __MCS48_OPHANDLER_D( jmp_2 );
+       __MCS48_OPHANDLER_D( jmp_3 );
+       __MCS48_OPHANDLER_D( jmp_4 );
+       __MCS48_OPHANDLER_D( jmp_5 );
+       __MCS48_OPHANDLER_D( jmp_6 );
+       __MCS48_OPHANDLER_D( jmp_7 );
+       __MCS48_OPHANDLER_D( jmpp_xa );
+
+       __MCS48_OPHANDLER_D( mov_a_n );
+       __MCS48_OPHANDLER_D( mov_a_psw );
+       __MCS48_OPHANDLER_D( mov_a_r0 );
+       __MCS48_OPHANDLER_D( mov_a_r1 );
+       __MCS48_OPHANDLER_D( mov_a_r2 );
+       __MCS48_OPHANDLER_D( mov_a_r3 );
+       __MCS48_OPHANDLER_D( mov_a_r4 );
+       __MCS48_OPHANDLER_D( mov_a_r5 );
+       __MCS48_OPHANDLER_D( mov_a_r6 );
+       __MCS48_OPHANDLER_D( mov_a_r7 );
+       __MCS48_OPHANDLER_D( mov_a_xr0 );
+       __MCS48_OPHANDLER_D( mov_a_xr1 );
+       __MCS48_OPHANDLER_D( mov_a_t );
+
+       __MCS48_OPHANDLER_D( mov_psw_a );
+       __MCS48_OPHANDLER_D( mov_r0_a );
+       __MCS48_OPHANDLER_D( mov_r1_a );
+       __MCS48_OPHANDLER_D( mov_r2_a );
+       __MCS48_OPHANDLER_D( mov_r3_a );
+       __MCS48_OPHANDLER_D( mov_r4_a );
+       __MCS48_OPHANDLER_D( mov_r5_a );
+       __MCS48_OPHANDLER_D( mov_r6_a );
+       __MCS48_OPHANDLER_D( mov_r7_a );
+       __MCS48_OPHANDLER_D( mov_r0_n );
+       __MCS48_OPHANDLER_D( mov_r1_n );
+       __MCS48_OPHANDLER_D( mov_r2_n );
+       __MCS48_OPHANDLER_D( mov_r3_n );
+       __MCS48_OPHANDLER_D( mov_r4_n );
+       __MCS48_OPHANDLER_D( mov_r5_n );
+       __MCS48_OPHANDLER_D( mov_r6_n );
+       __MCS48_OPHANDLER_D( mov_r7_n );
+       __MCS48_OPHANDLER_D( mov_t_a );
+       __MCS48_OPHANDLER_D( mov_xr0_a );
+       __MCS48_OPHANDLER_D( mov_xr1_a );
+       __MCS48_OPHANDLER_D( mov_xr0_n );
+       __MCS48_OPHANDLER_D( mov_xr1_n );
+
+       __MCS48_OPHANDLER_D( movd_a_p4 );
+       __MCS48_OPHANDLER_D( movd_a_p5 );
+       __MCS48_OPHANDLER_D( movd_a_p6 );
+       __MCS48_OPHANDLER_D( movd_a_p7 );
+       __MCS48_OPHANDLER_D( movd_p4_a );
+       __MCS48_OPHANDLER_D( movd_p5_a );
+       __MCS48_OPHANDLER_D( movd_p6_a );
+       __MCS48_OPHANDLER_D( movd_p7_a );
+
+       __MCS48_OPHANDLER_D( movp_a_xa );
+       __MCS48_OPHANDLER_D( movp3_a_xa );
+
+       __MCS48_OPHANDLER_D( movx_a_xr0 );
+       __MCS48_OPHANDLER_D( movx_a_xr1 );
+       __MCS48_OPHANDLER_D( movx_xr0_a );
+       __MCS48_OPHANDLER_D( movx_xr1_a );
+
+       __MCS48_OPHANDLER_D( nop );
+
+       __MCS48_OPHANDLER_D( orl_a_r0 );
+       __MCS48_OPHANDLER_D( orl_a_r1 );
+       __MCS48_OPHANDLER_D( orl_a_r2 );
+       __MCS48_OPHANDLER_D( orl_a_r3 );
+       __MCS48_OPHANDLER_D( orl_a_r4 );
+       __MCS48_OPHANDLER_D( orl_a_r5 );
+       __MCS48_OPHANDLER_D( orl_a_r6 );
+       __MCS48_OPHANDLER_D( orl_a_r7 );
+       __MCS48_OPHANDLER_D( orl_a_xr0 );
+       __MCS48_OPHANDLER_D( orl_a_xr1 );
+       __MCS48_OPHANDLER_D( orl_a_n );
+
+       __MCS48_OPHANDLER_D( orl_bus_n );
+       __MCS48_OPHANDLER_D( orl_p1_n );
+       __MCS48_OPHANDLER_D( orl_p2_n );
+       __MCS48_OPHANDLER_D( orld_p4_a );
+       __MCS48_OPHANDLER_D( orld_p5_a );
+       __MCS48_OPHANDLER_D( orld_p6_a );
+       __MCS48_OPHANDLER_D( orld_p7_a );
+
+       __MCS48_OPHANDLER_D( outl_bus_a );
+       __MCS48_OPHANDLER_D( outl_p1_a );
+       __MCS48_OPHANDLER_D( outl_p2_a );
+
+       __MCS48_OPHANDLER_D( ret );
+       __MCS48_OPHANDLER_D( retr );
+
+       __MCS48_OPHANDLER_D( rl_a );
+       __MCS48_OPHANDLER_D( rlc_a );
+
+       __MCS48_OPHANDLER_D( rr_a );
+       __MCS48_OPHANDLER_D( rrc_a );
+
+       __MCS48_OPHANDLER_D( sel_mb0 );
+       __MCS48_OPHANDLER_D( sel_mb1 );
+
+       __MCS48_OPHANDLER_D( sel_rb0 );
+       __MCS48_OPHANDLER_D( sel_rb1 );
+
+       __MCS48_OPHANDLER_D( stop_tcnt );
+
+       __MCS48_OPHANDLER_D( strt_cnt );
+       __MCS48_OPHANDLER_D( strt_t );
+
+       __MCS48_OPHANDLER_D( swap_a );
+
+       __MCS48_OPHANDLER_D( xch_a_r0 );
+       __MCS48_OPHANDLER_D( xch_a_r1 );
+       __MCS48_OPHANDLER_D( xch_a_r2 );
+       __MCS48_OPHANDLER_D( xch_a_r3 );
+       __MCS48_OPHANDLER_D( xch_a_r4 );
+       __MCS48_OPHANDLER_D( xch_a_r5 );
+       __MCS48_OPHANDLER_D( xch_a_r6 );
+       __MCS48_OPHANDLER_D( xch_a_r7 );
+       __MCS48_OPHANDLER_D( xch_a_xr0 );
+       __MCS48_OPHANDLER_D( xch_a_xr1 );
+
+       __MCS48_OPHANDLER_D( xchd_a_xr0 );
+       __MCS48_OPHANDLER_D( xchd_a_xr1 );
+
+       __MCS48_OPHANDLER_D( xrl_a_r0 );
+       __MCS48_OPHANDLER_D( xrl_a_r1 );
+       __MCS48_OPHANDLER_D( xrl_a_r2 );
+       __MCS48_OPHANDLER_D( xrl_a_r3 );
+       __MCS48_OPHANDLER_D( xrl_a_r4 );
+       __MCS48_OPHANDLER_D( xrl_a_r5 );
+       __MCS48_OPHANDLER_D( xrl_a_r6 );
+       __MCS48_OPHANDLER_D( xrl_a_r7 );
+       __MCS48_OPHANDLER_D( xrl_a_xr0 );
+       __MCS48_OPHANDLER_D( xrl_a_xr1 );
+       __MCS48_OPHANDLER_D( xrl_a_n );
+
+protected:
        /* ---------------------------------------------------------------------------
        contexts
        --------------------------------------------------------------------------- */
        
        DEVICE *d_mem, *d_io, *d_intr;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
        DEBUGGER *d_debugger;
        DEVICE *d_mem_stored, *d_io_stored;
-#endif
+//#endif
        void *opaque;
+       /* opcode table entry */
+       typedef int (MCS48_BASE::*mcs48_ophandler)(mcs48_state *state);
+
+       const mcs48_ophandler opcode_table[256] =
+       {
+               &MCS48_BASE::nop,        &MCS48_BASE::illegal,     &MCS48_BASE::outl_bus_a, &MCS48_BASE::add_a_n,   &MCS48_BASE::jmp_0,     &MCS48_BASE::en_i,      &MCS48_BASE::illegal,   &MCS48_BASE::dec_a,         /* 00 */
+               &MCS48_BASE::ins_a_bus,  &MCS48_BASE::in_a_p1,     &MCS48_BASE::in_a_p2,    &MCS48_BASE::illegal,   &MCS48_BASE::movd_a_p4, &MCS48_BASE::movd_a_p5, &MCS48_BASE::movd_a_p6, &MCS48_BASE::movd_a_p7,
+               &MCS48_BASE::inc_xr0,    &MCS48_BASE::inc_xr1,     &MCS48_BASE::jb_0,       &MCS48_BASE::adc_a_n,   &MCS48_BASE::call_0,    &MCS48_BASE::dis_i,     &MCS48_BASE::jtf,       &MCS48_BASE::inc_a,         /* 10 */
+               &MCS48_BASE::inc_r0,     &MCS48_BASE::inc_r1,      &MCS48_BASE::inc_r2,     &MCS48_BASE::inc_r3,    &MCS48_BASE::inc_r4,    &MCS48_BASE::inc_r5,    &MCS48_BASE::inc_r6,    &MCS48_BASE::inc_r7,
+               &MCS48_BASE::xch_a_xr0,  &MCS48_BASE::xch_a_xr1,   &MCS48_BASE::illegal,    &MCS48_BASE::mov_a_n,   &MCS48_BASE::jmp_1,     &MCS48_BASE::en_tcnti,  &MCS48_BASE::jnt_0,     &MCS48_BASE::clr_a,         /* 20 */
+               &MCS48_BASE::xch_a_r0,   &MCS48_BASE::xch_a_r1,    &MCS48_BASE::xch_a_r2,   &MCS48_BASE::xch_a_r3,  &MCS48_BASE::xch_a_r4,  &MCS48_BASE::xch_a_r5,  &MCS48_BASE::xch_a_r6,  &MCS48_BASE::xch_a_r7,
+               &MCS48_BASE::xchd_a_xr0, &MCS48_BASE::xchd_a_xr1, &MCS48_BASE::jb_1,       &MCS48_BASE::illegal,   &MCS48_BASE::call_1,    &MCS48_BASE::dis_tcnti, &MCS48_BASE::jt_0,     &MCS48_BASE::cpl_a,         /* 30 */
+               &MCS48_BASE::illegal,    &MCS48_BASE::outl_p1_a,   &MCS48_BASE::outl_p2_a,  &MCS48_BASE::illegal,   &MCS48_BASE::movd_p4_a, &MCS48_BASE::movd_p5_a, &MCS48_BASE::movd_p6_a, &MCS48_BASE::movd_p7_a,
+               &MCS48_BASE::orl_a_xr0,  &MCS48_BASE::orl_a_xr1,   &MCS48_BASE::mov_a_t,    &MCS48_BASE::orl_a_n,   &MCS48_BASE::jmp_2,     &MCS48_BASE::strt_cnt,  &MCS48_BASE::jnt_1,     &MCS48_BASE::swap_a,        /* 40 */
+               &MCS48_BASE::orl_a_r0,   &MCS48_BASE::orl_a_r1,    &MCS48_BASE::orl_a_r2,   &MCS48_BASE::orl_a_r3,  &MCS48_BASE::orl_a_r4,  &MCS48_BASE::orl_a_r5,  &MCS48_BASE::orl_a_r6,  &MCS48_BASE::orl_a_r7,
+               &MCS48_BASE::anl_a_xr0,  &MCS48_BASE::anl_a_xr1,   &MCS48_BASE::jb_2,       &MCS48_BASE::anl_a_n,   &MCS48_BASE::call_2,    &MCS48_BASE::strt_t,    &MCS48_BASE::jt_1,      &MCS48_BASE::da_a,          /* 50 */
+               &MCS48_BASE::anl_a_r0,   &MCS48_BASE::anl_a_r1,    &MCS48_BASE::anl_a_r2,   &MCS48_BASE::anl_a_r3,  &MCS48_BASE::anl_a_r4,  &MCS48_BASE::anl_a_r5,  &MCS48_BASE::anl_a_r6,  &MCS48_BASE::anl_a_r7,
+               &MCS48_BASE::add_a_xr0,  &MCS48_BASE::add_a_xr1,   &MCS48_BASE::mov_t_a,    &MCS48_BASE::illegal,   &MCS48_BASE::jmp_3,     &MCS48_BASE::stop_tcnt, &MCS48_BASE::illegal,   &MCS48_BASE::rrc_a,         /* 60 */
+               &MCS48_BASE::add_a_r0,   &MCS48_BASE::add_a_r1,    &MCS48_BASE::add_a_r2,   &MCS48_BASE::add_a_r3,  &MCS48_BASE::add_a_r4,  &MCS48_BASE::add_a_r5,  &MCS48_BASE::add_a_r6,  &MCS48_BASE::add_a_r7,
+               &MCS48_BASE::adc_a_xr0,  &MCS48_BASE::adc_a_xr1,   &MCS48_BASE::jb_3,       &MCS48_BASE::illegal,   &MCS48_BASE::call_3,    &MCS48_BASE::ent0_clk,  &MCS48_BASE::jf1,       &MCS48_BASE::rr_a,          /* 70 */
+               &MCS48_BASE::adc_a_r0,   &MCS48_BASE::adc_a_r1,    &MCS48_BASE::adc_a_r2,   &MCS48_BASE::adc_a_r3,  &MCS48_BASE::adc_a_r4,  &MCS48_BASE::adc_a_r5,  &MCS48_BASE::adc_a_r6,  &MCS48_BASE::adc_a_r7,
+               &MCS48_BASE::movx_a_xr0, &MCS48_BASE::movx_a_xr1,  &MCS48_BASE::illegal,    &MCS48_BASE::ret,       &MCS48_BASE::jmp_4,     &MCS48_BASE::clr_f0,    &MCS48_BASE::jni,       &MCS48_BASE::illegal,       /* 80 */
+               &MCS48_BASE::orl_bus_n,  &MCS48_BASE::orl_p1_n,    &MCS48_BASE::orl_p2_n,   &MCS48_BASE::illegal,   &MCS48_BASE::orld_p4_a, &MCS48_BASE::orld_p5_a, &MCS48_BASE::orld_p6_a, &MCS48_BASE::orld_p7_a,
+               &MCS48_BASE::movx_xr0_a, &MCS48_BASE::movx_xr1_a,  &MCS48_BASE::jb_4,       &MCS48_BASE::retr,      &MCS48_BASE::call_4,    &MCS48_BASE::cpl_f0,    &MCS48_BASE::jnz,       &MCS48_BASE::clr_c,         /* 90 */
+               &MCS48_BASE::anl_bus_n,  &MCS48_BASE::anl_p1_n,    &MCS48_BASE::anl_p2_n,   &MCS48_BASE::illegal,   &MCS48_BASE::anld_p4_a, &MCS48_BASE::anld_p5_a, &MCS48_BASE::anld_p6_a, &MCS48_BASE::anld_p7_a,
+               &MCS48_BASE::mov_xr0_a,  &MCS48_BASE::mov_xr1_a,   &MCS48_BASE::illegal,    &MCS48_BASE::movp_a_xa, &MCS48_BASE::jmp_5,     &MCS48_BASE::clr_f1,    &MCS48_BASE::illegal,   &MCS48_BASE::cpl_c,         /* A0 */
+               &MCS48_BASE::mov_r0_a,   &MCS48_BASE::mov_r1_a,    &MCS48_BASE::mov_r2_a,   &MCS48_BASE::mov_r3_a,  &MCS48_BASE::mov_r4_a,  &MCS48_BASE::mov_r5_a,  &MCS48_BASE::mov_r6_a,  &MCS48_BASE::mov_r7_a,
+               &MCS48_BASE::mov_xr0_n,  &MCS48_BASE::mov_xr1_n,   &MCS48_BASE::jb_5,       &MCS48_BASE::jmpp_xa,   &MCS48_BASE::call_5,    &MCS48_BASE::cpl_f1,    &MCS48_BASE::jf0,       &MCS48_BASE::illegal,       /* B0 */
+               &MCS48_BASE::mov_r0_n,   &MCS48_BASE::mov_r1_n,    &MCS48_BASE::mov_r2_n,   &MCS48_BASE::mov_r3_n,  &MCS48_BASE::mov_r4_n,  &MCS48_BASE::mov_r5_n,  &MCS48_BASE::mov_r6_n,  &MCS48_BASE::mov_r7_n,
+               &MCS48_BASE::illegal,    &MCS48_BASE::illegal,     &MCS48_BASE::illegal,    &MCS48_BASE::illegal,   &MCS48_BASE::jmp_6,     &MCS48_BASE::sel_rb0,   &MCS48_BASE::jz,        &MCS48_BASE::mov_a_psw,     /* C0 */
+               &MCS48_BASE::dec_r0,     &MCS48_BASE::dec_r1,      &MCS48_BASE::dec_r2,     &MCS48_BASE::dec_r3,    &MCS48_BASE::dec_r4,    &MCS48_BASE::dec_r5,    &MCS48_BASE::dec_r6,    &MCS48_BASE::dec_r7,
+               &MCS48_BASE::xrl_a_xr0,  &MCS48_BASE::xrl_a_xr1,   &MCS48_BASE::jb_6,       &MCS48_BASE::xrl_a_n,   &MCS48_BASE::call_6,    &MCS48_BASE::sel_rb1,   &MCS48_BASE::illegal,   &MCS48_BASE::mov_psw_a,     /* D0 */
+               &MCS48_BASE::xrl_a_r0,   &MCS48_BASE::xrl_a_r1,    &MCS48_BASE::xrl_a_r2,   &MCS48_BASE::xrl_a_r3,  &MCS48_BASE::xrl_a_r4,  &MCS48_BASE::xrl_a_r5,  &MCS48_BASE::xrl_a_r6,  &MCS48_BASE::xrl_a_r7,
+               &MCS48_BASE::illegal,    &MCS48_BASE::illegal,     &MCS48_BASE::illegal,    &MCS48_BASE::movp3_a_xa,&MCS48_BASE::jmp_7,     &MCS48_BASE::sel_mb0,   &MCS48_BASE::jnc,       &MCS48_BASE::rl_a,          /* E0 */
+               &MCS48_BASE::djnz_r0,    &MCS48_BASE::djnz_r1,     &MCS48_BASE::djnz_r2,    &MCS48_BASE::djnz_r3,   &MCS48_BASE::djnz_r4,   &MCS48_BASE::djnz_r5,   &MCS48_BASE::djnz_r6,   &MCS48_BASE::djnz_r7,
+               &MCS48_BASE::mov_a_xr0,  &MCS48_BASE::mov_a_xr1,   &MCS48_BASE::jb_7,       &MCS48_BASE::illegal,   &MCS48_BASE::call_7,    &MCS48_BASE::sel_mb1,   &MCS48_BASE::jc,        &MCS48_BASE::rlc_a,         /* F0 */
+               &MCS48_BASE::mov_a_r0,   &MCS48_BASE::mov_a_r1,    &MCS48_BASE::mov_a_r2,   &MCS48_BASE::mov_a_r3,  &MCS48_BASE::mov_a_r4,  &MCS48_BASE::mov_a_r5,  &MCS48_BASE::mov_a_r6,  &MCS48_BASE::mov_a_r7
+       };
        
+       inline void update_regptr(mcs48_state *cpustate);
+       inline void push_pc_psw(mcs48_state *cpustate);
+       inline void pull_pc_psw(mcs48_state *cpustate);
+       inline int check_irqs(mcs48_state *cpustate);
+       inline UINT8 opcode_fetch(mcs48_state *cpustate);
+       int op_call(mcs48_state *);
 public:
-       MCS48(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+       MCS48_BASE(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
        {
                d_mem = d_io = d_intr = NULL;
+               d_debugger = NULL;
+               d_mem_stored = d_io_stored = NULL;
                set_device_name(_T("MCS48 MCU"));
        }
-       ~MCS48() {}
+       ~MCS48_BASE() {}
        
        // common functions
-       void initialize();
-       void release();
+       virtual void initialize();
+       virtual void release();
        void reset();
-       int run(int icount);
+       virtual int run(int icount);
        void write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc();
        uint32_t get_next_pc();
-#ifdef USE_DEBUGGER
-       void *get_debugger()
-       {
-               return d_debugger;
-       }
-       uint32_t get_debug_prog_addr_mask()
-       {
-               return 0xfff;
-       }
-       uint32_t get_debug_data_addr_mask()
-       {
-               return 0xff;
-       }
+//#ifdef USE_DEBUGGER
        void write_debug_data8(uint32_t addr, uint32_t data);
        uint32_t read_debug_data8(uint32_t addr);
        void write_debug_io8(uint32_t addr, uint32_t data);
@@ -104,9 +493,7 @@ public:
        bool write_debug_reg(const _TCHAR *reg, uint32_t data);
        void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
        int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
-#endif
-       void save_state(FILEIO* state_state_fio);
-       bool load_state(FILEIO* state_state_fio);
+//#endif
        
        // unique functions
        void set_context_mem(DEVICE* device)
@@ -121,15 +508,252 @@ public:
        {
                d_intr = device;
        }
+       void load_rom_image(const _TCHAR *file_path);
+       uint8_t *get_rom_ptr();
+};
+
+
+/*-------------------------------------------------
+    update_regptr - update the regptr member to
+    point to the appropriate register bank
+-------------------------------------------------*/
+
+inline void MCS48_BASE::update_regptr(mcs48_state *cpustate)
+{
+       cpustate->regptr = ((cpustate->psw & B_FLAG) ? 24 : 0);
+}
+
+/*-------------------------------------------------
+    push_pc_psw - push the cpustate->pc and cpustate->psw values onto
+    the stack
+-------------------------------------------------*/
+
+inline void MCS48_BASE::push_pc_psw(mcs48_state *cpustate)
+{
+       UINT8 sp = cpustate->psw & 0x07;
+       __mcs48_ram_w(8 + 2*sp, cpustate->pc);
+       __mcs48_ram_w(9 + 2*sp, ((cpustate->pc >> 8) & 0x0f) | (cpustate->psw & 0xf0));
+       cpustate->psw = (cpustate->psw & 0xf8) | ((sp + 1) & 0x07);
+}
+
+/*-------------------------------------------------
+    pull_pc_psw - pull the PC and PSW values from
+    the stack
+-------------------------------------------------*/
+
+inline void MCS48_BASE::pull_pc_psw(mcs48_state *cpustate)
+{
+       UINT8 sp = (cpustate->psw - 1) & 0x07;
+       cpustate->pc = __mcs48_ram_r(8 + 2*sp);
+       cpustate->pc |= __mcs48_ram_r(9 + 2*sp) << 8;
+       cpustate->psw = ((cpustate->pc >> 8) & 0xf0) | 0x08 | sp;
+       cpustate->pc &= 0xfff;
+       update_regptr(cpustate);
+}
+
+/*-------------------------------------------------
+    check_irqs - check for and process IRQs
+-------------------------------------------------*/
+
+inline int MCS48_BASE::check_irqs(mcs48_state *cpustate)
+{
+       /* if something is in progress, we do nothing */
+       if (cpustate->irq_in_progress)
+               return 0;
+
+       /* external interrupts take priority */
+       if (cpustate->irq_state && cpustate->xirq_enabled)
+       {
+               cpustate->irq_state = FALSE;
+               cpustate->irq_in_progress = TRUE;
+
+               /* transfer to location 0x03 */
+               push_pc_psw(cpustate);
+               cpustate->pc = 0x03;
+
+               /* indicate we took the external IRQ */
+               if (cpustate->intr != NULL)
+                       cpustate->intr->get_intr_ack();
+               return 2;
+       }
+
+       /* timer overflow interrupts follow */
+       if (cpustate->timer_overflow && cpustate->tirq_enabled)
+       {
+               cpustate->irq_in_progress = TRUE;
+
+               /* transfer to location 0x07 */
+               push_pc_psw(cpustate);
+               cpustate->pc = 0x07;
+
+               /* timer overflow flip-flop is reset once taken */
+               cpustate->timer_overflow = FALSE;
+               return 2;
+       }
+       return 0;
+}
+
+/***************************************************************************
+    INLINE FUNCTIONS
+***************************************************************************/
+
+/*-------------------------------------------------
+    opcode_fetch - fetch an opcode byte
+-------------------------------------------------*/
+
+inline UINT8 MCS48_BASE::opcode_fetch(mcs48_state *cpustate)
+{
+       return cpustate->rom[cpustate->pc++ & 0xfff];
+}
+
+/*-------------------------------------------------
+    argument_fetch - fetch an opcode argument
+    byte
+-------------------------------------------------*/
+
+inline UINT8 MCS48_BASE::argument_fetch(mcs48_state *cpustate)
+{
+       return cpustate->rom[cpustate->pc++ & 0xfff];
+}
+
+/*-------------------------------------------------
+    pull_pc - pull the PC value from the stack,
+    leaving the upper part of PSW intact
+-------------------------------------------------*/
+
+inline void MCS48_BASE::pull_pc(mcs48_state *cpustate)
+{
+       UINT8 sp = (cpustate->psw - 1) & 0x07;
+       cpustate->pc = __mcs48_ram_r(8 + 2*sp);
+       cpustate->pc |= __mcs48_ram_r(9 + 2*sp) << 8;
+       cpustate->pc &= 0xfff;
+       cpustate->psw = (cpustate->psw & 0xf0) | 0x08 | sp;
+}
+
+/*-------------------------------------------------
+    execute_add - perform the logic of an ADD
+    instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_add(mcs48_state *cpustate, UINT8 dat)
+{
+       UINT16 temp = cpustate->a + dat;
+       UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f);
+
+       cpustate->psw &= ~(C_FLAG | A_FLAG);
+       cpustate->psw |= (temp4 << 2) & A_FLAG;
+       cpustate->psw |= (temp >> 1) & C_FLAG;
+       cpustate->a = temp;
+}
+
+/*-------------------------------------------------
+    execute_addc - perform the logic of an ADDC
+    instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_addc(mcs48_state *cpustate, UINT8 dat)
+{
+       UINT8 carryin = (cpustate->psw & C_FLAG) >> 7;
+       UINT16 temp = cpustate->a + dat + carryin;
+       UINT16 temp4 = (cpustate->a & 0x0f) + (dat & 0x0f) + carryin;
+
+       cpustate->psw &= ~(C_FLAG | A_FLAG);
+       cpustate->psw |= (temp4 << 2) & A_FLAG;
+       cpustate->psw |= (temp >> 1) & C_FLAG;
+       cpustate->a = temp;
+}
+
+/*-------------------------------------------------
+    execute_jmp - perform the logic of a JMP
+    instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_jmp(mcs48_state *cpustate, UINT16 address)
+{
+       UINT16 a11 = (cpustate->irq_in_progress) ? 0 : cpustate->a11;
+       cpustate->pc = address | a11;
+}
+
+/*-------------------------------------------------
+    execute_call - perform the logic of a CALL
+    instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_call(mcs48_state *cpustate, UINT16 address)
+{
+       push_pc_psw(cpustate);
+       execute_jmp(cpustate, address);
+}
+
+/*-------------------------------------------------
+    execute_jcc - perform the logic of a
+    conditional jump instruction
+-------------------------------------------------*/
+
+inline void MCS48_BASE::execute_jcc(mcs48_state *cpustate, UINT8 result)
+{
+       UINT8 offset = argument_fetch(cpustate);
+       if (result != 0)
+               cpustate->pc = ((cpustate->pc - 1) & 0xf00) | offset;
+}
+
+/*-------------------------------------------------
+    expander_operation - perform an operation via
+    the 8243 expander chip
+-------------------------------------------------*/
+
+inline void MCS48_BASE::expander_operation(mcs48_state *cpustate, UINT8 operation, UINT8 port)
+{
+       /* put opcode/data on low 4 bits of P2 */
+       __mcs48_port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (operation << 2) | (port & 3));
+
+       /* generate high-to-low transition on PROG line */
+       __mcs48_prog_w(0);
+
+       /* put data on low 4 bits of P2 */
+       if (operation != 0)
+               __mcs48_port_w(2, cpustate->p2 = (cpustate->p2 & 0xf0) | (cpustate->a & 0x0f));
+       else
+               cpustate->a = __mcs48_port_r(2) | 0x0f;
+
+       /* generate low-to-high transition on PROG line */
+       __mcs48_prog_w(1);
+}
+
+
+class MCS48 : public MCS48_BASE
+{
+private:
+       void burn_cycles(mcs48_state *cpustate, int count);
+public:
+       MCS48(VM* parent_vm, EMU* parent_emu) : MCS48_BASE(parent_vm, parent_emu)
+       {
+       }
+       ~MCS48() {}
+       void initialize();
+       void release();
+       int run(int icount);
+       void save_state(FILEIO* state_state_fio);
+       bool load_state(FILEIO* state_state_fio);
 #ifdef USE_DEBUGGER
+       void *get_debugger()
+       {
+               return d_debugger;
+       }
+       uint32_t get_debug_prog_addr_mask()
+       {
+               return 0xfff;
+       }
+       uint32_t get_debug_data_addr_mask()
+       {
+               return 0xff;
+       }
        void set_context_debugger(DEBUGGER* device)
        {
                d_debugger = device;
        }
 #endif
-       void load_rom_image(const _TCHAR *file_path);
-       uint8_t *get_rom_ptr();
-};
-#endif // USE_SHARED_DLL
+};     
+
 #endif
 
diff --git a/source/src/vm/mcs48_base.cpp b/source/src/vm/mcs48_base.cpp
new file mode 100644 (file)
index 0000000..f7e02ed
--- /dev/null
@@ -0,0 +1,854 @@
+/*
+       Skelton for retropc emulator
+
+       Origin : MAME 0.148
+       Author : Takeda.Toshiya
+       Date   : 2013.05.01-
+
+       [ MCS48 ]
+*/
+
+#include "mcs48_flags.h"
+#include "mcs48.h"
+//#ifdef USE_DEBUGGER
+#include "debugger.h"
+//#endif
+
+/***************************************************************************
+
+    mcs48.c
+
+    Intel MCS-48/UPI-41 Portable Emulator
+
+    Copyright Mirko Buffoni
+    Based on the original work Copyright Dan Boris, an 8048 emulator
+    You are not allowed to distribute this software commercially
+
+****************************************************************************
+
+    Note that the default internal divisor for this chip is by 3 and
+    then again by 5, or by 15 total.
+
+***************************************************************************/
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning( disable : 4244 )
+#endif
+
+
+/***************************************************************************
+    OPCODE HANDLERS
+***************************************************************************/
+
+
+__MCS48_OPHANDLER( illegal )
+{
+//     logerror("MCS-48 PC:%04X - Illegal opcode = %02x\n", cpustate->pc - 1, __mcs48_program_r(cpustate->pc - 1));
+       return 1;
+}
+
+__MCS48_OPHANDLER( add_a_r0 )       { execute_add(cpustate, __mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( add_a_r1 )       { execute_add(cpustate, __mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( add_a_r2 )       { execute_add(cpustate, __mcs48_reg_r(2)); return 1; }
+__MCS48_OPHANDLER( add_a_r3 )       { execute_add(cpustate, __mcs48_reg_r(3)); return 1; }
+__MCS48_OPHANDLER( add_a_r4 )       { execute_add(cpustate, __mcs48_reg_r(4)); return 1; }
+__MCS48_OPHANDLER( add_a_r5 )       { execute_add(cpustate, __mcs48_reg_r(5)); return 1; }
+__MCS48_OPHANDLER( add_a_r6 )       { execute_add(cpustate, __mcs48_reg_r(6)); return 1; }
+__MCS48_OPHANDLER( add_a_r7 )       { execute_add(cpustate, __mcs48_reg_r(7)); return 1; }
+__MCS48_OPHANDLER( add_a_xr0 )      { execute_add(cpustate, __mcs48_ram_r(__mcs48_reg_r(0))); return 1; }
+__MCS48_OPHANDLER( add_a_xr1 )      { execute_add(cpustate, __mcs48_ram_r(__mcs48_reg_r(1))); return 1; }
+__MCS48_OPHANDLER( add_a_n )        { execute_add(cpustate, argument_fetch(cpustate)); return 2; }
+
+__MCS48_OPHANDLER( adc_a_r0 )       { execute_addc(cpustate, __mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( adc_a_r1 )       { execute_addc(cpustate, __mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( adc_a_r2 )       { execute_addc(cpustate, __mcs48_reg_r(2)); return 1; }
+__MCS48_OPHANDLER( adc_a_r3 )       { execute_addc(cpustate, __mcs48_reg_r(3)); return 1; }
+__MCS48_OPHANDLER( adc_a_r4 )       { execute_addc(cpustate, __mcs48_reg_r(4)); return 1; }
+__MCS48_OPHANDLER( adc_a_r5 )       { execute_addc(cpustate, __mcs48_reg_r(5)); return 1; }
+__MCS48_OPHANDLER( adc_a_r6 )       { execute_addc(cpustate, __mcs48_reg_r(6)); return 1; }
+__MCS48_OPHANDLER( adc_a_r7 )       { execute_addc(cpustate, __mcs48_reg_r(7)); return 1; }
+__MCS48_OPHANDLER( adc_a_xr0 )      { execute_addc(cpustate, __mcs48_ram_r(__mcs48_reg_r(0))); return 1; }
+__MCS48_OPHANDLER( adc_a_xr1 )      { execute_addc(cpustate, __mcs48_ram_r(__mcs48_reg_r(1))); return 1; }
+__MCS48_OPHANDLER( adc_a_n )        { execute_addc(cpustate, argument_fetch(cpustate)); return 2; }
+
+__MCS48_OPHANDLER( anl_a_r0 )       { cpustate->a &= __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( anl_a_r1 )       { cpustate->a &= __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( anl_a_r2 )       { cpustate->a &= __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( anl_a_r3 )       { cpustate->a &= __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( anl_a_r4 )       { cpustate->a &= __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( anl_a_r5 )       { cpustate->a &= __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( anl_a_r6 )       { cpustate->a &= __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( anl_a_r7 )       { cpustate->a &= __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( anl_a_xr0 )      { cpustate->a &= __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( anl_a_xr1 )      { cpustate->a &= __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( anl_a_n )        { cpustate->a &= argument_fetch(cpustate); return 2; }
+
+__MCS48_OPHANDLER( anl_bus_n )      { __mcs48_bus_w(__mcs48_bus_r() & argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( anl_p1_n )       { __mcs48_port_w(1, cpustate->p1 &= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( anl_p2_n )       { __mcs48_port_w(2, cpustate->p2 &= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( anld_p4_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 4); return 2; }
+__MCS48_OPHANDLER( anld_p5_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 5); return 2; }
+__MCS48_OPHANDLER( anld_p6_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 6); return 2; }
+__MCS48_OPHANDLER( anld_p7_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_AND, 7); return 2; }
+
+__MCS48_OPHANDLER( call_0 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
+__MCS48_OPHANDLER( call_1 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
+__MCS48_OPHANDLER( call_2 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
+__MCS48_OPHANDLER( call_3 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
+__MCS48_OPHANDLER( call_4 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
+__MCS48_OPHANDLER( call_5 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
+__MCS48_OPHANDLER( call_6 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
+__MCS48_OPHANDLER( call_7 )         { execute_call(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
+
+__MCS48_OPHANDLER( clr_a )          { cpustate->a = 0; return 1; }
+__MCS48_OPHANDLER( clr_c )          { cpustate->psw &= ~C_FLAG; return 1; }
+__MCS48_OPHANDLER( clr_f0 )         { cpustate->psw &= ~F_FLAG; cpustate->sts &= ~STS_F0; return 1; }
+__MCS48_OPHANDLER( clr_f1 )         { cpustate->sts &= ~STS_F1; return 1; }
+
+__MCS48_OPHANDLER( cpl_a )          { cpustate->a ^= 0xff; return 1; }
+__MCS48_OPHANDLER( cpl_c )          { cpustate->psw ^= C_FLAG; return 1; }
+__MCS48_OPHANDLER( cpl_f0 )         { cpustate->psw ^= F_FLAG; cpustate->sts ^= STS_F0; return 1; }
+__MCS48_OPHANDLER( cpl_f1 )         { cpustate->sts ^= STS_F1; return 1; }
+
+__MCS48_OPHANDLER( da_a )
+{
+       if ((cpustate->a & 0x0f) > 0x09 || (cpustate->psw & A_FLAG))
+       {
+               cpustate->a += 0x06;
+               if ((cpustate->a & 0xf0) == 0x00)
+                       cpustate->psw |= C_FLAG;
+       }
+       if ((cpustate->a & 0xf0) > 0x90 || (cpustate->psw & C_FLAG))
+       {
+               cpustate->a += 0x60;
+               cpustate->psw |= C_FLAG;
+       }
+       else
+               cpustate->psw &= ~C_FLAG;
+       return 1;
+}
+
+__MCS48_OPHANDLER( dec_a )          { cpustate->a--; return 1; }
+__MCS48_OPHANDLER( dec_r0 )         { __mcs48_reg_w(0, __mcs48_reg_r(0) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r1 )         { __mcs48_reg_w(1, __mcs48_reg_r(1) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r2 )         { __mcs48_reg_w(2, __mcs48_reg_r(2) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r3 )         { __mcs48_reg_w(3, __mcs48_reg_r(3) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r4 )         { __mcs48_reg_w(4, __mcs48_reg_r(4) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r5 )         { __mcs48_reg_w(5, __mcs48_reg_r(5) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r6 )         { __mcs48_reg_w(6, __mcs48_reg_r(6) - 1); return 1; }
+__MCS48_OPHANDLER( dec_r7 )         { __mcs48_reg_w(7, __mcs48_reg_r(7) - 1); return 1; }
+
+__MCS48_OPHANDLER( dis_i )          { cpustate->xirq_enabled = FALSE; return 1; }
+__MCS48_OPHANDLER( dis_tcnti )      { cpustate->tirq_enabled = FALSE; cpustate->timer_overflow = FALSE; return 1; }
+
+__MCS48_OPHANDLER( djnz_r0 )        { UINT8 r0 = __mcs48_reg_r(0); __mcs48_reg_w(0, --r0); execute_jcc(cpustate, r0 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r1 )        { UINT8 r1 = __mcs48_reg_r(1); __mcs48_reg_w(1, --r1); execute_jcc(cpustate, r1 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r2 )        { UINT8 r2 = __mcs48_reg_r(2); __mcs48_reg_w(2, --r2); execute_jcc(cpustate, r2 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r3 )        { UINT8 r3 = __mcs48_reg_r(3); __mcs48_reg_w(3, --r3); execute_jcc(cpustate, r3 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r4 )        { UINT8 r4 = __mcs48_reg_r(4); __mcs48_reg_w(4, --r4); execute_jcc(cpustate, r4 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r5 )        { UINT8 r5 = __mcs48_reg_r(5); __mcs48_reg_w(5, --r5); execute_jcc(cpustate, r5 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r6 )        { UINT8 r6 = __mcs48_reg_r(6); __mcs48_reg_w(6, --r6); execute_jcc(cpustate, r6 != 0); return 2; }
+__MCS48_OPHANDLER( djnz_r7 )        { UINT8 r7 = __mcs48_reg_r(7); __mcs48_reg_w(7, --r7); execute_jcc(cpustate, r7 != 0); return 2; }
+
+__MCS48_OPHANDLER( en_i )           { cpustate->xirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
+__MCS48_OPHANDLER( en_tcnti )       { cpustate->tirq_enabled = TRUE; return 1 + check_irqs(cpustate); }
+__MCS48_OPHANDLER( ent0_clk )       { cpustate->t0_clk_enabled = TRUE; return 1; }
+
+__MCS48_OPHANDLER( in_a_p1 )        { cpustate->a = __mcs48_port_r(1) & cpustate->p1; return 2; }
+__MCS48_OPHANDLER( in_a_p2 )        { cpustate->a = __mcs48_port_r(2) & cpustate->p2; return 2; }
+__MCS48_OPHANDLER( ins_a_bus )      { cpustate->a = __mcs48_bus_r(); return 2; }
+
+__MCS48_OPHANDLER( inc_a )          { cpustate->a++; return 1; }
+__MCS48_OPHANDLER( inc_r0 )         { __mcs48_reg_w(0, __mcs48_reg_r(0) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r1 )         { __mcs48_reg_w(1, __mcs48_reg_r(1) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r2 )         { __mcs48_reg_w(2, __mcs48_reg_r(2) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r3 )         { __mcs48_reg_w(3, __mcs48_reg_r(3) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r4 )         { __mcs48_reg_w(4, __mcs48_reg_r(4) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r5 )         { __mcs48_reg_w(5, __mcs48_reg_r(5) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r6 )         { __mcs48_reg_w(6, __mcs48_reg_r(6) + 1); return 1; }
+__MCS48_OPHANDLER( inc_r7 )         { __mcs48_reg_w(7, __mcs48_reg_r(7) + 1); return 1; }
+__MCS48_OPHANDLER( inc_xr0 )        { UINT8 r0 = __mcs48_reg_r(0); __mcs48_ram_w(r0, __mcs48_ram_r(r0) + 1); return 1; }
+__MCS48_OPHANDLER( inc_xr1 )        { UINT8 r1 = __mcs48_reg_r(1); __mcs48_ram_w(r1, __mcs48_ram_r(r1) + 1); return 1; }
+
+__MCS48_OPHANDLER( jb_0 )           { execute_jcc(cpustate, (cpustate->a & 0x01) != 0); return 2; }
+__MCS48_OPHANDLER( jb_1 )           { execute_jcc(cpustate, (cpustate->a & 0x02) != 0); return 2; }
+__MCS48_OPHANDLER( jb_2 )           { execute_jcc(cpustate, (cpustate->a & 0x04) != 0); return 2; }
+__MCS48_OPHANDLER( jb_3 )           { execute_jcc(cpustate, (cpustate->a & 0x08) != 0); return 2; }
+__MCS48_OPHANDLER( jb_4 )           { execute_jcc(cpustate, (cpustate->a & 0x10) != 0); return 2; }
+__MCS48_OPHANDLER( jb_5 )           { execute_jcc(cpustate, (cpustate->a & 0x20) != 0); return 2; }
+__MCS48_OPHANDLER( jb_6 )           { execute_jcc(cpustate, (cpustate->a & 0x40) != 0); return 2; }
+__MCS48_OPHANDLER( jb_7 )           { execute_jcc(cpustate, (cpustate->a & 0x80) != 0); return 2; }
+__MCS48_OPHANDLER( jc )             { execute_jcc(cpustate, (cpustate->psw & C_FLAG) != 0); return 2; }
+__MCS48_OPHANDLER( jf0 )            { execute_jcc(cpustate, (cpustate->psw & F_FLAG) != 0); return 2; }
+__MCS48_OPHANDLER( jf1 )            { execute_jcc(cpustate, (cpustate->sts & STS_F1) != 0); return 2; }
+__MCS48_OPHANDLER( jnc )            { execute_jcc(cpustate, (cpustate->psw & C_FLAG) == 0); return 2; }
+__MCS48_OPHANDLER( jni )            { execute_jcc(cpustate, cpustate->int_state == 0); return 2; }
+__MCS48_OPHANDLER( jnt_0 )          { execute_jcc(cpustate, __mcs48_test_r(0) == 0); return 2; }
+__MCS48_OPHANDLER( jnt_1 )          { execute_jcc(cpustate, __mcs48_test_r(1) == 0); return 2; }
+__MCS48_OPHANDLER( jnz )            { execute_jcc(cpustate, cpustate->a != 0); return 2; }
+__MCS48_OPHANDLER( jtf )            { execute_jcc(cpustate, cpustate->timer_flag); cpustate->timer_flag = FALSE; return 2; }
+__MCS48_OPHANDLER( jt_0 )           { execute_jcc(cpustate, __mcs48_test_r(0) != 0); return 2; }
+__MCS48_OPHANDLER( jt_1 )           { execute_jcc(cpustate, __mcs48_test_r(1) != 0); return 2; }
+__MCS48_OPHANDLER( jz )             { execute_jcc(cpustate, cpustate->a == 0); return 2; }
+
+__MCS48_OPHANDLER( jmp_0 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x000); return 2; }
+__MCS48_OPHANDLER( jmp_1 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x100); return 2; }
+__MCS48_OPHANDLER( jmp_2 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x200); return 2; }
+__MCS48_OPHANDLER( jmp_3 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x300); return 2; }
+__MCS48_OPHANDLER( jmp_4 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x400); return 2; }
+__MCS48_OPHANDLER( jmp_5 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x500); return 2; }
+__MCS48_OPHANDLER( jmp_6 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x600); return 2; }
+__MCS48_OPHANDLER( jmp_7 )          { execute_jmp(cpustate, argument_fetch(cpustate) | 0x700); return 2; }
+__MCS48_OPHANDLER( jmpp_xa )        { cpustate->pc &= 0xf00; cpustate->pc |= __mcs48_program_r(cpustate->pc | cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( mov_a_n )        { cpustate->a = argument_fetch(cpustate); return 2; }
+__MCS48_OPHANDLER( mov_a_psw )      { cpustate->a = cpustate->psw; return 1; }
+__MCS48_OPHANDLER( mov_a_r0 )       { cpustate->a = __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( mov_a_r1 )       { cpustate->a = __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( mov_a_r2 )       { cpustate->a = __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( mov_a_r3 )       { cpustate->a = __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( mov_a_r4 )       { cpustate->a = __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( mov_a_r5 )       { cpustate->a = __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( mov_a_r6 )       { cpustate->a = __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( mov_a_r7 )       { cpustate->a = __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( mov_a_xr0 )      { cpustate->a = __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( mov_a_xr1 )      { cpustate->a = __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( mov_a_t )        { cpustate->a = cpustate->timer; return 1; }
+
+__MCS48_OPHANDLER( mov_psw_a )      { cpustate->psw = cpustate->a; update_regptr(cpustate); return 1; }
+__MCS48_OPHANDLER( mov_r0_a )       { __mcs48_reg_w(0, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r1_a )       { __mcs48_reg_w(1, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r2_a )       { __mcs48_reg_w(2, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r3_a )       { __mcs48_reg_w(3, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r4_a )       { __mcs48_reg_w(4, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r5_a )       { __mcs48_reg_w(5, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r6_a )       { __mcs48_reg_w(6, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r7_a )       { __mcs48_reg_w(7, cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_r0_n )       { __mcs48_reg_w(0, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r1_n )       { __mcs48_reg_w(1, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r2_n )       { __mcs48_reg_w(2, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r3_n )       { __mcs48_reg_w(3, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r4_n )       { __mcs48_reg_w(4, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r5_n )       { __mcs48_reg_w(5, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r6_n )       { __mcs48_reg_w(6, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_r7_n )       { __mcs48_reg_w(7, argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_t_a )        { cpustate->timer = cpustate->a; return 1; }
+__MCS48_OPHANDLER( mov_xr0_a )      { __mcs48_ram_w(__mcs48_reg_r(0), cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_xr1_a )      { __mcs48_ram_w(__mcs48_reg_r(1), cpustate->a); return 1; }
+__MCS48_OPHANDLER( mov_xr0_n )      { __mcs48_ram_w(__mcs48_reg_r(0), argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( mov_xr1_n )      { __mcs48_ram_w(__mcs48_reg_r(1), argument_fetch(cpustate)); return 2; }
+
+__MCS48_OPHANDLER( movd_a_p4 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 4); return 2; }
+__MCS48_OPHANDLER( movd_a_p5 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 5); return 2; }
+__MCS48_OPHANDLER( movd_a_p6 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 6); return 2; }
+__MCS48_OPHANDLER( movd_a_p7 )      { expander_operation(cpustate, MCS48_EXPANDER_OP_READ, 7); return 2; }
+__MCS48_OPHANDLER( movd_p4_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 4); return 2; }
+__MCS48_OPHANDLER( movd_p5_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 5); return 2; }
+__MCS48_OPHANDLER( movd_p6_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 6); return 2; }
+__MCS48_OPHANDLER( movd_p7_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_WRITE, 7); return 2; }
+
+__MCS48_OPHANDLER( movp_a_xa )      { cpustate->a = __mcs48_program_r((cpustate->pc & 0xf00) | cpustate->a); return 2; }
+__MCS48_OPHANDLER( movp3_a_xa )     { cpustate->a = __mcs48_program_r(0x300 | cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( movx_a_xr0 )     { cpustate->a = __mcs48_ext_r(__mcs48_reg_r(0)); return 2; }
+__MCS48_OPHANDLER( movx_a_xr1 )     { cpustate->a = __mcs48_ext_r(__mcs48_reg_r(1)); return 2; }
+__MCS48_OPHANDLER( movx_xr0_a )     { __mcs48_ext_w(__mcs48_reg_r(0), cpustate->a); return 2; }
+__MCS48_OPHANDLER( movx_xr1_a )     { __mcs48_ext_w(__mcs48_reg_r(1), cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( nop )            { return 1; }
+
+__MCS48_OPHANDLER( orl_a_r0 )       { cpustate->a |= __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( orl_a_r1 )       { cpustate->a |= __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( orl_a_r2 )       { cpustate->a |= __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( orl_a_r3 )       { cpustate->a |= __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( orl_a_r4 )       { cpustate->a |= __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( orl_a_r5 )       { cpustate->a |= __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( orl_a_r6 )       { cpustate->a |= __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( orl_a_r7 )       { cpustate->a |= __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( orl_a_xr0 )      { cpustate->a |= __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( orl_a_xr1 )      { cpustate->a |= __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( orl_a_n )        { cpustate->a |= argument_fetch(cpustate); return 2; }
+
+__MCS48_OPHANDLER( orl_bus_n )      { __mcs48_bus_w(__mcs48_bus_r() | argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( orl_p1_n )       { __mcs48_port_w(1, cpustate->p1 |= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( orl_p2_n )       { __mcs48_port_w(2, cpustate->p2 |= argument_fetch(cpustate)); return 2; }
+__MCS48_OPHANDLER( orld_p4_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 4); return 2; }
+__MCS48_OPHANDLER( orld_p5_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 5); return 2; }
+__MCS48_OPHANDLER( orld_p6_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 6); return 2; }
+__MCS48_OPHANDLER( orld_p7_a )      { expander_operation(cpustate, MCS48_EXPANDER_OP_OR, 7); return 2; }
+
+__MCS48_OPHANDLER( outl_bus_a )     { __mcs48_bus_w(cpustate->a); return 2; }
+__MCS48_OPHANDLER( outl_p1_a )      { __mcs48_port_w(1, cpustate->p1 = cpustate->a); return 2; }
+__MCS48_OPHANDLER( outl_p2_a )      { __mcs48_port_w(2, cpustate->p2 = cpustate->a); return 2; }
+
+__MCS48_OPHANDLER( ret )            { pull_pc(cpustate); return 2; }
+__MCS48_OPHANDLER( retr )
+{
+       pull_pc_psw(cpustate);
+
+       /* implicitly clear the IRQ in progress flip flop and re-check interrupts */
+       cpustate->irq_in_progress = FALSE;
+       return 2 + check_irqs(cpustate);
+}
+
+__MCS48_OPHANDLER( rl_a )           { cpustate->a = (cpustate->a << 1) | (cpustate->a >> 7); return 1; }
+__MCS48_OPHANDLER( rlc_a )          { UINT8 newc = cpustate->a & C_FLAG; cpustate->a = (cpustate->a << 1) | (cpustate->psw >> 7); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
+
+__MCS48_OPHANDLER( rr_a )           { cpustate->a = (cpustate->a >> 1) | (cpustate->a << 7); return 1; }
+__MCS48_OPHANDLER( rrc_a )          { UINT8 newc = (cpustate->a << 7) & C_FLAG; cpustate->a = (cpustate->a >> 1) | (cpustate->psw & C_FLAG); cpustate->psw = (cpustate->psw & ~C_FLAG) | newc; return 1; }
+
+__MCS48_OPHANDLER( sel_mb0 )        { cpustate->a11 = 0x000; return 1; }
+__MCS48_OPHANDLER( sel_mb1 )        { cpustate->a11 = 0x800; return 1; }
+
+__MCS48_OPHANDLER( sel_rb0 )        { cpustate->psw &= ~B_FLAG; update_regptr(cpustate); return 1; }
+__MCS48_OPHANDLER( sel_rb1 )        { cpustate->psw |=  B_FLAG; update_regptr(cpustate); return 1; }
+
+__MCS48_OPHANDLER( stop_tcnt )      { cpustate->timecount_enabled = 0; return 1; }
+
+__MCS48_OPHANDLER( strt_cnt )       { cpustate->timecount_enabled = __MCS48_COUNTER_ENABLED; cpustate->t1_history = __mcs48_test_r(1); return 1; }
+__MCS48_OPHANDLER( strt_t )         { cpustate->timecount_enabled = __MCS48_TIMER_ENABLED; cpustate->prescaler = 0; return 1; }
+
+__MCS48_OPHANDLER( swap_a )         { cpustate->a = (cpustate->a << 4) | (cpustate->a >> 4); return 1; }
+
+__MCS48_OPHANDLER( xch_a_r0 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(0); __mcs48_reg_w(0, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r1 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(1); __mcs48_reg_w(1, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r2 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(2); __mcs48_reg_w(2, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r3 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(3); __mcs48_reg_w(3, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r4 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(4); __mcs48_reg_w(4, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r5 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(5); __mcs48_reg_w(5, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r6 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(6); __mcs48_reg_w(6, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_r7 )       { UINT8 tmp = cpustate->a; cpustate->a = __mcs48_reg_r(7); __mcs48_reg_w(7, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_xr0 )      { UINT8 r0 = __mcs48_reg_r(0); UINT8 tmp = cpustate->a; cpustate->a = __mcs48_ram_r(r0); __mcs48_ram_w(r0, tmp); return 1; }
+__MCS48_OPHANDLER( xch_a_xr1 )      { UINT8 r1 = __mcs48_reg_r(1); UINT8 tmp = cpustate->a; cpustate->a = __mcs48_ram_r(r1); __mcs48_ram_w(r1, tmp); return 1; }
+
+__MCS48_OPHANDLER( xchd_a_xr0 )     { UINT8 r0 = __mcs48_reg_r(0); UINT8 oldram = __mcs48_ram_r(r0); __mcs48_ram_w(r0, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
+__MCS48_OPHANDLER( xchd_a_xr1 )     { UINT8 r1 = __mcs48_reg_r(1); UINT8 oldram = __mcs48_ram_r(r1); __mcs48_ram_w(r1, (oldram & 0xf0) | (cpustate->a & 0x0f)); cpustate->a = (cpustate->a & 0xf0) | (oldram & 0x0f); return 1; }
+
+__MCS48_OPHANDLER( xrl_a_r0 )       { cpustate->a ^= __mcs48_reg_r(0); return 1; }
+__MCS48_OPHANDLER( xrl_a_r1 )       { cpustate->a ^= __mcs48_reg_r(1); return 1; }
+__MCS48_OPHANDLER( xrl_a_r2 )       { cpustate->a ^= __mcs48_reg_r(2); return 1; }
+__MCS48_OPHANDLER( xrl_a_r3 )       { cpustate->a ^= __mcs48_reg_r(3); return 1; }
+__MCS48_OPHANDLER( xrl_a_r4 )       { cpustate->a ^= __mcs48_reg_r(4); return 1; }
+__MCS48_OPHANDLER( xrl_a_r5 )       { cpustate->a ^= __mcs48_reg_r(5); return 1; }
+__MCS48_OPHANDLER( xrl_a_r6 )       { cpustate->a ^= __mcs48_reg_r(6); return 1; }
+__MCS48_OPHANDLER( xrl_a_r7 )       { cpustate->a ^= __mcs48_reg_r(7); return 1; }
+__MCS48_OPHANDLER( xrl_a_xr0 )      { cpustate->a ^= __mcs48_ram_r(__mcs48_reg_r(0)); return 1; }
+__MCS48_OPHANDLER( xrl_a_xr1 )      { cpustate->a ^= __mcs48_ram_r(__mcs48_reg_r(1)); return 1; }
+__MCS48_OPHANDLER( xrl_a_n )        { cpustate->a ^= argument_fetch(cpustate); return 2; }
+
+/***************************************************************************
+    OPCODE TABLES
+***************************************************************************/
+
+
+/***************************************************************************
+    INITIALIZATION/RESET
+***************************************************************************/
+
+void MCS48_BASE::initialize()
+{
+       // Dummy function
+}
+
+void MCS48_BASE::release()
+{
+       // Dummy function
+}
+
+void MCS48_BASE::reset()
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       
+       /* confirmed from reset description */
+       cpustate->pc = 0;
+       cpustate->psw = (cpustate->psw & (C_FLAG | A_FLAG)) | 0x08;
+       cpustate->a11 = 0x000;
+//     __mcs48_bus_w(0xff);
+       cpustate->p1 = 0xff;
+       cpustate->p2 = 0xff;
+//     __mcs48_port_w(1, cpustate->p1);
+//     __mcs48_port_w(2, cpustate->p2);
+       cpustate->tirq_enabled = FALSE;
+       cpustate->xirq_enabled = FALSE;
+       cpustate->t0_clk_enabled = FALSE;
+       cpustate->timecount_enabled = 0;
+       cpustate->timer_flag = FALSE;
+       cpustate->sts = 0;
+       
+       cpustate->icount = 0;
+       
+       /* confirmed from interrupt logic description */
+       cpustate->int_state = TRUE;
+       cpustate->irq_state = cpustate->irq_in_progress = FALSE;
+       cpustate->timer_overflow = FALSE;
+}
+
+void MCS48_BASE::load_rom_image(const _TCHAR *file_path)
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       
+       memset(cpustate->rom, 0, sizeof(cpustate->rom));
+       
+       FILEIO* fio = new FILEIO();
+       if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
+               fio->Fread(cpustate->rom, sizeof(cpustate->rom), 1);
+               fio->Fclose();
+       }
+       delete fio;
+}
+
+uint8_t *MCS48_BASE::get_rom_ptr()
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       return cpustate->rom;
+}
+
+/***************************************************************************
+    EXECUTION
+***************************************************************************/
+
+
+int MCS48_BASE::op_call(mcs48_state *cpustate)
+{
+       unsigned opcode = opcode_fetch(cpustate);
+
+       /* process opcode and count cycles */
+       return (this->*opcode_table[opcode])(cpustate);
+}
+
+int MCS48_BASE::run(int icount)
+{
+       // Dummy
+       return icount;
+}
+
+uint32_t MCS48_BASE::get_pc()
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       return cpustate->prevpc;
+}
+
+uint32_t MCS48_BASE::get_next_pc()
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       return cpustate->pc;
+}
+
+/***************************************************************************
+    GENERAL CONTEXT ACCESS
+***************************************************************************/
+
+void MCS48_BASE::write_signal(int id, uint32_t data, uint32_t mask)
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       
+       if(id == SIG_CPU_IRQ) {
+               UINT8 prev = cpustate->int_state;
+               cpustate->int_state = ((data & mask) != 0);
+               // INT H->L
+               if(prev && !cpustate->int_state) {
+                       cpustate->irq_state = TRUE;
+               }
+       }
+}
+
+//#ifdef USE_DEBUGGER
+void MCS48_BASE::write_debug_data8(uint32_t addr, uint32_t data)
+{
+       d_mem_stored->write_data8(addr, data);
+}
+
+uint32_t MCS48_BASE::read_debug_data8(uint32_t addr)
+{
+       return d_mem_stored->read_data8(addr);
+}
+
+void MCS48_BASE::write_debug_io8(uint32_t addr, uint32_t data)
+{
+       d_io_stored->write_io8(addr, data);
+}
+
+uint32_t MCS48_BASE::read_debug_io8(uint32_t addr)
+{
+       return d_io_stored->read_io8(addr);
+}
+
+bool MCS48_BASE::write_debug_reg(const _TCHAR *reg, uint32_t data)
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       
+       if(_tcsicmp(reg, _T("R0")) == 0) {
+               __mcs48_reg_w(0, data);
+       } else if(_tcsicmp(reg, _T("R1")) == 0) {
+               __mcs48_reg_w(1, data);
+       } else if(_tcsicmp(reg, _T("R2")) == 0) {
+               __mcs48_reg_w(2, data);
+       } else if(_tcsicmp(reg, _T("R3")) == 0) {
+               __mcs48_reg_w(3, data);
+       } else if(_tcsicmp(reg, _T("R4")) == 0) {
+               __mcs48_reg_w(4, data);
+       } else if(_tcsicmp(reg, _T("R5")) == 0) {
+               __mcs48_reg_w(5, data);
+       } else if(_tcsicmp(reg, _T("R6")) == 0) {
+               __mcs48_reg_w(6, data);
+       } else if(_tcsicmp(reg, _T("R7")) == 0) {
+               __mcs48_reg_w(7, data);
+       } else {
+               return false;
+       }
+       return true;
+}
+
+void MCS48_BASE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
+{
+/*
+R0 = 00  R1 = 00  R2 = 00  R3 = 00 (R0)= 00 (R1)= 00 (SP-1)= 0000  PC = 0000
+R4 = 00  R5 = 00  R6 = 00  R7 = 00  AC = 00  SP = 00 [MB F1 C AC F0 BS]
+*/
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       UINT8 sp = 8 + 2 * (cpustate->psw & 7);
+       UINT8 prev_sp = 8 + 2 * ((cpustate->psw - 1) & 7);
+       
+       my_stprintf_s(buffer, buffer_len,
+       _T("R0 = %02X  R1 = %02X  R2 = %02X  R3 = %02X (R0)= %02X (R1)= %02X (SP-1)= %04X  PC = %04X\nR4 = %02X  R5 = %02X  R6 = %02X  R7 = %02X  AC = %02X  SP = %02X [%s %s %s %s %s %s]"),
+       __mcs48_reg_r(0), __mcs48_reg_r(1), __mcs48_reg_r(2), __mcs48_reg_r(3), d_mem_stored->read_data8(__mcs48_reg_r(0)), d_mem_stored->read_data8(__mcs48_reg_r(1)),
+       d_mem_stored->read_data8(prev_sp) | (d_mem_stored->read_data8(prev_sp + 1) << 8), cpustate->pc,
+                                 __mcs48_reg_r(4), __mcs48_reg_r(5), __mcs48_reg_r(6), __mcs48_reg_r(7), cpustate->a, sp,
+       (cpustate->a11 == 0x800) ? _T("MB") : _T("--"), (cpustate->sts & STS_F1) ? _T("F1") : _T("--"),
+       (cpustate->psw & C_FLAG) ? _T("C" ) : _T("-" ), (cpustate->psw & A_FLAG) ? _T("AC") : _T("--"),
+       (cpustate->psw & F_FLAG) ? _T("F0") : _T("--"), (cpustate->psw & B_FLAG) ? _T("BS") : _T("--"));
+}
+
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/***************************************************************************
+
+    mcs48dsm.c
+
+    Simple MCS-48/UPI-41 disassembler.
+    Written by Aaron Giles
+
+***************************************************************************/
+
+int MCS48_BASE::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
+{
+       mcs48_state *cpustate = (mcs48_state *)opaque;
+       uint32_t ptr = pc;
+       
+       #define upi41 false
+       
+       switch (__mcs48_program_r(ptr++))
+       {
+               case 0x00:      my_stprintf_s(buffer, buffer_len, _T("nop"));                                                                                                       break;
+               case 0x02:  if (!upi41) {
+                               my_stprintf_s(buffer, buffer_len, _T("out  bus,a"));
+                                       } else {
+                               my_stprintf_s(buffer, buffer_len, _T("out  dbb,a"));
+                                       }
+                                                                                       break;
+               case 0x03:      my_stprintf_s(buffer, buffer_len, _T("add  a,#$%02X"), __mcs48_program_r(ptr++));                                                                           break;
+               case 0x04:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | __mcs48_program_r(ptr++)));             break;
+               case 0x05:      my_stprintf_s(buffer, buffer_len, _T("en   i"));                                                                                                    break;
+               case 0x07:      my_stprintf_s(buffer, buffer_len, _T("dec  a"));                                                                                                    break;
+               case 0x08:  if (!upi41) {
+                               my_stprintf_s(buffer, buffer_len, _T("in   a,bus"));
+                                       } else {
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));
+                                       }
+                                                                                       break;
+               case 0x09:      my_stprintf_s(buffer, buffer_len, _T("in   a,p1"));                                                                                                 break;
+               case 0x0a:      my_stprintf_s(buffer, buffer_len, _T("in   a,p2"));                                                                                                 break;
+               case 0x0c:      my_stprintf_s(buffer, buffer_len, _T("movd a,p4"));                                                                                                 break;
+               case 0x0d:      my_stprintf_s(buffer, buffer_len, _T("movd a,p5"));                                                                                                 break;
+               case 0x0e:      my_stprintf_s(buffer, buffer_len, _T("movd a,p6"));                                                                                                 break;
+               case 0x0f:      my_stprintf_s(buffer, buffer_len, _T("movd a,p7"));                                                                                                 break;
+               case 0x10:      my_stprintf_s(buffer, buffer_len, _T("inc  @r0"));                                                                                                  break;
+               case 0x11:      my_stprintf_s(buffer, buffer_len, _T("inc  @r1"));                                                                                                  break;
+               case 0x12:      my_stprintf_s(buffer, buffer_len, _T("jb0  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x13:      my_stprintf_s(buffer, buffer_len, _T("addc a,#$%02X"), __mcs48_program_r(ptr++));                                                                           break;
+               case 0x14:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x000 | __mcs48_program_r(ptr++)));             break;
+               case 0x15:      my_stprintf_s(buffer, buffer_len, _T("dis  i"));                                                                                                    break;
+               case 0x16:      my_stprintf_s(buffer, buffer_len, _T("jtf  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x17:      my_stprintf_s(buffer, buffer_len, _T("inc  a"));                                                                                                    break;
+               case 0x18:      my_stprintf_s(buffer, buffer_len, _T("inc  r0"));                                                                                                   break;
+               case 0x19:      my_stprintf_s(buffer, buffer_len, _T("inc  r1"));                                                                                                   break;
+               case 0x1a:      my_stprintf_s(buffer, buffer_len, _T("inc  r2"));                                                                                                   break;
+               case 0x1b:      my_stprintf_s(buffer, buffer_len, _T("inc  r3"));                                                                                                   break;
+               case 0x1c:      my_stprintf_s(buffer, buffer_len, _T("inc  r4"));                                                                                                   break;
+               case 0x1d:      my_stprintf_s(buffer, buffer_len, _T("inc  r5"));                                                                                                   break;
+               case 0x1e:      my_stprintf_s(buffer, buffer_len, _T("inc  r6"));                                                                                                   break;
+               case 0x1f:      my_stprintf_s(buffer, buffer_len, _T("inc  r7"));                                                                                                   break;
+               case 0x20:      my_stprintf_s(buffer, buffer_len, _T("xch  a,@r0"));                                                                                                break;
+               case 0x21:      my_stprintf_s(buffer, buffer_len, _T("xch  a,@r1"));                                                                                                break;
+               case 0x22:  if (!upi41) {
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));
+                                       } else {
+                               my_stprintf_s(buffer, buffer_len, _T("in   a,dbb"));
+                                       }
+                                                                                       break;
+               case 0x23:      my_stprintf_s(buffer, buffer_len, _T("mov  a,#$%02X"), __mcs48_program_r(ptr++));                                                                           break;
+               case 0x24:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | __mcs48_program_r(ptr++)));             break;
+               case 0x25:      my_stprintf_s(buffer, buffer_len, _T("en   tcnti"));                                                                                                break;
+               case 0x26:      my_stprintf_s(buffer, buffer_len, _T("jnt0 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x27:      my_stprintf_s(buffer, buffer_len, _T("clr  a"));                                                                                                    break;
+               case 0x28:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r0"));                                                                                                 break;
+               case 0x29:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r1"));                                                                                                 break;
+               case 0x2a:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r2"));                                                                                                 break;
+               case 0x2b:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r3"));                                                                                                 break;
+               case 0x2c:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r4"));                                                                                                 break;
+               case 0x2d:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r5"));                                                                                                 break;
+               case 0x2e:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r6"));                                                                                                 break;
+               case 0x2f:      my_stprintf_s(buffer, buffer_len, _T("xch  a,r7"));                                                                                                 break;
+               case 0x30:      my_stprintf_s(buffer, buffer_len, _T("xchd a,@r0"));                                                                                                break;
+               case 0x31:      my_stprintf_s(buffer, buffer_len, _T("xchd a,@r1"));                                                                                                break;
+               case 0x32:      my_stprintf_s(buffer, buffer_len, _T("jb1  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x34:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x100 | __mcs48_program_r(ptr++)));             break;
+               case 0x35:      my_stprintf_s(buffer, buffer_len, _T("dis  tcnti"));                                                                                                break;
+               case 0x36:      my_stprintf_s(buffer, buffer_len, _T("jt0  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x37:      my_stprintf_s(buffer, buffer_len, _T("cpl  a"));                                                                                                    break;
+               case 0x39:      my_stprintf_s(buffer, buffer_len, _T("outl p1,a"));                                                                                                 break;
+               case 0x3a:      my_stprintf_s(buffer, buffer_len, _T("outl p2,a"));                                                                                                 break;
+               case 0x3c:      my_stprintf_s(buffer, buffer_len, _T("movd p4,a"));                                                                                                 break;
+               case 0x3d:      my_stprintf_s(buffer, buffer_len, _T("movd p5,a"));                                                                                                 break;
+               case 0x3e:      my_stprintf_s(buffer, buffer_len, _T("movd p6,a"));                                                                                                 break;
+               case 0x3f:      my_stprintf_s(buffer, buffer_len, _T("movd p7,a"));                                                                                                 break;
+               case 0x40:      my_stprintf_s(buffer, buffer_len, _T("orl  a,@r0"));                                                                                                break;
+               case 0x41:      my_stprintf_s(buffer, buffer_len, _T("orl  a,@r1"));                                                                                                break;
+               case 0x42:      my_stprintf_s(buffer, buffer_len, _T("mov  a,t"));                                                                                                  break;
+               case 0x43:      my_stprintf_s(buffer, buffer_len, _T("orl  a,#$%02X"), __mcs48_program_r(ptr++));                                                                           break;
+               case 0x44:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | __mcs48_program_r(ptr++)));             break;
+               case 0x45:      my_stprintf_s(buffer, buffer_len, _T("strt cnt"));                                                                                                  break;
+               case 0x46:      my_stprintf_s(buffer, buffer_len, _T("jnt1 %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x47:      my_stprintf_s(buffer, buffer_len, _T("swap a"));                                                                                                    break;
+               case 0x48:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r0"));                                                                                                 break;
+               case 0x49:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r1"));                                                                                                 break;
+               case 0x4a:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r2"));                                                                                                 break;
+               case 0x4b:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r3"));                                                                                                 break;
+               case 0x4c:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r4"));                                                                                                 break;
+               case 0x4d:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r5"));                                                                                                 break;
+               case 0x4e:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r6"));                                                                                                 break;
+               case 0x4f:      my_stprintf_s(buffer, buffer_len, _T("orl  a,r7"));                                                                                                 break;
+               case 0x50:      my_stprintf_s(buffer, buffer_len, _T("anl  a,@r0"));                                                                                                break;
+               case 0x51:      my_stprintf_s(buffer, buffer_len, _T("anl  a,@r1"));                                                                                                break;
+               case 0x52:      my_stprintf_s(buffer, buffer_len, _T("jb2  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x53:      my_stprintf_s(buffer, buffer_len, _T("anl  a,#$%02X"), __mcs48_program_r(ptr++));                                                                           break;
+               case 0x54:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x200 | __mcs48_program_r(ptr++)));             break;
+               case 0x55:      my_stprintf_s(buffer, buffer_len, _T("strt t"));                                                                                                    break;
+               case 0x56:      my_stprintf_s(buffer, buffer_len, _T("jt1  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x57:      my_stprintf_s(buffer, buffer_len, _T("da   a"));                                                                                                    break;
+               case 0x58:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r0"));                                                                                                 break;
+               case 0x59:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r1"));                                                                                                 break;
+               case 0x5a:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r2"));                                                                                                 break;
+               case 0x5b:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r3"));                                                                                                 break;
+               case 0x5c:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r4"));                                                                                                 break;
+               case 0x5d:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r5"));                                                                                                 break;
+               case 0x5e:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r6"));                                                                                                 break;
+               case 0x5f:      my_stprintf_s(buffer, buffer_len, _T("anl  a,r7"));                                                                                                 break;
+               case 0x60:      my_stprintf_s(buffer, buffer_len, _T("add  a,@r0"));                                                                                                break;
+               case 0x61:      my_stprintf_s(buffer, buffer_len, _T("add  a,@r1"));                                                                                                break;
+               case 0x62:      my_stprintf_s(buffer, buffer_len, _T("mov  t,a"));                                                                                                  break;
+               case 0x64:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | __mcs48_program_r(ptr++)));             break;
+               case 0x65:      my_stprintf_s(buffer, buffer_len, _T("stop tcnt"));                                                                                                 break;
+               case 0x67:      my_stprintf_s(buffer, buffer_len, _T("rrc  a"));                                                                                                    break;
+               case 0x68:      my_stprintf_s(buffer, buffer_len, _T("add  a,r0"));                                                                                                 break;
+               case 0x69:      my_stprintf_s(buffer, buffer_len, _T("add  a,r1"));                                                                                                 break;
+               case 0x6a:      my_stprintf_s(buffer, buffer_len, _T("add  a,r2"));                                                                                                 break;
+               case 0x6b:      my_stprintf_s(buffer, buffer_len, _T("add  a,r3"));                                                                                                 break;
+               case 0x6c:      my_stprintf_s(buffer, buffer_len, _T("add  a,r4"));                                                                                                 break;
+               case 0x6d:      my_stprintf_s(buffer, buffer_len, _T("add  a,r5"));                                                                                                 break;
+               case 0x6e:      my_stprintf_s(buffer, buffer_len, _T("add  a,r6"));                                                                                                 break;
+               case 0x6f:      my_stprintf_s(buffer, buffer_len, _T("add  a,r7"));                                                                                                 break;
+               case 0x70:      my_stprintf_s(buffer, buffer_len, _T("addc a,@r0"));                                                                                                break;
+               case 0x71:      my_stprintf_s(buffer, buffer_len, _T("addc a,@r1"));                                                                                                break;
+               case 0x72:      my_stprintf_s(buffer, buffer_len, _T("jb3  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x74:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x300 | __mcs48_program_r(ptr++)));             break;
+               case 0x75:  if (!upi41) {
+                               my_stprintf_s(buffer, buffer_len, _T("ent0 clk"));
+                                       } else {
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));
+                                       }
+                                                                                                       break;
+               case 0x76:      my_stprintf_s(buffer, buffer_len, _T("jf1  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x77:      my_stprintf_s(buffer, buffer_len, _T("rr   a"));                                                                                                    break;
+               case 0x78:      my_stprintf_s(buffer, buffer_len, _T("addc a,r0"));                                                                                                 break;
+               case 0x79:      my_stprintf_s(buffer, buffer_len, _T("addc a,r1"));                                                                                                 break;
+               case 0x7a:      my_stprintf_s(buffer, buffer_len, _T("addc a,r2"));                                                                                                 break;
+               case 0x7b:      my_stprintf_s(buffer, buffer_len, _T("addc a,r3"));                                                                                                 break;
+               case 0x7c:      my_stprintf_s(buffer, buffer_len, _T("addc a,r4"));                                                                                                 break;
+               case 0x7d:      my_stprintf_s(buffer, buffer_len, _T("addc a,r5"));                                                                                                 break;
+               case 0x7e:      my_stprintf_s(buffer, buffer_len, _T("addc a,r6"));                                                                                                 break;
+               case 0x7f:      my_stprintf_s(buffer, buffer_len, _T("addc a,r7"));                                                                                                 break;
+               case 0x80:  if (!upi41) {
+                               my_stprintf_s(buffer, buffer_len, _T("movx a,@r0"));
+                                       } else {
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));
+                                       }
+                                                                                       break;
+               case 0x81:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("movx a,@r1"));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
+               case 0x83:      my_stprintf_s(buffer, buffer_len, _T("ret"));                                                                                                       break;
+               case 0x84:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | __mcs48_program_r(ptr++)));             break;
+               case 0x85:      my_stprintf_s(buffer, buffer_len, _T("clr  f0"));                                                                                                   break;
+               case 0x86:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("jni  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("jobf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x88:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("orl  bus,#$%02X"), __mcs48_program_r(ptr++));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
+               case 0x89:      my_stprintf_s(buffer, buffer_len, _T("orl  p1,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0x8a:      my_stprintf_s(buffer, buffer_len, _T("orl  p2,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0x8c:      my_stprintf_s(buffer, buffer_len, _T("orld p4,a"));                                                                                                 break;
+               case 0x8d:      my_stprintf_s(buffer, buffer_len, _T("orld p5,a"));                                                                                                 break;
+               case 0x8e:      my_stprintf_s(buffer, buffer_len, _T("orld p6,a"));                                                                                                 break;
+               case 0x8f:      my_stprintf_s(buffer, buffer_len, _T("orld p7,a"));                                                                                                 break;
+               case 0x90:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("movx @r0,a"));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("mov  sts,a"));                                                                                                break;
+               case 0x91:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("movx @r1,a"));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
+               case 0x92:      my_stprintf_s(buffer, buffer_len, _T("jb4  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x93:      my_stprintf_s(buffer, buffer_len, _T("retr"));                                                                                                      break;
+               case 0x94:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x400 | __mcs48_program_r(ptr++)));             break;
+               case 0x95:      my_stprintf_s(buffer, buffer_len, _T("cpl  f0"));                                                                                                   break;
+               case 0x96:      my_stprintf_s(buffer, buffer_len, _T("jnz  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0x97:      my_stprintf_s(buffer, buffer_len, _T("clr  c"));                                                                                                    break;
+               case 0x98:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("anl  bus,#$%02X"), __mcs48_program_r(ptr++));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
+               case 0x99:      my_stprintf_s(buffer, buffer_len, _T("anl  p1,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0x9a:      my_stprintf_s(buffer, buffer_len, _T("anl  p2,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0x9c:      my_stprintf_s(buffer, buffer_len, _T("anld p4,a"));                                                                                                 break;
+               case 0x9d:      my_stprintf_s(buffer, buffer_len, _T("anld p5,a"));                                                                                                 break;
+               case 0x9e:      my_stprintf_s(buffer, buffer_len, _T("anld p6,a"));                                                                                                 break;
+               case 0x9f:      my_stprintf_s(buffer, buffer_len, _T("anld p7,a"));                                                                                                 break;
+               case 0xa0:      my_stprintf_s(buffer, buffer_len, _T("mov  @r0,a"));                                                                                                break;
+               case 0xa1:      my_stprintf_s(buffer, buffer_len, _T("mov  @r1,a"));                                                                                                break;
+               case 0xa3:      my_stprintf_s(buffer, buffer_len, _T("movp a,@a"));                                                                                                 break;
+               case 0xa4:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | __mcs48_program_r(ptr++)));             break;
+               case 0xa5:      my_stprintf_s(buffer, buffer_len, _T("clr  f1"));                                                                                                   break;
+               case 0xa7:      my_stprintf_s(buffer, buffer_len, _T("cpl  c"));                                                                                                    break;
+               case 0xa8:      my_stprintf_s(buffer, buffer_len, _T("mov  r0,a"));                                                                                                 break;
+               case 0xa9:      my_stprintf_s(buffer, buffer_len, _T("mov  r1,a"));                                                                                                 break;
+               case 0xaa:      my_stprintf_s(buffer, buffer_len, _T("mov  r2,a"));                                                                                                 break;
+               case 0xab:      my_stprintf_s(buffer, buffer_len, _T("mov  r3,a"));                                                                                                 break;
+               case 0xac:      my_stprintf_s(buffer, buffer_len, _T("mov  r4,a"));                                                                                                 break;
+               case 0xad:      my_stprintf_s(buffer, buffer_len, _T("mov  r5,a"));                                                                                                 break;
+               case 0xae:      my_stprintf_s(buffer, buffer_len, _T("mov  r6,a"));                                                                                                 break;
+               case 0xaf:      my_stprintf_s(buffer, buffer_len, _T("mov  r7,a"));                                                                                                 break;
+               case 0xb0:      my_stprintf_s(buffer, buffer_len, _T("mov  @r0,#$%02X"), __mcs48_program_r(ptr++));                                                                         break;
+               case 0xb1:      my_stprintf_s(buffer, buffer_len, _T("mov  @r1,#$%02X"), __mcs48_program_r(ptr++));                                                                         break;
+               case 0xb2:      my_stprintf_s(buffer, buffer_len, _T("jb5  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0xb3:      my_stprintf_s(buffer, buffer_len, _T("jmpp @a"));                                                                                                   break;
+               case 0xb4:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x500 | __mcs48_program_r(ptr++)));             break;
+               case 0xb5:      my_stprintf_s(buffer, buffer_len, _T("cpl  f1"));                                                                                                   break;
+               case 0xb6:      my_stprintf_s(buffer, buffer_len, _T("jf0  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0xb8:      my_stprintf_s(buffer, buffer_len, _T("mov  r0,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xb9:      my_stprintf_s(buffer, buffer_len, _T("mov  r1,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xba:      my_stprintf_s(buffer, buffer_len, _T("mov  r2,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xbb:      my_stprintf_s(buffer, buffer_len, _T("mov  r3,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xbc:      my_stprintf_s(buffer, buffer_len, _T("mov  r4,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xbd:      my_stprintf_s(buffer, buffer_len, _T("mov  r5,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xbe:      my_stprintf_s(buffer, buffer_len, _T("mov  r6,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xbf:      my_stprintf_s(buffer, buffer_len, _T("mov  r7,#$%02X"), __mcs48_program_r(ptr++));                                                                          break;
+               case 0xc4:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | __mcs48_program_r(ptr++)));             break;
+               case 0xc5:      my_stprintf_s(buffer, buffer_len, _T("sel  rb0"));                                                                                                  break;
+               case 0xc6:      my_stprintf_s(buffer, buffer_len, _T("jz   %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0xc7:      my_stprintf_s(buffer, buffer_len, _T("mov  a,psw"));                                                                                                break;
+               case 0xc8:      my_stprintf_s(buffer, buffer_len, _T("dec  r0"));                                                                                                   break;
+               case 0xc9:      my_stprintf_s(buffer, buffer_len, _T("dec  r1"));                                                                                                   break;
+               case 0xca:      my_stprintf_s(buffer, buffer_len, _T("dec  r2"));                                                                                                   break;
+               case 0xcb:      my_stprintf_s(buffer, buffer_len, _T("dec  r3"));                                                                                                   break;
+               case 0xcc:      my_stprintf_s(buffer, buffer_len, _T("dec  r4"));                                                                                                   break;
+               case 0xcd:      my_stprintf_s(buffer, buffer_len, _T("dec  r5"));                                                                                                   break;
+               case 0xce:      my_stprintf_s(buffer, buffer_len, _T("dec  r6"));                                                                                                   break;
+               case 0xcf:      my_stprintf_s(buffer, buffer_len, _T("dec  r7"));                                                                                                   break;
+               case 0xd0:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,@r0"));                                                                                                break;
+               case 0xd1:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,@r1"));                                                                                                break;
+               case 0xd2:      my_stprintf_s(buffer, buffer_len, _T("jb6  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0xd3:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,#$%02X"), __mcs48_program_r(ptr++));                                                                           break;
+               case 0xd4:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x600 | __mcs48_program_r(ptr++)));             break;
+               case 0xd5:      my_stprintf_s(buffer, buffer_len, _T("sel  rb1"));                                                                                                  break;
+               case 0xd6:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("illegal"));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("jnibf %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));     break;
+               case 0xd7:      my_stprintf_s(buffer, buffer_len, _T("mov  psw,a"));                                                                                                break;
+               case 0xd8:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r0"));                                                                                                 break;
+               case 0xd9:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r1"));                                                                                                 break;
+               case 0xda:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r2"));                                                                                                 break;
+               case 0xdb:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r3"));                                                                                                 break;
+               case 0xdc:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r4"));                                                                                                 break;
+               case 0xdd:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r5"));                                                                                                 break;
+               case 0xde:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r6"));                                                                                                 break;
+               case 0xdf:      my_stprintf_s(buffer, buffer_len, _T("xrl  a,r7"));                                                                                                 break;
+               case 0xe3:      my_stprintf_s(buffer, buffer_len, _T("movp3 a,@a"));                                                                                                break;
+               case 0xe4:      my_stprintf_s(buffer, buffer_len, _T("jmp  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | __mcs48_program_r(ptr++)));             break;
+               case 0xe5:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("sel  mb0"));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("en   dma"));                                                                                                  break;
+               case 0xe6:      my_stprintf_s(buffer, buffer_len, _T("jnc  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0xe7:      my_stprintf_s(buffer, buffer_len, _T("rl   a"));                                                                                                    break;
+               case 0xe8:      my_stprintf_s(buffer, buffer_len, _T("djnz r0,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xe9:      my_stprintf_s(buffer, buffer_len, _T("djnz r1,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xea:      my_stprintf_s(buffer, buffer_len, _T("djnz r2,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xeb:      my_stprintf_s(buffer, buffer_len, _T("djnz r3,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xec:      my_stprintf_s(buffer, buffer_len, _T("djnz r4,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xed:      my_stprintf_s(buffer, buffer_len, _T("djnz r5,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xee:      my_stprintf_s(buffer, buffer_len, _T("djnz r6,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xef:      my_stprintf_s(buffer, buffer_len, _T("djnz r7,%s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));   break;
+               case 0xf0:      my_stprintf_s(buffer, buffer_len, _T("mov  a,@r0"));                                                                                                break;
+               case 0xf1:      my_stprintf_s(buffer, buffer_len, _T("mov  a,@r1"));                                                                                                break;
+               case 0xf2:      my_stprintf_s(buffer, buffer_len, _T("jb7  %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0xf4:      my_stprintf_s(buffer, buffer_len, _T("call %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), 0x700 | __mcs48_program_r(ptr++)));             break;
+               case 0xf5:  if (!upi41)
+                               my_stprintf_s(buffer, buffer_len, _T("sel  mb1"));
+                           else
+                               my_stprintf_s(buffer, buffer_len, _T("en   flags"));                                                                                                break;
+               case 0xf6:      my_stprintf_s(buffer, buffer_len, _T("jc   %s"), get_value_or_symbol(d_debugger->first_symbol, _T("$%03X"), (pc & 0xf00) | __mcs48_program_r(ptr++)));      break;
+               case 0xf7:      my_stprintf_s(buffer, buffer_len, _T("rlc  a"));                                                                                                    break;
+               case 0xf8:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r0"));                                                                                                 break;
+               case 0xf9:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r1"));                                                                                                 break;
+               case 0xfa:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r2"));                                                                                                 break;
+               case 0xfb:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r3"));                                                                                                 break;
+               case 0xfc:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r4"));                                                                                                 break;
+               case 0xfd:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r5"));                                                                                                 break;
+               case 0xfe:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r6"));                                                                                                 break;
+               case 0xff:      my_stprintf_s(buffer, buffer_len, _T("mov  a,r7"));                                                                                                 break;
+               default:        my_stprintf_s(buffer, buffer_len, _T("illegal"));                                                                                                   break;
+
+       }
+       return ptr - pc;
+}
+//#endif
+#define STATE_VERSION  1
+
+void MCS48MEM::save_state(FILEIO* state_fio)
+{
+       state_fio->FputUint32(STATE_VERSION);
+       state_fio->FputInt32(this_device_id);
+       
+       state_fio->Fwrite(ram, sizeof(ram), 1);
+}
+
+bool MCS48MEM::load_state(FILEIO* state_fio)
+{
+       if(state_fio->FgetUint32() != STATE_VERSION) {
+               return false;
+       }
+       if(state_fio->FgetInt32() != this_device_id) {
+               return false;
+       }
+       state_fio->Fread(ram, sizeof(ram), 1);
+       return true;
+}
+
+
diff --git a/source/src/vm/mcs48_flags.h b/source/src/vm/mcs48_flags.h
new file mode 100644 (file)
index 0000000..646fa88
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+       Skelton for retropc emulator
+
+       Origin : MAME 0.148
+       Author : Takeda.Toshiya
+       Date   : 2013.05.01-
+
+       [ MCS48 ]
+*/
+
+#ifndef __MCS48_FLAGS_H_
+#define __MCS48_FLAGS_H_
+
+/***************************************************************************
+    CONSTANTS
+***************************************************************************/
+
+/* flag bits */
+#define C_FLAG          0x80
+#define A_FLAG          0x40
+#define F_FLAG          0x20
+#define B_FLAG          0x10
+
+/* status bits (UPI-41) */
+#define STS_F1          0x08
+#define STS_F0          0x04
+
+/* 8243 expander operations */
+enum
+{
+       MCS48_EXPANDER_OP_READ = 0,
+       MCS48_EXPANDER_OP_WRITE = 1,
+       MCS48_EXPANDER_OP_OR = 2,
+       MCS48_EXPANDER_OP_AND = 3
+};
+
+#endif
index e8f1e03..da040b7 100644 (file)
@@ -9,9 +9,9 @@
 */
 
 #include "upd7801.h"
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
 #include "debugger.h"
-#endif
+//#endif
 
 #define PRESCALER      16
 
@@ -290,119 +290,151 @@ static const op_t op74[256] = {
 
 inline uint8_t UPD7801::RM8(uint16_t addr)
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       uint8_t val = d_mem->read_data8w(addr, &wait);
-       period += wait;
-       return val;
-#else
-       return d_mem->read_data8(addr);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               uint8_t val = d_mem->read_data8w(addr, &wait);
+               period += wait;
+               return val;
+       } else {
+//#else
+               return d_mem->read_data8(addr);
+       }
+//#endif
 }
 
 inline void UPD7801::WM8(uint16_t addr, uint8_t val)
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       d_mem->write_data8w(addr, val, &wait);
-       period += wait;
-#else
-       d_mem->write_data8(addr, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               d_mem->write_data8w(addr, val, &wait);
+               period += wait;
+       } else {
+//#else
+               d_mem->write_data8(addr, val);
+       }
+//#endif
 }
 
 inline uint16_t UPD7801::RM16(uint16_t addr)
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       uint16_t val = d_mem->read_data16w(addr, &wait);
-       period += wait;
-       return val;
-#else
-       return d_mem->read_data16(addr);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               uint16_t val = d_mem->read_data16w(addr, &wait);
+               period += wait;
+               return val;
+       } else {
+//#else
+               return d_mem->read_data16(addr);
+       }
+//#endif
 }
 
 inline void UPD7801::WM16(uint16_t addr, uint16_t val)
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       d_mem->write_data16w(addr, val, &wait);
-       period += wait;
-#else
-       d_mem->write_data16(addr, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               d_mem->write_data16w(addr, val, &wait);
+               period += wait;
+       } else {
+//#else
+               d_mem->write_data16(addr, val);
+       }
+//#endif
 }
 
 inline uint8_t UPD7801::FETCH8()
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       uint8_t val = d_mem->read_data8w(PC++, &wait);
-       period += wait;
-       return val;
-#else
-       return d_mem->read_data8(PC++);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               uint8_t val = d_mem->read_data8w(PC++, &wait);
+               period += wait;
+               return val;
+       } else {
+//#else
+               return d_mem->read_data8(PC++);
+       }
+//#endif
 }
 
 inline uint16_t UPD7801::FETCH16()
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       uint16_t val = d_mem->read_data16w(PC, &wait);
-       period += wait;
-#else
-       uint16_t val = d_mem->read_data16(PC);
-#endif
+       uint16_t val;
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               val = d_mem->read_data16w(PC, &wait);
+               period += wait;
+       } else {
+//#else
+               val = d_mem->read_data16(PC);
+       }
+//#endif
        PC += 2;
        return val;
 }
 
 inline uint16_t UPD7801::FETCHWA()
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       uint16_t val = (_V << 8) | d_mem->read_data8w(PC++, &wait);
-       period += wait;
-       return val;
-#else
-       return (_V << 8) | d_mem->read_data8(PC++);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               uint16_t val = (_V << 8) | d_mem->read_data8w(PC++, &wait);
+               period += wait;
+               return val;
+       } else {
+//#else
+               return (_V << 8) | d_mem->read_data8(PC++);
+       }
+//#endif
 }
 
 inline uint8_t UPD7801::POP8()
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       uint8_t val = d_mem->read_data8w(SP++, &wait);
-       period += wait;
-       return val;
-#else
-       return d_mem->read_data8(SP++);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               uint8_t val = d_mem->read_data8w(SP++, &wait);
+               period += wait;
+               return val;
+       } else {
+//#else
+               return d_mem->read_data8(SP++);
+       }
+//#endif
 }
 
 inline void UPD7801::PUSH8(uint8_t val)
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       d_mem->write_data8w(--SP, val, &wait);
-       period += wait;
-#else
-       d_mem->write_data8(--SP, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               d_mem->write_data8w(--SP, val, &wait);
+               period += wait;
+       } else {
+//#else
+               d_mem->write_data8(--SP, val);
+       }
+//#endif
 }
 
 inline uint16_t UPD7801::POP16()
 {
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       uint16_t val = d_mem->read_data16w(SP, &wait);
-       period += wait;
-#else
-       uint16_t val = d_mem->read_data16(SP);
-#endif
+       uint16_t val;
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               val = d_mem->read_data16w(SP, &wait);
+               period += wait;
+       } else {
+//#else
+               val = d_mem->read_data16(SP);
+       }
+//#endif
        SP += 2;
        return val;
 }
@@ -410,13 +442,16 @@ inline uint16_t UPD7801::POP16()
 inline void UPD7801::PUSH16(uint16_t val)
 {
        SP -= 2;
-#ifdef UPD7801_MEMORY_WAIT
-       int wait;
-       d_mem->write_data16w(SP, val, &wait);
-       period += wait;
-#else
-       d_mem->write_data16(SP, val);
-#endif
+//#ifdef UPD7801_MEMORY_WAIT
+       if(__UPD7801_MEMORY_WAIT) {
+               int wait;
+               d_mem->write_data16w(SP, val, &wait);
+               period += wait;
+       } else {
+//#else
+               d_mem->write_data16(SP, val);
+       }
+//#endif
 }
 
 // io
@@ -1083,12 +1118,17 @@ inline void UPD7801::UPDATE_PORTC(uint8_t IOM)
 void UPD7801::initialize()
 {
        DEVICE::initialize();
-#ifdef USE_DEBUGGER
-       d_mem_stored = d_mem;
-       d_io_stored = d_io;
-       d_debugger->set_context_mem(d_mem);
-       d_debugger->set_context_io(d_io);
-#endif
+       __UPD7801_MEMORY_WAIT = osd->check_feature(_T("UPD7801_MEMORY_WAIT"));
+       __USE_DEBUGGER = osd->check_feature(_T("USE_DEBUGGER"));
+
+//#ifdef USE_DEBUGGER
+       if((__USE_DEBUGGER) && (d_debugger != NULL)) {
+               d_mem_stored = d_mem;
+               d_io_stored = d_io;
+               d_debugger->set_context_mem(d_mem);
+               d_debugger->set_context_io(d_io);
+       }
+//#endif
 }
 
 void UPD7801::reset()
@@ -1112,11 +1152,14 @@ int UPD7801::run(int clock)
        if(clock == -1) {
                // run only one opcode
                count = 0;
-#ifdef USE_DEBUGGER
-               run_one_opecode_debugger();
-#else
-               run_one_opecode();
-#endif
+//#ifdef USE_DEBUGGER
+               if(__USE_DEBUGGER) {
+                       run_one_opecode_debugger();
+               } else {
+//#else
+                       run_one_opecode();
+               }
+//#endif
                return -count;
        } else {
                // run cpu while given clocks
@@ -1124,11 +1167,14 @@ int UPD7801::run(int clock)
                int first_count = count;
                
                while(count > 0) {
-#ifdef USE_DEBUGGER
-                       run_one_opecode_debugger();
-#else
-                       run_one_opecode();
-#endif
+//#ifdef USE_DEBUGGER
+                       if(__USE_DEBUGGER) {
+                               run_one_opecode_debugger();
+                       } else { 
+//#else
+                               run_one_opecode();
+                       }
+//#endif
                }
                return first_count - count;
        }
@@ -1216,9 +1262,10 @@ void UPD7801::run_one_opecode()
        }
 }
 
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
 void UPD7801::run_one_opecode_debugger()
 {
+       if(d_debugger == NULL) return;
        bool now_debugging = d_debugger->now_debugging;
        if(now_debugging) {
                d_debugger->check_break_points(PC);
@@ -1369,6 +1416,7 @@ uint8_t getwa()
 
 int UPD7801::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
 {
+       if(d_debugger == NULL) return 0;
        for(int i = 0; i < 4; i++) {
                int wait;
                upd7801_dasm_ops[i] = d_mem_stored->read_data8w(pc + i, &wait);
@@ -2176,7 +2224,7 @@ int UPD7801::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
        }
        return upd7801_dasm_ptr;
 }
-#endif
+//#endif
 
 void UPD7801::write_signal(int id, uint32_t data, uint32_t mask)
 {
index 8da2c37..569318e 100644 (file)
@@ -11,8 +11,8 @@
 #ifndef _UPD7801_H_
 #define _UPD7801_H_
 
-#include "vm.h"
-#include "../emu.h"
+//#include "vm.h"
+//#include "../emu.h"
 #include "device.h"
 
 #define SIG_UPD7801_INTF0      0
@@ -27,9 +27,9 @@
 #define P_B    1
 #define P_C    2
 
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
 class DEBUGGER;
-#endif
+//#endif
 
 class UPD7801 : public DEVICE
 {
@@ -40,10 +40,10 @@ private:
        
        outputs_t outputs_so;
        DEVICE *d_mem, *d_io;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
        DEBUGGER *d_debugger;
        DEVICE *d_mem_stored, *d_io_stored;
-#endif
+//#endif
        
        /* ---------------------------------------------------------------------------
        registers
@@ -82,15 +82,18 @@ private:
        inline uint8_t IN8(int port);
        inline void OUT8(int port, uint8_t val);
        inline void UPDATE_PORTC(uint8_t IOM);
+
+       bool __USE_DEBUGGER;
+       bool __UPD7801_MEMORY_WAIT;
        
        /* ---------------------------------------------------------------------------
        opecode
        --------------------------------------------------------------------------- */
        
        void run_one_opecode();
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
        void run_one_opecode_debugger();
-#endif
+//#endif
        void OP();
        void OP48();
        void OP4C();
@@ -105,6 +108,9 @@ public:
        {
                initialize_output_signals(&outputs_so);
                SI = SCK = false;
+               d_debugger = NULL;
+               d_mem_stored = d_io_stored = NULL;
+               __USE_DEBUGGER = __UPD7801_MEMORY_WAIT = false;
                set_device_name(_T("uPD7801 CPU"));
        }
        ~UPD7801() {}
@@ -122,7 +128,7 @@ public:
        {
                return PC;
        }
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
        void *get_debugger()
        {
                return d_debugger;
@@ -142,7 +148,7 @@ public:
        bool write_debug_reg(const _TCHAR *reg, uint32_t data);
        void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
        int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
-#endif
+//#endif
        void save_state(FILEIO* state_fio);
        bool load_state(FILEIO* state_fio);
        
@@ -155,12 +161,12 @@ public:
        {
                d_io = device;
        }
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
        void set_context_debugger(DEBUGGER* device)
        {
                d_debugger = device;
        }
-#endif
+//#endif
        void set_context_so(DEVICE* device, int id, uint32_t mask)
        {
                register_output_signal(&outputs_so, device, id, mask);