/* code47c00.c */ /*****************************************************************************/ /* AS-Portierung */ /* */ /* Codegenerator Toshiba TLCS-47(0(A)) */ /* */ /* Historie: 30.12.1996 Grundsteinlegung */ /* 3. 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; Byte Code; } FixedOrder; #define FixedOrderCnt 3 #define BitOrderCnt 4 #define ModNone (-1) #define ModAcc 0 #define MModAcc (1 << ModAcc) #define ModL 1 #define MModL (1 << ModL) #define ModH 2 #define MModH (1 << ModH) #define ModHL 3 #define MModHL (1 << ModHL) #define ModIHL 4 #define MModIHL (1 << ModIHL) #define ModAbs 5 #define MModAbs (1 << ModAbs) #define ModPort 6 #define MModPort (1 << ModPort) #define ModImm 7 #define MModImm (1 << ModImm) #define ModSAbs 8 #define MModSAbs (1 << ModSAbs) static CPUVar CPU47C00,CPU470C00,CPU470AC00; static ShortInt AdrType,OpSize; static Byte AdrVal; static LongInt DMBAssume; static SimpProc SaveInitProc; static FixedOrder *FixedOrders; static char **BitOrders; /*---------------------------------------------------------------------------*/ static void AddFixed(char *NName, Byte NCode) BEGIN if (InstrZ>=FixedOrderCnt) exit(255); FixedOrders[InstrZ].Name=NName; FixedOrders[InstrZ++].Code=NCode; END static void InitFields(void) BEGIN FixedOrders=(FixedOrder *) malloc(sizeof(FixedOrder)*FixedOrderCnt); InstrZ=0; AddFixed("RET" , 0x2a); AddFixed("RETI", 0x2b); AddFixed("NOP" , 0x00); BitOrders=(char **) malloc(sizeof(char *)*BitOrderCnt); InstrZ=0; BitOrders[InstrZ++]="SET"; BitOrders[InstrZ++]="CLR"; BitOrders[InstrZ++]="TEST"; BitOrders[InstrZ++]="TESTP"; END static void DeinitFields(void) BEGIN free(FixedOrders); free(BitOrders); END /*---------------------------------------------------------------------------*/ static Word RAMEnd(void) BEGIN if (MomCPU==CPU47C00) return 0xff; else if (MomCPU==CPU470C00) return 0x1ff; else return 0x3ff; END static Word ROMEnd(void) BEGIN if (MomCPU==CPU47C00) return 0xfff; else if (MomCPU==CPU470C00) return 0x1fff; else return 0x3fff; END static Word PortEnd(void) BEGIN if (MomCPU==CPU47C00) return 0x0f; else return 0x1f; END static void SetOpSize(ShortInt NewSize) BEGIN if (OpSize==-1) OpSize=NewSize; else if (OpSize!=NewSize) BEGIN WrError(1131); AdrType=ModNone; END END static void ChkAdr(Word Mask) BEGIN if ((AdrType!=ModNone) AND (((1 << AdrType) & Mask)==0)) BEGIN WrError(1350); AdrType=ModNone; END END static void DecodeAdr(char *Asc, Word Mask) BEGIN static char *RegNames[ModIHL+1]={"A","L","H","HL","@HL"}; Byte z; Word AdrWord; Boolean OK; AdrType=ModNone; for (z=0; z<=ModIHL; z++) if (strcasecmp(Asc,RegNames[z])==0) BEGIN AdrType=z; if (z!=ModIHL) SetOpSize(Ord(z==ModHL)); ChkAdr(Mask); return; END if (*Asc=='#') BEGIN switch (OpSize) BEGIN case -1: WrError(1132); break; case 2: AdrVal=EvalIntExpression(Asc+1,UInt2,&OK) & 3; if (OK) AdrType=ModImm; break; case 0: AdrVal=EvalIntExpression(Asc+1,Int4,&OK) & 15; if (OK) AdrType=ModImm; break; case 1: AdrVal=EvalIntExpression(Asc+1,Int8,&OK); if (OK) AdrType=ModImm; break; END ChkAdr(Mask); return; END if (*Asc=='%') BEGIN AdrVal=EvalIntExpression(Asc+1,Int5,&OK); if (OK) BEGIN AdrType=ModPort; ChkSpace(SegIO); END ChkAdr(Mask); return; END FirstPassUnknown=False; AdrWord=EvalIntExpression(Asc,Int16,&OK); if (OK) BEGIN ChkSpace(SegData); if (FirstPassUnknown) AdrWord&=RAMEnd(); else if (Hi(AdrWord)!=DMBAssume) WrError(110); AdrVal=Lo(AdrWord); if (FirstPassUnknown) AdrVal&=15; if (((Mask & MModSAbs)!=0) AND (AdrVal<16)) AdrType=ModSAbs; else AdrType=ModAbs; END ChkAdr(Mask); END /*--------------------------------------------------------------------------*/ static Boolean DecodePseudo(void) BEGIN #define ASSUME47Count 1 static ASSUMERec ASSUME47s[ASSUME47Count]= {{"DMB", &DMBAssume, 0, 3, 4}}; if (Memo("PORT")) BEGIN CodeEquate(SegIO,0,0x1f); return True; END if (Memo("ASSUME")) BEGIN CodeASSUME(ASSUME47s,ASSUME47Count); return True; END return False; END static void ChkCPU(Byte Mask) BEGIN Byte NMask=(1 << (MomCPU-CPU47C00)); /* Don't ask me why, but NetBSD/Sun3 doesn't like writing everything in one formula when using -O3 :-( */ if ((Mask & NMask)==0) BEGIN WrError(1500); CodeLen=0; END END static Boolean DualOp(char *s1, char *s2) BEGIN return (((strcasecmp(ArgStr[1],s1)==0) AND (strcasecmp(ArgStr[2],s2)==0)) OR ((strcasecmp(ArgStr[2],s1)==0) AND (strcasecmp(ArgStr[1],s2)==0))); END static void MakeCode_47C00(void) BEGIN Boolean OK; Word AdrWord; int z; Byte HReg; CodeLen=0; DontPrint=False; OpSize=(-1); /* zu ignorierendes */ if (Memo("")) return; /* Pseudoanweisungen */ if (DecodeIntelPseudo(False)) return; if (DecodePseudo()) return; /* ohne Argument */ for (z=0; z> 4); BAsmCode[1]=0xe0+(AdrVal & 15); break; END break; case ModH: case ModL: BAsmCode[0]=0xc0+(Ord(AdrType==ModL) << 5); DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN CodeLen=1; BAsmCode[0]+=AdrVal; END break; END END return; END if (Memo("LDL")) BEGIN if (ArgCnt!=2) WrError(1110); else if ((strcasecmp(ArgStr[1],"A")!=0) OR (strcasecmp(ArgStr[2],"@DC")!=0)) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x33; END return; END if (Memo("LDH")) BEGIN if (ArgCnt!=2) WrError(1110); else if ((strcasecmp(ArgStr[1],"A")!=0) OR (strcasecmp(ArgStr[2],"@DC+")!=0)) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x32; END return; END if (Memo("ST")) BEGIN if (ArgCnt!=2) WrError(1110); else if (strcasecmp(ArgStr[1],"DMB")==0) BEGIN DecodeAdr(ArgStr[2],MModIHL); if (AdrType!=ModNone) BEGIN CodeLen=3; BAsmCode[0]=0x03; BAsmCode[1]=0x3a; BAsmCode[2]=0x69; ChkCPU(4); END END else BEGIN OpSize=0; DecodeAdr(ArgStr[1],MModImm+MModAcc); switch (AdrType) BEGIN case ModAcc: if (strcasecmp(ArgStr[2],"@HL+")==0) BEGIN CodeLen=1; BAsmCode[0]=0x1a; END else if (strcasecmp(ArgStr[2],"@HL-")==0) BEGIN CodeLen=1; BAsmCode[0]=0x1b; END else BEGIN DecodeAdr(ArgStr[2],MModAbs+MModIHL); switch (AdrType) BEGIN case ModAbs: CodeLen=2; BAsmCode[0]=0x3f; BAsmCode[1]=AdrVal; break; case ModIHL: CodeLen=1; BAsmCode[0]=0x0f; break; END END break; case ModImm: HReg=AdrVal; if (strcasecmp(ArgStr[2],"@HL+")==0) BEGIN CodeLen=1; BAsmCode[0]=0xf0+HReg; END else BEGIN DecodeAdr(ArgStr[2],MModSAbs); if (AdrType!=ModNone) if (AdrVal>0x0f) WrError(1320); else BEGIN CodeLen=2; BAsmCode[0]=0x2d; BAsmCode[1]=(HReg << 4)+AdrVal; END END break; END END return; END if (Memo("MOV")) BEGIN if (ArgCnt!=2) WrError(1110); else if ((strcasecmp(ArgStr[1],"A")==0) AND (strcasecmp(ArgStr[2],"DMB")==0)) BEGIN CodeLen=3; BAsmCode[0]=0x03; BAsmCode[1]=0x3a; BAsmCode[2]=0xa9; ChkCPU(4); END else if ((strcasecmp(ArgStr[1],"DMB")==0) AND (strcasecmp(ArgStr[2],"A")==0)) BEGIN CodeLen=3; BAsmCode[0]=0x03; BAsmCode[1]=0x3a; BAsmCode[2]=0x29; ChkCPU(4); END else if ((strcasecmp(ArgStr[1],"A")==0) AND (strcasecmp(ArgStr[2],"SPW13")==0)) BEGIN CodeLen=2; BAsmCode[0]=0x3a; BAsmCode[1]=0x84; ChkCPU(4); END else if ((strcasecmp(ArgStr[1],"STK13")==0) AND (strcasecmp(ArgStr[2],"A")==0)) BEGIN CodeLen=2; BAsmCode[0]=0x3a; BAsmCode[1]=0x04; ChkCPU(4); END else if (strcasecmp(ArgStr[2],"A")!=0) WrError(1350); else BEGIN DecodeAdr(ArgStr[1],MModH+MModL); if (AdrType!=ModNone) BEGIN CodeLen=1; BAsmCode[0]=0x10+Ord(AdrType==ModL); END END return; END if (Memo("XCH")) BEGIN if (ArgCnt!=2) WrError(1110); else if (DualOp("A","EIR")) BEGIN CodeLen=1; BAsmCode[0]=0x13; END else if (DualOp("A","@HL")) BEGIN CodeLen=1; BAsmCode[0]=0x0d; END else if (DualOp("A","H")) BEGIN CodeLen=1; BAsmCode[0]=0x30; END else if (DualOp("A","L")) BEGIN CodeLen=1; BAsmCode[0]=0x31; END else BEGIN if ((strcasecmp(ArgStr[1],"A")!=0) AND (strcasecmp(ArgStr[1],"HL")!=0)) BEGIN strcpy(ArgStr[3],ArgStr[1]); strcpy(ArgStr[1],ArgStr[2]); strcpy(ArgStr[2],ArgStr[3]); END if ((strcasecmp(ArgStr[1],"A")!=0) AND (strcasecmp(ArgStr[1],"HL")!=0)) WrError(1350); else BEGIN DecodeAdr(ArgStr[2],MModAbs); if (AdrType!=ModNone) if ((strcasecmp(ArgStr[1],"HL")==0) AND ((AdrVal & 3)!=0)) WrError(1325); else BEGIN CodeLen=2; BAsmCode[0]=0x29+(0x14*Ord(strcasecmp(ArgStr[1],"A")==0)); BAsmCode[1]=AdrVal; END END END return; END if (Memo("IN")) BEGIN if (ArgCnt!=2) WrError(1110); else BEGIN DecodeAdr(ArgStr[1],MModPort); if (AdrType!=ModNone) BEGIN HReg=AdrVal; DecodeAdr(ArgStr[2],MModAcc+MModIHL); switch (AdrType) BEGIN case ModAcc: CodeLen=2; BAsmCode[0]=0x3a; BAsmCode[1]=(HReg & 0x0f)+(((HReg & 0x10) ^ 0x10) << 1); break; case ModIHL: CodeLen=2; BAsmCode[0]=0x3a; BAsmCode[1]=0x40+(HReg & 0x0f)+(((HReg & 0x10) ^ 0x10) << 1); break; END END END return; END if (Memo("OUT")) BEGIN if (ArgCnt!=2) WrError(1110); else BEGIN DecodeAdr(ArgStr[2],MModPort); if (AdrType!=ModNone) BEGIN HReg=AdrVal; OpSize=0; DecodeAdr(ArgStr[1],MModAcc+MModIHL+MModImm); switch (AdrType) BEGIN case ModAcc: CodeLen=2; BAsmCode[0]=0x3a; BAsmCode[1]=0x80+((HReg & 0x10) << 1)+((HReg & 0x0f) ^ 4); break; case ModIHL: CodeLen=2; BAsmCode[0]=0x3a; BAsmCode[1]=0xc0+((HReg & 0x10) << 1)+((HReg & 0x0f) ^ 4); break; case ModImm: if (HReg>0x0f) WrError(1110); else BEGIN CodeLen=2; BAsmCode[0]=0x2c; BAsmCode[1]=(AdrVal << 4)+HReg; END break; END END END return; END if (Memo("OUTB")) BEGIN if (ArgCnt!=1) WrError(1110); else if (strcasecmp(ArgStr[1],"@HL")!=0) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x12; END return; END /* Arithmetik */ if (Memo("CMPR")) BEGIN if (ArgCnt!=2) WrError(1110); else BEGIN DecodeAdr(ArgStr[1],MModAcc+MModSAbs+MModH+MModL); switch (AdrType) BEGIN case ModAcc: DecodeAdr(ArgStr[2],MModIHL+MModAbs+MModImm); switch (AdrType) BEGIN case ModIHL: CodeLen=1; BAsmCode[0]=0x16; break; case ModAbs: CodeLen=2; BAsmCode[0]=0x3e; BAsmCode[1]=AdrVal; break; case ModImm: CodeLen=1; BAsmCode[0]=0xd0+AdrVal; break; END break; case ModSAbs: OpSize=0; HReg=AdrVal; DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN CodeLen=2; BAsmCode[0]=0x2e; BAsmCode[1]=(AdrVal << 4)+HReg; END break; case ModH: case ModL: HReg=AdrType; DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=0x90+(Ord(HReg==ModH) << 6)+AdrVal; END break; END END return; END if (Memo("ADD")) BEGIN if (ArgCnt!=2) WrError(1110); else BEGIN DecodeAdr(ArgStr[1],MModAcc+MModIHL+MModSAbs+MModL+MModH); switch (AdrType) BEGIN case ModAcc: DecodeAdr(ArgStr[2],MModIHL+MModImm); switch (AdrType) BEGIN case ModIHL: CodeLen=1; BAsmCode[0]=0x17; break; case ModImm: CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=AdrVal; break; END break; case ModIHL: OpSize=0; DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=0x40+AdrVal; END break; case ModSAbs: HReg=AdrVal; OpSize=0; DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN CodeLen=2; BAsmCode[0]=0x2f; BAsmCode[1]=(AdrVal << 4)+HReg; END break; case ModH: case ModL: HReg=Ord(AdrType==ModH); DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=0x80+(HReg << 6)+AdrVal; END break; END END return; END if (Memo("ADDC")) BEGIN if (ArgCnt!=2) WrError(1110); else if ((strcasecmp(ArgStr[1],"A")!=0) OR (strcasecmp(ArgStr[2],"@HL")!=0)) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x15; END return; END if (Memo("SUBRC")) BEGIN if (ArgCnt!=2) WrError(1110); else if ((strcasecmp(ArgStr[1],"A")!=0) OR (strcasecmp(ArgStr[2],"@HL")!=0)) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x14; END return; END if (Memo("SUBR")) BEGIN if (ArgCnt!=2) WrError(1110); else BEGIN OpSize=0; DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN HReg=AdrVal; DecodeAdr(ArgStr[1],MModAcc+MModIHL); switch (AdrType) BEGIN case ModAcc: CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=0x10+HReg; break; case ModIHL: CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=0x50+HReg; break; END END END return; END if ((Memo("INC")) OR (Memo("DEC"))) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN HReg=Ord(Memo("DEC")); DecodeAdr(ArgStr[1],MModAcc+MModIHL+MModL); switch (AdrType) BEGIN case ModAcc: CodeLen=1; BAsmCode[0]=0x08+HReg; break; case ModL: CodeLen=1; BAsmCode[0]=0x18+HReg; break; case ModIHL: CodeLen=1; BAsmCode[0]=0x0a+HReg; break; END END return; END /* Logik */ if ((Memo("AND")) OR (Memo("OR"))) BEGIN if (ArgCnt!=2) WrError(1110); else BEGIN HReg=Ord(Memo("OR")); DecodeAdr(ArgStr[1],MModAcc+MModIHL); switch (AdrType) BEGIN case ModAcc: DecodeAdr(ArgStr[2],MModImm+MModIHL); switch (AdrType) BEGIN case ModIHL: CodeLen=1; BAsmCode[0]=0x1e - HReg; /* ANSI :-0 */ break; case ModImm: CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=0x30-(HReg << 4)+AdrVal; break; END break; case ModIHL: SetOpSize(0); DecodeAdr(ArgStr[2],MModImm); if (AdrType!=ModNone) BEGIN CodeLen=2; BAsmCode[0]=0x38; BAsmCode[1]=0x70-(HReg << 4)+AdrVal; END break; END END return; END if (Memo("XOR")) BEGIN if (ArgCnt!=2) WrError(1110); else if ((strcasecmp(ArgStr[1],"A")!=0) OR (strcasecmp(ArgStr[2],"@HL")!=0)) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x1f; END return; END if ((Memo("ROLC")) OR (Memo("RORC"))) BEGIN if ((ArgCnt!=1) AND (ArgCnt!=2)) WrError(1110); else if (strcasecmp(ArgStr[1],"A")!=0) WrError(1350); else BEGIN if (ArgCnt==1) BEGIN HReg=1; OK=True; END else HReg=EvalIntExpression(ArgStr[2],Int8,&OK); if (OK) BEGIN BAsmCode[0]=0x05+(Ord(Memo("RORC")) << 1); for (z=1; z=4) WrError(160); END END return; END for (z=0; z1) WrError(1350); else BEGIN CodeLen=3; BAsmCode[0]=3-z; BAsmCode[1]=0x3a; BAsmCode[2]=0x84; ChkCPU(4); END END else WrError(1350); else if (ArgCnt==2) if (strcasecmp(ArgStr[1],"IL")==0) BEGIN if (z!=1) WrError(1350); else BEGIN HReg=EvalIntExpression(ArgStr[2],UInt6,&OK); if (OK) BEGIN CodeLen=2; BAsmCode[0]=0x36; BAsmCode[1]=0xc0+HReg; END END END else BEGIN HReg=EvalIntExpression(ArgStr[2],UInt2,&OK); if (OK) BEGIN DecodeAdr(ArgStr[1],MModAcc+MModIHL+MModPort+MModSAbs); switch (AdrType) BEGIN case ModAcc: if (z!=2) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x5c+HReg; END break; case ModIHL: if (z==3) WrError(1350); else BEGIN CodeLen=1; BAsmCode[0]=0x50+HReg+(z << 2); END break; case ModPort: if (AdrVal>15) WrError(1320); else BEGIN CodeLen=2; BAsmCode[0]=0x3b; BAsmCode[1]=(z << 6)+(HReg << 4)+AdrVal; END break; case ModSAbs: CodeLen=2; BAsmCode[0]=0x39; BAsmCode[1]=(z << 6)+(HReg << 4)+AdrVal; break; END END END else WrError(1110); return; END if ((Memo("EICLR")) OR (Memo("DICLR"))) BEGIN if (ArgCnt!=2) WrError(1110); else if (strcasecmp(ArgStr[1],"IL")!=0) WrError(1350); else BEGIN BAsmCode[1]=EvalIntExpression(ArgStr[2],UInt6,&OK); if (OK) BEGIN CodeLen=2; BAsmCode[0]=0x36; BAsmCode[1]+=0x40*(1+Ord(Memo("DICLR"))); END END return; END /* Spruenge */ if (Memo("BSS")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrWord=EvalIntExpression(ArgStr[1],Int16,&OK); if (OK) if ((NOT SymbolQuestionable) AND ((AdrWord >> 6)!=((EProgCounter()+1) >> 6))) WrError(1910); else BEGIN ChkSpace(SegCode); CodeLen=1; BAsmCode[0]=0x80+(AdrWord & 0x3f); END END return; END if (Memo("BS")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrWord=EvalIntExpression(ArgStr[1],Int16,&OK); if (OK) if (((NOT SymbolQuestionable) AND (AdrWord >> 12)!=((EProgCounter()+2) >> 12))) WrError(1910); else BEGIN ChkSpace(SegCode); CodeLen=2; BAsmCode[0]=0x60+(Hi(AdrWord) & 15); BAsmCode[1]=Lo(AdrWord); END END return; END if (Memo("BSL")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrWord=EvalIntExpression(ArgStr[1],Int16,&OK); if (OK) if (AdrWord>ROMEnd()) WrError(1320); else BEGIN ChkSpace(SegCode); CodeLen=3; switch (AdrWord >> 12) BEGIN case 0: BAsmCode[0]=0x02; break; case 1: BAsmCode[0]=0x03; break; case 2: BAsmCode[0]=0x1c; break; case 3: BAsmCode[0]=0x01; break; END BAsmCode[1]=0x60+(Hi(AdrWord) & 0x0f); BAsmCode[2]=Lo(AdrWord); END END return; END if (Memo("B")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrWord=EvalIntExpression(ArgStr[1],Int16,&OK); if (OK) if (AdrWord>ROMEnd()) WrError(1320); else BEGIN ChkSpace(SegCode); if ((AdrWord >> 6)==((EProgCounter()+1) >> 6)) BEGIN CodeLen=1; BAsmCode[0]=0x80+(AdrWord & 0x3f); END else if ((AdrWord >> 12)==((EProgCounter()+2) >> 12)) BEGIN CodeLen=2; BAsmCode[0]=0x60+(Hi(AdrWord) & 0x0f); BAsmCode[1]=Lo(AdrWord); END else BEGIN CodeLen=3; switch (AdrWord >> 12) BEGIN case 0: BAsmCode[0]=0x02; break; case 1: BAsmCode[0]=0x03; break; case 2: BAsmCode[0]=0x1c; break; case 3: BAsmCode[0]=0x01; break; END BAsmCode[1]=0x60+(Hi(AdrWord) & 0x0f); BAsmCode[2]=Lo(AdrWord); END END END return; END if (Memo("CALLS")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrWord=EvalIntExpression(ArgStr[1],Int16,&OK); if (OK) BEGIN if (AdrWord==0x86) AdrWord=0x06; if ((AdrWord & 0xff87)!=6) WrError(1135); else BEGIN CodeLen=1; BAsmCode[0]=(AdrWord >> 3)+0x70; END END END return; END if (Memo("CALL")) BEGIN if (ArgCnt!=1) WrError(1110); else BEGIN AdrWord=EvalIntExpression(ArgStr[1],Int16,&OK); if (OK) if ((NOT SymbolQuestionable) AND (((AdrWord ^ EProgCounter()) & 0x3800)!=0)) WrError(1910); else BEGIN ChkSpace(SegCode); CodeLen=2; BAsmCode[0]=0x20+(Hi(AdrWord) & 7); BAsmCode[1]=Lo(AdrWord); END END return; END WrXError(1200,OpPart); END static Boolean IsDef_47C00(void) BEGIN return (Memo("PORT")); END static void SwitchFrom_47C00(void) BEGIN DeinitFields(); END static void SwitchTo_47C00(void) BEGIN TurnWords=False; ConstMode=ConstModeIntel; SetIsOccupied=True; PCSymbol="$"; HeaderID=0x55; NOPCode=0x00; DivideChars=","; HasAttrs=False; ValidSegs=(1<