From 333b605b2afd472b823aeda0adf0e8b1ea9843c0 Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Mon, 27 May 2019 02:41:51 +0100 Subject: initial commit from asl-1.41r8.tar.gz --- code6804.c | 451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 451 insertions(+) create mode 100644 code6804.c (limited to 'code6804.c') diff --git a/code6804.c b/code6804.c new file mode 100644 index 0000000..966ff33 --- /dev/null +++ b/code6804.c @@ -0,0 +1,451 @@ +/* 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<