Zapple-II/z80as/as6.c

138 lines
3.1 KiB
C

/*
* Z-80 assembler.
* Basic symbol tables.
* Contain all of the instructions
* and register names.
*/
#include "as.h"
/*
* This array of symbol nodes
* make up the basic symbol table.
* The "syminit" routine links these
* nodes into the builtin symbol hash
* table at start-up time.
*/
SYM sym[] = {
0, "b", TBR, B,
0, "c", TBR, C,
0, "d", TBR, D,
0, "e", TBR, E,
0, "h", TBR, H,
0, "l", TBR, L,
0, "a", TBR, A,
0, "bc", TWR, BC,
0, "de", TWR, DE,
0, "hl", TWR, HL,
0, "sp", TWR, SP,
0, "af", TWR, AF,
0, "af'", TWR, AFPRIME,
0, "ix", TWR, IX,
0, "iy", TWR, IY,
0, "i", TSR, I,
0, "r", TSR, R,
0, "nz", TCC, CNZ,
0, "z", TCC, CZ,
0, "nc", TCC, CNC,
0, "po", TCC, CPO,
0, "pe", TCC, CPE,
0, "p", TCC, CP,
0, "m", TCC, CM,
0, "defb", TDEFB, XXXX,
0, "defw", TDEFW, XXXX,
0, "defs", TDEFS, XXXX,
0, "defm", TDEFM, XXXX,
0, "org", TORG, XXXX,
0, "equ", TEQU, XXXX,
0, "cond", TCOND, XXXX,
0, "endc", TENDC, XXXX,
0, "nop", TNOP, 0x0000,
0, "rlca", TNOP, 0x0007,
0, "rrca", TNOP, 0x000F,
0, "rla", TNOP, 0x0017,
0, "rra", TNOP, 0x001F,
0, "daa", TNOP, 0x0027,
0, "cpl", TNOP, 0x002F,
0, "scf", TNOP, 0x0037,
0, "ccf", TNOP, 0x003F,
0, "halt", TNOP, 0x0076,
0, "exx", TNOP, 0x00D9,
0, "di", TNOP, 0x00F3,
0, "ei", TNOP, 0x00FB,
0, "neg", TNOP, 0xED44,
0, "retn", TNOP, 0xED45,
0, "reti", TNOP, 0xED4D,
0, "rrd", TNOP, 0xED67,
0, "rld", TNOP, 0xED6F,
0, "ldi", TNOP, 0xEDA0,
0, "cpi", TNOP, 0xEDA1,
0, "ini", TNOP, 0xEDA2,
0, "outi", TNOP, 0xEDA3,
0, "ldd", TNOP, 0xEDA8,
0, "cpd", TNOP, 0xEDA9,
0, "ind", TNOP, 0xEDAA,
0, "outd", TNOP, 0xEDAB,
0, "ldir", TNOP, 0xEDB0,
0, "cpir", TNOP, 0xEDB1,
0, "inir", TNOP, 0xEDB2,
0, "otir", TNOP, 0xEDB3,
0, "lddr", TNOP, 0xEDB8,
0, "cpdr", TNOP, 0xEDB9,
0, "indr", TNOP, 0xEDBA,
0, "otdr", TNOP, 0xEDBB,
0, "rst", TRST, XXXX,
0, "djnz", TREL, 0x0010,
0, "jr", TREL, 0x0018,
0, "ret", TRET, 0x00C9,
0, "call", TJMP, 0x00CD,
0, "jp", TJMP, 0x00C3,
0, "push", TPUSH, 0x00C5,
0, "pop", TPUSH, 0x00C1,
0, "im", TIM, XXXX,
0, "in", TIO, 0x00DB,
0, "out", TIO, 0x00D3,
0, "bit", TBIT, 0xCB40,
0, "res", TBIT, 0xCB80,
0, "set", TBIT, 0xCBC0,
0, "rlc", TSHR, 0xCB00,
0, "rrc", TSHR, 0xCB08,
0, "rl", TSHR, 0xCB10,
0, "rr", TSHR, 0xCB18,
0, "sla", TSHR, 0xCB20,
0, "sra", TSHR, 0xCB28,
0, "srl", TSHR, 0xCB38,
0, "inc", TINC, 0x0004,
0, "dec", TINC, 0x0005,
0, "ex", TEX, XXXX,
0, "add", TADD, 0x0080,
0, "adc", TADD, 0x0088,
0, "sbc", TADD, 0x0098,
0, "sub", TSUB, 0x0090,
0, "and", TSUB, 0x00A0,
0, "xor", TSUB, 0x00A8,
0, "or", TSUB, 0x00B0,
0, "cp", TSUB, 0x00B8,
0, "ld", TLD, XXXX
};
/*
* Set up the symbol table.
* Sweep through the initializations
* of the "phash", and link them into the
* buckets. Because it is here, a
* "sizeof" works.
*/
syminit()
{
register SYM *sp;
register int hash;
sp = &sym[0];
while (sp < &sym[sizeof(sym)/sizeof(SYM)]) {
hash = symhash(sp->s_id);
sp->s_fp = phash[hash];
phash[hash] = sp;
++sp;
}
}