mirror of
https://github.com/bobbimanners/Zapple-II.git
synced 2024-09-26 20:54:37 +00:00
138 lines
3.1 KiB
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;
|
|
}
|
|
}
|