/* builtInFunsSD_68000.c -- Code for target-processor dependent intrinsic user callable functions in the Macross assembler. (68000 version). Chip Morningstar -- Lucasfilm Ltd. 26-April-1985 */ #include "macrossTypes.h" #include "macrossGlobals.h" /* Helper functions, defined in builtInFunctions.c */ valueType *makeBooleanValue(); valueType *makeFailureValue(); valueType *makeIntegerValue(); valueType *makeOperandValue(); valueType *makeStringValue(); valueType *makeUndefinedValue(); /* Get address register component of operand */ valueType * getAddressRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeIntegerValue(getAddressRegister( evaluatedParameter->addressMode))); } else { return(makeBooleanValue(FALSE)); } } /* Get data register component of operand */ valueType * getDataRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeIntegerValue(getDataRegister(evaluatedParameter-> addressMode))); } else { return(makeBooleanValue(FALSE)); } } /* Get index register component of operand */ valueType * getIndexRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeIntegerValue(getIndexRegister(evaluatedParameter-> addressMode))); } else { return(makeBooleanValue(FALSE)); } } /* Get register component of operand */ valueType * getRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeIntegerValue(getRegister(evaluatedParameter-> addressMode))); } else { return(makeBooleanValue(FALSE)); } } /* Get word/long component of operand */ valueType * getWLBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeIntegerValue(getWL(evaluatedParameter-> addressMode))); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is absolute */ valueType * isAbsoluteModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == ABSOLUTE_SHORT_OPND || operandKindField(evaluatedParameter->addressMode) == ABSOLUTE_LONG_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is absolute long */ valueType * isAbsoluteLongModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == ABSOLUTE_LONG_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is absolute short */ valueType * isAbsoluteShortModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == ABSOLUTE_SHORT_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is an address register */ valueType * isARegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == A_REGISTER_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is the condition code register */ valueType * isCCRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == CC_REGISTER_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is a control register */ valueType * isControlRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == CONTROL_REGISTER_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is a data register */ valueType * isDRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == D_REGISTER_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is DFC register */ valueType * isDFCRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == CONTROL_REGISTER_OPND && getRegister(evaluatedParameter->addressMode) == DFC_REGISTER)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is displacement */ valueType * isDisplacementModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == DISPLACEMENT_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is IMMEDIATE */ valueType * isImmediateModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == IMMEDIATE_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is indexed */ valueType * isIndexedModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == INDEXED_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is indirect */ valueType * isIndirectModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == A_REGISTER_INDIRECT_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is pc displacement */ valueType * isPCDisplacementModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == PC_DISPLACEMENT_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is pc indexed */ valueType * isPCIndexedModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == PC_INDEXED_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is postincrement */ valueType * isPostincrementModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == POSTINCREMENT_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if an operand's address mode is predecrement */ valueType * isPredecrementModeBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == PREDECREMENT_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is SFC register */ valueType * isSFCRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == CONTROL_REGISTER_OPND && getRegister(evaluatedParameter->addressMode) == SFC_REGISTER)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is the status register */ valueType * isStatusRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == STATUS_REGISTER_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is user stack pointer */ valueType * isUSPBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == USP_REGISTER_OPND)); } else { return(makeBooleanValue(FALSE)); } } /* Check if operand is VB register */ valueType * isVBRegisterBIF(parameterList, kindOfFixup) operandListType *parameterList; fixupKindType kindOfFixup; { valueType *evaluatedParameter; valueType *evaluateOperand(); if (parameterList != NULL) { evaluatedParameter = evaluateOperand(parameterList, NO_FIXUP); return(makeBooleanValue(operandKindField(evaluatedParameter-> addressMode) == CONTROL_REGISTER_OPND && getRegister(evaluatedParameter->addressMode) == VBR_REGISTER)); } else { return(makeBooleanValue(FALSE)); } }