Skip to content

Commit

Permalink
Merge branch 'KevinCathcart-immedwarning'
Browse files Browse the repository at this point in the history
  • Loading branch information
RPGHacker committed May 10, 2018
2 parents 44899c6 + 6fe8356 commit 41f4cb7
Show file tree
Hide file tree
Showing 9 changed files with 39 additions and 8 deletions.
1 change: 1 addition & 0 deletions docs/changelog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ <h3>New features:</h3>
<li>Added <code class="65c816_asar">stringsequal()</code> and <code class="65c816_asar">stringsequalnocase()</code> functions. (RPG Hacker)</li>
<li>Added support for some built-in defines. Currently, <code class="65c816_asar">!assembler</code> and <code class="65c816_asar">!assembler_ver</code> are supported. Trying to modify those defines will throw an error. (RPG Hacker)</li>
<li>Added IDs to all warnings and errors, together with functionality to enable or disable specific warnings. (RPG Hacker)</li>
<li>Added a new optional warning that has to be enabled manually to throw warnings when opcodes are implicitly sized. (KevinCathcart)</li>
</ul>

<h3>Bug fixes:</h3>
Expand Down
4 changes: 2 additions & 2 deletions docs/manual/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3133,8 +3133,8 @@ <h4 id="disabled-warnings">Disabled Warnings</h4>
<th>Details</th>
</tr>
<tr>
<td><code></code></td>
<td></td>
<td><code>W1013</code></td>
<td>Thrown when opcodes are sized implicitly and Asar has to assume a size. An opcode is considered to be sized explicitly when either a length specifier is used or a simple hex constant that can be assumed to be of a specific size (that is, a hex constant with either two or four digits). Opcodes that don't support multiple sizes are always considered to be sized explicitly. Everything else is considered to be sized implicitly and will throw this warning when enabled.</td>
</tr>
</table>
<h4 id="warnings-push-pull">warnings {push/pull}</h4>
Expand Down
12 changes: 7 additions & 5 deletions src/asar/arch-65816.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,24 +31,26 @@ bool asblock_65816(char** word, int numwords)
autoptr<char*> parptr=par;
unsigned int num;
int len=0;//declared here for A->generic fallback
bool explicitlen = false;
bool hexconstant = false;
if(0);
else if (assemblemapper(word, numwords)) {}
#define getvars(optbank) num=(pass!=0)?getnum(par):0; if (word[0][3]=='.') { len=getlenfromchar(word[0][4]); word[0][3]='\0'; } else len=getlen(par, optbank)
#define getvars(optbank) num=(pass!=0)?getnum(par):0; hexconstant=is_hex_constant(par); if (word[0][3]=='.') { len=getlenfromchar(word[0][4]); explicitlen=true; word[0][3]='\0'; } else {len=getlen(par, optbank); explicitlen=false;}
#define match(left, right) (word[1] && stribegin(par, left) && striend(par, right))
#define init(left, right) itrim(par, left, right); getvars(false)
#define bankoptinit(left, right) itrim(par, left, right); getvars(true)
#define blankinit() len=1; num=0
#define blankinit() len=1; explicitlen=false; num=0
#define end() return false
#define as0( op, byte) if (is(op) ) { write1((unsigned int)byte); return true; }
#define as1( op, byte) if (is(op) && len==1) { write1((unsigned int)byte); write1(num); return true; }
#define as2( op, byte) if (is(op) && len==2) { write1((unsigned int)byte); write2(num); return true; } \
/*if (is(op) && len==3 && emulate) { write1(byte); write2(num); return true; }*/
#define as3( op, byte) if (is(op) && len==3) { write1((unsigned int)byte); write3(num); return true; }
//#define as23( op, byte) if (is(op) && (len==2 || len==3)) { write1(byte); write2(num); return true; }
#define as32( op, byte) if (is(op) && (len==2 || len==3)) { write1((unsigned int)byte); write3(num); return true; }
#define as_a( op, byte) if (is(op)) { if (len==1) { write1((unsigned int)byte); write1(num); } \
#define as32( op, byte) if (is(op) && ((len==2 && !explicitlen) || len==3)) { write1((unsigned int)byte); write3(num); return true; }
#define as_a( op, byte) if (is(op)) { if(!explicitlen && !hexconstant) asar_throw_warning(0, warning_id_implicitly_sized_immediate); if (len==1) { write1(byte); write1(num); } \
else { write1((unsigned int)byte); write2(num); } return true; }
#define as_xy( op, byte) if (is(op)) { if (len==1) { write1((unsigned int)byte); write1(num); } \
#define as_xy( op, byte) if (is(op)) { if(!explicitlen && !hexconstant) asar_throw_warning(0, warning_id_implicitly_sized_immediate); if (len==1) { write1(byte); write1(num); } \
else { write1((unsigned int)byte); write2(num); } return true; }
#define as_rep( op, byte) if (is(op)) { if (pass==0) num=getnum(par); for (unsigned int i=0;i<num;i++) { write1((unsigned int)byte); } return true; }
#define as_rel1(op, byte) if (is(op)) { int pos=(!foundlabel)?(int)num:(int)num-((snespos&0xFFFFFF)+2); write1((unsigned int)byte); write1((unsigned int)pos); \
Expand Down
1 change: 1 addition & 0 deletions src/asar/asar.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ extern int bytes;
int getlen(const char * str, bool optimizebankextraction=false);
unsigned int getnum(const char * str);
double getnumdouble(const char * str);
bool is_hex_constant(const char * str);

int getlenfromchar(char c);

Expand Down
14 changes: 14 additions & 0 deletions src/asar/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,20 @@ static int getlenforlabel(int insnespos, int thislabel, bool exists)

string posneglabelname(const char ** input, bool define);

bool is_hex_constant(const char* str){
if (*str=='$')
{
str++;
while(isxdigit(*str)) {
str++;
}
if(*str=='\0'){
return true;
}
}
return false;
}

int getlen(const char * orgstr, bool optimizebankextraction)
{
const char * str=orgstr;
Expand Down
2 changes: 2 additions & 0 deletions src/asar/warnings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ static asar_warning_mapping asar_warnings[] =

{ warning_id_warn_command, "warn command%s" },

{ warning_id_implicitly_sized_immediate, "Implicitly sized immediate.", false },

{ warning_id_xkas_deprecated, "xkas support is being deprecated and will be removed in a future version of Asar. Please use an older version of Asar (<=1.50) if you need it." },
{ warning_id_xkas_eat_parentheses, "xkas compatibility warning: Unlike xkas, Asar does not eat parentheses after defines." },
{ warning_id_xkas_label_access, "xkas compatibility warning: Label access is always 24bit in emulation mode, but may be 16bit in native mode." },
Expand Down
2 changes: 2 additions & 0 deletions src/asar/warnings.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ enum asar_warning_id : int

warning_id_warn_command,

warning_id_implicitly_sized_immediate,

warning_id_xkas_deprecated,
warning_id_xkas_eat_parentheses,
warning_id_xkas_label_access,
Expand Down
9 changes: 9 additions & 0 deletions tests/warn-immediate.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
;`+
;`29 78
;`warnW1013

warnings enable W1013

org $008000

and #120
2 changes: 1 addition & 1 deletion tests/xkasemu.asm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
;`warnW1013
;`warnW1014
;`53 54 41 52
;`21 61
;`BF 0A 80 00
Expand Down

0 comments on commit 41f4cb7

Please sign in to comment.