dect
/
asl
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
asl/code3203x.c

1512 lines
44 KiB
C

/* code3203x.c */
/*****************************************************************************/
/* AS-Portierung */
/* */
/* Codegenerator TMS320C3x-Familie */
/* */
/* Historie: 12.12.1996 Grundsteinlegung */
/* 7. 7.1998 Fix Zugriffe auf CharTransTable wg. signed chars */
/* 18. 8.1998 BookKeeping-Aufruf in RES */
/* 3. 1.1998 ChkPC-Anpassung */
/* */
/*****************************************************************************/
#include "stdinc.h"
#include <ctype.h>
#include <string.h>
#include "nls.h"
#include "endian.h"
#include "bpemu.h"
#include "strutil.h"
#include "chunks.h"
#include "asmdef.h"
#include "asmsub.h"
#include "asmpars.h"
#include "asmcode.h"
#include "codepseudo.h"
#include "codevars.h"
#define ConditionCount 28
#define FixedOrderCount 3
#define RotOrderCount 4
#define StkOrderCount 4
#define GenOrderCount 41
#define ParOrderCount 8
#define SingOrderCount 3
typedef struct
{
char *Name;
Byte Code;
} Condition;
typedef struct
{
char *Name;
LongWord Code;
} FixedOrder;
typedef struct
{
char *Name;
int NameLen;
Boolean May1,May3;
Byte Code,Code3;
Boolean OnlyMem;
Boolean SwapOps;
Boolean ImmFloat;
Byte ParMask,Par3Mask;
Byte PCodes[8],P3Codes[8];
} GenOrder;
typedef struct
{
char *Name;
LongWord Code;
Byte Mask;
} SingOrder;
static CPUVar CPU32030,CPU32031;
static SimpProc SaveInitProc;
static Boolean NextPar,ThisPar;
static Byte PrevARs,ARs;
static char PrevOp[7];
static int z2;
static ShortInt PrevSrc1Mode,PrevSrc2Mode,PrevDestMode;
static ShortInt CurrSrc1Mode,CurrSrc2Mode,CurrDestMode;
static Word PrevSrc1Part,PrevSrc2Part,PrevDestPart;
static Word CurrSrc1Part,CurrSrc2Part,CurrDestPart;
static Condition *Conditions;
static FixedOrder *FixedOrders;
static char **RotOrders;
static char **StkOrders;
static GenOrder *GenOrders;
static char **ParOrders;
static SingOrder *SingOrders;
static LongInt DPValue;
/*-------------------------------------------------------------------------*/
/* Befehlstabellenverwaltung */
static void AddCondition(char *NName, Byte NCode)
BEGIN
if (InstrZ>=ConditionCount) exit(255);
Conditions[InstrZ].Name=NName;
Conditions[InstrZ++].Code=NCode;
END
static void AddFixed(char *NName, LongWord NCode)
BEGIN
if (InstrZ>=FixedOrderCount) exit(255);
FixedOrders[InstrZ].Name=NName;
FixedOrders[InstrZ++].Code=NCode;
END
static void AddSing(char *NName, LongWord NCode, Byte NMask)
BEGIN
if (InstrZ>=SingOrderCount) exit(255);
SingOrders[InstrZ].Name=NName;
SingOrders[InstrZ].Code=NCode;
SingOrders[InstrZ++].Mask=NMask;
END
static void AddGen(char *NName, Boolean NMay1, Boolean NMay3,
Byte NCode, Byte NCode3,
Boolean NOnly, Boolean NSwap, Boolean NImm,
Byte NMask1, Byte NMask3,
Byte C20, Byte C21, Byte C22, Byte C23, Byte C24,
Byte C25, Byte C26, Byte C27, Byte C30, Byte C31,
Byte C32, Byte C33, Byte C34, Byte C35, Byte C36,
Byte C37)
BEGIN
if (InstrZ>=GenOrderCount) exit(255);
GenOrders[InstrZ].Name=NName;
GenOrders[InstrZ].NameLen=strlen(NName);
GenOrders[InstrZ].May1=NMay1; GenOrders[InstrZ].May3=NMay3;
GenOrders[InstrZ].Code=NCode; GenOrders[InstrZ].Code3=NCode3;
GenOrders[InstrZ].OnlyMem=NOnly; GenOrders[InstrZ].SwapOps=NSwap;
GenOrders[InstrZ].ImmFloat=NImm;
GenOrders[InstrZ].ParMask=NMask1; GenOrders[InstrZ].Par3Mask=NMask3;
GenOrders[InstrZ].PCodes[0]=C20; GenOrders[InstrZ].PCodes[1]=C21;
GenOrders[InstrZ].PCodes[2]=C22; GenOrders[InstrZ].PCodes[3]=C23;
GenOrders[InstrZ].PCodes[4]=C24; GenOrders[InstrZ].PCodes[5]=C25;
GenOrders[InstrZ].PCodes[6]=C26; GenOrders[InstrZ].PCodes[7]=C27;
GenOrders[InstrZ].P3Codes[0]=C30; GenOrders[InstrZ].P3Codes[1]=C31;
GenOrders[InstrZ].P3Codes[2]=C32; GenOrders[InstrZ].P3Codes[3]=C33;
GenOrders[InstrZ].P3Codes[4]=C34; GenOrders[InstrZ].P3Codes[5]=C35;
GenOrders[InstrZ].P3Codes[6]=C36; GenOrders[InstrZ++].P3Codes[7]=C37;
END
static void InitFields(void)
BEGIN
Conditions=(Condition *) malloc(sizeof(Condition)*ConditionCount); InstrZ=0;
AddCondition("U" ,0x00); AddCondition("LO" ,0x01);
AddCondition("LS" ,0x02); AddCondition("HI" ,0x03);
AddCondition("HS" ,0x04); AddCondition("EQ" ,0x05);
AddCondition("NE" ,0x06); AddCondition("LT" ,0x07);
AddCondition("LE" ,0x08); AddCondition("GT" ,0x09);
AddCondition("GE" ,0x0a); AddCondition("Z" ,0x05);
AddCondition("NZ" ,0x06); AddCondition("P" ,0x09);
AddCondition("N" ,0x07); AddCondition("NN" ,0x0a);
AddCondition("NV" ,0x0c); AddCondition("V" ,0x0d);
AddCondition("NUF",0x0e); AddCondition("UF" ,0x0f);
AddCondition("NC" ,0x04); AddCondition("C" ,0x01);
AddCondition("NLV",0x10); AddCondition("LV" ,0x11);
AddCondition("NLUF",0x12);AddCondition("LUF",0x13);
AddCondition("ZUF",0x14); AddCondition("" ,0x00);
FixedOrders=(FixedOrder *) malloc(sizeof(FixedOrder)*FixedOrderCount); InstrZ=0;
AddFixed("IDLE",0x06000000); AddFixed("SIGI",0x16000000);
AddFixed("SWI" ,0x66000000);
RotOrders=(char **) malloc(sizeof(char *)*RotOrderCount); InstrZ=0;
RotOrders[InstrZ++]="ROL"; RotOrders[InstrZ++]="ROLC";
RotOrders[InstrZ++]="ROR"; RotOrders[InstrZ++]="RORC";
StkOrders=(char **) malloc(sizeof(char *)*StkOrderCount); InstrZ=0;
StkOrders[InstrZ++]="POP"; StkOrders[InstrZ++]="POPF";
StkOrders[InstrZ++]="PUSH"; StkOrders[InstrZ++]="PUSHF";
GenOrders=(GenOrder *) malloc(sizeof(GenOrder)*GenOrderCount); InstrZ=0;
/* Name May3 Cd3 Swap PM1 PCodes3 */
/* May1 Cd1 OMem ImmF PM3 PCodes1 */
AddGen("ABSF" ,True ,False,0x00,0xff,False,False,True , 4, 0,
0xff,0xff,0x04,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("ABSI" ,True ,False,0x01,0xff,False,False,False, 8, 0,
0xff,0xff,0xff,0x05,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("ADDC" ,False,True ,0x02,0x00,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("ADDF" ,False,True ,0x03,0x01,False,False,True , 0, 4,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x06,0xff,0xff,0xff,0xff,0xff);
AddGen("ADDI" ,False,True ,0x04,0x02,False,False,False, 0, 8,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x07,0xff,0xff,0xff,0xff);
AddGen("AND" ,False,True ,0x05,0x03,False,False,False, 0, 8,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x08,0xff,0xff,0xff,0xff);
AddGen("ANDN" ,False,True ,0x06,0x04,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("ASH" ,False,True ,0x07,0x05,False,False,False, 0, 8,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x09,0xff,0xff,0xff,0xff);
AddGen("CMPF" ,False,True ,0x08,0x06,False,False,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("CMPI" ,False,True ,0x09,0x07,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("FIX" ,True ,False,0x0a,0xff,False,False,True , 8, 0,
0xff,0xff,0xff,0x0a,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("FLOAT",True ,False,0x0b,0xff,False,False,False, 4, 0,
0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("LDE" ,False,False,0x0d,0xff,False,False,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("LDF" ,False,False,0x0e,0xff,False,False,True , 5, 0,
0x02,0xff,0x0c,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("LDFI" ,False,False,0x0f,0xff,True ,False,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("LDI" ,False,False,0x10,0xff,False,False,False,10, 0,
0xff,0x03,0xff,0x0d,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("LDII" ,False,False,0x11,0xff,True ,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("LDM" ,False,False,0x12,0xff,False,False,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("LSH" ,False,True ,0x13,0x08,False,False,False, 0, 8,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x0e,0xff,0xff,0xff,0xff);
AddGen("MPYF" ,False,True ,0x14,0x09,False,False,True , 0,52,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x0f,0xff,0x00,0x01,0xff,0xff);
AddGen("MPYI" ,False,True ,0x15,0x0a,False,False,False, 0,200,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x10,0xff,0xff,0x02,0x03);
AddGen("NEGB" ,True ,False,0x16,0xff,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("NEGF" ,True ,False,0x17,0xff,False,False,True , 4, 0,
0xff,0xff,0x11,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("NEGI" ,True ,False,0x18,0xff,False,False,False, 8, 0,
0xff,0xff,0xff,0x12,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("NORM" ,True ,False,0x1a,0xff,False,False,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("NOT" ,True ,False,0x1b,0xff,False,False,False, 8, 0,
0xff,0xff,0xff,0x13,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("OR" ,False,True ,0x20,0x0b,False,False,False, 0, 8,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x14,0xff,0xff,0xff,0xff);
AddGen("RND" ,True ,False,0x22,0xff,False,False,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("STF" ,False,False,0x28,0xff,True ,True ,True , 4, 0,
0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("STFI" ,False,False,0x29,0xff,True ,True ,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("STI" ,False,False,0x2a,0xff,True ,True ,False, 8, 0,
0xff,0xff,0xff,0x01,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("STII" ,False,False,0x2b,0xff,True ,True ,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("SUBB" ,False,True ,0x2d,0x0c,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("SUBC" ,False,False,0x2e,0xff,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("SUBF" ,False,True ,0x2f,0x0d,False,False,True , 0, 4,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x15,0xff,0xff,0xff,0xff,0xff);
AddGen("SUBI" ,False,True ,0x30,0x0e,False,False,False, 0, 8,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x16,0xff,0xff,0xff,0xff);
AddGen("SUBRB",False,False,0x31,0xff,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("SUBRF",False,False,0x32,0xff,False,False,True , 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("SUBRI",False,False,0x33,0xff,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("TSTB" ,False,True ,0x34,0x0f,False,False,False, 0, 0,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
AddGen("XOR" ,False,True ,0x35,0x10,False,False,False, 0, 8,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x17,0xff,0xff,0xff,0xff);
ParOrders=(char **) malloc(sizeof(char *)*ParOrderCount); InstrZ=0;
ParOrders[InstrZ++]="LDF"; ParOrders[InstrZ++]="LDI";
ParOrders[InstrZ++]="STF"; ParOrders[InstrZ++]="STI";
ParOrders[InstrZ++]="ADDF3"; ParOrders[InstrZ++]="SUBF3";
ParOrders[InstrZ++]="ADDI3"; ParOrders[InstrZ++]="SUBI3";
SingOrders=(SingOrder *) malloc(sizeof(SingOrder)*SingOrderCount); InstrZ=0;
AddSing("IACK",0x1b000000,6);
AddSing("NOP" ,0x0c800000,5);
AddSing("RPTS",0x139b0000,15);
END
static void DeinitFields(void)
BEGIN
free(Conditions);
free(FixedOrders);
free(RotOrders);
free(StkOrders);
free(GenOrders);
free(ParOrders);
free(SingOrders);
END
/*-------------------------------------------------------------------------*/
/* Gleitkommawandler */
static void SplitExt(Double Inp, LongInt *Expo, LongWord *Mant)
BEGIN
Byte Field[8];
Boolean Sign;
int z;
Double_2_ieee8(Inp,Field,False);
Sign=(Field[7]>0x7f);
*Expo=(((LongWord) Field[7]&0x7f)<<4)+(Field[6]>>4);
*Mant=Field[6]&0x0f; if (*Expo!=0) *Mant|=0x10;
for (z=5; z>2; z--) *Mant=((*Mant)<<8)|Field[z];
*Mant=((*Mant)<<3)+(Field[2]>>5);
*Expo-=0x3ff;
if (Sign) *Mant=0xffffffff-(*Mant);
*Mant=(*Mant)^0x80000000;
END
static Boolean ExtToShort(Double Inp, Word *Erg)
BEGIN
LongInt Expo;
LongWord Mant;
if (Inp==0) *Erg=0x8000;
else
BEGIN
SplitExt(Inp,&Expo,&Mant);
if (abs(Expo)>7)
BEGIN
WrError((Expo>0)?1320:1315);
return False;
END
*Erg=((Expo << 12) & 0xf000) | ((Mant >> 20) & 0xfff);
END
return True;
END
static Boolean ExtToSingle(Double Inp, LongWord *Erg)
BEGIN
LongInt Expo;
LongWord Mant;
if (Inp==0) *Erg=0x80000000;
else
BEGIN
SplitExt(Inp,&Expo,&Mant);
if (abs(Expo)>127)
BEGIN
WrError((Expo>0)?1320:1315);
return False;
END
*Erg=((Expo << 24) & 0xff000000)+(Mant >> 8);
END
return True;
END
static Boolean ExtToExt(Double Inp, LongWord *ErgL, LongWord *ErgH)
BEGIN
LongInt Exp;
if (Inp==0)
BEGIN
*ErgH=0x80; *ErgL=0x00000000;
END
else
BEGIN
SplitExt(Inp,&Exp,ErgL);
if (abs(Exp)>127)
BEGIN
WrError((Exp>0)?1320:1315);
return False;
END
*ErgH=Exp&0xff;
END
return True;
END
/*-------------------------------------------------------------------------*/
/* Adressparser */
#define ModNone (-1)
#define ModReg 0
#define MModReg (1 << ModReg)
#define ModDir 1
#define MModDir (1 << ModDir)
#define ModInd 2
#define MModInd (1 << ModInd)
#define ModImm 3
#define MModImm (1 << ModImm)
static ShortInt AdrMode;
static LongInt AdrPart;
static Boolean DecodeReg(char *Asc, Byte *Erg)
BEGIN
#define RegCnt 12
#define RegStart 0x10
static char *Regs[RegCnt]=
{"DP","IR0","IR1","BK","SP","ST","IE","IF","IOF","RS","RE","RC"};
Boolean Err;
if ((toupper(*Asc)=='R') AND (strlen(Asc)<=3) AND (strlen(Asc)>=2))
BEGIN
*Erg=ConstLongInt(Asc+1,&Err);
if ((Err) AND (*Erg<=0x1b)) return True;
END
if ((strlen(Asc)==3) AND (toupper(*Asc)=='A') AND (toupper(Asc[1])=='R') AND (Asc[2]>='0') AND (Asc[2]<='7'))
BEGIN
*Erg=Asc[2]-'0'+8; return True;
END
*Erg=0;
while ((*Erg<RegCnt) AND (strcasecmp(Regs[*Erg],Asc)!=0)) (*Erg)++;
if (*Erg<RegCnt)
BEGIN
*Erg+=RegStart; return True;
END
return False;
END
static void ChkAdr(Byte Erl)
BEGIN
if ((AdrMode!=ModNone) AND ((Erl & (1 << AdrMode))==0))
BEGIN
AdrMode=ModNone; WrError(1350);
END
END
static void DecodeAdr(char *Asc, Byte Erl, Boolean ImmFloat)
BEGIN
Byte HReg;
Integer Disp;
char *p;
int l;
Double f;
Word fi;
LongInt AdrLong;
Boolean BitRev,Circ;
String NDisp;
Boolean OK;
enum {ModBase,ModAdd,ModSub,ModPreInc,ModPreDec,ModPostInc,ModPostDec} Mode;
KillBlanks(Asc);
AdrMode=ModNone;
/* I. Register? */
if (DecodeReg(Asc,&HReg))
BEGIN
AdrMode=ModReg; AdrPart=HReg; ChkAdr(Erl); return;
END
/* II. indirekt ? */
if (*Asc=='*')
BEGIN
/* II.1. Erkennungszeichen entfernen */
strcpy(Asc,Asc+1);
/* II.2. Extrawuerste erledigen */
BitRev=False; Circ=False;
if (toupper(Asc[strlen(Asc)-1])=='B')
BEGIN
BitRev=True; Asc[strlen(Asc)-1]='\0';
END
else if (Asc[strlen(Asc)-1]=='%')
BEGIN
Circ=True; Asc[strlen(Asc)-1]='\0';
END
/* II.3. Displacement entfernen und auswerten:
0..255-->Displacement
-1,-2 -->IR0,IR1
-3 -->Default */
p=QuotPos(Asc,'(');
if (p!=Nil)
BEGIN
if (Asc[strlen(Asc)-1]!=')')
BEGIN
WrError(1350); return;
END
*p='\0'; strmaxcpy(NDisp,p+1,255); NDisp[strlen(NDisp)-1]='\0';
if (strcasecmp(NDisp,"IR0")==0) Disp=(-1);
else if (strcasecmp(NDisp,"IR1")==0) Disp=(-2);
else
BEGIN
Disp=EvalIntExpression(NDisp,UInt8,&OK);
if (NOT OK) return;
END
END
else Disp=(-3);
/* II.4. Addieren/Subtrahieren mit/ohne Update? */
l=strlen(Asc);
if (*Asc=='-')
BEGIN
if (Asc[1]=='-')
BEGIN
Mode=ModPreDec; strcpy(Asc,Asc+2);
END
else
BEGIN
Mode=ModSub; strcpy(Asc,Asc+1);
END
END
else if (*Asc=='+')
BEGIN
if (Asc[1]=='+')
BEGIN
Mode=ModPreInc; strcpy(Asc,Asc+2);
END
else
BEGIN
Mode=ModAdd; strcpy(Asc,Asc+1);
END
END
else if (Asc[l-1]=='-')
BEGIN
if (Asc[l-2]=='-')
BEGIN
Mode=ModPostDec; Asc[l-2]='\0';
END
else
BEGIN
WrError(1350); return;
END
END
else if (Asc[l-1]=='+')
BEGIN
if (Asc[l-2]=='+')
BEGIN
Mode=ModPostInc; Asc[l-2]='\0';
END
else
BEGIN
WrError(1350); return;
END
END
else Mode=ModBase;
/* II.5. Rest muss Basisregister sein */
if ((NOT DecodeReg(Asc,&HReg)) OR (HReg<8) OR (HReg>15))
BEGIN
WrError(1350); return;
END
HReg-=8;
if ((ARs & (1l << HReg))==0) ARs+=1l << HReg;
else WrXError(210,Asc);
/* II.6. Default-Displacement explizit machen */
if (Disp==-3)
Disp=(Mode==ModBase) ? 0 : 1;
/* II.7. Entscheidungsbaum */
switch (Mode)
BEGIN
case ModBase:
case ModAdd:
if ((Circ) OR (BitRev)) WrError(1350);
else
BEGIN
switch (Disp)
BEGIN
case -2: AdrPart=0x8000; break;
case -1: AdrPart=0x4000; break;
case 0: AdrPart=0xc000; break;
default: AdrPart=Disp;
END
AdrPart+=((Word)HReg) << 8; AdrMode=ModInd;
END
break;
case ModSub:
if ((Circ) OR (BitRev)) WrError(1350);
else
BEGIN
switch (Disp)
BEGIN
case -2: AdrPart=0x8800; break;
case -1: AdrPart=0x4800; break;
case 0: AdrPart=0xc000; break;
default: AdrPart=0x0800+Disp;
END
AdrPart+=((Word)HReg) << 8; AdrMode=ModInd;
END
break;
case ModPreInc:
if ((Circ) OR (BitRev)) WrError(1350);
else
BEGIN
switch (Disp)
BEGIN
case -2: AdrPart=0x9000; break;
case -1: AdrPart=0x5000; break;
default: AdrPart=0x1000+Disp;
END
AdrPart+=((Word)HReg) << 8; AdrMode=ModInd;
END
break;
case ModPreDec:
if ((Circ) OR (BitRev)) WrError(1350);
else
BEGIN
switch (Disp)
BEGIN
case -2: AdrPart=0x9800; break;
case -1: AdrPart=0x5800; break;
default: AdrPart=0x1800+Disp;
END
AdrPart+=((Word)HReg) << 8; AdrMode=ModInd;
END
break;
case ModPostInc:
if (BitRev)
BEGIN
if (Disp!=-1) WrError(1350);
else
BEGIN
AdrPart=0xc800+(((Word)HReg) << 8); AdrMode=ModInd;
END
END
else
BEGIN
switch (Disp)
BEGIN
case -2: AdrPart=0xa000; break;
case -1: AdrPart=0x6000; break;
default: AdrPart=0x2000+Disp;
END
if (Circ) AdrPart+=0x1000;
AdrPart+=((Word)HReg) << 8; AdrMode=ModInd;
END
break;
case ModPostDec:
if (BitRev) WrError(1350);
else
BEGIN
switch (Disp)
BEGIN
case -2: AdrPart=0xa800; break;
case -1: AdrPart=0x6800; break;
default: AdrPart=0x2800+Disp; break;
END
if (Circ) AdrPart+=0x1000;
AdrPart+=((Word)HReg) << 8; AdrMode=ModInd;
END
break;
END
ChkAdr(Erl); return;
END
/* III. absolut */
if (*Asc=='@')
BEGIN
AdrLong=EvalIntExpression(Asc+1,UInt24,&OK);
if (OK)
BEGIN
if ((DPValue!=-1) AND ((AdrLong >> 16)!=DPValue)) WrError(110);
AdrMode=ModDir; AdrPart=AdrLong & 0xffff;
END
ChkAdr(Erl); return;
END
/* IV. immediate */
if (ImmFloat)
BEGIN
f=EvalFloatExpression(Asc,Float64,&OK);
if (OK)
if (ExtToShort(f,&fi))
BEGIN
AdrPart=fi; AdrMode=ModImm;
END
END
else
BEGIN
AdrPart=EvalIntExpression(Asc,Int16,&OK);
if (OK)
BEGIN
AdrPart&=0xffff; AdrMode=ModImm;
END
END
ChkAdr(Erl);
END
static Word EffPart(Byte Mode, Word Part)
BEGIN
switch (Mode)
BEGIN
case ModReg: return Lo(Part);
case ModInd: return Hi(Part);
default: WrError(10000); return 0;
END
END
/*-------------------------------------------------------------------------*/
/* Code-Erzeugung */
static Boolean DecodePseudo(void)
BEGIN
#define ASSUME3203Count 1
static ASSUMERec ASSUME3203s[ASSUME3203Count]=
{{"DP", &DPValue, -1, 0xff, 0x100}};
Boolean OK;
int z,z2;
LongInt Size;
Double f;
TempResult t;
if (Memo("ASSUME"))
BEGIN
CodeASSUME(ASSUME3203s,ASSUME3203Count);
return True;
END
if (Memo("SINGLE"))
BEGIN
if (ArgCnt==0) WrError(1110);
else
BEGIN
OK=True;
for (z=1; z<=ArgCnt; z++)
if (OK)
BEGIN
f=EvalFloatExpression(ArgStr[z],Float64,&OK);
if (OK)
OK=OK AND ExtToSingle(f,DAsmCode+(CodeLen++));
END
if (NOT OK) CodeLen=0;
END
return True;
END
if (Memo("EXTENDED"))
BEGIN
if (ArgCnt==0) WrError(1110);
else
BEGIN
OK=True;
for (z=1; z<=ArgCnt; z++)
if (OK)
BEGIN
f=EvalFloatExpression(ArgStr[z],Float64,&OK);
if (OK)
OK=OK AND ExtToExt(f,DAsmCode+CodeLen+1,DAsmCode+CodeLen);
CodeLen+=2;
END
if (NOT OK) CodeLen=0;
END
return True;
END
if (Memo("WORD"))
BEGIN
if (ArgCnt==0) WrError(1110);
else
BEGIN
OK=True;
for (z=1; z<=ArgCnt; z++)
if (OK) DAsmCode[CodeLen++]=EvalIntExpression(ArgStr[z],Int32,&OK);
if (NOT OK) CodeLen=0;
END
return True;
END
if (Memo("DATA"))
BEGIN
if (ArgCnt==0) WrError(1110);
else
BEGIN
OK=True;
for (z=1; z<=ArgCnt; z++)
if (OK)
BEGIN
EvalExpression(ArgStr[z],&t);
switch (t.Typ)
BEGIN
case TempInt:
#ifdef HAS64
if (NOT RangeCheck(t.Contents.Int,Int32))
BEGIN
OK=False; WrError(1320);
END
else
#endif
DAsmCode[CodeLen++]=t.Contents.Int;
break;
case TempFloat:
if (NOT ExtToSingle(t.Contents.Float,DAsmCode+(CodeLen++))) OK=False;
break;
case TempString:
for (z2=0; z2<strlen(t.Contents.Ascii); z2++)
BEGIN
if ((z2 & 3)==0) DAsmCode[CodeLen++]=0;
DAsmCode[CodeLen-1]+=
(((LongWord)CharTransTable[((usint)t.Contents.Ascii[z2])&0xff])) << (8*(3-(z2 & 3)));
END
break;
case TempNone:
OK=False;
END
END
if (NOT OK) CodeLen=0;
END
return True;
END
if (Memo("BSS"))
BEGIN
if (ArgCnt!=1) WrError(1110);
else
BEGIN
FirstPassUnknown=False;
Size=EvalIntExpression(ArgStr[1],UInt24,&OK);
if (FirstPassUnknown) WrError(1820);
if ((OK) AND (NOT FirstPassUnknown))
BEGIN
DontPrint=True;
CodeLen=Size;
BookKeeping();
END
END
return True;
END
return False;
END
static void JudgePar(GenOrder *Prim, int Sec, Byte *ErgMode, Byte *ErgCode)
BEGIN
if (Sec>3) *ErgMode=3;
else if (Prim->May3) *ErgMode=1;
else *ErgMode=2;
if (*ErgMode==2) *ErgCode=Prim->PCodes[Sec];
else *ErgCode=Prim->P3Codes[Sec];
END
static LongWord EvalAdrExpression(char *Asc, Boolean *OK)
BEGIN
if (*Asc=='@') strcpy(Asc,Asc+1);
return EvalIntExpression(Asc,UInt24,OK);
END
static void SwapMode(ShortInt *M1, ShortInt *M2)
BEGIN
AdrMode=(*M1); *M1=(*M2); *M2=AdrMode;
END
static void SwapPart(Word *P1, Word *P2)
BEGIN
AdrPart=(*P1); *P1=(*P2); *P2=AdrPart;
END
static void MakeCode_3203X(void)
BEGIN
Boolean OK,Is3;
Byte HReg,HReg2,Sum;
int z,z3,l;
LongInt AdrLong,DFlag,Disp;
String HOp,Form;
CodeLen=0; DontPrint=False;
ThisPar=(strcmp(LabPart,"||")==0);
if ((strlen(OpPart)>2) AND (strncmp(OpPart,"||",2)==0))
BEGIN
ThisPar=True; strcpy(OpPart,OpPart+2);
END
if ((NOT NextPar) AND (ThisPar))
BEGIN
WrError(1950); return;
END
ARs=0;
/* zu ignorierendes */
if (Memo("")) return;
/* Pseudoanweisungen */
if (DecodePseudo()) return;
/* ohne Argument */
for (z=0; z<FixedOrderCount; z++)
if (Memo(FixedOrders[z].Name))
BEGIN
if (ArgCnt!=0) WrError(1110);
else if (ThisPar) WrError(1950);
else
BEGIN
DAsmCode[0]=FixedOrders[z].Code; CodeLen=1;
END
NextPar=False; return;
END
/* Arithmetik/Logik */
for (z=0; z<GenOrderCount; z++)
if ((strncmp(OpPart,GenOrders[z].Name,GenOrders[z].NameLen)==0)
AND ((OpPart[GenOrders[z].NameLen]=='\0') OR (OpPart[GenOrders[z].NameLen]=='3')))
BEGIN
NextPar=False;
/* Argumentzahl abgleichen */
if (ArgCnt==1)
if (GenOrders[z].May1)
BEGIN
ArgCnt=2; strcpy(ArgStr[2],ArgStr[1]);
END
else
BEGIN
WrError(1110); return;
END
if ((ArgCnt==3) AND (OpPart[strlen(OpPart)-1]!='3')) strcat(OpPart,"3");
Is3=(OpPart[strlen(OpPart)-1]=='3');
if ((GenOrders[z].SwapOps) AND (NOT Is3))
BEGIN
strcpy(ArgStr[3],ArgStr[1]);
strcpy(ArgStr[1],ArgStr[2]);
strcpy(ArgStr[2],ArgStr[3]);
END
if ((Is3) AND (ArgCnt==2))
BEGIN
ArgCnt=3; strcpy(ArgStr[3],ArgStr[2]);
END
if ((ArgCnt<2) OR (ArgCnt>3) OR ((Is3) AND (NOT GenOrders[z].May3)))
BEGIN
WrError(1110); return;
END
/* Argumente parsen */
if (Is3)
BEGIN
if (Memo("TSTB3"))
BEGIN
CurrDestMode=ModReg; CurrDestPart=0;
END
else
BEGIN
DecodeAdr(ArgStr[3],MModReg,GenOrders[z].ImmFloat);
if (AdrMode==ModNone) return;
CurrDestMode=AdrMode; CurrDestPart=AdrPart;
END
DecodeAdr(ArgStr[2],MModReg+MModInd,GenOrders[z].ImmFloat);
if (AdrMode==ModNone) return;
if ((AdrMode==ModInd) AND ((AdrPart & 0xe000)==0) AND (Lo(AdrPart)!=1))
BEGIN
WrError(1350); return;
END
CurrSrc2Mode=AdrMode; CurrSrc2Part=AdrPart;
DecodeAdr(ArgStr[1],MModReg+MModInd,GenOrders[z].ImmFloat);
if (AdrMode==ModNone) return;
if ((AdrMode==ModInd) AND ((AdrPart & 0xe000)==0) AND (Lo(AdrPart)!=1))
BEGIN
WrError(1350); return;
END
CurrSrc1Mode=AdrMode; CurrSrc1Part=AdrPart;
END
else /* NOT Is3 */
BEGIN
DecodeAdr(ArgStr[1],MModDir+MModInd+((GenOrders[z].OnlyMem)?0:MModReg+MModImm),GenOrders[z].ImmFloat);
if (AdrMode==ModNone) return;
CurrSrc1Mode=AdrMode; CurrSrc1Part=AdrPart;
DecodeAdr(ArgStr[2],MModReg+MModInd,GenOrders[z].ImmFloat);
switch (AdrMode)
BEGIN
case ModReg:
CurrDestMode=AdrMode; CurrDestPart=AdrPart;
CurrSrc2Mode=CurrSrc1Mode; CurrSrc2Part=CurrSrc1Part;
break;
case ModInd:
if (((strcmp(OpPart,"TSTB")!=0) AND (strcmp(OpPart,"CMPI")!=0) AND (strcmp(OpPart,"CMPF")!=0))
OR ((CurrSrc1Mode==ModDir) OR (CurrSrc1Mode==ModImm))
OR ((CurrSrc1Mode==ModInd) AND ((CurrSrc1Part & 0xe000)==0) AND (Lo(CurrSrc1Part)!=1))
OR (((AdrPart & 0xe000)==0) AND (Lo(AdrPart)!=1)))
BEGIN
WrError(1350); return;
END
else
BEGIN
Is3=True; CurrDestMode=ModReg; CurrDestPart=0;
CurrSrc2Mode=AdrMode; CurrSrc2Part=AdrPart;
END
break;
case ModNone:
return;
END
END
/* auswerten: parallel... */
if (ThisPar)
BEGIN
/* in Standardreihenfolge suchen */
if (PrevOp[strlen(PrevOp)-1]=='3') HReg=GenOrders[z2].Par3Mask;
else HReg=GenOrders[z2].ParMask;
z3=0;
while ((z3<ParOrderCount) AND ((NOT Odd(HReg)) OR (strcmp(ParOrders[z3],OpPart)!=0)))
BEGIN
z3++; HReg>>=1;
END
if (z3<ParOrderCount) JudgePar(GenOrders+z2,z3,&HReg,&HReg2);
/* in gedrehter Reihenfolge suchen */
else
BEGIN
if (OpPart[strlen(OpPart)-1]=='3') HReg=GenOrders[z].Par3Mask;
else HReg=GenOrders[z].ParMask;
z3=0;
while ((z3<ParOrderCount) AND ((NOT Odd(HReg)) OR (strcmp(ParOrders[z3],PrevOp)!=0)))
BEGIN
z3++; HReg>>=1;
END
if (z3<ParOrderCount)
BEGIN
JudgePar(GenOrders+z,z3,&HReg,&HReg2);
SwapMode(&CurrDestMode,&PrevDestMode);
SwapMode(&CurrSrc1Mode,&PrevSrc1Mode);
SwapMode(&CurrSrc2Mode,&PrevSrc2Mode);
SwapPart(&CurrDestPart,&PrevDestPart);
SwapPart(&CurrSrc1Part,&PrevSrc1Part);
SwapPart(&CurrSrc2Part,&PrevSrc2Part);
END
else
BEGIN
WrError(1950); return;
END
END
/* mehrfache Registernutzung ? */
for (z3=0; z3<8; z3++)
if ((ARs & PrevARs & (1l << z3))!=0)
BEGIN
sprintf(Form,"AR%d",z3); WrXError(210,Form);
END
/* 3 Basisfaelle */
switch (HReg)
BEGIN
case 1:
if ((strcmp(PrevOp,"LSH3")==0) OR (strcmp(PrevOp,"ASH3")==0) OR (strcmp(PrevOp,"SUBF3")==0) OR (strcmp(PrevOp,"SUBI3")==0))
BEGIN
SwapMode(&PrevSrc1Mode,&PrevSrc2Mode);
SwapPart(&PrevSrc1Part,&PrevSrc2Part);
END
if ((PrevDestPart>7) OR (CurrDestPart>7))
BEGIN
WrError(1445); return;
END
/* Bei Addition und Multiplikation Kommutativitaet nutzen */
if ((PrevSrc2Mode==ModInd) AND (PrevSrc1Mode==ModReg)
AND ((strncmp(PrevOp,"ADD",3)==0) OR (strncmp(PrevOp,"MPY",3)==0)
OR (strncmp(PrevOp,"AND",3)==0) OR (strncmp(PrevOp,"XOR",3)==0)
OR (strncmp(PrevOp,"OR",2)==0)))
BEGIN
SwapMode(&PrevSrc1Mode,&PrevSrc2Mode);
SwapPart(&PrevSrc1Part,&PrevSrc2Part);
END
if ((PrevSrc2Mode!=ModReg) OR (PrevSrc2Part>7)
OR (PrevSrc1Mode!=ModInd) OR (CurrSrc1Mode!=ModInd))
BEGIN
WrError(1355); return;
END
RetractWords(1);
DAsmCode[0]=0xc0000000+(((LongWord)HReg2) << 25)
+(((LongWord)PrevDestPart) << 22)
+(((LongWord)PrevSrc2Part) << 19)
+(((LongWord)CurrDestPart) << 16)
+(CurrSrc1Part & 0xff00)+Hi(PrevSrc1Part);
CodeLen=1; NextPar=False;
break;
case 2:
if ((PrevDestPart>7) OR (CurrDestPart>7))
BEGIN
WrError(1445); return;
END
if ((PrevSrc1Mode!=ModInd) OR (CurrSrc1Mode!=ModInd))
BEGIN
WrError(1355); return;
END
RetractWords(1);
DAsmCode[0]=0xc0000000+(((LongWord)HReg2) << 25)
+(((LongWord)PrevDestPart) << 22)
+(CurrSrc1Part & 0xff00)+Hi(PrevSrc1Part);
if ((strcmp(PrevOp,OpPart)==0) AND (*OpPart=='L'))
BEGIN
DAsmCode[0]+=((LongWord)CurrDestPart) << 19;
if (PrevDestPart==CurrDestPart) WrError(140);
END
else
DAsmCode[0]+=((LongWord)CurrDestPart) << 16;
CodeLen=1; NextPar=False;
break;
case 3:
if ((PrevDestPart>1) OR (CurrDestPart<2) OR (CurrDestPart>3))
BEGIN
WrError(1445); return;
END
Sum=0;
if (PrevSrc1Mode==ModInd) Sum++;
if (PrevSrc2Mode==ModInd) Sum++;
if (CurrSrc1Mode==ModInd) Sum++;
if (CurrSrc2Mode==ModInd) Sum++;
if (Sum!=2)
BEGIN
WrError(1355); return;
END
RetractWords(1);
DAsmCode[0]=0x80000000+(((LongWord)HReg2) << 26)
+(((LongWord)PrevDestPart & 1) << 23)
+(((LongWord)CurrDestPart & 1) << 22);
CodeLen=1;
if (CurrSrc2Mode==ModReg)
if (CurrSrc1Mode==ModReg)
BEGIN
DAsmCode[0]+=((LongWord)0x00000000)
+(((LongWord)CurrSrc2Part) << 19)
+(((LongWord)CurrSrc1Part) << 16)
+(PrevSrc2Part & 0xff00)+Hi(PrevSrc1Part);
END
else
BEGIN
DAsmCode[0]+=((LongWord)0x03000000)
+(((LongWord)CurrSrc2Part) << 16)
+Hi(CurrSrc1Part);
if (PrevSrc1Mode==ModReg)
DAsmCode[0]+=(((LongWord)PrevSrc1Part) << 19)+(PrevSrc2Part & 0xff00);
else
DAsmCode[0]+=(((LongWord)PrevSrc2Part) << 19)+(PrevSrc1Part & 0xff00);
END
else
if (CurrSrc1Mode==ModReg)
BEGIN
DAsmCode[0]+=((LongWord)0x01000000)
+(((LongWord)CurrSrc1Part) << 16)
+Hi(CurrSrc2Part);
if (PrevSrc1Mode==ModReg)
DAsmCode[0]+=(((LongWord)PrevSrc1Part) << 19)+(PrevSrc2Part & 0xff00);
else
DAsmCode[0]+=(((LongWord)PrevSrc2Part) << 19)+(PrevSrc1Part & 0xff00);
END
else
BEGIN
DAsmCode[0]+=((LongWord)0x02000000)
+(((LongWord)PrevSrc2Part) << 19)
+(((LongWord)PrevSrc1Part) << 16)
+(CurrSrc2Part & 0xff00)+Hi(CurrSrc1Part);
END
break;
END
END
/* ...sequentiell */
else
BEGIN
PrevSrc1Mode=CurrSrc1Mode; PrevSrc1Part=CurrSrc1Part;
PrevSrc2Mode=CurrSrc2Mode; PrevSrc2Part=CurrSrc2Part;
PrevDestMode=CurrDestMode; PrevDestPart=CurrDestPart;
strcpy(PrevOp,OpPart); PrevARs=ARs; z2=z;
if (Is3)
DAsmCode[0]=0x20000000+(((LongWord)GenOrders[z].Code3) << 23)
+(((LongWord)CurrDestPart) << 16)
+(((LongWord)CurrSrc2Mode) << 20)+(EffPart(CurrSrc2Mode,CurrSrc2Part) << 8)
+(((LongWord)CurrSrc1Mode) << 21)+EffPart(CurrSrc1Mode,CurrSrc1Part);
else
DAsmCode[0]=0x00000000+(((LongWord)GenOrders[z].Code) << 23)
+(((LongWord)CurrSrc1Mode) << 21)+CurrSrc1Part
+(((LongWord)CurrDestPart) << 16);
CodeLen=1; NextPar=True;
END
return;
END
for (z=0; z<RotOrderCount; z++)
if (Memo(RotOrders[z]))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else if (NOT DecodeReg(ArgStr[1],&HReg)) WrError(1350);
else
BEGIN
DAsmCode[0]=0x11e00000+(((LongWord)z) << 23)+(((LongWord)HReg) << 16);
CodeLen=1;
END
NextPar=False; return;
END
for (z=0; z<StkOrderCount; z++)
if (Memo(StkOrders[z]))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else if (NOT DecodeReg(ArgStr[1],&HReg)) WrError(1350);
else
BEGIN
DAsmCode[0]=0x0e200000+(((LongWord)z) << 23)+(((LongWord)HReg) << 16);
CodeLen=1;
END
NextPar=False; return;
END
/* Datentransfer */
if ((strncmp(OpPart,"LDI",3)==0) OR (strncmp(OpPart,"LDF",3)==0))
BEGIN
strcpy(HOp,OpPart); strcpy(OpPart,OpPart+3);
for (z=0; z<ConditionCount; z++)
if (Memo(Conditions[z].Name))
BEGIN
if (ArgCnt!=2) WrError(1110);
else if (ThisPar) WrError(1950);
else
BEGIN
DecodeAdr(ArgStr[2],MModReg,False);
if (AdrMode!=ModNone)
BEGIN
HReg=AdrPart;
DecodeAdr(ArgStr[1],MModReg+MModDir+MModInd+MModImm,HOp[2]=='F');
if (AdrMode!=ModNone)
BEGIN
DAsmCode[0]=0x40000000+(((LongWord)HReg) << 16)
+(((LongWord)Conditions[z].Code) << 23)
+(((LongWord)AdrMode) << 21)+AdrPart;
if (HOp[2]=='I') DAsmCode[0]+=0x10000000;
CodeLen=1;
END
END
END
NextPar=False; return;
END
WrXError(1200,HOp); NextPar=False; return;
END
/* Sonderfall NOP auch ohne Argumente */
if ((Memo("NOP")) AND (ArgCnt==0))
BEGIN
CodeLen=1; DAsmCode[0]=NOPCode; return;
END
/* Sonderfaelle */
for (z=0; z<SingOrderCount; z++)
if (Memo(SingOrders[z].Name))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else
BEGIN
DecodeAdr(ArgStr[1],SingOrders[z].Mask,False);
if (AdrMode!=ModNone)
BEGIN
DAsmCode[0]=SingOrders[z].Code+(((LongWord)AdrMode) << 21)+AdrPart;
CodeLen=1;
END
END;
NextPar=False; return;
END
if (Memo("LDP"))
BEGIN
if ((ArgCnt!=1) AND (ArgCnt!=2)) WrError(1110);
else if (ThisPar) WrError(1950);
else if ((ArgCnt==2) AND (strcasecmp(ArgStr[2],"DP")!=0)) WrError(1350);
else
BEGIN
AdrLong=EvalAdrExpression(ArgStr[1],&OK);
if (OK)
BEGIN
DAsmCode[0]=0x08700000+(AdrLong >> 16);
CodeLen=1;
END
END
NextPar=False; return;
END
/* Schleifen */
if (Memo("RPTB"))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else
BEGIN
AdrLong=EvalAdrExpression(ArgStr[1],&OK);
if (OK)
BEGIN
DAsmCode[0]=0x64000000+AdrLong;
CodeLen=1;
END
END
NextPar=False; return;
END
/* Spruenge */
if ((Memo("BR")) OR (Memo("BRD")) OR (Memo("CALL")))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else
BEGIN
AdrLong=EvalAdrExpression(ArgStr[1],&OK);
if (OK)
BEGIN
DAsmCode[0]=0x60000000+AdrLong;
if (Memo("BRD")) DAsmCode[0]+=0x01000000;
else if (Memo("CALL")) DAsmCode[0]+=0x02000000;
CodeLen=1;
END
END
NextPar=False; return;
END
if (*OpPart=='B')
BEGIN
strcpy(HOp,OpPart);
strcpy(OpPart,OpPart+1);
l=strlen(OpPart);
if ((l>=1) AND (OpPart[l-1]=='D'))
BEGIN
OpPart[l-1]='\0'; DFlag=1l << 21;
Disp=3;
END
else
BEGIN
DFlag=0; Disp=1;
END
for (z=0; z<ConditionCount; z++)
if (Memo(Conditions[z].Name))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else if (DecodeReg(ArgStr[1],&HReg))
BEGIN
DAsmCode[0]=0x68000000+(((LongWord)Conditions[z].Code) << 16)+DFlag+HReg;
CodeLen=1;
END
else
BEGIN
AdrLong=EvalAdrExpression(ArgStr[1],&OK)-(EProgCounter()+Disp);
if (OK)
if ((NOT SymbolQuestionable) AND ((AdrLong>0x7fffl) OR (AdrLong<-0x8000l))) WrError(1370);
else
BEGIN
DAsmCode[0]=0x6a000000+(((LongWord)Conditions[z].Code) << 16)+DFlag+(AdrLong & 0xffff);
CodeLen=1;
END
END
NextPar=False; return;
END
WrXError(1200,HOp); NextPar=False; return;
END
if (strncmp(OpPart,"CALL",4)==0)
BEGIN
strcpy(HOp,OpPart); strcpy(OpPart,OpPart+4);
for (z=0; z<ConditionCount; z++)
if (Memo(Conditions[z].Name))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else if (DecodeReg(ArgStr[1],&HReg))
BEGIN
DAsmCode[0]=0x70000000+(((LongWord)Conditions[z].Code) << 16)+HReg;
CodeLen=1;
END
else
BEGIN
AdrLong=EvalAdrExpression(ArgStr[1],&OK)-(EProgCounter()+1);
if (OK)
if ((NOT SymbolQuestionable) AND ((AdrLong>0x7fffl) OR (AdrLong<-0x8000l))) WrError(1370);
else
BEGIN
DAsmCode[0]=0x72000000+(((LongWord)Conditions[z].Code) << 16)+(AdrLong & 0xffff);
CodeLen=1;
END
END
NextPar=False; return;
END
WrXError(1200,HOp); NextPar=False; return;
END
if (strncmp(OpPart,"DB",2)==0)
BEGIN
strcpy(HOp,OpPart);
strcpy(OpPart,OpPart+2);
l=strlen(OpPart);
if ((l>=1) AND (OpPart[l-1]=='D'))
BEGIN
OpPart[l-1]='\0'; DFlag=1l << 21;
Disp=3;
END
else
BEGIN
DFlag=0; Disp=1;
END
for (z=0; z<ConditionCount; z++)
if (Memo(Conditions[z].Name))
BEGIN
if (ArgCnt!=2) WrError(1110);
else if (ThisPar) WrError(1950);
else if (NOT DecodeReg(ArgStr[1],&HReg2)) WrError(1350);
else if ((HReg2<8) OR (HReg2>15)) WrError(1350);
else
BEGIN
HReg2-=8;
if (DecodeReg(ArgStr[2],&HReg))
BEGIN
DAsmCode[0]=0x6c000000
+(((LongWord)Conditions[z].Code) << 16)
+DFlag
+(((LongWord)HReg2) << 22)
+HReg;
CodeLen=1;
END
else
BEGIN
AdrLong=EvalAdrExpression(ArgStr[2],&OK)-(EProgCounter()+Disp);
if (OK)
if ((NOT SymbolQuestionable) AND ((AdrLong>0x7fffl) OR (AdrLong<-0x8000l))) WrError(1370);
else
BEGIN
DAsmCode[0]=0x6e000000
+(((LongWord)Conditions[z].Code) << 16)
+DFlag
+(((LongWord)HReg2) << 22)
+(AdrLong & 0xffff);
CodeLen=1;
END
END
END
NextPar=False; return;
END
WrXError(1200,HOp); NextPar=False; return;
END
if ((strncmp(OpPart,"RETI",4)==0) OR (strncmp(OpPart,"RETS",4)==0))
BEGIN
DFlag=(OpPart[3]=='S')?(1l << 23):(0);
strcpy(HOp,OpPart); strcpy(OpPart,OpPart+4);
for (z=0; z<ConditionCount; z++)
if (Memo(Conditions[z].Name))
BEGIN
if (ArgCnt!=0) WrError(1110);
else if (ThisPar) WrError(1950);
else
BEGIN
DAsmCode[0]=0x78000000+DFlag+(((LongWord)Conditions[z].Code) << 16);
CodeLen=1;
END
NextPar=False; return;
END
WrXError(1200,HOp); NextPar=False; return;
END
if (strncmp(OpPart,"TRAP",4)==0)
BEGIN
strcpy(HOp,OpPart); strcpy(OpPart,OpPart+4);
for (z=0; z<ConditionCount; z++)
if (Memo(Conditions[z].Name))
BEGIN
if (ArgCnt!=1) WrError(1110);
else if (ThisPar) WrError(1950);
else
BEGIN
HReg=EvalIntExpression(ArgStr[1],UInt4,&OK);
if (OK)
BEGIN
DAsmCode[0]=0x74000000+HReg+(((LongWord)Conditions[z].Code) << 16);
CodeLen=1;
END
END
NextPar=False; return;
END
WrXError(1200,HOp); NextPar=False; return;
END
WrXError(1200,OpPart); NextPar=False;
END
static void InitCode_3203x(void)
BEGIN
SaveInitProc();
DPValue=0;
END
static Boolean IsDef_3203X(void)
BEGIN
return (strcmp(LabPart,"||")==0);
END
static void SwitchFrom_3203X(void)
BEGIN
DeinitFields();
END
static void SwitchTo_3203X(void)
BEGIN
TurnWords=False; ConstMode=ConstModeIntel; SetIsOccupied=False;
PCSymbol="$"; HeaderID=0x76; NOPCode=0x0c800000;
DivideChars=","; HasAttrs=False;
ValidSegs=1<<SegCode;
Grans[SegCode]=4; ListGrans[SegCode]=4; SegInits[SegCode]=0;
SegLimits[SegCode] = 0xffffffl;
MakeCode=MakeCode_3203X; IsDef=IsDef_3203X;
SwitchFrom=SwitchFrom_3203X; InitFields(); NextPar=False;
END
void code3203x_init(void)
BEGIN
CPU32030=AddCPU("320C30",SwitchTo_3203X);
CPU32031=AddCPU("320C31",SwitchTo_3203X);
SaveInitProc=InitPassProc; InitPassProc=InitCode_3203x;
END