/* code6805.c */ /*****************************************************************************/ /* AS-Portierung */ /* */ /* Codegenerator 68(HC)05/08 */ /* */ /* Historie: 9.10.1996 Grundsteinlegung */ /* 2. 1.1999 ChkPC-Anpassung */ /* */ /*****************************************************************************/ #include "stdinc.h" #include #include "bpemu.h" #include "strutil.h" #include "asmdef.h" #include "asmpars.h" #include "asmsub.h" #include "codepseudo.h" #include "codevars.h" typedef struct { char *Name; CPUVar MinCPU; Byte Code; } BaseOrder; typedef struct { char *Name; CPUVar MinCPU; Byte Code; Word Mask; ShortInt Size; } ALUOrder; typedef struct { char *Name; CPUVar MinCPU; Byte Code; Word Mask; } RMWOrder; #define FixedOrderCnt 52 #define RelOrderCnt 23 #define ALUOrderCnt 19 #define RMWOrderCnt 12 #define ModNone (-1) #define ModImm 0 #define MModImm (1 << ModImm) #define ModDir 1 #define MModDir (1 << ModDir) #define ModExt 2 #define MModExt (1 << ModExt) #define ModIx2 3 #define MModIx2 (1 << ModIx2) #define ModIx1 4 #define MModIx1 (1 << ModIx1) #define ModIx 5 #define MModIx (1 << ModIx) #define ModSP2 6 #define MModSP2 (1 << ModSP2) #define ModSP1 7 #define MModSP1 (1 << ModSP1) #define ModIxP 8 #define MModIxP (1 << ModIxP) #define MMod05 (MModImm+MModDir+MModExt+MModIx2+MModIx1+MModIx) #define MMod08 (MModSP2+MModSP1+MModIxP) static ShortInt AdrMode,OpSize; static Byte AdrVals[2]; static CPUVar CPU6805,CPU6808; static BaseOrder *FixedOrders; static BaseOrder *RelOrders; static RMWOrder *RMWOrders; static ALUOrder *ALUOrders; /*--------------------------------------------------------------------------*/ static void AddFixed(char *NName, CPUVar NMin, Byte NCode) BEGIN if (InstrZ>=FixedOrderCnt) exit(255); FixedOrders[InstrZ].Name=NName; FixedOrders[InstrZ].MinCPU=NMin; FixedOrders[InstrZ++].Code=NCode; END static void AddRel(char *NName, CPUVar NMin, Byte NCode) BEGIN if (InstrZ>=RelOrderCnt) exit(255); RelOrders[InstrZ].Name=NName; RelOrders[InstrZ].MinCPU=NMin; RelOrders[InstrZ++].Code=NCode; END static void AddALU(char *NName, CPUVar NMin, Byte NCode, Word NMask, ShortInt NSize) BEGIN if (InstrZ>=ALUOrderCnt) exit(255); ALUOrders[InstrZ].Name=NName; ALUOrders[InstrZ].MinCPU=NMin; ALUOrders[InstrZ].Code=NCode; ALUOrders[InstrZ].Mask=NMask; ALUOrders[InstrZ++].Size=NSize; END static void AddRMW(char *NName, CPUVar NMin, Byte NCode ,Word NMask) BEGIN if (InstrZ>=RMWOrderCnt) exit(255); RMWOrders[InstrZ].Name=NName; RMWOrders[InstrZ].MinCPU=NMin; RMWOrders[InstrZ].Code=NCode; RMWOrders[InstrZ++].Mask=NMask; END static void InitFields(void) BEGIN FixedOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*FixedOrderCnt); InstrZ=0; AddFixed("RTI" ,CPU6805,0x80); AddFixed("RTS" ,CPU6805,0x81); AddFixed("SWI" ,CPU6805,0x83); AddFixed("TAX" ,CPU6805,0x97); AddFixed("CLC" ,CPU6805,0x98); AddFixed("SEC" ,CPU6805,0x99); AddFixed("CLI" ,CPU6805,0x9a); AddFixed("SEI" ,CPU6805,0x9b); AddFixed("RSP" ,CPU6805,0x9c); AddFixed("NOP" ,CPU6805,0x9d); AddFixed("TXA" ,CPU6805,0x9f); AddFixed("NEGA",CPU6805,0x40); AddFixed("NEGX",CPU6805,0x50); AddFixed("COMA",CPU6805,0x43); AddFixed("COMX",CPU6805,0x53); AddFixed("LSRA",CPU6805,0x44); AddFixed("LSRX",CPU6805,0x54); AddFixed("RORA",CPU6805,0x46); AddFixed("RORX",CPU6805,0x56); AddFixed("ASRA",CPU6805,0x47); AddFixed("ASRX",CPU6805,0x57); AddFixed("ASLA",CPU6805,0x48); AddFixed("ASLX",CPU6805,0x58); AddFixed("LSLA",CPU6805,0x48); AddFixed("LSLX",CPU6805,0x58); AddFixed("ROLA",CPU6805,0x49); AddFixed("ROLX",CPU6805,0x59); AddFixed("DECA",CPU6805,0x4a); AddFixed("DECX",CPU6805,0x5a); AddFixed("INCA",CPU6805,0x4c); AddFixed("INCX",CPU6805,0x5c); AddFixed("TSTA",CPU6805,0x4d); AddFixed("TSTX",CPU6805,0x5d); AddFixed("CLRA",CPU6805,0x4f); AddFixed("CLRX",CPU6805,0x5f); AddFixed("CLRH",CPU6808,0x8c); AddFixed("DAA" ,CPU6808,0x72); AddFixed("DIV" ,CPU6808,0x52); AddFixed("MUL" ,CPU6805,0x42); AddFixed("NSA" ,CPU6808,0x62); AddFixed("PSHA",CPU6808,0x87); AddFixed("PSHH",CPU6808,0x8b); AddFixed("PSHX",CPU6808,0x89); AddFixed("PULA",CPU6808,0x86); AddFixed("PULH",CPU6808,0x8a); AddFixed("PULX",CPU6808,0x88); AddFixed("STOP",CPU6805,0x8e); AddFixed("TAP" ,CPU6808,0x84); AddFixed("TPA" ,CPU6808,0x85); AddFixed("TSX" ,CPU6808,0x95); AddFixed("TXS" ,CPU6808,0x94); AddFixed("WAIT",CPU6805,0x8f); RelOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*RelOrderCnt); InstrZ=0; AddRel("BRA" ,CPU6805,0x20); AddRel("BRN" ,CPU6805,0x21); AddRel("BHI" ,CPU6805,0x22); AddRel("BLS" ,CPU6805,0x23); AddRel("BCC" ,CPU6805,0x24); AddRel("BCS" ,CPU6805,0x25); AddRel("BNE" ,CPU6805,0x26); AddRel("BEQ" ,CPU6805,0x27); AddRel("BHCC",CPU6805,0x28); AddRel("BHCS",CPU6805,0x29); AddRel("BPL" ,CPU6805,0x2a); AddRel("BMI" ,CPU6805,0x2b); AddRel("BMC" ,CPU6805,0x2c); AddRel("BMS" ,CPU6805,0x2d); AddRel("BIL" ,CPU6805,0x2e); AddRel("BIH" ,CPU6805,0x2f); AddRel("BSR" ,CPU6805,0xad); AddRel("BGE" ,CPU6808,0x90); AddRel("BGT" ,CPU6808,0x92); AddRel("BHS" ,CPU6805,0x24); AddRel("BLE" ,CPU6808,0x93); AddRel("BLO" ,CPU6805,0x25); AddRel("BLT" ,CPU6808,0x91); ALUOrders=(ALUOrder *) malloc(sizeof(ALUOrder)*ALUOrderCnt); InstrZ=0; AddALU("SUB" ,CPU6805,0x00,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("CMP" ,CPU6805,0x01,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("SBC" ,CPU6805,0x02,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("CPX" ,CPU6805,0x03,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("AND" ,CPU6805,0x04,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("BIT" ,CPU6805,0x05,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("LDA" ,CPU6805,0x06,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("STA" ,CPU6805,0x07, MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("EOR" ,CPU6805,0x08,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("ADC" ,CPU6805,0x09,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("ORA" ,CPU6805,0x0a,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("ADD" ,CPU6805,0x0b,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("JMP" ,CPU6805,0x0c, MModDir+MModExt+MModIx+MModIx1+MModIx2 ,-1); AddALU("JSR" ,CPU6805,0x0d, MModDir+MModExt+MModIx+MModIx1+MModIx2 ,-1); AddALU("LDX" ,CPU6805,0x0e,MModImm+MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("STX" ,CPU6805,0x0f, MModDir+MModExt+MModIx+MModIx1+MModIx2+MModSP1+MModSP2,0); AddALU("CPHX",CPU6808,0xc5,MModImm+MModDir ,1); AddALU("LDHX",CPU6808,0xa5,MModImm+MModDir ,1); AddALU("STHX",CPU6808,0x85, MModDir ,1); RMWOrders=(RMWOrder *) malloc(sizeof(RMWOrder)*RMWOrderCnt); InstrZ=0; AddRMW("NEG",CPU6805,0x00,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("COM",CPU6805,0x03,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("LSR",CPU6805,0x04,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("ROR",CPU6805,0x06,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("ASR",CPU6805,0x07,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("ASL",CPU6805,0x08,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("LSL",CPU6805,0x08,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("ROL",CPU6805,0x09,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("DEC",CPU6805,0x0a,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("INC",CPU6805,0x0c,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("TST",CPU6805,0x0d,MModDir+ MModIx+MModIx1+ MModSP1 ); AddRMW("CLR",CPU6805,0x0f,MModDir+ MModIx+MModIx1+ MModSP1 ); END static void DeinitFields(void) BEGIN free(FixedOrders); free(RelOrders); free(ALUOrders); free(RMWOrders); END /*--------------------------------------------------------------------------*/ static void ChkZero(char *s, char *serg, Byte *Erg) BEGIN if (*s=='<') BEGIN strcpy(serg,s+1); *Erg=2; END else if (*s=='>') BEGIN strcpy(serg,s+1); *Erg=1; END else BEGIN strcpy(serg,s); *Erg=0; END END static void ChkAdr(Word Mask, Word Mask08) BEGIN if ((AdrMode!=ModNone) AND ((Mask & (1 << AdrMode))==0)) BEGIN WrError( (((1 << AdrMode) AND Mask08)==0) ? 1350 : 1505); AdrMode=ModNone; AdrCnt=0; END END static void DecodeAdr(Byte Start, Byte Stop, Word Mask) BEGIN Boolean OK; Word AdrWord,Mask08; Byte ZeroMode; String s; ShortInt tmode1,tmode2; AdrMode=ModNone; AdrCnt=0; Mask08=Mask & MMod08; if (MomCPU==CPU6805) Mask&=MMod05; if (Stop-Start==1) BEGIN if (strcasecmp(ArgStr[Stop],"X")==0) BEGIN tmode1=ModIx1; tmode2=ModIx2; END else if (strcasecmp(ArgStr[Stop],"SP")==0) BEGIN tmode1=ModSP1; tmode2=ModSP2; if (MomCPU127))) WrError(1370); else BEGIN CodeLen=2; BAsmCode[0]=RelOrders[z].Code; BAsmCode[1]=Lo(AdrInt); END END return; END if ((Memo("CBEQA")) OR (Memo("CBEQX"))) BEGIN if (ArgCnt!=2) WrError(1110); else if (MomCPU127))) WrError(1370); else BEGIN BAsmCode[0]=0x41+(Ord(Memo("CBEQX")) << 4); BAsmCode[2]=AdrInt & 0xff; CodeLen=3; END END END return; END if (Memo("CBEQ")) BEGIN if (MomCPU127))) WrError(1370); else BEGIN BAsmCode[z-1]=AdrInt & 0xff; CodeLen=z; END END END else if (ArgCnt==3) BEGIN OK=True; if (strcasecmp(ArgStr[2],"X+")==0) z=3; else if (strcasecmp(ArgStr[2],"SP")==0) BEGIN BAsmCode[0]=0x9e; z=4; END else BEGIN WrXError(1445,ArgStr[2]); OK=False; END if (OK) BEGIN BAsmCode[z-3]=0x61; BAsmCode[z-2]=EvalIntExpression(ArgStr[1],UInt8,&OK); if (OK) BEGIN AdrInt=EvalIntExpression(ArgStr[3],UInt16,&OK)-(EProgCounter()+z); if (OK) if ((NOT SymbolQuestionable) AND ((AdrInt<-128) OR (AdrInt>127))) WrError(1370); else BEGIN BAsmCode[z-1]=AdrInt & 0xff; CodeLen=z; END END END END else WrError(1110); return; END if ((Memo("DBNZA")) OR (Memo("DBNZX"))) BEGIN if (ArgCnt!=1) WrError(1110); else if (MomCPU127))) WrError(1370); else BEGIN BAsmCode[0]=0x4b+(Ord(Memo("DBNZX")) << 4); BAsmCode[1]=AdrInt & 0xff; CodeLen=2; END END return; END if (Memo("DBNZ")) BEGIN if ((ArgCnt<2) OR (ArgCnt>3)) WrError(1110); else if (MomCPU127))) WrError(1370); else BEGIN BAsmCode[z-1]=AdrInt & 0xff; CodeLen=z; END END END return; END /* ALU-Operationen */ for (z=0; z='0') AND (ch<='7')) BEGIN for (z=ArgCnt; z>=1; z--) strcpy(ArgStr[z+1],ArgStr[z]); *ArgStr[1]=ch; ArgStr[1][1]='\0'; ArgCnt++; OpPart[strlen(OpPart)-1]='\0'; END if ((Memo("BSET")) OR (Memo("BCLR"))) BEGIN if (ArgCnt!=2) WrError(1110); else BEGIN BAsmCode[1]=EvalIntExpression(ArgStr[2],Int8,&OK); if (OK) BEGIN BAsmCode[0]=EvalIntExpression(ArgStr[1],UInt3,&OK); if (OK) BEGIN CodeLen=2; BAsmCode[0]=0x10+(BAsmCode[0] << 1)+Ord(Memo("BCLR")); END END END return; END if ((Memo("BRSET")) OR (Memo("BRCLR"))) BEGIN if (ArgCnt!=3) WrError(1110); else BEGIN BAsmCode[1]=EvalIntExpression(ArgStr[2],Int8,&OK); if (OK) BEGIN BAsmCode[0]=EvalIntExpression(ArgStr[1],UInt3,&OK); if (OK) BEGIN AdrInt=EvalIntExpression(ArgStr[3],UInt16,&OK)-(EProgCounter()+3); if (OK) if ((NOT SymbolQuestionable) AND ((AdrInt<-128) OR (AdrInt>127))) WrError(1370); else BEGIN CodeLen=3; BAsmCode[0]=(BAsmCode[0] << 1)+Ord(Memo("BRCLR")); BAsmCode[2]=Lo(AdrInt); END END END END return; END WrXError(1200,OpPart); END static Boolean IsDef_6805(void) BEGIN return False; END static void SwitchFrom_6805(void) BEGIN DeinitFields(); END static void SwitchTo_6805(void) BEGIN TurnWords=False; ConstMode=ConstModeMoto; SetIsOccupied=False; PCSymbol="*"; HeaderID=0x62; NOPCode=0x9d; DivideChars=","; HasAttrs=False; ValidSegs=(1<