macross/builtInFunsSD_68000.c
2016-01-21 22:02:21 +01:00

527 lines
14 KiB
C

/*
* Copyright (c) 1987 Fujitsu
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/*
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));
}
}