123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- /* $Id$ */
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- */
- /* makecalls: expand a datastructure as delivered by "EM_getline"
- into calls to the procedural interface.
- Exported routine:
- C_out
- */
- #define CODE_EXPANDER
- #define EXPORT
- #define PRIVATE static
- #include <em_spec.h>
- #include <em_mnem.h>
- #include <em_pseu.h>
- #include <em_flag.h>
- #include "em_ptyp.h"
- #include <em.h>
- #include <em_comp.h>
- #include <assert.h>
- extern char em_flag[]; /* One per EM instruction: indicates parameter kind */
- extern short em_ptyp[]; /* One per parameter kind: indicates parameter type */
- char *C_error;
- PRIVATE C_dopseudo();
- EXPORT int
- C_out(p)
- register struct e_instr *p;
- {
- C_error = 0;
- switch(p->em_type) {
- default:
- C_error = "Illegal EM line";
- break;
- case EM_MNEM:
- /* normal instruction */
- if ((em_flag[p->em_opcode-sp_fmnem] & EM_PAR) == PAR_W &&
- p->em_argtype == 0) {
- #include "C_mnem_narg"
- } else {
- #include "C_mnem"
- }
- break;
- case EM_DEFILB:
- /* defining occurrence of an instruction label */
- C_df_ilb(p->em_ilb);
- break;
- case EM_DEFDLB:
- /* defining occurrence of a global data label */
- C_df_dlb(p->em_dlb);
- break;
- case EM_DEFDNAM:
- /* defining occurrence of a non-numeric data label */
- C_df_dnam(p->em_dnam);
- break;
- case EM_PSEU:
- /* pseudo */
- C_dopseudo(p);
- break;
- case EM_STARTMES:
- /* start of a MES pseudo */
- C_mes_begin((int) (p->em_cst));
- break;
- case EM_MESARG:
- switch(p->em_argtype) {
- case ilb_ptyp:
- C_ilb(p->em_ilb);
- break;
- case nof_ptyp:
- C_dlb(p->em_dlb, p->em_off);
- break;
- case sof_ptyp:
- C_dnam(p->em_dnam, p->em_off);
- break;
- case cst_ptyp:
- C_cst(p->em_cst);
- break;
- case pro_ptyp:
- C_pnam(p->em_pnam);
- break;
- case str_ptyp:
- C_scon(p->em_string, p->em_size);
- break;
- case ico_ptyp:
- C_icon(p->em_string, p->em_size);
- break;
- case uco_ptyp:
- C_ucon(p->em_string, p->em_size);
- break;
- case fco_ptyp:
- C_fcon(p->em_string, p->em_size);
- break;
- default:
- C_error = "Illegal argument type";
- break;
- }
- break;
- case EM_ENDMES:
- C_mes_end();
- break;
- }
- if (C_error) return 0;
- return 1;
- }
- PRIVATE
- C_dopseudo(p)
- register struct e_instr *p;
- {
- switch(p->em_opcode) {
- case ps_exc: {
- C_error = "EXC not allowed";
- break;
- }
- case ps_hol: {
- switch(p->em_argtype) {
- case cst_ptyp:
- C_hol_cst(EM_holsize,
- p->em_cst,
- EM_holinit);
- break;
- case ico_ptyp:
- C_hol_icon(EM_holsize,
- p->em_string,
- p->em_size,
- EM_holinit);
- break;
- case uco_ptyp:
- C_hol_ucon(EM_holsize,
- p->em_string,
- p->em_size,
- EM_holinit);
- break;
- case fco_ptyp:
- C_hol_fcon(EM_holsize,
- p->em_string,
- p->em_size,
- EM_holinit);
- break;
- case sof_ptyp:
- C_hol_dnam(EM_holsize,
- p->em_dnam,
- p->em_off,
- EM_holinit);
- break;
- case nof_ptyp:
- C_hol_dlb(EM_holsize,
- p->em_dlb,
- p->em_off,
- EM_holinit);
- break;
- case ilb_ptyp:
- C_hol_ilb(EM_holsize,
- p->em_ilb,
- EM_holinit);
- break;
- case pro_ptyp:
- C_hol_pnam(EM_holsize,
- p->em_pnam,
- EM_holinit);
- break;
- default:
- C_error = "Illegal parameter type";
- break;
- }
- break;
- }
- case ps_bss: {
- switch(p->em_argtype) {
- case cst_ptyp:
- C_bss_cst(EM_bsssize,
- p->em_cst,
- EM_bssinit);
- break;
- case ico_ptyp:
- C_bss_icon(EM_bsssize,
- p->em_string,
- p->em_size,
- EM_bssinit);
- break;
- case uco_ptyp:
- C_bss_ucon(EM_bsssize,
- p->em_string,
- p->em_size,
- EM_bssinit);
- break;
- case fco_ptyp:
- C_bss_fcon(EM_bsssize,
- p->em_string,
- p->em_size,
- EM_bssinit);
- break;
- case sof_ptyp:
- C_bss_dnam(EM_bsssize,
- p->em_dnam,
- p->em_off,
- EM_bssinit);
- break;
- case nof_ptyp:
- C_bss_dlb(EM_bsssize,
- p->em_dlb,
- p->em_off,
- EM_bssinit);
- break;
- case ilb_ptyp:
- C_bss_ilb(EM_bsssize,
- p->em_ilb,
- EM_bssinit);
- break;
- case pro_ptyp:
- C_bss_pnam(EM_bsssize,
- p->em_pnam,
- EM_bssinit);
- break;
- default:
- C_error = "Illegal parameter type";
- break;
- }
- break;
- }
- case ps_end:
- if (p->em_argtype != 0) {
- C_end(p->em_cst);
- break;
- }
- C_end_narg();
- break;
- case ps_exa:
- case ps_ina:
- if (p->em_argtype == nof_ptyp) {
- if (p->em_opcode == ps_exa) {
- C_exa_dlb(p->em_dlb);
- }
- else C_ina_dlb(p->em_dlb);
- break;
- }
- if (p->em_opcode == ps_exa) {
- C_exa_dnam(p->em_dnam);
- }
- else C_ina_dnam(p->em_dnam);
- break;
- case ps_exp:
- C_exp(p->em_pnam);
- break;
- case ps_inp:
- C_inp(p->em_pnam);
- break;
- case ps_pro:
- if (p->em_nlocals >= 0) {
- C_pro(p->em_pnam, p->em_nlocals);
- }
- else C_pro_narg(p->em_pnam);
- break;
- case ps_con:
- switch(p->em_argtype) {
- case ilb_ptyp:
- C_con_ilb(p->em_ilb);
- break;
- case nof_ptyp:
- C_con_dlb(p->em_dlb, p->em_off);
- break;
- case sof_ptyp:
- C_con_dnam(p->em_dnam, p->em_off);
- break;
- case cst_ptyp:
- C_con_cst(p->em_cst);
- break;
- case pro_ptyp:
- C_con_pnam(p->em_pnam);
- break;
- case str_ptyp:
- C_con_scon(p->em_string, p->em_size);
- break;
- case ico_ptyp:
- C_con_icon(p->em_string, p->em_size);
- break;
- case uco_ptyp:
- C_con_ucon(p->em_string, p->em_size);
- break;
- case fco_ptyp:
- C_con_fcon(p->em_string, p->em_size);
- break;
- default:
- C_error = "Illegal argument type";
- return;
- }
- break;
- case ps_rom:
- switch(p->em_argtype) {
- case ilb_ptyp:
- C_rom_ilb(p->em_ilb);
- break;
- case nof_ptyp:
- C_rom_dlb(p->em_dlb, p->em_off);
- break;
- case sof_ptyp:
- C_rom_dnam(p->em_dnam, p->em_off);
- break;
- case cst_ptyp:
- C_rom_cst(p->em_cst);
- break;
- case pro_ptyp:
- C_rom_pnam(p->em_pnam);
- break;
- case str_ptyp:
- C_rom_scon(p->em_string, p->em_size);
- break;
- case ico_ptyp:
- C_rom_icon(p->em_string, p->em_size);
- break;
- case uco_ptyp:
- C_rom_ucon(p->em_string, p->em_size);
- break;
- case fco_ptyp:
- C_rom_fcon(p->em_string, p->em_size);
- break;
- default:
- C_error = "Illegal argument type";
- return;
- }
- break;
- default:
- C_error = "Illegal pseudo instruction";
- break;
- }
- }
|