Пример #1
0
SOM_Scope void  SOMLINK ODLinkSpecGetOriginatingProcessID(ODLinkSpec *somSelf, Environment *ev,
                ProcessSerialNumber *psn)
{
    ODLinkSpecData *somThis = ODLinkSpecGetData(somSelf);
    ODLinkSpecMethodDebug("ODLinkSpec","GetProcessLaunchDate");

        #ifdef _PLATFORM_OS2_
        _interrupt( 3 );
        #else
        ProcessInfoRec info;

        info.processAppSpec = NULL;
        info.processName = NULL;
        info.processInfoLength = sizeof(info);

        if ( (GetProcessInformation(&_fProcessID, &info) == noErr) &&
                        (info.processLaunchDate == _fProcessLaunchDate) )
        {
                *psn = _fProcessID;
        }
        else
        {
                psn->lowLongOfPSN = kNoProcess;
                psn->highLongOfPSN = 0;
                ODSetSOMException(ev, kODErrCannotGetExternalLink);
        }
        #endif
}
Пример #2
0
SOM_Scope void  SOMLINK ODLinkSpecWriteToOSAEvent(ODLinkSpec *somSelf,
                                                   Environment *ev,
                                                  OSAEvent* theOSAEvent)
#endif
{
    ODLinkSpecData *somThis = ODLinkSpecGetData(somSelf);
    ODLinkSpecMethodDebug("ODLinkSpec","WriteToAppleEvent");

#ifdef _PLATFORM_OS2_ // CED
  _interrupt(3);
#endif

#ifdef _PLATFORM_MACINTOSH_
        SOM_TRY

        OSErr error;
        ODPart* part = somSelf->GetPart(ev);
        ODByteArray partData = somSelf->GetPartData(ev);

        ODULong version = kLinkSpecVersion;
        error = AEPutParamPtr((AppleEvent*) theAppleEvent, kODLinkSpecVersionKey, typeLongInteger,
                                                &version, sizeof(version));

        if ( error == noErr )
                error = AEPutParamPtr((AppleEvent*) theAppleEvent, keyProcessSerialNumber, typeProcessSerialNumber,
                                                        &_fProcessID, sizeof(_fProcessID));

        if ( error == noErr )
                error = AEPutParamPtr((AppleEvent*) theAppleEvent, kODProcessLaunchDateKey, typeLongInteger,
                                                        &_fProcessLaunchDate, sizeof(_fProcessLaunchDate));

        if ( error == noErr )
                error = AEPutParamPtr((AppleEvent*) theAppleEvent, kODSourcePartKey, typeLongInteger,
                                                        &part, sizeof(part));

        if ( error == noErr )
                error = AEPutParamPtr((AppleEvent*) theAppleEvent, kODLinkSpecDataSizeKey, typeLongInteger,
                                                        &partData._length, sizeof(ODULong));

        if ( (error == noErr) && (partData._length > 0) )
                error = AEPutParamPtr((AppleEvent*) theAppleEvent, kODLinkSpecDataKey, typeChar /* еее need better type here ееее */,
                                                        partData._buffer, partData._length);

        DisposeByteArrayStruct(partData);

        THROW_IF_ERROR(error);

        SOM_CATCH_ALL
        SOM_ENDTRY

#endif // _PLATFORM_MACINTOSH_

}
Пример #3
0
 int _interrupt(unsigned short A) {
     if (A == 0) {
         host->registers[1] = 0;
         //ERROR_NOT_IN_VACUUM might qualify as well, except I wouldn't know how a vacuum detector works in a lack of existance, so.....
         host->registers[2] = ERROR_UNKNOWN;
         //Perhaps I should use ERROR_MECHANICAL?
     } else if (A == 1) {
         unsigned short B = host->registers[1];
         skip = host->ram[B];
         for (int i = 1; i < 4; i++) {
             skip <<= 8;
             skip |= host->ram[(B+i)&0xFFFF];
         }
     } else if (A == 2) {
         int result = _interrupt(0);
         if (host->registers[1] == 1) {
             //FIRE! ..... how? this thing doesn't actually exist.....
         }
     } else if (A == 3)
         unit = host->registers[1];
     return 0;
 }
Пример #4
0
/*
	Executes the program
 */
unsigned int _sbi_run(void *rt)       // Runs a SBI program
												// Returns:
												// 					0: 	No errors
												// 					1: 	Reached end (no exit found)
												//					2: 	Program exited
												//					3: 	Wrong instruction code
												//					4: 	Can't understand byte
												//					5: 	User error
{
    if (!rt) return 5;

	RT(rt)->_exec = 1;
	
	byte rd = _getfch();
    byte var1, var1t, var2, var2t, var3, var3t;
    unsigned int i;
    byte b[16];

	switch (rd)
	{
		case _istr_assign:
			var1 = _getfch();
			RT(rt)->_t[var1] = _getfch();
			break;
		case _istr_move:
			var1 = _getfch();
			RT(rt)->_t[var1] = RT(rt)->_t[_getfch()];
			break;
		case _istr_add:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			RT(rt)->_t[_getfch()] = _getval(var1t, var1, rt) + _getval(var2t, var2, rt);
			break;
		case _istr_sub:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			RT(rt)->_t[_getfch()] = _getval(var1t, var1, rt) - _getval(var2t, var2, rt);
			break;
		case _istr_mul:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			RT(rt)->_t[_getfch()] = _getval(var1t, var1, rt) * _getval(var2t, var2, rt);
			break;
		case _istr_div:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			RT(rt)->_t[_getfch()] = _getval(var1t, var1, rt) / _getval(var2t, var2, rt);
			break;
		case _istr_incr:
			RT(rt)->_t[_getfch()]++;
			break;
		case _istr_decr:
			RT(rt)->_t[_getfch()]--;
			break;
		case _istr_inv:
			var1 = _getfch();
			if (RT(rt)->_t[var1]==0) RT(rt)->_t[var1]=1; else RT(rt)->_t[var1]=0;
			break;
		case _istr_tob:
			var1 = _getfch();
			if (RT(rt)->_t[var1]>0) RT(rt)->_t[var1]=1; else RT(rt)->_t[var1]=0;
			break;
		case _istr_cmp:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			if (_getval(var1t, var1, rt)==_getval(var2t, var2, rt)) RT(rt)->_t[_getfch()]=1; else RT(rt)->_t[_getfch()]=0;
			break;
		case _istr_high:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			if (_getval(var1t, var1, rt)>_getval(var2t, var2, rt)) RT(rt)->_t[_getfch()]=1; else RT(rt)->_t[_getfch()]=0;
			break;
		case _istr_low:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			if (_getval(var1t, var1, rt)<_getval(var2t, var2, rt)) RT(rt)->_t[_getfch()]=1; else RT(rt)->_t[_getfch()]=0;
			break;
		case _istr_jump:
			var1t = _getfch();
			var1 = _getfch();
			if (_getfch() > 0)
			{
				for (i=RETURNADDRESSESN-2; i>0; i--) RT(rt)->_returnaddresses[i+1] = RT(rt)->_returnaddresses[i];
				RT(rt)->_returnaddresses[1] = RT(rt)->_returnaddresses[0];
				RT(rt)->_returnaddresses[0] = _getfpos();
			}
			_setfpos(RT(rt)->_labels[_getval(var1t, var1, rt)]);
			break;
		case _istr_cmpjump:
			var1t = _getfch();
			var1 = _getfch();
			var2t = _getfch();
			var2 = _getfch();
			var3t = _getfch();
			var3 = _getfch();
			if (_getfch() > 0)
			{
				for (i=RETURNADDRESSESN-2; i>0; i--) RT(rt)->_returnaddresses[i+1] = RT(rt)->_returnaddresses[i];
				RT(rt)->_returnaddresses[1] = RT(rt)->_returnaddresses[0];
				RT(rt)->_returnaddresses[0] = _getfpos();
			}
			if (_getval(var1t, var1, rt)==_getval(var2t, var2, rt))
			{
				_setfpos(RT(rt)->_labels[_getval(var3t, var3, rt)]);
			}
			break;
		case _istr_ret:
			_setfpos(RT(rt)->_returnaddresses[0]);
			for (i=1; i<RETURNADDRESSESN; i++) RT(rt)->_returnaddresses[i-1] = RT(rt)->_returnaddresses[i];
			break;
		case _istr_debug:
			var1t = _getfch();
			_debug(_getval(var1t, _getfch(), rt));
			break;
		case _istr_error:
			var1t = _getfch();
			_error(_getval(var1t, _getfch(), rt));
			return 5;
			break;
		case _istr_sint:
			var1t = _getfch();
			RT(rt)->_userfid=_getval(var1t, _getfch(), rt);
			break;
		case _istr_int:
            {
			   for (i=0; i<16; i++) b[i] = _getfch();
			   RT(rt)->_userCtx->sbi_user_funcs[RT(rt)->_userfid](b,rt);
            }
			break;
		case _istr_exit:
			return 2;
			break;
		case FOOTER_0:
			if (_getfch()==FOOTER_1) return 1; else return 4;
		default:
			_error(0xB1);
			return 3;
			break;
	}
	
	RT(rt)->_exec = 0;
	
	if (RT(rt)->_intinqueue==1) _interrupt(RT(rt)->_queuedint, rt); // If there are interrupts in
																							// in the queue, do it
	
	return 0;
}
Пример #5
0
SOM_Scope void  SOMLINK ODLinkSpecReadFromOSAEvent(ODLinkSpec *somSelf,
                                                    Environment *ev,
                                                   OSAEvent* theOSAEvent)
#endif

{
    ODLinkSpecData *somThis = ODLinkSpecGetData(somSelf);
    ODLinkSpecMethodDebug("ODLinkSpec","ReadFromAppleEvent");

        #ifdef _PLATFORM_OS2_ // CED
        _interrupt(3);
        #endif // _PLATFORM_OS2_

        #ifdef _PLATFORM_MACINTOSH_

        SOM_CATCH return;

        /* Moved from somInit. SOM itself sets fields to zero
        _fProcessLaunchDate = 0;
        _fProcessID.lowLongOfPSN = kNoProcess;
        _fProcessID.highLongOfPSN = 0;
        */

        OSErr                           result;
        DescType                        returnedType;
        Size                            actualSize;
        ODPart*                         part;
        ODByteArray                     partData;
        ProcessSerialNumber processID;
        ODULong                         processLaunchDate;
        ODULong                         dataSize;

        result = AEGetParamPtr((AppleEvent*) theAppleEvent, keyProcessSerialNumber, typeProcessSerialNumber, &returnedType,
                                                        &processID, sizeof(processID), &actualSize);
        THROW_IF_ERROR(result);

        result = AEGetParamPtr((AppleEvent*) theAppleEvent, kODProcessLaunchDateKey, typeLongInteger, &returnedType,
                                                        &processLaunchDate, sizeof(processLaunchDate), &actualSize);
        THROW_IF_ERROR(result);

        result = AEGetParamPtr((AppleEvent*) theAppleEvent, kODSourcePartKey, typeLongInteger, &returnedType,
                                                        &part, sizeof(part), &actualSize);
        THROW_IF_ERROR(result);

        result = AEGetParamPtr((AppleEvent*) theAppleEvent, kODLinkSpecDataSizeKey, typeLongInteger, &returnedType,
                                                        &dataSize, sizeof(ODULong), &actualSize);
        THROW_IF_ERROR(result);

        partData = CreateEmptyByteArrayStruct(dataSize);

        TRY
                if ( dataSize > 0 )
                {
                        result = AEGetParamPtr((AppleEvent*) theAppleEvent, kODLinkSpecDataKey, typeChar, &returnedType,
                                                                        partData._buffer, dataSize, &actualSize);
                        THROW_IF_ERROR(result);
                        partData._length = dataSize;
                }
                somSelf->InitBaseLinkSpec(ev, part, &partData);
        CATCH_ALL
                DisposeByteArrayStruct(partData);
                RERAISE;
        ENDTRY

        DisposeByteArrayStruct(partData);

        _fProcessID = processID;
        _fProcessLaunchDate = processLaunchDate;
        #endif // _PLATFORM_MACINTOSH_
}
Пример #6
0
 int interrupt() {
     unsigned short A = host->registers[0];
     return _interrupt(A);
 }
Пример #7
0
Файл: sbi.c Проект: BrooksEE/sbi
/*
	Executes the program
 */
byte _sbi_run(void) // Runs a SBI program
												// Returns:
												// 					0: 	No errors
												// 					1: 	Reached end (no exit found)
												//					2: 	Program exited
												//					3: 	Wrong instruction code
												//					4: 	Can't understand byte
												//					5: 	User error
{
	_exec = 1;
	
	rd = (*_getfch)();
	switch (rd)
	{
		case _istr_assign:
			var1 = (*_getfch)();
			_t[var1] = (*_getfch)();
			break;
		case _istr_move:
			var1 = (*_getfch)();
			_t[var1] = _t[(*_getfch)()];
			break;
		case _istr_add:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			_t[(*_getfch)()] = _getval(var1t, var1) + _getval(var2t, var2);
			break;
		case _istr_sub:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			_t[(*_getfch)()] = _getval(var1t, var1) - _getval(var2t, var2);
			break;
		case _istr_mul:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			_t[(*_getfch)()] = _getval(var1t, var1) * _getval(var2t, var2);
			break;
		case _istr_div:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			_t[(*_getfch)()] = _getval(var1t, var1) / _getval(var2t, var2);
			break;
		case _istr_incr:
			_t[(*_getfch)()]++;
			break;
		case _istr_decr:
			_t[(*_getfch)()]--;
			break;
		case _istr_inv:
			var1 = (*_getfch)();
			if (_t[var1]==0) _t[var1]=1; else _t[var1]=0;
			break;
		case _istr_tob:
			var1 = (*_getfch)();
			if (_t[var1]>0) _t[var1]=1; else _t[var1]=0;
			break;
		case _istr_cmp:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			if (_getval(var1t, var1)==_getval(var2t, var2)) _t[(*_getfch)()]=1; else _t[(*_getfch)()]=0;
			break;
		case _istr_high:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			if (_getval(var1t, var1)>_getval(var2t, var2)) _t[(*_getfch)()]=1; else _t[(*_getfch)()]=0;
			break;
		case _istr_low:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			if (_getval(var1t, var1)<_getval(var2t, var2)) _t[(*_getfch)()]=1; else _t[(*_getfch)()]=0;
			break;
		case _istr_jump:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			if ((*_getfch)() > 0)
			{
				for (i=RETURNADDRESSESN-2; i>0; i--) _returnaddresses[i+1] = _returnaddresses[i];
				_returnaddresses[1] = _returnaddresses[0];
				_returnaddresses[0] = (*_getfpos)();
			}
			(*_setfpos)(_labels[_getval(var1t, var1)]);
			break;
		case _istr_cmpjump:
			var1t = (*_getfch)();
			var1 = (*_getfch)();
			var2t = (*_getfch)();
			var2 = (*_getfch)();
			var3t = (*_getfch)();
			var3 = (*_getfch)();
			if ((*_getfch)() > 0)
			{
				for (i=RETURNADDRESSESN-2; i>0; i--) _returnaddresses[i+1] = _returnaddresses[i];
				_returnaddresses[1] = _returnaddresses[0];
				_returnaddresses[0] = (*_getfpos)();
			}
			if (_getval(var1t, var1)==_getval(var2t, var2))
			{
				(*_setfpos)(_labels[_getval(var3t, var3)]);
			}
			break;
		case _istr_ret:
			(*_setfpos)(_returnaddresses[0]);
			for (i=1; i<RETURNADDRESSESN; i++) _returnaddresses[i-1] = _returnaddresses[i];
			break;
		case _istr_debug:
			var1t = (*_getfch)();
			_debug(_getval(var1t, (*_getfch)()));
			break;
		case _istr_error:
			var1t = (*_getfch)();
			_error(_getval(var1t, (*_getfch)()));
			return 5;
			break;
		case _istr_sint:
			var1t = (*_getfch)();
			_userfid=_getval(var1t, (*_getfch)());
			break;
		case _istr_int:
			for (i=0; i<16; i++) b[i] = (*_getfch)();
			_sbifuncs[_userfid](b);
			break;
		case _istr_exit:
			return 2;
			break;
		case FOOTER_0:
			if ((*_getfch)()==FOOTER_1) return 1; else return 4;
		default:
			_error(0xB1);
			return 3;
			break;
	}
	
	_exec = 0;
	
	if (_intinqueue==1) _interrupt(_queuedint); // If there are interrupts in
																							// in the queue, do it
	
	return 0;
}
Пример #8
0
static void DebugBreak(void) { _interrupt(3); }