Subversion Repositories pentevo

Rev

Rev 796 | Blame | Compare with Previous | 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. struct TZ80State
  23. {
  24.     unsigned t; // ╥хъє∙шщ ЄръЄ яЁюЎхёёюЁр тэєЄЁш spectrum ърфЁр [0..conf.frame)
  25.     /*------------------------------*/
  26.     union
  27.     {
  28.         unsigned pc;
  29.         struct
  30.         {
  31.             unsigned char pcl;
  32.             unsigned char pch;
  33.         };
  34.     };
  35.     union
  36.     {
  37.         unsigned sp;
  38.         struct
  39.         {
  40.             unsigned char spl;
  41.             unsigned char sph;
  42.         };
  43.     };
  44.     union
  45.     {
  46.         unsigned ir_;
  47.         struct
  48.         {
  49.             unsigned char r_low;
  50.             unsigned char i;
  51.         };
  52.     };
  53.     union
  54.     {
  55.         unsigned int_flags;
  56.         struct
  57.         {
  58.             unsigned char r_hi;
  59.             unsigned char iff1;
  60.             unsigned char iff2;
  61.             unsigned char halted;
  62.         };
  63.     };
  64.     /*------------------------------*/
  65.     union
  66.     {
  67.         unsigned bc;
  68.         unsigned short bc16;
  69.         struct
  70.         {
  71.             unsigned char c;
  72.             unsigned char b;
  73.             u8 trash;
  74.         };
  75.     };
  76.     union
  77.     {
  78.         unsigned de;
  79.         struct
  80.         {
  81.             unsigned char e;
  82.             unsigned char d;
  83.         };
  84.     };
  85.     union
  86.     {
  87.         unsigned hl;
  88.         struct
  89.         {
  90.             unsigned char l;
  91.             unsigned char h;
  92.         };
  93.     };
  94.     union
  95.     {
  96.         unsigned af;
  97.         struct
  98.         {
  99.             unsigned char f;
  100.             unsigned char a;
  101.         };
  102.     };
  103.     /*------------------------------*/
  104.     union
  105.     {
  106.         unsigned ix;
  107.         struct
  108.         {
  109.             unsigned char xl;
  110.             unsigned char xh;
  111.         };
  112.     };
  113.     union
  114.     {
  115.         unsigned iy;
  116.         struct
  117.         {
  118.             unsigned char yl;
  119.             unsigned char yh;
  120.         };
  121.     };
  122.     /*------------------------------*/
  123.     struct
  124.     {
  125.         union
  126.         {
  127.             unsigned bc;
  128.             struct
  129.             {
  130.                 unsigned char c;
  131.                 unsigned char b;
  132.             };
  133.         };
  134.         union
  135.         {
  136.             unsigned de;
  137.             struct
  138.             {
  139.                 unsigned char e;
  140.                 unsigned char d;
  141.             };
  142.         };
  143.         union
  144.         {
  145.             unsigned hl;
  146.             struct
  147.             {
  148.                 unsigned char l;
  149.                 unsigned char h;
  150.             };
  151.         };
  152.         union
  153.         {
  154.             unsigned af;
  155.             struct
  156.             {
  157.                 unsigned char f;
  158.                 unsigned char a;
  159.             };
  160.         };
  161.     } alt;
  162.     union
  163.     {
  164.         unsigned memptr; // undocumented register
  165.         struct
  166.         {
  167.             unsigned char meml;
  168.             unsigned char memh;
  169.         };
  170.     };
  171.     unsigned eipos, haltpos;
  172.     /*------------------------------*/
  173.     unsigned char im;
  174.     bool nmi_in_progress;
  175. };
  176.  
  177. typedef u8 (__fastcall * TXm)(u32 addr);
  178. typedef u8 (__fastcall * TRm)(u32 addr);
  179. typedef void (__fastcall * TWm)(u32 addr, u8 val);
  180.  
  181. struct TMemIf
  182. {
  183.     TXm xm;
  184.     TRm rm;
  185.     TWm wm;
  186. };
  187.  
  188.  
  189. struct Z80 : public TZ80State
  190. {
  191.    unsigned char tmp0, tmp1, tmp3;
  192.    unsigned short last_branch;
  193.    unsigned trace_curs, trace_top, trace_mode;
  194.    unsigned mem_curs, mem_top, mem_second;
  195.    unsigned pc_trflags;
  196.    unsigned nextpc;
  197.    unsigned dbg_stophere;
  198.    unsigned dbg_stopsp;
  199.    unsigned dbg_loop_r1;
  200.    unsigned dbg_loop_r2;
  201.    unsigned char dbgchk; // ╧Ёшчэръ эрышўш  ръЄштэ√ї сЁхъяюшэЄют
  202.    bool int_pend; // ═р тїюфх int хёЄ№ ръЄштэюх яЁхЁ√трэшх
  203.    bool int_gate; // ╨рчЁх°хэшх тэх°эшї яЁхЁ√трэшщ (1-ЁрчЁх°хэ√/0 - чряЁх∙хэ√)
  204.  
  205.    #define MAX_CBP 16
  206.    uintptr_t cbp[MAX_CBP][128]; // ╙ёыютш  фы  єёыютэ√ї сЁхъяюшэЄют
  207.    unsigned cbpn;
  208.  
  209.    i64 debug_last_t; // used to find time delta
  210.    u32 tpi; // ╫шёыю ЄръЄют ьхцфє яЁхЁ√трэш ьш
  211.    u32 trpc[40];
  212. //   typedef u8 (__fastcall * TRmDbg)(u32 addr);
  213. //   typedef u8 *(__fastcall * TMemDbg)(u32 addr);
  214. //   typedef void (__fastcall * TWmDbg)(u32 addr, u8 val);
  215.    typedef void (__cdecl *TBankNames)(int i, char *Name);
  216.    typedef void (Z80FAST * TStep)();
  217.    typedef i64 (__cdecl * TDelta)();
  218.    typedef void (__cdecl * TSetLastT)();
  219. //   TRmDbg DirectRm; // direct read memory in debuger
  220. //   TWmDbg DirectWm; // direct write memory in debuger
  221. //   TMemDbg DirectMem; // get direct memory pointer in debuger
  222.    u32 Idx; // ╚эфхъё т ьрёёштх яЁюЎхёёюЁют
  223.    TBankNames BankNames;
  224.    TStep Step;
  225.    TDelta Delta;
  226.    TSetLastT SetLastT;
  227.    u8 *membits;
  228.    u8 dbgbreak;
  229.    const TMemIf *FastMemIf; // ┴√ёЄЁ√щ шэЄхЁЇхё ярь Єш
  230.    const TMemIf *DbgMemIf; // ╚эЄхЁЇхщё ярь Єш фы  яюффхЁцъш юЄырфўшър (сЁхъяюшэЄ√ эр фюёЄєя ъ ярь Єш)
  231.    const TMemIf *MemIf; // ╥хъє∙шщ ръЄштэ√щ шэЄхЁЇхщё ярь Єш
  232.  
  233.    void reset() { int_flags = ir_ = pc = 0; im = 0; last_branch = 0; int_pend = false; int_gate = true; }
  234.    Z80(u32 Idx, TBankNames BankNames, TStep Step, TDelta Delta,
  235.        TSetLastT SetLastT, u8 *membits, const TMemIf *FastMemIf, const TMemIf *DbgMemIf) :
  236.        Idx(Idx),
  237.        BankNames(BankNames),
  238.        Step(Step), Delta(Delta), SetLastT(SetLastT), membits(membits),
  239.        FastMemIf(FastMemIf), DbgMemIf(DbgMemIf)
  240.    {
  241.        MemIf = FastMemIf;
  242.        tpi = 0;
  243.        dbgbreak = 0;
  244.        dbgchk = 0;
  245.        debug_last_t = 0;
  246.        trace_curs = trace_top = (unsigned)-1; trace_mode = 0;
  247.        mem_curs = mem_top = 0;
  248.        pc_trflags = nextpc = 0;
  249.        dbg_stophere = dbg_stopsp = (unsigned)-1;
  250.        dbg_loop_r1 = 0;
  251.        dbg_loop_r2 = 0xFFFF;
  252.        int_pend = false;
  253.        int_gate = true;
  254.        nmi_in_progress = false;
  255.    }
  256.    virtual ~Z80() { }
  257.    u32 GetIdx() const { return Idx; }
  258.    void SetTpi(u32 Tpi) { tpi = Tpi; }
  259.  
  260.    void SetFastMemIf() { MemIf = FastMemIf; }
  261.    void SetDbgMemIf() { MemIf = DbgMemIf; }
  262.  
  263.    u8 DirectRm(unsigned addr) const { return *DirectMem(addr); } // direct read memory in debuger
  264.    void DirectWm(unsigned addr, u8 val) { *DirectMem(addr) = val; } // direct write memory in debuger
  265. /*
  266.    virtual unsigned char rm(unsigned addr) = 0;
  267.    virtual void wm(unsigned addr, unsigned char val) = 0;
  268.    */
  269.    virtual u8 *DirectMem(unsigned addr) const = 0; // get direct memory pointer in debuger
  270.  
  271.    virtual unsigned char in(unsigned port) = 0;
  272.    virtual void out(unsigned port, unsigned char val) = 0;
  273.    virtual unsigned char m1_cycle() = 0; // [vv] ═х чртшёшЄ юЄ яЁюЎхёёюЁр (т√эхёЄш т сшсышюЄхъє)
  274.    virtual u8 IntVec() = 0; // ╘єэъЎш  тючтЁр∙р■∙р  чэрўхэшх тхъЄюЁр яЁхЁ√трэш  фы  im2
  275.    virtual void CheckNextFrame() = 0; // ╧ЁютхЁър ш юсэютыхэш  ёўхЄўшър ърфЁют ш ЄръЄют тэєЄЁш яЁхЁ√трэш 
  276.    virtual void retn() = 0; // ┬√ч√трхЄё  т ъюэЎх шэёЄЁєъЎшш retn (фюыцэр ёсЁрё√трЄ№ Їыру nmi_in_progress ш юсэюты Є№ Ёрёъырфъє ярь Єш)
  277. };
  278.  
  279. #define CF 0x01
  280. #define NF 0x02
  281. #define PV 0x04
  282. #define F3 0x08
  283. #define HF 0x10
  284. #define F5 0x20
  285. #define ZF 0x40
  286. #define SF 0x80
  287.  
  288. #endif // _Z80_DEFS_H_INCLUDED
  289.