- 论坛徽章:
- 0
|
虚拟机源码分析
虚拟机类的实现文件:mc.cpp
- //////////////////////////////////////
- // 汇编语言虚拟机 MYVM Version 0.11a
- // snallie@163.net 2003.2
- //
- // mc.cpp
- // 虚拟机的内部操作的实现
- //////////////////////////////////////
- #include "misc.h"
- #include "mc.h"
- const int ESC = 1;
- // 将X执行加1操作,并保持其值在0~255范围内,因为CPU字长为8位
- inline void increment(MC_bytes & x)
- {
- x = (x + 257) % 256;
- }
- // 将X执行减1操作,并保持其值在0~255范围内,因为CPU字长为8位
- inline void decrement(MC_bytes & x)
- {
- x = (x + 255) % 256;
- }
- // 对str所指向的汇编助记符查指令表,
- // 对正确的指令形式返回其所对应的机器码,对于错误的指令返回MC_bad(255)
- MC_bytes MC::opcode(char *str)
- {
- for (int i = 0; str[i]; i++)
- str[i] = toupper(str[i]);
- MC_bytes l = MC_nop;
- while (l <= MAXINSTUCTION && strcmp(str, mnemonics[l]))
- l++;
- if (l <= MAXINSTUCTION)
- return l;
- else
- return MC_bad;
- }
- // 以16进制形式输出CPU的256字节内存单元的内容
- void MC::listcode(char *srcname)
- {
- MC_bytes nextbyte = 0, tnb;
- char filename[256];
- newsuffix(srcname, "map", filename);
- if (*filename == '\0')
- return;
- FILE *listfile = fopen(filename, "w");
- if (listfile == NULL)
- listfile = stdout;
- for (int i = 1; i <= 16; i++) {
- fprintf(listfile, "%02X(%03d) ", (i - 1) * 16, (i - 1) * 16);
- tnb = nextbyte;
- int j;
- for (j = 1; j <= 16; j++) {
- fprintf(listfile, "%02X %s", mem[nextbyte],
- (j == 8) ? " " : "");
- increment(nextbyte);
- }
- fprintf(listfile, " ");
- nextbyte = tnb;
- for (j = 1; j <= 16; j++) {
- fprintf(listfile, "%c",
- (mem[nextbyte] < 0x20) ? '.' : mem[nextbyte]);
- increment(nextbyte);
- }
- putc('\n', listfile);
- }
- if (listfile != stdout)
- fclose(listfile);
- }
- // 运行时CPU内部主要寄存器的状态输出(设定了跟踪参数)
- void MC::trace(FILE * results, MC_bytes pcnow)
- {
- fprintf(results, "PC=%02X A=%02X ", pcnow, cpu.a);
- fprintf(results, "X=%02X SP=%02X [SP]=%02X BP=%02X ", cpu.x, cpu.sp,
- mem[cpu.sp], cpu.bp);
- fprintf(results, "Z=%d P=%d C=%d ", cpu.z, cpu.p, cpu.c);
- fprintf(results, "OPCODE=%02X (%s)\n", cpu.ir, mnemonics[cpu.ir]);
- }
- // 输出程序运行时错误
- void MC::runtime_error(FILE * results, MC_bytes pcnow)
- {
- switch (ps) {
- case badop:
- fprintf(results, "Illegal opcode");
- break;
- case nodata:
- fprintf(results, "No more data");
- break;
- case baddata:
- fprintf(results, "Invalid data");
- break;
- }
- fprintf(results, " at %d\n", pcnow);
- trace(results, pcnow);
- printf
- ("\nRuntime error happend, dumping memory to runtime.err.map ...\n");
- listcode("runtime.err.dump"); //dump runtime error to runtime.err.map file
- }
- // 根据寄存器的值设定标志器P和Z的状态
- inline void MC::setflags(MC_bytes MC_register)
- {
- cpu.z = (MC_register == 0);
- cpu.p = (MC_register <= 127);
- }
- //计算变址地址 X+B
- inline MC_bytes MC::index(void)
- {
- return ((mem[cpu.pc] + cpu.x) % 256);
- }
- //从data文件读入一字符,并检测是否为中断字符
- void readchar(FILE * data, char &ch, status & ps)
- {
- if (feof(data)) {
- ps = nodata;
- ch = ' ';
- return;
- }
- ch = getc(data);
- if (ch == ESC)
- ps = finished;
- if (ch < ' ' || feof(data))
- ch = ' ';
- }
- // 将ch内的16进制数转换为数值
- int hexdigit(char ch)
- {
- char tpch;
- tpch = ch;
- // 将大于10的字母转换为相应的数字
- if (isalpha(ch) && (tpch | 0x20 >;= 'a' && tpch | 0x20 <= 'f'))
- return (ch + 10 - 'a');
- if (isdigit(ch))
- return (ch - '0');
- else
- return (0);
- }
- // 以指定的进制从data文件读入一个数字 格式{+|-}?{digit}*
- int getnumber(FILE *data, int base, status &ps)
- {
- bool negative = false;
- char ch;
- int num = 0;
- do {
- readchar(data, ch, ps);
- } while (!(ch >; ' ' || feof(data) || ps != running));
- if (ps == running) {
- if (feof(data))
- ps = nodata;
- else {
- switch (ch) {
- case '-':
- negative = true;
- readchar(data, ch, ps);
- break;
- case '+':
- negative = false;
- readchar(data, ch, ps);
- break;
- }
- if (!isxdigit(ch))
- ps = baddata;
- else {
- while (isxdigit(ch) && ps == running) {
- if (hexdigit(ch) < base
- && num <= (maxint - hexdigit(ch)) / base)
- num = base * num + hexdigit(ch);
- else
- ps = baddata;
- readchar(data, ch, ps);
- }
- }
- }
- if (negative)
- num = -num;
- if (num >; 0)
- return num % 256;
- else
- return (256 - abs(num) % 256) % 256; //负数以2的补码的形式表示返回
- }
- return 0;
- }
- //对虚拟机执行汇编后的机器指令程序的主体函数
- void MC::execute(MC_bytes initpc, FILE * data, FILE * results,
- bool tracing)
- {
- MC_bytes pcnow; // 程序计数器的先前值
- MC_bytes carry; // 保存进位位的状态
- MC_bytes number;
- cpu.z = false;
- cpu.p = false;
- cpu.c = false; // 初始化标志器的状态
- cpu.a = 0;
- cpu.x = 0;
- cpu.sp = 0; // 初始化栈指针寄存器
- cpu.bp = 0; // 初始化基址指针寄存器
- cpu.pc = initpc; // 初始化程序计数器
- ps = running; // 初始化cpu的运行状态
- //如下循环进行实际的取指,分析解释,执行指令过程,直到停机halt或出现运行时错误
- do {
- cpu.ir = mem[cpu.pc]; // 从内存中取指令送入指令寄存器
- pcnow = cpu.pc; // 保存PC的先前值
- increment(cpu.pc); // PC指向下一条将要执行的指令地址
- if (tracing)
- trace(results, pcnow); //若调试,输出全部cpu内部寄存器值
- switch (cpu.ir) { //根据指令值,转入相应的处理
- case MC_nop:
- break; //空操作,直接返回
- case MC_clra: //累加器A清0
- cpu.a = 0;
- break;
- case MC_clrc: //进位标志器 C 清0
- cpu.c = false;
- break;
- case MC_clrx: //变址寄存器 x 清0
- cpu.x = 0;
- break;
- case MC_cmc: //进位标志器 C 取反
- cpu.c = !cpu.c;
- break;
- case MC_inc: //累加器A自增1,影响标志器
- increment(cpu.a);
- setflags(cpu.a);
- break;
- case MC_dec: //累加器A自减1,影响标志器
- decrement(cpu.a);
- setflags(cpu.a);
- break;
- case MC_incx: //变址寄存器 x 自增1,影响标志器
- increment(cpu.x);
- setflags(cpu.x);
- break;
- case MC_decx: //变址寄存器 x 自减1,影响标志器
- decrement(cpu.x);
- setflags(cpu.x);
- break;
- case MC_tax: //累加器A内容送入变址寄存器 x
- cpu.x = cpu.a;
- break;
- case MC_ini: //从输入读一10进制数送累加器A,影响标志器
- cpu.a = getnumber(data, 10, ps);
- setflags(cpu.a);
- break;
- case MC_inb: //从输入读一2进制数送累加器A,影响标志器
- cpu.a = getnumber(data, 2, ps);
- setflags(cpu.a);
- break;
- case MC_inh: //从输入读一16进制数送累加器A,影响标志器
- cpu.a = getnumber(data, 16, ps);
- setflags(cpu.a);
- break;
- case MC_ina: //从输入读一ascii字符送累加器A,影响标志器
- char ascii;
- readchar(data, ascii, ps);
- if (feof(data))
- ps = nodata;
- else {
- cpu.a = ascii;
- setflags(cpu.a);
- }
- break;
- case MC_oti: //以10进形式输出累加器A的内容
- if (cpu.a < 128)
- fprintf(results, "%d ", cpu.a);
- else
- fprintf(results, "%d ", cpu.a - 256);
- if (tracing)
- putc('\n', results);
- break;
- case MC_oth: //以16进形式输出累加器A的内容
- fprintf(results, "%02X ", cpu.a);
- if (tracing)
- putc('\n', results);
- break;
- case MC_otc: //以无符号10进数形式输出累加器A的内容
- fprintf(results, "%d ", cpu.a);
- if (tracing)
- putc('\n', results);
- break;
- case MC_otb: //以无符号2进制形式输出累加器A的内容
- int bits[8];
- number = cpu.a;
- int loop;
- for (loop = 0; loop <= 7; loop++) {
- bits[loop] = number % 2;
- number /= 2;
- }
- for (loop = 7; loop >;= 0; loop--)
- fprintf(results, "%d", bits[loop]);
- putc(' ', results);
- if (tracing)
- putc('\n', results);
- break;
- case MC_ota: //以ascii字符形式输出累加器A的内容
- putc(cpu.a, results);
- if (tracing)
- putc('\n', results);
- break;
- case MC_push: //压栈操作:堆栈指针SP减1,累加器A的内容压入栈顶。
- decrement(cpu.sp);
- mem[cpu.sp] = cpu.a;
- break;
- case MC_pop: //出栈操作:栈顶的内容送入A,堆栈指针SP增1,影响标志器
- cpu.a = mem[cpu.sp];
- increment(cpu.sp);
- setflags(cpu.a);
- break;
- case MC_shl: //累加器A的各位顺次左移1位,最高位移入进位标志C,影响标志器
- cpu.c = (cpu.a * 2 >; 255);
- cpu.a = cpu.a * 2 % 256;
- setflags(cpu.a);
- break;
- case MC_shr: //累加器A的各位顺次右移1位,最低位移入进位标志C,影响标志器
- cpu.c = cpu.a & 1;
- cpu.a /= 2;
- setflags(cpu.a);
- break;
- case MC_ret: //子程序调用返回,将栈顶保存的返回地址送PC,退栈
- cpu.pc = mem[cpu.sp];
- increment(cpu.sp);
- break;
- case MC_halt: //停机
- ps = finished;
- break;
- case MC_lda:
- //双字节指令,格式:LDA B,其第二字节为一个内存地址,
- //将位于B地址单元中的内容送入A累加器.
- //实现时以当前PC所指内存中的数值为地址偏移,将其所指的内存中的内容送入A
- cpu.a = mem[mem[cpu.pc]];
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_ldx:
- //将X+B所指的内存单元的内容送入A,即:A=[X+B]
- cpu.a = mem[index()];
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_ldi: //A=ImmB
- cpu.a = mem[cpu.pc];
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_lsp: //SP=[ImmB]
- cpu.sp = mem[mem[cpu.pc]];
- increment(cpu.pc);
- break;
- case MC_lspi: //SP=ImmB
- cpu.sp = mem[cpu.pc];
- increment(cpu.pc);
- break;
- case MC_sta: //[ImmB]=A
- mem[mem[cpu.pc]] = cpu.a;
- increment(cpu.pc);
- break;
- case MC_stx: //[X+B]=A
- mem[index()] = cpu.a;
- increment(cpu.pc);
- break;
- case MC_add: //A=A+[ImmB]
- cpu.c = (cpu.a + mem[mem[cpu.pc]] >; 255);
- cpu.a = (cpu.a + mem[mem[cpu.pc]]) % 256; //限定数值的大小为8bit
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_adx: //A=A+[X+ImmB]
- cpu.c = (cpu.a + mem[index()] >; 255);
- cpu.a = (cpu.a + mem[index()]) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_adi: //A=A+ImmB
- cpu.c = (cpu.a + mem[cpu.pc] >; 255);
- cpu.a = (cpu.a + mem[cpu.pc]) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_adc: //A=A+C+[ImmB]
- carry = cpu.c;
- cpu.c = (cpu.a + mem[mem[cpu.pc]] + carry >; 255);
- cpu.a = (cpu.a + mem[mem[cpu.pc]] + carry) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_acx: //A=A+C+[X+ImmB]
- carry = cpu.c;
- cpu.c = (cpu.a + mem[index()] + carry >; 255);
- cpu.a = (cpu.a + mem[index()] + carry) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_aci: //A=A+C+ImmB
- carry = cpu.c;
- cpu.c = (cpu.a + mem[cpu.pc] + carry >; 255);
- cpu.a = (cpu.a + mem[cpu.pc] + carry) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_sub: //A=A-[ImmB]
- cpu.c = (cpu.a < mem[mem[cpu.pc]]);
- cpu.a = (cpu.a - mem[mem[cpu.pc]] + 256) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_sbx: //A=A-[X+ImmB]
- cpu.c = (cpu.a < mem[index()]);
- cpu.a = (cpu.a - mem[index()] + 256) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_sbi: //A=A-ImmB
- cpu.c = (cpu.a < mem[cpu.pc]);
- cpu.a = (cpu.a - mem[cpu.pc] + 256) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_sbc: //A=A-C-[ImmB]
- carry = cpu.c;
- cpu.c = (cpu.a < mem[mem[cpu.pc]] + carry);
- cpu.a = (cpu.a - mem[mem[cpu.pc]] - carry + 256) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_scx: //A=A-C-[X+ImmB]
- carry = cpu.c;
- cpu.c = (cpu.a < mem[index()] + carry);
- cpu.a = (cpu.a - mem[index()] - carry + 256) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_sci: //A=A-C-ImmB
- carry = cpu.c;
- cpu.c = (cpu.a < mem[cpu.pc] + carry);
- cpu.a = (cpu.a - mem[cpu.pc] - carry + 256) % 256;
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_cmp: //A与B所指单元的内容进行比较,影响标志位
- cpu.c = (cpu.a < mem[mem[cpu.pc]]);
- setflags((cpu.a - mem[mem[cpu.pc]] + 256) % 256);
- increment(cpu.pc);
- break;
- case MC_cpx: //A与 X+ImmB 所指单元的内容进行比较,影响标志位
- cpu.c = (cpu.a < mem[index()]);
- setflags((cpu.a - mem[index()] + 256) % 256);
- increment(cpu.pc);
- break;
- case MC_cpi: //A与ImmB进行比较,影响标志位
- cpu.c = (cpu.a < mem[cpu.pc]);
- setflags((cpu.a - mem[cpu.pc] + 256) % 256);
- increment(cpu.pc);
- break;
- case MC_ana: //A与[ImmB]进行位与,影响标志位
- cpu.a &= mem[mem[cpu.pc]];
- increment(cpu.pc);
- setflags(cpu.a);
- cpu.c = false;
- break;
- case MC_anx: //A与[X+ImmB]进行位与,影响标志位
- cpu.a &= mem[index()];
- increment(cpu.pc);
- setflags(cpu.a);
- cpu.c = false;
- break;
- case MC_ani: //A与ImmB进行位与,影响标志位
- cpu.a &= mem[cpu.pc];
- increment(cpu.pc);
- setflags(cpu.a);
- cpu.c = false;
- break;
- case MC_ora: //A与[ImmB]进行位或,影响标志位
- cpu.a |= mem[mem[cpu.pc]];
- increment(cpu.pc);
- setflags(cpu.a);
- cpu.c = false;
- break;
- case MC_orx: //A与[X+ImmB]进行位或,影响标志位
- cpu.a |= mem[index()];
- increment(cpu.pc);
- setflags(cpu.a);
- cpu.c = false;
- break;
- case MC_ori: //A与ImmB进行位或,影响标志位
- cpu.a |= mem[cpu.pc];
- increment(cpu.pc);
- setflags(cpu.a);
- cpu.c = false;
- break;
- case MC_jmp: //绝对跳转到B地址
- cpu.pc = mem[cpu.pc];
- break;
- case MC_bze: //如Z标志为1 则跳转到B 单元去执行,否则顺序执行
- if (cpu.z)
- cpu.pc = mem[cpu.pc];
- else
- increment(cpu.pc);
- break;
- case MC_bnz: //如Z标志为0 则跳转到B 单元去执行,否则顺序执行
- if (!cpu.z)
- cpu.pc = mem[cpu.pc];
- else
- increment(cpu.pc);
- break;
- case MC_bpz: //如P标志为1(正) 则跳转到B 单元去执行,否则顺序执行
- if (cpu.p)
- cpu.pc = mem[cpu.pc];
- else
- increment(cpu.pc);
- break;
- case MC_bng: //如P标志为0(负) 则跳转到B 单元去执行,否则顺序执行
- if (!cpu.p)
- cpu.pc = mem[cpu.pc];
- else
- increment(cpu.pc);
- break;
- case MC_bcs: //如C标志为1 则跳转到B 单元去执行,否则顺序执行
- if (cpu.c)
- cpu.pc = mem[cpu.pc];
- else
- increment(cpu.pc);
- break;
- case MC_bcc: //如C标志为0 则跳转到B 单元去执行,否则顺序执行
- if (!cpu.c)
- cpu.pc = mem[cpu.pc];
- else
- increment(cpu.pc);
- break;
- case MC_jsr: //调用子程序,返回地址入栈,操作数(JSR的后一字节)B->;PC
- decrement(cpu.sp);
- mem[cpu.sp] = (cpu.pc + 1) % 256; // push return address
- cpu.pc = mem[cpu.pc];
- break;
- case MC_tsp: //单字节指令,将栈指针寄存器SP的内容送入A累加器
- cpu.a = cpu.sp;
- setflags(cpu.a);
- break;
- case MC_lbpi: //双字节指令,格式:LBPI B,将由基址指针寄存器BP指示的内存单元起的偏移量为B字节的内存单元的内容送入A
- //累加器
- cpu.a = mem[cpu.bp + mem[cpu.pc]];
- increment(cpu.pc);
- setflags(cpu.a);
- break;
- case MC_fbpi: //双字节指令,格式:FBPI B,将立即数B送入基址指针寄存器BP
- cpu.bp = mem[cpu.pc];
- increment(cpu.pc);
- break;
- case MC_tbp: //单字节指令,将基址指针寄存器BP的内容送入A累加器
- cpu.a = cpu.bp;
- setflags(cpu.a);
- break;
- case MC_tsb: //单字节指令,将栈指针寄存器SP的内容送入址指针寄存器BP
- cpu.bp = cpu.sp;
- break;
- case MC_tabp: //单字节指令,将A累加器的内容送入到栈指针寄存器BP中
- cpu.bp = cpu.a;
- break;
- default:
- ps = badop;
- break;
- }
- } while (ps == running);
- if (ps != finished)
- runtime_error(results, pcnow);
- }
- /*
- 对虚拟机执行汇编后的机器指令程序进行执行执行前的准备工作:
- argc:用户在命令行上提供的参数个数,据此判断是否以交互方式提示用户输入如下的参数:
- trace:设定跟踪标志;datafile:程序的输入数据文件, outfile:程序的输出文件
- entrance:机器指令程序的入口点
- */
- void MC::interpret(int argc, int trace, char *datafile, char *outfile,
- int entrance)
- {
- char filename[256] = { 0 };
- FILE *data, *results;
- bool tracing;
- int entry;
- if (argc == 2) {
- //用户没有提供任何的任选参数,交互式提示用户输入
- printf("\nTrace execution (y/N/q)? ");
- char reply = getchar();
- scanf("%*[^\n]");
- getchar();
- if (toupper(reply) != 'Q') {
- tracing = toupper(reply) == 'Y';
- printf("\nData file [STDIN] ? ");
- fgets(filename, sizeof(filename), stdin);
- filename[strlen(filename) - 1] = 0; //replace trailing '\n' with 0
- (!filename[0]) ? data = NULL : data = fopen(filename, "r");
- if (data == NULL) {
- printf("taking data from stdin\n");
- data = stdin;
- }
- printf("\nResults file [STDOUT] ? ");
- fgets(filename, sizeof(filename), stdin);
- filename[strlen(filename) - 1] = 0; //replace trailing '\n' with 0
- !filename[0] ? results = NULL : results = fopen(filename, "w");
- if (results == NULL) {
- printf("sending results to stdout\n");
- results = stdout;
- }
- printf("Entry point? ");
- if (scanf("%d%*[^\n]", &entry) != 1)
- entry = 0;
- getchar();
- } else {
- exit(0);
- }
- }
- //用户在命令行上提供了任选参数,根据参数值打开相关文件,设定程序入口地址
- if (argc >; 2) {
- tracing = trace;
- entry = entrance;
- (!datafile[0]) ? data = NULL : data = fopen(datafile, "r");
- if (data == NULL) {
- printf("taking data from stdin\n");
- data = stdin;
- }
- (!outfile[0]) ? results = NULL : results = fopen(outfile, "w");
- if (results == NULL) {
- printf("sending results to stdout\n");
- results = stdout;
- }
- }
- //执行机器指令程序
- execute(entry % 256, data, results, tracing); // do it!
- if (results != stdout)
- fclose(results);
- if (data != stdin)
- fclose(data);
- }
- //虚拟机初始化,清空内存,初始机器指令表
- MC::MC()
- {
- int i;
- //清空内存
- for (i = 0; i <= 255; i++)
- mem[i] = MC_bad;
- // 初始机器指令表
- for (i = 0; i <= 255; i++)
- mnemonics[i] = "???";
- //机器指令表填入对应的汇编助记符 0xxx为机器指令值
- mnemonics[MC_nop] = "NOP"; //ox0
- mnemonics[MC_clra] = "CLRA"; //ox1
- mnemonics[MC_clrc] = "CLRC"; //ox2
- mnemonics[MC_clrx] = "CLRX"; //ox3
- mnemonics[MC_cmc] = "CMC"; //ox4
- mnemonics[MC_inc] = "INC"; //ox5
- mnemonics[MC_dec] = "DEC"; //ox6
- mnemonics[MC_incx] = "INCX"; //ox7
- mnemonics[MC_decx] = "DECX"; //ox8
- mnemonics[MC_tax] = "TAX"; //ox9
- mnemonics[MC_ini] = "INI"; //oxa
- mnemonics[MC_inh] = "INH"; //oxb
- mnemonics[MC_inb] = "INB"; //oxc
- mnemonics[MC_ina] = "INA"; //oxd
- mnemonics[MC_oti] = "OTI"; //oxe
- mnemonics[MC_otc] = "OTC"; //oxf
- mnemonics[MC_oth] = "OTH"; //ox10
- mnemonics[MC_otb] = "OTB"; //ox11
- mnemonics[MC_ota] = "OTA"; //ox12
- mnemonics[MC_push] = "PUSH"; //ox13
- mnemonics[MC_pop] = "POP"; //ox14
- mnemonics[MC_shl] = "SHL"; //ox15
- mnemonics[MC_shr] = "SHR"; //ox16
- mnemonics[MC_ret] = "RET"; //ox17
- mnemonics[MC_halt] = "HALT"; //ox18
- mnemonics[MC_lda] = "LDA"; //ox19
- mnemonics[MC_ldx] = "LDX"; //ox1a
- mnemonics[MC_ldi] = "LDI"; //ox1b
- mnemonics[MC_lsp] = "LSP"; //ox1c
- mnemonics[MC_lspi] = "LSPI"; //ox1d
- mnemonics[MC_sta] = "STA"; //ox1e
- mnemonics[MC_stx] = "STX"; //ox1f
- mnemonics[MC_add] = "ADD"; //ox20
- mnemonics[MC_adx] = "ADX"; //ox21
- mnemonics[MC_adi] = "ADI"; //ox22
- mnemonics[MC_adc] = "ADC"; //ox23
- mnemonics[MC_acx] = "ACX"; //ox24
- mnemonics[MC_aci] = "ACI"; //ox25
- mnemonics[MC_sub] = "SUB"; //ox26
- mnemonics[MC_sbx] = "SBX"; //ox27
- mnemonics[MC_sbi] = "SBI"; //ox28
- mnemonics[MC_sbc] = "SBC"; //ox29
- mnemonics[MC_scx] = "SCX"; //ox2a
- mnemonics[MC_sci] = "SCI"; //ox2b
- mnemonics[MC_cmp] = "CMP"; //ox2c
- mnemonics[MC_cpx] = "CPX"; //ox2d
- mnemonics[MC_cpi] = "CPI"; //ox2e
- mnemonics[MC_ana] = "ANA"; //ox2f
- mnemonics[MC_anx] = "ANX"; //ox30
- mnemonics[MC_ani] = "ANI"; //ox31
- mnemonics[MC_ora] = "ORA"; //ox32
- mnemonics[MC_orx] = "ORX"; //ox33
- mnemonics[MC_ori] = "ORI"; //ox34
- mnemonics[MC_jmp] = "JMP"; //ox35
- mnemonics[MC_bze] = "BZE"; //ox36
- mnemonics[MC_bnz] = "BNZ"; //ox37
- mnemonics[MC_bpz] = "BPZ"; //ox38
- mnemonics[MC_bng] = "BNG"; //ox39
- mnemonics[MC_bcc] = "BCC"; //ox3a
- mnemonics[MC_bcs] = "BCS"; //ox3b
- mnemonics[MC_tsp] = "TSP"; //ox3c
- mnemonics[MC_jsr] = "JSR"; //ox3d
- mnemonics[MC_lbpi] = "LBPI"; //ox3e
- mnemonics[MC_fbpi] = "FBPI"; //ox3f
- mnemonics[MC_tbp] = "TBP"; //ox40
- mnemonics[MC_tsb] = "TSB"; //ox41
- mnemonics[MC_tabp] = "TABP"; //ox42
- // 初始机器指令长度表
- for (i = 0; i <= 255; i++)
- mnxlen[i] = 1;
- mnxlen[MC_lda] = 2;
- mnxlen[MC_ldx] = 2;
- mnxlen[MC_ldi] = 2;
- mnxlen[MC_lsp] = 2;
- mnxlen[MC_lspi] = 2;
- mnxlen[MC_sta] = 2;
- mnxlen[MC_stx] = 2;
- mnxlen[MC_lbpi] = 2;
- mnxlen[MC_fbpi] = 2;
- mnxlen[MC_add] = 2;
- mnxlen[MC_adi] = 2;
- mnxlen[MC_adc] = 2;
- mnxlen[MC_adx] = 2;
- mnxlen[MC_acx] = 2;
- mnxlen[MC_aci] = 2;
- mnxlen[MC_sub] = 2;
- mnxlen[MC_sbx] = 2;
- mnxlen[MC_sbi] = 2;
- mnxlen[MC_sbc] = 2;
- mnxlen[MC_scx] = 2;
- mnxlen[MC_sci] = 2;
- mnxlen[MC_cmp] = 2;
- mnxlen[MC_cpx] = 2;
- mnxlen[MC_cpi] = 2;
- mnxlen[MC_ana] = 2;
- mnxlen[MC_anx] = 2;
- mnxlen[MC_ani] = 2;
- mnxlen[MC_ora] = 2;
- mnxlen[MC_orx] = 2;
- mnxlen[MC_ori] = 2;
- mnxlen[MC_jmp] = 2;
- mnxlen[MC_bze] = 2;
- mnxlen[MC_bnz] = 2;
- mnxlen[MC_bpz] = 2;
- mnxlen[MC_bng] = 2;
- mnxlen[MC_bcc] = 2;
- mnxlen[MC_bcs] = 2;
- mnxlen[MC_jsr] = 2;
- }
复制代码 |
|