/* Copyright (c) 1982 Regents of the University of California */ static char sccsid[] = "@(#)asm.c 1.2 12/15/82"; /* * Assembly language dependent symbol routines. */ #include "defs.h" #include "symbols.h" #include "asm.h" #include "languages.h" #include "tree.h" #include "eval.h" #include "operators.h" #include "mappings.h" #include "process.h" #include "runtime.h" #include "machine.h" #define isdouble(range) ( \ range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ ) /* * Initialize assembly language information. */ public asm_init() { Language lang; lang = language_define("assembler", ".s"); language_setop(lang, L_PRINTDECL, asm_printdecl); language_setop(lang, L_PRINTVAL, asm_printval); language_setop(lang, L_TYPEMATCH, asm_typematch); } /* * Test if two types are compatible. */ public Boolean asm_typematch(type1, type2) Symbol type1, type2; { Boolean b; b = false; return b; } public asm_printdecl(s) Symbol s; { switch (s->class) { case VAR: case REF: printf("&%s = 0x%x", symname(s), s->symvalue.offset); break; case PROC: case FUNC: printf("%s (0x%x):", symname(s), codeloc(s)); break; default: error("class %s in c_printdecl", classname(s)); } putchar('\n'); } /* * Print out the value on the top of the expression stack * in the format for the type of the given symbol. */ public asm_printval(s) register Symbol s; { register Symbol t; register Integer len; switch (s->class) { case ARRAY: t = rtype(s->type); if (t->class == RANGE and istypename(t->type, "$char")) { len = size(s); sp -= len; printf("\"%.*s\"", len, sp); } else { printarray(s); } break; default: printf("0x%x", pop(Integer)); break; } }