/* code56k.c */ /*****************************************************************************/ /* AS-Portierung */ /* */ /* AS-Codegeneratormodul fuer die DSP56K-Familie */ /* */ /* Historie: 10. 6.1996 Grundsteinlegung */ /* 7. 6.1998 563xx-Erweiterungen fertiggestellt */ /* 7. 7.1998 Fix Zugriffe auf CharTransTable wg. signed chars */ /* 18. 8.1998 BookKeeping-Aufruf bei RES */ /* 2. 1.1999 ChkPC-Anpassung */ /* */ /*****************************************************************************/ #include "stdinc.h" #include #include #include "strutil.h" #include "chunks.h" #include "asmdef.h" #include "asmsub.h" #include "asmpars.h" #include "codepseudo.h" #include "codevars.h" #include "code56k.h" typedef struct { char *Name; LongWord Code; CPUVar MinCPU; } FixedOrder; typedef enum {ParAB,ParABShl1,ParABShl2,ParXYAB,ParABXYnAB,ParABBA,ParXYnAB,ParMul,ParFixAB} ParTyp; typedef struct { char *Name; ParTyp Typ; Byte Code; } ParOrder; #define FixedOrderCnt 14 #define ParOrderCnt 31 #define BitOrderCnt 4 static char *BitOrders[BitOrderCnt]={"BCLR","BSET","BCHG","BTST"}; #define BitJmpOrderCnt 4 static char *BitJmpOrders[BitJmpOrderCnt]={"JCLR","JSET","JSCLR","JSSET"}; #define BitBrOrderCnt 4 static char *BitBrOrders[BitBrOrderCnt]={"BRCLR","BRSET","BSCLR","BSSET"}; #define ImmMacOrderCnt 4 static char *ImmMacOrders[ImmMacOrderCnt]={"MPYI","MPYRI","MACI","MACRI"}; static Byte MacTable[4][4]={{0,2,5,4},{2,0xff,6,7},{5,6,1,3},{4,7,3,0xff}}; static Byte Mac4Table[4][4]={{0,13,10,4},{5,1,14,11},{2,6,8,15},{12,3,7,9}}; static Byte Mac2Table[4]={1,3,2,0}; #define ModNone (-1) #define ModImm 0 #define MModImm (1 << ModImm) #define ModAbs 1 #define MModAbs (1 << ModAbs) #define ModIReg 2 #define MModIReg (1 << ModIReg) #define ModPreDec 3 #define MModPreDec (1 << ModPreDec) #define ModPostDec 4 #define MModPostDec (1 << ModPostDec) #define ModPostInc 5 #define MModPostInc (1 << ModPostInc) #define ModIndex 6 #define MModIndex (1 << ModIndex) #define ModModDec 7 #define MModModDec (1 << ModModDec) #define ModModInc 8 #define MModModInc (1 << ModModInc) #define ModDisp 9 #define MModDisp (1 << ModDisp) #define MModNoExt (MModIReg+MModPreDec+MModPostDec+MModPostInc+MModIndex+MModModDec+MModModInc) #define MModNoImm (MModAbs+MModNoExt) #define MModAll (MModNoImm+MModImm) #define SegLData (SegYData+1) #define MSegCode (1 << SegCode) #define MSegXData (1 << SegXData) #define MSegYData (1 << SegYData) #define MSegLData (1 << SegLData) static CPUVar CPU56000,CPU56002,CPU56300; static IntType AdrInt; static LargeWord MemLimit; static ShortInt AdrType; static LongInt AdrMode; static LongInt AdrVal; static Byte AdrSeg; static FixedOrder *FixedOrders; static ParOrder *ParOrders; /*----------------------------------------------------------------------------------------------*/ static void AddFixed(char *Name, LongWord Code, CPUVar NMin) BEGIN if (InstrZ>=FixedOrderCnt) exit(255); FixedOrders[InstrZ].Name=Name; FixedOrders[InstrZ].Code=Code; FixedOrders[InstrZ++].MinCPU=NMin; END static void AddPar(char *Name, ParTyp Typ, LongWord Code) BEGIN if (InstrZ>=ParOrderCnt) exit(255); ParOrders[InstrZ].Name=Name; ParOrders[InstrZ].Typ=Typ; ParOrders[InstrZ++].Code=Code; END static void InitFields(void) BEGIN FixedOrders=(FixedOrder *) malloc(sizeof(FixedOrder)*FixedOrderCnt); InstrZ=0; AddFixed("NOP" , 0x000000, CPU56000); AddFixed("ENDDO" , 0x00008c, CPU56000); AddFixed("ILLEGAL", 0x000005, CPU56000); AddFixed("RESET" , 0x000084, CPU56000); AddFixed("RTI" , 0x000004, CPU56000); AddFixed("RTS" , 0x00000c, CPU56000); AddFixed("STOP" , 0x000087, CPU56000); AddFixed("SWI" , 0x000006, CPU56000); AddFixed("WAIT" , 0x000086, CPU56000); AddFixed("DEBUG" , 0x000200, CPU56300); AddFixed("PFLUSH" , 0x000003, CPU56300); AddFixed("PFLUSHUN",0x000001, CPU56300); AddFixed("PFREE" , 0x000002, CPU56300); AddFixed("TRAP" , 0x000006, CPU56300); ParOrders=(ParOrder *) malloc(sizeof(ParOrder)*ParOrderCnt); InstrZ=0; AddPar("ABS" ,ParAB, 0x26); AddPar("ASL" ,ParABShl1, 0x32); AddPar("ASR" ,ParABShl1, 0x22); AddPar("CLR" ,ParAB, 0x13); AddPar("LSL" ,ParABShl2, 0x33); AddPar("LSR" ,ParABShl2, 0x23); AddPar("NEG" ,ParAB, 0x36); AddPar("NOT" ,ParAB, 0x17); AddPar("RND" ,ParAB, 0x11); AddPar("ROL" ,ParAB, 0x37); AddPar("ROR" ,ParAB, 0x27); AddPar("TST" ,ParAB, 0x03); AddPar("ADC" ,ParXYAB, 0x21); AddPar("SBC" ,ParXYAB, 0x25); AddPar("ADD" ,ParABXYnAB,0x00); AddPar("CMP" ,ParABXYnAB,0x05); AddPar("CMPM",ParABXYnAB,0x07); AddPar("SUB" ,ParABXYnAB,0x04); AddPar("ADDL",ParABBA, 0x12); AddPar("ADDR",ParABBA, 0x02); AddPar("SUBL",ParABBA, 0x16); AddPar("SUBR",ParABBA, 0x06); AddPar("AND" ,ParXYnAB, 0x46); AddPar("EOR" ,ParXYnAB, 0x43); AddPar("OR" ,ParXYnAB, 0x42); AddPar("MAC" ,ParMul, 0x82); AddPar("MACR",ParMul, 0x83); AddPar("MPY" ,ParMul, 0x80); AddPar("MPYR",ParMul, 0x81); AddPar("MAX" ,ParFixAB, 0x1d); AddPar("MAXM",ParFixAB, 0x15); END static void DeinitFields(void) BEGIN free(FixedOrders); free(ParOrders); END /*----------------------------------------------------------------------------------------------*/ static void SplitArg(char *Orig, char *LDest, char *RDest) BEGIN char *p,*str; str=strdup(Orig); p=QuotPos(str,','); if (p==Nil) BEGIN *RDest='\0'; strcpy(LDest,str); END else BEGIN *p='\0'; strcpy(LDest,str); strcpy(RDest,p+1); END free(str); END static void ChkMask(Word Erl, Byte ErlSeg) BEGIN if ((AdrType!=ModNone) AND ((Erl & (1 << AdrType))==0)) BEGIN WrError(1350); AdrCnt=0; AdrType=ModNone; END if ((AdrSeg!=SegNone) AND ((ErlSeg & (1 << AdrSeg))==0)) BEGIN WrError(1960); AdrCnt=0; AdrType=ModNone; END END static void CutSize(char *Asc, Byte *ShortMode) BEGIN switch (*Asc) BEGIN case '>': strcpy(Asc,Asc+1); *ShortMode=2; break; case '<': strcpy(Asc,Asc+1); *ShortMode=1; break; default: *ShortMode=0; END END static Boolean DecodeReg(char *Asc, LongInt *Erg) BEGIN #define RegCount 12 static char *RegNames[RegCount]= {"X0","X1","Y0","Y1","A0","B0","A2","B2","A1","B1","A","B"}; Word z; for (z=0; z='0') AND (Asc[1]<='7')) switch (toupper(*Asc)) BEGIN case 'R': *Erg=16+Asc[1]-'0'; return True; case 'N': *Erg=24+Asc[1]-'0'; return True; END return False; END static Boolean DecodeALUReg(char *Asc, LongInt *Erg, Boolean MayX, Boolean MayY, Boolean MayAcc) BEGIN Boolean Result=False; if (NOT DecodeReg(Asc,Erg)) return Result; switch (*Erg) BEGIN case 4: case 5: if (MayX) BEGIN Result=True; (*Erg)-=4; END break; case 6: case 7: if (MayY) BEGIN Result=True; (*Erg)-=6; END break; case 14: case 15: if (MayAcc) BEGIN Result=True; if ((MayX) OR (MayY)) (*Erg)-=12; else (*Erg)-=14; END break; END return Result; END static Boolean DecodeLReg(char *Asc, LongInt *Erg) BEGIN #undef RegCount #define RegCount 8 static char *RegNames[RegCount]= {"A10","B10","X","Y","A","B","AB","BA"}; Word z; for (z=0; z='0') AND (Asc[1]<='7')) BEGIN *Erg=Asc[1]-'0'; return True; END /* >=56300 ? */ if (strcasecmp(Asc,"EP")==0) BEGIN *Erg=0x0a; return True; END if (strcasecmp(Asc,"VBA")==0) BEGIN *Erg=0x10; return True; END if (strcasecmp(Asc,"SC")==0) BEGIN *Erg=0x11; return True; END return False; END static Boolean DecodeGeneralReg(char *Asc, LongInt *Erg) BEGIN if (DecodeReg(Asc,Erg)) return True; if (DecodePCReg(Asc,Erg)) BEGIN (*Erg)+=0x38; return True; END if (DecodeAddReg(Asc,Erg)) BEGIN (*Erg)+=0x20; return True; END return False; END static Boolean DecodeCtrlReg(char *Asc, LongInt *Erg) BEGIN if (DecodeAddReg(Asc,Erg)) return True; if (DecodePCReg(Asc,Erg)) BEGIN (*Erg)+=0x18; return True; END return False; END static Boolean DecodeControlReg(char *Asc, LongInt *Erg) BEGIN Boolean Result=True; if (strcasecmp(Asc,"MR")==0) *Erg=0; else if (strcasecmp(Asc,"CCR")==0) *Erg=1; else if ((strcasecmp(Asc,"OMR")==0) OR (strcasecmp(Asc,"COM")==0)) *Erg=2; else if ((strcasecmp(Asc,"EOM")==0) AND (MomCPU>=CPU56000)) *Erg=3; else Result=False; return Result; END static void DecodeAdr(char *Asc_O, Word Erl, Byte ErlSeg) BEGIN static char *ModMasks[ModModInc+1]= {"","","(Rx)","-(Rx)","(Rx)-","(Rx)+","(Rx+Nx)","(Rx)-Nx","(Rx)+Nx"}; static Byte ModCodes[ModModInc+1]= {0,0,4,7,2,3,5,0,1}; #define SegCount 4 static char SegNames[SegCount]={'P','X','Y','L'}; static Byte SegVals[SegCount]={SegCode,SegXData,SegYData,SegLData}; int z,l; Boolean OK; Byte OrdVal; String Asc; char *pp,*np,save; AdrType=ModNone; AdrCnt=0; strmaxcpy(Asc,Asc_O,255); /* Adressierungsmodi vom 56300 abschneiden */ if ((MomCPU7) break; else if (AdrMode==0xffff) AdrMode=OrdVal; else if (AdrMode!=OrdVal) BEGIN WrError(1760); ChkMask(Erl,ErlSeg); return; END END else if (ModMasks[z][l]!=toupper(Asc[l])) break; if (l>strlen(Asc)) BEGIN AdrType=z; AdrMode+=ModCodes[z] << 3; ChkMask(Erl,ErlSeg); return; END END /* immediate ? */ if (*Asc=='#') BEGIN AdrVal=EvalIntExpression(Asc+1,Int24,&OK); if (OK) BEGIN AdrType=ModImm; AdrCnt=1; AdrMode=0x34; ChkMask(Erl,ErlSeg); return; END END /* Register mit Displacement bei 56300 */ if (IsIndirect(Asc)) BEGIN strcpy(Asc,Asc+1); Asc[strlen(Asc)-1]='\0'; pp=strchr(Asc,'+'); np=strchr(Asc,'-'); if ((pp==Nil) OR ((np!=Nil) AND (np=16) AND (AdrMode<=23)) BEGIN *pp=save; AdrMode-=16; FirstPassUnknown=False; AdrVal=EvalIntExpression(pp,Int24,&OK); if (OK) BEGIN if (FirstPassUnknown) AdrVal&=63; AdrType=ModDisp; END ChkMask(Erl,ErlSeg); return; END *pp=save; END END /* dann absolut */ AdrVal=EvalIntExpression(Asc,AdrInt,&OK); if (OK) BEGIN AdrType=ModAbs; AdrMode=0x30; AdrCnt=1; if ((AdrSeg & ((1<7) AND (Part1<14)) OR (Part1>15)) return False; if (Part1>13) if (((Part1 ^ Part2) & 1)==0) return False; else Part1=0; else Part1=TurnXY(Part1)+4; *Erg=(Part1 << 1)+Part2; return True; END static Boolean DecodeRR(char *Asc, LongInt *Erg) BEGIN LongInt Part1,Part2; String Left,Right; SplitArg(Asc,Left,Right); if (NOT DecodeGeneralReg(Right,&Part2)) return False; if ((Part2<16) OR (Part2>23)) return False; if (NOT DecodeGeneralReg(Left,&Part1)) return False; if ((Part1<16) OR (Part1>23)) return False; *Erg=(Part2 & 7)+((Part1 & 7) << 8); return True; END static Boolean DecodeCondition(char *Asc, Word *Erg) BEGIN #define CondCount 18 static char *CondNames[CondCount]= {"CC","GE","NE","PL","NN","EC","LC","GT","CS","LT","EQ","MI", "NR","ES","LS","LE","HS","LO"}; Boolean Result; (*Erg)=0; while ((*Erg-64) AND (RegErg<=15)) BEGIN DAsmCode[0]=0x020090+((AdrVal & 1) << 6)+((AdrVal & 0x7e) << 10) +(AdrMode << 8)+(IsY << 5)+RegErg; CodeLen=1; END else BEGIN DAsmCode[0]=0x0a70c0+(AdrMode << 8)+(IsY << 16)+RegErg; DAsmCode[1]=AdrVal; CodeLen=2; END #ifdef __STDC__ else if ((AdrType==ModImm) AND ((AdrVal & 0xffffff00u)==0)) #else else if ((AdrType==ModImm) AND ((AdrVal & 0xffffff00)==0)) #endif BEGIN Result=True; DAsmCode[0] = 0x200000 + (RegErg << 16) + ((AdrVal & 0xff) << 8); CodeLen=1; END else if ((AdrType==ModAbs) AND (AdrVal<=63) AND (AdrVal>=0)) BEGIN Result=True; DAsmCode[0] = 0x408000 + MixErg + (AdrVal << 8); CodeLen=1; END else if (AdrType!=ModNone) BEGIN Result=True; DAsmCode[0] = 0x40c000 + MixErg + (AdrMode << 8); DAsmCode[1] = AdrVal; CodeLen=1+AdrCnt; END END END if (AdrSeg!=SegLData) return Result; END /* 3. Quelle ist Register */ if (DecodeReg(Left,&RegErg)) BEGIN /* A und B gehen auch als L:..., in L-Zweig zwingen! */ SegMask=MSegXData+MSegYData; if ((RegErg==14) OR (RegErg==15)) SegMask|=MSegLData; DecodeAdr(Right,MModNoImm+MModDisp,SegMask); if (AdrSeg!=SegLData) BEGIN IsY=Ord(AdrSeg==SegYData); MixErg=((RegErg & 0x18) << 17) + (IsY << 19) + ((RegErg & 7) << 16); if (AdrType==ModDisp) if ((AdrVal<63) AND (AdrVal>-64) AND (RegErg<=15)) BEGIN DAsmCode[0]=0x020080+((AdrVal & 1) << 6)+((AdrVal & 0x7e) << 10) +(AdrMode << 8)+(IsY << 5)+RegErg; CodeLen=1; END else BEGIN DAsmCode[0]=0x0a7080+(AdrMode << 8)+(IsY << 16)+RegErg; DAsmCode[1]=AdrVal; CodeLen=2; END else if ((AdrType==ModAbs) AND (AdrVal<=63) AND (AdrVal>=0)) BEGIN Result=True; DAsmCode[0] = 0x400000 + MixErg + (AdrVal << 8); CodeLen=1; END else if (AdrType!=ModNone) BEGIN Result=True; DAsmCode[0] = 0x404000 + MixErg + (AdrMode << 8); DAsmCode[1] = AdrVal; CodeLen=1+AdrCnt; END return Result; END END /* 4. Ziel ist langes Register */ if (DecodeLReg(Right,&RegErg)) BEGIN DecodeAdr(Left,MModNoImm,MSegLData); MixErg=((RegErg & 4) << 17) + ((RegErg & 3) << 16); if ((AdrType==ModAbs) AND (AdrVal<=63) AND (AdrVal>=0)) BEGIN Result=True; DAsmCode[0] = 0x408000 + MixErg + (AdrVal << 8); CodeLen=1; END else BEGIN Result=True; DAsmCode[0] = 0x40c000 + MixErg + (AdrMode << 8); DAsmCode[1] = AdrVal; CodeLen=1+AdrCnt; END return Result; END /* 5. Quelle ist langes Register */ if (DecodeLReg(Left,&RegErg)) BEGIN DecodeAdr(Right,MModNoImm,MSegLData); MixErg=((RegErg & 4) << 17)+((RegErg & 3) << 16); if ((AdrType==ModAbs) AND (AdrVal<=63) AND (AdrVal>=0)) BEGIN Result=True; DAsmCode[0] = 0x400000 + MixErg + (AdrVal << 8); CodeLen=1; END else BEGIN Result=True; DAsmCode[0] = 0x404000 + MixErg + (AdrMode << 8); DAsmCode[1] = AdrVal; CodeLen=1+AdrCnt; END return Result; END WrError(1350); return Result; END static Boolean DecodeMOVE_2(int Start) BEGIN String Left1,Right1,Left2,Right2; LongInt RegErg,Reg1L,Reg1R,Reg2L,Reg2R; LongInt Mode1,Mode2,Dir1,Dir2,Type1,Type2,Cnt1,Cnt2,Val1,Val2; Boolean Result=False; SplitArg(ArgStr[Start],Left1,Right1); SplitArg(ArgStr[Start+1],Left2,Right2); /* 1. Spezialfall X auf rechter Seite ? */ if (strcasecmp(Left2,"X0")==0) BEGIN if (NOT DecodeALUReg(Right2,&RegErg,False,False,True)) WrError(1350); else if (strcmp(Left1,Right2)!=0) WrError(1350); else BEGIN DecodeAdr(Right1,MModNoImm,MSegXData); if (AdrType!=ModNone) BEGIN CodeLen=1+AdrCnt; DAsmCode[0] = 0x080000 + (RegErg << 16) + (AdrMode << 8); DAsmCode[1] = AdrVal; Result=True; END END return Result; END /* 2. Spezialfall Y auf linker Seite ? */ if (strcasecmp(Left1,"Y0")==0) BEGIN if (NOT DecodeALUReg(Right1,&RegErg,False,False,True)) WrError(1350); else if (strcmp(Left2,Right1)!=0) WrError(1350); else BEGIN DecodeAdr(Right2,MModNoImm,MSegYData); if (AdrType!=ModNone) BEGIN CodeLen=1+AdrCnt; DAsmCode[0] = 0x088000 + (RegErg << 16) + (AdrMode << 8); DAsmCode[1] = AdrVal; Result=True; END END return Result; END /* der Rest..... */ if ((DecodeOpPair(Left1,Right1,SegXData,&Dir1,&Reg1L,&Reg1R,&Type1,&Mode1,&Cnt1,&Val1)) AND (DecodeOpPair(Left2,Right2,SegYData,&Dir2,&Reg2L,&Reg2R,&Type2,&Mode2,&Cnt2,&Val2))) BEGIN if ((Reg1R==-1) AND (Reg2R==-1)) BEGIN if ((Mode1 >> 3<1) OR (Mode1 >> 3>4) OR (Mode2 >> 3<1) OR (Mode2 >> 3>4)) WrError(1350); else if (((Mode1 ^ Mode2) & 4)==0) WrError(1760); else BEGIN DAsmCode[0] = 0x800000 + (Dir2 << 22) + (Dir1 << 15) + (Reg1L << 18) + (Reg2L << 16) + ((Mode1 & 0x1f) << 8)+ ((Mode2 & 3) << 13) + ((Mode2 & 24) << 17); CodeLen=1; Result=True; END END else if (Reg1R==-1) BEGIN if ((Reg2L<2) OR (Reg2R>1)) WrError(1350); else BEGIN DAsmCode[0] = 0x100000 + (Reg1L << 18) + ((Reg2L-2) << 17) + (Reg2R << 16) + (Dir1 << 15) + (Mode1 << 8); DAsmCode[1] = Val1; CodeLen=1+Cnt1; Result=True; END END else if (Reg2R==-1) BEGIN if ((Reg1L<2) OR (Reg1R>1)) WrError(1350); else BEGIN DAsmCode[0] = 0x104000 + (Reg2L << 16) + ((Reg1L-2) << 19) + (Reg1R << 18) + (Dir2 << 15) + (Mode2 << 8); DAsmCode[1] = Val2; CodeLen=1+Cnt2; Result=True; END END else WrError(1350); return Result; END WrError(1350); return Result; END static Boolean DecodeMOVE(int Start) BEGIN switch (ArgCnt-Start+1) BEGIN case 0: return DecodeMOVE_0(); case 1: return DecodeMOVE_1(Start); case 2: return DecodeMOVE_2(Start); default: WrError(1110); return False; END END static Boolean DecodeMix(char *Asc, Word *Erg) BEGIN if (strcmp(Asc,"SS")==0) *Erg=0; else if (strcmp(Asc,"SU")==0) *Erg=0x100; else if (strcmp(Asc,"UU")==0) *Erg=0x140; else return False; return True; END static Boolean DecodePseudo(void) BEGIN Boolean OK; int BCount; Word AdrWord,z,z2; /* Byte Segment;*/ TempResult t; LongInt HInt; if (Memo("XSFR")) BEGIN CodeEquate(SegXData,0,MemLimit); return True; END if (Memo("YSFR")) BEGIN CodeEquate(SegYData,0,MemLimit); return True; END if (Memo("DS")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN FirstPassUnknown=False; AdrWord=EvalIntExpression(ArgStr[1],AdrInt,&OK); if (FirstPassUnknown) WrError(1820); if ((OK) AND (NOT FirstPassUnknown)) BEGIN CodeLen=AdrWord; DontPrint=True; BookKeeping(); END END return True; END if (Memo("DC")) BEGIN if (ArgCnt<1) WrError(1110); else BEGIN OK=True; for (z=1 ; z<=ArgCnt; z++) if (OK) BEGIN FirstPassUnknown=False; EvalExpression(ArgStr[z],&t); switch (t.Typ) BEGIN case TempInt: if (FirstPassUnknown) t.Contents.Int&=0xffffff; if (NOT RangeCheck(t.Contents.Int,Int24)) BEGIN WrError(1320); OK=False; END else BEGIN DAsmCode[CodeLen++]=t.Contents.Int & 0xffffff; END break; case TempString: BCount=2; DAsmCode[CodeLen]=0; for (z2=0; z23)) SetXError(1445,Left); else h=(Reg2 << 3) + ((Reg1-2) << 4); break; case ParABXYnAB: SplitArg(ArgStr[1],Left,Right); if (NOT DecodeALUReg(Right,&Reg2,False,False,True)) SetXError(1445,Right); else if (*Left=='#') BEGIN if (Memo("CMPM")) SetError(1350); else if (MomCPU=0) AND (AddVal<=63)) BEGIN DAsmCode[0]=0x014000+(AddVal << 8); h=0x80+(Reg2 << 3); END else BEGIN DAsmCode[0]=0x014000; h=0xc0+(Reg2 << 3); DAsmCode[1]=AddVal & 0xffffff; CodeLen=2; END END END else if (NOT DecodeXYABReg(Left,&Reg1)) SetXError(1445,Left); else if ((Reg1 ^ Reg2)==1) SetError(1760); else if ((Memo("CMPM")) AND ((Reg1 &6)==2)) SetXError(1445,Left); else BEGIN if (Reg1<2) Reg1=Ord(NOT Memo("CMPM")); h=(Reg2 << 3) + (Reg1 << 4); END break; case ParABBA: if (strcasecmp(ArgStr[1],"B,A")==0) h=0; else if (strcasecmp(ArgStr[1],"A,B")==0) h=8; else SetXError(1760,ArgStr[1]); break; case ParXYnAB: SplitArg(ArgStr[1],Left,Right); if (NOT DecodeALUReg(Right,&Reg2,False,False,True)) SetXError(1445,Right); else if (*Left=='#') BEGIN if (MomCPU=0) AND (AddVal<=63)) BEGIN DAsmCode[0]=0x014080+(AddVal << 8)+(Reg2 << 3)+(ParOrders[z].Code&7); CodeLen=1; DontAdd=True; END else BEGIN DAsmCode[0]=0x0140c0+(Reg2 << 3)+(ParOrders[z].Code&7); DAsmCode[1]=AddVal & 0xffffff; CodeLen=2; DontAdd=True; END END END else if (NOT DecodeReg(Left,&Reg1)) SetXError(1445,Left); else if ((Reg1<4) OR (Reg1>7)) SetXError(1445,Left); else h=(Reg2 << 3) + (TurnXY(Reg1) << 4); break; case ParMul: SplitArg(ArgStr[1],Left,Mid); SplitArg(Mid,Mid,Right); h=0; if (*Left=='-') BEGIN strcpy(Left,Left+1); h+=4; END else if (*Left=='+') strcpy(Left,Left+1); if (NOT DecodeALUReg(Right,&Reg3,False,False,True)) SetXError(1445,Right); else if (NOT DecodeReg(Left,&Reg1)) SetXError(1445,Left); else if ((Reg1<4) OR (Reg1>7)) SetXError(1445,Left); else if (*Mid=='#') BEGIN if (ArgCnt!=1) WrError(1110); else if (MomCPU22)) WrError(1540); else BEGIN LAddVal=23-LAddVal; DAsmCode[0]=0x010040+(LAddVal << 8)+(Mac2Table[Reg1 & 3] << 4) +(Reg3 << 3); CodeLen=1; END END END else if (NOT DecodeReg(Mid,&Reg2)) SetXError(1445,Mid); else if ((Reg2<4) OR (Reg2>7)) SetXError(1445,Mid); else if (MacTable[Reg1-4][Reg2-4]==0xff) SetError(1760); else h+=(Reg3 << 3) + (MacTable[Reg1-4][Reg2-4] << 4); break; END if (ErrCode==0) BEGIN if (NOT DontAdd) DAsmCode[0]+=ParOrders[z].Code+h; END else BEGIN if (ErrCode>0) PrError(); CodeLen=0; END END return; END if (Memo("DIV")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN SplitArg(ArgStr[1],Left,Right); if ((*Left=='\0') OR (*Right=='\0')) WrError(1110); else if (NOT DecodeALUReg(Right,&Reg2,False,False,True)) WrError(1350); else if (NOT DecodeReg(Left,&Reg1)) WrError(1350); else if ((Reg1<4) OR (Reg1>7)) WrError(1350); else BEGIN CodeLen=1; DAsmCode[0] = 0x018040 + (Reg2 << 3) + (TurnXY(Reg1) << 4); END END return; END for (z=0; z7)) WrXError(1445,Mid); else if (*Left!='#') WrError(1120); else BEGIN DAsmCode[1]=EvalIntExpression(Left+1,Int24,&OK); if (OK) BEGIN DAsmCode[0]=0x0141c0+z+h+(Reg1 << 3)+((Reg2 & 3) << 4); CodeLen=2; END END END return; END if ((strncmp(OpPart,"DMAC",4)==0) AND (DecodeMix(OpPart+4,&Condition))) BEGIN if (ArgCnt!=1) WrError(1110); else if (MomCPU23)) WrError(1350); else BEGIN CodeLen=1; DAsmCode[0] = 0x01d815 + ((Reg1 & 7) << 8) + (Reg2 << 3); END END return; END if (Memo("NORMF")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN SplitArg(ArgStr[1],Left,Right); if (*Right=='\0') WrError(1110); else if (NOT DecodeALUReg(Right,&Reg2,False,False,True)) WrXError(1445,Right); else if (NOT DecodeXYAB1Reg(Left,&Reg1)) WrXError(1445,Left); else BEGIN CodeLen=1; DAsmCode[0]=0x0c1e20+Reg2+(Reg1 << 1); END END return; END for (z=0; z> 1) << 16); SplitArg(ArgStr[1],Left,Right); if ((*Left=='\0') OR (*Right=='\0')) WrError(1110); else if (*Left!='#') WrError(1120); else BEGIN h=EvalIntExpression(Left+1,Int8,&OK); if (FirstPassUnknown) h&=15; if (OK) if ((h<0) OR (h>23)) WrError(1320); else if (DecodeGeneralReg(Right,&Reg1)) BEGIN CodeLen=1; DAsmCode[0] = 0x0ac040 + h +(Reg1 << 8) + Reg2; END else BEGIN DecodeAdr(Right,MModNoImm,MSegXData+MSegYData); Reg3=Ord(AdrSeg==SegYData) << 6; if ((AdrType==ModAbs) AND (AdrVal<=63) AND (AdrVal>=0)) BEGIN CodeLen=1; DAsmCode[0] = 0x0a0000 + h + (AdrVal << 8) + Reg3 + Reg2; END else if ((AdrType==ModAbs) AND (AdrVal>=MemLimit-0x3f) AND (AdrVal<=MemLimit)) BEGIN CodeLen=1; DAsmCode[0] = 0x0a8000 + h + ((AdrVal & 0x3f) << 8) + Reg3 + Reg2; END else if ((AdrType==ModAbs) AND (MomCPU>=CPU56300) AND (AdrVal>=MemLimit-0x7f) AND (AdrVal<=MemLimit-0x40)) BEGIN Reg2=((z & 1) << 5) + (((LongInt) z >> 1) << 14); CodeLen=1; DAsmCode[0] = 0x010000 + h + ((AdrVal & 0x3f) << 8) + Reg3 + Reg2; END else if (AdrType!=ModNone) BEGIN CodeLen=1+AdrCnt; DAsmCode[0] = 0x0a4000 + h + (AdrMode << 8) + Reg3 + Reg2; DAsmCode[1] = AdrVal; END END END END return; END if ((Memo("EXTRACT")) OR (Memo("EXTRACTU"))) BEGIN z=Ord(Memo("EXTRACTU")) << 7; if (ArgCnt!=1) WrError(1110); else if (MomCPU=0) AND (AdrVal<=63)) BEGIN CodeLen=1; DAsmCode[0] = 0x070000 + Reg1 + (AdrVal << 8); END else if (AdrType!=ModNone) BEGIN CodeLen=1+AdrCnt; DAsmCode[1] = AdrVal; DAsmCode[0] = 0x074080 + Reg1 + (AdrMode << 8); END END else if (NOT DecodeGeneralReg(Right,&Reg2)) WrXError(1445,Right); else BEGIN DecodeAdr(Left,MModNoImm,MSegCode); if ((AdrType==ModAbs) AND (AdrVal>=0) AND (AdrVal<=63)) BEGIN CodeLen=1; DAsmCode[0] = 0x078000 + Reg2 + (AdrVal << 8); END else if (AdrType!=ModNone) BEGIN CodeLen = 1+AdrCnt; DAsmCode[1] = AdrVal; DAsmCode[0] = 0x07c080 + Reg2 + (AdrMode << 8); END END END return; END if (Memo("MOVEP")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN SplitArg(ArgStr[1],Left,Right); if ((*Left=='\0') OR (*Right=='\0')) WrError(1110); else if (DecodeGeneralReg(Left,&Reg1)) BEGIN DecodeAdr(Right,MModAbs,MSegXData+MSegYData); if (AdrType!=ModNone) if ((AdrVal<=MemLimit) AND (AdrVal>=MemLimit-0x3f)) BEGIN CodeLen=1; DAsmCode[0] = 0x08c000 + (Ord(AdrSeg==SegYData) << 16) + (AdrVal & 0x3f) + (Reg1 << 8); END else if ((MomCPU>=CPU56300) AND (AdrVal<=MemLimit-0x40) AND (AdrVal>=MemLimit-0x7f)) BEGIN CodeLen=1; DAsmCode[0]=0x04c000+(Ord(AdrSeg==SegYData) << 5)+ (Ord(AdrSeg==SegXData) << 7)+ (AdrVal & 0x1f)+((AdrVal & 0x20) << 1)+(Reg1 << 8); END else WrError(1315); END else if (DecodeGeneralReg(Right,&Reg2)) BEGIN DecodeAdr(Left,MModAbs,MSegXData+MSegYData); if (AdrType!=ModNone) if ((AdrVal<=MemLimit) AND (AdrVal>=MemLimit-0x3f)) BEGIN CodeLen=1; DAsmCode[0] = 0x084000 + (Ord(AdrSeg==SegYData) << 16) + (AdrVal & 0x3f) + (Reg2 << 8); END else if ((MomCPU>=CPU56300) AND (AdrVal<=MemLimit-0x40) AND (AdrVal>=MemLimit-0x7f)) BEGIN CodeLen=1; DAsmCode[0]=0x044000+(Ord(AdrSeg==SegYData) << 5)+ (Ord(AdrSeg==SegXData) << 7)+ (AdrVal & 0x1f)+((AdrVal & 0x20) << 1)+(Reg2 << 8); END else WrError(1315); END else BEGIN DecodeAdr(Left,MModAll,MSegXData+MSegYData+MSegCode); if ((AdrType==ModAbs) AND (AdrSeg!=SegCode) AND (AdrVal>=MemLimit-0x3f) AND (AdrVal<=MemLimit)) BEGIN HVal=AdrVal & 0x3f; HSeg=AdrSeg; DecodeAdr(Right,MModNoImm,MSegXData+MSegYData+MSegCode); if (AdrType!=ModNone) if (AdrSeg==SegCode) BEGIN CodeLen=1+AdrCnt; DAsmCode[1] = AdrVal; DAsmCode[0] = 0x084040 + HVal + (AdrMode << 8) + (Ord(HSeg==SegYData) << 16); END else BEGIN CodeLen=1+AdrCnt; DAsmCode[1] = AdrVal; DAsmCode[0] = 0x084080 + HVal + (AdrMode << 8) + (Ord(HSeg==SegYData) << 16) + (Ord(AdrSeg==SegYData) << 6); END END else if ((AdrType==ModAbs) AND (MomCPU>=CPU56300) AND (AdrSeg!=SegCode) AND (AdrVal>=MemLimit-0x7f) AND (AdrVal<=MemLimit-0x40)) BEGIN HVal=AdrVal & 0x3f; HSeg=AdrSeg; DecodeAdr(Right,MModNoImm,MSegXData+MSegYData+MSegCode); if (AdrType!=ModNone) if (AdrSeg==SegCode) BEGIN CodeLen=1+AdrCnt; DAsmCode[1] = AdrVal; DAsmCode[0] = 0x008000 + HVal + (AdrMode << 8) + (Ord(HSeg==SegYData) << 6); END else BEGIN CodeLen=1+AdrCnt; DAsmCode[1] = AdrVal; DAsmCode[0] = 0x070000 + HVal + (AdrMode << 8) + (Ord(HSeg==SegYData) << 7) + (Ord(HSeg==SegXData) << 14) + (Ord(AdrSeg==SegYData) << 6); END END else if (AdrType!=ModNone) BEGIN HVal=AdrVal; HCnt=AdrCnt; HMode=AdrMode; HSeg=AdrSeg; DecodeAdr(Right,MModAbs,MSegXData+MSegYData); if (AdrType!=ModNone) if ((AdrVal>=MemLimit-0x3f) AND (AdrVal<=MemLimit)) BEGIN if (HSeg==SegCode) BEGIN CodeLen=1+HCnt; DAsmCode[1] = HVal; DAsmCode[0] = 0x08c040 + (AdrVal & 0x3f) + (HMode << 8) + (Ord(AdrSeg==SegYData) << 16); END else BEGIN CodeLen=1+HCnt; DAsmCode[1] = HVal; DAsmCode[0] = 0x08c080 + (((Word)AdrVal) & 0x3f) + (HMode << 8) + (Ord(AdrSeg==SegYData) << 16) + (Ord(HSeg==SegYData) << 6); END END else if ((MomCPU>=CPU56300) AND (AdrVal>=MemLimit-0x7f) AND (AdrVal<=MemLimit-0x40)) BEGIN if (HSeg==SegCode) BEGIN CodeLen=1+HCnt; DAsmCode[1] = HVal; DAsmCode[0] = 0x00c000 + (AdrVal & 0x3f) + (HMode << 8) + (Ord(AdrSeg==SegYData) << 6); END else BEGIN CodeLen=1+HCnt; DAsmCode[1] = HVal; DAsmCode[0] = 0x078000 + (((Word)AdrVal) & 0x3f) + (HMode << 8) + (Ord(AdrSeg==SegYData) << 7) + (Ord(AdrSeg==SegXData) << 14) + (Ord(HSeg==SegYData) << 6); END END else WrError(1315); END END END return; END if (Memo("TFR")) BEGIN if (ArgCnt<1) WrError(1110); else if (DecodeMOVE(2)) if (DecodeTFR(ArgStr[1],&Reg1)) BEGIN DAsmCode[0] += 0x01 + (Reg1 << 3); END else BEGIN WrError(1350); CodeLen=0; END return; END if ((*OpPart=='T') AND (DecodeCondition(OpPart+1,&Condition))) BEGIN if ((ArgCnt!=1) AND (ArgCnt!=2)) WrError(1110); else if (DecodeTFR(ArgStr[1],&Reg1)) BEGIN if (ArgCnt==1) BEGIN CodeLen=1; DAsmCode[0]=0x020000+(Condition << 12)+(Reg1 << 3); END else if (NOT DecodeRR(ArgStr[2],&Reg2)) WrError(1350); else BEGIN CodeLen=1; DAsmCode[0]=0x030000+(Condition << 12)+(Reg1 << 3)+Reg2; END END else if (ArgCnt!=1) WrError(1110); else if (NOT DecodeRR(ArgStr[1],&Reg1)) WrError(1350); else BEGIN DAsmCode[0]=0x020800+(Condition << 12)+Reg1; CodeLen=1; END return; END for (z=0; z23)) WrError(1320); else if (DecodeGeneralReg(Mid,&Reg1)) BEGIN CodeLen=1; DAsmCode[0]=0x0cc080+AddVal+(Reg1 << 8)+h+h2; END else BEGIN FirstPassUnknown=False; DecodeAdr(Mid,MModNoImm,MSegXData+MSegYData); Reg3=Ord(AdrSeg==SegYData) << 6; if ((AdrType==ModAbs) AND (FirstPassUnknown)) AdrVal&=0x3f; if ((AdrType==ModAbs) AND (AdrVal<=63) AND (AdrVal>=0)) BEGIN CodeLen=1; DAsmCode[0]=0x0c8080+AddVal+(AdrVal << 8)+Reg3+h+h2; END else if ((AdrType==ModAbs) AND (AdrVal>=MemLimit-0x3f) AND (AdrVal<=MemLimit)) BEGIN CodeLen=1; DAsmCode[0]=0x0cc000+AddVal+((AdrVal & 0x3f) << 8)+Reg3+h+h2; END else if ((AdrType==ModAbs) AND (AdrVal>=MemLimit-0x7f) AND (AdrVal<=MemLimit-0x40)) BEGIN CodeLen=1; DAsmCode[0]=0x048000+AddVal+((AdrVal & 0x3f) << 8)+Reg3+h+(h2 >> 9); END else if (AdrType==ModAbs) WrError(1350); else if (AdrType!=ModNone) BEGIN CodeLen=1; DAsmCode[0]=0x0c8000+AddVal+(AdrMode << 8)+Reg3+h+h2; END END END if (CodeLen==1) BEGIN Dist=EvalIntExpression(Right,AdrInt,&OK)-(EProgCounter()+2); if (OK) BEGIN DAsmCode[1]=Dist & 0xffffff; CodeLen=2; END else CodeLen=0; END END return; END if ((Memo("BRA")) OR (Memo("BSR"))) BEGIN z=Memo("BRA") ? 0x40 : 0; if (ArgCnt!=1) WrError(1110); else if (MomCPU23)) WrXError(1445,ArgStr[1]); else BEGIN Reg1-=16; DAsmCode[0]=0x0d1880+(Reg1 << 8)+z; CodeLen=1; END END else BEGIN CutSize(ArgStr[1],&Size); Dist=EvalIntExpression(ArgStr[1],AdrInt,&OK)-(EProgCounter()+1); if (Size==0) Size=((Dist>-256) AND (Dist<255)) ? 1 : 2; switch (Size) BEGIN case 1: if ((NOT SymbolQuestionable) AND ((Dist<-256) OR (Dist>255))) WrError(1370); else BEGIN Dist&=0x1ff; DAsmCode[0]=0x050800+(z << 4)+((Dist & 0x1e0) << 1)+(Dist & 0x1f); CodeLen=1; END break; case 2: Dist--; DAsmCode[0]=0x0d1080+z; DAsmCode[1]=Dist & 0xffffff; CodeLen=2; break; END END return; END if ((*OpPart=='B') AND (DecodeCondition(OpPart+1,&Condition))) BEGIN if (ArgCnt!=1) WrError(1110); else if (MomCPU23)) WrXError(1445,ArgStr[1]); else BEGIN Reg1-=16; DAsmCode[0]=0x0d1840+(Reg1 << 8)+Condition; CodeLen=1; END END else BEGIN CutSize(ArgStr[1],&Size); Dist=EvalIntExpression(ArgStr[1],AdrInt,&OK)-(EProgCounter()+1); if (Size==0) Size=((Dist>-256) AND (Dist<255)) ? 1 : 2; switch (Size) BEGIN case 1: if ((NOT SymbolQuestionable) AND ((Dist<-256) OR (Dist>255))) WrError(1370); else BEGIN Dist&=0x1ff; DAsmCode[0]=0x050400+(Condition << 12)+((Dist & 0x1e0) << 1)+(Dist & 0x1f); CodeLen=1; END break; case 2: Dist--; DAsmCode[0]=0x0d1040+Condition; DAsmCode[1]=Dist & 0xffffff; CodeLen=2; break; END END return; END if ((strncmp(OpPart,"BS",2)==0) AND (DecodeCondition(OpPart+2,&Condition))) BEGIN if (ArgCnt!=1) WrError(1110); else if (MomCPU23)) WrXError(1445,ArgStr[1]); else BEGIN Reg1-=16; DAsmCode[0]=0x0d1800+(Reg1 << 8)+Condition; CodeLen=1; END END else BEGIN CutSize(ArgStr[1],&Size); Dist=EvalIntExpression(ArgStr[1],AdrInt,&OK)-(EProgCounter()+1); if (Size==0) Size=((Dist>-256) AND (Dist<255)) ? 1 : 2; switch (Size) BEGIN case 1: if ((NOT SymbolQuestionable) AND ((Dist<-256) OR (Dist>255))) WrError(1370); else BEGIN Dist&=0x1ff; DAsmCode[0]=0x050000+(Condition << 12)+((Dist & 0x1e0) << 1)+(Dist & 0x1f); CodeLen=1; END break; case 2: Dist--; DAsmCode[0]=0x0d1000+Condition; DAsmCode[1]=Dist & 0xffffff; CodeLen=2; break; END END return; END if ((Memo("LUA")) OR (Memo("LEA"))) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN SplitArg(ArgStr[1],Left,Right); if ((*Left=='\0') OR (*Right=='\0')) WrError(1110); else if (NOT DecodeReg(Right,&Reg1)) WrXError(1445,Right); else if (Reg1>31) WrXError(1445,Right); else BEGIN DecodeAdr(Left,MModModInc+MModModDec+MModPostInc+MModPostDec+MModDisp,MSegXData); if (AdrType==ModDisp) BEGIN if (ChkRange(AdrVal,-64,63)) BEGIN AdrVal&=0x7f; DAsmCode[0]=0x040000+(Reg1-16)+(AdrMode << 8)+ ((AdrVal & 0x0f) << 4)+ ((AdrVal & 0x70) << 7); CodeLen=1; END END else if (AdrType!=ModNone) BEGIN CodeLen=1; DAsmCode[0]=0x044000+(AdrMode << 8)+Reg1; END END END return; END if (Memo("LRA")) BEGIN if (ArgCnt!=1) WrError(1110); else if (MomCPU0x1f) WrXError(1445,Right); else if (DecodeGeneralReg(Left,&Reg2)) BEGIN if ((Reg2<16) OR (Reg2>23)) WrXError(1445,Left); else BEGIN DAsmCode[0]=0x04c000+((Reg2 & 7) << 8)+Reg1; CodeLen=1; END END else BEGIN DAsmCode[1]=EvalIntExpression(Left,AdrInt,&OK)-(EProgCounter()+2); if (OK) BEGIN DAsmCode[0]=0x044040+Reg1; CodeLen=2; END END END return; END if (Memo("PLOCK")) BEGIN if (ArgCnt!=1) WrError(1110); else if (MomCPU23)) WrError(1320); else BEGIN Reg2=((z & 1) << 5) + (((LongInt)(z >> 1)) << 16); if (DecodeGeneralReg(Mid,&Reg1)) BEGIN CodeLen=2; DAsmCode[0] = 0x0ac000 + h + Reg2 + (Reg1 << 8); END else BEGIN DecodeAdr(Mid,MModNoImm,MSegXData+MSegYData); Reg3=Ord(AdrSeg==SegYData) << 6; if (AdrType==ModAbs) if ((AdrVal>=0) AND (AdrVal<=63)) BEGIN CodeLen=2; DAsmCode[0] = 0x0a0080 + h + Reg2 + Reg3 + (AdrVal << 8); END else if ((AdrVal>=MemLimit-0x3f) AND (AdrVal<=MemLimit)) BEGIN CodeLen=2; DAsmCode[0] = 0x0a8080 + h + Reg2 + Reg3 + ((AdrVal & 0x3f) << 8); END else if ((MomCPU>=CPU56300) AND (AdrVal>=MemLimit-0x7f) AND (AdrVal<=MemLimit-0x40)) BEGIN CodeLen=2; Reg2=((z & 1) << 5) + (((LongInt)(z >> 1)) << 14); DAsmCode[0] = 0x018080 + h + Reg2 + Reg3 + ((AdrVal & 0x3f) << 8); END else WrError(1320); else BEGIN CodeLen=2; DAsmCode[0] = 0x0a4080 + h + Reg2 + Reg3 + (AdrMode << 8); END END END END END END return; END if ((Memo("DO")) OR (Memo("DOR"))) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN z=Ord(Memo("DOR")); SplitArg(ArgStr[1],Left,Right); if ((*Left=='\0') OR (*Right=='\0')) WrError(1110); else BEGIN DAsmCode[1]=EvalIntExpression(Right,AdrInt,&OK)-1; if (OK) BEGIN ChkSpace(SegCode); if (strcasecmp(Left,"FOREVER")==0) BEGIN if (MomCPU> 8)+((Reg1 & 0xff) << 8)+(z << 4); END END else BEGIN DecodeAdr(Left,MModNoImm,MSegXData+MSegYData); if (AdrType==ModAbs) if ((AdrVal<0) OR (AdrVal>63)) WrError(1320); else BEGIN CodeLen=2; DAsmCode[0]=0x060000+(AdrVal << 8)+(Ord(AdrSeg==SegYData) << 6)+(z << 4); END else BEGIN CodeLen=2; DAsmCode[0]=0x064000+(AdrMode << 8)+(Ord(AdrSeg==SegYData) << 6)+(z << 4); END END END END END return; END if ((strncmp(OpPart,"BRK",3)==0) AND (DecodeCondition(OpPart+3,&Condition))) BEGIN if (ArgCnt!=0) WrError(1110); else if (MomCPU0xfff)) WrError(1320); else BEGIN CodeLen=1; DAsmCode[0] = 0x0600a0 + (AdrVal >> 8) + ((AdrVal & 0xff) << 8); END else if (AdrType==ModAbs) if ((AdrVal<0) OR (AdrVal>63)) WrError(1320); else BEGIN CodeLen=1; DAsmCode[0] = 0x060020 + (AdrVal << 8) + (Ord(AdrSeg==SegYData) << 6); END else BEGIN CodeLen=1+AdrCnt; DAsmCode[1] = AdrVal; DAsmCode[0] = 0x064020 + (AdrMode << 8) + (Ord(AdrSeg==SegYData) << 6); END END return; END WrXError(1200,OpPart); END static Boolean IsDef_56K(void) BEGIN return ((Memo("XSFR")) OR (Memo("YSFR"))); END static void SwitchFrom_56K(void) BEGIN DeinitFields(); END static void SwitchTo_56K(void) BEGIN TurnWords=True; ConstMode=ConstModeMoto; SetIsOccupied=False; PCSymbol="*"; HeaderID=0x09; NOPCode=0x000000; DivideChars=" \009"; HasAttrs=False; if (MomCPU==CPU56300) BEGIN AdrInt=UInt24; MemLimit=0xffffffl; END else BEGIN AdrInt=UInt16; MemLimit=0xffff; END ValidSegs=(1<