Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. #ifndef _Z80_DEFS_H_INCLUDED
  2. #define _Z80_DEFS_H_INCLUDED
  3.  
  4. #include <stddef.h>
  5. #include <stdint.h>
  6. #include "../sysdefs.h"
  7. struct Z80;
  8.  
  9. #define Z80FAST fastcall
  10.  
  11. #ifdef _MSC_VER
  12. #define Z80INLINE forceinline // time-critical inlines
  13. #else
  14. #define Z80INLINE inline
  15. #endif
  16.  
  17. typedef void (Z80FAST *STEPFUNC)(Z80*);
  18. #define Z80OPCODE void Z80FAST
  19. typedef unsigned char (Z80FAST *LOGICFUNC)(Z80*, unsigned char byte);
  20. #define Z80LOGIC unsigned char Z80FAST
  21.  
  22.  
  23. //=============================================================================
  24. struct TZ80State
  25. {
  26.     unsigned t; // ╥хъє∙шщ ЄръЄ яЁюЎхёёюЁр тэєЄЁш spectrum ърфЁр [0..conf.frame)
  27.     /*------------------------------*/
  28.     union
  29.     {
  30.         unsigned pc;
  31.         struct
  32.         {
  33.             unsigned char pcl;
  34.             unsigned char pch;
  35.         };
  36.     };
  37.     union
  38.     {
  39.         unsigned sp;
  40.         struct
  41.         {
  42.             unsigned char spl;
  43.             unsigned char sph;
  44.         };
  45.     };
  46.     union
  47.     {
  48.         unsigned ir_;
  49.         struct
  50.         {
  51.             unsigned char r_low;
  52.             unsigned char i;
  53.         };
  54.     };
  55.     union
  56.     {
  57.         unsigned int_flags;
  58.         struct
  59.         {
  60.             unsigned char r_hi;
  61.             unsigned char iff1;         // int = 1 -> EI
  62.                                         // int = 0 -> DI
  63.             unsigned char iff2;         // ёюёЄю эшх int эр ьюьхэЄ NMI
  64.             unsigned char halted;
  65.         };
  66.     };
  67.     /*------------------------------*/
  68.     union
  69.     {
  70.         unsigned bc;                    //¤Єю °ю чр ьєЄ№ ??????!!!!!
  71.         unsigned short bc16;            //юэю ёё√ырхЄёю эр юфэю ш Єюцх? [NS]
  72.         struct
  73.         {
  74.             unsigned char c;
  75.             unsigned char b;
  76.             u8 trash;
  77.         };
  78.     };
  79.     union
  80.     {
  81.         unsigned de;
  82.         struct
  83.         {
  84.             unsigned char e;
  85.             unsigned char d;
  86.         };
  87.     };
  88.     union
  89.     {
  90.         unsigned hl;
  91.         struct
  92.         {
  93.             unsigned char l;
  94.             unsigned char h;
  95.         };
  96.     };
  97.     union
  98.     {
  99.         unsigned af;
  100.         struct
  101.         {
  102.             unsigned char f;
  103.             unsigned char a;
  104.         };
  105.     };
  106.     /*------------------------------*/
  107.     union
  108.     {
  109.         unsigned ix;
  110.         struct
  111.         {
  112.             unsigned char xl;
  113.             unsigned char xh;
  114.         };
  115.     };
  116.     union
  117.     {
  118.         unsigned iy;
  119.         struct
  120.         {
  121.             unsigned char yl;
  122.             unsigned char yh;
  123.         };
  124.     };
  125.     /*------------------------------*/
  126.     struct      //ALT
  127.     {
  128.         union
  129.         {
  130.             unsigned bc;                //alt.bc
  131.             struct
  132.             {
  133.                 unsigned char c;        //alt.c
  134.                 unsigned char b;        //alt.b
  135.             };
  136.         };
  137.         union
  138.         {
  139.             unsigned de;                //alt.de
  140.             struct
  141.             {
  142.                 unsigned char e;        //alt.e
  143.                 unsigned char d;        //alt.d
  144.             };
  145.         };
  146.         union
  147.         {
  148.             unsigned hl;                //alt.hl
  149.             struct
  150.             {
  151.                 unsigned char l;        //alt.l
  152.                 unsigned char h;        //alt.h
  153.             };
  154.         };
  155.         union
  156.         {
  157.             unsigned af;                //alt.af
  158.             struct
  159.             {
  160.                 unsigned char f;        //alt.f
  161.                 unsigned char a;        //alt.a
  162.             };
  163.         };
  164.     } alt;
  165.     union
  166.     {
  167.         unsigned memptr; // undocumented register
  168.         struct
  169.         {
  170.             unsigned char meml;
  171.             unsigned char memh;
  172.         };
  173.     };
  174.     unsigned eipos, haltpos;
  175.     /*------------------------------*/
  176.     unsigned char im;
  177.     unsigned char nmi_in_progress;      //NEDOREPO
  178. //  bool nmi_in_progress;               //0.39.0
  179. };
  180. //=============================================================================
  181.  
  182.  
  183. //=============================================================================
  184. typedef u8 (__fastcall * TXm)(u32 addr);
  185. typedef u8 (__fastcall * TRm)(u32 addr);
  186. typedef void (__fastcall * TWm)(u32 addr, u8 val);
  187. //=============================================================================
  188.  
  189.  
  190. //=============================================================================
  191. struct TMemIf
  192. {
  193.     TXm xm;
  194.     TRm rm;
  195.     TWm wm;
  196. };
  197. //=============================================================================
  198.  
  199.  
  200. //=============================================================================
  201. struct Z80 : public TZ80State
  202. {
  203.     unsigned char tmp0, tmp1, tmp3;
  204.     unsigned short last_branch;
  205.     //-------------------------------------------------------------------------
  206.     // Trace Window
  207.     unsigned    trace_curs;             // рфЁхё ъєЁёюЁр
  208.     unsigned    trace_top;              // рфЁхё ёрьющ тхЁїэхщ ёЄЁюъш
  209.     int         graph_trace_cursor_pos; // ўшёЄю уЁрЇшўхёъюх яюыюцхэшх ъєЁёюЁр [NS]
  210.     unsigned    trace_mode;             // 0 - addr
  211.                                         // 1 - dump/labels
  212.                                         // 2 - disasm
  213.     //-------------------------------------------------------------------------
  214.     // Memory Viewer
  215.     unsigned mem_curs;                  // рфЁхё ъєЁёюЁр
  216.     unsigned mem_top;                   // рфЁхё эрўрыр ёрьющ тхЁїэхщ тшфшьющ ёЄЁюъш
  217.     unsigned mem_second;                // Ёхцшь ЁхфръЄшЁютрэш  тЄюЁюую эшсыр
  218.     unsigned mem_addr_edit_mode;        // Ёхцшь ЁхфръЄшЁютрэш  рфЁхёр [NS]
  219.     //-------------------------------------------------------------------------
  220.     unsigned pc_trflags;
  221.     unsigned nextpc;
  222.     //-------------------------------------------------------------------------
  223.     unsigned dbg_stophere;
  224.     unsigned dbg_stopsp;
  225.     unsigned dbg_loop_r1;
  226.     unsigned dbg_loop_r2;
  227.     unsigned char dbgchk;       // ╧Ёшчэръ эрышўш  ръЄштэ√ї сЁхъяюшэЄют
  228.     bool int_pend;              // ═р тїюфх int хёЄ№ ръЄштэюх яЁхЁ√трэшх
  229.     bool int_gate;              // ╨рчЁх°хэшх тэх°эшї яЁхЁ√трэшщ
  230.                                 //     1 - ЁрчЁх°хэ√
  231.                                 //     0 - чряЁх∙хэ√
  232.     //-------------------------------------------------------------------------
  233.     #define MAX_CBP 16
  234.     uintptr_t cbp[MAX_CBP][128];        // ╙ёыютш  фы  єёыютэ√ї сЁхъяюшэЄют
  235.     unsigned cbpn;
  236.  
  237.     i64 debug_last_t;                   // used to find time delta
  238.     u32 tpi;                            // ╫шёыю ЄръЄют ьхцфє яЁхЁ√трэш ьш
  239.     u32 trpc[40];
  240.    
  241. //  typedef u8 (__fastcall * TRmDbg)(u32 addr);
  242. //  typedef u8 *(__fastcall * TMemDbg)(u32 addr);
  243. //  typedef void (__fastcall * TWmDbg)(u32 addr, u8 val);
  244.  
  245.     typedef void (__cdecl *TBankNames)(int i, char *Name);
  246.     typedef void (Z80FAST * TStep)();
  247.     typedef i64 (__cdecl * TDelta)();
  248.     typedef void (__cdecl * TSetLastT)();
  249.    
  250. //  TRmDbg DirectRm;            // direct read memory in debuger
  251. //  TWmDbg DirectWm;            // direct write memory in debuger
  252. //  TMemDbg DirectMem;          // get direct memory pointer in debuger
  253.  
  254.     u32 Idx;                    // ╚эфхъё т ьрёёштх яЁюЎхёёюЁют
  255.     TBankNames BankNames;
  256.     TStep Step;
  257.     TDelta Delta;
  258.     TSetLastT SetLastT;
  259.       u8 *membits;
  260.       u8 *io_bits;              // [NS]
  261.       u8 *bp_disable_bits;      // [NS]
  262.     u8 dbgbreak;
  263.     const TMemIf *FastMemIf;    // ┴√ёЄЁ√щ шэЄхЁЇхё ярь Єш
  264.     const TMemIf *DbgMemIf;     // ╚эЄхЁЇхщё ярь Єш фы  яюффхЁцъш юЄырфўшър (сЁхъяюшэЄ√ эр фюёЄєя ъ ярь Єш)
  265.     const TMemIf *MemIf;        // ╥хъє∙шщ ръЄштэ√щ шэЄхЁЇхщё ярь Єш
  266.  
  267.     //-------------------------------------------------------------------------
  268.     void reset()
  269.     {
  270.         int_flags = 0;
  271.         ir_ = 0;
  272.         pc = 0;
  273.         im = 0;
  274.         last_branch = 0;
  275.         int_pend = false;
  276.         int_gate = true;
  277.     }
  278.     //-------------------------------------------------------------------------
  279.    
  280.     //-------------------------------------------------------------------------
  281.     // ?????????? ўю ¤Єр чр ъюэёЄЁєъЎш ???? ю_╬
  282.     Z80(        u32 Idx,
  283.                 TBankNames BankNames,
  284.                 TStep Step,
  285.                 TDelta Delta,
  286.                 TSetLastT SetLastT,
  287.                   u8 *membits,
  288.                   u8 *io_bits,          // [NS]
  289.                   u8 *bp_disable_bits,  // [NS]
  290.                 const TMemIf *FastMemIf,
  291.                 const TMemIf *DbgMemIf) :
  292.        Idx( Idx),
  293.        BankNames( BankNames),
  294.        Step( Step),
  295.        Delta( Delta),
  296.        SetLastT( SetLastT),
  297.          membits( membits),
  298.          io_bits( io_bits),                     // [NS]
  299.          bp_disable_bits( bp_disable_bits),     // [NS]
  300.        FastMemIf(FastMemIf),
  301.        DbgMemIf(DbgMemIf)
  302.     {
  303.         MemIf = FastMemIf;
  304.         tpi = 0;
  305.         dbgbreak = 0;
  306.         dbgchk = 0;
  307.         debug_last_t = 0;
  308.         trace_curs = trace_top = (unsigned)-1; trace_mode = 0;
  309.         mem_curs = mem_top = 0;
  310.         pc_trflags = nextpc = 0;
  311.         dbg_stophere = dbg_stopsp = (unsigned)-1;
  312.         dbg_loop_r1 = 0;
  313.         dbg_loop_r2 = 0xFFFF;
  314.         int_pend = false;
  315.         int_gate = true;
  316.         nmi_in_progress = false;
  317.     }
  318.     //-------------------------------------------------------------------------
  319.    
  320.     virtual ~Z80() { }
  321.    
  322.    //-------------------------------------------------------------------------
  323.     u32 GetIdx() const { return Idx; }
  324.    
  325.     //єёЄрэютър ўшёыр ЄръЄют т ЇЁхщьх
  326.     void SetTpi(u32 Tpi) { tpi = Tpi; }
  327.  
  328.     void SetFastMemIf() { MemIf = FastMemIf; }
  329.     void SetDbgMemIf()  { MemIf = DbgMemIf; }
  330.  
  331.     u8 DirectRm(unsigned addr) const { return *DirectMem(addr); }       // direct read memory in debuger
  332.     void DirectWm(unsigned addr, u8 val) { *DirectMem(addr) = val; }    // direct write memory in debuger
  333.    
  334. /*
  335.     virtual unsigned char rm(unsigned addr) = 0;
  336.     virtual void wm(unsigned addr, unsigned char val) = 0;
  337. */
  338.     virtual u8 *DirectMem(unsigned addr) const = 0;     // get direct memory pointer in debuger
  339.  
  340.     virtual unsigned char in(unsigned port) = 0;
  341.     virtual void out(unsigned port, unsigned char val) = 0;
  342.     virtual unsigned char m1_cycle() = 0;       // [vv] ═х чртшёшЄ юЄ яЁюЎхёёюЁр (т√эхёЄш т сшсышюЄхъє)
  343.     virtual u8 IntVec() = 0;                    // ╘єэъЎш  тючтЁр∙р■∙р  чэрўхэшх тхъЄюЁр яЁхЁ√трэш  фы  im2
  344.     virtual void CheckNextFrame() = 0;          // ╧ЁютхЁър ш юсэютыхэш  ёўхЄўшър ърфЁют ш ЄръЄют тэєЄЁш яЁхЁ√трэш 
  345.     virtual void retn() = 0;                    // ┬√ч√трхЄё  т ъюэЎх шэёЄЁєъЎшш retn (фюыцэр ёсЁрё√трЄ№ Їыру nmi_in_progress ш юсэюты Є№ Ёрёъырфъє ярь Єш)
  346. };
  347. //=============================================================================
  348.  
  349.  
  350. //=============================================================================
  351. #define CF 0x01
  352. #define NF 0x02
  353. #define PV 0x04
  354. #define F3 0x08
  355. #define HF 0x10
  356. #define F5 0x20
  357. #define ZF 0x40
  358. #define SF 0x80
  359. //=============================================================================
  360.  
  361. #endif // _Z80_DEFS_H_INCLUDED
  362.