示例#1
0
BOOL FASTCALL PreprocessInterrupt(int code)
{
    FUNC *func;
    U8 *oldPtr;

    GetNextWord();
    if(PRECOMPILING)
        return TRUE;

    if( (func=FindFunction(functions, szTemp)) == NULL || func->type != FUNCTYPE_INTERRUPT) {
        error(ERR_INTERRUPTNAMEEXP,szTemp);
        return FALSE;
    }

    if(FUNCFLAG_GETTYPE(func->flags) != code) {
        error(ERR_INTERRUPTTYPE, func->label, szIntTypes[code], szIntTypes[FUNCFLAG_GETTYPE(func->flags)]);
        return FALSE;
    }

    func->flags |= FUNCFLAG_USED;

    CheckRomBank();


    if(curBank->maxsize<6){//curBank->maxsize+curBank->org<0xFFFA) {
        error(ERR_CURBANKINTERRUPTSMALL,curBank->label);
        return TRUE;
    }

    oldPtr = curBank->ptr;

    curBank->end = curBank->buffer+curBank->maxsize-6;

    switch(code) {
    case PREPROCESS_INTERRUPT_NMI:
        //if(curBank->ptr > curBank->end-6)
        //      error(ERR_CURBANKINTERRUPTOVER,curBank->label);
        BankSeek(curBank->maxsize-6);//0xFFFA-curBank->org);
        break;
    case PREPROCESS_INTERRUPT_START:
        //if(curBank->ptr > curBank->end-4)
        //      error(ERR_CURBANKINTERRUPTOVER,curBank->label);
        BankSeekIntVect(curBank->maxsize-4);//0xFFFC-curBank->org);
        break;
    case PREPROCESS_INTERRUPT_IRQ:
        //if(curBank->ptr > curBank->end-2)
        //      error(ERR_CURBANKINTERRUPTOVER,curBank->label);
        BankSeekIntVect(curBank->maxsize-2);//0xFFFE-curBank->org);
        break;
    }
    AddFixOffs(FIXTYPE_FUNCTION,FIXOFFS_FAR,curBank->ptr,0,func);
    BankWriteIntVect(0);
    curBank->ptr = oldPtr;

    return TRUE;
}
示例#2
0
int FASTCALL CompileVarBody(U16 flags, S16 *brackCnt, VAR *var, int *_elementsSize, int braceCnt, int cast)
{
	int elementsSize, len;
    S32 num;
    VAR *childvar;
    S16 braceCntStart;
    int elementsStart;

    elementsSize = *_elementsSize;
                 
	if(!PRECOMPILING) {
    	elementsStart = elementsSize;
    }

	if(comProc_LabelDeclaration(flags, brackCnt)) {
	 	// catch the labels       
	    if(braceCnt) {
	     	if(GetNextWord()[0]=='}')
	        	braceCnt--;
	    }
	} else {
		if(var->cast == VARCAST_STRUCT) {
	        braceCntStart = braceCnt;
			if(szTemp[0]!='{') {
	        	error(ERR_STRUCTELEMENTBRACE,szTemp);
			} else {    
				GetNextWord();
	    		braceCnt++;
	        }
	        childvar = FindFirstVariable(var->childVars);
	        while(childvar) {
	        	braceCnt =
					CompileVarBody(flags|CF_VARCHILD,brackCnt, childvar, &elementsSize, braceCnt, childvar->cast);

	         	childvar = childvar->next;
	            if(childvar && !braceCnt) return 0;
	        }
			if(braceCntStart != braceCnt) {
	        	error(ERR_CLOSEBRACEEXP,var->label);
			}
            if(!PRECOMPILING)
            	var=var;
		} else if(szTemp[0]=='{' && var->arraySize) {
        	int arsize = var->arraySize;

	        braceCntStart = braceCnt;
            GetNextWord();
            braceCnt++;

	        childvar = CloneVar(var, curVar, 0);
            childvar->arraySize = 0;
	        do {
	        	braceCnt =
					CompileVarBody(flags|CF_VARCHILD,brackCnt, childvar, &elementsSize, braceCnt, childvar->cast);
            	arsize--;
	        } while(braceCnt && braceCnt > braceCntStart);

            FreeVars(&childvar);

			if(braceCntStart != braceCnt) {
	        	error(ERR_CLOSEBRACEEXP,var->label);
			}
			if(!PRECOMPILING && arsize < 0) {
             	error(ERR_ARRAYTOOLARGE,var->label);
            }
		} else if(szTemp[0]=='"') {
	    	if(varcasts[cast].size!=VARSIZE_BYTE)
	        	error(ERR_STRINGNOTBYTE,var->label);
	 		if(!DoString())
	    		return 0;
			if(!PRECOMPILING) {
            	len = lenSzStr;//(U16)strlen(szString);
                if(var->arraySize && len > var->arraySize) {
                 	len = var->arraySize;
                    szString[len?len-1:0] = '\0';
                    error(ERR_STRINGTOOLONG,szString);
                }
	        	BankWrite(szString,len);
                if(var->arraySize) {
                	BankFill(0,var->arraySize-len);
	        		elementsSize += var->arraySize;
                } else {
	        		elementsSize += len;
                }
	        }
		} else {
			CompileImmediateInteger(0, &num, -4, 0);
			if(!PRECOMPILING) {
            	if(strToInt_LabelObject) {
                 	// do the fixup
                    AddFixOffs(
                    	strToInt_LabelType,
                        (var->flags&VARFLAG_16BIT)?FIXOFFS_WORD:FIXOFFS_BYTE,
                        curBank->ptr,
                        0,
                        strToInt_LabelObject
                    );
                }
				if(var->flags&VARFLAG_16BIT) {
	    			WriteCodeW(num);
	        	    elementsSize += 2;
	    		} else {
	    			WriteCodeB(num);
	        	    elementsSize ++;
	        	}
	        }
		}
	    if(braceCnt) {
	     	if(GetNextWord()[0]=='}') {
	        	braceCnt--;
	        } else if(szTemp[0]!=',') {
	        	error(ERR_ARRAYCOMMAEXP,var->label);
	        } else {
	     		if(GetNextWord()[0]=='}') {
	        		braceCnt--;
	            }
	        }
	    }
	}

    if(!PRECOMPILING && (flags&CF_VARCHILD)) {
    	int amount = (elementsSize-elementsStart);
    	if(var->arraySize && amount < var->arraySize) {
    		BankFill(0,var->arraySize-amount);
    		elementsSize += var->arraySize-amount;
    	}
    }

	*_elementsSize = elementsSize;
	
	return braceCnt;
}