diff --git a/code6805.c b/code6805.c index 0a087af..54a9e92 100644 --- a/code6805.c +++ b/code6805.c @@ -392,6 +392,8 @@ BEGIN if (DecodePseudo()) return; + if (DecodeTimexPseudo(True)) return; + if (DecodeMotoPseudo(True)) return; /* Anweisungen ohne Argument */ diff --git a/codepseudo.c b/codepseudo.c index 8d474de..f655f3d 100644 --- a/codepseudo.c +++ b/codepseudo.c @@ -761,6 +761,373 @@ BEGIN return LookupInstTable(InstTable,OpPart); END + +static unsigned char timex_translate(unsigned char c) +{ + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return c-'0'; + case 'a': + case 'A': + case 'b': + case 'B': + case 'c': + case 'C': + case 'd': + case 'D': + case 'e': + case 'E': + case 'f': + case 'F': + case 'g': + case 'G': + case 'h': + case 'H': + case 'i': + case 'I': + case 'j': + case 'J': + case 'k': + case 'K': + case 'l': + case 'L': + case 'm': + case 'M': + case 'n': + case 'N': + case 'o': + case 'O': + case 'p': + case 'P': + case 'q': + case 'Q': + case 'r': + case 'R': + case 's': + case 'S': + case 't': + case 'T': + case 'u': + case 'U': + case 'v': + case 'V': + case 'w': + case 'W': + case 'x': + case 'X': + case 'y': + case 'Y': + case 'z': + case 'Z': + c &= ~0x20; + return 0xa + c - 'A'; + case ' ': + return 0x24; + case '!': + return 0x25; + case '"': + return 0x26; + case '#': + return 0x27; + case '>': + return 0x28; + case '%': + return 0x29; + case '&': + return 0x2a; + case '\'': + return 0x2b; + case '(': + return 0x2c; + case ')': + return 0x2d; + case '*': + return 0x2e; + case '+': + return 0x2f; + case ',': + return 0x30; + case '-': + return 0x31; + case '.': + return 0x32; + case '/': + return 0x33; + case ':': + return 0x34; + case '\\': + return 0x35; + case '=': + return 0x37; + case '?': + return 0x39; + case '_': + return 0x3a; + default: + WrError(1320); + CodeLen=0; + fprintf (stderr, "Cannot encode %c in 'timex' encoding\n", c); + } +} + + +static void timex_translate_buf(unsigned char *c, size_t l) +{ + for (;l;c++,l--) + *c = timex_translate(*c); +} + + + static void DecodeTIMEX(Word Index) +BEGIN + int z; + Boolean OK; + TempResult t; + LongInt Rep,z2; + + if (ArgCnt==0) WrError(1110); + else + BEGIN + z=1; OK=True; + do + BEGIN + KillBlanks(ArgStr[z]); + OK=CutRep(ArgStr[z],&Rep); + if (OK) + BEGIN + EvalExpression(ArgStr[z],&t); + switch (t.Typ) + BEGIN + case TempInt: + if (NOT RangeCheck(t.Contents.Int,Int8)) + BEGIN + WrError(1320); OK=False; + END + else if (CodeLen+Rep>MaxCodeLen) + BEGIN + WrError(1920); OK=False; + END + else + BEGIN + memset(BAsmCode+CodeLen,t.Contents.Int,Rep); + timex_translate_buf(BAsmCode+CodeLen,Rep); + CodeLen+=Rep; + END + break; + case TempFloat: + WrError(1135); OK=False; + break; + case TempString: + TranslateString(t.Contents.Ascii); + if (CodeLen+Rep*strlen(t.Contents.Ascii)>MaxCodeLen) + BEGIN + WrError(1920); OK=False; + END + else for (z2=0; z2MaxCodeLen) + BEGIN + WrError(1920); OK=False; + END + else + BEGIN + memset(BAsmCode+CodeLen,t.Contents.Int,Rep); + timex6_translate_buf(BAsmCode+CodeLen,Rep); + CodeLen+=Rep; + END + break; + case TempFloat: + WrError(1135); OK=False; + break; + case TempString: + TranslateString(t.Contents.Ascii); + if (CodeLen+Rep*strlen(t.Contents.Ascii)>MaxCodeLen) + BEGIN + WrError(1920); OK=False; + END + else for (z2=0; z2>2,bpos=(Pos&3)*4; diff --git a/codepseudo.h b/codepseudo.h index 0ffbfe8..fc164a7 100644 --- a/codepseudo.h +++ b/codepseudo.h @@ -24,6 +24,8 @@ extern void ConvertDec(Double F, Word *w); extern Boolean DecodeIntelPseudo(Boolean Turn); +extern Boolean DecodeTimexPseudo(Boolean Turn); + extern Boolean DecodeMotoPseudo(Boolean Turn); extern void AddMoto16PseudoONOFF(void);