123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #include <stdlib.h>
- #include "em_code.h"
- #include "em_arith.h"
- #include "em_label.h"
- #include "../read_em/em_comp.h"
- #include "em_pseu.h"
- #include "em_flag.h"
- #include "em_ptyp.h"
- #include "em_private.h"
- /* $Id$ */
- static void arg(struct e_instr *p, int comma);
- static void pseudo(struct e_instr *p);
- extern char em_flag[];
- char *C_error;
- #define flags(pp) (em_flag[(pp)->em_opcode - sp_fmnem] & EM_PAR)
- struct e_instr * C_alloc()
- {
- static struct e_instr b;
- return &b;
- }
- int C_out(struct e_instr *p)
- {
- /* Generate EM-code from the e_instr structure "p"
- */
- switch(p->em_type) {
- case EM_MNEM:
- OP(p->em_opcode);
- if (flags(p) == PAR_B && p->em_argtype == cst_ptyp) {
- p->em_ilb = p->em_cst;
- p->em_argtype = ilb_ptyp;
- }
- if (flags(p) != PAR_NO) arg(p, 0);
- NL();
- break;
- case EM_PSEU:
- pseudo(p);
- break;
- case EM_STARTMES:
- PS(ps_mes);
- CST(p->em_cst);
- break;
- case EM_MESARG:
- arg(p, 1);
- break;
- case EM_ENDMES:
- CEND();
- NL();
- break;
- case EM_DEFILB:
- DFILB(p->em_ilb);
- NL();
- break;
- case EM_DEFDLB:
- DFDLB(p->em_dlb);
- NL();
- break;
- case EM_DEFDNAM:
- DFDNAM(p->em_dnam);
- NL();
- break;
- default:
- C_error = "Illegal EM line";
- return 0;
- }
- return 1;
- }
- static void arg(struct e_instr *p, int comma)
- {
- /* Output the argument of "p".
- */
- if (comma) COMMA();
- switch(p->em_argtype) {
- case 0:
- if (p->em_type == EM_MNEM && flags(p) != PAR_W) {
- abort();
- }
- CCEND();
- break;
- case ilb_ptyp:
- if (p->em_type == EM_MNEM) {
- CILB(p->em_ilb);
- }
- else {
- ILB(p->em_ilb);
- }
- break;
- case nof_ptyp:
- DOFF(p->em_dlb, p->em_off);
- break;
- case sof_ptyp:
- NOFF(p->em_dnam, p->em_off);
- break;
- case cst_ptyp:
- CST(p->em_cst);
- break;
- case pro_ptyp:
- PNAM(p->em_pnam);
- break;
- case str_ptyp:
- SCON(p->em_string, p->em_size);
- break;
- case ico_ptyp:
- WCON(sp_icon, p->em_string, p->em_size);
- break;
- case uco_ptyp:
- WCON(sp_ucon, p->em_string, p->em_size);
- break;
- case fco_ptyp:
- WCON(sp_fcon, p->em_string, p->em_size);
- break;
- default:
- abort();
- }
- }
- static void pseudo(struct e_instr *p)
- {
- PS(p->em_opcode);
- switch(p->em_opcode) {
- case ps_exc:
- CST(p->em_exc1);
- COMMA();
- CST(p->em_exc2);
- break;
- case ps_rom:
- case ps_con:
- arg(p, 0);
- CEND();
- break;
- case ps_bss:
- CST(EM_bsssize);
- arg(p, 1);
- COMMA();
- CST((arith) EM_bssinit);
- break;
- case ps_hol:
- CST(EM_holsize);
- arg(p, 1);
- COMMA();
- CST((arith) EM_holinit);
- break;
- case ps_pro:
- arg(p, 0);
- COMMA();
- if (p->em_nlocals != -1) CST(p->em_nlocals);
- else CCEND();
- break;
- case ps_end:
- if (p->em_argtype == 0) CCEND();
- else CST(p->em_cst);
- break;
- default:
- arg(p, 0);
- break;
- }
- NL();
- }
|