/* codest6.c */ /*****************************************************************************/ /* AS-Portierung */ /* */ /* Codegenerator ST6-Familie */ /* */ /* Historie: 14.11.1996 Grundsteinlegung */ /* 2. 1.1998 ChkPC ersetzt */ /* */ /*****************************************************************************/ #include "stdinc.h" #include #include "strutil.h" #include "bpemu.h" #include "asmdef.h" #include "asmsub.h" #include "asmpars.h" #include "codepseudo.h" #include "codevars.h" typedef struct { char *Name; Byte Code; } FixedOrder; typedef struct { char *Name; Word Code; } AccOrder; #define FixedOrderCnt 5 #define RelOrderCnt 4 #define ALUOrderCnt 4 #define AccOrderCnt 3 #define ModNone (-1) #define ModAcc 0 #define MModAcc (1 << ModAcc) #define ModDir 1 #define MModDir (1 << ModDir) #define ModInd 2 #define MModInd (1 << ModInd) static Byte AdrMode; static ShortInt AdrType; static Byte AdrVal; static LongInt WinAssume; static SimpProc SaveInitProc; static CPUVar CPUST6210,CPUST6215,CPUST6220,CPUST6225; static FixedOrder *FixedOrders; static FixedOrder *RelOrders; static FixedOrder *ALUOrders; static AccOrder *AccOrders; /*---------------------------------------------------------------------------------*/ static void AddFixed(char *NName, Byte NCode) BEGIN if (InstrZ>=FixedOrderCnt) exit(255); FixedOrders[InstrZ].Name=NName; FixedOrders[InstrZ++].Code=NCode; END static void AddRel(char *NName, Byte NCode) BEGIN if (InstrZ>=RelOrderCnt) exit(255); RelOrders[InstrZ].Name=NName; RelOrders[InstrZ++].Code=NCode; END static void AddALU(char *NName, Byte NCode) BEGIN if (InstrZ>=ALUOrderCnt) exit(255); ALUOrders[InstrZ].Name=NName; ALUOrders[InstrZ++].Code=NCode; END static void AddAcc(char *NName, Word NCode) BEGIN if (InstrZ>=AccOrderCnt) exit(255); AccOrders[InstrZ].Name=NName; AccOrders[InstrZ++].Code=NCode; END static void InitFields(void) BEGIN FixedOrders=(FixedOrder *) malloc(sizeof(FixedOrder)*FixedOrderCnt); InstrZ=0; AddFixed("NOP" , 0x04); AddFixed("RET" , 0xcd); AddFixed("RETI", 0x4d); AddFixed("STOP", 0x6d); AddFixed("WAIT", 0xed); RelOrders=(FixedOrder *) malloc(sizeof(FixedOrder)*RelOrderCnt); InstrZ=0; AddRel("JRZ" , 0x04); AddRel("JRNZ", 0x00); AddRel("JRC" , 0x06); AddRel("JRNC", 0x02); ALUOrders=(FixedOrder *) malloc(sizeof(FixedOrder)*ALUOrderCnt); InstrZ=0; AddALU("ADD" , 0x47); AddALU("AND" , 0xa7); AddALU("CP" , 0x27); AddALU("SUB" , 0xc7); AccOrders=(AccOrder *) malloc(sizeof(AccOrder)*AccOrderCnt); InstrZ=0; AddAcc("COM", 0x002d); AddAcc("RLC", 0x00ad); AddAcc("SLA", 0xff5f); END static void DeinitFields(void) BEGIN free(FixedOrders); free(RelOrders); free(ALUOrders); free(AccOrders); END /*---------------------------------------------------------------------------------*/ static void ResetAdr(void) BEGIN AdrType=ModNone; AdrCnt=0; END static void ChkAdr(Byte Mask) BEGIN if ((AdrType!=ModNone) AND ((Mask AND (1 << AdrType))==0)) BEGIN ResetAdr(); WrError(1350); END END static void DecodeAdr(char *Asc, Byte Mask) BEGIN #define RegCnt 5 static char *RegNames[RegCnt+1]={"A","V","W","X","Y"}; static Byte RegCodes[RegCnt+1]={0xff,0x82,0x83,0x80,0x81}; Boolean OK; int z; Integer AdrInt; ResetAdr(); if ((strcasecmp(Asc,"A")==0) AND ((Mask & MModAcc)!=0)) BEGIN AdrType=ModAcc; ChkAdr(Mask); return; END for (z=0; z> 6)) WrError(110); END else BEGIN if (FirstPassUnknown) AdrInt=Lo(AdrInt); if (AdrInt>0xff) WrError(1320); else BEGIN AdrType=ModDir; AdrVal=AdrInt; ChkAdr(Mask); return; END END ChkAdr(Mask); END static Boolean DecodePseudo(void) BEGIN #define ASSUME62Count 1 static ASSUMERec ASSUME62s[ASSUME62Count]= {{"ROMBASE", &WinAssume, 0, 0x3f, 0x40}}; Boolean OK,Flag; int z; String s; if (Memo("SFR")) BEGIN CodeEquate(SegData,0,0xff); return True; END if ((Memo("ASCII")) OR (Memo("ASCIZ"))) BEGIN if (ArgCnt==0) WrError(1110); else BEGIN z=1; Flag=Memo("ASCIZ"); do BEGIN EvalStringExpression(ArgStr[z],&OK,s); if (OK) BEGIN TranslateString(s); if (CodeLen+strlen(s)+Ord(Flag)>MaxCodeLen) BEGIN WrError(1920); OK=False; END else BEGIN memcpy(BAsmCode+CodeLen,s,strlen(s)); CodeLen+=strlen(s); if (Flag) BAsmCode[CodeLen++]=0; END END z++; END while ((OK) AND (z<=ArgCnt)); if (NOT OK) CodeLen=0; END return True; END if (Memo("BYTE")) BEGIN strmaxcpy(OpPart,"BYT",255); DecodeMotoPseudo(False); return True; END if (Memo("WORD")) BEGIN strmaxcpy(OpPart,"ADR",255); DecodeMotoPseudo(False); return True; END if (Memo("BLOCK")) BEGIN strmaxcpy(OpPart,"DFS",255); DecodeMotoPseudo(False); return True; END if (Memo("ASSUME")) BEGIN CodeASSUME(ASSUME62s,ASSUME62Count); return True; END return False; END static Boolean IsReg(Byte Adr) BEGIN return ((Adr & 0xfc)==0x80); END static Byte MirrBit(Byte inp) BEGIN return (((inp & 1) << 2)+(inp & 2)+((inp & 4) >> 2)); END static void MakeCode_ST62(void) BEGIN Integer AdrInt; int z; Boolean OK; CodeLen=0; DontPrint=False; /* zu ignorierendes */ if (Memo("")) return; /* Pseudoanweisungen */ if (DecodePseudo()) return; /* ohne Argument */ for (z=0; z15))) WrError(1370); else BEGIN CodeLen=1; BAsmCode[0]=RelOrders[z].Code+((AdrInt << 3) & 0xf8); END END return; END if ((Memo("JP")) OR (Memo("CALL"))) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrInt=EvalIntExpression(ArgStr[1],Int16,&OK); if (OK) if ((AdrInt<0) OR (AdrInt>0xfff)) WrError(1925); else BEGIN CodeLen=2; BAsmCode[0]=0x01+(Ord(Memo("JP")) << 3)+((AdrInt & 0x00f) << 4); BAsmCode[1]=AdrInt >> 4; END END return; END /* Arithmetik */ for (z=0; z127) OR (AdrInt<-128))) WrError(1370); else BEGIN CodeLen=3; BAsmCode[2]=Lo(AdrInt); END END END END return; END WrXError(1200,OpPart); END static void InitCode_ST62(void) BEGIN SaveInitProc(); WinAssume=0x40; END static Boolean IsDef_ST62(void) BEGIN return (Memo("SFR")); END static void SwitchFrom_ST62(void) BEGIN DeinitFields(); END static void SwitchTo_ST62(void) BEGIN TurnWords=False; ConstMode=ConstModeIntel; SetIsOccupied=True; PCSymbol="PC"; HeaderID=0x78; NOPCode=0x04; DivideChars=","; HasAttrs=False; ValidSegs=(1<