#define FUNCTION_LABEL_INC 20
static int labelOffset=0;
-static int debug_verbose=1;
+static int debug_verbose=0;
/*-----------------------------------------------------------------*/
if (strcmp(d,s)) {
DEBUGemitcode(";","%d",__LINE__);
- emitcode("movf","%s,w",s);
+ if(strcmp(s,"W"))
+ emitcode("movf","%s,w",s);
emitcode("movwf","%s",d);
}
break;
case AOP_REG:
if (strcmp(aop->aopu.aop_reg[offset]->name,s) != 0 &&
strcmp(aop->aopu.aop_reg[offset]->dname,s)!= 0){
+ /*
if (*s == '@' ||
strcmp(s,"r0") == 0 ||
strcmp(s,"r1") == 0 ||
emitcode("mov","%s,%s ; %d",
aop->aopu.aop_reg[offset]->dname,s,__LINE__);
else
- emitcode("mov","%s,%s ; %d",
- aop->aopu.aop_reg[offset]->name,s,__LINE__);
+ */
+
+ if(strcmp(s,"W"))
+ emitcode("movf","%s,w ; %d",s,__LINE__);
+
+ emitcode("movwf","%s",
+ aop->aopu.aop_reg[offset]->name);
+
}
break;
DEBUGemitcode ("; ***","%s %d",__FUNCTION__,__LINE__);
- while (size--) {
- aopPut(AOP(oper),fReturn[offset],offset);
- offset++;
- }
+ // The last byte in the assignment is in W
+ aopPut(AOP(oper),"W",size-1);
+
+ if(size>1) {
+ while (--size) {
+ aopPut(AOP(oper),fReturn[offset],offset);
+ offset++;
+
+ }
+ }
}
for (i = (pic14_nRegs - 1) ; i >= 0 ;i--) {
if (options.useXstack) {
emitcode("movx","a,@%s",r->name);
- emitcode("mov","(%s+%d),a",
- regspic14[i].base,8*bank+regspic14[i].offset);
+ //emitcode("mov","(%s+%d),a",
+ // regspic14[i].base,8*bank+regspic14[i].offset);
emitcode("dec","%s",r->name);
} else
- emitcode("pop","(%s+%d)",
- regspic14[i].base,8*bank+regspic14[i].offset);
+ emitcode("pop",""); //"(%s+%d)",
+ //regspic14[i].base,8*bank); //+regspic14[i].offset);
}
if (options.useXstack) {
for (i = 0 ; i < pic14_nRegs ;i++) {
if (options.useXstack) {
emitcode("inc","%s",r->name);
- emitcode("mov","a,(%s+%d)",
- regspic14[i].base,8*bank+regspic14[i].offset);
+ //emitcode("mov","a,(%s+%d)",
+ // regspic14[i].base,8*bank+regspic14[i].offset);
emitcode("movx","@%s,a",r->name);
} else
- emitcode("push","(%s+%d)",
- regspic14[i].base,8*bank+regspic14[i].offset);
+ emitcode("push","");// "(%s+%d)",
+ //regspic14[i].base,8*bank+regspic14[i].offset);
}
if (pushPsw) {
while (size--) {
char *l = aopGet(AOP(IC_LEFT(sic)),offset,
FALSE,FALSE);
- DEBUGemitcode(";","%d",__LINE__);
+ DEBUGemitcode(";","%d - left type %d",__LINE__,AOP(IC_LEFT(sic))->type);
if (strcmp(l,fReturn[offset])) {
- if ( (AOP(IC_LEFT(sic))->type) == AOP_IMMD)
+ if ( ((AOP(IC_LEFT(sic))->type) == AOP_IMMD) ||
+ ((AOP(IC_LEFT(sic))->type) == AOP_LIT) )
emitcode("movlw","%s",l);
else
emitcode("movf","%s,w",l);
- emitcode("movwf","%s",fReturn[offset]);
+ // The last one is past in W
+ if(size)
+ emitcode("movwf","%s",fReturn[offset]);
}
offset++;
}
/* if (options.debug && currFunc) { */
if (currFunc) {
_G.debugLine = 1;
- emitcode(";","C_DS_%s_DS_%d_DS_%d_DS_%d ==.",
+ emitcode(";","C$%s$%d$%d$%d ==.",
ic->filename,currFunc->lastLine,
ic->level,ic->block);
if (IS_STATIC(currFunc->etype))
- emitcode(";","XF%s_DS_%s_DS_0_DS_0 ==.",moduleName,currFunc->name);
+ emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name);
else
- emitcode(";","XG_DS_%s_DS_0_DS_0 ==.",currFunc->name);
+ emitcode(";","XG$%s$0$0 ==.",currFunc->name);
_G.debugLine = 0;
}
/* if debug then send end of function */
if (currFunc) {
_G.debugLine = 1;
- emitcode(";","C_DS_%s_DS_%d_DS_%d_DS_%d ==.",
+ emitcode(";","C$%s$%d$%d$%d ==.",
ic->filename,currFunc->lastLine,
ic->level,ic->block);
if (IS_STATIC(currFunc->etype))
- emitcode(";","XF%s_DS_%s_DS_0_DS_0 ==.",moduleName,currFunc->name);
+ emitcode(";","XF%s$%s$0$0 ==.",moduleName,currFunc->name);
else
- emitcode(";","XG_DS_%s_DS_0_DS_0 ==.",currFunc->name);
+ emitcode(";","XG$%s$0$0 ==.",currFunc->name);
_G.debugLine = 0;
}
l = aopGet(AOP(IC_LEFT(ic)),offset,
FALSE,FALSE);
if (strcmp(fReturn[offset],l)) {
- if ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD)
+ if( ( (AOP(IC_LEFT(ic))->type) == AOP_IMMD) ||
+ ((AOP(IC_LEFT(ic))->type) == AOP_LIT) )
emitcode("movlw","%s",l);
else
emitcode("movf","%s,w",l);
- emitcode("movwf","%s",fReturn[offset++]);
+ if(size)
+ emitcode("movwf","%s",fReturn[offset]);
+ offset++;
}
}
}
else {
know_W = 0;
emitcode("incf","%s,w", aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
- emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
+ if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
+ emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
}
break;
case 0xff:
else {
know_W = 0;
emitcode("decf","%s,w", aopGet(AOP(IC_LEFT(ic)),offset,FALSE,FALSE));
- emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
+ if(AOP_TYPE(IC_RESULT(ic)) != AOP_ACC)
+ emitcode("movwf","%s", aopGet(AOP(IC_RESULT(ic)),offset,FALSE,FALSE));
}
break;
default:
if (sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) )
emitcode("addwf","%s,f", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
else {
- emitcode(";ic_left type","%d",AOP_TYPE(IC_LEFT(ic)));
- if(AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) {
+ if( (AOP_TYPE(IC_LEFT(ic)) == AOP_IMMD) ||
+ (AOP_TYPE(IC_LEFT(ic)) == AOP_LIT) ) {
emitcode("addlw","%s", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
} else {
emitcode("addwf","%s,w", aopGet(AOP(IC_LEFT(ic)),0,FALSE,FALSE));
emitcode("mov","b,%s + 1",aopGet(AOP(result),0,TRUE,FALSE));
}
else { /* we need to get it byte by byte */
- emitcode("movlw","%s",aopGet(AOP(result),0,FALSE,FALSE));
- emitcode("movwf","fsr");
-
- //emitcode("mov","dpl,%s",aopGet(AOP(result),0,FALSE,FALSE));
- //emitcode("mov","dph,%s",aopGet(AOP(result),1,FALSE,FALSE));
- //if (options.model == MODEL_FLAT24)
- //{
- // emitcode("mov", "dpx,%s",aopGet(AOP(result),2,FALSE,FALSE));
- // emitcode("mov","b,%s",aopGet(AOP(result),3,FALSE,FALSE));
- //}
- //else
- //{
- // emitcode("mov","b,%s",aopGet(AOP(result),2,FALSE,FALSE));
- //}
+ char *l = aopGet(AOP(result),0,FALSE,FALSE);
+ if(strcmp("FSR",l))
+ emitcode("movlw","%s",aopGet(AOP(result),0,FALSE,FALSE));
+
+ emitcode("movwf","INDF");
}
}
/* so dptr know contains the address */
size = AOP_SIZE(right);
offset = 0 ;
- while (size--) {
+ while (--size) {
char *l = aopGet(AOP(right),offset++,FALSE,FALSE);
- //emitcode("movf","%s,w",aopGet(AOP(right),offset++,FALSE,FALSE));
- emitcode("movwf","indf");
if(size)
emitcode("incf","fsr,f");
+ emitcode("movf","%s,w",aopGet(AOP(right),offset++,FALSE,FALSE));
+ emitcode("movwf","indf");
//MOVA(l);
//DEBUGemitcode(";lcall","__gptrput");
//if (size)
cdbSymbol(currFunc,cdbFile,FALSE,TRUE);
_G.debugLine = 1;
if (IS_STATIC(currFunc->etype))
- emitcode("",";F%s_DS_%s_DS_0_DS_0 %d",moduleName,currFunc->name,__LINE__);
+ emitcode("",";F%s$%s$0$0 %d",moduleName,currFunc->name,__LINE__);
else
- emitcode("",";G_DS_%s_DS_0_DS_0 %d",currFunc->name,__LINE__);
+ emitcode("",";G$%s$0$0 %d",currFunc->name,__LINE__);
_G.debugLine = 0;
}
if ( cln != ic->lineno ) {
if ( options.debug ) {
_G.debugLine = 1;
- emitcode("",";C_DS_%s_DS_%d_DS_%d_DS_%d ==.",
+ emitcode("",";C$%s$%d$%d$%d ==.",
ic->filename,ic->lineno,
ic->level,ic->block);
_G.debugLine = 0;