/tags/sdcc-280-pre1/sdcc/as/hc08/m08adr.c

# · C · 205 lines · 161 code · 24 blank · 20 comment · 38 complexity · f00c5bc504d03d6c9bfbdf84d26c6751 MD5 · raw file

  1. /* m08adr.c */
  2. /*
  3. * (C) Copyright 1993-2002
  4. * All Rights Reserved
  5. *
  6. * Alan R. Baldwin
  7. * 721 Berkeley St.
  8. * Kent, Ohio 44240
  9. */
  10. #include <stdio.h>
  11. #include <setjmp.h>
  12. #include "asm.h"
  13. #include "m6808.h"
  14. int
  15. addr(esp)
  16. register struct expr *esp;
  17. {
  18. register int c;
  19. register struct area *espa;
  20. register Addr_T espv;
  21. const char *tcp;
  22. if ((c = getnb()) == '#') {
  23. expr(esp, 0);
  24. esp->e_mode = S_IMMED;
  25. } else if (c == ',') {
  26. switch(admode(axs)) {
  27. default:
  28. aerr();
  29. case S_X:
  30. c = S_IX;
  31. break;
  32. case S_S:
  33. c = S_IS;
  34. break;
  35. case S_XP:
  36. c = S_IXP;
  37. break;
  38. }
  39. esp->e_mode = c;
  40. } else if (c == '*') {
  41. expr(esp, 0);
  42. esp->e_mode = S_DIR;
  43. if (esp->e_addr & ~0xFF)
  44. err('d');
  45. if (more()) {
  46. comma();
  47. tcp = ip;
  48. switch(admode(axs)) {
  49. case S_X:
  50. esp->e_mode = S_IX1;
  51. break;
  52. case S_S:
  53. esp->e_mode = S_SP1;
  54. break;
  55. case S_XP:
  56. esp->e_mode = S_IX1P;
  57. break;
  58. default:
  59. ip = --tcp;
  60. }
  61. }
  62. } else {
  63. unget(c);
  64. if ((esp->e_mode = admode(axs)) != 0) {
  65. ;
  66. } else {
  67. expr(esp, 0);
  68. espa = esp->e_base.e_ap;
  69. espv = esp->e_addr;
  70. if (more()) {
  71. comma();
  72. c = admode(axs);
  73. if (esp->e_flag == 0 &&
  74. espa == NULL &&
  75. (espv & ~0xFF) == 0) {
  76. switch(c) {
  77. default:
  78. aerr();
  79. case S_X:
  80. c = S_IX1;
  81. break;
  82. case S_S:
  83. c = S_SP1;
  84. break;
  85. case S_XP:
  86. c = S_IX1P;
  87. break;
  88. }
  89. } else {
  90. switch(c) {
  91. default:
  92. aerr();
  93. case S_X:
  94. c = S_IX2;
  95. break;
  96. case S_S:
  97. c = S_SP2;
  98. break;
  99. case S_XP:
  100. c = S_IX2P;
  101. break;
  102. }
  103. }
  104. esp->e_mode = c;
  105. } else {
  106. esp->e_mode = S_EXT;
  107. }
  108. }
  109. }
  110. return (esp->e_mode);
  111. }
  112. /*
  113. * Enter admode() to search a specific addressing mode table
  114. * for a match. Return the addressing value on a match or
  115. * zero for no match.
  116. */
  117. int
  118. admode(sp)
  119. register struct adsym *sp;
  120. {
  121. register char *ptr;
  122. register int i;
  123. register const char *ips;
  124. ips = ip;
  125. unget(getnb());
  126. i = 0;
  127. while ( *(ptr = &sp[i].a_str[0]) ) {
  128. if (srch(ptr)) {
  129. return(sp[i].a_val);
  130. }
  131. i++;
  132. }
  133. ip = ips;
  134. return(0);
  135. }
  136. /*
  137. * srch --- does string match ?
  138. */
  139. int
  140. srch(str)
  141. register char *str;
  142. {
  143. register const char *ptr;
  144. ptr = ip;
  145. while (*ptr && *str) {
  146. if(ccase[*ptr & 0x007F] != ccase[*str & 0x007F])
  147. break;
  148. ptr++;
  149. str++;
  150. }
  151. if (ccase[*ptr & 0x007F] == ccase[*str & 0x007F]) {
  152. ip = ptr;
  153. return(1);
  154. }
  155. if (!*str)
  156. if (any(*ptr," \t\n,];")) {
  157. ip = ptr;
  158. return(1);
  159. }
  160. return(0);
  161. }
  162. /*
  163. * any --- does str contain c?
  164. */
  165. int
  166. any(c,str)
  167. int c;
  168. char*str;
  169. {
  170. while (*str)
  171. if(*str++ == c)
  172. return(1);
  173. return(0);
  174. }
  175. struct adsym axs[] = { /* a, x, or s registers */
  176. { "a", S_A },
  177. { "x", S_X },
  178. { "s", S_S },
  179. { "x+", S_XP },
  180. { "", 0x00 }
  181. };