cpu.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /****************************************************************************
  2. * *
  3. * Third Year Project *
  4. * *
  5. * An IBM PC Emulator *
  6. * For Unix and X Windows *
  7. * *
  8. * By David Hedley *
  9. * *
  10. * *
  11. * This program is Copyrighted. Consult the file COPYRIGHT for more details *
  12. * *
  13. ****************************************************************************/
  14. /* This is CPU.H it contains definitions for cpu.c */
  15. #ifndef CPU_H
  16. #define CPU_H
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. #include "mytypes.h"
  21. #define AX 0
  22. #define CX 1
  23. #define DX 2
  24. #define BX 3
  25. #define SP 4
  26. #define BP 5
  27. #define SI 6
  28. #define DI 7
  29. #define AL 0
  30. #define CL 1
  31. #define DL 2
  32. #define BL 3
  33. #define AH 4
  34. #define CH 5
  35. #define DH 6
  36. #define BH 7
  37. #define SPL 8
  38. #define SPH 9
  39. #define BPL 10
  40. #define BPH 11
  41. #define SIL 12
  42. #define SIH 13
  43. #define DIL 14
  44. #define DIH 15
  45. #define ES 0
  46. #define CS 1
  47. #define SS 2
  48. #define DS 3
  49. /* parameter x = result, y = source 1, z = source 2 */
  50. #define SetCFB_Add(x,y) (CF = (BYTE)(x) < (BYTE)(y))
  51. #define SetCFW_Add(x,y) (CF = (WORD)(x) < (WORD)(y))
  52. #define SetCFB_Sub(y,z) (CF = (BYTE)(y) > (BYTE)(z))
  53. #define SetCFW_Sub(y,z) (CF = (WORD)(y) > (WORD)(z))
  54. #define SetZFB(x) (ZF = !(BYTE)(x))
  55. #define SetZFW(x) (ZF = !(WORD)(x))
  56. #define SetTF(x) (TF = (x))
  57. #define SetIF(x) (IF = (x))
  58. #define SetDF(x) (DF = (x))
  59. #define SetAF(x,y,z) (AF = ((x) ^ ((y) ^ (z))) & 0x10)
  60. #define SetPF(x) (PF = parity_table[(BYTE)(x)])
  61. #define SetOFW_Add(x,y,z) (OF = ((x) ^ (y)) & ((x) ^ (z)) & 0x8000)
  62. #define SetOFB_Add(x,y,z) (OF = ((x) ^ (y)) & ((x) ^ (z)) & 0x80)
  63. #define SetOFW_Sub(x,y,z) (OF = ((z) ^ (y)) & ((z) ^ (x)) & 0x8000)
  64. #define SetOFB_Sub(x,y,z) (OF = ((z) ^ (y)) & ((z) ^ (x)) & 0x80)
  65. #define SetSFW(x) (SF = (x) & 0x8000)
  66. #define SetSFB(x) (SF = (x) & 0x80)
  67. #define GetMemInc(Seg,Off) ((Seg)[(Off)++])
  68. #if defined(TEST) && defined(BSD386)
  69. # define SegToMemPtr(Seg) (sregs[Seg] == 0xa000 ? (BYTE *)0xe00a0000 : \
  70. sregs[Seg] == 0xb800 ? (BYTE *)0xe00b8000 : \
  71. &memory[sregs[Seg] << 4])
  72. #else
  73. # define SegToMemPtr(Seg) (&memory[sregs[Seg] << 4])
  74. #endif
  75. #define PutMemB(Seg,Off,x) ((Seg)[(WORD)(Off)] = (BYTE)(x))
  76. #define GetMemB(Seg,Off) ((BYTE)(Seg)[(WORD)(Off)])
  77. #define CalcAll()
  78. #define CompressFlags() (WORD)(CF | (PF << 2) | (!(!AF) << 4) | (ZF << 6) \
  79. | (!(!SF) << 7) | (TF << 8) | (IF << 9) \
  80. | (DF << 10) | (!(!OF) << 11))
  81. #define ExpandFlags(f) \
  82. { \
  83. CF = (f) & 1; \
  84. PF = ((f) & 4) == 4; \
  85. AF = (f) & 16; \
  86. ZF = ((f) & 64) == 64; \
  87. SF = (f) & 128; \
  88. TF = ((f) & 256) == 256; \
  89. IF = ((f) & 512) == 512; \
  90. DF = ((f) & 1024) == 1024; \
  91. OF = (f) & 2048; \
  92. }
  93. /* ChangeE(x) changes x to little endian from the machine's natural endian
  94. format and back again. Obviously there is nothing to do for little-endian
  95. machines... */
  96. #if defined(LITTLE_ENDIAN)
  97. # define ChangeE(x) (WORD)(x)
  98. #else
  99. # define ChangeE(x) (WORD)(((x) << 8) | ((BYTE)((x) >> 8)))
  100. #endif
  101. #if defined(LITTLE_ENDIAN) && !defined(ALIGNED_ACCESS)
  102. # define ReadWord(x) (*(x))
  103. # define WriteWord(x,y) (*(x) = (y))
  104. # define CopyWord(x,y) (*x = *y)
  105. # define PutMemW(Seg,Off,x) (*(WORD *)((Seg)+(WORD)(Off)) = (WORD)(x))
  106. # define GetMemW(Seg,Off) (*(WORD *)((Seg)+(WORD)(Off)))
  107. #else
  108. # define ReadWord(x) ((WORD)(*((BYTE *)(x))) + ((WORD)(*((BYTE *)(x)+1)) << 8))
  109. # define WriteWord(x,y) (*(BYTE *)(x) = (BYTE)(y), *((BYTE *)(x)+1) = (BYTE)((y) >> 8))
  110. # define CopyWord(x,y) (*(BYTE *)(x) = *(BYTE *)(y), *((BYTE *)(x)+1) = *((BYTE *)(y)+1))
  111. # define PutMemW(Seg,Off,x) (Seg[Off] = (BYTE)(x), Seg[(WORD)(Off)+1] = (BYTE)((x) >> 8))
  112. # define GetMemW(Seg,Off) ((WORD)Seg[Off] + ((WORD)Seg[(WORD)(Off)+1] << 8))
  113. #endif
  114. extern WORD wregs[8]; /* Always little-endian */
  115. extern BYTE *bregs[16]; /* Points to bytes within wregs[] */
  116. extern unsigned sregs[4]; /* Always native machine word order */
  117. extern unsigned ip; /* Always native machine word order */
  118. /* All the byte flags will either be 1 or 0 */
  119. extern BYTE CF, PF, ZF, TF, IF, DF;
  120. /* All the word flags may be either none-zero (true) or zero (false) */
  121. extern unsigned AF, OF, SF;
  122. extern BYTE *c_cs,*c_ds,*c_es,*c_ss,*c_stack;
  123. extern volatile int int_pending;
  124. extern volatile int int_blocked;
  125. #ifdef __cplusplus
  126. }
  127. #endif
  128. #endif