Did some renaming and added some more functionality to ALU

This commit is contained in:
2022-05-04 11:46:38 +02:00
parent b41f999323
commit 66cb839f87
3 changed files with 86 additions and 40 deletions

View File

@ -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

View File

@ -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

View File

@ -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 =