mach4.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #define RCSID4 "$Id$"
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. *
  6. */
  7. /*
  8. * Motorola 6809 parsing rules
  9. */
  10. operation
  11. : SETDP expr
  12. { dpvalue = $2.val;}
  13. |
  14. NOARG
  15. { emit1or2($1);}
  16. |
  17. BRANCH expr
  18. { branch($1,$2);}
  19. |
  20. LBRNCH expr
  21. { emit1(0x10); emit1($1);
  22. $2.val -= (DOTVAL+2);
  23. #ifdef RELOCATION
  24. if (rflag != 0 && PASS_RELO)
  25. newrelo($2.typ, RELPC|RELO2|RELBR);
  26. #endif
  27. emit2($2.val);
  28. }
  29. |
  30. SBRNCH expr
  31. { emit1($1);
  32. $2.val -= (DOTVAL+2);
  33. #ifdef RELOCATION
  34. if (rflag != 0 && PASS_RELO)
  35. newrelo($2.typ, RELPC|RELO2|RELBR);
  36. #endif
  37. emit2($2.val);
  38. }
  39. |
  40. IMMED '#' expr
  41. { emit1($1);
  42. #ifdef RELOCATION
  43. if (rflag != 0 && PASS_RELO)
  44. newrelo($3.typ, RELO1);
  45. #endif
  46. emit1($3.val);
  47. }
  48. |
  49. XOP '#' expr
  50. { emit1or2($1 - 0x20);
  51. switch ($1 & 0x0F) {
  52. case 0x03:
  53. case 0x0C:
  54. case 0x0E:
  55. #ifdef RELOCATION
  56. if (rflag != 0 && PASS_RELO)
  57. newrelo($3.typ, RELO2|RELBR);
  58. #endif
  59. emit2($3.val);
  60. break;
  61. default:
  62. #ifdef RELOCATION
  63. if (rflag != 0 && PASS_RELO)
  64. newrelo($3.typ, RELO1);
  65. #endif
  66. emit1($3.val);
  67. break;
  68. }
  69. }
  70. |
  71. XOP '<' expr
  72. { if (0 <= $1 && $1 < 0x80)
  73. emit1(($1-0x10) & 0x3F);
  74. else
  75. emit1or2($1 - 0x10);
  76. #ifdef RELOCATION
  77. if (rflag != 0 && PASS_RELO)
  78. newrelo($3.typ, RELO1);
  79. #endif
  80. emit1($3.val);
  81. }
  82. |
  83. XOP '>' expr
  84. { emit1or2($1 + 0x10);
  85. #ifdef RELOCATION
  86. if (rflag != 0 && PASS_RELO)
  87. newrelo($3.typ, RELO2|RELBR);
  88. #endif
  89. emit2($3.val);
  90. }
  91. |
  92. STACK reglist
  93. { emit1($1); emit1($2);}
  94. |
  95. TWOREG REG ',' REG
  96. {
  97. emit1($1);
  98. emit1($2 << 4 | $4);
  99. }
  100. |
  101. XOP REG
  102. { switch ($2) {
  103. case A: emit1($1 - 0x20);
  104. break;
  105. case B: emit1($1 - 0x10);
  106. break;
  107. default:serror("register error");
  108. }
  109. }
  110. |
  111. XOP expr ',' REG
  112. { emit1or2($1);
  113. offset($4,$2,0);
  114. }
  115. |
  116. XOP '(' expr ',' REG ')'
  117. { emit1or2($1);
  118. offset($5,$3,0x10);
  119. }
  120. |
  121. XOP '(' expr ')'
  122. { emit1or2($1);
  123. emit1(0x9F);
  124. #ifdef RELOCATION
  125. if (rflag != 0 && PASS_RELO)
  126. newrelo($3.typ, RELO2|RELBR);
  127. #endif
  128. emit2($3.val);
  129. }
  130. |
  131. XOP xmode
  132. { emit1or2($1);
  133. emit1($2);
  134. }
  135. |
  136. XOP '(' xmode ')'
  137. { if (($3 & 0x8D) == 0x80)
  138. serror("invalid index mode");
  139. emit1or2($1);
  140. emit1($3 + 0x10);
  141. }
  142. |
  143. XOP expr
  144. { if (($2.typ & S_TYP) == S_ABS &&
  145. ((unsigned)$2.val >> 8) == dpvalue
  146. ) {
  147. if (0 <= $1 && $1 < 0x80)
  148. emit1(($1-0x20) & 0x3F);
  149. else
  150. emit1or2($1 - 0x10);
  151. emit1($2.val);
  152. } else {
  153. emit1or2($1 + 0x10);
  154. #ifdef RELOCATION
  155. if (rflag != 0 && PASS_RELO)
  156. newrelo($2.typ, RELO2|RELBR);
  157. #endif
  158. emit2($2.val);
  159. }
  160. }
  161. ;
  162. reglist : ALL
  163. | REG
  164. { if (($$ = regbit[$1]) < 0) serror("register error");}
  165. |
  166. reglist ',' REG
  167. { register i;
  168. if ((i = regbit[$3]) < 0 || ($1 & i) != 0)
  169. serror("register error");
  170. $$ = $1 | i;
  171. }
  172. ;
  173. xyus : REG
  174. { if (($$ = regno($1)) < 0) serror("register error");}
  175. ;
  176. xmode : ',' xyus '+' '+'
  177. { $$ = 0x81 + $2;}
  178. |
  179. ',' xyus '+'
  180. { $$ = 0x80 + $2;}
  181. |
  182. ',' xyus
  183. { $$ = 0x84 + $2;}
  184. |
  185. ',' '-' '-' xyus
  186. { $$ = 0x83 + $4;}
  187. |
  188. ',' '-' xyus
  189. { $$ = 0x82 + $3;}
  190. |
  191. REG ',' xyus
  192. { switch($1) {
  193. case A: $$ = 0x86 + $3; break;
  194. case B: $$ = 0x85 + $3; break;
  195. case D: $$ = 0x8B + $3; break;
  196. default: serror("register error");
  197. }
  198. }
  199. ;