diff --git a/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java b/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java index 0acc0dd..a51de2f 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java +++ b/src/main/java/fabrik/simulator/pic16f84/Controller_Frontend.java @@ -1,6 +1,7 @@ package fabrik.simulator.pic16f84; import com.gluonhq.charm.glisten.control.ToggleButtonGroup; + import javafx.event.ActionEvent; import javafx.fxml.FXML; @@ -62,8 +63,8 @@ public class Controller_Frontend { DataRegister.increasePC(); Table.refresh(); Stage stage = (Stage) stepintoButton.getScene().getWindow(); + IOPorts.refreshUI(getTRISbuttons(), getPORTbuttons()); CreateWindow.refreshTable(stage); - } @@ -95,53 +96,105 @@ public class Controller_Frontend { content.append(line).append("\n"); } lstContentLabel.setText(content.toString()); - - - - } catch (IOException e) { + } + catch (IOException e) { e.printStackTrace(); } } @FXML - private ToggleButtonGroup bgA0; + private ToggleButtonGroup bgTRISA0; @FXML - private ToggleButtonGroup bgA1; + private ToggleButtonGroup bgTRISA1; @FXML - private ToggleButtonGroup bgA2; + private ToggleButtonGroup bgTRISA2; @FXML - private ToggleButtonGroup bgA3; + private ToggleButtonGroup bgTRISA3; @FXML - private ToggleButtonGroup bgA4; + private ToggleButtonGroup bgTRISA4; @FXML - private ToggleButtonGroup bgA5; + private ToggleButtonGroup bgTRISA5; @FXML - private ToggleButtonGroup bgA6; + private ToggleButtonGroup bgTRISA6; @FXML - private ToggleButtonGroup bgA7; + private ToggleButtonGroup bgTRISA7; @FXML - private ToggleButtonGroup bgB0; + private ToggleButtonGroup bgTRISB0; @FXML - private ToggleButtonGroup bgB1; + private ToggleButtonGroup bgTRISB1; @FXML - private ToggleButtonGroup bgB2; + private ToggleButtonGroup bgTRISB2; @FXML - private ToggleButtonGroup bgB3; + private ToggleButtonGroup bgTRISB3; @FXML - private ToggleButtonGroup bgB4; + private ToggleButtonGroup bgTRISB4; @FXML - private ToggleButtonGroup bgB5; + private ToggleButtonGroup bgTRISB5; @FXML - private ToggleButtonGroup bgB6; + private ToggleButtonGroup bgTRISB6; @FXML - private ToggleButtonGroup bgB7; + private ToggleButtonGroup bgTRISB7; + @FXML + private ToggleButtonGroup bgPORTA0; + @FXML + private ToggleButtonGroup bgPORTA1; + @FXML + private ToggleButtonGroup bgPORTA2; + @FXML + private ToggleButtonGroup bgPORTA3; + @FXML + private ToggleButtonGroup bgPORTA4; + @FXML + private ToggleButtonGroup bgPORTA5; + @FXML + private ToggleButtonGroup bgPORTA6; + @FXML + private ToggleButtonGroup bgPORTA7; + @FXML + private ToggleButtonGroup bgPORTB0; + @FXML + private ToggleButtonGroup bgPORTB1; + @FXML + private ToggleButtonGroup bgPORTB2; + @FXML + private ToggleButtonGroup bgPORTB3; + @FXML + private ToggleButtonGroup bgPORTB4; + @FXML + private ToggleButtonGroup bgPORTB5; + @FXML + private ToggleButtonGroup bgPORTB6; + @FXML + private ToggleButtonGroup bgPORTB7; + private static ToggleButtonGroup[] allTRISbuttons; + private static ToggleButtonGroup[] allPORTbuttons; public void initialize() { - ToggleButtonGroup [] allButtons = {bgA0, bgA1, bgA2, bgA3, bgA4, bgA5, bgA6, bgA7, bgB0, bgB1, bgB2, bgB3, bgB4, bgB5, bgB6, bgB7}; + ToggleButtonGroup [] allTRISButtons = {bgTRISA0, bgTRISA1, bgTRISA2, bgTRISA3, bgTRISA4, bgTRISA5, bgTRISA6, bgTRISA7, bgTRISB0, bgTRISB1, bgTRISB2, bgTRISB3, bgTRISB4, bgTRISB5, bgTRISB6, bgTRISB7}; + ToggleButtonGroup [] allPORTButtons = {bgPORTA0, bgPORTA1, bgPORTA2, bgPORTA3, bgPORTA4, bgPORTA5, bgPORTA6, bgPORTA7, bgPORTB0, bgPORTB1, bgPORTB2, bgPORTB3, bgPORTB4, bgPORTB5, bgPORTB6, bgPORTB7}; for (int i = 0; i<16; i++) { - ToggleButtonGroupExt.get().addAlwaysOneSelectedSupport(allButtons[i]); + ToggleButtonGroupExt.get().addAlwaysOneSelectedSupport(allTRISButtons[i]); + ToggleButtonGroupExt.get().addAlwaysOneSelectedSupport(allPORTButtons[i]); } + setTRISbuttons(allTRISButtons); + setPORTbuttons(allPORTButtons); + } + + private static void setTRISbuttons(ToggleButtonGroup[] allButtons) { + allTRISbuttons = allButtons; + } + + public static ToggleButtonGroup [] getTRISbuttons() { + return allTRISbuttons; + } + + private static void setPORTbuttons(ToggleButtonGroup[] allButtons) { + allPORTbuttons = allButtons; + } + + public static ToggleButtonGroup [] getPORTbuttons() { + return allPORTbuttons; } } diff --git a/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java b/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java index 353690e..f1c734f 100644 --- a/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java +++ b/src/main/java/fabrik/simulator/pic16f84/CreateWindow.java @@ -22,7 +22,6 @@ public class CreateWindow extends Application { public void start(Stage primaryStage) throws IOException{ DataRegister.initDataRegister(); table = Table.refresh(); - FXMLLoader codewindow = new FXMLLoader(CreateWindow.class.getResource("frontend.fxml")); Parent code = codewindow.load(); diff --git a/src/main/java/fabrik/simulator/pic16f84/DataRegister.java b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java index 1ce8f13..017efc8 100644 --- a/src/main/java/fabrik/simulator/pic16f84/DataRegister.java +++ b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java @@ -34,7 +34,7 @@ public class DataRegister { dataRegister[0x81] = 0b11111111; dataRegister[0x80 + PCL] = dataRegister[PCL]; dataRegister[0x80 + STATUS] = dataRegister[STATUS]; - dataRegister[TRISA] = 0b11111000; + dataRegister[TRISA] = 0b11111111; dataRegister[TRISB] = 0b11111111; dataRegister[0x80 + PCLATH] = dataRegister[PCLATH]; dataRegister[0x80 + INTCON] = dataRegister[INTCON]; @@ -139,6 +139,14 @@ public class DataRegister { } } + public static void setDirectBit (int fileAddress, int bit, int value){ + if (getDirectBit(fileAddress, bit) == 0 && value == 1){ + dataRegister[fileAddress] += (int) Math.pow(2, bit); + } else if (getDirectBit(fileAddress, bit) == 1 && value == 0){ + dataRegister[fileAddress] -= (int) Math.pow(2, bit); + } + } + private static int programCounter = 0; private static void writeToPCL(){ diff --git a/src/main/java/fabrik/simulator/pic16f84/IOPorts.java b/src/main/java/fabrik/simulator/pic16f84/IOPorts.java index 49a95ce..b005550 100644 --- a/src/main/java/fabrik/simulator/pic16f84/IOPorts.java +++ b/src/main/java/fabrik/simulator/pic16f84/IOPorts.java @@ -1,5 +1,12 @@ package fabrik.simulator.pic16f84; +import com.gluonhq.charm.glisten.control.ToggleButtonGroup; +import javafx.collections.ObservableList; +import javafx.scene.control.ToggleButton; +import javafx.stage.Stage; + +import java.io.IOException; + public class IOPorts { private static final int A = 0; private static final int B = 1; @@ -8,7 +15,7 @@ public class IOPorts { private static final int TRISA = 0x85; private static final int TRISB = 0x86; - private static int [] trisLatch = new int[2]; + private static int [] trisLatch = {0xFF, 0xFF}; private static int [] dataLatch = new int[2]; public static void setBit (int address, int bit){ @@ -46,7 +53,86 @@ public class IOPorts { } private static void refreshPorts() { - System.out.println("PORTA: " + DataRegister.getDirectRegister(PORTA) + "; DATALATCHA: " + dataLatch[A] + "; TRISA: " + trisLatch[A]); - System.out.println("PORTB: " + DataRegister.getDirectRegister(PORTB) + "; DATALATCHB: " + dataLatch[B] + "; TRISB: " + trisLatch[B]); + DataRegister.setDirectRegister(PORTA, ((~((~dataLatch[A])&0xFF | trisLatch[A])) | (trisLatch[A] & DataRegister.getDirectRegister(PORTA))) & 0x1F); + DataRegister.setDirectRegister(PORTB, ((~((~dataLatch[B])&0xFF | trisLatch[B])) | (trisLatch[B] & DataRegister.getDirectRegister(PORTB))) & 0xFF); + DataRegister.setDirectRegister(TRISA, trisLatch[A]); + DataRegister.setDirectRegister(TRISB, trisLatch[B]); + ToggleButtonGroup[] buttons = Controller_Frontend.getPORTbuttons(); + for (int i = 0; i < buttons.length; i++){ + int port = (i < 8) ? PORTA : PORTB; + int bit = i % 8; + boolean value = ((DataRegister.getDirectRegister(port) >> bit) & 1) == 1; + buttons[i].getToggles().get(0).setSelected(!value); + buttons[i].getToggles().get(1).setSelected(value); + } + } + + public static void refreshUI(ToggleButtonGroup[] buttonsTRIS, ToggleButtonGroup[] buttonsPORT) { + for (int i = 0; i< buttonsTRIS.length; i++){ + int tris = (i < 8) ? trisLatch[A] : trisLatch[B]; + boolean val = isInput(tris, i%8); + buttonsPORT[i].setDisable(!val); + buttonsTRIS[i].getToggles().get(0).setSelected(val); + buttonsTRIS[i].getToggles().get(1).setSelected(!val); + } + } + + private static boolean isInput(int i, int bit) { + return (i >> bit & 1) == 1; + } + + public static void setTRISfromUI(ToggleButtonGroup parent) throws IOException { + int [] params = getToggleParams(parent); + int tris = params[0]; + int bit = params[1]; + int value = params[2]; + ToggleButtonGroup [] buttonsPORT = Controller_Frontend.getPORTbuttons(); + if (value == 1){ + setBit(tris, bit); + buttonsPORT[(tris-TRISA)*8 + bit].setDisable(false); + } + else{ + clearBit(tris, bit); + buttonsPORT[(tris-TRISA)*8 + bit].setDisable(true); + } + refreshPorts(); + refreshTable(parent); + } + + public static void setPORTfromUI(ToggleButtonGroup parent) throws IOException { + int [] params = getToggleParams(parent); + int port = params[0]; + int bit = params[1]; + int value = params [2]; + value = (value == 1) ? 0 : 1; + DataRegister.setDirectBit(port, bit, value); + refreshPorts(); + refreshTable(parent); + } + + private static void refreshTable(ToggleButtonGroup parent) throws IOException { + Stage stage = (Stage) parent.getScene().getWindow(); + Table.refresh(); + CreateWindow.refreshTable(stage); + } + + private static int[] getToggleParams(ToggleButtonGroup parent) { + String group = parent.getId(); + ObservableList toggles = parent.getToggles(); + int fileAddress; + if (group.contains("TRIS")) + if (group.contains("A")) + fileAddress = TRISA; + else + fileAddress = TRISB; + else + if (group.contains("A")) + fileAddress = PORTA; + else + fileAddress = PORTB; + char index =group.charAt(group.length()-1); + int bit = Integer.parseInt(String.valueOf(index)); + int value = (toggles.get(0).isSelected()) ? 1 : 0; + return new int[]{fileAddress, bit, value}; } } diff --git a/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java b/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java index 837048a..5fb2672 100644 --- a/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java +++ b/src/main/java/fabrik/simulator/pic16f84/ToggleButtonGroupExt.java @@ -7,6 +7,8 @@ import javafx.scene.control.Toggle; import javafx.scene.control.ToggleButton; import javafx.scene.input.MouseEvent; +import java.io.IOException; + public class ToggleButtonGroupExt { private static ToggleButtonGroupExt me; @@ -40,6 +42,21 @@ public class ToggleButtonGroupExt { public EventHandler consumeMouseEventfilter = (MouseEvent mouseEvent) -> { if (((Toggle) mouseEvent.getSource()).isSelected()) { + ToggleButtonGroup parent = (ToggleButtonGroup) ((ToggleButton) mouseEvent.getSource()).getParent(); + if (parent.getId().contains("TRIS")) { + try { + IOPorts.setTRISfromUI(parent); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + else { + try { + IOPorts.setPORTfromUI(parent); + } catch (IOException e) { + throw new RuntimeException(e); + } + } mouseEvent.consume(); } }; diff --git a/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml b/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml index 11b48a9..32f5622 100644 --- a/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml +++ b/src/main/resources/fabrik/simulator/pic16f84/frontend.fxml @@ -42,6 +42,7 @@ + @@ -88,7 +89,7 @@ - + @@ -168,7 +169,7 @@ - + @@ -185,7 +186,7 @@ - + @@ -202,7 +203,7 @@ - + @@ -219,7 +220,7 @@ - + @@ -236,7 +237,7 @@ - + @@ -253,7 +254,7 @@ - + @@ -270,7 +271,7 @@ - + @@ -285,7 +286,7 @@ - + @@ -294,7 +295,7 @@ - + @@ -303,7 +304,7 @@ - + @@ -312,7 +313,7 @@ - + @@ -321,7 +322,7 @@ - + @@ -330,7 +331,7 @@ - + @@ -339,7 +340,7 @@ - + @@ -348,7 +349,7 @@ - + @@ -357,7 +358,7 @@ - + @@ -366,7 +367,7 @@ - + @@ -375,7 +376,7 @@ - + @@ -384,9 +385,9 @@ - + - + @@ -401,9 +402,9 @@ - + - + @@ -418,9 +419,9 @@ - + - + @@ -435,9 +436,9 @@ - + - + @@ -452,9 +453,9 @@ - + - + @@ -469,9 +470,9 @@ - + - + @@ -486,9 +487,9 @@ - + - + @@ -503,9 +504,9 @@ - + - + @@ -520,148 +521,276 @@ - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + +