mirror of
https://github.com/Museum-of-Art-and-Digital-Entertainment/macross.git
synced 2024-11-26 22:51:04 +00:00
630 lines
23 KiB
C
630 lines
23 KiB
C
/*
|
|
* Copyright (c) 1987 Fujitsu
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
/*
|
|
macrossTables.c -- Define the contents of various tables and values
|
|
of various initialized global variables.
|
|
|
|
Chip Morningstar -- Lucasfilm Ltd.
|
|
|
|
5-November-1984
|
|
*/
|
|
|
|
#include "macrossTypes.h"
|
|
#include "y.tab.h"
|
|
|
|
/* All those NULLs are used to string together lists after this all gets
|
|
hashed */
|
|
conditionTableEntryType theConditions[] = {
|
|
"always", NULL, ALWAYS_COND,
|
|
"carry", NULL, CARRY_COND,
|
|
"equal", NULL, EQUAL_COND,
|
|
"geq", NULL, GEQ_COND,
|
|
"greater", NULL, GT_COND,
|
|
"gt", NULL, GT_COND,
|
|
"high", NULL, HIGH_COND,
|
|
"high_same", NULL, NOT_CARRY_COND,
|
|
"hs", NULL, NOT_CARRY_COND,
|
|
"less", NULL, LT_COND,
|
|
"leq", NULL, LEQ_COND,
|
|
"low", NULL, CARRY_COND,
|
|
"low_same", NULL, LOW_OR_SAME_COND,
|
|
"ls", NULL, LOW_OR_SAME_COND,
|
|
"lt", NULL, LT_COND,
|
|
"minus", NULL, MINUS_COND,
|
|
"negative", NULL, MINUS_COND,
|
|
"neq", NULL, NOT_EQUAL_COND,
|
|
"never", NULL, NEVER_COND,
|
|
"not_carry", NULL, NOT_CARRY_COND, /* for dragon */
|
|
"not_equal", NULL, NOT_EQUAL_COND, /* for dragon */
|
|
"not_overflow", NULL, NOT_OVERFLOW_COND, /* for dragon */
|
|
"not_zero", NULL, NOT_EQUAL_COND, /* for dragon */
|
|
"overflow", NULL, OVERFLOW_COND,
|
|
"plus", NULL, PLUS_COND,
|
|
"positive", NULL, PLUS_COND,
|
|
"zero", NULL, EQUAL_COND,
|
|
NULL, NULL, NEVER_COND,
|
|
};
|
|
|
|
/* All those NULLs are used to string together lists after this all gets
|
|
hashed */
|
|
keywordTableEntryType theKeywords[] = {
|
|
"a0", NULL, A0,
|
|
"a1", NULL, A1,
|
|
"a2", NULL, A2,
|
|
"a3", NULL, A3,
|
|
"a4", NULL, A4,
|
|
"a5", NULL, A5,
|
|
"a6", NULL, A6,
|
|
"a7", NULL, A7,
|
|
"align", NULL, ALIGN,
|
|
"assert", NULL, ASSERT,
|
|
"block", NULL, BLOCK,
|
|
"byte", NULL, BYTE,
|
|
"cc", NULL, CCR,
|
|
"ccr", NULL, CCR,
|
|
"constrain", NULL, CONSTRAIN,
|
|
"d0", NULL, D0,
|
|
"d1", NULL, D1,
|
|
"d2", NULL, D2,
|
|
"d3", NULL, D3,
|
|
"d4", NULL, D4,
|
|
"d5", NULL, D5,
|
|
"d6", NULL, D6,
|
|
"d7", NULL, D7,
|
|
"dbyte", NULL, DBYTE,
|
|
"define", NULL, DEFINE,
|
|
"dfc", NULL, DFC,
|
|
"do", NULL, DO,
|
|
"else", NULL, ELSE,
|
|
"elseif", NULL, ELSEIF,
|
|
"extern", NULL, EXTERN,
|
|
"freturn", NULL, FRETURN,
|
|
"function", NULL, FUNCTION,
|
|
"here", NULL, HERE,
|
|
"if", NULL, IF,
|
|
"include", NULL, INCLUDE,
|
|
"l", NULL, L,
|
|
"long", NULL, LONG,
|
|
"macro", NULL, MACRO,
|
|
"mcase", NULL, MCASE,
|
|
"mdefault", NULL, MDEFAULT,
|
|
"mdefine", NULL, MDEFINE,
|
|
"mdo", NULL, MDO,
|
|
"melse", NULL, MELSE,
|
|
"melseif", NULL, MELSEIF,
|
|
"mfor", NULL, MFOR,
|
|
"mif", NULL, MIF,
|
|
"mswitch", NULL, MSWITCH,
|
|
"muntil", NULL, MUNTIL,
|
|
"mvariable", NULL, MVARIABLE,
|
|
"mwhile", NULL, MWHILE,
|
|
"org", NULL, ORG,
|
|
"pc", NULL, PC,
|
|
"rel", NULL, REL,
|
|
"sfc", NULL, SFC,
|
|
"sr", NULL, SR,
|
|
"start", NULL, START,
|
|
"string", NULL, STRING,
|
|
"struct", NULL, STRUCT,
|
|
"target", NULL, TARGET,
|
|
"undefine", NULL, UNDEFINE,
|
|
"until", NULL, UNTIL,
|
|
"usp", NULL, USP,
|
|
"variable", NULL, VARIABLE,
|
|
"vbr", NULL, VBR,
|
|
"w", NULL, W,
|
|
"while", NULL, WHILE,
|
|
"word", NULL, WORD,
|
|
NULL, NULL, 0,
|
|
};
|
|
|
|
#define HASH_TABLE_SIZE 509
|
|
|
|
macroTableEntryType *macroTable[HASH_TABLE_SIZE];
|
|
|
|
opcodeTableEntryType *opcodeTable[HASH_TABLE_SIZE];
|
|
|
|
symbolTableEntryType *symbolTable[HASH_TABLE_SIZE];
|
|
|
|
keywordTableEntryType *keywordTable[HASH_TABLE_SIZE];
|
|
|
|
conditionTableEntryType *conditionTable[HASH_TABLE_SIZE];
|
|
|
|
/* All those NULLs are used to string together lists after this all gets
|
|
hashed. */
|
|
opcodeTableEntryType theOpcodes[] = {
|
|
/* mnemonic, next, opcode, class, allowed modes, min#operands, max#operands,
|
|
subclass/alternate opcode */
|
|
"abcd", NULL, 0xC100, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"addb", NULL, 0xD000, CLASS_II, CLASS_II_BITS, 2, 2, 0x0600,
|
|
"addl", NULL, 0xD080, CLASS_II, CLASS_II_BITS, 2, 2, 0x0680,
|
|
"addqb",NULL, 0x5000, CLASS_III, CLASS_III_BITS, 2, 2, 0,
|
|
"addql",NULL, 0x5080, CLASS_III, CLASS_III_BITS, 2, 2, 0,
|
|
"addqw",NULL, 0x5040, CLASS_III, CLASS_III_BITS, 2, 2, 0,
|
|
"addw", NULL, 0xD040, CLASS_II, CLASS_II_BITS, 2, 2, 0x0640,
|
|
"addxb",NULL, 0xD100, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"addxl",NULL, 0xD180, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"addxw",NULL, 0xD140, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"andb", NULL, 0xC000, CLASS_IV, CLASS_IV_BITS, 2, 2, 0x0200,
|
|
"andl", NULL, 0xC080, CLASS_IV, CLASS_IV_BITS, 2, 2, 0x0280,
|
|
"andw", NULL, 0xC040, CLASS_IV, CLASS_IV_BITS, 2, 2, 0x0240,
|
|
"aslb", NULL, 0xE100, CLASS_V, CLASS_V_BITS, 1, 2, 00,
|
|
"asll", NULL, 0xE180, CLASS_V, CLASS_V_BITS, 1, 2, 00,
|
|
"aslw", NULL, 0xE140, CLASS_V, CLASS_V_BITS, 1, 2, 00,
|
|
"asrb", NULL, 0xE000, CLASS_V, CLASS_V_BITS, 1, 2, 00,
|
|
"asrl", NULL, 0xE080, CLASS_V, CLASS_V_BITS, 1, 2, 00,
|
|
"asrw", NULL, 0xE040, CLASS_V, CLASS_V_BITS, 1, 2, 00,
|
|
"bcc", NULL, 0x64, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bchg", NULL, 0x0040, CLASS_VII, CLASS_VII_BITS, 2, 2, 0,
|
|
"bclr", NULL, 0x0080, CLASS_VII, CLASS_VII_BITS, 2, 2, 0,
|
|
"bcs", NULL, 0x65, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"beq", NULL, 0x67, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bge", NULL, 0x6C, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bgt", NULL, 0x6E, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bhi", NULL, 0x62, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"ble", NULL, 0x6F, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bls", NULL, 0x63, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"blt", NULL, 0x6D, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bmi", NULL, 0x6B, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bne", NULL, 0x66, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bpl", NULL, 0x6A, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bra", NULL, 0x60, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bset", NULL, 0x00C0, CLASS_VII, CLASS_VII_BITS, 2, 2, 0,
|
|
"bsr", NULL, 0x61, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"btst", NULL, 0x0000, CLASS_VII, CLASS_VII_BITS, 2, 2, 0,
|
|
"bvc", NULL, 0x68, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"bvs", NULL, 0x69, CLASS_VI, CLASS_VI_BITS, 1, 1, 0,
|
|
"chk", NULL, 0x4180, CLASS_VIII, CLASS_VIII_BITS,2, 2, 0,
|
|
"clrb", NULL, 0x4200, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"clrl", NULL, 0x4280, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"clrw", NULL, 0x4240, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"cmpb", NULL, 0x0000, CLASS_X, CLASS_X_BITS, 2, 2, 0x0000,
|
|
"cmpl", NULL, 0x0080, CLASS_X, CLASS_X_BITS, 2, 2, 0xB1C0,
|
|
"cmpmb",NULL, 0xB108, CLASS_XI, CLASS_XI_BITS, 2, 2, 0,
|
|
"cmpml",NULL, 0xB188, CLASS_XI, CLASS_XI_BITS, 2, 2, 0,
|
|
"cmpmw",NULL, 0xB148, CLASS_XI, CLASS_XI_BITS, 2, 2, 0,
|
|
"cmpw", NULL, 0x0040, CLASS_X, CLASS_X_BITS, 2, 2, 0xB0C0,
|
|
"dbcc", NULL, 0x54C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbcs", NULL, 0x55C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbeq", NULL, 0x57C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbf", NULL, 0x51C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbge", NULL, 0x5CC8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbgt", NULL, 0x5EC8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbhi", NULL, 0x52C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dble", NULL, 0x5FC8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbls", NULL, 0x53C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dblt", NULL, 0x5DC8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbmi", NULL, 0x5BC8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbne", NULL, 0x56C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbpl", NULL, 0x5BC8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbra", NULL, 0x50C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbt", NULL, 0x50C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbvc", NULL, 0x58C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"dbvs", NULL, 0x59C8, CLASS_XII, CLASS_XII_BITS, 2, 2, 0,
|
|
"divs", NULL, 0x81C0, CLASS_VIII, CLASS_VIII_BITS,2, 2, 0,
|
|
"divu", NULL, 0x80C0, CLASS_VIII, CLASS_VIII_BITS,2, 2, 0,
|
|
"eorb", NULL, 0xB100, CLASS_XIII, CLASS_XIII_BITS,2, 2, 0x0A00,
|
|
"eorl", NULL, 0xB180, CLASS_XIII, CLASS_XIII_BITS,2, 2, 0x0A80,
|
|
"eorw", NULL, 0xB140, CLASS_XIII, CLASS_XIII_BITS,2, 2, 0x0A40,
|
|
"exg", NULL, 0xC100, CLASS_XIV, CLASS_XIV_BITS, 2, 2, 0,
|
|
"extl", NULL, 0x48C0, CLASS_XV, CLASS_XV_BITS, 1, 1, 0,
|
|
"extw", NULL, 0x4880, CLASS_XV, CLASS_XV_BITS, 1, 1, 0,
|
|
"illegal",NULL, 0x4AFC, CLASS_XVI, CLASS_XVI_BITS, 0, 0, 0,
|
|
"jmp", NULL, 0x4EC0, CLASS_XVII, CLASS_XVII_BITS,1, 1, 0,
|
|
"jsr", NULL, 0x4E80, CLASS_XVII, CLASS_XVII_BITS,1, 1, 0,
|
|
"lea", NULL, 0x41C0, CLASS_XVIII, CLASS_XVIII_BITS,2, 2, 0,
|
|
"link", NULL, 0x4E50, CLASS_XIX, CLASS_XIX_BITS, 2, 2, 0,
|
|
"lslb", NULL, 0xE100, CLASS_V, CLASS_V_BITS, 1, 2, 01,
|
|
"lsll", NULL, 0xE180, CLASS_V, CLASS_V_BITS, 1, 2, 01,
|
|
"lslw", NULL, 0xE140, CLASS_V, CLASS_V_BITS, 1, 2, 01,
|
|
"lsrb", NULL, 0xE000, CLASS_V, CLASS_V_BITS, 1, 2, 01,
|
|
"lsrl", NULL, 0xE080, CLASS_V, CLASS_V_BITS, 1, 2, 01,
|
|
"lsrw", NULL, 0xE040, CLASS_V, CLASS_V_BITS, 1, 2, 01,
|
|
"movb", NULL, 0x1000, CLASS_XX, CLASS_XX_BITS, 2, 2, 0x0000,
|
|
"moveb",NULL, 0x1000, CLASS_XX, CLASS_XX_BITS, 2, 2, 0x0000,
|
|
"movel",NULL, 0x2000, CLASS_XX, CLASS_XX_BITS, 2, 2, 0x2040,
|
|
"moveml",NULL, 0x48C0, CLASS_XXI, CLASS_XXI_BITS, 2, 17, 0,
|
|
"movemw",NULL, 0x4880, CLASS_XXI, CLASS_XXI_BITS, 2, 17, 0,
|
|
"movepl",NULL, 0x0148, CLASS_XXII, CLASS_XXII_BITS,2, 2, 0,
|
|
"movepw",NULL, 0x0108, CLASS_XXII, CLASS_XXII_BITS,2, 2, 0,
|
|
"moveq",NULL, 0x70, CLASS_XXIII, CLASS_XXIII_BITS,2, 2, 0,
|
|
"movesb",NULL, 0x0E00, CLASS_XXIV, CLASS_XXIV_BITS,2, 2, 0,
|
|
"movesl",NULL, 0x0E80, CLASS_XXIV, CLASS_XXIV_BITS,2, 2, 0,
|
|
"movesw",NULL, 0x0E40, CLASS_XXIV, CLASS_XXIV_BITS,2, 2, 0,
|
|
"movew",NULL, 0x3000, CLASS_XX, CLASS_XX_BITS, 2, 2, 0x3040,
|
|
"movl", NULL, 0x2000, CLASS_XX, CLASS_XX_BITS, 2, 2, 0x2040,
|
|
"movml",NULL, 0x48C0, CLASS_XXI, CLASS_XXI_BITS, 2, 17, 0,
|
|
"movmw",NULL, 0x4880, CLASS_XXI, CLASS_XXI_BITS, 2, 17, 0,
|
|
"movpl",NULL, 0x0148, CLASS_XXII, CLASS_XXII_BITS,2, 2, 0,
|
|
"movpw",NULL, 0x0108, CLASS_XXII, CLASS_XXII_BITS,2, 2, 0,
|
|
"movq", NULL, 0x70, CLASS_XXIII, CLASS_XXIII_BITS,2, 2, 0,
|
|
"movsb",NULL, 0x0E00, CLASS_XXIV, CLASS_XXIV_BITS,2, 2, 0,
|
|
"movsl",NULL, 0x0E80, CLASS_XXIV, CLASS_XXIV_BITS,2, 2, 0,
|
|
"movsw",NULL, 0x0E40, CLASS_XXIV, CLASS_XXIV_BITS,2, 2, 0,
|
|
"movw", NULL, 0x3000, CLASS_XX, CLASS_XX_BITS, 2, 2, 0x3040,
|
|
"muls", NULL, 0xC1C0, CLASS_VIII, CLASS_VIII_BITS,2, 2, 0,
|
|
"mulu", NULL, 0xC0C0, CLASS_VIII, CLASS_VIII_BITS,2, 2, 0,
|
|
"nbcd", NULL, 0x4800, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"negb", NULL, 0x4400, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"negl", NULL, 0x4480, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"negw", NULL, 0x4440, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"negxb",NULL, 0x4000, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"negxl",NULL, 0x4080, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"negxw",NULL, 0x4040, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"nop", NULL, 0x4E71, CLASS_XVI, CLASS_XVI_BITS, 0, 0, 0,
|
|
"notb", NULL, 0x4600, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"notl", NULL, 0x4680, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"notw", NULL, 0x4640, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"orb", NULL, 0x8000, CLASS_IV, CLASS_IV_BITS, 2, 2, 0x0000,
|
|
"orl", NULL, 0x8080, CLASS_IV, CLASS_IV_BITS, 2, 2, 0x0080,
|
|
"orw", NULL, 0x8040, CLASS_IV, CLASS_IV_BITS, 2, 2, 0x0040,
|
|
"pea", NULL, 0x4840, CLASS_XVII, CLASS_XVII_BITS,1, 1, 0,
|
|
"reset",NULL, 0x4E70, CLASS_XVI, CLASS_XVI_BITS, 0, 0, 0,
|
|
"rolb", NULL, 0xE100, CLASS_V, CLASS_V_BITS, 1, 2, 02,
|
|
"roll", NULL, 0xE180, CLASS_V, CLASS_V_BITS, 1, 2, 02,
|
|
"rolw", NULL, 0xE140, CLASS_V, CLASS_V_BITS, 1, 2, 02,
|
|
"rorb", NULL, 0xE000, CLASS_V, CLASS_V_BITS, 1, 2, 02,
|
|
"rorl", NULL, 0xE080, CLASS_V, CLASS_V_BITS, 1, 2, 02,
|
|
"rorw", NULL, 0xE040, CLASS_V, CLASS_V_BITS, 1, 2, 02,
|
|
"roxlb",NULL, 0xE100, CLASS_V, CLASS_V_BITS, 1, 2, 03,
|
|
"roxll",NULL, 0xE180, CLASS_V, CLASS_V_BITS, 1, 2, 03,
|
|
"roxlw",NULL, 0xE140, CLASS_V, CLASS_V_BITS, 1, 2, 03,
|
|
"roxrb",NULL, 0xE000, CLASS_V, CLASS_V_BITS, 1, 2, 03,
|
|
"roxrl",NULL, 0xE080, CLASS_V, CLASS_V_BITS, 1, 2, 03,
|
|
"roxrw",NULL, 0xE040, CLASS_V, CLASS_V_BITS, 1, 2, 03,
|
|
"rtd", NULL, 0x4E74, CLASS_XXV, CLASS_XXV_BITS, 1, 1, 0,
|
|
"rte", NULL, 0x4E73, CLASS_XVI, CLASS_XVI_BITS, 0, 0, 0,
|
|
"rtr", NULL, 0x4E77, CLASS_XVI, CLASS_XVI_BITS, 0, 0, 0,
|
|
"rts", NULL, 0x4E75, CLASS_XVI, CLASS_XVI_BITS, 0, 0, 0,
|
|
"sbcd", NULL, 0x8100, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"scc", NULL, 0x54C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"scs", NULL, 0x55C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"seq", NULL, 0x57C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"sf", NULL, 0x51C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"sge", NULL, 0x5CC0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"sgt", NULL, 0x5EC0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"shi", NULL, 0x52C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"sle", NULL, 0x5FC0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"sls", NULL, 0x53C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"slt", NULL, 0x5DC0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"smi", NULL, 0x5BC0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"sne", NULL, 0x56C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"spl", NULL, 0x5AC0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"st", NULL, 0x50C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"stop", NULL, 0x4E72, CLASS_XXVII, CLASS_XXVII_BITS,1, 1, 0,
|
|
"subb", NULL, 0x9000, CLASS_II, CLASS_II_BITS, 2, 2, 0x0400,
|
|
"subl", NULL, 0x9080, CLASS_II, CLASS_II_BITS, 2, 2, 0x0480,
|
|
"subqb",NULL, 0x5100, CLASS_III, CLASS_III_BITS, 2, 2, 0,
|
|
"subql",NULL, 0x5180, CLASS_III, CLASS_III_BITS, 2, 2, 0,
|
|
"subqw",NULL, 0x5140, CLASS_III, CLASS_III_BITS, 2, 2, 0,
|
|
"subw", NULL, 0x9040, CLASS_II, CLASS_II_BITS, 2, 2, 0x0440,
|
|
"subxb",NULL, 0x9100, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"subxl",NULL, 0x9180, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"subxw",NULL, 0x9140, CLASS_I, CLASS_I_BITS, 2, 2, 0,
|
|
"svc", NULL, 0x58C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"svs", NULL, 0x59C0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"swap", NULL, 0x4840, CLASS_XV, CLASS_XV_BITS, 1, 1, 0,
|
|
"tas", NULL, 0x4AC0, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"trap", NULL, 0x4E40, CLASS_XXVIII, CLASS_XXVIII_BITS,1,1, 0,
|
|
"trapv",NULL, 0x4E76, CLASS_XVI, CLASS_XVI_BITS, 0, 0, 0,
|
|
"tstb", NULL, 0x4A00, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"tstl", NULL, 0x4A80, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"tstw", NULL, 0x4A40, CLASS_IX, CLASS_IX_BITS, 1, 1, 0,
|
|
"unlk", NULL, 0x4E58, CLASS_XXVI, CLASS_XXVI_BITS,1, 1, 0,
|
|
NULL, NULL, 0x0000, CLASS_XVI, 0, 0, 0, 0,
|
|
};
|
|
|
|
int operandClassTable[] = { /* indexed by operandKindType */
|
|
EXPRESSION_OPND_BIT,
|
|
STRING_OPND_BIT,
|
|
BLOCK_OPND_BIT,
|
|
D_REGISTER_OPND_BIT,
|
|
A_REGISTER_OPND_BIT,
|
|
A_REGISTER_INDIRECT_OPND_BIT,
|
|
POSTINCREMENT_OPND_BIT,
|
|
PREDECREMENT_OPND_BIT,
|
|
DISPLACEMENT_OPND_BIT,
|
|
INDEXED_OPND_BIT,
|
|
PC_DISPLACEMENT_OPND_BIT,
|
|
PC_INDEXED_OPND_BIT,
|
|
IMMEDIATE_OPND_BIT,
|
|
ABSOLUTE_SHORT_OPND_BIT,
|
|
ABSOLUTE_LONG_OPND_BIT,
|
|
CC_REGISTER_OPND_BIT,
|
|
STATUS_REGISTER_OPND_BIT,
|
|
USP_REGISTER_OPND_BIT,
|
|
CONTROL_REGISTER_OPND_BIT,
|
|
SELECTED_OPND_BIT,
|
|
INDEX_SELECTED_OPND_BIT,
|
|
};
|
|
|
|
int actionsClassI();
|
|
int actionsClassII();
|
|
int actionsClassIII();
|
|
int actionsClassIV();
|
|
int actionsClassV();
|
|
int actionsClassVI();
|
|
int actionsClassVII();
|
|
int actionsClassVIII();
|
|
int actionsClassIX();
|
|
int actionsClassX();
|
|
int actionsClassXI();
|
|
int actionsClassXII();
|
|
int actionsClassXIII();
|
|
int actionsClassXIV();
|
|
int actionsClassXV();
|
|
int actionsClassXVI();
|
|
int actionsClassXVII();
|
|
int actionsClassXVIII();
|
|
int actionsClassXIX();
|
|
int actionsClassXX();
|
|
int actionsClassXXI();
|
|
int actionsClassXXII();
|
|
int actionsClassXXIII();
|
|
int actionsClassXXIV();
|
|
int actionsClassXXV();
|
|
int actionsClassXXVI();
|
|
int actionsClassXXVII();
|
|
int actionsClassXXVIII();
|
|
|
|
/* indexed by opcodeClass */
|
|
int (*instructionActionTable[])() = {
|
|
actionsClassI,
|
|
actionsClassII,
|
|
actionsClassIII,
|
|
actionsClassIV,
|
|
actionsClassV,
|
|
actionsClassVI,
|
|
actionsClassVII,
|
|
actionsClassVIII,
|
|
actionsClassIX,
|
|
actionsClassX,
|
|
actionsClassXI,
|
|
actionsClassXII,
|
|
actionsClassXIII,
|
|
actionsClassXIV,
|
|
actionsClassXV,
|
|
actionsClassXVI,
|
|
actionsClassXVII,
|
|
actionsClassXVIII,
|
|
actionsClassXIX,
|
|
actionsClassXX,
|
|
actionsClassXXI,
|
|
actionsClassXXII,
|
|
actionsClassXXIII,
|
|
actionsClassXXIV,
|
|
actionsClassXXV,
|
|
actionsClassXXVI,
|
|
actionsClassXXVII,
|
|
actionsClassXXVIII,
|
|
};
|
|
|
|
/* indexed by symbolUsageKindType */
|
|
int validSymbolValues[NUM_OF_SYM_USAGES] = {
|
|
/* STRUCT_NAME_SYMBOL */ STRUCT_VALUE_BIT,
|
|
/* STRUCT_FIELD_SYMBOL */ FIELD_VALUE_BIT,
|
|
/* MACRO_SYMBOL */ MACRO_VALUE_BIT,
|
|
/* ARGUMENT_SYMBOL */ OPERAND_VALUE_BIT,
|
|
/* LABEL_SYMBOL */ ABSOLUTE_VALUE_BIT | RELOCATABLE_VALUE_BIT |
|
|
DATA_VALUE_BIT | BSS_VALUE_BIT,
|
|
/* EXTERNAL_SYMBOL */ ABSOLUTE_VALUE_BIT | RELOCATABLE_VALUE_BIT |
|
|
DATA_VALUE_BIT | BSS_VALUE_BIT |
|
|
UNDEFINED_VALUE_BIT,
|
|
/* VARIABLE_SYMBOL */ ABSOLUTE_VALUE_BIT | RELOCATABLE_VALUE_BIT |
|
|
DATA_VALUE_BIT | BSS_VALUE_BIT |
|
|
UNDEFINED_VALUE_BIT |
|
|
STRING_VALUE_BIT | OPERAND_VALUE_BIT |
|
|
CONDITION_VALUE_BIT,
|
|
/* MVARIABLE_SYMBOL */ ABSOLUTE_VALUE_BIT | RELOCATABLE_VALUE_BIT |
|
|
DATA_VALUE_BIT | BSS_VALUE_BIT |
|
|
UNDEFINED_VALUE_BIT |
|
|
STRING_VALUE_BIT | OPERAND_VALUE_BIT |
|
|
CONDITION_VALUE_BIT,
|
|
/* UNKNOWN_SYMBOL */ UNDEFINED_VALUE_BIT,
|
|
/* FUNCTION_SYMBOL */ FUNCTION_VALUE_BIT,
|
|
/* BUILT_IN_FUNCTION_SYMBOL */ BUILT_IN_FUNCTION_VALUE_BIT,
|
|
/* NESTED_UNKNOWN_SYMBOL */ UNDEFINED_VALUE_BIT,
|
|
/* DEFINE_SYMBOL */ OPERAND_VALUE_BIT,
|
|
/* MDEFINE_SYMBOL */ OPERAND_VALUE_BIT,
|
|
/* UNKNOWN_FUNCTION_SYMBOL */ UNDEFINED_VALUE_BIT,
|
|
/* UNKNOWN_MACRO_SYMBOL */ UNDEFINED_VALUE_BIT,
|
|
};
|
|
|
|
/* indexed by valueKindType */
|
|
int valueBitTable[] = {
|
|
ABSOLUTE_VALUE_BIT,
|
|
DATA_VALUE_BIT,
|
|
RELOCATABLE_VALUE_BIT,
|
|
BSS_VALUE_BIT,
|
|
STRUCT_VALUE_BIT,
|
|
FIELD_VALUE_BIT,
|
|
MACRO_VALUE_BIT,
|
|
OPERAND_VALUE_BIT,
|
|
STRING_VALUE_BIT,
|
|
CONDITION_VALUE_BIT,
|
|
UNDEFINED_VALUE_BIT,
|
|
FUNCTION_VALUE_BIT,
|
|
BLOCK_VALUE_BIT,
|
|
BUILT_IN_FUNCTION_VALUE_BIT,
|
|
ARRAY_VALUE_BIT,
|
|
FAIL_BIT,
|
|
};
|
|
|
|
|
|
codeRegionType absoluteCodeRegion;
|
|
codeRegionType relocatableCodeRegion;
|
|
codeRegionType *codeRegions[2] = {
|
|
&absoluteCodeRegion,
|
|
&relocatableCodeRegion
|
|
};
|
|
|
|
/* A predefined undefined value so we don't have to make a new one every
|
|
time we need one */
|
|
valueType undefinedValueValue = { UNDEFINED_VALUE, 0,
|
|
EXPRESSION_OPND };
|
|
valueType *UndefinedValue = &undefinedValueValue;
|
|
|
|
valueType *addressModeBIF();
|
|
valueType *applyBIF();
|
|
valueType *atasciiBIF();
|
|
valueType *atasciiColorBIF();
|
|
valueType *debugModeOffBIF();
|
|
valueType *debugModeOnBIF();
|
|
valueType *emitModeOffBIF();
|
|
valueType *emitModeOnBIF();
|
|
valueType *getAddressRegisterBIF();
|
|
valueType *getDataRegisterBIF();
|
|
valueType *getIndexRegisterBIF();
|
|
valueType *getRegisterBIF();
|
|
valueType *getWLBIF();
|
|
valueType *isARegisterBIF();
|
|
valueType *isAbsoluteLongModeBIF();
|
|
valueType *isAbsoluteModeBIF();
|
|
valueType *isAbsoluteShortModeBIF();
|
|
valueType *isAbsoluteValueBIF();
|
|
valueType *isBlockBIF();
|
|
valueType *isBuiltInFunctionBIF();
|
|
valueType *isCCRegisterBIF();
|
|
valueType *isConditionCodeBIF();
|
|
valueType *isControlRegisterBIF();
|
|
valueType *isDFCRegisterBIF();
|
|
valueType *isDRegisterBIF();
|
|
valueType *isDefinedBIF();
|
|
valueType *isDisplacementModeBIF();
|
|
valueType *isExternalBIF();
|
|
valueType *isFieldBIF();
|
|
valueType *isFunctionBIF();
|
|
valueType *isImmediateModeBIF();
|
|
valueType *isIndexedModeBIF();
|
|
valueType *isIndirectModeBIF();
|
|
valueType *isPCDisplacementModeBIF();
|
|
valueType *isPCIndexedModeBIF();
|
|
valueType *isPostincrementModeBIF();
|
|
valueType *isPredecrementModeBIF();
|
|
valueType *isRelocatableValueBIF();
|
|
valueType *isSFCRegisterBIF();
|
|
valueType *isStatusRegisterBIF();
|
|
valueType *isStringBIF();
|
|
valueType *isStructBIF();
|
|
valueType *isSymbolBIF();
|
|
valueType *isUSPBIF();
|
|
valueType *isVBRegisterBIF();
|
|
valueType *listingOffBIF();
|
|
valueType *listingOnBIF();
|
|
valueType *nthCharBIF();
|
|
valueType *printfBIF();
|
|
valueType *strcatBIF();
|
|
valueType *strcmpBIF();
|
|
valueType *strcmplcBIF();
|
|
valueType *strlenBIF();
|
|
valueType *substrBIF();
|
|
valueType *symbolDefineBIF();
|
|
valueType *symbolLookupBIF();
|
|
valueType *symbolNameBIF();
|
|
valueType *symbolUsageBIF();
|
|
valueType *valueTypeBIF();
|
|
|
|
/* Used to initialize symbols representing built-in functions */
|
|
struct {
|
|
stringType *functionName;
|
|
valueType *(*functionEntry)();
|
|
bool isSpecialFunction;
|
|
} builtInFunctionTable[] = {
|
|
"addressMode", addressModeBIF, FALSE,
|
|
"apply", applyBIF, FALSE,
|
|
"atascii", atasciiBIF, FALSE,
|
|
"atasciiColor", atasciiColorBIF, FALSE,
|
|
"debugModeOff", debugModeOffBIF, FALSE,
|
|
"debugModeOn", debugModeOnBIF, FALSE,
|
|
"emitModeOff", emitModeOffBIF, FALSE,
|
|
"emitModeOn", emitModeOnBIF, FALSE,
|
|
"getAddressRegister", getAddressRegisterBIF, FALSE,
|
|
"getDataRegister", getDataRegisterBIF, FALSE,
|
|
"getIndexRegister", getIndexRegisterBIF, FALSE,
|
|
"getRegister", getRegisterBIF, FALSE,
|
|
"getWL", getWLBIF, FALSE,
|
|
"isARegister", isARegisterBIF, FALSE,
|
|
"isAbsoluteLongMode", isAbsoluteLongModeBIF, FALSE,
|
|
"isAbsoluteMode", isAbsoluteModeBIF, FALSE,
|
|
"isAbsoluteShortMode", isAbsoluteShortModeBIF, FALSE,
|
|
"isAbsoluteValue", isAbsoluteValueBIF, FALSE,
|
|
"isBlock", isBlockBIF, FALSE,
|
|
"isBuiltInFunction", isBuiltInFunctionBIF, FALSE,
|
|
"isCCRegister", isCCRegisterBIF, FALSE,
|
|
"isConditionCode", isConditionCodeBIF, FALSE,
|
|
"isControlRegister", isControlRegisterBIF, FALSE,
|
|
"isDFCRegister", isDFCRegisterBIF, FALSE,
|
|
"isDRegister", isDRegisterBIF, FALSE,
|
|
"isDefined", isDefinedBIF, TRUE,
|
|
"isDisplacementMode", isDisplacementModeBIF, FALSE,
|
|
"isExternal", isExternalBIF, TRUE,
|
|
"isField", isFieldBIF, FALSE,
|
|
"isFunction", isFunctionBIF, FALSE,
|
|
"isImmediateMode", isImmediateModeBIF, FALSE,
|
|
"isIndexedMode", isIndexedModeBIF, FALSE,
|
|
"isIndirectMode", isIndirectModeBIF, FALSE,
|
|
"isPCDisplacementMode", isPCDisplacementModeBIF,FALSE,
|
|
"isPCIndexedMode", isPCIndexedModeBIF, FALSE,
|
|
"isPostincrementMode", isPostincrementModeBIF, FALSE,
|
|
"isPredecrementMode", isPredecrementModeBIF, FALSE,
|
|
"isRelocatableValue", isRelocatableValueBIF, FALSE,
|
|
"isSFCRegister", isSFCRegisterBIF, FALSE,
|
|
"isStatusRegister", isStatusRegisterBIF, FALSE,
|
|
"isString", isStringBIF, FALSE,
|
|
"isStruct", isStructBIF, FALSE,
|
|
"isSymbol", isSymbolBIF, TRUE,
|
|
"isUSP", isUSPBIF, FALSE,
|
|
"isVBRegister", isVBRegisterBIF, FALSE,
|
|
"listingOff", listingOffBIF, FALSE,
|
|
"listingOn", listingOnBIF, FALSE,
|
|
"nthChar", nthCharBIF, FALSE,
|
|
"printf", printfBIF, FALSE,
|
|
"strcat", strcatBIF, FALSE,
|
|
"strcmp", strcmpBIF, FALSE,
|
|
"strcmplc", strcmplcBIF, FALSE,
|
|
"strlen", strlenBIF, FALSE,
|
|
"substr", substrBIF, FALSE,
|
|
"symbolDefine", symbolDefineBIF, FALSE,
|
|
"symbolLookup", symbolLookupBIF, FALSE,
|
|
"symbolName", symbolNameBIF, TRUE,
|
|
"symbolUsage", symbolUsageBIF, TRUE,
|
|
"valueType", valueTypeBIF, FALSE,
|
|
NULL, NULL, FALSE,
|
|
};
|
|
|
|
/* Used to initialize predefined symbols */
|
|
struct {
|
|
stringType *symbolName;
|
|
int symbolValue;
|
|
} predefinedSymbolTable[] = {
|
|
"FALSE", 0,
|
|
"NULL", 0,
|
|
"TRUE", 1,
|
|
NULL, 0,
|
|
};
|
|
|
|
/* These define the temporary files used to hold scratch data used in the
|
|
generation of listings. The "XXXXXX"s get blasted by 'mktemp' */
|
|
char pass2SourceFileName[] = "/tmp/zsourceXXXXXX";
|
|
char pass2IndexFileName[] = "/tmp/zindexXXXXXX";
|
|
char pass2MacroExpansionFileName[] = "/tmp/zmacroXXXXXX";
|