19658Slinton /* Copyright (c) 1982 Regents of the University of California */ 29658Slinton 39684Slinton static char sccsid[] = "@(#)asm.c 1.2 12/15/82"; 49658Slinton 5*16606Ssam static char rcsid[] = "$Header: asm.c,v 1.3 84/03/27 10:19:36 linton Exp $"; 6*16606Ssam 79658Slinton /* 89658Slinton * Assembly language dependent symbol routines. 99658Slinton */ 109658Slinton 119658Slinton #include "defs.h" 129658Slinton #include "symbols.h" 139658Slinton #include "asm.h" 149658Slinton #include "languages.h" 159658Slinton #include "tree.h" 169658Slinton #include "eval.h" 179658Slinton #include "operators.h" 189658Slinton #include "mappings.h" 199658Slinton #include "process.h" 209658Slinton #include "runtime.h" 219658Slinton #include "machine.h" 229658Slinton 239658Slinton #define isdouble(range) ( \ 249658Slinton range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ 259658Slinton ) 269658Slinton 279658Slinton /* 289658Slinton * Initialize assembly language information. 299658Slinton */ 309658Slinton 319658Slinton public asm_init() 329658Slinton { 339658Slinton Language lang; 349658Slinton 359658Slinton lang = language_define("assembler", ".s"); 369658Slinton language_setop(lang, L_PRINTDECL, asm_printdecl); 379658Slinton language_setop(lang, L_PRINTVAL, asm_printval); 389658Slinton language_setop(lang, L_TYPEMATCH, asm_typematch); 39*16606Ssam language_setop(lang, L_HASMODULES, asm_hasmodules); 40*16606Ssam language_setop(lang, L_PASSADDR, asm_passaddr); 419658Slinton } 429658Slinton 439658Slinton /* 449658Slinton * Test if two types are compatible. 459658Slinton */ 469658Slinton 479658Slinton public Boolean asm_typematch(type1, type2) 489658Slinton Symbol type1, type2; 499658Slinton { 509658Slinton Boolean b; 519658Slinton 529658Slinton b = false; 539658Slinton return b; 549658Slinton } 559658Slinton 569658Slinton public asm_printdecl(s) 579658Slinton Symbol s; 589658Slinton { 599658Slinton switch (s->class) { 609658Slinton case VAR: 619658Slinton case REF: 629658Slinton printf("&%s = 0x%x", symname(s), s->symvalue.offset); 639658Slinton break; 649658Slinton 659658Slinton case PROC: 669658Slinton case FUNC: 679658Slinton printf("%s (0x%x):", symname(s), codeloc(s)); 689658Slinton break; 699658Slinton 709658Slinton default: 719658Slinton error("class %s in c_printdecl", classname(s)); 729658Slinton } 739658Slinton putchar('\n'); 749658Slinton } 759658Slinton 769658Slinton /* 779658Slinton * Print out the value on the top of the expression stack 789658Slinton * in the format for the type of the given symbol. 799658Slinton */ 809658Slinton 819658Slinton public asm_printval(s) 829658Slinton register Symbol s; 839658Slinton { 849658Slinton register Symbol t; 859658Slinton register Integer len; 869658Slinton 879658Slinton switch (s->class) { 889658Slinton case ARRAY: 899658Slinton t = rtype(s->type); 909658Slinton if (t->class == RANGE and istypename(t->type, "$char")) { 919658Slinton len = size(s); 929658Slinton sp -= len; 939658Slinton printf("\"%.*s\"", len, sp); 949658Slinton } else { 959658Slinton printarray(s); 969658Slinton } 979658Slinton break; 989658Slinton 999658Slinton default: 1009658Slinton printf("0x%x", pop(Integer)); 1019658Slinton break; 1029658Slinton } 1039658Slinton } 104*16606Ssam 105*16606Ssam public boolean asm_hasmodules () 106*16606Ssam { 107*16606Ssam return false; 108*16606Ssam } 109*16606Ssam 110*16606Ssam public boolean asm_passaddr (param, exprtype) 111*16606Ssam Symbol param, exprtype; 112*16606Ssam { 113*16606Ssam return false; 114*16606Ssam } 115