aboutsummaryrefslogtreecommitdiffstats
path: root/codepseudo.c
diff options
context:
space:
mode:
Diffstat (limited to 'codepseudo.c')
-rw-r--r--codepseudo.c1246
1 files changed, 1246 insertions, 0 deletions
diff --git a/codepseudo.c b/codepseudo.c
new file mode 100644
index 0000000..8d474de
--- /dev/null
+++ b/codepseudo.c
@@ -0,0 +1,1246 @@
+/* codepseudo.c */
+/*****************************************************************************/
+/* AS-Portierung */
+/* */
+/* Haeufiger benutzte Pseudo-Befehle */
+/* */
+/* Historie: 23. 5.1996 Grundsteinlegung */
+/* 7. 7.1998 Fix Zugriffe auf CharTransTable wg. signed chars */
+/* 18. 8.1998 BookKeeping-Aufrufe bei SPeicherreservierungen */
+/* */
+/*****************************************************************************/
+
+#include "stdinc.h"
+#include <string.h>
+
+#include "nls.h"
+#include "bpemu.h"
+#include "endian.h"
+#include "strutil.h"
+#include "chunks.h"
+#include "asmdef.h"
+#include "asmsub.h"
+#include "asmpars.h"
+#include "asmallg.h"
+#include "asmitree.h"
+
+#include "codepseudo.h"
+
+
+ int FindInst(void *Field, int Size, int Count)
+BEGIN
+ char *cptr,**ptr;
+
+#ifdef OPT
+ int l=0,r=Count-1,m,res;
+
+ while (TRUE)
+ BEGIN
+ m=(l+r)>>1; cptr=((char *) Field)+(Size*m);
+ ptr=(char**) cptr;
+ res=strcmp(*ptr,OpPart);
+ if (res==0) return m;
+ else if (l==r) return -1;
+ else if (res<0)
+ BEGIN
+ if (r-l==1) return -1; else l=m;
+ END
+ else r=m;
+ END
+
+#else
+ int z,res;
+
+ cptr=(char *) Field;
+ for (z=0; z<Count; z++)
+ BEGIN
+ ptr=(char**) cptr;
+ res=strcmp(*ptr,OpPart);
+ if (res==0) return z;
+ if (res>0) return -1;
+ cptr+=Size;
+ END
+ return -1;
+#endif
+END
+
+
+ Boolean IsIndirect(char *Asc)
+BEGIN
+ int z,Level,l;
+
+ if (((l=strlen(Asc))<=2) OR (Asc[0]!='(') OR (Asc[l-1]!=')')) return False;
+
+ Level=0;
+ for (z=1; z<=l-2; z++)
+ BEGIN
+ if (Asc[z]=='(') Level++;
+ if (Asc[z]==')') Level--;
+ if (Level<0) return False;
+ END
+
+ return True;
+END
+
+
+static enum{DSNone,DSConstant,DSSpace} DSFlag;
+typedef Boolean (*TLayoutFunc)(
+#ifdef __PROTOS__
+ char *Asc, Word *Cnt, Boolean Turn
+#endif
+ );
+
+ static Boolean LayoutByte(char *Asc, Word *Cnt, Boolean Turn)
+BEGIN
+ Boolean Result;
+ TempResult t;
+
+ Result=False;
+
+ if (strcmp(Asc,"?")==0)
+ BEGIN
+ if (DSFlag==DSConstant) WrError(1930);
+ else
+ BEGIN
+ *Cnt=1; Result=True; DSFlag=DSSpace; CodeLen++;
+ END
+ return Result;
+ END
+ else
+ BEGIN
+ if (DSFlag==DSSpace)
+ BEGIN
+ WrError(1930); return Result;
+ END
+ else DSFlag=DSConstant;
+ END
+
+ FirstPassUnknown=False; EvalExpression(Asc,&t);
+ switch (t.Typ)
+ BEGIN
+ case TempInt:
+ if (FirstPassUnknown) t.Contents.Int&=0xff;
+ if (NOT RangeCheck(t.Contents.Int,Int8)) WrError(1320);
+ else
+ BEGIN
+ BAsmCode[CodeLen++]=t.Contents.Int; *Cnt=1;
+ Result=True;
+ END;
+ break;
+ case TempFloat:
+ WrError(1135);
+ break;
+ case TempString:
+ TranslateString(t.Contents.Ascii);
+ memcpy(BAsmCode+CodeLen,t.Contents.Ascii,strlen(t.Contents.Ascii));
+ CodeLen+=(*Cnt=strlen(t.Contents.Ascii));
+ Result=True;
+ break;
+ case TempNone:
+ break;
+ END
+
+ return Result;
+END
+
+
+ static Boolean LayoutWord(char *Asc, Word *Cnt, Boolean Turn)
+BEGIN
+ Boolean OK,Result;
+ Word erg;
+
+ *Cnt=2; Result=False;
+
+ if (strcmp(Asc,"?")==0)
+ BEGIN
+ if (DSFlag==DSConstant) WrError(1930);
+ else
+ BEGIN
+ Result=True; DSFlag=DSSpace; CodeLen+=2;
+ END
+ return Result;
+ END
+ else
+ BEGIN
+ if (DSFlag==DSSpace)
+ BEGIN
+ WrError(1930); return Result;
+ END
+ else DSFlag=DSConstant;
+ END
+
+ if (CodeLen+2>MaxCodeLen)
+ BEGIN
+ WrError(1920); return Result;
+ END
+ erg=EvalIntExpression(Asc,Int16,&OK);
+ if (OK)
+ BEGIN
+ if (Turn) erg=((erg>>8)&0xff)+((erg&0xff)<<8);
+ BAsmCode[CodeLen]=erg&0xff; BAsmCode[CodeLen+1]=erg>>8;
+ CodeLen+=2;
+ END
+ return OK;
+END
+
+
+ static Boolean LayoutDoubleWord(char *Asc, Word *Cnt, Boolean Turn)
+BEGIN
+ TempResult erg;
+ Boolean Result=False;
+
+ *Cnt=4;
+
+ if (strcmp(Asc,"?")==0)
+ BEGIN
+ if (DSFlag==DSConstant) WrError(1930);
+ else
+ BEGIN
+ Result=True; DSFlag=DSSpace; CodeLen+=4;
+ END
+ return Result;
+ END
+ else
+ BEGIN
+ if (DSFlag==DSSpace)
+ BEGIN
+ WrError(1930); return Result;
+ END
+ else DSFlag=DSConstant;
+ END
+
+ if (CodeLen+4>MaxCodeLen)
+ BEGIN
+ WrError(1920); return Result;
+ END
+
+ KillBlanks(Asc); EvalExpression(Asc,&erg);
+ switch (erg.Typ)
+ BEGIN
+ case TempNone: return Result;
+ case TempInt:
+ if (RangeCheck(erg.Contents.Int,Int32))
+ BEGIN
+ BAsmCode[CodeLen ]=((erg.Contents.Int )&0xff);
+ BAsmCode[CodeLen+1]=((erg.Contents.Int>> 8)&0xff);
+ BAsmCode[CodeLen+2]=((erg.Contents.Int>>16)&0xff);
+ BAsmCode[CodeLen+3]=((erg.Contents.Int>>24)&0xff);
+ CodeLen+=4;
+ END
+ else
+ BEGIN
+ WrError(1320);
+ return Result;
+ END
+ break;
+ case TempFloat:
+ if (FloatRangeCheck(erg.Contents.Float,Float32))
+ BEGIN
+ Double_2_ieee4(erg.Contents.Float,BAsmCode+CodeLen,False);
+ CodeLen+=4;
+ END
+ else
+ BEGIN
+ WrError(1320);
+ return Result;
+ END
+ break;
+ case TempString:
+ WrError(1135);
+ return Result;
+ END
+
+ if (Turn) DSwap(BAsmCode+CodeLen-4,4);
+ return True;
+END
+
+
+ static Boolean LayoutQuadWord(char *Asc, Word *Cnt, Boolean Turn)
+BEGIN
+ Boolean Result;
+ TempResult erg;
+#ifndef HAS64
+ int z;
+#endif
+
+ Result=False; *Cnt=8;
+
+ if (strcmp(Asc,"?")==0)
+ BEGIN
+ if (DSFlag==DSConstant) WrError(1930);
+ else
+ BEGIN
+ Result=True; DSFlag=DSSpace; CodeLen+=8;
+ END
+ return Result;
+ END
+ else
+ BEGIN
+ if (DSFlag==DSSpace)
+ BEGIN
+ WrError(1930); return Result;
+ END
+ else DSFlag=DSConstant;
+ END
+
+ if (CodeLen+8>MaxCodeLen)
+ BEGIN
+ WrError(1920); return Result;
+ END
+
+ KillBlanks(Asc); EvalExpression(Asc,&erg);
+ switch(erg.Typ)
+ BEGIN
+ case TempNone:
+ return Result;
+ case TempInt:
+ memcpy(BAsmCode+CodeLen,&(erg.Contents.Int),sizeof(LargeInt));
+#ifdef HAS64
+ if (BigEndian) QSwap(BAsmCode+CodeLen,8);
+#else
+ if (BigEndian) DSwap(BAsmCode+CodeLen,4);
+ for (z=4; z<8; BAsmCode[CodeLen+(z++)]=(BAsmCode[CodeLen+3]>=0x80)?0xff:0x00);
+#endif
+ CodeLen+=8;
+ break;
+ case TempFloat:
+ Double_2_ieee8(erg.Contents.Float,BAsmCode+CodeLen,False);
+ CodeLen+=8;
+ break;
+ case TempString:
+ WrError(1135);
+ return Result;
+ END
+
+ if (Turn) QSwap(BAsmCode+CodeLen-8,8);
+ return True;
+END
+
+
+ static Boolean LayoutTenBytes(char *Asc, Word *Cnt, Boolean Turn)
+BEGIN
+ Boolean OK,Result;
+ Double erg;
+ int z;
+ Byte Exg;
+
+ Result=False; *Cnt=10;
+
+ if (strcmp(Asc,"?")==0)
+ BEGIN
+ if (DSFlag==DSConstant) WrError(1930);
+ else
+ BEGIN
+ Result=True; DSFlag=DSSpace; CodeLen+=10;
+ END
+ return Result;
+ END
+ else
+ BEGIN
+ if (DSFlag==DSSpace)
+ BEGIN
+ WrError(1930); return Result;
+ END
+ else DSFlag=DSConstant;
+ END
+
+ if (CodeLen+10>MaxCodeLen)
+ BEGIN
+ WrError(1920); return Result;
+ END
+ erg=EvalFloatExpression(Asc,Float64,&OK);
+ if (OK)
+ BEGIN
+ Double_2_ieee10(erg,BAsmCode+CodeLen,False);
+ CodeLen+=10;
+ if (Turn)
+ for (z=0; z<5; z++)
+ BEGIN
+ Exg=BAsmCode[CodeLen-10+z];
+ BAsmCode[CodeLen-10+z]=BAsmCode[CodeLen-1-z];
+ BAsmCode[CodeLen-1-z]=Exg;
+ END
+ END
+ return OK;
+END
+
+
+ static Boolean DecodeIntelPseudo_ValidSymChar(char ch)
+BEGIN
+ return (((ch>='A') AND (ch<='Z')) OR ((ch>='0') AND (ch<='9')) OR (ch=='_') OR (ch=='.'));
+END
+
+ static Boolean DecodeIntelPseudo_LayoutMult(char *Asc_O, Word *Cnt,
+ TLayoutFunc LayoutFunc,
+ Boolean Turn)
+BEGIN
+ int z,Depth,Fnd,ALen;
+ String Asc,Part;
+ Word SumCnt,ECnt,SInd;
+ LongInt Rep;
+ Boolean OK,Hyp;
+
+ strmaxcpy(Asc,Asc_O,255);
+
+ /* nach DUP suchen */
+
+ Depth=0; Fnd=0; ALen=strlen(Asc);
+ for (z=0; z<ALen-2; z++)
+ BEGIN
+ if (Asc[z]=='(') Depth++;
+ else if (Asc[z]==')') Depth--;
+ else if (Depth==0)
+ if ( ((z==0) OR (NOT DecodeIntelPseudo_ValidSymChar(Asc[z-1])))
+ AND (NOT DecodeIntelPseudo_ValidSymChar(Asc[z+3]))
+ AND (strncasecmp(Asc+z,"DUP",3)==0)) Fnd=z;
+ END
+
+ /* DUP gefunden: */
+
+ if (Fnd!=0)
+ BEGIN
+ /* Anzahl ausrechnen */
+
+ FirstPassUnknown=False;
+ Asc[Fnd]='\0'; Rep=EvalIntExpression(Asc,Int32,&OK); Asc[Fnd]='D';
+ if (FirstPassUnknown)
+ BEGIN
+ WrError(1820); return False;
+ END
+ if (NOT OK) return False;
+
+ /* Nullargument vergessen, bei negativem warnen */
+
+ if (Rep<0) WrError(270);
+ if (Rep<=0) return True;
+
+ /* Einzelteile bilden & evaluieren */
+
+ strcpy(Asc,Asc+Fnd+3); KillPrefBlanks(Asc); SumCnt=0;
+ if ((strlen(Asc)>=2) AND (*Asc=='(') AND (Asc[strlen(Asc)-1]==')'))
+ BEGIN
+ strcpy(Asc,Asc+1); Asc[strlen(Asc)-1]='\0';
+ END
+ do
+ BEGIN
+ Fnd=0; z=0; Hyp=False; Depth=0;
+ do
+ BEGIN
+ if (Asc[z]=='\'') Hyp=NOT Hyp;
+ else if (NOT Hyp)
+ BEGIN
+ if (Asc[z]=='(') Depth++;
+ else if (Asc[z]==')') Depth--;
+ else if ((Depth==0) AND (Asc[z]==',')) Fnd=z;
+ END
+ z++;
+ END
+ while ((z<strlen(Asc)) AND (Fnd==0));
+ if (Fnd==0)
+ BEGIN
+ strmaxcpy(Part,Asc,255); *Asc='\0';
+ END
+ else
+ BEGIN
+ Asc[Fnd]='\0'; strmaxcpy(Part,Asc,255);
+ strcpy(Asc,Asc+Fnd+1);
+ END
+ if (NOT DecodeIntelPseudo_LayoutMult(Part,&ECnt,LayoutFunc,Turn))
+ return False;
+ SumCnt+=ECnt;
+ END
+ while (*Asc!='\0');
+
+ /* Ergebnis vervielfachen */
+
+ if (DSFlag==DSConstant)
+ BEGIN
+ SInd=CodeLen-SumCnt;
+ if (CodeLen+SumCnt*(Rep-1)>MaxCodeLen)
+ BEGIN
+ WrError(1920); return False;
+ END
+ for (z=1; z<=Rep-1; z++)
+ BEGIN
+ if (CodeLen+SumCnt>MaxCodeLen) return False;
+ memcpy(BAsmCode+CodeLen,BAsmCode+SInd,SumCnt);
+ CodeLen+=SumCnt;
+ END
+ END
+ else CodeLen+=SumCnt*(Rep-1);
+ *Cnt=SumCnt*Rep; return True;
+ END
+
+ /* kein DUP: einfacher Ausdruck */
+
+ else return LayoutFunc(Asc,Cnt,Turn);
+END
+
+ Boolean DecodeIntelPseudo(Boolean Turn)
+BEGIN
+ Word Dummy;
+ int z;
+ TLayoutFunc LayoutFunc=Nil;
+ Boolean OK;
+ LongInt HVal;
+ char Ident;
+
+ if ((strlen(OpPart)!=2) OR (*OpPart!='D')) return False;
+ Ident=OpPart[1];
+
+ if ((Ident=='B') OR (Ident=='W') OR (Ident=='D') OR (Ident=='Q') OR (Ident=='T'))
+ BEGIN
+ DSFlag=DSNone;
+ switch (Ident)
+ BEGIN
+ case 'B':
+ LayoutFunc=LayoutByte;
+ if (*LabPart!='\0') SetSymbolSize(LabPart,0);
+ break;
+ case 'W':
+ LayoutFunc=LayoutWord;
+ if (*LabPart!='\0') SetSymbolSize(LabPart,1);
+ break;
+ case 'D':
+ LayoutFunc=LayoutDoubleWord;
+ if (*LabPart!='\0') SetSymbolSize(LabPart,2);
+ break;
+ case 'Q':
+ LayoutFunc=LayoutQuadWord;
+ if (*LabPart!='\0') SetSymbolSize(LabPart,3);
+ break;
+ case 'T':
+ LayoutFunc=LayoutTenBytes;
+ if (*LabPart!='\0') SetSymbolSize(LabPart,4);
+ break;
+ END
+ z=1;
+ do
+ BEGIN
+ OK=DecodeIntelPseudo_LayoutMult(ArgStr[z],&Dummy,LayoutFunc,Turn);
+ if (NOT OK) CodeLen=0;
+ z++;
+ END
+ while ((OK) AND (z<=ArgCnt));
+ DontPrint=(DSFlag==DSSpace);
+ if (DontPrint) BookKeeping();
+ if (OK) ActListGran=1;
+ return True;
+ END
+
+ if (Ident=='S')
+ BEGIN
+ if (ArgCnt!=1) WrError(1110);
+ else
+ BEGIN
+ FirstPassUnknown=False;
+ HVal=EvalIntExpression(ArgStr[1],Int32,&OK);
+ if (FirstPassUnknown) WrError(1820);
+ else if (OK)
+ BEGIN
+ DontPrint=True; CodeLen=HVal;
+ BookKeeping();
+ END
+ END
+ return True;
+ END
+
+ return False;
+END
+
+/*--------------------------------------------------------------------------*/
+
+static Boolean M16Turn=False;
+
+ static Boolean CutRep(char *Asc, LongInt *Erg)
+BEGIN
+ char *p;
+ Boolean OK;
+
+ if (*Asc!='[')
+ BEGIN
+ *Erg=1; return True;
+ END
+ else
+ BEGIN
+ strcpy(Asc,Asc+1); p=QuotPos(Asc,']');
+ if (p==Nil)
+ BEGIN
+ WrError(1300); return False;
+ END
+ else
+ BEGIN
+ *p='\0';
+ *Erg=EvalIntExpression(Asc,Int32,&OK);
+ strcpy(Asc,p+1); return OK;
+ END
+ END
+END
+
+ static void DecodeBYT(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);
+ 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));
+ 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 void DecodeADR(Word Index)
+BEGIN
+ int z;
+ Word HVal16;
+ Boolean OK;
+ LongInt Rep,z2;
+
+ if (ArgCnt==0) WrError(1110);
+ else
+ BEGIN
+ z=1; OK=True;
+ do
+ BEGIN
+ OK=CutRep(ArgStr[z],&Rep);
+ if (OK)
+ if (CodeLen+(Rep<<1)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ HVal16=EvalIntExpression(ArgStr[z],Int16,&OK);
+ if (OK)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ if (M16Turn)
+ BEGIN
+ BAsmCode[CodeLen++]=Hi(HVal16);
+ BAsmCode[CodeLen++]=Lo(HVal16);
+ END
+ else
+ BEGIN
+ BAsmCode[CodeLen++]=Lo(HVal16);
+ BAsmCode[CodeLen++]=Hi(HVal16);
+ END
+ END
+ END
+ z++;
+ END
+ while ((z<=ArgCnt) AND (OK));
+ if (NOT OK) CodeLen=0;
+ END
+END
+
+ static void DecodeFCC(Word Index)
+BEGIN
+ String SVal;
+ Boolean OK;
+ int z;
+ LongInt Rep,z2;
+
+ if (ArgCnt==0) WrError(1110);
+ else
+ BEGIN
+ z=1; OK=True;
+ do
+ BEGIN
+ OK=CutRep(ArgStr[z],&Rep);
+ if (OK)
+ BEGIN
+ EvalStringExpression(ArgStr[z],&OK,SVal);
+ if (OK)
+ if (CodeLen+Rep*strlen(SVal)>=MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ TranslateString(SVal);
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ memcpy(BAsmCode+CodeLen,SVal,strlen(SVal));
+ CodeLen+=strlen(SVal);
+ END
+ END
+ END
+ z++;
+ END
+ while ((z<=ArgCnt) AND (OK));
+ if (NOT OK) CodeLen=0;
+ END
+END
+
+ static void DecodeDFS(Word Index)
+BEGIN
+ Word HVal16;
+ Boolean OK;
+
+ if (ArgCnt!=1) WrError(1110);
+ else
+ BEGIN
+ FirstPassUnknown=False;
+ HVal16=EvalIntExpression(ArgStr[1],Int16,&OK);
+ if (FirstPassUnknown) WrError(1820);
+ else if (OK)
+ BEGIN
+ DontPrint=True; CodeLen=HVal16;
+ BookKeeping();
+ END
+ END
+END
+
+ Boolean DecodeMotoPseudo(Boolean Turn)
+BEGIN
+ static PInstTable InstTable=Nil;
+
+ if (InstTable==Nil)
+ BEGIN
+ InstTable=CreateInstTable(17);
+ AddInstTable(InstTable,"BYT",0,DecodeBYT);
+ AddInstTable(InstTable,"FCB",0,DecodeBYT);
+ AddInstTable(InstTable,"ADR",0,DecodeADR);
+ AddInstTable(InstTable,"FDB",0,DecodeADR);
+ AddInstTable(InstTable,"FCC",0,DecodeFCC);
+ AddInstTable(InstTable,"DFS",0,DecodeDFS);
+ AddInstTable(InstTable,"RMB",0,DecodeDFS);
+ 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;
+ Word dig=Ch-'0';
+
+ w[wpos]|=(dig<<bpos);
+END
+
+ void ConvertDec(Double F, Word *w)
+BEGIN
+ char s[30],Man[30],Exp[30];
+ char *h;
+ LongInt z;
+ Byte epos;
+
+ sprintf(s,"%0.16e",F); h=strchr(s,'e');
+ if (h==Nil)
+ BEGIN
+ strcpy(Man,s); strcpy(Exp,"+0000");
+ END
+ else
+ BEGIN
+ *h='\0';
+ strcpy(Man,s); strcpy(Exp,h+1);
+ END
+ memset(w,0,12);
+ if (*Man=='-')
+ BEGIN
+ w[5]|=0x8000; strcpy(Man,Man+1);
+ END
+ else if (*Man=='+') strcpy(Man,Man+1);
+ if (*Exp=='-')
+ BEGIN
+ w[5]|=0x4000; strcpy(Exp,Exp+1);
+ END
+ else if (*Exp=='+') strcpy(Exp,Exp+1);
+ DigIns(*Man,16,w); strcpy(Man,Man+2);
+ if (strlen(Man)>16) Man[16]='\0';
+ for (z=0; z<strlen(Man); z++) DigIns(Man[z],15-z,w);
+ if (strlen(Exp)>4) strcpy(Exp,Exp+strlen(Exp)-4);
+ for (z=strlen(Exp)-1; z>=0; z--)
+ BEGIN
+ epos=strlen(Exp)-1-z;
+ if (epos==3) DigIns(Exp[z],19,w); else DigIns(Exp[z],epos+20,w);
+ END
+END
+
+
+ static void EnterByte(Byte b)
+BEGIN
+ if (((CodeLen&1)==1) AND (NOT BigEndian) AND (ListGran()!=1))
+ BEGIN
+ BAsmCode[CodeLen]=BAsmCode[CodeLen-1];
+ BAsmCode[CodeLen-1]=b;
+ END
+ else
+ BEGIN
+ BAsmCode[CodeLen]=b;
+ END
+ CodeLen++;
+END
+
+ void AddMoto16PseudoONOFF(void)
+BEGIN
+ AddONOFF("PADDING",&DoPadding,DoPaddingName,False);
+END
+
+ Boolean DecodeMoto16Pseudo(ShortInt OpSize, Boolean Turn)
+BEGIN
+ Byte z;
+ Word TurnField[8];
+ char *zp;
+ LongInt z2;
+ LongInt WSize,Rep=0;
+ LongInt NewPC,HVal,WLen;
+#ifdef HAS64
+ QuadInt QVal;
+#endif
+ Integer HVal16;
+ Double DVal;
+ TempResult t;
+ Boolean OK,ValOK;
+
+ if (OpSize<0) OpSize=1;
+
+ if (*OpPart!='D') return False;
+
+ if (Memo("DC"))
+ BEGIN
+ if (ArgCnt==0) WrError(1110);
+ else
+ BEGIN
+ OK=True; z=1; WLen=0;
+ do
+ BEGIN
+ FirstPassUnknown=False;
+ OK=CutRep(ArgStr[z],&Rep);
+ if (OK)
+ if (FirstPassUnknown) WrError(1820);
+ else
+ BEGIN
+ switch (OpSize)
+ BEGIN
+ case 0:
+ FirstPassUnknown=False;
+ EvalExpression(ArgStr[z],&t);
+ if ((FirstPassUnknown) AND (t.Typ==TempInt)) t.Contents.Int&=0xff;
+ 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 for (z2=0; z2<Rep; z2++) EnterByte(t.Contents.Int);
+ break;
+ case TempFloat:
+ WrError(1135); OK=False;
+ break;
+ case TempString:
+ if (CodeLen+Rep*strlen(t.Contents.Ascii)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ for (z2=0; z2<Rep; z2++)
+ for (zp=t.Contents.Ascii; *zp!='\0'; EnterByte(CharTransTable[((usint) *(zp++))&0xff]));
+ break;
+ default: OK=False;
+ END
+ break;
+ case 1:
+ HVal16=EvalIntExpression(ArgStr[z],Int16,&OK);
+ if (OK)
+ if (CodeLen+(Rep<<1)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ if (ListGran()==1)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ BAsmCode[(WLen<<1) ]=Hi(HVal16);
+ BAsmCode[(WLen<<1)+1]=Lo(HVal16);
+ WLen++;
+ END
+ else
+ for (z2=0; z2<Rep; z2++) WAsmCode[WLen++]=HVal16;
+ CodeLen+=Rep<<1;
+ END
+ break;
+ case 2:
+ HVal=EvalIntExpression(ArgStr[z],Int32,&OK);
+ if (OK)
+ if (CodeLen+(Rep<<2)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ if (ListGran()==1)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ BAsmCode[(WLen<<1) ]=(HVal >> 24) & 0xff;
+ BAsmCode[(WLen<<1)+1]=(HVal >> 16) & 0xff;
+ BAsmCode[(WLen<<1)+2]=(HVal >> 8) & 0xff;
+ BAsmCode[(WLen<<1)+3]=(HVal ) & 0xff;
+ WLen+=2;
+ END
+ else
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ WAsmCode[WLen++]=HVal >> 16;
+ WAsmCode[WLen++]=HVal & 0xffff;
+ END
+ CodeLen+=Rep<<2;
+ END
+ break;
+#ifdef HAS64
+ case 3:
+ QVal=EvalIntExpression(ArgStr[z],Int64,&OK);
+ if (OK)
+ if (CodeLen+(Rep<<3)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ if (ListGran()==1)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ BAsmCode[(WLen<<1) ]=(QVal >> 56) & 0xff;
+ BAsmCode[(WLen<<1)+1]=(QVal >> 48) & 0xff;
+ BAsmCode[(WLen<<1)+2]=(QVal >> 40) & 0xff;
+ BAsmCode[(WLen<<1)+3]=(QVal >> 32) & 0xff;
+ BAsmCode[(WLen<<1)+4]=(QVal >> 24) & 0xff;
+ BAsmCode[(WLen<<1)+5]=(QVal >> 16) & 0xff;
+ BAsmCode[(WLen<<1)+6]=(QVal >> 8) & 0xff;
+ BAsmCode[(WLen<<1)+7]=(QVal ) & 0xff;
+ WLen+=4;
+ END
+ else
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ WAsmCode[WLen++]=(QVal >> 48) & 0xffff;
+ WAsmCode[WLen++]=(QVal >> 32) & 0xffff;
+ WAsmCode[WLen++]=(QVal >> 16) & 0xffff;
+ WAsmCode[WLen++]=QVal & 0xffff;
+ END
+ CodeLen+=Rep<<3;
+ END
+ break;
+#endif
+ case 4:
+ DVal=EvalFloatExpression(ArgStr[z],Float32,&OK);
+ if (OK)
+ if (CodeLen+(Rep<<2)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ Double_2_ieee4(DVal,(Byte *) TurnField,BigEndian);
+ if (BigEndian) DWSwap((void*) TurnField,4);
+ if (ListGran()==1)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ BAsmCode[(WLen<<1) ]=Hi(TurnField[1]);
+ BAsmCode[(WLen<<1)+1]=Lo(TurnField[1]);
+ BAsmCode[(WLen<<1)+2]=Hi(TurnField[0]);
+ BAsmCode[(WLen<<1)+3]=Lo(TurnField[0]);
+ WLen+=2;
+ END
+ else
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ WAsmCode[WLen++]=TurnField[1];
+ WAsmCode[WLen++]=TurnField[0];
+ END
+ CodeLen+=Rep<<2;
+ END
+ break;
+ case 5:
+ DVal=EvalFloatExpression(ArgStr[z],Float64,&OK);
+ if (OK)
+ if (CodeLen+(Rep<<3)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ Double_2_ieee8(DVal,(Byte *) TurnField,BigEndian);
+ if (BigEndian) QWSwap((void *) TurnField,8);
+ if (ListGran()==1)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ BAsmCode[(WLen<<1) ]=Hi(TurnField[3]);
+ BAsmCode[(WLen<<1)+1]=Lo(TurnField[3]);
+ BAsmCode[(WLen<<1)+2]=Hi(TurnField[2]);
+ BAsmCode[(WLen<<1)+3]=Lo(TurnField[2]);
+ BAsmCode[(WLen<<1)+4]=Hi(TurnField[1]);
+ BAsmCode[(WLen<<1)+5]=Lo(TurnField[1]);
+ BAsmCode[(WLen<<1)+6]=Hi(TurnField[0]);
+ BAsmCode[(WLen<<1)+7]=Lo(TurnField[0]);
+ WLen+=4;
+ END
+ else
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ WAsmCode[WLen++]=TurnField[3];
+ WAsmCode[WLen++]=TurnField[2];
+ WAsmCode[WLen++]=TurnField[1];
+ WAsmCode[WLen++]=TurnField[0];
+ END
+ CodeLen+=Rep<<3;
+ END
+ break;
+ case 6:
+ DVal=EvalFloatExpression(ArgStr[z],Float64,&OK);
+ if (OK)
+ if (CodeLen+(Rep*12)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ Double_2_ieee10(DVal,(Byte *) TurnField,False);
+ if (BigEndian) WSwap((void *) TurnField,10);
+ if (ListGran()==1)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ BAsmCode[(WLen<<1) ]=Hi(TurnField[4]);
+ BAsmCode[(WLen<<1)+ 1]=Lo(TurnField[4]);
+ BAsmCode[(WLen<<1)+ 2]=0;
+ BAsmCode[(WLen<<1)+ 3]=0;
+ BAsmCode[(WLen<<1)+ 4]=Hi(TurnField[3]);
+ BAsmCode[(WLen<<1)+ 5]=Lo(TurnField[3]);
+ BAsmCode[(WLen<<1)+ 6]=Hi(TurnField[2]);
+ BAsmCode[(WLen<<1)+ 7]=Lo(TurnField[2]);
+ BAsmCode[(WLen<<1)+ 8]=Hi(TurnField[1]);
+ BAsmCode[(WLen<<1)+ 9]=Lo(TurnField[1]);
+ BAsmCode[(WLen<<1)+10]=Hi(TurnField[0]);
+ BAsmCode[(WLen<<1)+11]=Lo(TurnField[0]);
+ WLen+=6;
+ END
+ else
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ WAsmCode[WLen++]=TurnField[4];
+ WAsmCode[WLen++]=0;
+ WAsmCode[WLen++]=TurnField[3];
+ WAsmCode[WLen++]=TurnField[2];
+ WAsmCode[WLen++]=TurnField[1];
+ WAsmCode[WLen++]=TurnField[0];
+ END
+ CodeLen+=Rep*12;
+ END
+ break;
+ case 7:
+ DVal=EvalFloatExpression(ArgStr[z],Float64,&OK);
+ if (OK)
+ if (CodeLen+(Rep*12)>MaxCodeLen)
+ BEGIN
+ WrError(1920); OK=False;
+ END
+ else
+ BEGIN
+ ConvertDec(DVal,TurnField);
+ if (ListGran()==1)
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ BAsmCode[(WLen<<1) ]=Hi(TurnField[5]);
+ BAsmCode[(WLen<<1)+ 1]=Lo(TurnField[5]);
+ BAsmCode[(WLen<<1)+ 2]=Hi(TurnField[4]);
+ BAsmCode[(WLen<<1)+ 3]=Lo(TurnField[4]);
+ BAsmCode[(WLen<<1)+ 4]=Hi(TurnField[3]);
+ BAsmCode[(WLen<<1)+ 5]=Lo(TurnField[3]);
+ BAsmCode[(WLen<<1)+ 6]=Hi(TurnField[2]);
+ BAsmCode[(WLen<<1)+ 7]=Lo(TurnField[2]);
+ BAsmCode[(WLen<<1)+ 8]=Hi(TurnField[1]);
+ BAsmCode[(WLen<<1)+ 9]=Lo(TurnField[1]);
+ BAsmCode[(WLen<<1)+10]=Hi(TurnField[0]);
+ BAsmCode[(WLen<<1)+11]=Lo(TurnField[0]);
+ WLen+=6;
+ END
+ else
+ for (z2=0; z2<Rep; z2++)
+ BEGIN
+ WAsmCode[WLen++]=TurnField[5];
+ WAsmCode[WLen++]=TurnField[4];
+ WAsmCode[WLen++]=TurnField[3];
+ WAsmCode[WLen++]=TurnField[2];
+ WAsmCode[WLen++]=TurnField[1];
+ WAsmCode[WLen++]=TurnField[0];
+ END
+ CodeLen+=Rep*12;
+ END
+ break;
+ END
+ END
+ z++;
+ END
+ while ((z<=ArgCnt) AND (OK));
+ if (NOT OK) CodeLen=0;
+ if ((DoPadding) AND ((CodeLen&1)==1)) EnterByte(0);
+ END
+ return True;
+ END
+
+ if (Memo("DS"))
+ BEGIN
+ if (ArgCnt!=1) WrError(1110);
+ else
+ BEGIN
+ FirstPassUnknown=False;
+ HVal=EvalIntExpression(ArgStr[1],Int32,&ValOK);
+ if (FirstPassUnknown) WrError(1820);
+ if ((ValOK) AND (NOT FirstPassUnknown))
+ BEGIN
+ DontPrint=True;
+ switch (OpSize)
+ BEGIN
+ case 0: WSize=1; if (((HVal&1)==1) AND (DoPadding)) HVal++; break;
+ case 1: WSize=2; break;
+ case 2:
+ case 4: WSize=4; break;
+ case 3:
+ case 5: WSize=8; break;
+ case 6:
+ case 7: WSize=12; break;
+ default: WSize=0;
+ END
+ if (HVal==0)
+ BEGIN
+ NewPC=ProgCounter()+WSize-1;
+ NewPC=NewPC-(NewPC % WSize);
+ CodeLen=NewPC-ProgCounter();
+ if (CodeLen==0) DontPrint=False;
+ END
+ else CodeLen=HVal*WSize;
+ if (DontPrint) BookKeeping();
+ END
+ END
+ return True;
+ END
+
+ return False;
+END
+
+
+ void CodeEquate(ShortInt DestSeg, LargeInt Min, LargeInt Max)
+BEGIN
+ Boolean OK;
+ TempResult t;
+ LargeInt Erg;
+
+ FirstPassUnknown=False;
+ if (ArgCnt!=1) WrError(1110);
+ else
+ BEGIN
+ Erg=EvalIntExpression(ArgStr[1],Int32,&OK);
+ if ((OK) AND (NOT FirstPassUnknown))
+ if (Min>Erg) WrError(1315);
+ else if (Erg>Max) WrError(1320);
+ else
+ BEGIN
+ PushLocHandle(-1);
+ EnterIntSymbol(LabPart,Erg,DestSeg,False);
+ PopLocHandle();
+ if (MakeUseList)
+ if (AddChunk(SegChunks+DestSeg,Erg,1,False)) WrError(90);
+ t.Typ=TempInt; t.Contents.Int=Erg; SetListLineVal(&t);
+ END
+ END
+END
+
+ void CodeASSUME(ASSUMERec *Def, Integer Cnt)
+BEGIN
+ int z1,z2;
+ Boolean OK;
+ LongInt HVal;
+ String RegPart,ValPart;
+
+ if (ArgCnt==0) WrError(1110);
+ else
+ BEGIN
+ z1=1; OK=True;
+ while ((z1<=ArgCnt) AND (OK))
+ BEGIN
+ SplitString(ArgStr[z1],RegPart,ValPart,QuotPos(ArgStr[z1],':'));
+ z2=0; NLS_UpString(RegPart);
+ while ((z2<Cnt) AND (strcmp(Def[z2].Name,RegPart)!=0)) z2++;
+ OK=(z2<Cnt);
+ if (NOT OK) WrXError(1980,RegPart);
+ else
+ if (strcmp(ValPart,"NOTHING")==0)
+ if (Def[z2].NothingVal==-1) WrError(1350);
+ else *Def[z2].Dest=Def[z2].NothingVal;
+ else
+ BEGIN
+ FirstPassUnknown=False;
+ HVal=EvalIntExpression(ValPart,Int32,&OK);
+ if (OK)
+ if (FirstPassUnknown)
+ BEGIN
+ WrError(1820); OK=False;
+ END
+ else if (ChkRange(HVal,Def[z2].Min,Def[z2].Max)) *Def[z2].Dest=HVal;
+ END
+ z1++;
+ END
+ END
+END
+
+ void codepseudo_init(void)
+BEGIN
+END
+