X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=amode.c;h=ccd86ddf184a95ace8385ea5da725277e0a15f19;hp=73f2bdaa15f19cdf0b671481eb69f59b8b939d52;hb=66b362fa203d0850e8dce8045adb454e354c22ce;hpb=582df8950c285e1746d0c4a9e3ead6545c962dc8 diff --git a/amode.c b/amode.c index 73f2bda..ccd86dd 100644 --- a/amode.c +++ b/amode.c @@ -1,7 +1,7 @@ // // RMAC - Reboot's Macro Assembler for all Atari computers // AMODE.C - Addressing Modes -// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -61,19 +61,18 @@ WORD a1extension; // 020+ extension address word WORD am1_030; // ea bits for 020+ addressing modes int a2reg; // Register for div.l (68020+) -WORD mulmode; // to distinguish between 32 and 64 bit multiplications (68020+) int bfparam1; // bfxxx / fmove instruction parameter 1 int bfparam2; // bfxxx / fmove instruction parameter 2 -int bfval1; //bfxxx / fmove value 1 -int bfval2; //bfxxx / fmove value 2 +int bfval1; // bfxxx / fmove value 1 +int bfval2; // bfxxx / fmove value 2 TOKEN bf0expr[EXPRSIZE]; // Expression uint64_t bf0exval; // Expression's value WORD bf0exattr; // Expression's attribute SYM * bf0esym; // External symbol involved in expr // Function prototypes -int check030bf(void); +int Check030Bitfield(void); // @@ -133,7 +132,7 @@ int amode(int acount) // it's a bitfield instruction--check the parameters inside the {} block // for validity if (*tok == '{') - if (check030bf() == ERROR) + if (Check030Bitfield() == ERROR) return ERROR; if ((acount == 0) || (*tok != ',')) @@ -171,7 +170,7 @@ int amode(int acount) // It's a bitfield instruction--check the parameters inside the {} block // for validity if (*tok == '{') - if (check030bf() == ERROR) + if (Check030Bitfield() == ERROR) return ERROR; // At this point, it is legal for 020+ to have a ':'. For example divu.l @@ -185,26 +184,17 @@ int amode(int acount) tok++; //eat the colon if ((*tok >= KW_D0) && (*tok <= KW_D7)) - { - a2reg = (*tok - KW_D0); - mulmode = 1 << 10; - } + a2reg = (*tok++) & 7; else if ((*tok >= KW_FP0) && (*tok <= KW_FP7)) - { - a2reg = (*tok - KW_FP0); - mulmode = 1 << 10; - } + a2reg = (*tok++) & 7; else return error("a data or FPU register must follow a :"); - - *tok++; } else { // If no ':' is present then maybe we have something like divs.l d0,d1 // which sould translate to divs.l d0,d1:d1 a2reg = a1reg; - mulmode = 0; } nmodes = 2; @@ -213,9 +203,6 @@ int amode(int acount) // Error messages: badmode: return error("addressing mode syntax"); - - //unmode: - //return error("unimplemented addressing mode"); } @@ -330,8 +317,8 @@ int fpu_reglist_left(WORD * a_rmask) int fpu_reglist_right(WORD * a_rmask) { static WORD msktab_plus[] = { - 0x0001, 0x0002, 0x0004, 0x0008, - 0x0010, 0x0020, 0x0040, 0x0080 + 0x0080, 0x0040, 0x0020, 0x0010, + 0x0008, 0x0004, 0x0002, 0x0001 }; WORD rmask = 0; @@ -382,20 +369,20 @@ int fpu_reglist_right(WORD * a_rmask) // bfxxx {param1,param2} // param1/2 are either data registers or immediate values // -int check030bf(void) +int Check030Bitfield(void) { + PTR tp; CHECK00; tok++; if (*tok == CONST) { - tok++; - bfval1 = (int)*(uint64_t *)tok; + tp.u32 = tok + 1; + bfval1 = (int)*tp.u64++; + tok = tp.u32; // Do=0, offset=immediate - shift it to place bfparam1 = (0 << 11); - tok++; - tok++; } else if (*tok == SYMBOL) { @@ -420,8 +407,9 @@ int check030bf(void) else return ERROR; - if (*tok==':') - tok++; //eat the ':' + // Eat the ':', if any + if (*tok == ':') + tok++; if (*tok == '}' && tok[1] == EOL) { @@ -432,13 +420,12 @@ int check030bf(void) if (*tok == CONST) { - tok++; - bfval2 = (int)*(uint64_t *)tok; + tp.u32 = tok + 1; + bfval2 = (int)*tp.u64++; + tok = tp.u32; // Do=0, offset=immediate - shift it to place bfparam2 = (0 << 5); - tok++; - tok++; } else if (*tok == SYMBOL) { @@ -456,7 +443,7 @@ int check030bf(void) else if ((*tok >= KW_D0) && (*tok <= KW_D7)) { // Do=1, offset=data register - shift it to place - bfval2 = ((*(int *)tok - 128)); + bfval2 = (*(int *)tok - 128); bfparam2 = (1 << 5); tok++; }