cz80macro.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /******************************************************************************
  2. cz80macro.h
  3. CZ80 ŠeŽíƒ}ƒNƒ�
  4. ******************************************************************************/
  5. #if CZ80_USE_JUMPTABLE
  6. #define _SSOP(A,B) A##B
  7. #define OP(A) _SSOP(OP,A)
  8. #define OPCB(A) _SSOP(OPCB,A)
  9. #define OPED(A) _SSOP(OPED,A)
  10. #define OPXY(A) _SSOP(OPXY,A)
  11. #define OPXYCB(A) _SSOP(OPXYCB,A)
  12. #else
  13. #define OP(A) case A
  14. #define OPCB(A) case A
  15. #define OPED(A) case A
  16. #define OPXY(A) case A
  17. #define OPXYCB(A) case A
  18. #endif
  19. #define USE_CYCLES(A) CPU->ICount -= (A);
  20. #define ADD_CYCLES(A) CPU->ICount += (A);
  21. #define RET(A) { USE_CYCLES(A) goto Cz80_Exec; }
  22. #if CZ80_ENCRYPTED_ROM
  23. #define SET_PC(A) \
  24. CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT]; \
  25. OPBase = CPU->OPFetch[(A) >> CZ80_FETCH_SFT]; \
  26. PC = (A) + CPU->BasePC;
  27. #define GET_OP() (*(UINT8 *)(OPBase + PC))
  28. #else
  29. #define SET_PC(A) \
  30. CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT]; \
  31. PC = (A) + CPU->BasePC;
  32. #define GET_OP() (*(UINT8 *)PC)
  33. #endif
  34. #define READ_OP() GET_OP(); PC++
  35. #define READ_ARG() (*(UINT8 *)PC++)
  36. #define READ_ARG16() (*(UINT8 *)PC | (*(UINT8 *)(PC + 1) << 8)); PC += 2
  37. //#ifndef BUILD_CPS1PSP
  38. //#define READ_MEM8(A) memory_region_cpu2[(A)]
  39. //#else
  40. #if PICODRIVE_HACKS
  41. #define READ_MEM8(A) picodrive_read(A)
  42. #else
  43. #define READ_MEM8(A) CPU->Read_Byte(A)
  44. #endif
  45. //#endif
  46. #define READ_MEM16(A) (READ_MEM8(A) | (READ_MEM8((A) + 1) << 8))
  47. #if PICODRIVE_HACKS
  48. #define WRITE_MEM8(A, D) { \
  49. unsigned short a = A; \
  50. unsigned char d = D; \
  51. uptr v = z80_write_map[a >> Z80_MEM_SHIFT]; \
  52. if (map_flag_set(v)) \
  53. ((z80_write_f *)(v << 1))(a, d); \
  54. else \
  55. *(unsigned char *)((v << 1) + a) = d; \
  56. }
  57. #else
  58. #define WRITE_MEM8(A, D) CPU->Write_Byte(A, D);
  59. #endif
  60. #define WRITE_MEM16(A, D) { WRITE_MEM8(A, D); WRITE_MEM8((A) + 1, (D) >> 8); }
  61. #define PUSH_16(A) { UINT32 sp; zSP -= 2; sp = zSP; WRITE_MEM16(sp, A); }
  62. #define POP_16(A) { UINT32 sp; sp = zSP; A = READ_MEM16(sp); zSP = sp + 2; }
  63. #define IN(A) CPU->IN_Port(A)
  64. #define OUT(A, D) CPU->OUT_Port(A, D)
  65. #define CHECK_INT \
  66. if (zIFF1) \
  67. { \
  68. UINT32 IntVect; \
  69. \
  70. if (CPU->IRQState == HOLD_LINE) \
  71. CPU->IRQState = CLEAR_LINE; \
  72. \
  73. CPU->Status &= ~(CZ80_HALTED|CZ80_HAS_INT); \
  74. zIFF1 = zIFF2 = 0; \
  75. IntVect = CPU->Interrupt_Callback(CPU->IRQLine); \
  76. \
  77. PUSH_16(zRealPC) \
  78. \
  79. if (zIM == 2) \
  80. { \
  81. IntVect = (IntVect & 0xff) | (zI << 8); \
  82. PC = READ_MEM16(IntVect); \
  83. CPU->ExtraCycles += 17; \
  84. } \
  85. else if (zIM == 1) \
  86. { \
  87. PC = 0x38; \
  88. CPU->ExtraCycles += 13; \
  89. } \
  90. else \
  91. { \
  92. PC = IntVect & 0x38; \
  93. CPU->ExtraCycles += 13; \
  94. } \
  95. \
  96. SET_PC(PC) \
  97. }