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

📄 io.c

📁 一个C style Assembler的source code
💻 C
📖 第 1 页 / 共 2 页
字号:
         Value = CP - CodeTab; return MNEMONIC;      }   for (C = Reserved; C < EndR; C++)      if (CompS(Name, C->Name) == 0) {         Value = C->Value; return C->Tag;      }   Sym = LookUp(Name);   return SYMBOL;}typedef struct {   char *Name; byte Type; word Val;} ValCard;static ValCard ValTab[] = {/* Special function registers */   { "P0", SFR, 0x80 }, { "P1", SFR, 0x90 },   { "P2", SFR, 0xa0 }, { "P3", SFR, 0xb0 },   { "PCON", SFR, 0x87 }, { "TCON", SFR, 0x88 }, { "TMOD", SFR, 0x89 },   { "SCON", SFR, 0x98 }, { "SBUF", SFR, 0x99 },   { "IE",   SFR, 0xa8 }, { "IP",   SFR, 0xb8 },   { "TL0", SFR, 0x8a }, { "TL1", SFR, 0x8b },   { "TH0", SFR, 0x8c }, { "TH1", SFR, 0x8d },   { "SP",   SFR, 0x81 }, { "DPL",  SFR, 0x82 }, { "DPH",  SFR, 0x83 },   { "PSW",  SFR, 0xd0 }, { "ACC",  SFR, 0xe0 }, { "B",    SFR, 0xf0 },/* Special funcgtion register bits */   { "RI",  BIT, 0x98 }, { "TI",  BIT, 0x99 },    /* SCON */   { "RB8", BIT, 0x9a }, { "TB8", BIT, 0x9b },   { "REN", BIT, 0x9c }, { "SM2", BIT, 0x9d },   { "SM1", BIT, 0x9e }, { "SM0", BIT, 0x9f },   { "RXD",  BIT, 0xb0 }, { "TXD",  BIT, 0xb1 },  /* Port 3 */   { "INT0", BIT, 0xb2 }, { "INT1", BIT, 0xb3 },   { "T0",   BIT, 0xb4 }, { "T1",   BIT, 0xb5 },   { "WR",   BIT, 0xb6 }, { "RD",   BIT, 0xb7 },   { "P",   BIT, 0xd0 }, { "OV",  BIT, 0xd2 },    /* PSW */   { "RS0", BIT, 0xd3 }, { "RS1", BIT, 0xd4 },   { "F0",  BIT, 0xd5 }, { "AC",  BIT, 0xd6 }, { "CY",  BIT, 0xd7 },   { "IT0", BIT, 0x88 }, { "IE0", BIT, 0x89 },    /* TCON */   { "IT1", BIT, 0x8a }, { "IE1", BIT, 0x8b },   { "TR0", BIT, 0x8c }, { "TF0", BIT, 0x8d },   { "TR1", BIT, 0x8e }, { "TF1", BIT, 0x8f },   { "EX0", BIT, 0xa8 }, { "ET0", BIT, 0xa9 },    /* IE */   { "EX1", BIT, 0xaa }, { "ET1", BIT, 0xab },   { "ES",  BIT, 0xac }, { "EA",  BIT, 0xaf },   { "PX0", BIT, 0xb8 }, { "PT0", BIT, 0xb9 },    /* IP */   { "PX1", BIT, 0xba }, { "PT1", BIT, 0xbb }, { "PS",  BIT, 0xbc }};void RegInit(void) {   ValCard *V; Symbol Sym;   static ValCard *EndV = ValTab + ELEMENTS(ValTab);   for (V = ValTab; V < EndV; V++) {      Sym = LookUp(V->Name);      Sym->Defined = Sym->Address = 1;      Sym->Seg = &SegTab[V->Type], Sym->Offset = V->Val;   }} #define isoctal(Ch) (isdigit(Ch) && Ch < '8')#define isx(Ch) (tolower(Ch) == 'x' || tolower(Ch) == 'h')#define isq(Ch) (tolower(Ch) == 'q' || tolower(Ch) == 'o') char InExp = 0, InSemi = 0;Lexical OldL;#define Ret(Token) return (*U = '\0', OldL = (Token)) Lexical Scan(void) {   char *S; int Bad;Start:   U = Text;   if (isalpha(Next) || Next == '_') {      while (isalnum(Next) || Next == '_') Get();      Ret(FindKey(Text));   } else if (isdigit(Next)) {      char Ch = Next; Get();      if (Ch == '0' && isx(Next)) {         do Get(); while (isxdigit(Next));         goto RetHex;      }      if (Next == ':' && !InExp) {         char D = *Text - '0';         if (Active) {            Sym = BTab[D] = (FTab[D] == 0)? MakeLabel(): FTab[D];            FTab[D] = 0;            Sym->Global = 0, Sym->Defined = Sym->Address = Sym->Variable = 1,            Sym->Seg = SegP, Sym->Offset = (word)LOC;         } else Sym = 0;         Ret(SYMBOL);      }      while (isxdigit(Next)) Get();      if (isx(Next)) { Get(); goto RetHex; }      if (isq(Next)) { Get(); goto RetOct; }      if (U - Text == 2) {         if (tolower(Text[1]) == 'b') {            char D = *Text - '0';            if (Active) {               Sym = BTab[D];               if (Sym == 0) {                  BTab[D] = Sym = MakeLabel();                  ERROR("Undefined local symbol %cb", D);                  Sym->Global = Sym->Defined = 0,                  Sym->Address = Sym->Variable = 1,                  Sym->Seg = SegP, Sym->Offset = 0;               }            } else Sym = 0;            Ret(SYMBOL);         } else if (tolower(Text[1]) == 'f') {            char D = *Text - '0';            if (Active) {               if (FTab[D] == 0) FTab[D] = MakeLabel();               Sym = FTab[D];            } else Sym = 0;            Ret(SYMBOL);         }      }      if (tolower(U[-1]) == 'b') goto RetBin;      if (tolower(U[-1]) == 'd' || *Text != '0') goto RetDec;      if (U == Text) { Value = 0; Ret(NUMBER); }      if (isx(Text[1])) goto RetHex;      if (tolower(Text[1]) == 'b') goto RetBin;      goto RetDec;RetBin:      S = Text;      if (tolower(U[-1]) == 'b') U--;      else if (U >= S + 2 && S[0] == '0' && tolower(S[1]) == 'b') S += 2;      for (Bad = 0, Value = 0; S < U; S++) {         int D = *S - '0';         if (!isdigit(*S) || D >= 2) Bad++, D = 0;         Value = (Value << 1) | D;      }      if (Bad) ERROR("Binary number has non-binary digits.");      Ret(NUMBER);RetOct:      if (isq(U[-1])) U--;      for (Bad = 0, Value = 0, S = Text; S < U; S++) {         int D = *S - '0';         if (!isdigit(*S) || D >= 010) Bad++, D = 0;         Value = (Value << 3) | D;      }      if (Bad) ERROR("Octal number has non-octal digits.");      Ret(NUMBER);RetDec:      if (tolower(U[-1]) == 'd') U--;      for (Bad = 0, Value = 0, S = Text; S < U; S++) {         int D = *S - '0';         if (!isdigit(*S)) Bad++, D = 0;         Value = 10*Value + D;      }      if (Bad) ERROR("Decimal number has non-decimal digits.");      Ret(NUMBER);RetHex:      S = Text;      if (isx(U[-1])) U--;      else if (U >= S + 2 && S[0] == '0' && isx(S[1])) S += 2;      for (Value = 0; S < U; S++) {         Value <<= 4, Value += isdigit(*S)? *S - '0': tolower(*S) - 'a' + 10;      }      Ret(NUMBER);   }   switch (Next) {      case ';': switch (Get(), Next) {         case ';':            while (Next != '\n') {               if (Next == EOF) FATAL("Unexpected EOF inside ;; comment.");               Next = fgetc(InF);            }            Get();            if (!InSemi) goto Start;         default: Ret(SEMI);      }      break;      case '/': switch (Get(), Next) {         case '/':            while (Next != '\n') {               if (Next == EOF) FATAL("Unexpected EOF inside // comment.");               Next = fgetc(InF);            }            Get();            if (!InSemi) goto Start;         Ret(SEMI);         case '*': {            int Line0 = Line;            Next = fgetc(InF);            while (Next != EOF) {               if (Next == '*') {                  while (Next == '*') Next = fgetc(InF);                  if (Next == '/') {                     Next = fgetc(InF);                     if (Line <= Line0 || !InSemi) goto Start;                     Ret(SEMI);                  }               } else {                  if (Next == '\n') Line++; Next = fgetc(InF);               }            }            FATAL("Unexpected EOF inside comment.");         }         default: Ret(DIV);      }      case '\'':	 Get();         if (Next == '\'') {            ERROR("Empty character constant."); Get(); Value = 0; Ret(NUMBER);         }	 if (Next == '\\') {            int I;	    Get();	    if (isoctal(Next)) {	       for (Value = 0; isoctal(Next); Get())                  Value <<= 3, Value += Next - '0';	    } else if (tolower(Next) == 'x') {	       Get();               if (!isxdigit(Next)) {                  ERROR("Bad hexadecimal character.");                  Value = 'x';               } else for (I = 0; I < 2 && isxdigit(Next); I++, Get()) {                  Value <<= 4;                  Value += isdigit(Next)? Next - '0': tolower(Next) - 'a' + 10;               }	    } else {               switch (Next) {                  case 'a': Value = 0x07; break;                  case 'b': Value = 0x08; break;                  case 't': Value = 0x09; break;                  case 'n': Value = 0x0a; break;                  case 'v': Value = 0x0b; break;                  case 'f': Value = 0x0c; break;                  case 'r': Value = 0x0d; break;                  default: Value = Next; break;               }               Get();            }	 } else Value = Next, Get();	 if (Next != '\'') ERROR("Missing a ' in character constant.");         else Get();      Ret(NUMBER);      case '"':         Next = fgetc(InF);         while (Next != '\"') {            if (Next == EOF) FATAL("Unexpected EOF inside string.");            else if (Next == '\\') {               Next = fgetc(InF);               if (Next == EOF) FATAL("Unexpected EOF inside string.");	       if (isoctal(Next)) {                  char Value = 0;                  while (isoctal(Next)) {                     Value = (Value << 3) + (Next - '0');                     Next = fgetc(InF);                  }                  *U++ = Value;	       } else if (tolower(Next) == 'x') {                  char Value;                  Next = fgetc(InF);                  if (!isxdigit(Next)) Value = 'x';		  else while (isxdigit(Next)) {                     Value <<= 4;                     Value += isdigit(Next)? Next - '0': tolower(Next) - 'a' + 10;                     Next = fgetc(InF);                  }                  *U++ = Value;	       } else {                  if (Next == '\n') Line++;                  switch (Next) {                     case 'a': *U++ = '\a'; break;                     case 'b': *U++ = '\b'; break;                     case 't': *U++ = '\t'; break;                     case 'n': *U++ = '\n'; break;                     case 'v': *U++ = '\v'; break;                     case 'f': *U++ = '\f'; break;                     case 'r': *U++ = '\r'; break;                     default: *U++ = Next; break;                  }                  Next = fgetc(InF);               }	    } else {               if (Next == '\n') Line++;               *U++ = Next; Next = fgetc(InF);            }         }         Next = fgetc(InF);      Ret(STRING);      case '<': switch (Get(), Next) {	 case '=': Get(); Ret(LE);	 case '<': Get(); Ret(SHL);         default: Ret(LT);      }      case '>': switch (Get(), Next) {	 case '=': Get(); Ret(GE);	 case '>': Get(); Ret(SHR);	 default: Ret(GT);      }      case '&': switch (Get(), Next) {	 case '&': Get(); Ret(AND_AND);	 default: Ret(AND);      }      case '|': switch (Get(), Next) {	 case '|': Get(); Ret(OR_OR);	 default: Ret(OR);      }      case '=': switch (Get(), Next) {	 case '=': Get(); Ret(EQ);	 default: Ret(SET);      }      case '!': switch (Get(), Next) {	 case '=': Get(); Ret(NE);	 default: Ret(NOT_NOT);      }      case '\n': Get(); if (!InSemi) goto Start; Ret(SEMI);      case '^': Get(); Ret(XOR);      case '+': Get(); Ret(PLUS);      case '-': Get(); Ret(MINUS);      case '*': Get(); Ret(MULT);      case '%': Get(); Ret(MOD);      case '@': Get(); Ret(AT);      case '#': Get(); Ret(POUND);      case '$': Get(); Ret(DOLLAR);      case '.': Get(); Ret(DOT);      case '~': Get(); Ret(NOT);      case ',': Get(); Ret(COMMA);      case ':': Get(); Ret(COLON);      case '?': Get(); Ret(QUEST);      case '{': Get(); Ret(LCURL);      case '}': Get(); Ret(RCURL);      case '(': Get(); Ret(LPAR);      case ')': Get(); Ret(RPAR);      case 0: Ret(0);      default: Get(); goto Start;   }} 

⌨️ 快捷键说明

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