C_out_skel.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. /* $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. /* makecalls: expand a datastructure as delivered by "EM_getline"
  7. into calls to the procedural interface.
  8. Exported routine:
  9. C_out
  10. */
  11. #define CODE_EXPANDER
  12. #define EXPORT
  13. #define PRIVATE static
  14. #include <em_spec.h>
  15. #include <em_mnem.h>
  16. #include <em_pseu.h>
  17. #include <em_flag.h>
  18. #include "em_ptyp.h"
  19. #include <em.h>
  20. #include <em_comp.h>
  21. #include <assert.h>
  22. extern char em_flag[]; /* One per EM instruction: indicates parameter kind */
  23. extern short em_ptyp[]; /* One per parameter kind: indicates parameter type */
  24. char *C_error;
  25. PRIVATE C_dopseudo();
  26. EXPORT int
  27. C_out(p)
  28. register struct e_instr *p;
  29. {
  30. C_error = 0;
  31. switch(p->em_type) {
  32. default:
  33. C_error = "Illegal EM line";
  34. break;
  35. case EM_MNEM:
  36. /* normal instruction */
  37. if ((em_flag[p->em_opcode-sp_fmnem] & EM_PAR) == PAR_W &&
  38. p->em_argtype == 0) {
  39. #include "C_mnem_narg"
  40. } else {
  41. #include "C_mnem"
  42. }
  43. break;
  44. case EM_DEFILB:
  45. /* defining occurrence of an instruction label */
  46. C_df_ilb(p->em_ilb);
  47. break;
  48. case EM_DEFDLB:
  49. /* defining occurrence of a global data label */
  50. C_df_dlb(p->em_dlb);
  51. break;
  52. case EM_DEFDNAM:
  53. /* defining occurrence of a non-numeric data label */
  54. C_df_dnam(p->em_dnam);
  55. break;
  56. case EM_PSEU:
  57. /* pseudo */
  58. C_dopseudo(p);
  59. break;
  60. case EM_STARTMES:
  61. /* start of a MES pseudo */
  62. C_mes_begin((int) (p->em_cst));
  63. break;
  64. case EM_MESARG:
  65. switch(p->em_argtype) {
  66. case ilb_ptyp:
  67. C_ilb(p->em_ilb);
  68. break;
  69. case nof_ptyp:
  70. C_dlb(p->em_dlb, p->em_off);
  71. break;
  72. case sof_ptyp:
  73. C_dnam(p->em_dnam, p->em_off);
  74. break;
  75. case cst_ptyp:
  76. C_cst(p->em_cst);
  77. break;
  78. case pro_ptyp:
  79. C_pnam(p->em_pnam);
  80. break;
  81. case str_ptyp:
  82. C_scon(p->em_string, p->em_size);
  83. break;
  84. case ico_ptyp:
  85. C_icon(p->em_string, p->em_size);
  86. break;
  87. case uco_ptyp:
  88. C_ucon(p->em_string, p->em_size);
  89. break;
  90. case fco_ptyp:
  91. C_fcon(p->em_string, p->em_size);
  92. break;
  93. default:
  94. C_error = "Illegal argument type";
  95. break;
  96. }
  97. break;
  98. case EM_ENDMES:
  99. C_mes_end();
  100. break;
  101. }
  102. if (C_error) return 0;
  103. return 1;
  104. }
  105. PRIVATE
  106. C_dopseudo(p)
  107. register struct e_instr *p;
  108. {
  109. switch(p->em_opcode) {
  110. case ps_exc: {
  111. C_error = "EXC not allowed";
  112. break;
  113. }
  114. case ps_hol: {
  115. switch(p->em_argtype) {
  116. case cst_ptyp:
  117. C_hol_cst(EM_holsize,
  118. p->em_cst,
  119. EM_holinit);
  120. break;
  121. case ico_ptyp:
  122. C_hol_icon(EM_holsize,
  123. p->em_string,
  124. p->em_size,
  125. EM_holinit);
  126. break;
  127. case uco_ptyp:
  128. C_hol_ucon(EM_holsize,
  129. p->em_string,
  130. p->em_size,
  131. EM_holinit);
  132. break;
  133. case fco_ptyp:
  134. C_hol_fcon(EM_holsize,
  135. p->em_string,
  136. p->em_size,
  137. EM_holinit);
  138. break;
  139. case sof_ptyp:
  140. C_hol_dnam(EM_holsize,
  141. p->em_dnam,
  142. p->em_off,
  143. EM_holinit);
  144. break;
  145. case nof_ptyp:
  146. C_hol_dlb(EM_holsize,
  147. p->em_dlb,
  148. p->em_off,
  149. EM_holinit);
  150. break;
  151. case ilb_ptyp:
  152. C_hol_ilb(EM_holsize,
  153. p->em_ilb,
  154. EM_holinit);
  155. break;
  156. case pro_ptyp:
  157. C_hol_pnam(EM_holsize,
  158. p->em_pnam,
  159. EM_holinit);
  160. break;
  161. default:
  162. C_error = "Illegal parameter type";
  163. break;
  164. }
  165. break;
  166. }
  167. case ps_bss: {
  168. switch(p->em_argtype) {
  169. case cst_ptyp:
  170. C_bss_cst(EM_bsssize,
  171. p->em_cst,
  172. EM_bssinit);
  173. break;
  174. case ico_ptyp:
  175. C_bss_icon(EM_bsssize,
  176. p->em_string,
  177. p->em_size,
  178. EM_bssinit);
  179. break;
  180. case uco_ptyp:
  181. C_bss_ucon(EM_bsssize,
  182. p->em_string,
  183. p->em_size,
  184. EM_bssinit);
  185. break;
  186. case fco_ptyp:
  187. C_bss_fcon(EM_bsssize,
  188. p->em_string,
  189. p->em_size,
  190. EM_bssinit);
  191. break;
  192. case sof_ptyp:
  193. C_bss_dnam(EM_bsssize,
  194. p->em_dnam,
  195. p->em_off,
  196. EM_bssinit);
  197. break;
  198. case nof_ptyp:
  199. C_bss_dlb(EM_bsssize,
  200. p->em_dlb,
  201. p->em_off,
  202. EM_bssinit);
  203. break;
  204. case ilb_ptyp:
  205. C_bss_ilb(EM_bsssize,
  206. p->em_ilb,
  207. EM_bssinit);
  208. break;
  209. case pro_ptyp:
  210. C_bss_pnam(EM_bsssize,
  211. p->em_pnam,
  212. EM_bssinit);
  213. break;
  214. default:
  215. C_error = "Illegal parameter type";
  216. break;
  217. }
  218. break;
  219. }
  220. case ps_end:
  221. if (p->em_argtype != 0) {
  222. C_end(p->em_cst);
  223. break;
  224. }
  225. C_end_narg();
  226. break;
  227. case ps_exa:
  228. case ps_ina:
  229. if (p->em_argtype == nof_ptyp) {
  230. if (p->em_opcode == ps_exa) {
  231. C_exa_dlb(p->em_dlb);
  232. }
  233. else C_ina_dlb(p->em_dlb);
  234. break;
  235. }
  236. if (p->em_opcode == ps_exa) {
  237. C_exa_dnam(p->em_dnam);
  238. }
  239. else C_ina_dnam(p->em_dnam);
  240. break;
  241. case ps_exp:
  242. C_exp(p->em_pnam);
  243. break;
  244. case ps_inp:
  245. C_inp(p->em_pnam);
  246. break;
  247. case ps_pro:
  248. if (p->em_nlocals >= 0) {
  249. C_pro(p->em_pnam, p->em_nlocals);
  250. }
  251. else C_pro_narg(p->em_pnam);
  252. break;
  253. case ps_con:
  254. switch(p->em_argtype) {
  255. case ilb_ptyp:
  256. C_con_ilb(p->em_ilb);
  257. break;
  258. case nof_ptyp:
  259. C_con_dlb(p->em_dlb, p->em_off);
  260. break;
  261. case sof_ptyp:
  262. C_con_dnam(p->em_dnam, p->em_off);
  263. break;
  264. case cst_ptyp:
  265. C_con_cst(p->em_cst);
  266. break;
  267. case pro_ptyp:
  268. C_con_pnam(p->em_pnam);
  269. break;
  270. case str_ptyp:
  271. C_con_scon(p->em_string, p->em_size);
  272. break;
  273. case ico_ptyp:
  274. C_con_icon(p->em_string, p->em_size);
  275. break;
  276. case uco_ptyp:
  277. C_con_ucon(p->em_string, p->em_size);
  278. break;
  279. case fco_ptyp:
  280. C_con_fcon(p->em_string, p->em_size);
  281. break;
  282. default:
  283. C_error = "Illegal argument type";
  284. return;
  285. }
  286. break;
  287. case ps_rom:
  288. switch(p->em_argtype) {
  289. case ilb_ptyp:
  290. C_rom_ilb(p->em_ilb);
  291. break;
  292. case nof_ptyp:
  293. C_rom_dlb(p->em_dlb, p->em_off);
  294. break;
  295. case sof_ptyp:
  296. C_rom_dnam(p->em_dnam, p->em_off);
  297. break;
  298. case cst_ptyp:
  299. C_rom_cst(p->em_cst);
  300. break;
  301. case pro_ptyp:
  302. C_rom_pnam(p->em_pnam);
  303. break;
  304. case str_ptyp:
  305. C_rom_scon(p->em_string, p->em_size);
  306. break;
  307. case ico_ptyp:
  308. C_rom_icon(p->em_string, p->em_size);
  309. break;
  310. case uco_ptyp:
  311. C_rom_ucon(p->em_string, p->em_size);
  312. break;
  313. case fco_ptyp:
  314. C_rom_fcon(p->em_string, p->em_size);
  315. break;
  316. default:
  317. C_error = "Illegal argument type";
  318. return;
  319. }
  320. break;
  321. default:
  322. C_error = "Illegal pseudo instruction";
  323. break;
  324. }
  325. }