diff options
Diffstat (limited to 'code6809.c')
-rw-r--r-- | code6809.c | 1318 |
1 files changed, 1318 insertions, 0 deletions
diff --git a/code6809.c b/code6809.c new file mode 100644 index 0000000..36b3311 --- /dev/null +++ b/code6809.c @@ -0,0 +1,1318 @@ +/* code6809.c */ +/*****************************************************************************/ +/* AS-Portierung */ +/* */ +/* Codegenerator 6809/6309 */ +/* */ +/* Historie: 10.10.1996 Grundsteinlegung */ +/* 2. 1.1999 ChkPC-Anpassung */ +/* */ +/*****************************************************************************/ + +#include "stdinc.h" +#include <ctype.h> +#include <string.h> + +#include "nls.h" +#include "strutil.h" +#include "bpemu.h" + +#include "asmdef.h" +#include "asmpars.h" +#include "asmsub.h" +#include "codepseudo.h" +#include "codevars.h" + +typedef struct + { + char *Name; + Word Code; + CPUVar MinCPU; + } BaseOrder; + +typedef struct + { + char *Name; + Word Code; + Boolean Inv; + CPUVar MinCPU; + } FlagOrder; + +typedef struct + { + char *Name; + Word Code8; + Word Code16; + CPUVar MinCPU; + } RelOrder; + +typedef struct + { + char *Name; + Word Code; + Byte Op16; + Boolean MayImm; + CPUVar MinCPU; + } ALUOrder; + +#define ModNone (-1) +#define ModImm 1 +#define ModDir 2 +#define ModInd 3 +#define ModExt 4 + +#define FixedOrderCnt 73 +#define RelOrderCnt 19 +#define ALUOrderCnt 65 +#define ALU2OrderCnt 8 +#define RMWOrderCnt 13 +#define FlagOrderCnt 3 +#define LEAOrderCnt 4 +#define ImmOrderCnt 4 +#define StackOrderCnt 4 +#define BitOrderCnt 8 + +#define StackRegCnt 11 +static char StackRegNames[StackRegCnt][4]= + {"CCR","A","B","DPR","X","Y","S/U","PC","CC","DP","S"}; +static Byte StackRegCodes[StackRegCnt]= + { 0, 1, 2, 3, 4, 5, 6, 7, 0, 3, 6}; + +static char *FlagChars="CVZNIHFE"; + +static ShortInt AdrMode; +static Byte AdrVals[5]; +static Byte OpSize; +static Boolean ExtFlag; +static LongInt DPRValue; + +static BaseOrder *FixedOrders; +static RelOrder *RelOrders; +static ALUOrder *ALUOrders; +static char **ALU2Orders; +static BaseOrder *RMWOrders; +static FlagOrder *FlagOrders; +static BaseOrder *LEAOrders; +static BaseOrder *ImmOrders; +static BaseOrder *StackOrders; +static char **BitOrders; + +static SimpProc SaveInitProc; + +static CPUVar CPU6809,CPU6309; + +/*-------------------------------------------------------------------------*/ +/* Erzeugung/Aufloesung Codetabellen*/ + + static void AddFixed(char *NName, Word NCode, CPUVar NCPU) +BEGIN + if (InstrZ>=FixedOrderCnt) exit(255); + FixedOrders[InstrZ].Name=NName; + FixedOrders[InstrZ].Code=NCode; + FixedOrders[InstrZ++].MinCPU=NCPU; +END + + static void AddRel(char *NName, Word NCode8, Word NCode16) +BEGIN + if (InstrZ>=RelOrderCnt) exit(255); + RelOrders[InstrZ].Name=NName; + RelOrders[InstrZ].Code8=NCode8; + RelOrders[InstrZ++].Code16=NCode16; +END + + static void AddALU(char *NName, Word NCode, Byte NSize, Boolean NImm, CPUVar NCPU) +BEGIN + if (InstrZ>=ALUOrderCnt) exit(255); + ALUOrders[InstrZ].Name=NName; + ALUOrders[InstrZ].Code=NCode; + ALUOrders[InstrZ].Op16=NSize; + ALUOrders[InstrZ].MayImm=NImm; + ALUOrders[InstrZ++].MinCPU=NCPU; +END + + static void AddRMW(char *NName, Word NCode, CPUVar NCPU) +BEGIN + if (InstrZ>=RMWOrderCnt) exit(255); + RMWOrders[InstrZ].Name=NName; + RMWOrders[InstrZ].Code=NCode; + RMWOrders[InstrZ++].MinCPU=NCPU; +END + + static void AddFlag(char *NName, Word NCode, Boolean NInv, CPUVar NCPU) +BEGIN + if (InstrZ>=FlagOrderCnt) exit(255); + FlagOrders[InstrZ].Name=NName; + FlagOrders[InstrZ].Code=NCode; + FlagOrders[InstrZ].Inv=NInv; + FlagOrders[InstrZ++].MinCPU=NCPU; +END + + static void AddLEA(char *NName, Word NCode, CPUVar NCPU) +BEGIN + if (InstrZ>=LEAOrderCnt) exit(255); + LEAOrders[InstrZ].Name=NName; + LEAOrders[InstrZ].Code=NCode; + LEAOrders[InstrZ++].MinCPU=NCPU; +END + + static void AddImm(char *NName, Word NCode, CPUVar NCPU) +BEGIN + if (InstrZ>=ImmOrderCnt) exit(255); + ImmOrders[InstrZ].Name=NName; + ImmOrders[InstrZ].Code=NCode; + ImmOrders[InstrZ++].MinCPU=NCPU; +END + + static void AddStack(char *NName, Word NCode, CPUVar NCPU) +BEGIN + if (InstrZ>=StackOrderCnt) exit(255); + StackOrders[InstrZ].Name=NName; + StackOrders[InstrZ].Code=NCode; + StackOrders[InstrZ++].MinCPU=NCPU; +END + + static void InitFields(void) +BEGIN + FixedOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*FixedOrderCnt); InstrZ=0; + AddFixed("NOP" ,0x0012,CPU6809); AddFixed("SYNC" ,0x0013,CPU6809); + AddFixed("DAA" ,0x0019,CPU6809); AddFixed("SEX" ,0x001d,CPU6809); + AddFixed("RTS" ,0x0039,CPU6809); AddFixed("ABX" ,0x003a,CPU6809); + AddFixed("RTI" ,0x003b,CPU6809); AddFixed("MUL" ,0x003d,CPU6809); + AddFixed("SWI2" ,0x103f,CPU6809); AddFixed("SWI3" ,0x113f,CPU6809); + AddFixed("NEGA" ,0x0040,CPU6809); AddFixed("COMA" ,0x0043,CPU6809); + AddFixed("LSRA" ,0x0044,CPU6809); AddFixed("RORA" ,0x0046,CPU6809); + AddFixed("ASRA" ,0x0047,CPU6809); AddFixed("ASLA" ,0x0048,CPU6809); + AddFixed("LSLA" ,0x0048,CPU6809); AddFixed("ROLA" ,0x0049,CPU6809); + AddFixed("DECA" ,0x004a,CPU6809); AddFixed("INCA" ,0x004c,CPU6809); + AddFixed("TSTA" ,0x004d,CPU6809); AddFixed("CLRA" ,0x004f,CPU6809); + AddFixed("NEGB" ,0x0050,CPU6809); AddFixed("COMB" ,0x0053,CPU6809); + AddFixed("LSRB" ,0x0054,CPU6809); AddFixed("RORB" ,0x0056,CPU6809); + AddFixed("ASRB" ,0x0057,CPU6809); AddFixed("ASLB" ,0x0058,CPU6809); + AddFixed("LSLB" ,0x0058,CPU6809); AddFixed("ROLB" ,0x0059,CPU6809); + AddFixed("DECB" ,0x005a,CPU6809); AddFixed("INCB" ,0x005c,CPU6809); + AddFixed("TSTB" ,0x005d,CPU6809); AddFixed("CLRB" ,0x005f,CPU6809); + AddFixed("PSHSW",0x1038,CPU6309); AddFixed("PULSW",0x1039,CPU6309); + AddFixed("PSHUW",0x103a,CPU6309); AddFixed("PULUW",0x103b,CPU6309); + AddFixed("SEXW" ,0x0014,CPU6309); AddFixed("NEGD" ,0x1040,CPU6309); + AddFixed("COMD" ,0x1043,CPU6309); AddFixed("LSRD" ,0x1044,CPU6309); + AddFixed("RORD" ,0x1046,CPU6309); AddFixed("ASRD" ,0x1047,CPU6309); + AddFixed("ASLD" ,0x1048,CPU6309); AddFixed("LSLD" ,0x1048,CPU6309); + AddFixed("ROLD" ,0x1049,CPU6309); AddFixed("DECD" ,0x104a,CPU6309); + AddFixed("INCD" ,0x104c,CPU6309); AddFixed("TSTD" ,0x104d,CPU6309); + AddFixed("CLRD" ,0x104f,CPU6309); AddFixed("COMW" ,0x1053,CPU6309); + AddFixed("LSRW" ,0x1054,CPU6309); AddFixed("RORW" ,0x1056,CPU6309); + AddFixed("ROLW" ,0x1059,CPU6309); AddFixed("DECW" ,0x105a,CPU6309); + AddFixed("INCW" ,0x105c,CPU6309); AddFixed("TSTW" ,0x105d,CPU6309); + AddFixed("CLRW" ,0x105f,CPU6309); AddFixed("COME" ,0x1143,CPU6309); + AddFixed("DECE" ,0x114a,CPU6309); AddFixed("INCE" ,0x114c,CPU6309); + AddFixed("TSTE" ,0x114d,CPU6309); AddFixed("CLRE" ,0x114f,CPU6309); + AddFixed("COMF" ,0x1153,CPU6309); AddFixed("DECF" ,0x115a,CPU6309); + AddFixed("INCF" ,0x115c,CPU6309); AddFixed("TSTF" ,0x115d,CPU6309); + AddFixed("CLRF" ,0x115f,CPU6309); AddFixed("CLRS" ,0x1fd4,CPU6309); + AddFixed("CLRV" ,0x1fd7,CPU6309); AddFixed("CLRX" ,0x1fd1,CPU6309); + AddFixed("CLRY" ,0x1fd2,CPU6309); + + RelOrders=(RelOrder *) malloc(sizeof(RelOrder)*RelOrderCnt); InstrZ=0; + AddRel("BRA",0x0020,0x0016); AddRel("BRN",0x0021,0x1021); + AddRel("BHI",0x0022,0x1022); AddRel("BLS",0x0023,0x1023); + AddRel("BHS",0x0024,0x1024); AddRel("BCC",0x0024,0x1024); + AddRel("BLO",0x0025,0x1025); AddRel("BCS",0x0025,0x1025); + AddRel("BNE",0x0026,0x1026); AddRel("BEQ",0x0027,0x1027); + AddRel("BVC",0x0028,0x1028); AddRel("BVS",0x0029,0x1029); + AddRel("BPL",0x002a,0x102a); AddRel("BMI",0x002b,0x102b); + AddRel("BGE",0x002c,0x102c); AddRel("BLT",0x002d,0x102d); + AddRel("BGT",0x002e,0x102e); AddRel("BLE",0x002f,0x102f); + AddRel("BSR",0x008d,0x0017); + + ALUOrders=(ALUOrder *) malloc(sizeof(ALUOrder)*ALUOrderCnt); InstrZ=0; + AddALU("LDA" ,0x0086,0,True ,CPU6809); + AddALU("STA" ,0x0087,0,False,CPU6809); + AddALU("CMPA",0x0081,0,True ,CPU6809); + AddALU("ADDA",0x008b,0,True ,CPU6809); + AddALU("ADCA",0x0089,0,True ,CPU6809); + AddALU("SUBA",0x0080,0,True ,CPU6809); + AddALU("SBCA",0x0082,0,True ,CPU6809); + AddALU("ANDA",0x0084,0,True ,CPU6809); + AddALU("ORA" ,0x008a,0,True ,CPU6809); + AddALU("EORA",0x0088,0,True ,CPU6809); + AddALU("BITA",0x0085,0,True ,CPU6809); + + AddALU("LDB" ,0x00c6,0,True ,CPU6809); + AddALU("STB" ,0x00c7,0,False,CPU6809); + AddALU("CMPB",0x00c1,0,True ,CPU6809); + AddALU("ADDB",0x00cb,0,True ,CPU6809); + AddALU("ADCB",0x00c9,0,True ,CPU6809); + AddALU("SUBB",0x00c0,0,True ,CPU6809); + AddALU("SBCB",0x00c2,0,True ,CPU6809); + AddALU("ANDB",0x00c4,0,True ,CPU6809); + AddALU("ORB" ,0x00ca,0,True ,CPU6809); + AddALU("EORB",0x00c8,0,True ,CPU6809); + AddALU("BITB",0x00c5,0,True ,CPU6809); + + AddALU("LDD" ,0x00cc,1,True ,CPU6809); + AddALU("STD" ,0x00cd,1,False,CPU6809); + AddALU("CMPD",0x1083,1,True ,CPU6809); + AddALU("ADDD",0x00c3,1,True ,CPU6809); + AddALU("ADCD",0x1089,1,True ,CPU6309); + AddALU("SUBD",0x0083,1,True ,CPU6809); + AddALU("SBCD",0x1082,1,True ,CPU6309); + AddALU("MULD",0x118f,1,True ,CPU6309); + AddALU("DIVD",0x118d,1,True ,CPU6309); + AddALU("ANDD",0x1084,1,True ,CPU6309); + AddALU("ORD" ,0x108a,1,True ,CPU6309); + AddALU("EORD",0x1088,1,True ,CPU6309); + AddALU("BITD",0x1085,1,True ,CPU6309); + + AddALU("LDW" ,0x1086,1,True ,CPU6309); + AddALU("STW" ,0x1087,1,False,CPU6309); + AddALU("CMPW",0x1081,1,True ,CPU6309); + AddALU("ADDW",0x108b,1,True ,CPU6309); + AddALU("SUBW",0x1080,1,True ,CPU6309); + + AddALU("STQ" ,0x10cd,1,True ,CPU6309); + AddALU("DIVQ",0x118e,1,True ,CPU6309); + + AddALU("LDE" ,0x1186,0,True ,CPU6309); + AddALU("STE" ,0x1187,0,False,CPU6309); + AddALU("CMPE",0x1181,0,True ,CPU6309); + AddALU("ADDE",0x118b,0,True ,CPU6309); + AddALU("SUBE",0x1180,0,True ,CPU6309); + + AddALU("LDF" ,0x11c6,0,True ,CPU6309); + AddALU("STF" ,0x11c7,0,False,CPU6309); + AddALU("CMPF",0x11c1,0,True ,CPU6309); + AddALU("ADDF",0x11cb,0,True ,CPU6309); + AddALU("SUBF",0x11c0,0,True ,CPU6309); + + AddALU("LDX" ,0x008e,1,True ,CPU6809); + AddALU("STX" ,0x008f,1,False,CPU6809); + AddALU("CMPX",0x008c,1,True ,CPU6809); + + AddALU("LDY" ,0x108e,1,True ,CPU6809); + AddALU("STY" ,0x108f,1,False,CPU6809); + AddALU("CMPY",0x108c,1,True ,CPU6809); + + AddALU("LDU" ,0x00ce,1,True ,CPU6809); + AddALU("STU" ,0x00cf,1,False,CPU6809); + AddALU("CMPU",0x1183,1,True ,CPU6809); + + AddALU("LDS" ,0x10ce,1,True ,CPU6809); + AddALU("STS" ,0x10cf,1,False,CPU6809); + AddALU("CMPS",0x118c,1,True ,CPU6809); + + AddALU("JSR" ,0x008d,1,False,CPU6809); + + ALU2Orders=(char **) malloc(sizeof(char *)*ALU2OrderCnt); + ALU2Orders[0]="ADD"; ALU2Orders[1]="ADC"; + ALU2Orders[2]="SUB"; ALU2Orders[3]="SBC"; + ALU2Orders[4]="AND"; ALU2Orders[5]="OR" ; + ALU2Orders[6]="EOR"; ALU2Orders[7]="CMP"; + + RMWOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*RMWOrderCnt); InstrZ=0; + AddRMW("NEG",0x00,CPU6809); + AddRMW("COM",0x03,CPU6809); + AddRMW("LSR",0x04,CPU6809); + AddRMW("ROR",0x06,CPU6809); + AddRMW("ASR",0x07,CPU6809); + AddRMW("ASL",0x08,CPU6809); + AddRMW("LSL",0x08,CPU6809); + AddRMW("ROL",0x09,CPU6809); + AddRMW("DEC",0x0a,CPU6809); + AddRMW("INC",0x0c,CPU6809); + AddRMW("TST",0x0d,CPU6809); + AddRMW("JMP",0x0e,CPU6809); + AddRMW("CLR",0x0f,CPU6809); + + FlagOrders=(FlagOrder *) malloc(sizeof(FlagOrder)*FlagOrderCnt); InstrZ=0; + AddFlag("CWAI" ,0x3c,True ,CPU6809); + AddFlag("ANDCC",0x1c,True ,CPU6809); + AddFlag("ORCC" ,0x1a,False,CPU6809); + + LEAOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*LEAOrderCnt); InstrZ=0; + AddLEA("LEAX",0x30,CPU6809); + AddLEA("LEAY",0x31,CPU6809); + AddLEA("LEAS",0x32,CPU6809); + AddLEA("LEAU",0x33,CPU6809); + + ImmOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*ImmOrderCnt); InstrZ=0; + AddImm("AIM",0x02,CPU6309); + AddImm("OIM",0x01,CPU6309); + AddImm("EIM",0x05,CPU6309); + AddImm("TIM",0x0b,CPU6309); + + StackOrders=(BaseOrder *) malloc(sizeof(BaseOrder)*StackOrderCnt); InstrZ=0; + AddStack("PSHS",0x34,CPU6809); + AddStack("PULS",0x35,CPU6809); + AddStack("PSHU",0x36,CPU6809); + AddStack("PULU",0x37,CPU6809); + + BitOrders=(char **) malloc(sizeof(char *)*BitOrderCnt); + BitOrders[0]="BAND"; BitOrders[1]="BIAND"; + BitOrders[2]="BOR"; BitOrders[3]="BIOR" ; + BitOrders[4]="BEOR"; BitOrders[5]="BIEOR"; + BitOrders[6]="LDBT"; BitOrders[7]="STBT" ; +END + + static void DeinitFields(void) +BEGIN + free(FixedOrders); + free(RelOrders); + free(ALUOrders); + free(ALU2Orders); + free(RMWOrders); + free(FlagOrders); + free(LEAOrders); + free(ImmOrders); + free(StackOrders); + free(BitOrders); +END + +/*-------------------------------------------------------------------------*/ + + + static Boolean CodeReg(char *ChIn, Byte *erg) +BEGIN + static char Regs[5]="XYUS",*p; + + if (strlen(ChIn)!=1) return False; + else + BEGIN + p=strchr(Regs,toupper(*ChIn)); + if (p==Nil) return False; + *erg=p-Regs; return True; + END +END + + static void ChkZero(char *s, Byte *Erg) +BEGIN + if (*s=='>') + BEGIN + strcpy(s,s+1); *Erg=1; + END + else if (*s=='<') + BEGIN + strcpy(s,s+1); *Erg=2; + if (*s=='<') + BEGIN + strcpy(s,s+1); *Erg=3; + END + END + else *Erg=0; +END + + static Boolean MayShort(Integer Arg) +BEGIN + return ((Arg>=-128) AND (Arg<127)); +END + + static void DecodeAdr(void) +BEGIN + String Asc,LAsc,temp; + LongInt AdrLong; + Word AdrWord; + Boolean IndFlag,OK; + Byte EReg,ZeroMode; + char *p; + Integer AdrInt; + + AdrMode=ModNone; AdrCnt=0; + strmaxcpy(Asc,ArgStr[1],255); strmaxcpy(LAsc,ArgStr[ArgCnt],255); + + /* immediate */ + + if (*Asc=='#') + BEGIN + switch (OpSize) + BEGIN + case 2: + AdrLong=EvalIntExpression(Asc+1,Int32,&OK); + if (OK) + BEGIN + AdrVals[0]=Lo(AdrLong >> 24); + AdrVals[1]=Lo(AdrLong >> 16); + AdrVals[2]=Lo(AdrLong >> 8); + AdrVals[3]=Lo(AdrLong); + AdrCnt=4; + END + break; + case 1: + AdrWord=EvalIntExpression(Asc+1,Int16,&OK); + if (OK) + BEGIN + AdrVals[0]=Hi(AdrWord); AdrVals[1]=Lo(AdrWord); + AdrCnt=2; + END + break; + case 0: + AdrVals[0]=EvalIntExpression(Asc+1,Int8,&OK); + if (OK) AdrCnt=1; + break; + END + if (OK) AdrMode=ModImm; + return; + END + + /* indirekter Ausdruck ? */ + + if ((*Asc=='[') AND (Asc[strlen(Asc)-1]==']')) + BEGIN + IndFlag=True; strcpy(Asc,Asc+1); Asc[strlen(Asc)-1]='\0'; + ArgCnt=0; + while (*Asc!='\0') + BEGIN + ArgCnt++; + p=QuotPos(Asc,','); + if (p!=Nil) + BEGIN + *p='\0'; strmaxcpy(ArgStr[ArgCnt],Asc,255); strcpy(Asc,p+1); + END + else + BEGIN + strmaxcpy(ArgStr[ArgCnt],Asc,255); *Asc='\0'; + END + END + strmaxcpy(Asc,ArgStr[1],255); strmaxcpy(LAsc,ArgStr[ArgCnt],255); + END + else IndFlag=False; + + /* Predekrement ? */ + + if ((ArgCnt>=1) AND (ArgCnt<=2) AND (strlen(LAsc)==2) AND (*LAsc=='-') AND (CodeReg(LAsc+1,&EReg))) + BEGIN + if ((ArgCnt==2) AND (*Asc!='\0')) WrError(1350); + else + BEGIN + AdrCnt=1; AdrVals[0]=0x82+(EReg << 5)+(Ord(IndFlag) << 4); + AdrMode=ModInd; + END + return; + END + + if ((ArgCnt>=1) AND (ArgCnt<=2) AND (strlen(LAsc)==3) AND (strncmp(LAsc,"--",2)==0) AND (CodeReg(LAsc+2,&EReg))) + BEGIN + if ((ArgCnt==2) AND (*Asc!='\0')) WrError(1350); + else + BEGIN + AdrCnt=1; AdrVals[0]=0x83+(EReg << 5)+(Ord(IndFlag) << 4); + AdrMode=ModInd; + END + return; + END + + if ((ArgCnt>=1) AND (ArgCnt<=2) AND (strcasecmp(LAsc,"--W")==0)) + BEGIN + if ((ArgCnt==2) AND (*Asc!='\0')) WrError(1350); + else if (MomCPU<CPU6309) WrError(1505); + else + BEGIN + AdrCnt=1; AdrVals[0]=0xef+Ord(IndFlag); + AdrMode=ModInd; + END + return; + END + + /* Postinkrement ? */ + + if ((ArgCnt>=1) AND (ArgCnt<=2) AND (strlen(LAsc)==2) AND (LAsc[1]=='+')) + BEGIN + temp[0]=(*LAsc); temp[1]='\0'; + if (CodeReg(temp,&EReg)) + BEGIN + if ((ArgCnt==2) AND (*Asc!='\0')) WrError(1350); + else + BEGIN + AdrCnt=1; AdrVals[0]=0x80+(EReg << 5)+(Ord(IndFlag) << 4); + AdrMode=ModInd; + END + return; + END + END + + if ((ArgCnt>=1) AND (ArgCnt<=2) AND (strlen(LAsc)==3) AND (strncmp(LAsc+1,"++",2)==0)) + BEGIN + temp[0]=(*LAsc); temp[1]='\0'; + if (CodeReg(temp,&EReg)) + BEGIN + if ((ArgCnt==2) AND (*Asc!='\0')) WrError(1350); + else + BEGIN + AdrCnt=1; AdrVals[0]=0x81+(EReg << 5)+(Ord(IndFlag) << 4); + AdrMode=ModInd; + END + return; + END + END + + if ((ArgCnt>=1) AND (ArgCnt<=2) AND (strcasecmp(LAsc,"W++")==0)) + BEGIN + if ((ArgCnt==2) AND (*Asc!='\0')) WrError(1350); + else if (MomCPU<CPU6309) WrError(1505); + else + BEGIN + AdrCnt=1; AdrVals[0]=0xcf+Ord(IndFlag); + AdrMode=ModInd; + END + return; + END + + /* 16-Bit-Register (mit Index) ? */ + + if ((ArgCnt<=2) AND (ArgCnt>=1) AND (CodeReg(LAsc,&EReg))) + BEGIN + AdrVals[0]=(EReg << 5)+(Ord(IndFlag) << 4); + + /* nur 16-Bit-Register */ + + if (ArgCnt==1) + BEGIN + AdrCnt=1; AdrVals[0]+=0x84; + AdrMode=ModInd; return; + END + + /* mit Index */ + + if (strcasecmp(Asc,"A")==0) + BEGIN + AdrCnt=1; AdrVals[0]+=0x86; + AdrMode=ModInd; return; + END + if (strcasecmp(Asc,"B")==0) + BEGIN + AdrCnt=1; AdrVals[0]+=0x85; + AdrMode=ModInd; return; + END + if (strcasecmp(Asc,"D")==0) + BEGIN + AdrCnt=1; AdrVals[0]+=0x8b; + AdrMode=ModInd; return; + END + if ((strcasecmp(Asc,"E")==0) AND (MomCPU>=CPU6309)) + BEGIN + if (EReg!=0) WrError(1350); + else + BEGIN + AdrCnt=1; AdrVals[0]+=0x87; AdrMode=ModInd; + END + return; + END + if ((strcasecmp(Asc,"F")==0) AND (MomCPU>=CPU6309)) + BEGIN + if (EReg!=0) WrError(1350); + else + BEGIN + AdrCnt=1; AdrVals[0]+=0x8a; AdrMode=ModInd; + END + return; + END + if ((strcasecmp(Asc,"W")==0) AND (MomCPU>=CPU6309)) + BEGIN + if (EReg!=0) WrError(1350); + else + BEGIN + AdrCnt=1; AdrVals[0]+=0x8e; AdrMode=ModInd; + END + return; + END + + /* Displacement auswerten */ + + ChkZero(Asc,&ZeroMode); + if (ZeroMode>1) + BEGIN + AdrInt=EvalIntExpression(Asc,Int8,&OK); + if ((FirstPassUnknown) AND (ZeroMode==3)) AdrInt&=0x0f; + END + else + AdrInt=EvalIntExpression(Asc,Int16,&OK); + + /* Displacement 0 ? */ + + if ((ZeroMode==0) AND (AdrInt==0)) + BEGIN + AdrCnt=1; AdrVals[0]+=0x84; + AdrMode=ModInd; return; + END + + /* 5-Bit-Displacement */ + + else if ((ZeroMode==3) OR ((ZeroMode==0) AND (NOT IndFlag) AND (AdrInt>=-16) AND (AdrInt<=15))) + BEGIN + if ((AdrInt<-16) OR (AdrInt>15)) WrError(1340); + else if (IndFlag) WrError(1350); + else + BEGIN + AdrMode=ModInd; + AdrCnt=1; AdrVals[0]+=AdrInt & 0x1f; + END + return; + END + + /* 8-Bit-Displacement */ + + else if ((ZeroMode==2) OR ((ZeroMode==0) AND (MayShort(AdrInt)))) + BEGIN + if (NOT MayShort(AdrInt)) WrError(1340); + else + BEGIN + AdrMode=ModInd; + AdrCnt=2; AdrVals[0]+=0x88; AdrVals[1]=Lo(AdrInt); + END; + return; + END + + /* 16-Bit-Displacement */ + + else + BEGIN + AdrMode=ModInd; + AdrCnt=3; AdrVals[0]+=0x89; + AdrVals[1]=Hi(AdrInt); AdrVals[2]=Lo(AdrInt); + return; + END + END + + if ((ArgCnt<=2) AND (ArgCnt>=1) AND (MomCPU>=CPU6309) AND (strcasecmp(ArgStr[ArgCnt],"W")==0)) + BEGIN + AdrVals[0]=0x8f+Ord(IndFlag); + + /* nur W-Register */ + + if (ArgCnt==1) + BEGIN + AdrCnt=1; AdrMode=ModInd; return; + END + + /* Displacement auswerten */ + ChkZero(Asc,&ZeroMode); + AdrInt=EvalIntExpression(Asc,Int16,&OK); + + /* Displacement 0 ? */ + + if ((ZeroMode==0) AND (AdrInt==0)) + BEGIN + AdrCnt=1; AdrMode=ModInd; return; + END + + /* 16-Bit-Displacement */ + + else + BEGIN + AdrMode=ModInd; + AdrCnt=3; AdrVals[0]+=0x20; + AdrVals[1]=Hi(AdrInt); AdrVals[2]=Lo(AdrInt); + return; + END + END + + /* PC-relativ ? */ + + if ((ArgCnt==2) AND ((strcasecmp(ArgStr[2],"PCR")==0) OR (strcasecmp(ArgStr[2],"PC")==0))) + BEGIN + AdrVals[0]=Ord(IndFlag) << 4; + ChkZero(Asc,&ZeroMode); + AdrInt=EvalIntExpression(Asc,Int16,&OK); + if (OK) + BEGIN + AdrInt-=EProgCounter()+3+Ord(ExtFlag); + + if (ZeroMode==3) WrError(1350); + + else if ((ZeroMode==2) OR ((ZeroMode==0) AND MayShort(AdrInt))) + BEGIN + if (NOT MayShort(AdrInt)) WrError(1320); + else + BEGIN + AdrCnt=2; AdrVals[0]+=0x8c; + AdrVals[1]=Lo(AdrInt); + AdrMode=ModInd; + END + END + + else + BEGIN + AdrInt--; + AdrCnt=3; AdrVals[0]+=0x8d; + AdrVals[1]=Hi(AdrInt); AdrVals[2]=Lo(AdrInt); + AdrMode=ModInd; + END + END + return; + END + + if (ArgCnt==1) + BEGIN + ChkZero(Asc,&ZeroMode); + FirstPassUnknown=False; + AdrInt=EvalIntExpression(Asc,Int16,&OK); + if ((FirstPassUnknown) AND (ZeroMode==2)) + AdrInt=(AdrInt & 0xff)| (DPRValue << 8); + + if (OK) + BEGIN + if (ZeroMode==3) WrError(1350); + + else if ((ZeroMode==2) OR ((ZeroMode==0) AND (Hi(AdrInt)==DPRValue) AND (NOT IndFlag))) + BEGIN + if (IndFlag) WrError(1990); + else if (Hi(AdrInt)!=DPRValue) WrError(1340); + else + BEGIN + AdrCnt=1; AdrMode=ModDir; AdrVals[0]=Lo(AdrInt); + END + END + + else + BEGIN + if (IndFlag) + BEGIN + AdrMode=ModInd; AdrCnt=3; AdrVals[0]=0x9f; + AdrVals[1]=Hi(AdrInt); AdrVals[2]=Lo(AdrInt); + END + else + BEGIN + AdrMode=ModExt; AdrCnt=2; + AdrVals[0]=Hi(AdrInt); AdrVals[1]=Lo(AdrInt); + END + END + END + return; + END + + if (AdrMode==ModNone) WrError(1350); +END + + static Boolean CodeCPUReg(char *Asc, Byte *Erg) +BEGIN +#define RegCnt 18 + static char *RegNames[RegCnt]={"D","X","Y","U","S","SP","PC","W","V","A","B","CCR","DPR","CC","DP","Z","E","F"}; + static Byte RegVals[RegCnt] ={0 ,1 ,2 ,3 ,4 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,10 ,11 ,13 ,14 ,15 }; + + int z; + String Asc_N; + + strmaxcpy(Asc_N,Asc,255); NLS_UpString(Asc_N); Asc=Asc_N; + + for (z=0; z<RegCnt; z++) + if (strcmp(Asc,RegNames[z])==0) + if (((RegVals[z] & 6)==6) AND (MomCPU<CPU6309)) WrError(1505); + else + BEGIN + *Erg=RegVals[z]; return True; + END + return False; +END + + static Boolean DecodePseudo(void) +BEGIN +#define ASSUME09Count 1 +static ASSUMERec ASSUME09s[ASSUME09Count]= + {{"DPR", &DPRValue, 0, 0xff, 0x100}}; + + if (Memo("ASSUME")) + BEGIN + CodeASSUME(ASSUME09s,ASSUME09Count); + return True; + END + + return False; +END + + static void SplitPM(char *s, int *Erg) +BEGIN + int l=strlen(s); + + if (l==0) *Erg=0; + else if (s[l-1]=='+') + BEGIN + s[l-1]='\0'; *Erg=1; + END + else if (s[l-1]=='-') + BEGIN + s[l-1]='\0'; *Erg=(-1); + END + else *Erg=0; +END + + static Boolean SplitBit(char *Asc, int *Erg) +BEGIN + char *p; + Boolean OK; + + p=QuotPos(Asc,'.'); + if (p==Nil) + BEGIN + WrError(1510); return False; + END + *Erg=EvalIntExpression(p+1,UInt3,&OK); + if (NOT OK) return False; + *p='\0'; + return True; +END + + static void MakeCode_6809(void) +BEGIN + char *p; + int z,z2,z3; + Integer AdrInt; + Boolean LongFlag,OK,Extent; + + CodeLen=0; DontPrint=False; OpSize=0; ExtFlag=False; + + /* zu ignorierendes */ + + if (Memo("")) return; + + /* Pseudoanweisungen */ + + if (DecodePseudo()) return; + + if (DecodeMotoPseudo(True)) return; + + /* Anweisungen ohne Argument */ + + for (z=0; z<FixedOrderCnt; z++) + if Memo(FixedOrders[z].Name) + BEGIN + if (ArgCnt!=0) WrError(1110); + else if (MomCPU<FixedOrders[z].MinCPU) WrError(1500); + else if (Hi(FixedOrders[z].Code)==0) + BEGIN + BAsmCode[0]=Lo(FixedOrders[z].Code); CodeLen=1; + END + else + BEGIN + BAsmCode[0]=Hi(FixedOrders[z].Code); + BAsmCode[1]=Lo(FixedOrders[z].Code); CodeLen=2; + END + return; + END; + + /* Specials... */ + + if (Memo("SWI")) + BEGIN + if (ArgCnt==0) + BEGIN + BAsmCode[0]=0x3f; CodeLen=1; + END + else if (ArgCnt!=1) WrError(1110); + else if (strcasecmp(ArgStr[1],"2")==0) + BEGIN + BAsmCode[0]=0x10; BAsmCode[1]=0x3f; CodeLen=2; + END + else if (strcasecmp(ArgStr[1],"3")==0) + BEGIN + BAsmCode[0]=0x11; BAsmCode[1]=0x3f; CodeLen=2; + END + else WrError(1135); + return; + END + + /* relative Spruenge */ + + for (z=0; z<RelOrderCnt; z++) + if ((Memo(RelOrders[z].Name)) OR ((*OpPart=='L') AND (strcmp(OpPart+1,RelOrders[z].Name)==0))) + BEGIN + if (ArgCnt!=1) WrError(1110); + else + BEGIN + LongFlag=(*OpPart=='L'); ExtFlag=(LongFlag) AND (Hi(RelOrders[z].Code16)!=0); + AdrInt=EvalIntExpression(ArgStr[1],UInt16,&OK); + if (OK) + BEGIN + AdrInt-=EProgCounter()+2+Ord(LongFlag)+Ord(ExtFlag); + if ((NOT SymbolQuestionable) AND (NOT LongFlag) AND ((AdrInt<-128) OR (AdrInt>127))) WrError(1370); + else + BEGIN + CodeLen=1+Ord(ExtFlag); + if (LongFlag) + if (ExtFlag) + BEGIN + BAsmCode[0]=Hi(RelOrders[z].Code16); BAsmCode[1]=Lo(RelOrders[z].Code16); + END + else BAsmCode[0]=Lo(RelOrders[z].Code16); + else BAsmCode[0]=Lo(RelOrders[z].Code8); + if (LongFlag) + BEGIN + BAsmCode[CodeLen]=Hi(AdrInt); BAsmCode[CodeLen+1]=Lo(AdrInt); + CodeLen+=2; + END + else + BEGIN + BAsmCode[CodeLen]=Lo(AdrInt); + CodeLen++; + END + END + END + END + return; + END + + /* ALU-Operationen */ + + for (z=0; z<ALUOrderCnt; z++) + if Memo(ALUOrders[z].Name) + BEGIN + if ((ArgCnt<1) OR (ArgCnt>2)) WrError(1110); + else if (MomCPU<ALUOrders[z].MinCPU) WrError(1500); + else + BEGIN + OpSize=ALUOrders[z].Op16; ExtFlag=(Hi(ALUOrders[z].Code)!=0); + DecodeAdr(); + if (AdrMode!=ModNone) + if ((NOT ALUOrders[z].MayImm) AND (AdrMode==ModImm)) WrError(1350); + else + BEGIN + CodeLen=Ord(ExtFlag)+1+AdrCnt; + if (ExtFlag) BAsmCode[0]=Hi(ALUOrders[z].Code); + BAsmCode[Ord(ExtFlag)]=Lo(ALUOrders[z].Code)+((AdrMode-1) << 4); + memcpy(BAsmCode+1+Ord(ExtFlag),AdrVals,AdrCnt); + END + END + return; + END + + if (Memo("LDQ")) + BEGIN + if ((ArgCnt<1) OR (ArgCnt>2)) WrError(1110); + else if (MomCPU<CPU6309) WrError(1500); + else + BEGIN + OpSize=2; + DecodeAdr(); + if (AdrMode==ModImm) + BEGIN + BAsmCode[0]=0xcd; memcpy(BAsmCode+1,AdrVals,AdrCnt); + CodeLen=1+AdrCnt; + END + else + BEGIN + BAsmCode[0]=0x10; BAsmCode[1]=0xcc+((AdrMode-1) << 4); + CodeLen=2+AdrCnt; + memcpy(BAsmCode+2,AdrVals,AdrCnt); + END + END + return; + END + + /* Read-Modify-Write-Operationen */ + + for (z=0; z<RMWOrderCnt; z++) + if Memo(RMWOrders[z].Name) + BEGIN + if ((ArgCnt<1) OR (ArgCnt>2)) WrError(1110); + else if (MomCPU<RMWOrders[z].MinCPU) WrError(1500); + else + BEGIN + DecodeAdr(); + if (AdrMode!=ModNone) + if (AdrMode==ModImm) WrError(1350); + else + BEGIN + CodeLen=1+AdrCnt; + switch (AdrMode) + BEGIN + case ModDir:BAsmCode[0]=RMWOrders[z].Code; break; + case ModInd:BAsmCode[0]=RMWOrders[z].Code+0x60; break; + case ModExt:BAsmCode[0]=RMWOrders[z].Code+0x70; break; + END + memcpy(BAsmCode+1,AdrVals,AdrCnt); + END + END + return; + END + + /* Anweisungen mit Flag-Operand */ + + for (z=0; z<FlagOrderCnt; z++) + if (Memo(FlagOrders[z].Name)) + BEGIN + if (ArgCnt<1) WrError(1110); + else + BEGIN + OK=True; + if (FlagOrders[z].Inv) BAsmCode[1]=0xff; else BAsmCode[1]=0x00; + for (z2=1; z2<=ArgCnt; z2++) + if (OK) + BEGIN + p=(strlen(ArgStr[z2])==1)?strchr(FlagChars,toupper(*ArgStr[z2])):Nil; + if (p!=Nil) + BEGIN + z3=p-FlagChars; + if (FlagOrders[z].Inv) BAsmCode[1]&=(0xff^(1 << z3)); + else BAsmCode[1]|=(1 << z3); + END + else if (*ArgStr[z2]!='#') + BEGIN + WrError(1120); OK=False; + END + else + BEGIN + BAsmCode[2]=EvalIntExpression(ArgStr[z2]+1,Int8,&OK); + if (OK) + if (FlagOrders[z].Inv) BAsmCode[1]&=BAsmCode[2]; + else BAsmCode[1]|=BAsmCode[2]; + END + END + if (OK) + BEGIN + CodeLen=2; BAsmCode[0]=FlagOrders[z].Code; + END + END + return; + END + + /* Bit-Befehle */ + + for (z=0; z<ImmOrderCnt; z++) + if (Memo(ImmOrders[z].Name)) + BEGIN + if ((ArgCnt!=2) AND (ArgCnt!=3)) WrError(1110); + else if (MomCPU<ImmOrders[z].MinCPU) WrError(1500); + else if (*ArgStr[1]!='#') WrError(1120); + else + BEGIN + BAsmCode[1]=EvalIntExpression(ArgStr[1]+1,Int8,&OK); + if (OK) + BEGIN + for (z2=1; z2<ArgCnt; z2++) strcpy(ArgStr[z2],ArgStr[z2+1]); + ArgCnt--; DecodeAdr(); + if (AdrMode==ModImm) WrError(1350); + else + BEGIN + switch (AdrMode) + BEGIN + case ModDir:BAsmCode[0]=ImmOrders[z].Code; break; + case ModExt:BAsmCode[0]=ImmOrders[z].Code+0x70; break; + case ModInd:BAsmCode[0]=ImmOrders[z].Code+0x60; break; + END + memcpy(BAsmCode+2,AdrVals,AdrCnt); + CodeLen=2+AdrCnt; + END + END + END + return; + END + + for (z=0; z<BitOrderCnt; z++) + if (Memo(BitOrders[z])) + BEGIN + if (ArgCnt!=2) WrError(1110); + else if (MomCPU<CPU6309) WrError(1500); + else + if (SplitBit(ArgStr[1],&z2)) + if (SplitBit(ArgStr[2],&z3)) + if (NOT CodeCPUReg(ArgStr[1],BAsmCode+2)) WrError(1980); + else if ((BAsmCode[2]<8) OR (BAsmCode[2]>11)) WrError(1980); + else + BEGIN + strcpy(ArgStr[1],ArgStr[2]); ArgCnt=1; DecodeAdr(); + if (AdrMode!=ModDir) WrError(1350); + else + BEGIN + BAsmCode[2]-=7; + if (BAsmCode[2]==3) BAsmCode[2]=0; + BAsmCode[0]=0x11; BAsmCode[1]=0x30+z; + BAsmCode[2]=(BAsmCode[2] << 6)+(z3 << 3)+z2; + BAsmCode[3]=AdrVals[0]; + CodeLen=4; + END + END + return; + END + + /* Register-Register-Operationen */ + + if ((Memo("TFR")) OR (Memo("TFM")) OR (Memo("EXG"))) + BEGIN + if (ArgCnt!=2) WrError(1110); + else + BEGIN + SplitPM(ArgStr[1],&z2); SplitPM(ArgStr[2],&z3); + if ((z2!=0) OR (z3!=0)) + BEGIN + if (Memo("EXG")) WrError(1350); + else if (NOT CodeCPUReg(ArgStr[1],BAsmCode+3)) WrError(1980); + else if (NOT CodeCPUReg(ArgStr[2],BAsmCode+2)) WrError(1980); + else if ((BAsmCode[2]<1) OR (BAsmCode[2]>4)) WrError(1980); + else if ((BAsmCode[3]<1) OR (BAsmCode[3]>4)) WrError(1980); + else + BEGIN + BAsmCode[0]=0x11; BAsmCode[1]=0; + BAsmCode[2]+=BAsmCode[3] << 4; + if ((z2==1) AND (z3==1)) BAsmCode[1]=0x38; + else if ((z2==-1) AND (z3==-1)) BAsmCode[1]=0x39; + else if ((z2== 1) AND (z3== 0)) BAsmCode[1]=0x3a; + else if ((z2== 0) AND (z3== 1)) BAsmCode[1]=0x3b; + if (BAsmCode[1]==0) WrError(1350); else CodeLen=3; + END + END + else if (Memo("TFM")) WrError(1350); + else if (NOT CodeCPUReg(ArgStr[1],BAsmCode+2)) WrError(1980); + else if (NOT CodeCPUReg(ArgStr[2],BAsmCode+1)) WrError(1980); + else if ((BAsmCode[1]!=13) AND (BAsmCode[2]!=13) AND /* Z-Register mit allen kompatibel */ + (((BAsmCode[1] ^ BAsmCode[2]) & 0x08)!=0)) WrError(1131); + else + BEGIN + CodeLen=2; + BAsmCode[0]=0x1e + Ord(Memo("TFR")); + BAsmCode[1]+=BAsmCode[2] << 4; + END + END + return; + END + + for (z=0; z<ALU2OrderCnt; z++) + if ((strncmp(OpPart,ALU2Orders[z],strlen(ALU2Orders[z]))==0) AND ((OpPart[strlen(OpPart)]=='\0') OR (OpPart[strlen(OpPart)-1]=='R'))) + BEGIN + if (ArgCnt!=2) WrError(1110); + else if (NOT CodeCPUReg(ArgStr[1],BAsmCode+3)) WrError(1980); + else if (NOT CodeCPUReg(ArgStr[2],BAsmCode+2)) WrError(1980); + else if ((BAsmCode[1]!=13) AND (BAsmCode[2]!=13) AND /* Z-Register mit allen kompatibel */ + (((BAsmCode[2] ^ BAsmCode[3]) & 0x08)!=0)) WrError(1131); + else + BEGIN + CodeLen=3; + BAsmCode[0]=0x10; + BAsmCode[1]=0x30+z; + BAsmCode[2]+=BAsmCode[3] << 4; + END + return; + END + + /* Berechnung effektiver Adressen */ + + for (z=0; z<LEAOrderCnt; z++) + if Memo(LEAOrders[z].Name) + BEGIN + if ((ArgCnt<1) OR (ArgCnt>2)) WrError(1110); + else + BEGIN + DecodeAdr(); + if (AdrMode!=ModNone) + if (AdrMode!=ModInd) WrError(1350); + else + BEGIN + CodeLen=1+AdrCnt; + BAsmCode[0]=LEAOrders[z].Code; + memcpy(BAsmCode+1,AdrVals,AdrCnt); + END; + END; + return; + END + + /* Push/Pull */ + + for (z=0; z<StackOrderCnt; z++) + if Memo(StackOrders[z].Name) + BEGIN + BAsmCode[1]=0; OK=True; Extent=False; + /* S oder U einsetzen, entsprechend Opcode */ + *StackRegNames[StackRegCnt-1]= + OpPart[strlen(OpPart)-1] ^ Ord('S') ^ Ord('U'); + for (z2=1; z2<=ArgCnt; z2++) + if (OK) + BEGIN + if (strcasecmp(ArgStr[z2],"W")==0) + BEGIN + if (MomCPU<CPU6309) + BEGIN + WrError(1500); OK=False; + END + else if (ArgCnt!=1) + BEGIN + WrError(1335); OK=False; + END + else Extent=True; + END + else + BEGIN + for (z3=0; z3<StackRegCnt; z3++) + if (strcasecmp(ArgStr[z2],StackRegNames[z3])==0) + BEGIN + BAsmCode[1]|=(1 << StackRegCodes[z3]); + break; + END + if (z3>=StackRegCnt) + if (strcasecmp(ArgStr[z2],"ALL")==0) BAsmCode[1]=0xff; + else if (*ArgStr[z2]!='#') OK=False; + else + BEGIN + BAsmCode[2]=EvalIntExpression(ArgStr[z2]+1,Int8,&OK); + if (OK) BAsmCode[1]|=BAsmCode[2]; + END + END + END + if (OK) + if (Extent) + BEGIN + CodeLen=2; BAsmCode[0]=0x10; BAsmCode[1]=StackOrders[z].Code+4; + END + else + BEGIN + CodeLen=2; BAsmCode[0]=StackOrders[z].Code; + END + else WrError(1980); + return; + END + + if ((Memo("BITMD")) OR (Memo("LDMD"))) + BEGIN + if (ArgCnt!=1) WrError(1110); + else if (MomCPU<CPU6309) WrError(1500); + else if (*ArgStr[1]!='#') WrError(1120); + else + BEGIN + BAsmCode[2]=EvalIntExpression(ArgStr[1]+1,Int8,&OK); + if (OK) + BEGIN + BAsmCode[0]=0x11; + BAsmCode[1]=0x3c+Ord(Memo("LDMD")); + CodeLen=3; + END + END + return; + END + + WrXError(1200,OpPart); +END + + static void InitCode_6809() +BEGIN + SaveInitProc(); + DPRValue=0; +END + + static Boolean IsDef_6809(void) +BEGIN + return False; +END + + static void SwitchFrom_6809(void) +BEGIN + DeinitFields(); +END + + static void SwitchTo_6809(void) +BEGIN + TurnWords=False; ConstMode=ConstModeMoto; SetIsOccupied=False; + + PCSymbol="*"; HeaderID=0x63; NOPCode=0x9d; + DivideChars=","; HasAttrs=False; + + ValidSegs=(1<<SegCode); + Grans[SegCode]=1; ListGrans[SegCode]=1; SegInits[SegCode]=0; + SegLimits[SegCode] = 0xffff; + + MakeCode=MakeCode_6809; IsDef=IsDef_6809; + + SwitchFrom=SwitchFrom_6809; InitFields(); +END + + void code6809_init(void) +BEGIN + CPU6809=AddCPU("6809",SwitchTo_6809); + CPU6309=AddCPU("6309",SwitchTo_6809); + + SaveInitProc=InitPassProc; InitPassProc=InitCode_6809; +END |