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

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';
}