You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.4 KiB
Dart
79 lines
1.4 KiB
Dart
class Comp {
|
|
static final Comp _singleton = Comp._internal();
|
|
int _pc;
|
|
int _acc;
|
|
Set<int> _loopTest;
|
|
int _swapJmp = -1;
|
|
int _swapNop = -1;
|
|
|
|
factory Comp() {
|
|
return _singleton;
|
|
}
|
|
|
|
// singleton's constructor
|
|
Comp._internal() {
|
|
reset();
|
|
}
|
|
|
|
void reset() {
|
|
_pc = 0;
|
|
_acc = 0;
|
|
_loopTest = {};
|
|
}
|
|
|
|
void swapJmp(int index) {
|
|
_swapJmp = index;
|
|
_swapNop = -1;
|
|
}
|
|
|
|
void swapNop(int index) {
|
|
_swapNop = index;
|
|
_swapJmp = -1;
|
|
}
|
|
|
|
int get pc => _pc;
|
|
int get acc => _acc;
|
|
|
|
bool execute(String command) {
|
|
var _newPC = _pc;
|
|
var _newAcc = _acc;
|
|
|
|
// print(command);
|
|
var parse = command.split(' ');
|
|
var _val = int.parse(parse[1]);
|
|
var instruction = parse[0];
|
|
if (_swapJmp >= 0 && _swapJmp == _pc) {
|
|
instruction = 'nop';
|
|
}
|
|
if (_swapNop >= 0 && _swapNop == _pc) {
|
|
instruction = 'jmp';
|
|
}
|
|
// print('$instruction:$_val pc=$_pc swpJmp=$_swapJmp swpNop=$_swapNop');
|
|
switch (instruction) {
|
|
case 'nop':
|
|
_newPC++;
|
|
break;
|
|
case 'acc':
|
|
_newAcc += _val;
|
|
_newPC++;
|
|
break;
|
|
case 'jmp':
|
|
_newPC += _val;
|
|
break;
|
|
default:
|
|
print('********** ERROR **********');
|
|
break;
|
|
}
|
|
if (_loopTest.contains(_newPC)) {
|
|
return false;
|
|
}
|
|
_pc = _newPC;
|
|
_acc = _newAcc;
|
|
_loopTest.add(_pc);
|
|
return true;
|
|
}
|
|
|
|
@override
|
|
String toString() => 'pc:$_pc -- acc:$_acc';
|
|
}
|