From c2f5c3a81a7b6a6a8a030ce118efb491cded851b Mon Sep 17 00:00:00 2001 From: paulmart-n Date: Thu, 18 Apr 2024 14:29:50 +0200 Subject: [PATCH] Command-Erkennung --- .../fabrik/simulator/pic16f84/Commands.java | 151 ++++++++++++++++++ .../pic16f84/Controller_FileSelect.java | 16 +- .../pic16f84/Controller_MainBody.java | 1 + .../simulator/pic16f84/DataRegister.java | 36 +++++ .../fabrik/simulator/pic16f84/ParseFile.java | 2 +- 5 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 src/main/java/fabrik/simulator/pic16f84/Commands.java create mode 100644 src/main/java/fabrik/simulator/pic16f84/DataRegister.java diff --git a/src/main/java/fabrik/simulator/pic16f84/Commands.java b/src/main/java/fabrik/simulator/pic16f84/Commands.java new file mode 100644 index 0000000..b5cc81a --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/Commands.java @@ -0,0 +1,151 @@ +package fabrik.simulator.pic16f84; + +public class Commands { + public static void execute(){ + ; + } + + public static void decode(int instruction){ + int jumpaddr = 0x7FF; + int fileregaddr = 0x7F; + int constant = 0xFF; + int bitaddr = 0x380; + int destinationbit = 0x80; + + switch (instruction & 0x3800){ + case 0b10000000000000: + System.out.println("CALL"); + return; + case 0b10100000000000: + System.out.println("GOTO"); + return; + default: + break; + } + + switch (instruction & 0x3F00){ + case 0b00011100000000: + System.out.println("ADDWF"); + return; + case 0b00010100000000: + System.out.println("ANDWF"); + return; + case 0b00100100000000: + System.out.println("COMF"); + return; + case 0b00001100000000: + System.out.println("DECF"); + return; + case 0b00101100000000: + System.out.println("DECFSZ"); + return; + case 0b00101000000000: + System.out.println("INCF"); + return; + case 0b00111100000000: + System.out.println("INCFSZ"); + return; + case 0b00010000000000: + System.out.println("IORWF"); + return; + case 0b00100000000000: + System.out.println("MOVF"); + return; + case 0b00110100000000: + System.out.println("RLF"); + return; + case 0b00001000000000: + System.out.println("SUBWF"); + return; + case 0b00111000000000: + System.out.println("SWAPF"); + return; + case 0b00011000000000: + System.out.println("XORWF"); + return; + case 0b11100100000000: + System.out.println("ANDLW"); + return; + case 0b11101000000000: + System.out.println("XORLW"); + return; + case 0b11100000000000: + System.out.println("IORLW"); + return; + default: + break; + } + + switch (instruction & 0x3F80){ + case 0b00000110000000: + System.out.println("CLRF"); + return; + case 0b00000100000000: + System.out.println("CLRW"); + return; + case 0b00000010000000: + System.out.println("MOVWF"); + return; + default: + break; + } + + switch (instruction & 0x3C00){ + case 0b01000000000000: + System.out.println("BCF"); + return; + case 0b01010000000000: + System.out.println("BSF"); + return; + case 0b01100000000000: + System.out.println("BTFSC"); + return; + case 0b01110000000000: + System.out.println("BTFSS"); + return; + case 0b11000000000000: + System.out.println("MOVLW"); + return; + case 0b11010000000000: + System.out.println("RETLW"); + return; + default: + break; + } + + switch (instruction & 0x3E00){ + case 0b11111000000000: + System.out.println("ADDLW"); + return; + case 0b11110000000000: + System.out.println("SUBLW"); + return; + default: + break; + } + + switch (instruction){ + case 0b01100100: + System.out.println("CLRWDT"); + return; + case 0b1001: + System.out.println("RETFIE"); + return; + case 0b1000: + System.out.println("RETURN"); + return; + case 0b01100011: + System.out.println("SLEEP"); + return; + default: + break; + } + + if (instruction == 0 || instruction == 0b0110000 || instruction == 0b01000000 || instruction == 0b00100000){ + System.out.println("NOP"); + } + else{ + System.out.println("Nicht gefunden!"); + } + } +} diff --git a/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java b/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java index 884df5b..5aaabc3 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java +++ b/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java @@ -12,6 +12,8 @@ import java.io.IOException; import java.util.Arrays; public class Controller_FileSelect { + private int [] prog; + @FXML protected void selectFileLST(ActionEvent event) throws IOException { FileChooser fileChooser = new FileChooser(); @@ -22,15 +24,25 @@ public class Controller_FileSelect { File selectedFile = fileChooser.showOpenDialog(new Stage()); if (selectedFile != null) { - int [] prog = ParseFile.parseTestDatei(selectedFile.getAbsolutePath()); - System.out.println(Arrays.toString(prog)); + prog = ParseFile.parseDatei(selectedFile.getAbsolutePath()); Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); FXMLLoader fxmlLoader = new FXMLLoader(CreateWindow.class.getResource("MainBody.fxml")); Scene scene = new Scene(fxmlLoader.load(), 1200, 800); stage.setTitle("PIC16F84-Simulator - Hauptseite"); stage.setScene(scene); stage.show(); + System.out.println("\n"); + for (int i : prog){ + if (i!=0) { + Commands.decode(i); + } + } } } + public int[] getProg() { + return prog; + } + + } diff --git a/src/main/java/fabrik/simulator/pic16f84/Controller_MainBody.java b/src/main/java/fabrik/simulator/pic16f84/Controller_MainBody.java index 6c51e72..6b2e25f 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Controller_MainBody.java +++ b/src/main/java/fabrik/simulator/pic16f84/Controller_MainBody.java @@ -1,4 +1,5 @@ package fabrik.simulator.pic16f84; public class Controller_MainBody { + } diff --git a/src/main/java/fabrik/simulator/pic16f84/DataRegister.java b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java new file mode 100644 index 0000000..5f0eaa0 --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java @@ -0,0 +1,36 @@ +package fabrik.simulator.pic16f84; + +import java.util.Arrays; + +public class DataRegister { + + + private static int [] dataRegister = new int[0xFF]; + + + public static void initDataRegister() { + dataRegister[0x2] = 0b0; + dataRegister[0x3] = 0b00011000; + dataRegister[0xA] = 0b0; + dataRegister[0xB] = 0b0; + + dataRegister[0x81] = 0b11111111; + dataRegister[0x82] = 0b0; + dataRegister[0x83] = 0b00011000; + dataRegister[0x85] = 0b11111000; + dataRegister[0x86] = 0b11111111; + dataRegister[0x88] = 0b0; + dataRegister[0x8A] = 0b0; + dataRegister[0x8B] = 0b0; + System.out.println(Arrays.toString(dataRegister)); + } + + public static int[] getDataRegister() { + return dataRegister; + } + + public static int getBit(int address, int bit) { + return (dataRegister[address] >> bit) & 1; + } + +} diff --git a/src/main/java/fabrik/simulator/pic16f84/ParseFile.java b/src/main/java/fabrik/simulator/pic16f84/ParseFile.java index 8662455..4c09d2c 100644 --- a/src/main/java/fabrik/simulator/pic16f84/ParseFile.java +++ b/src/main/java/fabrik/simulator/pic16f84/ParseFile.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.List; public class ParseFile { - public static int[] parseTestDatei(String dateiPfad) { + public static int[] parseDatei(String dateiPfad) { List zeilen = new ArrayList<>(); // Bei diesem Schritt wird jetzt Zeile für Zeile das richtige Programm eingelesen