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 }
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_ }
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; }
/* 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; }
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_ }
int interrupt() { unsigned short A = host->registers[0]; return _interrupt(A); }
/* 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; }
static void DebugBreak(void) { _interrupt(3); }