diff --git a/src/PC/Defaults.elm b/src/PC/Defaults.elm index 0454a16..bdef35d 100644 --- a/src/PC/Defaults.elm +++ b/src/PC/Defaults.elm @@ -43,11 +43,11 @@ initialRam = Array.fromList initialUCodes : Array UAction initialUCodes = Array.fromList - [ UA_ProgrammCounter2AddressBus -- 000 + [ UA_CU_ProgrammCounter2AddressBus -- 000 , UA_Ram2DataBus -- 001 , UA_DataBus2InstructionReg -- 002 - , UA_ProgrammCounterIncrement -- 003 - , UA_InstructionReg2UCounter -- 004 + , UA_CU_ProgrammCounterIncrement -- 003 + , UA_CU_InstructionReg2UCounter -- 004 , UA_Nothing -- 005 , UA_Nothing , UA_Nothing @@ -55,10 +55,10 @@ initialUCodes = Array.fromList , UA_Nothing -- 009 -- 010 LOADA - , UA_InstructionReg2AddressBus -- 010 + , UA_CU_InstructionReg2AddressBus -- 010 , UA_Ram2DataBus -- 011 , UA_DataBus2Accumulator -- 012 - , UA_ResetUCounter -- 013 + , UA_CU_ResetUCounter -- 013 , UA_Nothing -- 014 , UA_Nothing , UA_Nothing @@ -67,10 +67,10 @@ initialUCodes = Array.fromList , UA_Nothing -- 019 -- 020 STOA - , UA_Accumulator2DataBus -- 020 - , UA_InstructionReg2AddressBus -- 021 + , UA_ALU_Accumulator2DataBus -- 020 + , UA_CU_InstructionReg2AddressBus -- 021 , UA_DataBus2Ram -- 022 - , UA_ResetUCounter -- 023 + , UA_CU_ResetUCounter -- 023 , UA_Nothing --024 , UA_Nothing , UA_Nothing @@ -79,8 +79,8 @@ initialUCodes = Array.fromList , UA_Nothing -- 029 -- 030 INCA - , UA_AccumulatorIncrement -- 030 - , UA_ResetUCounter -- 031 + , UA_ALU_AccumulatorIncrement -- 030 + , UA_CU_ResetUCounter -- 031 , UA_Nothing -- 032 , UA_Nothing , UA_Nothing @@ -91,8 +91,8 @@ initialUCodes = Array.fromList , UA_Nothing -- 039 -- 040 JMP - , UA_InstructionReg2ProgrammCounter -- 040 - , UA_ResetUCounter -- 041 + , UA_CU_InstructionReg2ProgrammCounter -- 040 + , UA_CU_ResetUCounter -- 041 , UA_Nothing -- 042 , UA_Nothing , UA_Nothing diff --git a/src/PC/Types.elm b/src/PC/Types.elm index ea421db..7cf4500 100644 --- a/src/PC/Types.elm +++ b/src/PC/Types.elm @@ -2,7 +2,7 @@ module PC.Types exposing (..) import Array exposing (Array) -pcModelVersion = "3" +pcModelVersion = "4" type alias PC_Model = { pc : PC @@ -26,21 +26,29 @@ type alias UCode = , label : String } +-- UActions that can be used in µCode type UAction - = UA_Accumulator2DataBus - | UA_AccumulatorDecrement - | UA_AccumulatorIncrement + = UA_ALU_Accumulator2DataBus + | UA_ALU_AccumulatorDecrement + | UA_ALU_AccumulatorIncrement + | UA_ALU_AccumulatorShiftLeftByDataBus + | UA_ALU_AccumulatorShiftRightByDataBus + | UA_ALU_AccumulatorAddByDataBus + | UA_ALU_AccumulatorSubtractByDataBus + | UA_ALU_AccumulatorMultiplyByDataBus + | UA_ALU_AccumulatorDivideByDataBus + | UA_CU_InstructionReg2AddressBus + | UA_CU_InstructionReg2DataBus + | UA_CU_InstructionReg2ProgrammCounter + | UA_CU_InstructionReg2UCounter + | UA_CU_ProgrammCounterIncrement + | UA_CU_InstructionReg2ProgrammCounterIfAccEq0 + | UA_CU_ProgrammCounter2AddressBus + | UA_CU_ResetUCounter | UA_DataBus2Accumulator | UA_DataBus2InstructionReg | UA_DataBus2Ram - | UA_InstructionReg2AddressBus - | UA_InstructionReg2ProgrammCounter - | UA_InstructionReg2UCounter - | UA_ProgrammCounterIncrement - | UA_InstructionReg2ProgrammCounterIfAccEq0 | UA_Ram2DataBus - | UA_ResetUCounter - | UA_ProgrammCounter2AddressBus | UA_AlertUser | UA_Nothing diff --git a/src/PC/UActions.elm b/src/PC/UActions.elm index a216c32..3ed35f7 100644 --- a/src/PC/UActions.elm +++ b/src/PC/UActions.elm @@ -11,23 +11,30 @@ import PC.Helpers exposing (..) uCodes : List UCode uCodes = - [ UCode UA_Nothing "n" (\s -> s) "Empty" - , UCode UA_Accumulator2DataBus "acc2db" actAccumulator2DataBus "Acc -> DataBus" - , UCode UA_AccumulatorDecrement "accDec" actAccumulatorDecrement "Acc --" - , UCode UA_AccumulatorIncrement "accInc" actAccumulatorIncrement "Acc ++" - , UCode UA_DataBus2Accumulator "db2acc" actDataBus2Accumulator "DataBus -> Acc" - , UCode UA_DataBus2InstructionReg "db2ir" actDataBus2InstructionReg "DataBus -> InstReg" - , UCode UA_DataBus2Ram "db2ram" actDataBus2Ram "DataBus -> Ram" - , UCode UA_InstructionReg2AddressBus "ir2ab" actInstructionReg2AddressBus "InstReg -> AddrBus" - , UCode UA_InstructionReg2ProgrammCounter "ir2pc" actInstructionReg2ProgrammCounter "InstReg -> ProgCount" - , UCode UA_InstructionReg2UCounter "ir2uc" actInstructionReg2UCounter "InstReg -> µCounter" - , UCode UA_ProgrammCounterIncrement "pcInc" actProgrammCounterIncrement "ProgCounter ++" - , UCode UA_Ram2DataBus "ram2db" actRam2DataBus "Ram -> DataBus" - , UCode UA_ResetUCounter "ucReset" actResetUCounter "µCounter = 0" - , UCode UA_ProgrammCounter2AddressBus "pc2ab" actProgrammCounter2AddressBus "ProgCounter -> AddrBus" - , UCode UA_InstructionReg2ProgrammCounterIfAccEq0 - "ir2pciacceq0" actInstructionReg2ProgrammCounterIfAccEq0 "Acc == 0 => InstReg -> ProgCounter" - , UCode UA_AlertUser "alert" actDoAlert "Signal End of Programm" + [ UCode UA_Nothing "n" (\s -> s) "Empty" + , UCode UA_ALU_Accumulator2DataBus "acc2db" actAccumulator2DataBus "Acc -> DataBus" + , UCode UA_ALU_AccumulatorDecrement "accDec" actAccumulatorDecrement "Acc --" + , UCode UA_ALU_AccumulatorIncrement "accInc" actAccumulatorIncrement "Acc ++" + , UCode UA_ALU_AccumulatorShiftLeftByDataBus "accLsN" actAccumulatorShiftLeft "Acc << DataBus" + , UCode UA_ALU_AccumulatorShiftRightByDataBus "accRsN" actAccumulatorShiftRight "Acc >> DataBus" + , UCode UA_ALU_AccumulatorAddByDataBus "accAdd" actAccumulatorAdd "Acc + DataBus" + , UCode UA_ALU_AccumulatorSubtractByDataBus "accSub" actAccumulatorSub "Acc - DataBus" + , UCode UA_ALU_AccumulatorMultiplyByDataBus "accMul" actAccumulatorMultiply "Acc * DataBus" + , UCode UA_ALU_AccumulatorDivideByDataBus "accDiv" actAccumulatorDivide "Acc / DataBus" + , UCode UA_CU_InstructionReg2AddressBus "ir2ab" actInstructionReg2AddressBus "InstReg -> AddrBus" + , UCode UA_CU_InstructionReg2DataBus "ir2db" actInstructionReg2DataBus "InstReg -> DataBus" + , UCode UA_CU_InstructionReg2ProgrammCounter "ir2pc" actInstructionReg2ProgrammCounter "InstReg -> ProgCount" + , UCode UA_CU_InstructionReg2UCounter "ir2uc" actInstructionReg2UCounter "InstReg -> µCounter" + , UCode UA_CU_ProgrammCounterIncrement "pcInc" actProgrammCounterIncrement "ProgCounter ++" + , UCode UA_CU_ProgrammCounter2AddressBus "pc2ab" actProgrammCounter2AddressBus "ProgCounter -> AddrBus" + , UCode UA_CU_ResetUCounter "ucReset" actResetUCounter "µCounter = 0" + , UCode UA_CU_InstructionReg2ProgrammCounterIfAccEq0 + "ir2pciacceq0" actInstructionReg2ProgrammCounterIfAccEq0 "Acc == 0 => InstReg -> ProgCounter" + , UCode UA_DataBus2Accumulator "db2acc" actDataBus2Accumulator "DataBus -> Acc" + , UCode UA_DataBus2InstructionReg "db2ir" actDataBus2InstructionReg "DataBus -> InstReg" + , UCode UA_DataBus2Ram "db2ram" actDataBus2Ram "DataBus -> Ram" + , UCode UA_Ram2DataBus "ram2db" actRam2DataBus "Ram -> DataBus" + , UCode UA_AlertUser "alert" actDoAlert "Signal End of Programm" ] @@ -73,6 +80,12 @@ actInstructionReg2AddressBus pc = in { pc | addressBus = address } +actInstructionReg2DataBus : PC -> PC +actInstructionReg2DataBus pc = + let + (_, data) = seperateInstructionsEntry pc.instructionReg + in + { pc | dataBus = data } actInstructionReg2ProgrammCounter : PC -> PC actInstructionReg2ProgrammCounter pc = @@ -121,6 +134,31 @@ actAccumulatorDecrement : PC -> PC actAccumulatorDecrement pc = { pc | accumulator = pc.accumulator - 1 } +actAccumulatorShiftLeft : PC -> PC +actAccumulatorShiftLeft pc = + { pc | accumulator = pc.accumulator * (2 ^ pc.dataBus) } + +actAccumulatorShiftRight : PC -> PC +actAccumulatorShiftRight pc = + { pc | accumulator = pc.accumulator // (2 ^ pc.dataBus) } + +actAccumulatorAdd : PC -> PC +actAccumulatorAdd pc = + { pc | accumulator = pc.accumulator + pc.dataBus } + +actAccumulatorSub : PC -> PC +actAccumulatorSub pc = + { pc | accumulator = pc.accumulator - pc.dataBus } + +actAccumulatorMultiply : PC -> PC +actAccumulatorMultiply pc = + { pc | accumulator = pc.accumulator * pc.dataBus } + +actAccumulatorDivide : PC -> PC +actAccumulatorDivide pc = + { pc | accumulator = pc.accumulator // pc.dataBus } + + actDataBus2Ram : PC -> PC actDataBus2Ram pc =