x16.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. /*
  10. * Can't write 16-bit code for 8a without getting into
  11. * lots of bother, so define some simple commands and
  12. * output the code directly.
  13. *
  14. * N.B. CALL16(x) kills DI, so don't expect it to be
  15. * saved across calls.
  16. */
  17. #define rAX 0 /* rX */
  18. #define rCX 1
  19. #define rDX 2
  20. #define rBX 3
  21. #define rSP 4 /* SP */
  22. #define rBP 5 /* BP */
  23. #define rSI 6 /* SI */
  24. #define rDI 7 /* DI */
  25. #define rAL 0 /* rL */
  26. #define rCL 1
  27. #define rDL 2
  28. #define rBL 3
  29. #define rAH 4 /* rH */
  30. #define rCH 5
  31. #define rDH 6
  32. #define rBH 7
  33. #define rES 0 /* rS */
  34. #define rCS 1
  35. #define rSS 2
  36. #define rDS 3
  37. #define rFS 4
  38. #define rGS 5
  39. #define xSI 4 /* rI (index) */
  40. #define xDI 5
  41. #define xBP 6
  42. #define xBX 7
  43. #define rCR0 0 /* rC */
  44. #define rCR2 2
  45. #define rCR3 3
  46. #define rCR4 4
  47. #define OP(o, m, ro, rm) BYTE $o; /* op + modr/m byte */ \
  48. BYTE $(((m)<<6)|((ro)<<3)|(rm))
  49. #define OPrm(o, r, m) OP(o, 0x00, r, 0x06); /* general r <-> m */ \
  50. WORD $m;
  51. #define OPrr(o, r0, r1) OP(o, 0x03, r0, r1); /* general r -> r */
  52. #define LW(m, rX) OPrm(0x8B, rX, m) /* m -> rX */
  53. #define LXW(x, rI, r) OP(0x8B, 0x02, r, rI); /* x(rI) -> r */ \
  54. WORD $x
  55. #define LBPW(x, r) OP(0x8B, 0x02, r, xBP); /* x(rBP) -> r */ \
  56. WORD $x
  57. #define LB(m, rB) OPrm(0x8A, rB, m) /* m -> r[HL] */
  58. #define LXB(x, rI, r) OP(0x8A, 0x01, r, rI); /* x(rI) -> r */ \
  59. BYTE $x
  60. #define LBPB(x, r) OP(0x8A, 0x01, r, xBP); /* x(rBP) -> r */ \
  61. BYTE $x
  62. #define SW(rX, m) OPrm(0x89, rX, m) /* rX -> m */
  63. #define SXW(r, x, rI) OP(0x89, 0x02, r, rI); /* r -> x(rI) */ \
  64. WORD $x
  65. #define SBPW(r, x) OP(0x89, 0x02, r, xBP); /* r -> x(rBP) */ \
  66. WORD $(x)
  67. #define SBPWI(i, x) OP(0xC7, 0x01, 0, xBP); /* i -> x(rBP) */ \
  68. BYTE $(x); WORD $(i)
  69. #define STB(rB, m) OPrm(0x88, rB, m) /* rB -> m */
  70. #define SXB(r, x, rI) OP(0x88, 0x01, r, rI); /* rB -> x(rI) */ \
  71. BYTE $x
  72. #define SBPB(r, x) OP(0x88, 0x01, r, xBP); /* r -> x(rBP) */ \
  73. BYTE $x
  74. #define SBPBI(i, x) OP(0xC6, 0x01, 0, xBP); /* i -> x(rBP) */ \
  75. BYTE $(x); BYTE $(i)
  76. #define LWI(i, rX) BYTE $(0xB8+rX); /* i -> rX */ \
  77. WORD $i;
  78. #define LBI(i, rB) BYTE $(0xB0+rB); /* i -> r[HL] */ \
  79. BYTE $i
  80. #define MW(r0, r1) OPrr(0x89, r0, r1) /* r0 -> r1 */
  81. #define MFSR(rS, rX) OPrr(0x8C, rS, rX) /* rS -> rX */
  82. #define MTSR(rX, rS) OPrr(0x8E, rS, rX) /* rX -> rS */
  83. #define MFCR(rC, rX) BYTE $0x0F; /* rC -> rX */ \
  84. OP(0x20, 0x03, rC, rX)
  85. #define MTCR(rX, rC) BYTE $0x0F; /* rX -> rC */ \
  86. OP(0x22, 0x03, rC, rX)
  87. #define ADC(r0, r1) OPrr(0x11, r0, r1) /* r0 + r1 -> r1 */
  88. #define ADD(r0, r1) OPrr(0x01, r0, r1) /* r0 + r1 -> r1 */
  89. #define ADDI(i, r) OP(0x81, 0x03, 0x00, r);/* i+r -> r */ \
  90. WORD $i;
  91. #define AND(r0, r1) OPrr(0x21, r0, r1) /* r0&r1 -> r1 */
  92. #define ANDI(i, r) OP(0x81, 0x03, 0x04, r);/* i&r -> r */ \
  93. WORD $i;
  94. #define CLR(r) OPrr(0x31, r, r) /* r^r -> r */
  95. #define CLRB(r) OPrr(0x30, r, r) /* r^r -> r */
  96. #define CMP(r0, r1) OPrr(0x39, r0, r1) /* r1-r0 -> flags */
  97. #define CMPI(i, r) OP(0x81, 0x03, 0x07, r);/* r-i -> flags */ \
  98. WORD $i;
  99. #define CMPBR(r0, r1) OPrr(0x38, r0, r1) /* r1-r0 -> flags */
  100. #define DEC(r) BYTE $(0x48|r) /* r-1 -> r */
  101. #define DIV(r) OPrr(0xF7, 0x06, r) /* rDX:rAX/r -> rAX, rDX:rAX%r -> rDX */
  102. #define INC(r) BYTE $(0x40|r) /* r+1 -> r */
  103. #define MUL(r) OPrr(0xF7, 0x04, r) /* r*rAX -> rDX:rAX */
  104. #define IMUL(r0, r1) BYTE $0x0F; /* r0*r1 -> r1 */ \
  105. OPrr(0xAF, r1, r0) /* (signed) */
  106. #define OR(r0, r1) OPrr(0x09, r0, r1) /* r0|r1 -> r1 */
  107. #define ORB(r0, r1) OPrr(0x08, r0, r1) /* r0|r1 -> r1 */
  108. #define ORI(i, r) OP(0x81, 0x03, 0x01, r);/* i|r -> r */ \
  109. WORD $i;
  110. #define ROLI(i, r) OPrr(0xC1, 0x00, r); /* r<<>>i -> r */ \
  111. BYTE $i;
  112. #define SHLI(i, r) OPrr(0xC1, 0x04, r); /* r<<i -> r */ \
  113. BYTE $i;
  114. #define SHLBI(i, r) OPrr(0xC0, 0x04, r); /* r<<i -> r */ \
  115. BYTE $i;
  116. #define SHRI(i, r) OPrr(0xC1, 0x05, r); /* r>>i -> r */ \
  117. BYTE $i;
  118. #define SHRBI(i, r) OPrr(0xC0, 0x05, r); /* r>>i -> r */ \
  119. BYTE $i;
  120. #define SUB(r0, r1) OPrr(0x29, r0, r1) /* r1-r0 -> r1 */
  121. #define SUBI(i, r) OP(0x81, 0x03, 0x05, r);/* r-i -> r */ \
  122. WORD $i;
  123. #define STOSW STOSL
  124. #define CALL16(f) LWI(f, rDI); /* &f -> rDI */ \
  125. BYTE $0xFF; /* (*rDI) */ \
  126. BYTE $0xD7;
  127. #define FARJUMP16(s, o) BYTE $0xEA; /* jump to ptr16:16 */ \
  128. WORD $o; WORD $s
  129. #define FARJUMP32(s, o) BYTE $0x66; /* jump to ptr32:16 */ \
  130. BYTE $0xEA; LONG $o; WORD $s
  131. #define DELAY BYTE $0xEB; /* jmp .+2 */ \
  132. BYTE $0x00
  133. #define BIOSCALL(b) INT $b /* INT $b */
  134. #define PEEKW BYTE $0x26; /* MOVW rES:[rBX], rAX */ \
  135. BYTE $0x8B; BYTE $0x07
  136. #define POKEW BYTE $0x26; /* MOVW rAX, rES:[rBX] */ \
  137. BYTE $0x89; BYTE $0x07
  138. #define OUTPORTB(p, d) LBI(d, rAL); /* d -> I/O port p */ \
  139. BYTE $0xE6; \
  140. BYTE $p; DELAY
  141. #define PUSHA BYTE $0x60
  142. #define PUSHR(r) BYTE $(0x50|r) /* r -> (--rSP) */
  143. #define PUSHS(rS) BYTE $(0x06|((rS)<<3)) /* rS -> (--rSP) */
  144. #define PUSHI(i) BYTE $0x68; WORD $i; /* i -> --(rSP) */
  145. #define POPA BYTE $0x61
  146. #define POPR(r) BYTE $(0x58|r) /* (rSP++) -> r */
  147. #define POPS(rS) BYTE $$(0x07|((rS)<<3)) /* (rSP++) -> r */
  148. #define NOP BYTE $0x90 /* nop */
  149. #define LGDT(gdtptr) BYTE $0x0F; /* LGDT */ \
  150. BYTE $0x01; BYTE $0x16; \
  151. WORD $gdtptr
  152. /* operand size switch. */
  153. #define OPSIZE BYTE $0x66