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; }
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; }