Make Edits persist after reload
This commit is contained in:
parent
de10d8968b
commit
1701a5ea08
@ -127,6 +127,8 @@ button {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
position: relative;
|
position: relative;
|
||||||
|
/*top: 0;
|
||||||
|
left: 0;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
.pc .section h1.header {
|
.pc .section h1.header {
|
||||||
@ -146,7 +148,7 @@ button {
|
|||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
|
|
||||||
position: relative;
|
/*position: relative;*/
|
||||||
|
|
||||||
/* max-height: 60%; */
|
/* max-height: 60%; */
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@ -246,12 +248,12 @@ th.address {
|
|||||||
.pc .controls .checker {
|
.pc .controls .checker {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding-left: 3.5em;
|
padding-left: 3em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pc .controls .checker label {
|
.pc .controls .checker label {
|
||||||
display: inline;
|
display: inline;
|
||||||
font-size: 0.8em;
|
/*font-size: 0.8em;*/
|
||||||
white-space: initial;
|
white-space: initial;
|
||||||
white-space: break-spaces;
|
white-space: break-spaces;
|
||||||
text-transform: none;
|
text-transform: none;
|
||||||
@ -385,7 +387,7 @@ th.address {
|
|||||||
|
|
||||||
.pc .databus,
|
.pc .databus,
|
||||||
.pc .addressbus{
|
.pc .addressbus{
|
||||||
position: relative;
|
/*position: relative;*/
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
372
out/elm.js
372
out/elm.js
@ -5181,9 +5181,9 @@ var $author$project$Main$MsgLocalSessionRecieve = function (a) {
|
|||||||
return {$: 'MsgLocalSessionRecieve', a: a};
|
return {$: 'MsgLocalSessionRecieve', a: a};
|
||||||
};
|
};
|
||||||
var $elm$json$Json$Decode$string = _Json_decodeString;
|
var $elm$json$Json$Decode$string = _Json_decodeString;
|
||||||
var $author$project$Main$recieveLocalSession = _Platform_incomingPort('recieveLocalSession', $elm$json$Json$Decode$string);
|
var $author$project$Main$localStorageRecieve = _Platform_incomingPort('localStorageRecieve', $elm$json$Json$Decode$string);
|
||||||
var $author$project$Main$subscriptions = function (model) {
|
var $author$project$Main$subscriptions = function (model) {
|
||||||
return $author$project$Main$recieveLocalSession($author$project$Main$MsgLocalSessionRecieve);
|
return $author$project$Main$localStorageRecieve($author$project$Main$MsgLocalSessionRecieve);
|
||||||
};
|
};
|
||||||
var $elm$core$List$append = F2(
|
var $elm$core$List$append = F2(
|
||||||
function (xs, ys) {
|
function (xs, ys) {
|
||||||
@ -5390,6 +5390,32 @@ var $author$project$Main$changeAtUCode = F3(
|
|||||||
function (pos, newVal, list) {
|
function (pos, newVal, list) {
|
||||||
return A4($author$project$Main$changeAt, pos, newVal, $author$project$Main$ActNothing, list);
|
return A4($author$project$Main$changeAt, pos, newVal, $author$project$Main$ActNothing, list);
|
||||||
});
|
});
|
||||||
|
var $elm$json$Json$Encode$bool = _Json_wrap;
|
||||||
|
var $elm$json$Json$Encode$int = _Json_wrap;
|
||||||
|
var $elm$json$Json$Encode$list = F2(
|
||||||
|
function (func, entries) {
|
||||||
|
return _Json_wrap(
|
||||||
|
A3(
|
||||||
|
$elm$core$List$foldl,
|
||||||
|
_Json_addEntry(func),
|
||||||
|
_Json_emptyArray(_Utils_Tuple0),
|
||||||
|
entries));
|
||||||
|
});
|
||||||
|
var $author$project$Main$modelVersion = 1;
|
||||||
|
var $elm$json$Json$Encode$object = function (pairs) {
|
||||||
|
return _Json_wrap(
|
||||||
|
A3(
|
||||||
|
$elm$core$List$foldl,
|
||||||
|
F2(
|
||||||
|
function (_v0, obj) {
|
||||||
|
var k = _v0.a;
|
||||||
|
var v = _v0.b;
|
||||||
|
return A3(_Json_addField, k, v, obj);
|
||||||
|
}),
|
||||||
|
_Json_emptyObject(_Utils_Tuple0),
|
||||||
|
pairs));
|
||||||
|
};
|
||||||
|
var $elm$json$Json$Encode$string = _Json_wrap;
|
||||||
var $elm$core$List$filter = F2(
|
var $elm$core$List$filter = F2(
|
||||||
function (isGood, list) {
|
function (isGood, list) {
|
||||||
return A3(
|
return A3(
|
||||||
@ -5411,6 +5437,184 @@ var $elm$core$List$head = function (list) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
var $author$project$Main$ActAccumulatorDecrement = {$: 'ActAccumulatorDecrement'};
|
var $author$project$Main$ActAccumulatorDecrement = {$: 'ActAccumulatorDecrement'};
|
||||||
|
var $author$project$Main$uCodeIds = _List_fromArray(
|
||||||
|
[
|
||||||
|
_Utils_Tuple2($author$project$Main$ActAccumulator2DataBus, 'acc2db'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActAccumulatorDecrement, 'accDec'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActAccumulatorIncrement, 'accInc'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActDataBus2Accumulator, 'db2acc'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActDataBus2InstructionReg, 'db2ir'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActDataBus2Ram, 'db2ram'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActInstructionReg2AddressBus, 'ir2ab'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActInstructionReg2ProgrammCounter, 'ir2pc'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActInstructionReg2UCounter, 'ir2uc'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActProgrammCounterIncrement, 'pcInc'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActRam2DataBus, 'ram2db'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActResetUCounter, 'ucReset'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActProgrammCounter2AddressBus, 'pc2ab'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActNothing, 'n')
|
||||||
|
]);
|
||||||
|
var $author$project$Main$uAction2String = function (action) {
|
||||||
|
var filtered_list = A2(
|
||||||
|
$elm$core$List$filter,
|
||||||
|
function (s) {
|
||||||
|
return _Utils_eq(s.a, action);
|
||||||
|
},
|
||||||
|
$author$project$Main$uCodeIds);
|
||||||
|
var _v0 = $elm$core$List$head(filtered_list);
|
||||||
|
if (_v0.$ === 'Just') {
|
||||||
|
var _v1 = _v0.a;
|
||||||
|
var info = _v1.b;
|
||||||
|
return info;
|
||||||
|
} else {
|
||||||
|
return 'IDK';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var $author$project$Main$encodeModel = function (model) {
|
||||||
|
return A2(
|
||||||
|
$elm$json$Json$Encode$encode,
|
||||||
|
0,
|
||||||
|
$elm$json$Json$Encode$object(
|
||||||
|
_List_fromArray(
|
||||||
|
[
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'model-version',
|
||||||
|
$elm$json$Json$Encode$int($author$project$Main$modelVersion)),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'pc',
|
||||||
|
$elm$json$Json$Encode$object(
|
||||||
|
_List_fromArray(
|
||||||
|
[
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'addressBus',
|
||||||
|
$elm$json$Json$Encode$int(model.pc.addressBus)),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'dataBus',
|
||||||
|
$elm$json$Json$Encode$int(model.pc.dataBus)),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'instructionReg',
|
||||||
|
$elm$json$Json$Encode$int(model.pc.instructionReg)),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'programmCounter',
|
||||||
|
$elm$json$Json$Encode$int(model.pc.programmCounter)),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'uCounter',
|
||||||
|
$elm$json$Json$Encode$int(model.pc.uCounter)),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'accumulator',
|
||||||
|
$elm$json$Json$Encode$int(model.pc.accumulator)),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'ram',
|
||||||
|
A2($elm$json$Json$Encode$list, $elm$json$Json$Encode$int, model.pc.ram))
|
||||||
|
]))),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'uCode',
|
||||||
|
A2(
|
||||||
|
$elm$json$Json$Encode$list,
|
||||||
|
$elm$json$Json$Encode$string,
|
||||||
|
A2($elm$core$List$map, $author$project$Main$uAction2String, model.uCode))),
|
||||||
|
_Utils_Tuple2(
|
||||||
|
'autoscroll',
|
||||||
|
$elm$json$Json$Encode$bool(model.autoscroll))
|
||||||
|
])));
|
||||||
|
};
|
||||||
|
var $author$project$Main$localStorageSend = _Platform_outgoingPort('localStorageSend', $elm$json$Json$Encode$string);
|
||||||
|
var $author$project$Main$cmdUpdateLocalStorage = function (model) {
|
||||||
|
return $author$project$Main$localStorageSend(
|
||||||
|
$author$project$Main$encodeModel(model));
|
||||||
|
};
|
||||||
|
var $author$project$Main$sendUUpdate = _Platform_outgoingPort('sendUUpdate', $elm$json$Json$Encode$string);
|
||||||
|
var $author$project$Main$cmdSenduUpdate = function (model) {
|
||||||
|
return $elm$core$Platform$Cmd$batch(
|
||||||
|
_List_fromArray(
|
||||||
|
[
|
||||||
|
$author$project$Main$cmdUpdateLocalStorage(model),
|
||||||
|
$author$project$Main$sendUUpdate('update')
|
||||||
|
]));
|
||||||
|
};
|
||||||
|
var $elm$json$Json$Decode$bool = _Json_decodeBool;
|
||||||
|
var $elm$json$Json$Decode$decodeString = _Json_runOnString;
|
||||||
|
var $elm$json$Json$Decode$field = _Json_decodeField;
|
||||||
|
var $elm$json$Json$Decode$int = _Json_decodeInt;
|
||||||
|
var $elm$json$Json$Decode$list = _Json_decodeList;
|
||||||
|
var $elm$json$Json$Decode$map3 = _Json_map3;
|
||||||
|
var $elm$json$Json$Decode$map7 = _Json_map7;
|
||||||
|
var $elm$core$Tuple$second = function (_v0) {
|
||||||
|
var y = _v0.b;
|
||||||
|
return y;
|
||||||
|
};
|
||||||
|
var $author$project$Main$string2uAction = function (msg) {
|
||||||
|
var filtered_list = A2(
|
||||||
|
$elm$core$List$filter,
|
||||||
|
function (s) {
|
||||||
|
return _Utils_eq(s.b, msg);
|
||||||
|
},
|
||||||
|
$author$project$Main$uCodeIds);
|
||||||
|
var _v0 = $elm$core$List$head(filtered_list);
|
||||||
|
if (_v0.$ === 'Just') {
|
||||||
|
var _v1 = _v0.a;
|
||||||
|
var action = _v1.a;
|
||||||
|
return $elm$core$Maybe$Just(action);
|
||||||
|
} else {
|
||||||
|
return $elm$core$Maybe$Nothing;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var $elm$core$Maybe$withDefault = F2(
|
||||||
|
function (_default, maybe) {
|
||||||
|
if (maybe.$ === 'Just') {
|
||||||
|
var value = maybe.a;
|
||||||
|
return value;
|
||||||
|
} else {
|
||||||
|
return _default;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var $author$project$Main$decodeModel = function (text) {
|
||||||
|
var uCodeDecoder = A2(
|
||||||
|
$elm$json$Json$Decode$map,
|
||||||
|
function (s) {
|
||||||
|
return A2(
|
||||||
|
$elm$core$Maybe$withDefault,
|
||||||
|
$author$project$Main$ActNothing,
|
||||||
|
$author$project$Main$string2uAction(s));
|
||||||
|
},
|
||||||
|
$elm$json$Json$Decode$string);
|
||||||
|
var error2maybe = function (err) {
|
||||||
|
if (err.$ === 'Ok') {
|
||||||
|
var val = err.a;
|
||||||
|
return $elm$core$Maybe$Just(val);
|
||||||
|
} else {
|
||||||
|
return $elm$core$Maybe$Nothing;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return error2maybe(
|
||||||
|
A2(
|
||||||
|
$elm$json$Json$Decode$decodeString,
|
||||||
|
A4(
|
||||||
|
$elm$json$Json$Decode$map3,
|
||||||
|
$author$project$Main$Model,
|
||||||
|
A2(
|
||||||
|
$elm$json$Json$Decode$field,
|
||||||
|
'pc',
|
||||||
|
A8(
|
||||||
|
$elm$json$Json$Decode$map7,
|
||||||
|
$author$project$Main$PC,
|
||||||
|
A2(
|
||||||
|
$elm$json$Json$Decode$field,
|
||||||
|
'ram',
|
||||||
|
$elm$json$Json$Decode$list($elm$json$Json$Decode$int)),
|
||||||
|
A2($elm$json$Json$Decode$field, 'dataBus', $elm$json$Json$Decode$int),
|
||||||
|
A2($elm$json$Json$Decode$field, 'addressBus', $elm$json$Json$Decode$int),
|
||||||
|
A2($elm$json$Json$Decode$field, 'instructionReg', $elm$json$Json$Decode$int),
|
||||||
|
A2($elm$json$Json$Decode$field, 'programmCounter', $elm$json$Json$Decode$int),
|
||||||
|
A2($elm$json$Json$Decode$field, 'uCounter', $elm$json$Json$Decode$int),
|
||||||
|
A2($elm$json$Json$Decode$field, 'accumulator', $elm$json$Json$Decode$int))),
|
||||||
|
A2(
|
||||||
|
$elm$json$Json$Decode$field,
|
||||||
|
'uCode',
|
||||||
|
$elm$json$Json$Decode$list(uCodeDecoder)),
|
||||||
|
A2($elm$json$Json$Decode$field, 'autoscroll', $elm$json$Json$Decode$bool)),
|
||||||
|
text));
|
||||||
|
};
|
||||||
var $author$project$Main$actAccumulator2DataBus = function (pc) {
|
var $author$project$Main$actAccumulator2DataBus = function (pc) {
|
||||||
return _Utils_update(
|
return _Utils_update(
|
||||||
pc,
|
pc,
|
||||||
@ -5549,45 +5753,6 @@ var $author$project$Main$getAction = function (uAction) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
var $elm$core$Basics$not = _Basics_not;
|
var $elm$core$Basics$not = _Basics_not;
|
||||||
var $elm$json$Json$Encode$string = _Json_wrap;
|
|
||||||
var $author$project$Main$sendUUpdate = _Platform_outgoingPort('sendUUpdate', $elm$json$Json$Encode$string);
|
|
||||||
var $elm$core$Tuple$second = function (_v0) {
|
|
||||||
var y = _v0.b;
|
|
||||||
return y;
|
|
||||||
};
|
|
||||||
var $author$project$Main$uCodeDescriptions = _List_fromArray(
|
|
||||||
[
|
|
||||||
_Utils_Tuple2($author$project$Main$ActAccumulator2DataBus, 'Acc -> DataBus'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActAccumulatorDecrement, 'Acc --'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActAccumulatorIncrement, 'Acc ++'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActDataBus2Accumulator, 'DataBus -> Acc'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActDataBus2InstructionReg, 'DataBus -> InstReg'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActDataBus2Ram, 'DataBus -> Ram'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActInstructionReg2AddressBus, 'InstReg -> AddrBus'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActInstructionReg2ProgrammCounter, 'InstReg -> ProgCount'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActInstructionReg2UCounter, 'InstReg -> µCounter'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActProgrammCounterIncrement, 'ProgCounter ++'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActRam2DataBus, 'Ram -> DataBus'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActResetUCounter, 'µCounter = 0'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActProgrammCounter2AddressBus, 'ProgCounter -> AddrBus'),
|
|
||||||
_Utils_Tuple2($author$project$Main$ActNothing, 'Empty')
|
|
||||||
]);
|
|
||||||
var $author$project$Main$string2uAction = function (msg) {
|
|
||||||
var filtered_list = A2(
|
|
||||||
$elm$core$List$filter,
|
|
||||||
function (s) {
|
|
||||||
return _Utils_eq(s.b, msg);
|
|
||||||
},
|
|
||||||
$author$project$Main$uCodeDescriptions);
|
|
||||||
var _v0 = $elm$core$List$head(filtered_list);
|
|
||||||
if (_v0.$ === 'Just') {
|
|
||||||
var _v1 = _v0.a;
|
|
||||||
var action = _v1.a;
|
|
||||||
return $elm$core$Maybe$Just(action);
|
|
||||||
} else {
|
|
||||||
return $elm$core$Maybe$Nothing;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var $author$project$Main$uStepPC = function (model) {
|
var $author$project$Main$uStepPC = function (model) {
|
||||||
var uCounter = model.pc.uCounter;
|
var uCounter = model.pc.uCounter;
|
||||||
var may_instruction = A2($author$project$Main$valueAt, uCounter, model.uCode);
|
var may_instruction = A2($author$project$Main$valueAt, uCounter, model.uCode);
|
||||||
@ -5628,36 +5793,36 @@ var $author$project$Main$uStepPC = function (model) {
|
|||||||
};
|
};
|
||||||
var $author$project$Main$update = F2(
|
var $author$project$Main$update = F2(
|
||||||
function (msg, model) {
|
function (msg, model) {
|
||||||
|
var updateModel = function (new_model) {
|
||||||
|
return _Utils_Tuple2(
|
||||||
|
new_model,
|
||||||
|
$author$project$Main$cmdUpdateLocalStorage(new_model));
|
||||||
|
};
|
||||||
switch (msg.$) {
|
switch (msg.$) {
|
||||||
case 'MsgUCycleStep':
|
case 'MsgUCycleStep':
|
||||||
return _Utils_Tuple2(
|
return _Utils_Tuple2(
|
||||||
$author$project$Main$uStepPC(model),
|
$author$project$Main$uStepPC(model),
|
||||||
$author$project$Main$sendUUpdate('uCycle updated'));
|
$author$project$Main$cmdSenduUpdate(model));
|
||||||
case 'MsgInstructionStep':
|
case 'MsgInstructionStep':
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
case 'MsgReset':
|
case 'MsgReset':
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{
|
{
|
||||||
pc: _Utils_update(
|
pc: _Utils_update(
|
||||||
$author$project$Main$initialPC,
|
$author$project$Main$initialPC,
|
||||||
{ram: model.pc.ram})
|
{ram: model.pc.ram})
|
||||||
}),
|
}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
case 'MsgLocalSessionRecieve':
|
|
||||||
var message_in = msg.a;
|
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
|
||||||
case 'MsgManualStep':
|
case 'MsgManualStep':
|
||||||
var action = msg.a;
|
var action = msg.a;
|
||||||
var instruction = $author$project$Main$getAction(action);
|
var instruction = $author$project$Main$getAction(action);
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{
|
{
|
||||||
pc: instruction(model.pc)
|
pc: instruction(model.pc)
|
||||||
}),
|
}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
case 'MsgRamEditAddress':
|
case 'MsgRamEditAddress':
|
||||||
var addr = msg.a;
|
var addr = msg.a;
|
||||||
var may_int = msg.b;
|
var may_int = msg.b;
|
||||||
@ -5674,11 +5839,10 @@ var $author$project$Main$update = F2(
|
|||||||
{
|
{
|
||||||
ram: A3($author$project$Main$changeAtInt, addr, new_val, old_pc.ram)
|
ram: A3($author$project$Main$changeAtInt, addr, new_val, old_pc.ram)
|
||||||
});
|
});
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
@ -5698,11 +5862,10 @@ var $author$project$Main$update = F2(
|
|||||||
{
|
{
|
||||||
ram: A3($author$project$Main$changeAtInt, addr, new_val, old_pc.ram)
|
ram: A3($author$project$Main$changeAtInt, addr, new_val, old_pc.ram)
|
||||||
});
|
});
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
@ -5716,11 +5879,10 @@ var $author$project$Main$update = F2(
|
|||||||
_List_fromArray(
|
_List_fromArray(
|
||||||
[0]))
|
[0]))
|
||||||
});
|
});
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
case 'MsgCuEditAction':
|
case 'MsgCuEditAction':
|
||||||
var addr = msg.a;
|
var addr = msg.a;
|
||||||
var may_action = msg.b;
|
var may_action = msg.b;
|
||||||
@ -5728,16 +5890,15 @@ var $author$project$Main$update = F2(
|
|||||||
if (_v5.$ === 'Just') {
|
if (_v5.$ === 'Just') {
|
||||||
var action = _v5.a;
|
var action = _v5.a;
|
||||||
var newCode = A3($author$project$Main$changeAtUCode, addr, action, model.uCode);
|
var newCode = A3($author$project$Main$changeAtUCode, addr, action, model.uCode);
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{uCode: newCode}),
|
{uCode: newCode}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
case 'MsgCuAddBelow':
|
case 'MsgCuAddBelow':
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{
|
{
|
||||||
@ -5745,8 +5906,7 @@ var $author$project$Main$update = F2(
|
|||||||
model.uCode,
|
model.uCode,
|
||||||
_List_fromArray(
|
_List_fromArray(
|
||||||
[$author$project$Main$ActNothing]))
|
[$author$project$Main$ActNothing]))
|
||||||
}),
|
}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
case 'MsgCuInstrRegEdit':
|
case 'MsgCuInstrRegEdit':
|
||||||
var text = msg.a;
|
var text = msg.a;
|
||||||
var _v6 = $elm$core$String$toInt(text);
|
var _v6 = $elm$core$String$toInt(text);
|
||||||
@ -5756,11 +5916,10 @@ var $author$project$Main$update = F2(
|
|||||||
var new_pc = _Utils_update(
|
var new_pc = _Utils_update(
|
||||||
old_pc,
|
old_pc,
|
||||||
{instructionReg: _int});
|
{instructionReg: _int});
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
@ -5773,11 +5932,10 @@ var $author$project$Main$update = F2(
|
|||||||
var new_pc = _Utils_update(
|
var new_pc = _Utils_update(
|
||||||
old_pc,
|
old_pc,
|
||||||
{programmCounter: _int});
|
{programmCounter: _int});
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
@ -5794,7 +5952,7 @@ var $author$project$Main$update = F2(
|
|||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}),
|
||||||
$author$project$Main$sendUUpdate('uCycle updated'));
|
$author$project$Main$cmdSenduUpdate(model));
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
@ -5811,7 +5969,7 @@ var $author$project$Main$update = F2(
|
|||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}),
|
||||||
$author$project$Main$sendUUpdate('uCycle updated'));
|
$author$project$Main$cmdSenduUpdate(model));
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
@ -5824,11 +5982,10 @@ var $author$project$Main$update = F2(
|
|||||||
var new_pc = _Utils_update(
|
var new_pc = _Utils_update(
|
||||||
old_pc,
|
old_pc,
|
||||||
{dataBus: _int});
|
{dataBus: _int});
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
@ -5841,30 +5998,41 @@ var $author$project$Main$update = F2(
|
|||||||
var new_pc = _Utils_update(
|
var new_pc = _Utils_update(
|
||||||
old_pc,
|
old_pc,
|
||||||
{accumulator: _int});
|
{accumulator: _int});
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{pc: new_pc}),
|
{pc: new_pc}));
|
||||||
$elm$core$Platform$Cmd$none);
|
|
||||||
} else {
|
} else {
|
||||||
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
}
|
}
|
||||||
default:
|
case 'MsgAutoscrollUpdate':
|
||||||
return _Utils_Tuple2(
|
return updateModel(
|
||||||
_Utils_update(
|
_Utils_update(
|
||||||
model,
|
model,
|
||||||
{autoscroll: !model.autoscroll}),
|
{autoscroll: !model.autoscroll}));
|
||||||
$elm$core$Platform$Cmd$none);
|
case 'MsgLocalSessionExport':
|
||||||
|
return _Utils_Tuple2(
|
||||||
|
model,
|
||||||
|
$author$project$Main$cmdUpdateLocalStorage(model));
|
||||||
|
default:
|
||||||
|
var message_in = msg.a;
|
||||||
|
var _v12 = $author$project$Main$decodeModel(message_in);
|
||||||
|
if (_v12.$ === 'Just') {
|
||||||
|
var new_model = _v12.a;
|
||||||
|
return _Utils_Tuple2(new_model, $elm$core$Platform$Cmd$none);
|
||||||
|
} else {
|
||||||
|
return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var $elm$virtual_dom$VirtualDom$lazy = _VirtualDom_lazy;
|
var $elm$virtual_dom$VirtualDom$lazy = _VirtualDom_lazy;
|
||||||
var $elm$html$Html$Lazy$lazy = $elm$virtual_dom$VirtualDom$lazy;
|
var $elm$html$Html$Lazy$lazy = $elm$virtual_dom$VirtualDom$lazy;
|
||||||
var $author$project$Main$MsgAutoscrollUpdate = {$: 'MsgAutoscrollUpdate'};
|
var $author$project$Main$MsgAutoscrollUpdate = {$: 'MsgAutoscrollUpdate'};
|
||||||
var $author$project$Main$MsgInstructionStep = {$: 'MsgInstructionStep'};
|
var $author$project$Main$MsgInstructionStep = {$: 'MsgInstructionStep'};
|
||||||
|
var $author$project$Main$MsgLocalSessionExport = {$: 'MsgLocalSessionExport'};
|
||||||
var $author$project$Main$MsgReset = {$: 'MsgReset'};
|
var $author$project$Main$MsgReset = {$: 'MsgReset'};
|
||||||
var $author$project$Main$MsgUCycleStep = {$: 'MsgUCycleStep'};
|
var $author$project$Main$MsgUCycleStep = {$: 'MsgUCycleStep'};
|
||||||
var $elm$html$Html$button = _VirtualDom_node('button');
|
var $elm$html$Html$button = _VirtualDom_node('button');
|
||||||
var $elm$json$Json$Encode$bool = _Json_wrap;
|
|
||||||
var $elm$html$Html$Attributes$boolProperty = F2(
|
var $elm$html$Html$Attributes$boolProperty = F2(
|
||||||
function (key, bool) {
|
function (key, bool) {
|
||||||
return A2(
|
return A2(
|
||||||
@ -5986,7 +6154,6 @@ var $elm$html$Html$Events$stopPropagationOn = F2(
|
|||||||
event,
|
event,
|
||||||
$elm$virtual_dom$VirtualDom$MayStopPropagation(decoder));
|
$elm$virtual_dom$VirtualDom$MayStopPropagation(decoder));
|
||||||
});
|
});
|
||||||
var $elm$json$Json$Decode$field = _Json_decodeField;
|
|
||||||
var $elm$json$Json$Decode$at = F2(
|
var $elm$json$Json$Decode$at = F2(
|
||||||
function (fields, decoder) {
|
function (fields, decoder) {
|
||||||
return A3($elm$core$List$foldr, $elm$json$Json$Decode$field, decoder, fields);
|
return A3($elm$core$List$foldr, $elm$json$Json$Decode$field, decoder, fields);
|
||||||
@ -6195,6 +6362,23 @@ var $author$project$Main$selectCuValueDecoder = A2(
|
|||||||
'target',
|
'target',
|
||||||
A2($elm$json$Json$Decode$field, 'value', $elm$json$Json$Decode$string));
|
A2($elm$json$Json$Decode$field, 'value', $elm$json$Json$Decode$string));
|
||||||
var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected');
|
var $elm$html$Html$Attributes$selected = $elm$html$Html$Attributes$boolProperty('selected');
|
||||||
|
var $author$project$Main$uCodeDescriptions = _List_fromArray(
|
||||||
|
[
|
||||||
|
_Utils_Tuple2($author$project$Main$ActAccumulator2DataBus, 'Acc -> DataBus'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActAccumulatorDecrement, 'Acc --'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActAccumulatorIncrement, 'Acc ++'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActDataBus2Accumulator, 'DataBus -> Acc'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActDataBus2InstructionReg, 'DataBus -> InstReg'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActDataBus2Ram, 'DataBus -> Ram'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActInstructionReg2AddressBus, 'InstReg -> AddrBus'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActInstructionReg2ProgrammCounter, 'InstReg -> ProgCount'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActInstructionReg2UCounter, 'InstReg -> µCounter'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActProgrammCounterIncrement, 'ProgCounter ++'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActRam2DataBus, 'Ram -> DataBus'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActResetUCounter, 'µCounter = 0'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActProgrammCounter2AddressBus, 'ProgCounter -> AddrBus'),
|
||||||
|
_Utils_Tuple2($author$project$Main$ActNothing, 'Empty')
|
||||||
|
]);
|
||||||
var $author$project$Main$viewCuInstrSelect = F2(
|
var $author$project$Main$viewCuInstrSelect = F2(
|
||||||
function (id, current) {
|
function (id, current) {
|
||||||
var info2option = function (_v0) {
|
var info2option = function (_v0) {
|
||||||
@ -6205,7 +6389,9 @@ var $author$project$Main$viewCuInstrSelect = F2(
|
|||||||
_List_fromArray(
|
_List_fromArray(
|
||||||
[
|
[
|
||||||
$elm$html$Html$Attributes$selected(
|
$elm$html$Html$Attributes$selected(
|
||||||
_Utils_eq(action, current))
|
_Utils_eq(action, current)),
|
||||||
|
$elm$html$Html$Attributes$value(
|
||||||
|
$author$project$Main$uAction2String(action))
|
||||||
]),
|
]),
|
||||||
_List_fromArray(
|
_List_fromArray(
|
||||||
[
|
[
|
||||||
@ -6946,8 +7132,18 @@ var $author$project$Main$viewPC = function (model) {
|
|||||||
]),
|
]),
|
||||||
_List_fromArray(
|
_List_fromArray(
|
||||||
[
|
[
|
||||||
$elm$html$Html$text('Automatisch zum Eintrag Scrollen')
|
$elm$html$Html$text('Autoscroll')
|
||||||
]))
|
]))
|
||||||
|
])),
|
||||||
|
A2(
|
||||||
|
$elm$html$Html$button,
|
||||||
|
_List_fromArray(
|
||||||
|
[
|
||||||
|
$elm$html$Html$Events$onClick($author$project$Main$MsgLocalSessionExport)
|
||||||
|
]),
|
||||||
|
_List_fromArray(
|
||||||
|
[
|
||||||
|
$elm$html$Html$text('Export')
|
||||||
]))
|
]))
|
||||||
])),
|
])),
|
||||||
A2(
|
A2(
|
||||||
|
@ -44,6 +44,17 @@ function shrinkTableHead(scroll){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadStorage() {
|
||||||
|
let content = localStorage.getItem("pc_data");
|
||||||
|
if( typeof content == "string" ){
|
||||||
|
app.ports.localStorageRecieve.send( content );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Load last state of pc
|
||||||
|
loadStorage();
|
||||||
|
|
||||||
// EVENT LISTENERS
|
// EVENT LISTENERS
|
||||||
pc_ram_scroller.addEventListener("scroll", shrinkTableHead);
|
pc_ram_scroller.addEventListener("scroll", shrinkTableHead);
|
||||||
@ -57,3 +68,9 @@ app.ports.sendUUpdate.subscribe( (message) => {
|
|||||||
// Make sure that even when the calculation takes longer it will scroll correctly
|
// Make sure that even when the calculation takes longer it will scroll correctly
|
||||||
setTimeout( scrollToCurrent, 100 );
|
setTimeout( scrollToCurrent, 100 );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// Recieve LocalSession Updates via Ports
|
||||||
|
app.ports.localStorageSend.subscribe( (message) => {
|
||||||
|
console.log("localSessionSend: ", message);
|
||||||
|
localStorage.setItem("pc_data", message);
|
||||||
|
} );
|
||||||
|
163
src/Main.elm
163
src/Main.elm
@ -11,10 +11,11 @@ import Html.Lazy exposing (lazy)
|
|||||||
import Tuple
|
import Tuple
|
||||||
import Array exposing (get)
|
import Array exposing (get)
|
||||||
import Html exposing (address)
|
import Html exposing (address)
|
||||||
|
import Json.Encode as JE
|
||||||
import Json.Decode as JD
|
import Json.Decode as JD
|
||||||
import Html.Events exposing (targetValue)
|
import Html.Events exposing (targetValue)
|
||||||
|
|
||||||
|
modelVersion = 1
|
||||||
|
|
||||||
-- Note that general Stuff is at the end of the document
|
-- Note that general Stuff is at the end of the document
|
||||||
-- PORTS
|
-- PORTS
|
||||||
@ -23,10 +24,10 @@ import Html.Events exposing (targetValue)
|
|||||||
port sendUUpdate : String -> Cmd msg
|
port sendUUpdate : String -> Cmd msg
|
||||||
|
|
||||||
|
|
||||||
port sendRamUpdate : String -> Cmd msg
|
port localStorageSend : String -> Cmd msg
|
||||||
|
|
||||||
|
|
||||||
port recieveLocalSession : (String -> msg) -> Sub msg
|
port localStorageRecieve : (String -> msg) -> Sub msg
|
||||||
|
|
||||||
|
|
||||||
type alias PC =
|
type alias PC =
|
||||||
@ -82,6 +83,23 @@ uCodeDescriptions =
|
|||||||
, ( ActNothing, "Empty" )
|
, ( ActNothing, "Empty" )
|
||||||
]
|
]
|
||||||
|
|
||||||
|
uCodeIds : List ( UAction, String )
|
||||||
|
uCodeIds =
|
||||||
|
[ ( ActAccumulator2DataBus, "acc2db" )
|
||||||
|
, ( ActAccumulatorDecrement, "accDec" )
|
||||||
|
, ( ActAccumulatorIncrement, "accInc" )
|
||||||
|
, ( ActDataBus2Accumulator, "db2acc" )
|
||||||
|
, ( ActDataBus2InstructionReg, "db2ir" )
|
||||||
|
, ( ActDataBus2Ram, "db2ram" )
|
||||||
|
, ( ActInstructionReg2AddressBus, "ir2ab" )
|
||||||
|
, ( ActInstructionReg2ProgrammCounter, "ir2pc" )
|
||||||
|
, ( ActInstructionReg2UCounter, "ir2uc" )
|
||||||
|
, ( ActProgrammCounterIncrement, "pcInc" )
|
||||||
|
, ( ActRam2DataBus, "ram2db" )
|
||||||
|
, ( ActResetUCounter, "ucReset" )
|
||||||
|
, ( ActProgrammCounter2AddressBus, "pc2ab" )
|
||||||
|
, ( ActNothing, "n" )
|
||||||
|
]
|
||||||
|
|
||||||
uCodeMaps : List ( UAction, PC -> PC )
|
uCodeMaps : List ( UAction, PC -> PC )
|
||||||
uCodeMaps =
|
uCodeMaps =
|
||||||
@ -210,34 +228,34 @@ type Msg
|
|||||||
| MsgEditAddressBus String
|
| MsgEditAddressBus String
|
||||||
| MsgEditDataBus String
|
| MsgEditDataBus String
|
||||||
| MsgAluEdit String
|
| MsgAluEdit String
|
||||||
|
| MsgLocalSessionExport
|
||||||
| MsgLocalSessionRecieve String
|
| MsgLocalSessionRecieve String
|
||||||
|
|
||||||
|
|
||||||
update : Msg -> Model -> ( Model, Cmd Msg )
|
update : Msg -> Model -> ( Model, Cmd Msg )
|
||||||
update msg model =
|
update msg model =
|
||||||
|
let
|
||||||
|
updateModel new_model =
|
||||||
|
( new_model, cmdUpdateLocalStorage new_model)
|
||||||
|
in
|
||||||
|
|
||||||
case msg of
|
case msg of
|
||||||
MsgUCycleStep ->
|
MsgUCycleStep ->
|
||||||
( uStepPC model
|
( uStepPC model
|
||||||
, sendUUpdate "uCycle updated"
|
, cmdSenduUpdate model
|
||||||
)
|
)
|
||||||
|
|
||||||
MsgInstructionStep ->
|
MsgInstructionStep ->
|
||||||
( model, Cmd.none )
|
( model, Cmd.none )
|
||||||
|
|
||||||
MsgReset ->
|
MsgReset ->
|
||||||
( { model | pc = { initialPC | ram = model.pc.ram } }
|
updateModel { model | pc = { initialPC | ram = model.pc.ram } }
|
||||||
, Cmd.none
|
|
||||||
)
|
|
||||||
|
|
||||||
MsgLocalSessionRecieve message_in ->
|
|
||||||
( model, Cmd.none )
|
|
||||||
|
|
||||||
MsgManualStep action ->
|
MsgManualStep action ->
|
||||||
let
|
let
|
||||||
instruction = getAction action
|
instruction = getAction action
|
||||||
in
|
in
|
||||||
( { model | pc = instruction model.pc}
|
updateModel { model | pc = instruction model.pc}
|
||||||
, Cmd.none )
|
|
||||||
|
|
||||||
MsgRamEditAddress addr may_int ->
|
MsgRamEditAddress addr may_int ->
|
||||||
case String.toInt may_int of
|
case String.toInt may_int of
|
||||||
@ -248,8 +266,7 @@ update msg model =
|
|||||||
old_pc = model.pc
|
old_pc = model.pc
|
||||||
new_pc = { old_pc | ram = (changeAtInt addr new_val old_pc.ram) }
|
new_pc = { old_pc | ram = (changeAtInt addr new_val old_pc.ram) }
|
||||||
in
|
in
|
||||||
({ model | pc = new_pc }
|
updateModel { model | pc = new_pc }
|
||||||
, Cmd.none )
|
|
||||||
_ -> (model, Cmd.none)
|
_ -> (model, Cmd.none)
|
||||||
|
|
||||||
MsgRamEditInstr addr may_int ->
|
MsgRamEditInstr addr may_int ->
|
||||||
@ -261,8 +278,7 @@ update msg model =
|
|||||||
old_pc = model.pc
|
old_pc = model.pc
|
||||||
new_pc = { old_pc | ram = (changeAtInt addr new_val old_pc.ram) }
|
new_pc = { old_pc | ram = (changeAtInt addr new_val old_pc.ram) }
|
||||||
in
|
in
|
||||||
({ model | pc = new_pc }
|
updateModel { model | pc = new_pc }
|
||||||
, Cmd.none )
|
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgRamAddBelow ->
|
MsgRamAddBelow ->
|
||||||
@ -270,8 +286,7 @@ update msg model =
|
|||||||
old_pc = model.pc
|
old_pc = model.pc
|
||||||
new_pc = {old_pc | ram = old_pc.ram ++ [0]}
|
new_pc = {old_pc | ram = old_pc.ram ++ [0]}
|
||||||
in
|
in
|
||||||
|
updateModel {model | pc = new_pc}
|
||||||
({model | pc = new_pc}, Cmd.none)
|
|
||||||
|
|
||||||
MsgCuEditAction addr may_action ->
|
MsgCuEditAction addr may_action ->
|
||||||
case string2uAction may_action of
|
case string2uAction may_action of
|
||||||
@ -279,13 +294,11 @@ update msg model =
|
|||||||
let
|
let
|
||||||
newCode = changeAtUCode addr action model.uCode
|
newCode = changeAtUCode addr action model.uCode
|
||||||
in
|
in
|
||||||
({ model | uCode = newCode }, Cmd.none)
|
updateModel { model | uCode = newCode }
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgCuAddBelow ->
|
MsgCuAddBelow ->
|
||||||
( {model | uCode = model.uCode ++ [ ActNothing ]}
|
updateModel {model | uCode = model.uCode ++ [ ActNothing ]}
|
||||||
, Cmd.none
|
|
||||||
)
|
|
||||||
|
|
||||||
MsgCuInstrRegEdit text ->
|
MsgCuInstrRegEdit text ->
|
||||||
case String.toInt text of
|
case String.toInt text of
|
||||||
@ -293,7 +306,7 @@ update msg model =
|
|||||||
let old_pc = model.pc
|
let old_pc = model.pc
|
||||||
new_pc = { old_pc | instructionReg = int }
|
new_pc = { old_pc | instructionReg = int }
|
||||||
in
|
in
|
||||||
( { model | pc = new_pc }, Cmd.none )
|
updateModel { model | pc = new_pc }
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgCuProgCounterEdit text ->
|
MsgCuProgCounterEdit text ->
|
||||||
@ -302,7 +315,7 @@ update msg model =
|
|||||||
let old_pc = model.pc
|
let old_pc = model.pc
|
||||||
new_pc = { old_pc | programmCounter = int }
|
new_pc = { old_pc | programmCounter = int }
|
||||||
in
|
in
|
||||||
( { model | pc = new_pc }, Cmd.none )
|
updateModel { model | pc = new_pc }
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgCuUCounterEdit text ->
|
MsgCuUCounterEdit text ->
|
||||||
@ -311,7 +324,7 @@ update msg model =
|
|||||||
let old_pc = model.pc
|
let old_pc = model.pc
|
||||||
new_pc = { old_pc | uCounter = int }
|
new_pc = { old_pc | uCounter = int }
|
||||||
in
|
in
|
||||||
( { model | pc = new_pc }, sendUUpdate "uCycle updated" )
|
( { model | pc = new_pc }, cmdSenduUpdate model )
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgEditAddressBus text ->
|
MsgEditAddressBus text ->
|
||||||
@ -320,7 +333,7 @@ update msg model =
|
|||||||
let old_pc = model.pc
|
let old_pc = model.pc
|
||||||
new_pc = { old_pc | addressBus = int }
|
new_pc = { old_pc | addressBus = int }
|
||||||
in
|
in
|
||||||
( { model | pc = new_pc }, sendUUpdate "uCycle updated" )
|
( { model | pc = new_pc }, cmdSenduUpdate model )
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgEditDataBus text ->
|
MsgEditDataBus text ->
|
||||||
@ -329,7 +342,7 @@ update msg model =
|
|||||||
let old_pc = model.pc
|
let old_pc = model.pc
|
||||||
new_pc = { old_pc | dataBus = int }
|
new_pc = { old_pc | dataBus = int }
|
||||||
in
|
in
|
||||||
( { model | pc = new_pc }, Cmd.none )
|
updateModel { model | pc = new_pc }
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgAluEdit text ->
|
MsgAluEdit text ->
|
||||||
@ -338,13 +351,20 @@ update msg model =
|
|||||||
let old_pc = model.pc
|
let old_pc = model.pc
|
||||||
new_pc = { old_pc | accumulator = int }
|
new_pc = { old_pc | accumulator = int }
|
||||||
in
|
in
|
||||||
( { model | pc = new_pc }, Cmd.none )
|
updateModel { model | pc = new_pc }
|
||||||
_ -> ( model, Cmd.none )
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
MsgAutoscrollUpdate ->
|
MsgAutoscrollUpdate ->
|
||||||
( { model | autoscroll = not model.autoscroll }
|
updateModel { model | autoscroll = not model.autoscroll }
|
||||||
, Cmd.none
|
|
||||||
)
|
MsgLocalSessionExport ->
|
||||||
|
( model, cmdUpdateLocalStorage model )
|
||||||
|
|
||||||
|
MsgLocalSessionRecieve message_in ->
|
||||||
|
case decodeModel message_in of
|
||||||
|
Just new_model ->
|
||||||
|
( new_model , Cmd.none )
|
||||||
|
_ -> ( model, Cmd.none )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -403,6 +423,73 @@ uStepPC model =
|
|||||||
model
|
model
|
||||||
|
|
||||||
|
|
||||||
|
encodeModel : Model -> String
|
||||||
|
encodeModel model =
|
||||||
|
JE.object
|
||||||
|
[ ( "model-version", JE.int modelVersion )
|
||||||
|
, ( "pc"
|
||||||
|
, JE.object
|
||||||
|
[ ("addressBus", JE.int model.pc.addressBus )
|
||||||
|
, ("dataBus", JE.int model.pc.dataBus )
|
||||||
|
, ("instructionReg", JE.int model.pc.instructionReg )
|
||||||
|
, ("programmCounter", JE.int model.pc.programmCounter )
|
||||||
|
, ("uCounter", JE.int model.pc.uCounter )
|
||||||
|
, ("accumulator", JE.int model.pc.accumulator )
|
||||||
|
, ("ram", JE.list JE.int model.pc.ram)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
, ( "uCode", JE.list JE.string (List.map uAction2String model.uCode) )
|
||||||
|
, ( "autoscroll", JE.bool model.autoscroll )
|
||||||
|
]
|
||||||
|
|> JE.encode 0
|
||||||
|
|
||||||
|
|
||||||
|
decodeModel : String -> Maybe Model
|
||||||
|
decodeModel text =
|
||||||
|
let
|
||||||
|
error2maybe err =
|
||||||
|
case err of
|
||||||
|
Ok val -> Just val
|
||||||
|
_ -> Nothing
|
||||||
|
|
||||||
|
uCodeDecoder =
|
||||||
|
JD.map
|
||||||
|
(\s -> Maybe.withDefault ActNothing <| string2uAction s )
|
||||||
|
(JD.string)
|
||||||
|
in
|
||||||
|
text
|
||||||
|
|> JD.decodeString
|
||||||
|
( JD.map3
|
||||||
|
Model
|
||||||
|
( JD.field "pc"
|
||||||
|
( JD.map7
|
||||||
|
PC
|
||||||
|
(JD.field "ram" (JD.list JD.int))
|
||||||
|
(JD.field "dataBus" JD.int)
|
||||||
|
(JD.field "addressBus" JD.int)
|
||||||
|
(JD.field "instructionReg" JD.int)
|
||||||
|
(JD.field "programmCounter" JD.int)
|
||||||
|
(JD.field "uCounter" JD.int)
|
||||||
|
(JD.field "accumulator" JD.int)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
( JD.field "uCode" (JD.list uCodeDecoder) )
|
||||||
|
( JD.field "autoscroll" JD.bool )
|
||||||
|
)
|
||||||
|
|> error2maybe
|
||||||
|
|
||||||
|
cmdUpdateLocalStorage : Model -> Cmd Msg
|
||||||
|
cmdUpdateLocalStorage model =
|
||||||
|
localStorageSend (encodeModel model)
|
||||||
|
|
||||||
|
cmdSenduUpdate : Model -> Cmd Msg
|
||||||
|
cmdSenduUpdate model =
|
||||||
|
Cmd.batch
|
||||||
|
[ cmdUpdateLocalStorage model
|
||||||
|
, sendUUpdate "update"
|
||||||
|
]
|
||||||
|
|
||||||
|
-- VIEWERS
|
||||||
|
|
||||||
view : Model -> Html Msg
|
view : Model -> Html Msg
|
||||||
view model =
|
view model =
|
||||||
@ -433,8 +520,9 @@ viewPC model =
|
|||||||
[]
|
[]
|
||||||
, Html.label
|
, Html.label
|
||||||
[ HAttr.for "enableScrolling" ]
|
[ HAttr.for "enableScrolling" ]
|
||||||
[ text "Automatisch zum Eintrag Scrollen" ]
|
[ text "Autoscroll" ]
|
||||||
]
|
]
|
||||||
|
, button [ onClick MsgLocalSessionExport ] [ text "Export" ]
|
||||||
]
|
]
|
||||||
, div [ class "grid-fullwidth" ] [ lazy viewAddressBus model ]
|
, div [ class "grid-fullwidth" ] [ lazy viewAddressBus model ]
|
||||||
, lazy viewRam model
|
, lazy viewRam model
|
||||||
@ -638,7 +726,10 @@ viewCuInstrSelect : Int -> UAction -> Html Msg
|
|||||||
viewCuInstrSelect id current =
|
viewCuInstrSelect id current =
|
||||||
let
|
let
|
||||||
info2option (action, info) =
|
info2option (action, info) =
|
||||||
Html.option [ HAttr.selected (action == current) ] [ text info ]
|
Html.option
|
||||||
|
[ HAttr.selected (action == current)
|
||||||
|
, HAttr.value (uAction2String action) ]
|
||||||
|
[ text info ]
|
||||||
listOptions = List.map info2option uCodeDescriptions
|
listOptions = List.map info2option uCodeDescriptions
|
||||||
in
|
in
|
||||||
Html.select
|
Html.select
|
||||||
@ -891,7 +982,7 @@ seperateInstructionsEntry i =
|
|||||||
uAction2String : UAction -> String
|
uAction2String : UAction -> String
|
||||||
uAction2String action =
|
uAction2String action =
|
||||||
let
|
let
|
||||||
filtered_list = List.filter (\s -> Tuple.first s == action) uCodeDescriptions
|
filtered_list = List.filter (\s -> Tuple.first s == action) uCodeIds
|
||||||
in
|
in
|
||||||
case List.head filtered_list of
|
case List.head filtered_list of
|
||||||
Just (_,info) -> info
|
Just (_,info) -> info
|
||||||
@ -900,7 +991,7 @@ uAction2String action =
|
|||||||
string2uAction : String -> Maybe UAction
|
string2uAction : String -> Maybe UAction
|
||||||
string2uAction msg =
|
string2uAction msg =
|
||||||
let
|
let
|
||||||
filtered_list = List.filter (\s -> Tuple.second s == msg) uCodeDescriptions
|
filtered_list = List.filter (\s -> Tuple.second s == msg) uCodeIds
|
||||||
in
|
in
|
||||||
case List.head filtered_list of
|
case List.head filtered_list of
|
||||||
Just (action,_) -> Just action
|
Just (action,_) -> Just action
|
||||||
@ -917,7 +1008,7 @@ selectCuValueDecoder =
|
|||||||
|
|
||||||
subscriptions : Model -> Sub Msg
|
subscriptions : Model -> Sub Msg
|
||||||
subscriptions model =
|
subscriptions model =
|
||||||
recieveLocalSession MsgLocalSessionRecieve
|
localStorageRecieve MsgLocalSessionRecieve
|
||||||
|
|
||||||
|
|
||||||
init : () -> ( Model, Cmd Msg )
|
init : () -> ( Model, Cmd Msg )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user