/* code6804.c */ /*****************************************************************************/ /* AS-Portierung */ /* */ /* AS-Codeenerator Motorola/ST 6804 */ /* */ /* Historie: 17.10.1996 Grundsteinlegung */ /* 2. 1.1999 ChkPC-Anpassung */ /* */ /*****************************************************************************/ #include "stdinc.h" #include #include "bpemu.h" #include "strutil.h" #include "asmdef.h" #include "asmsub.h" #include "asmpars.h" #include "codepseudo.h" #include "codevars.h" typedef struct { char *Name; LongInt Code; } BaseOrder; #define FixedOrderCnt 19 #define RelOrderCnt 6 #define ALUOrderCnt 4 #define ModNone (-1) #define ModInd 0 #define MModInd (1 << ModInd) #define ModDir 1 #define MModDir (1 << ModDir) #define ModImm 2 #define MModImm (1 << ModImm) static ShortInt AdrMode; static Byte AdrVal; static CPUVar CPU6804; static BaseOrder *FixedOrders; static BaseOrder *RelOrders; static BaseOrder *ALUOrders; /*--------------------------------------------------------------------------*/ static void AddFixed(char *NName, LongInt NCode) BEGIN if (InstrZ>=FixedOrderCnt) exit(255); FixedOrders[InstrZ].Name=NName; FixedOrders[InstrZ++].Code=NCode; END static void AddRel(char *NName, LongInt NCode) BEGIN if (InstrZ>=RelOrderCnt) exit(255); RelOrders[InstrZ].Name=NName; RelOrders[InstrZ++].Code=NCode; END static void AddALU(char *NName, LongInt NCode) BEGIN if (InstrZ>=ALUOrderCnt) exit(255); ALUOrders[InstrZ].Name=NName; ALUOrders[InstrZ++].Code=NCode; END static void InitFields(void) BEGIN FixedOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*FixedOrderCnt); InstrZ=0; AddFixed("CLRA", 0x00fbff); AddFixed("CLRX", 0xb08000); AddFixed("CLRY", 0xb08100); AddFixed("COMA", 0x0000b4); AddFixed("ROLA", 0x0000b5); AddFixed("ASLA", 0x00faff); AddFixed("INCA", 0x00feff); AddFixed("INCX", 0x0000a8); AddFixed("INCY", 0x0000a9); AddFixed("DECA", 0x00ffff); AddFixed("DECX", 0x0000b8); AddFixed("DECY", 0x0000b9); AddFixed("TAX" , 0x0000bc); AddFixed("TAY" , 0x0000bd); AddFixed("TXA" , 0x0000ac); AddFixed("TYA" , 0x0000ad); AddFixed("RTS" , 0x0000b3); AddFixed("RTI" , 0x0000b2); AddFixed("NOP" , 0x000020); RelOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*RelOrderCnt); InstrZ=0; AddRel("BCC", 0x40); AddRel("BHS", 0x40); AddRel("BCS", 0x60); AddRel("BLO", 0x60); AddRel("BNE", 0x00); AddRel("BEQ", 0x20); ALUOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*ALUOrderCnt); InstrZ=0; AddALU("ADD", 0x02); AddALU("SUB", 0x03); AddALU("CMP", 0x04); AddALU("AND", 0x05); END static void DeinitFields(void) BEGIN free(FixedOrders); free(RelOrders); free(ALUOrders); END /*--------------------------------------------------------------------------*/ static void ChkAdr(Boolean MayImm) BEGIN if ((AdrMode==ModImm) AND (NOT MayImm)) BEGIN WrError(1350); AdrMode=ModNone; END END static void DecodeAdr(char *Asc, Boolean MayImm) BEGIN Boolean OK; AdrMode=ModNone; if (strcasecmp(Asc,"(X)")==0) BEGIN AdrMode=ModInd; AdrVal=0x00; ChkAdr(MayImm); return; END if (strcasecmp(Asc,"(Y)")==0) BEGIN AdrMode=ModInd; AdrVal=0x10; ChkAdr(MayImm); return; END if (*Asc=='#') BEGIN AdrVal=EvalIntExpression(Asc+1,Int8,&OK); if (OK) AdrMode=ModImm; ChkAdr(MayImm); return; END AdrVal=EvalIntExpression(Asc,Int8,&OK); if (OK) BEGIN AdrMode=ModDir; ChkAdr(MayImm); return; END ChkAdr(MayImm); END /*--------------------------------------------------------------------------*/ static Boolean DecodePseudo(void) BEGIN if (Memo("SFR")) BEGIN CodeEquate(SegData,0,0xff); return True; END return False; END static Boolean IsShort(Byte Adr) BEGIN return ((Adr & 0xfc)==0x80); END static void MakeCode_6804(void) BEGIN int z; Integer AdrInt; Boolean OK; CodeLen=0; DontPrint=False; /* zu ignorierendes */ if (Memo("")) return; /* Pseudoanweisungen */ if (DecodePseudo()) return; if (DecodeMotoPseudo(True)) return; /* Anweisungen ohne Argument */ for (z=0; z> 16)!=0) CodeLen=3; else CodeLen=1+Ord(Hi(FixedOrders[z].Code)!=0); if (CodeLen==3) BAsmCode[0]=FixedOrders[z].Code >> 16; if (CodeLen>=2) BAsmCode[CodeLen-2]=Hi(FixedOrders[z].Code); BAsmCode[CodeLen-1]=Lo(FixedOrders[z].Code); END return; END /* relative/absolute Spruenge */ for (z=0; z15))) WrError(1370); else BEGIN CodeLen=1; BAsmCode[0]=RelOrders[z].Code+(AdrInt & 0x1f); ChkSpace(SegCode); END END return; END if ((Memo("JSR")) OR (Memo("JMP"))) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrInt=EvalIntExpression(ArgStr[1],UInt12,&OK); if (OK) BEGIN CodeLen=2; BAsmCode[1]=Lo(AdrInt); BAsmCode[0]=0x80+(Ord(Memo("JMP")) << 4)+(Hi(AdrInt) & 15); ChkSpace(SegCode); END END return; END /* AKKU-Operationen */ for (z=0; z127))) WrError(1370); else BEGIN ChkSpace(SegCode); BAsmCode[2]=AdrInt & 0xff; CodeLen=3; END END END END return; END WrXError(1200,OpPart); END static Boolean IsDef_6804(void) BEGIN return (Memo("SFR")); END static void SwitchFrom_6804(void) BEGIN DeinitFields(); END static void SwitchTo_6804(void) BEGIN TurnWords=False; ConstMode=ConstModeMoto; SetIsOccupied=False; PCSymbol="PC"; HeaderID=0x64; NOPCode=0x20; DivideChars=","; HasAttrs=False; ValidSegs=(1<