⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d52pass2.c

📁 這是一個8051的模擬器 以java寫成
💻 C
📖 第 1 页 / 共 2 页
字号:
						kcnt += fprintf(fp, "%s", cptr);

					splitcheck(i + 1);
					break;

				case OPT_LREF:					// 3 byte immediate data
					q = ((pgmmem[i + 1] & 0xff) << 8) | (pgmmem[i + 2] & 0xff);

					if (pgmflags[i + 1] & PF_NAME)
					{
						pgmflags[i + 1] |= PF_2BYTE;
						cptr = find_entry(i + 1, name_count, name_val_index);
					}
					else
					{
						cptr = find_entry(q, label_count, lab_val_index);

						if (cptr == NULL)
						{
							cptr = find_entry(q, symbol_count, sym_val_index);

							if (cptr == NULL)
							{
								if (!upperflag)
									kcnt += fprintf(fp, "X%04x", q);
								else
									kcnt += fprintf(fp, "X%04X", q);
							}
						}
					}

					if (cptr != NULL)
						kcnt += fprintf(fp, "%s", cptr);

					splitcheck(i + 1);
					splitcheck(i + 2);
					break;

				case OPT_DIR2:					// 2 byte direct addressing
					dodir(fp, i + 1);

					if ((k & 0xf) == 2 || k == 0xf5)
					{
						if (!upperflag)
							kcnt += fprintf(fp, ",a");
						else
							kcnt += fprintf(fp, ",A");
					}
					else if ((k & 0xf0) == 0x80)
					{
						kcnt += fprintf(fp, ",");

						if (k < 0x88)
						{
							if (!upperflag)
								kcnt +=  fprintf(fp, "@r%d", k & 1);
							else
								kcnt +=  fprintf(fp, "@R%d", k & 1);
						}
						else
						{
							if (!upperflag)
								kcnt += fprintf(fp, "r%d", k & 7);
							else
								kcnt += fprintf(fp, "R%d", k & 7);
						}
					}

					splitcheck(i + 1);
					break;

				case OPT_DIR3:					// mov dir,dir
					dodir(fp, i + 2);
					kcnt += fprintf(fp, ",");
					dodir(fp, i + 1);
					splitcheck(i + 1);
					splitcheck(i + 2);
					break;

				case OPT_DMM3:					// 3 byte direct and immediate addressing
					dodir(fp, i + 1);
					kcnt += fprintf(fp, ",#");
					q = (int) pgmmem[i + 2] & 0xff;

					if (pgmflags[i + 2] & PF_NAME)
						cptr = find_entry(i + 2, name_count, name_val_index);
					else
						cptr = find_entry(q, symbol_count, sym_val_index);

					if (cptr == NULL)
						puthex(q);
					else
						kcnt += fprintf(fp, "%s", cptr);

					splitcheck(i + 1);
					splitcheck(i + 2);
					break;

				case OPT_BIT2:					// 2 byte bit addressing
					dobit(fp, pgmmem[i + 1]);

					if (k == 0x92)
					{
						if (!upperflag)
							kcnt += fprintf(fp, ",c");
						else
							kcnt += fprintf(fp, ",C");
					}

					splitcheck(i + 1);
					break;

				case OPT_REL2:					// 2 byte relative addressing
					q = pgmmem[i + 1] & 0xff;
					q = (q > 0x7f) ? q | 0xff00 : q;
					q = i + 2 + q;
					q &= WORD_MASK;

					if (pgmflags[i + 1] & PF_NAME)
						cptr = find_entry(i + 1, name_count, name_val_index);
					else
						cptr = find_entry(q, label_count, lab_val_index);

					if (cptr == NULL)
					{
						if (!upperflag)
							kcnt += fprintf(fp, "X%04x", q);
						else
							kcnt += fprintf(fp, "X%04X", q);
					}
					else
						kcnt += fprintf(fp, "%s", cptr);

					splitcheck(i + 1);
					break;

				case OPT_IR3:					// 3 byte immediate and relative addressing
					q = (int) pgmmem[i + 1] & 0xff;

					if (pgmflags[i + 1] & PF_NAME)
						cptr = find_entry(i + 1, name_count, name_val_index);
					else
						cptr = find_entry(q, symbol_count, sym_val_index);

					if (cptr == NULL)
						puthex(q);
					else
						kcnt += fprintf(fp, "%s", cptr);

					q = pgmmem[i + 2] & 0xff;
					q = (q > 0x7f) ? q | 0xff00 : q;
					q = i + 3 + q;
					q &= WORD_MASK;

					if (pgmflags[i + 2] & PF_NAME)
						cptr = find_entry(i + 2, name_count, name_val_index);
					else
						cptr = find_entry(q, label_count, lab_val_index);

					if (cptr == NULL)
					{
						if (!upperflag)
							kcnt += fprintf(fp, ",X%04x", q);
						else
							kcnt += fprintf(fp, ",X%04X", q);
					}
					else
						kcnt += fprintf(fp, ",%s", cptr);

					splitcheck(i + 1);
					splitcheck(i + 2);
					break;

				case OPT_DR3:					// 3 byte direct and relative addressing
					dodir(fp, i + 1);
					q = pgmmem[i + 2] & 0xff;
					q = (q > 0x7f) ? q | 0xff00 : q;
					q = i + 3 + q;
					q &= WORD_MASK;

					if (pgmflags[i + 2] & PF_NAME)
						cptr = find_entry(i + 2, name_count, name_val_index);
					else
						cptr = find_entry(q, label_count, lab_val_index);

					if (cptr == NULL)
					{
						if (!upperflag)
							kcnt += fprintf(fp, ",X%04x", q);
						else
							kcnt += fprintf(fp, ",X%04X", q);
					}
					else
						kcnt += fprintf(fp, ",%s", cptr);

					splitcheck(i + 1);
					splitcheck(i + 2);
					break;

				case OPT_RELB:					// 3 byte bit and relative addressing
					dobit(fp, pgmmem[i + 1]);
					q = pgmmem[i + 2] & 0xff;
					q = (q > 0x7f) ? q | 0xff00 : q;
					q = i + 3 + q;
					q &= WORD_MASK;

					if (pgmflags[i + 2] & PF_NAME)
						cptr = find_entry(i + 2, name_count, name_val_index);
					else
						cptr = find_entry(q, label_count, lab_val_index);

					if (cptr == NULL)
					{
						if (!upperflag)
							kcnt += fprintf(fp, ",X%04x", q);
						else
							kcnt += fprintf(fp, ",X%04X", q);
					}
					else
						kcnt += fprintf(fp, ",%s", cptr);

					splitcheck(i + 1);
					splitcheck(i + 2);
					break;

				case OPT_112:					// 2 byte 11 bit adrs (ajmp & acall)
					q = ((k & 0xe0) << 3) | ((i + 2) & 0xf800);
					q = q | (pgmmem[i + 1] & 0xff);

					if (pgmflags[i + 1] & PF_NAME)
						cptr = find_entry(i + 1, name_count, name_val_index);
					else
						cptr = find_entry(q, label_count, lab_val_index);

					if (cptr == NULL)
					{
						if (!upperflag)
							kcnt += fprintf(fp, "X%04x", q);
						else
							kcnt += fprintf(fp, "X%04X", q);
					}
					else
						kcnt += fprintf(fp, "%s", cptr);

					splitcheck(i + 1);
					break;
			}

			if (k == 0xa5)				// if invalid opcode
				puthex(k);				// put hex defb in file

			if (hexflag)				// do comment field
			{
				while (kcnt < TSTOP)
				{
					fprintf(fp, "\t");
					kcnt = (kcnt + 8) & 0x78;
				}

				fprintf(fp,"; %04x   %02x", i, pgmmem[i] & 0xff);

				switch (opttbl[k] & OPT_SIZE)			// additional data bytes
				{
					case 0:
						fprintf(fp, "      ");
						break;

					case 1:
						fprintf(fp, " %02x   ", pgmmem[i + 1] & 0xff);
						break;

					case 2:
						fprintf(fp, " %02x %02x",
							pgmmem[i + 1] & 0xff, pgmmem[i + 2] & 0xff);
				}

				fprintf(fp, "   %c", ascii(pgmmem[i]));

				switch (opttbl[k] & OPT_SIZE)			// additional ascii
				{
					case 1:
						fprintf(fp, "%c", ascii(pgmmem[i + 1]));
						break;

					case 2:
						fprintf(fp, "%c%c",
							ascii(pgmmem[i + 1]), ascii(pgmmem[i + 2]));
				}
			}

			if (pgmflags[i] & PF_ICMT)
				output_icomment(i);

			newline = FALSE;
			i = i + (opttbl[k] & OPT_SIZE) + 1;	// update location counter

			if (j & OPT_XFER || k == 0xa5)	// if unconditional transfer or
			{											// invalid code, add a newline
				fprintf(fp, "\n;");
				newline = TRUE;
			}
		}

		if (i < oldpc)							// oops! wrapped around...
			break;

		if ((i & 0xff) < l)
			printf("\rPass 2 %04x", i & 0xff00);
	}

	if (byte_cnt)					// if any remaining ascii or binary,
		dump_bytes(i);				// output it now

	if (asc_cnt)
		dump_ascii(i);

	printf("\rPass 2 - Source generation complete");

//
// add equates for register names
//
	j = 0;

	for (i=0; i<128; i++)
	{
		if (dirregs[i] == 3)
		{
			if (!j)
			{
				if (!newline || dump)
					fprintf(fp, "\n;");

				fprintf(fp, "\n;\tRegister/Memory Equates\n;");
				newline = FALSE;
			}

			fprintf(fp, "\n%s\t%s\t", &rbname[i].dent[0], equstr);
			puthex(i);
			j = 1;
		}
	}

//
// add equates for SFR names
//
	j = 0;

	for (i=0; i<128; i++)
	{
		if (sfrflags[i] && isalpha(sfr[i].dent[0]))
		{
			if (!j)
			{
				if (!newline || dump)
					fprintf(fp, "\n;");

				fprintf(fp, "\n;\tSFR Equates\n;");
				newline = FALSE;
			}

			fprintf(fp, "\n%s\t%s\t", &sfr[i].dent[0], equstr);
			puthex(i + 0x80);
			j = 1;
		}
	}

//
// add equates for SFR bit names
//
	j = 0;

	for (i=0; i<128; i++)
	{
		if (sbflags[i] && isalpha(sfrbits[i].dent[0]))
		{
			if (!j)
			{
				if (!newline || dump)
					fprintf(fp, "\n;");

				fprintf(fp, "\n;\tSFR bit Equates\n;");
				newline = FALSE;
			}

			fprintf(fp, "\n%s\t%s\t", &sfrbits[i].dent[0], equstr);
			puthex(i + 0x80);
			j = 1;
		}
	}

//
// add equates for memory bit names
//
	j = 0;

	for (i=0; i<128; i++)
	{
		if (mbflags[i])
		{
			if (!j)
			{
				if (!newline || dump)
					fprintf(fp, "\n;");

				fprintf(fp, "\n;\tMemory bit Equates\n;");
				newline = FALSE;
			}

			if (!keilflag)
				fprintf(fp, "\n%s\t%s\t", &membits[i].dent[0], equstr);
			else
				fprintf(fp, "\n%s\t%s\t", &keilmembits[i].dent[0], equstr);

			puthex(i);
			j = 1;
		}
	}
}		// end of Pass 2

//
// Output operand for direct addressing
//

void dodir(FILE *fp, int adrs)
{
	int	dir;
	char	*cptr;

	dir = pgmmem[adrs];

	if (pgmflags[adrs] & PF_NAME)
	{
		cptr = find_entry(adrs, name_count, name_val_index);
		kcnt += fprintf(fp, "%s", cptr);
	}
	else if (dir < 0x80)
	{
		kcnt += fprintf(fp, rbname[dir].dent);
		dirregs[dir] |= 1;
	}
	else
	{
		if (keilflag)
			kcnt += fprintf(fp, "%s", keilsfr[dir & 0x7f].dent);
		else
			kcnt += fprintf(fp, "%s", sfr[dir & 0x7f].dent);
	}
}

//
// Output sfr bit name
//

void dobit(FILE *fp, int bit)
{
	bit &= 0xff;

	if (bit < 0x80)
	{
		if (!keilflag)
			kcnt += fprintf(fp, "%s", membits[bit].dent);
		else
			kcnt += fprintf(fp, "%s", keilmembits[bit].dent);
	}
	else
	{
		if (!keilflag)
			kcnt += fprintf(fp, "%s", sfrbits[bit & 0x7f].dent);
		else
			kcnt += fprintf(fp, "%s", keilsfrbits[bit & 0x7f].dent);
	}
}

// end of d52pass2.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -