summaryrefslogtreecommitdiffstats
path: root/master/timex-pseudo-instructions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'master/timex-pseudo-instructions.patch')
-rw-r--r--master/timex-pseudo-instructions.patch404
1 files changed, 404 insertions, 0 deletions
diff --git a/master/timex-pseudo-instructions.patch b/master/timex-pseudo-instructions.patch
new file mode 100644
index 0000000..6e5ba04
--- /dev/null
+++ b/master/timex-pseudo-instructions.patch
@@ -0,0 +1,404 @@
+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; z2<Rep; z2++)
++ BEGIN
++ memcpy(BAsmCode+CodeLen,t.Contents.Ascii,strlen(t.Contents.Ascii));
++ timex_translate_buf(BAsmCode+CodeLen,strlen(t.Contents.Ascii));
++ CodeLen+=strlen(t.Contents.Ascii);
++ END
++ break;
++ default:
++ OK=False;
++ break;
++ END
++ END
++ z++;
++ END
++ while ((z<=ArgCnt) AND (OK));
++ if (NOT OK) CodeLen=0;
++ END
++END
++
++
++static unsigned char timex6_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':
++ c &= ~0x20;
++ return 0xa + c - 'A';
++
++ case 'i':
++ case 'I':
++ case ':':
++ return 0x12;
++ case 'l':
++ case 'L':
++ case 'm':
++ case 'M':
++ case 'n':
++ case 'N':
++ c &= ~0x20;
++ return 0x13 + c - 'L';
++ case 'o':
++ case 'O':
++ return 0x0;
++ case 'p':
++ case 'P':
++ return 0x16;
++ case 'r':
++ return 0x1c;
++ case 'R':
++ return 0x17;
++ case 's':
++ case 'S':
++ return 0x5;
++ case 't':
++ case 'T':
++ case 'u':
++ case 'U':
++ return 0x18 + c - 'T';
++ case 'w':
++ case 'W':
++ return 0x1a;
++ case 'y':
++ case 'Y':
++ return 0x1b;
++ case ' ':
++ return 0x1d;
++ case '-':
++ return 0x1e;
++ case '+':
++ return 0x1f;
++ default:
++ WrError(1320);
++ CodeLen=0;
++ fprintf (stderr, "Cannot encode %c in 'timex6' encoding\n", c);
++ }
++}
++
++
++static void timex6_translate_buf(unsigned char *c, size_t l)
++{
++ for (;l;c++,l--)
++ *c = timex6_translate(*c);
++}
++
++
++ static void DecodeTIMEX6(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);
++ 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<Rep; z2++)
++ BEGIN
++ memcpy(BAsmCode+CodeLen,t.Contents.Ascii,strlen(t.Contents.Ascii));
++ timex6_translate_buf(BAsmCode+CodeLen,strlen(t.Contents.Ascii));
++ CodeLen+=strlen(t.Contents.Ascii);
++ END
++ break;
++ default:
++ OK=False;
++ break;
++ END
++ END
++ z++;
++ END
++ while ((z<=ArgCnt) AND (OK));
++ if (NOT OK) CodeLen=0;
++ END
++END
++
++
++ Boolean DecodeTimexPseudo(Boolean Turn)
++BEGIN
++ static PInstTable InstTable=Nil;
++
++ if (InstTable==Nil)
++ BEGIN
++ InstTable=CreateInstTable(17);
++ AddInstTable(InstTable,"DB",0,DecodeBYT);
++ AddInstTable(InstTable,"TIMEX",0,DecodeTIMEX);
++ AddInstTable(InstTable,"TIMEX6",0,DecodeTIMEX6);
++ END
++
++ M16Turn=Turn;
++ return LookupInstTable(InstTable,OpPart);
++END
++
++
+ static void DigIns(char Ch, Byte Pos, Word *w)
+ BEGIN
+ Byte wpos=Pos>>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);