📄 d52pass2.c
字号:
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 + -