/*
 * as85.c
 * Tables.
 *         Added 'rim' and 'sim' to keyword list. 3Apr'86 -- gpv
 */
#include <stdio.h>
#include "asm.h"

/*
 * Assorted variables.
 */

#ifndef lint
static char
# ifdef __GNUC__
    __attribute__ ((unused))
# endif
*sccsid = "@(#)as85.c        1.2";
#endif

int	listmode;	/* Listing control */
int	listaddr;	/* Listing control */
int	entaddr;	/* Entry address */
FILE	*src;		/* Source */
FILE	*obj;		/* Object */
int	lflag;		/* -l flag */
int	nflag;		/* -n flag */
int	sflag;		/* -s flag */
int	pass;		/* Which pass? */
int	skip;		/* skipping code */
int	inif;		/* in an if block */
int	lineno;		/* Line number */
char	*sptr;		/* Source pointer */
char	sbuf[SRCMAX];	/* Source buffer */
char	*cptr;		/* Listing code pointer */
char	cbuf[CLMAX];	/* Listing code buffer */
char	*eptr;		/* Error pointer */
char	ebuf[ERRMAX];	/* Error buffer */
int	cadr;		/* Object address */
int	crec;		/* Object index */
char	crbf[CBMAX];	/* Object buffer */
int	errcnt;		/* error count   */
int	page;		/* current page number */
int	pline;		/* lines on the current page */
char	title[TITLE_LN+1];		/* program listing title */

char	chartype[128]	= {		/* character class */
/* | 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel| */
	UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
/* | 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si | */
	UNKNOWN, SPACE, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
/* | 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb| */
	UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
/* | 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us | */
	UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
/* | 20 sp | 21  ! | 22  " | 23  # | 24  $ | 25  % | 26  & | 27  ' | */
	SPACE, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
/* | 28  ( | 29  ) | 2a  * | 2b  + | 2c  , | 2d  - | 2e  . | 2f  / | */
	UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
/* | 30  0 | 31  1 | 32  2 | 33  3 | 34  4 | 35  5 | 36  6 | 37  7 | */
	DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT,
/* | 38  8 | 39  9 | 3a  : | 3b  ; | 3c  < | 3d  = | 3e  > | 3f  ? | */
	DIGIT, DIGIT, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, OTHER,
/* | 40  @ | 41  A | 42  B | 43  C | 44  D | 45  E | 46  F | 47  G | */
	OTHER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
/* | 48  H | 49  I | 4a  J | 4b  K | 4c  L | 4d  M | 4e  N | 4f  O | */
	UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
/* | 50  P | 51  Q | 52  R | 53  S | 54  T | 55  U | 56  V | 57  W | */
	UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
/* | 58  X | 59  Y | 5a  Z | 5b  [ | 5c  \ | 5d  ] | 5e  ^ | 5f  _ | */
	UPPER, UPPER, UPPER, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
/* | 60  ` | 61  a | 62  b | 63  c | 64  d | 65  e | 66  f | 67  g | */
	UNKNOWN, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
/* | 68  h | 69  i | 6a  j | 6b  k | 6c  l | 6d  m | 6e  n | 6f  o | */
	LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
/* | 70  p | 71  q | 72  r | 73  s | 74  t | 75  u | 76  v | 77  w | */
	LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
/* | 78  x | 79  y | 7a  z | 7b  { | 7c  | | 7d  } | 7e  ~ | 7f del| */
	LOWER, LOWER, LOWER, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN,
};

/*
 * User symbol table.
 * The first item must be '$'.
 */
struct sym ust[USERMAX] = {
        { "$", NULL,NULL, S_ABS, SF_ASG, 0 },
};

/*
 * Opcode table.
 * Also contains pseudo operations.
 */
struct sym pst[] = {
	{ "aci", NULL, NULL, S_OP2, 0, 0316, NULL },
	{ "adc", NULL, NULL, S_OP9, 0, 0210, NULL },
	{ "add", NULL, NULL, S_OP9, 0, 0200, NULL },
	{ "adi", NULL, NULL, S_OP2, 0, 0306, NULL },
	{ "ana", NULL, NULL, S_OP9, 0, 0240, NULL },
	{ "ani", NULL, NULL, S_OP2, 0, 0346, NULL },
	{ "call", NULL, NULL, S_OP11, 0, 0315, NULL },
	{ "cc", NULL, NULL, S_OP11, 0, 0334, NULL },
	{ "cm", NULL, NULL, S_OP11, 0, 0374, NULL },
	{ "cma", NULL, NULL, S_OP1, 0, 0057, NULL },
	{ "cmc", NULL, NULL, S_OP1, 0, 0077, NULL },
	{ "cmp", NULL, NULL, S_OP9, 0, 0270, NULL },
	{ "cnc", NULL, NULL, S_OP11, 0, 0324, NULL },
	{ "cnz", NULL, NULL, S_OP11, 0, 0304, NULL },
	{ "cp", NULL, NULL, S_OP11, 0, 0364, NULL },
	{ "cpe", NULL, NULL, S_OP11, 0, 0354, NULL },
	{ "cpi", NULL, NULL, S_OP2, 0, 0376, NULL },
	{ "cpo", NULL, NULL, S_OP11, 0, 0344, NULL },
	{ "cz", NULL, NULL, S_OP11, 0, 0314, NULL },
	{ "daa", NULL, NULL, S_OP1, 0, 0047, NULL },
	{ "dad", NULL, NULL, S_OP6, 0, 0011, NULL },
	{ "db", NULL, NULL, S_BYTE, 0, 0, NULL },
	{ "dcr", NULL, NULL, S_OP9, 0, 0005, NULL },
	{ "dcx", NULL, NULL, S_OP6, 0, 0013, NULL },
	{ "di", NULL, NULL, S_OP1, 0, 0363, NULL },
	{ "ds", NULL, NULL, S_BLKB, 0, 0, NULL },
	{ "dsz", NULL, NULL, S_BLKZ, 0, 0, NULL },
	{ "dw", NULL, NULL, S_WORD, 0, 0, NULL },
	{ "ei", NULL, NULL, S_OP1, 0, 0373, NULL },
	{ "end", NULL, NULL, S_ENTRY, 0, 0, NULL },
	{ "endif", NULL, NULL, S_ENDIF, 0, 0, NULL },
	{ "endm", NULL, NULL, S_ENDM, 0, 0, NULL },
	{ "equ", NULL, NULL, S_EQU, 0, 0, NULL },
	{ "hlt", NULL, NULL, S_OP1, 0, 0166, NULL },
	{ "if", NULL, NULL, S_IF, 0, 0, NULL },
	{ "in", NULL, NULL, S_OP2, 0, 0333, NULL },
	{ "inr", NULL, NULL, S_OP9, 0, 0004, NULL },
	{ "inx", NULL, NULL, S_OP6, 0, 0003, NULL },
	{ "jc", NULL, NULL, S_OP11, 0, 0332, NULL },
	{ "jm", NULL, NULL, S_OP11, 0, 0372, NULL },
	{ "jmp", NULL, NULL, S_OP11, 0, 0303, NULL },
	{ "jnc", NULL, NULL, S_OP11, 0, 0322, NULL },
	{ "jnz", NULL, NULL, S_OP11, 0, 0302, NULL },
	{ "jp", NULL, NULL, S_OP11, 0, 0362, NULL },
	{ "jpe", NULL, NULL, S_OP11, 0, 0352, NULL },
	{ "jpo", NULL, NULL, S_OP11, 0, 0342, NULL },
	{ "jz", NULL, NULL, S_OP11, 0, 0312, NULL },
	{ "lda", NULL, NULL, S_OP11, 0, 0072, NULL },
	{ "ldax", NULL, NULL, S_OP5, 0, 0012, NULL },
	{ "lhld", NULL, NULL, S_OP11, 0, 0052, NULL },
	{ "lxi", NULL, NULL, S_OP10, 0, 0001, NULL },
	{ "macro", NULL, NULL, S_MACRO, 0, 0, NULL },
	{ "mov", NULL, NULL, S_OP4, 0, 0100, NULL },
	{ "mvi", NULL, NULL, S_OP3, 0, 0006, NULL },
	{ "nop", NULL, NULL, S_OP1, 0, 0000, NULL },
	{ "ora", NULL, NULL, S_OP9, 0, 0260, NULL },
	{ "org", NULL, NULL, S_ORG, 0, 0, NULL },
	{ "ori", NULL, NULL, S_OP2, 0, 0366, NULL },
	{ "out", NULL, NULL, S_OP2, 0, 0323, NULL },
	{ "pchl", NULL, NULL, S_OP1, 0, 0351, NULL },
	{ "pop", NULL, NULL, S_OP7, 0, 0301, NULL },
	{ "push", NULL, NULL, S_OP7, 0, 0305, NULL },
	{ "ral", NULL, NULL, S_OP1, 0, 0027, NULL },
	{ "rar", NULL, NULL, S_OP1, 0, 0037, NULL },
	{ "rc", NULL, NULL, S_OP1, 0, 0330, NULL },
	{ "ret", NULL, NULL, S_OP1, 0, 0311, NULL },
	{ "rim", NULL, NULL, S_OP1, 0, 0040, NULL },
	{ "rlc", NULL, NULL, S_OP1, 0, 0007, NULL },
	{ "rm", NULL, NULL, S_OP1, 0, 0370, NULL },
	{ "rnc", NULL, NULL, S_OP1, 0, 0320, NULL },
	{ "rnz", NULL, NULL, S_OP1, 0, 0300, NULL },
	{ "rp", NULL, NULL, S_OP1, 0, 0360, NULL },
	{ "rpe", NULL, NULL, S_OP1, 0, 0350, NULL },
	{ "rpo", NULL, NULL, S_OP1, 0, 0340, NULL },
	{ "rrc", NULL, NULL, S_OP1, 0, 0017, NULL },
	{ "rst", NULL, NULL, S_OP8, 0, 0307, NULL },
	{ "rz", NULL, NULL, S_OP1, 0, 0310, NULL },
	{ "sbb", NULL, NULL, S_OP9, 0, 0230, NULL },
	{ "sbi", NULL, NULL, S_OP2, 0, 0336, NULL },
	{ "set", NULL, NULL, S_SET, 0, 0, NULL },
	{ "shld", NULL, NULL, S_OP11, 0, 0042, NULL },
	{ "sim", NULL, NULL, S_OP1, 0, 0060, NULL },
	{ "sphl", NULL, NULL, S_OP1, 0, 0371, NULL },
	{ "sta", NULL, NULL, S_OP11, 0, 0062, NULL },
	{ "stax", NULL, NULL, S_OP5, 0, 0002, NULL },
	{ "stc", NULL, NULL, S_OP1, 0, 0067, NULL },
	{ "sub", NULL, NULL, S_OP9, 0, 0220, NULL },
	{ "sui", NULL, NULL, S_OP2, 0, 0326, NULL },
	{ "title", NULL, NULL, S_NAME, 0, 0, NULL },
	{ "xchg", NULL, NULL, S_OP1, 0, 0353, NULL },
	{ "xra", NULL, NULL, S_OP9, 0, 0250, NULL },
	{ "xri", NULL, NULL, S_OP2, 0, 0356, NULL },
	{ "xthl", NULL, NULL, S_OP1, 0, 0343, NULL },
};

/*
 * Register symbol table
 */
struct sym rst[] = {
	{ "a", NULL, NULL, S_REG, 0, 7, NULL },
	{ "b", NULL, NULL, S_REG, 0, 0, NULL },
	{ "c", NULL, NULL, S_REG, 0, 1, NULL },
	{ "d", NULL, NULL, S_REG, 0, 2, NULL },
	{ "e", NULL, NULL, S_REG, 0, 3, NULL },
	{ "h", NULL, NULL, S_REG, 0, 4, NULL },
	{ "l", NULL, NULL, S_REG, 0, 5, NULL },
	{ "m", NULL, NULL, S_REG, 0, 6, NULL },
	{ "psw", NULL, NULL, S_REG, 0, PSW, NULL },
	{ "sp", NULL, NULL, S_REG, 0, SP, NULL },
};

/*
 * Size of tables.
 * Must be here!
 */
int pstsiz = (sizeof(pst) / sizeof(pst[0]));
int rstsiz = (sizeof(rst) / sizeof(rst[0]));
