From 8c0d6fb921e677f8e0741c4e9f7430f15ba094c2 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 24 Jul 2023 18:05:00 -0400 Subject: [PATCH 001/199] Binary: parse binary literal e.g. `0b101010` --- src/rars/util/Binary.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/rars/util/Binary.java b/src/rars/util/Binary.java index 5577f456..013d2e04 100644 --- a/src/rars/util/Binary.java +++ b/src/rars/util/Binary.java @@ -414,6 +414,18 @@ public static Integer stringToIntFast(String s){ return null; } } + }else if(s.length() > 2+i && s.charAt(i) == '0' && (s.charAt(i+1) == 'b' || s.charAt(i+1) == 'B')) { // Binary case + if(s.length() > 32+2+i) return null; // This must overflow or contain invalid characters + i += 2; + for(; i < s.length(); i++) { + char c = s.charAt(i); + result *= 2; + if ('0' <= c && c <= '1') { + result += c - '0'; + } else { + return null; + } + } }else if (first == '0'){ // Octal case if(s.length() > 12+i) return null; // This must overflow or contain invalid characters for(; i < s.length(); i++){ From f673d18a0951e0a20e3d8d04d7ff7a1d4f285a40 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 24 Jul 2023 18:05:40 -0400 Subject: [PATCH 002/199] tests: add literal.s for minimal literal check --- test/literal.s | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test/literal.s diff --git a/test/literal.s b/test/literal.s new file mode 100644 index 00000000..9341822e --- /dev/null +++ b/test/literal.s @@ -0,0 +1,14 @@ +#stdout:168 +.text +main: + li a0, 42 + addi a0, a0, '*' + addi a0, a0, 0x2a + addi a0, a0, 0b101010 + li a7, 1 # print integer + ecall + +success: + li a0, 42 + li a7, 93 + ecall From b001241ca93efc84679d83b45a8fc47c908e96f2 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 7 Aug 2023 16:54:32 -0400 Subject: [PATCH 003/199] Test.java: fix #stdin marker --- test/Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test.java b/test/Test.java index 5b690814..8f33ec53 100644 --- a/test/Test.java +++ b/test/Test.java @@ -89,7 +89,7 @@ public static String run(String path, Program p){ for(int i = 0; i < linenumbers.length; i++){ errorlines[i] = Integer.parseInt(linenumbers[i].trim()); } - } else if (line.startsWith("stdin:")) { + } else if (line.startsWith("#stdin:")) { stdin = line.replaceFirst("#stdin:", "").replaceAll("\\\\n","\n"); } else if (line.startsWith("#stdout:")) { stdout = line.replaceFirst("#stdout:", "").replaceAll("\\\\n","\n"); From dbb86778b15a57e970a3d118cf5dd35f9ac0566e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 7 Aug 2023 16:58:41 -0400 Subject: [PATCH 004/199] Test: add test for ReadString and Read --- test/read.s | 73 +++++++++++++++++++++++++++++++++ test/readstring.s | 100 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 test/read.s create mode 100644 test/readstring.s diff --git a/test/read.s b/test/read.s new file mode 100644 index 00000000..7efc0b94 --- /dev/null +++ b/test/read.s @@ -0,0 +1,73 @@ +#stdin:hello\nworldXremain +#stdout:11hello\nworld....\n1Xello\nworld....\n0Xello\nworld....\n6remainworld....\n0remainworld....\n + +.eqv PrintInt, 1 +.eqv Read, 63 +.eqv PrintString, 4 + +# Expect to read one and half line "hello\nworld" +li a0, 0 +la a1, buf +li a2, 11 +li a7, Read +ecall +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read only a character +li a0, 0 +la a1, buf +li a2, 1 +li a7, Read +ecall +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read nothing +li a0, 0 +la a1, buf +li a2, 0 # nothing +li a7, Read +ecall +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read what remains +li a0, 0 +la a1, buf +li a2, 12 +li a7, Read +ecall +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read nothing, it's EOF +li a0, 0 +la a1, buf +li a2, 12 +li a7, Read +ecall +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +li a0, 42 +li a7, 93 # Exit2 +ecall + +.data +buf: .string "...............\n" diff --git a/test/readstring.s b/test/readstring.s new file mode 100644 index 00000000..f70fab1b --- /dev/null +++ b/test/readstring.s @@ -0,0 +1,100 @@ +#stdin:hello\n\nworldNOTWORLD\nXXXX\nYYYY\nremain +#stdout:0hello\n1\n2world34A5remain\n6\n + +.eqv PrintInt, 1 +.eqv ReadString, 8 +.eqv PrintString, 4 + +# Expect to read one line "hello\n" +la a0, buf +li a1, 256 +li a7, ReadString +ecall +li a0, 0 +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read an empty line +la a0, buf +li a1, 256 +li a7, ReadString +ecall +li a0, 1 +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read "world" only +la a0, buf +li a1, 6 # include space for '\0' +li a7, ReadString +ecall +li a0, 2 +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read nothing +la a0, buf +li a1, 1 # only space for a nullbyte +li a7, ReadString +ecall +li a0, 3 +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read nothing +la a0, buf +li a1, 'A' +sb a1, 0(a0) +sb zero, 1(a0) # Initialize buffer with "A\0" +li a1, 0 # no space for a nullbyte +li a7, ReadString +ecall +li a0, 4 +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read the last line, a "\n" is added +la a0, buf +li a1, 256 +li a7, ReadString +ecall +li a0, 5 +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +# Expect to read only an added "\n". ReadString has no concept of EOF +la a0, buf +li a1, 256 +li a7, ReadString +ecall +li a0, 6 +li a7, PrintInt +ecall +la a0, buf +li a7, PrintString +ecall + +li a0, 42 +li a7, 93 # Exit2 +ecall + +.data +buf: .space 256 From a3ce09c9ac3bec70050b65988a261b7857bcf9d4 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 7 Aug 2023 17:43:18 -0400 Subject: [PATCH 005/199] SystemIO::readChar do not truncate on console Also, return -1 on EOF instead of aborting, so EOF can be managed in asm programs/ Note readChar can also read newlines characters and act on it --- src/rars/util/SystemIO.java | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 3b9b4126..0a7ef67b 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -177,24 +177,29 @@ public static String readString(int serviceNumber, int maxLength) { * Implements syscall having 12 in $v0, to read a char value. * * @param serviceNumber the number assigned to Read Char syscall (default 12) - * @return int value with lowest byte corresponding to user input + * @return int value with lowest byte corresponding to user input or -1 on EOF */ public static int readChar(int serviceNumber) { - int returnValue = 0; - - String input = readStringInternal("0", "Enter a character value (syscall " + serviceNumber + ")", 1); - // The whole try-catch is not really necessary in this case since I'm - // just propagating the runtime exception (the default behavior), but - // I want to make it explicit. The client needs to catch it. - try { - returnValue = (int) (input.charAt(0)); // first character input - } catch (IndexOutOfBoundsException e) // no chars present - { - throw e; // was: returnValue = 0; + int returnValue; + + // Need a popup? + if (Globals.getGui() != null && Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { + String input = readStringInternal("0", "Enter a character value (syscall " + serviceNumber + ")", 1); + if (input.length()>0) + returnValue = input.charAt(0); // truncate + else + returnValue = -1; // assume EOF on empty string + } else { + // Otherwise delegate to the Read syscall + byte[] input = new byte[1]; + int len = readFromFile(0, input, 1); + if (len>0) + returnValue = input[0]; + else + returnValue = -1; } return returnValue; - } From cf7490bfd85006c01ef53a2307c1db45d135e0a2 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 7 Aug 2023 17:43:43 -0400 Subject: [PATCH 006/199] SyscallReadChar: upate documentation to talk about EOF --- src/rars/riscv/syscalls/SyscallReadChar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rars/riscv/syscalls/SyscallReadChar.java b/src/rars/riscv/syscalls/SyscallReadChar.java index 6e7bdd39..223c5889 100644 --- a/src/rars/riscv/syscalls/SyscallReadChar.java +++ b/src/rars/riscv/syscalls/SyscallReadChar.java @@ -36,7 +36,7 @@ a copy of this software and associated documentation files (the public class SyscallReadChar extends AbstractSyscall { public SyscallReadChar() { - super("ReadChar", "Reads a character from input console", "N/A", "a0 = the character"); + super("ReadChar", "Reads a character from input console", "N/A", "a0 = the character or -1 if end of input."); } public void simulate(ProgramStatement statement) throws ExitingException { From d8dcae0311f06d4d9d1fb2d2062a91443e6f294f Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 7 Aug 2023 17:44:13 -0400 Subject: [PATCH 007/199] SyscallReadString: fix documentation as a1 is the size of the buffer --- src/rars/riscv/syscalls/SyscallReadString.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rars/riscv/syscalls/SyscallReadString.java b/src/rars/riscv/syscalls/SyscallReadString.java index 39acfd3a..718e7b98 100644 --- a/src/rars/riscv/syscalls/SyscallReadString.java +++ b/src/rars/riscv/syscalls/SyscallReadString.java @@ -50,7 +50,7 @@ a copy of this software and associated documentation files (the public class SyscallReadString extends AbstractSyscall { public SyscallReadString() { super("ReadString", "Reads a string from the console", - "a0 = address of input buffer
a1 = maximum number of characters to read", "N/A"); + "a0 = address of input buffer
a1 = size of the buffer", "N/A"); } public void simulate(ProgramStatement statement) throws ExitingException { From 8eb221af5c74e4cbd60582468816142db899475d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 7 Aug 2023 17:45:33 -0400 Subject: [PATCH 008/199] add test/readchar.s --- test/readchar.s | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 test/readchar.s diff --git a/test/readchar.s b/test/readchar.s new file mode 100644 index 00000000..38baaad2 --- /dev/null +++ b/test/readchar.s @@ -0,0 +1,24 @@ +#stdin:a b\n\n! +#stdout:97a32 98b10\n10\n33!-1ÿ-1ÿ + +.eqv PrintInt, 1 +.eqv ReadChar, 12 +.eqv PrintChar, 11 + +li s0, 8 +loop: +beqz s0, end +addi s0, s0, -1 +li a7, ReadChar +ecall +li a7, PrintInt +ecall +# Note: lowest byte of -1 is ff, and U+FF is ÿ +li a7, PrintChar +ecall +j loop + +end: +li a0, 42 +li a7, 93 # Exit2 +ecall From 58532090bba4e6d30a3e5bd51c19216dcd759d91 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 9 Aug 2023 18:00:38 -0400 Subject: [PATCH 009/199] MessagesPane: Force black text color on yellow selection --- src/rars/venus/MessagesPane.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index de18296e..a0a3aedc 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -114,6 +114,7 @@ public void mouseClicked(MouseEvent e) { if (text.startsWith(ErrorList.ERROR_MESSAGE_PREFIX) || text.startsWith(ErrorList.WARNING_MESSAGE_PREFIX)) { assemble.select(lineStart, lineEnd); assemble.setSelectionColor(Color.YELLOW); + assemble.setSelectedTextColor(Color.BLACK); assemble.repaint(); int separatorPosition = text.indexOf(ErrorList.MESSAGE_SEPARATOR); if (separatorPosition >= 0) { @@ -214,6 +215,7 @@ public void selectErrorMessage(String fileName, int line, int column) { lineStart = assemble.getLineStartOffset(textLine); lineEnd = assemble.getLineEndOffset(textLine); assemble.setSelectionColor(Color.YELLOW); + assemble.setSelectedTextColor(Color.BLACK); assemble.select(lineStart, lineEnd); assemble.getCaret().setSelectionVisible(true); assemble.repaint(); From 9fc05fa36ab497fd8c294f3860824b0f8f53db4c Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 17 Aug 2023 21:25:51 -0400 Subject: [PATCH 010/199] update README --- README.md | 50 +++++--------------------------------------------- 1 file changed, 5 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index dda4f4eb..98c9fee6 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,7 @@ -RARS -- RISC-V Assembler and Runtime Simulator ----------------------------------------------- +# RARSM -- RISC-V Assembler and Runtime Simulator (iMproved) -RARS, the RISC-V Assembler, Simulator, and Runtime, will assemble and simulate -the execution of RISC-V assembly language programs. Its primary goal is to be -an effective development environment for people getting started with RISC-V. +Fork of [RARSM](https://github.com/TheThirdOne/rars) with added features (PRed updtream) -## Features - - - RISC-V IMFDN Base (riscv32 and riscv64) - - Several system calls that match behaviour from MARS or SPIKE. - - Support for debugging using breakpoints and/or `ebreak` - - Side by side comparison from psuedo-instruction to machine code with - intermediate steps - - Multifile assembly using either files open or a directory - -## Documentation - -Documentation for supported [instructions](https://github.com/TheThirdOne/rars/wiki/Supported-Instructions), [system calls](https://github.com/TheThirdOne/rars/wiki/Environment-Calls), [assembler directives](https://github.com/TheThirdOne/rars/wiki/Assembler-Directives) and more can be found on the [wiki](https://github.com/TheThirdOne/rars/wiki). Documentation included in the download can be accessed via the help menu. - -## Download - -RARS is distributed as an executable jar. You will need at least Java 8 to run it. - -The latest stable release can be found [here](https://github.com/TheThirdOne/rars/releases/latest), a release with the latest developments can be found on the [continuous release](https://github.com/TheThirdOne/rars/releases/tag/continuous), and the [releases page](https://github.com/TheThirdOne/rars/releases) contains all previous stable releases with patch notes. - -Alternatively, if you wish to make your own jar and/or modify the code, you -should clone the repo with `git clone https://github.com/TheThirdOne/rars --recursive`. -Running the script `./build-jar.sh` on a Unix system will build `rars.jar`. - -## Screenshot - -![Screenshot of sample program](screenshot.png) - -## Changes from MARS 4.5 - -RARS was built on MARS 4.5 and owes a lot to the development of MARS; its -important to note what are new developments and what come straight from MARS. -Besides moving from supporting MIPS to RISC-V and the associated small changes, -there are several general changes worth noting. - - - Instructions can now be hot-loaded like Tools. If you want to support an additional extension to the RISC-V instruction set. the .class files just need to be added to the right folder - - ScreenMagnifier, MARS Bot, Intro to Tools, Scavenger Hunt, and MARS Xray were removed from the included tools. ScreenMagnifier, MARS Bot, Intro to Tools, and Scavenger Hunt were removed because they provide little benefit. And MARS Xray was removed because it is not set up to work with RISC-V, however if someone ports it, it could be merged in. - - Removed delayed branching - - Removed the print feature - - Added a testing framework to verify compatability with the RISC-V specification - - Significant internal restructuring and refactoring. +* https://github.com/TheThirdOne/rars/pull/192 +* https://github.com/TheThirdOne/rars/pull/191 +* https://github.com/TheThirdOne/rars/pull/190 From 1f442a193c7067bd334555b27ddbc607afa6cf8d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 18 Aug 2023 09:02:42 -0400 Subject: [PATCH 011/199] add RegisterFile.getValueLong(String) like the non-Long method --- src/rars/riscv/hardware/RegisterFile.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rars/riscv/hardware/RegisterFile.java b/src/rars/riscv/hardware/RegisterFile.java index ac5ece2c..41c02640 100644 --- a/src/rars/riscv/hardware/RegisterFile.java +++ b/src/rars/riscv/hardware/RegisterFile.java @@ -119,7 +119,10 @@ public static int getValue(int num) { public static long getValueLong(int num) { return instance.getValue(num); + } + public static long getValueLong(String name) { + return instance.getValue(name); } /** From 4cec33b38a5f0b44ca0d8b558833ed160ef06fe9 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 18 Aug 2023 09:04:28 -0400 Subject: [PATCH 012/199] SyscallPrintIntyscallPrintInt*: use long versions on RV64 --- src/rars/riscv/syscalls/SyscallPrintInt.java | 2 +- src/rars/riscv/syscalls/SyscallPrintIntBinary.java | 7 ++++++- src/rars/riscv/syscalls/SyscallPrintIntHex.java | 7 ++++++- src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java | 8 ++++++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallPrintInt.java b/src/rars/riscv/syscalls/SyscallPrintInt.java index 81a41377..9a94543f 100644 --- a/src/rars/riscv/syscalls/SyscallPrintInt.java +++ b/src/rars/riscv/syscalls/SyscallPrintInt.java @@ -39,6 +39,6 @@ public SyscallPrintInt() { } public void simulate(ProgramStatement statement) { - SystemIO.printString(Integer.toString(RegisterFile.getValue("a0"))); + SystemIO.printString(Long.toString(RegisterFile.getValueLong("a0"))); } } \ No newline at end of file diff --git a/src/rars/riscv/syscalls/SyscallPrintIntBinary.java b/src/rars/riscv/syscalls/SyscallPrintIntBinary.java index 6d1cd0cd..7670d5e9 100644 --- a/src/rars/riscv/syscalls/SyscallPrintIntBinary.java +++ b/src/rars/riscv/syscalls/SyscallPrintIntBinary.java @@ -2,6 +2,7 @@ import rars.ProgramStatement; import rars.riscv.AbstractSyscall; +import rars.riscv.InstructionSet; import rars.riscv.hardware.RegisterFile; import rars.util.Binary; import rars.util.SystemIO; @@ -40,6 +41,10 @@ public SyscallPrintIntBinary() { } public void simulate(ProgramStatement statement) { - SystemIO.printString(Binary.intToBinaryString(RegisterFile.getValue("a0"))); + if (InstructionSet.rv64) { + SystemIO.printString(Binary.longToBinaryString(RegisterFile.getValueLong("a0"))); + } else { + SystemIO.printString(Binary.intToBinaryString(RegisterFile.getValue("a0"))); + } } } \ No newline at end of file diff --git a/src/rars/riscv/syscalls/SyscallPrintIntHex.java b/src/rars/riscv/syscalls/SyscallPrintIntHex.java index eb3853a8..833187fe 100644 --- a/src/rars/riscv/syscalls/SyscallPrintIntHex.java +++ b/src/rars/riscv/syscalls/SyscallPrintIntHex.java @@ -2,6 +2,7 @@ import rars.ProgramStatement; import rars.riscv.AbstractSyscall; +import rars.riscv.InstructionSet; import rars.riscv.hardware.RegisterFile; import rars.util.Binary; import rars.util.SystemIO; @@ -40,6 +41,10 @@ public SyscallPrintIntHex() { } public void simulate(ProgramStatement statement) { - SystemIO.printString(Binary.intToHexString(RegisterFile.getValue("a0"))); + if (InstructionSet.rv64) { + SystemIO.printString(Binary.longToHexString(RegisterFile.getValueLong("a0"))); + } else { + SystemIO.printString(Binary.intToHexString(RegisterFile.getValue("a0"))); + } } } \ No newline at end of file diff --git a/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java b/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java index e0c72948..80ed915f 100644 --- a/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java +++ b/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java @@ -2,6 +2,7 @@ import rars.ProgramStatement; import rars.riscv.AbstractSyscall; +import rars.riscv.InstructionSet; import rars.riscv.hardware.RegisterFile; import rars.util.Binary; import rars.util.SystemIO; @@ -40,7 +41,10 @@ public SyscallPrintIntUnsigned() { } public void simulate(ProgramStatement statement) { - SystemIO.printString( - Binary.unsignedIntToIntString(RegisterFile.getValue("a0"))); + if (InstructionSet.rv64) { + SystemIO.printString(Long.toUnsignedString(RegisterFile.getValueLong("a0"))); + } else { + SystemIO.printString(Integer.toUnsignedString(RegisterFile.getValue("a0"))); + } } } \ No newline at end of file From bcae219ae0178d65faaea61b6ae8b97d96a30d30 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 18 Aug 2023 09:06:39 -0400 Subject: [PATCH 013/199] test/ SysPrintInt* for RV32 and RV64 --- test/riscv-tests-64/sysprintint.s | 44 +++++++++++++++++++++++++++++++ test/riscv-tests/sysprintint.s | 38 ++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 test/riscv-tests-64/sysprintint.s create mode 100644 test/riscv-tests/sysprintint.s diff --git a/test/riscv-tests-64/sysprintint.s b/test/riscv-tests-64/sysprintint.s new file mode 100644 index 00000000..0334703a --- /dev/null +++ b/test/riscv-tests-64/sysprintint.s @@ -0,0 +1,44 @@ +#stdout:2147483647 0x000000007fffffff 0000000000000000000000000000000001111111111111111111111111111111 2147483647\n2147483648 0x0000000080000000 0000000000000000000000000000000010000000000000000000000000000000 2147483648\n-2147483648 0xffffffff80000000 1111111111111111111111111111111110000000000000000000000000000000 18446744071562067968\n9223372036854775807 0x7fffffffffffffff 0111111111111111111111111111111111111111111111111111111111111111 9223372036854775807\n-9223372036854775808 0x8000000000000000 1000000000000000000000000000000000000000000000000000000000000000 9223372036854775808\n-9223372036854775808 0x8000000000000000 1000000000000000000000000000000000000000000000000000000000000000 9223372036854775808\n +li s0, 0x7FFFFFFF +jal printAll +addi s0, s0, 1 +jal printAll +neg s0, s0 +jal printAll +li s0, 0x7FFFFFFFFFFFFFFF +jal printAll +addi s0, s0, 1 +jal printAll +neg s0, s0 +jal printAll + +li a0, 42 +li a7, 93 +ecall + +printAll: +li a7, 1 # PrintInt +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, ' ' +ecall +li a7, 34 # PrintIntHex +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, ' ' +ecall +li a7, 35 # PrintIntBinary +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, ' ' +ecall +li a7, 36 # PrintIntUnsigned +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, '\n' +ecall +ret diff --git a/test/riscv-tests/sysprintint.s b/test/riscv-tests/sysprintint.s new file mode 100644 index 00000000..0172ad92 --- /dev/null +++ b/test/riscv-tests/sysprintint.s @@ -0,0 +1,38 @@ +#stdout:2147483647 0x7fffffff 01111111111111111111111111111111 2147483647\n-2147483648 0x80000000 10000000000000000000000000000000 2147483648\n-2147483648 0x80000000 10000000000000000000000000000000 2147483648\n +li s0, 0x7FFFFFFF +jal printAll +addi s0, s0, 1 +jal printAll +neg s0, s0 +jal printAll + +li a0, 42 +li a7, 93 +ecall + +printAll: +li a7, 1 # PrintInt +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, ' ' +ecall +li a7, 34 # PrintIntHex +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, ' ' +ecall +li a7, 35 # PrintIntBinary +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, ' ' +ecall +li a7, 36 # PrintIntUnsigned +mv a0, s0 +ecall +li a7, 11 # PrintChar +li a0, '\n' +ecall +ret From 2be51b2bd873eb63c28c9b3a2ff51cd96599944e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 18 Aug 2023 09:18:31 -0400 Subject: [PATCH 014/199] update README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 98c9fee6..09f8f051 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ Fork of [RARSM](https://github.com/TheThirdOne/rars) with added features (PRed updtream) -* https://github.com/TheThirdOne/rars/pull/192 -* https://github.com/TheThirdOne/rars/pull/191 * https://github.com/TheThirdOne/rars/pull/190 +* https://github.com/TheThirdOne/rars/pull/191 +* https://github.com/TheThirdOne/rars/pull/192 +* https://github.com/TheThirdOne/rars/pull/193 From ca74178ec4307083d58446df62fbb8b775bb15e4 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 24 Aug 2023 09:18:04 -0400 Subject: [PATCH 015/199] ProgramArgumentList: correct handling on 64 bit mode in 64bit mode, argc and pointers in argv are 64 bit wide in memory. This change makes the argc/argv more consistent with the expected memory handling in 64 bit. It also makes assembly code compatible with the Linux-RV64 ABI Signed-off-by: Jean Privat --- src/rars/simulator/ProgramArgumentList.java | 22 +++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/rars/simulator/ProgramArgumentList.java b/src/rars/simulator/ProgramArgumentList.java index a3b7fa55..6d8fefe1 100644 --- a/src/rars/simulator/ProgramArgumentList.java +++ b/src/rars/simulator/ProgramArgumentList.java @@ -1,6 +1,7 @@ package rars.simulator; import rars.Globals; +import rars.riscv.InstructionSet; import rars.riscv.hardware.AddressErrorException; import rars.riscv.hardware.Memory; import rars.riscv.hardware.RegisterFile; @@ -131,7 +132,7 @@ public void storeProgramArguments() { if (programArgumentList == null || programArgumentList.size() == 0) { return; } - // Runtime stack initialization from stack top-down (each is 4 bytes) : + // Runtime stack initialization from stack top-down (each is 4 bytes, or 8 byte in 64bit mode) : // programArgumentList.size() // address of first character of first program argument // address of first character of second program argument @@ -152,6 +153,7 @@ public void storeProgramArguments() { // Etc down to first character of second arg. // Follow this pattern for all remaining arguments. + int xlen = InstructionSet.rv64 ? 8 : Memory.WORD_LENGTH_BYTES; // width of an integer register (pointer size) int highAddress = Memory.stackBaseAddress; // highest non-kernel address, sits "under" stack String programArgument; @@ -175,22 +177,22 @@ public void storeProgramArguments() { // 0x7ffffffc - 0x7fffeffc = 0x00001000 = 4096 bytes. In this case, set // stackAddress to next lower word boundary minus 4 for clearance (since every // byte from highAddress+1 is filled). - stackAddress = highAddress - (highAddress % Memory.WORD_LENGTH_BYTES) - Memory.WORD_LENGTH_BYTES; + stackAddress = highAddress - (highAddress % xlen) - xlen; } - Globals.memory.set(stackAddress, 0, Memory.WORD_LENGTH_BYTES); // null word for end of argv array - stackAddress -= Memory.WORD_LENGTH_BYTES; + Globals.memory.set(stackAddress, 0, xlen); // null word for end of argv array + stackAddress -= xlen; for (int i = argStartAddress.length - 1; i >= 0; i--) { - Globals.memory.set(stackAddress, argStartAddress[i], Memory.WORD_LENGTH_BYTES); - stackAddress -= Memory.WORD_LENGTH_BYTES; + Globals.memory.set(stackAddress, argStartAddress[i], xlen); + stackAddress -= xlen; } - Globals.memory.set(stackAddress, argStartAddress.length, Memory.WORD_LENGTH_BYTES); // argc - stackAddress -= Memory.WORD_LENGTH_BYTES; + Globals.memory.set(stackAddress, argStartAddress.length, xlen); // argc + stackAddress -= xlen; // Need to set $sp register to stack address, $a0 to argc, $a1 to argv // Need to by-pass the backstepping mechanism so go directly to Register instead of RegisterFile - RegisterFile.getRegister("sp").setValue(stackAddress + Memory.WORD_LENGTH_BYTES); + RegisterFile.getRegister("sp").setValue(stackAddress + xlen); RegisterFile.getRegister("a0").setValue(argStartAddress.length); // argc - RegisterFile.getRegister("a1").setValue(stackAddress + Memory.WORD_LENGTH_BYTES + Memory.WORD_LENGTH_BYTES); // argv + RegisterFile.getRegister("a1").setValue(stackAddress + xlen + xlen); // argv } catch (AddressErrorException aee) { System.out.println("Internal Error: Memory write error occurred while storing program arguments! " + aee); System.exit(0); From dc37a8f0972764de18078d965b83cdacd1fc64ca Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 24 Aug 2023 09:19:43 -0400 Subject: [PATCH 016/199] args64 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 09f8f051..dceff8eb 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,4 @@ Fork of [RARSM](https://github.com/TheThirdOne/rars) with added features (PRed u * https://github.com/TheThirdOne/rars/pull/191 * https://github.com/TheThirdOne/rars/pull/192 * https://github.com/TheThirdOne/rars/pull/193 +* https://github.com/TheThirdOne/rars/pull/194 From 38cac927b2664eaef9a17ad3748a179297e37ab6 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 28 Aug 2023 19:04:49 -0400 Subject: [PATCH 017/199] Syscall.properties: Open is not compatible with spike And fix typos --- src/Syscall.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Syscall.properties b/src/Syscall.properties index 9d1f500e..7c697741 100644 --- a/src/Syscall.properties +++ b/src/Syscall.properties @@ -1,17 +1,17 @@ -# Spike compatable calls +# Spike and Linux compatible calls GetCWD = 17 Close = 57 LSeek = 62 Read = 63 Write = 64 Exit2 = 93 -Open = 1024 -# Almost compatable +# Almost compatible Sbrk = 9 Time = 30 +Open = 1024 -# MARS / SPIM compatability +# MARS / SPIM compatibility PrintInt = 1 PrintFloat = 2 PrintDouble = 3 @@ -44,6 +44,6 @@ MessageDialogInt = 56 MessageDialogDouble = 58 MessageDialogString = 59 -# Not compatable +# Not compatible # Collided with Close (57) MessageDialogFloat = 60 \ No newline at end of file From ae48052191e2d295e084fe0b15d2d76973444031 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 28 Aug 2023 19:05:56 -0400 Subject: [PATCH 018/199] New system call brk that is compatible with the Linux one Same code can run in RARS/bare metal/qemu --- src/Syscall.properties | 3 ++ src/rars/riscv/syscalls/SyscallBrk.java | 50 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/rars/riscv/syscalls/SyscallBrk.java diff --git a/src/Syscall.properties b/src/Syscall.properties index 7c697741..f0f4d4e1 100644 --- a/src/Syscall.properties +++ b/src/Syscall.properties @@ -11,6 +11,9 @@ Sbrk = 9 Time = 30 Open = 1024 +# Compatible with Linux +Brk = 214 + # MARS / SPIM compatibility PrintInt = 1 PrintFloat = 2 diff --git a/src/rars/riscv/syscalls/SyscallBrk.java b/src/rars/riscv/syscalls/SyscallBrk.java new file mode 100644 index 00000000..841f888c --- /dev/null +++ b/src/rars/riscv/syscalls/SyscallBrk.java @@ -0,0 +1,50 @@ +package rars.riscv.syscalls; + +import rars.ExitingException; +import rars.Globals; +import rars.ProgramStatement; +import rars.riscv.AbstractSyscall; +import rars.riscv.hardware.RegisterFile; + +/* +Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar + +Developed by Pete Sanderson (psanderson@otterbein.edu) +and Kenneth Vollmar (kenvollmar@missouristate.edu) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject +to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +(MIT license, http://www.opensource.org/licenses/mit-license.html) + */ + +public class SyscallBrk extends AbstractSyscall { + public SyscallBrk() { + super("Brk", "Set and get heap address. Is compatible with the low level Linux brk syscall (not the POSIX one).", "a0 = wanted heap address, or 0 to get it", "a0 = resulting heap address"); + } + + public void simulate(ProgramStatement statement) { + int val = RegisterFile.getValue("a0"); + if (val >= Globals.memory.heapBaseAddress && val < Globals.memory.dataSegmentLimitAddress ) { + // no alignment, just a plain address to use now + Globals.memory.heapAddress = val; + } + RegisterFile.updateRegister("a0", Globals.memory.heapAddress); + } +} \ No newline at end of file From 1e136d3117acaa53752bcb6a8ae22f018d79c5c2 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 28 Aug 2023 19:11:09 -0400 Subject: [PATCH 019/199] brk --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dceff8eb..522cb034 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,4 @@ Fork of [RARSM](https://github.com/TheThirdOne/rars) with added features (PRed u * https://github.com/TheThirdOne/rars/pull/192 * https://github.com/TheThirdOne/rars/pull/193 * https://github.com/TheThirdOne/rars/pull/194 +* https://github.com/TheThirdOne/rars/pull/195 From 07e1ff7ff75c696166fd1dc3b725e99fb4682c34 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 28 Aug 2023 19:39:39 -0400 Subject: [PATCH 020/199] Memory.allocateBytesFromHeap align on 8 bytes on RV64 --- src/rars/riscv/hardware/Memory.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/rars/riscv/hardware/Memory.java b/src/rars/riscv/hardware/Memory.java index df578613..61fdb977 100644 --- a/src/rars/riscv/hardware/Memory.java +++ b/src/rars/riscv/hardware/Memory.java @@ -5,6 +5,7 @@ import rars.Settings; import rars.SimulationException; import rars.riscv.Instruction; +import rars.riscv.InstructionSet; import rars.util.Binary; import java.util.Collection; @@ -337,7 +338,7 @@ private void initialize() { * Returns the next available word-aligned heap address. There is no recycling and * no heap management! There is however nearly 4MB of heap space available in Rars. * - * @param numBytes Number of bytes requested. Should be multiple of 4, otherwise next higher multiple of 4 allocated. + * @param numBytes Number of bytes requested. Should be multiple of the architecture size (4 in RV32 or 8 in RV64) , otherwise next higher multiple of the arch size allocated. * @return address of allocated heap storage. * @throws IllegalArgumentException if number of requested bytes is negative or exceeds available heap storage */ @@ -347,8 +348,9 @@ public int allocateBytesFromHeap(int numBytes) throws IllegalArgumentException { throw new IllegalArgumentException("request (" + numBytes + ") is negative heap amount"); } int newHeapAddress = heapAddress + numBytes; - if (newHeapAddress % 4 != 0) { - newHeapAddress = newHeapAddress + (4 - newHeapAddress % 4); // next higher multiple of 4 + int size = InstructionSet.rv64 ? 8 : 4; + if (newHeapAddress % size != 0) { + newHeapAddress = newHeapAddress + (size - newHeapAddress % size); // next higher multiple of 4 } if (newHeapAddress >= dataSegmentLimitAddress) { throw new IllegalArgumentException("request (" + numBytes + ") exceeds available heap storage"); From 37150d5f65835c42895ef5cb718753f1652bb9b6 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 29 Aug 2023 17:29:20 -0400 Subject: [PATCH 021/199] Workaround for broken Memory.set when length>4 --- src/rars/riscv/hardware/Memory.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rars/riscv/hardware/Memory.java b/src/rars/riscv/hardware/Memory.java index 61fdb977..3efc9f62 100644 --- a/src/rars/riscv/hardware/Memory.java +++ b/src/rars/riscv/hardware/Memory.java @@ -377,6 +377,10 @@ public int allocateBytesFromHeap(int numBytes) throws IllegalArgumentException { // Allocates blocks if necessary. public int set(int address, int value, int length) throws AddressErrorException { + // This method is very complex and produce wrong results if length>4 + // So clamp the length to 4 + if (length > 4) length = 4; + int oldValue = 0; if (Globals.debug) System.out.println("memory[" + address + "] set to " + value + "(" + length + " bytes)"); int relativeByteAddress; From f19316ba060f00e09569031199629e4e6743a4b3 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 29 Aug 2023 17:29:48 -0400 Subject: [PATCH 022/199] Add missing pseudo-ops sd for rv64 --- src/PseudoOps-64.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/PseudoOps-64.txt b/src/PseudoOps-64.txt index a82ad405..cbc67454 100644 --- a/src/PseudoOps-64.txt +++ b/src/PseudoOps-64.txt @@ -34,3 +34,8 @@ ld t1,-100 ;ld RG1, VL2(x0) ;#Load Double word : Set t1 to contents of effec ld t1,10000000 ;lui RG1, VH2 ;ld RG1, VL2(RG1) ;#Load Double word : Set t1 to contents of effective memory word address ld t1,label ;auipc RG1, PCH2 ;ld RG1, PCL2(RG1) ;#Load Double word : Set t1 to contents of memory word at label's address ld t1,%lo(label)(t2) ;ld RG1,LL4(RG7) ;#Load from Address + +sd t1,(t2) ;sd RG1,0(RG3) ;#Store Double Word : Store t1 contents into effective memory word address +sd t1,-100 ;sd RG1, VL2(x0) ;#Store Double Word : Store $t1 contents into effective memory word address +sd t1,10000000,t2 ;lui RG3, VH2 ;sd RG1, VL2(RG3) ;#Store Double Word : Store $t1 contents into effective memory word address using t2 as a temporary +sd t1,label,t2 ;auipc RG3, PCH2 ;sd RG1, PCL2(RG3) ;#Store Double Word : Store $t1 contents into memory word at label's address using t2 as a temporary From 2a749b8c6a424c259b2894b52d4952c9e6371e7a Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 29 Aug 2023 17:31:19 -0400 Subject: [PATCH 023/199] add test for dword with label --- test/dword.s | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 test/dword.s diff --git a/test/dword.s b/test/dword.s new file mode 100644 index 00000000..b9e6ee93 --- /dev/null +++ b/test/dword.s @@ -0,0 +1,25 @@ +#stdout:87654321HGFEDCBA0x100100000x00000000 +.data +data: +.eqv eqv, 0x3132333435363738 +.dword eqv +.dword 0x4142434445464748 + +data2: .dword data +.byte 0 + +.text +li a7, 4 # PrintString +la a0, data +ecall + +la s1, data2 +li a7, 34 # PrintIntHex +lw a0, 0(s1) +ecall +lw a0, 4(s1) +ecall + +li a7, 93 # Exit2 +li a0, 42 +ecall From cadcfd0cecc430cc5860dc8f36fdedb43a721d0d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 29 Aug 2023 17:35:39 -0400 Subject: [PATCH 024/199] memory64 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 522cb034..7a5c7fae 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # RARSM -- RISC-V Assembler and Runtime Simulator (iMproved) -Fork of [RARSM](https://github.com/TheThirdOne/rars) with added features (PRed updtream) +Fork of [RARS](https://github.com/TheThirdOne/rars) with added features (PRed updtream) * https://github.com/TheThirdOne/rars/pull/190 * https://github.com/TheThirdOne/rars/pull/191 @@ -8,3 +8,4 @@ Fork of [RARSM](https://github.com/TheThirdOne/rars) with added features (PRed u * https://github.com/TheThirdOne/rars/pull/193 * https://github.com/TheThirdOne/rars/pull/194 * https://github.com/TheThirdOne/rars/pull/195 +* https://github.com/TheThirdOne/rars/pull/196 From 3cbededbc301bca25e799f5e95febcbe975d7306 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 5 Sep 2023 14:03:48 -0400 Subject: [PATCH 025/199] Launch: use FlatIntelliJLaf by default --- src/rars/Launch.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rars/Launch.java b/src/rars/Launch.java index 39270e23..52bb8303 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -231,6 +231,11 @@ private void dumpSegments(Program program) { private void launchIDE() { // System.setProperty("apple.laf.useScreenMenuBar", "true"); // Puts RARS menu on Mac OS menu bar + try { + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatIntelliJLaf"); + } catch( Exception ex ) { + System.err.println( "Failed to initialize LaF. Continue with default LaF." ); + } SwingUtilities.invokeLater( new Runnable() { public void run() { From 61f418a90797ba985b1fab26af338db45d43e849 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 5 Sep 2023 14:13:44 -0400 Subject: [PATCH 026/199] quick and dirty script to download and bundle flatlaf --- build-jar-flatlaf.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 build-jar-flatlaf.sh diff --git a/build-jar-flatlaf.sh b/build-jar-flatlaf.sh new file mode 100755 index 00000000..ef0c2d0a --- /dev/null +++ b/build-jar-flatlaf.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +flatlaf="flatlaf-3.2.jar" + +if [ ! -f "$flatlaf" ]; then + curl https://repo1.maven.org/maven2/com/formdev/flatlaf/3.2/flatlaf-3.2.jar -o "$flatlaf" +fi + +rm -r tmp/ +mkdir -p tmp/ +cd tmp/ + + +jar x < ../rars.jar +jar x < "../$flatlaf" + +cat > META-INF/MANIFEST.MF < Date: Tue, 5 Sep 2023 14:23:22 -0400 Subject: [PATCH 027/199] flatlaf --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7a5c7fae..e35cf7ba 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ Fork of [RARS](https://github.com/TheThirdOne/rars) with added features (PRed up * https://github.com/TheThirdOne/rars/pull/194 * https://github.com/TheThirdOne/rars/pull/195 * https://github.com/TheThirdOne/rars/pull/196 +* https://github.com/TheThirdOne/rars/pull/197 From 6a1dc740dd5275586f9ff91b2327a390e42d34db Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 10 Oct 2023 14:54:25 -0400 Subject: [PATCH 028/199] build-jar: force release 8 --- build-jar.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-jar.sh b/build-jar.sh index e072edfb..5ed6e294 100755 --- a/build-jar.sh +++ b/build-jar.sh @@ -1,7 +1,7 @@ #!/bin/bash if git submodule status | grep \( > /dev/null ; then mkdir -p build - find src -name "*.java" | xargs javac -d build + find src -name "*.java" | xargs javac --release 8 -d build if [[ "$OSTYPE" == "darwin"* ]]; then find src -type f -not -name "*.java" -exec rsync -R {} build \; else @@ -14,4 +14,4 @@ if git submodule status | grep \( > /dev/null ; then jar cfm ../rars.jar ./META-INF/MANIFEST.MF * else echo "It looks like JSoftFloat is not cloned. Consider running \"git submodule update --init\"" -fi \ No newline at end of file +fi From 53542845e5e1e3a9c9d6ebbf60da18a2d4e63b8f Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 10 Oct 2023 14:54:25 -0400 Subject: [PATCH 029/199] build-jar: force release 8 --- build-jar.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-jar.sh b/build-jar.sh index e072edfb..5ed6e294 100755 --- a/build-jar.sh +++ b/build-jar.sh @@ -1,7 +1,7 @@ #!/bin/bash if git submodule status | grep \( > /dev/null ; then mkdir -p build - find src -name "*.java" | xargs javac -d build + find src -name "*.java" | xargs javac --release 8 -d build if [[ "$OSTYPE" == "darwin"* ]]; then find src -type f -not -name "*.java" -exec rsync -R {} build \; else @@ -14,4 +14,4 @@ if git submodule status | grep \( > /dev/null ; then jar cfm ../rars.jar ./META-INF/MANIFEST.MF * else echo "It looks like JSoftFloat is not cloned. Consider running \"git submodule update --init\"" -fi \ No newline at end of file +fi From b9d154354a041435cfaafde4cd083beaeb2bd0cc Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 2 Nov 2023 13:27:34 -0400 Subject: [PATCH 030/199] ExecutePane: remove what seems to be an old debugging printting --- src/rars/venus/ExecutePane.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/rars/venus/ExecutePane.java b/src/rars/venus/ExecutePane.java index a489d587..3ededebc 100644 --- a/src/rars/venus/ExecutePane.java +++ b/src/rars/venus/ExecutePane.java @@ -118,7 +118,6 @@ public void setWindowBounds() { Dimension textFullDim = new Dimension((int) (fullWidth), halfHeight); dataSegment.setBounds(0, textDim.height + 1, dataDim.width, dataDim.height); if (labelWindowVisible) { - System.out.println("YEA"); textSegment.setBounds(0, 0, textDim.width, textDim.height); labelValues.setBounds(textDim.width + 1, 0, lablDim.width, lablDim.height); } else { @@ -267,4 +266,4 @@ public void numberDisplayBaseChanged(NumberDisplayBaseChooser chooser) { } } -} \ No newline at end of file +} From 7250860b813bbfcb9c7cbfb9f7ac615f4f7975ed Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 8 Nov 2023 15:28:26 -0500 Subject: [PATCH 031/199] Force a 0 minimum dimension to enable the use on low resolution screen projector --- src/rars/venus/MainPane.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rars/venus/MainPane.java b/src/rars/venus/MainPane.java index 8e5226a0..663c9452 100644 --- a/src/rars/venus/MainPane.java +++ b/src/rars/venus/MainPane.java @@ -82,6 +82,7 @@ public MainPane(VenusUI appFrame, Editor editor, RegistersWindow regs, this.setToolTipTextAt(0, "Text editor for composing RISCV programs."); this.setToolTipTextAt(1, "View and control assembly language program execution. Enabled upon successful assemble."); + editTabbedPane.setMinimumSize(new Dimension(0,0)); /* Listener has one specific purpose: when Execute tab is selected for the * first time, set the bounds of its internal frames by invoking the From 14bd569fd10418a2867c1c8b85200d1cdff2416c Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 21 Dec 2023 12:07:52 -0500 Subject: [PATCH 032/199] For interoperability, force asm source to be UTF-8 on all system --- src/rars/RISCVprogram.java | 5 ++--- src/rars/venus/EditTabbedPane.java | 11 ++++------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/rars/RISCVprogram.java b/src/rars/RISCVprogram.java index d9a9e6a8..afc51a24 100644 --- a/src/rars/RISCVprogram.java +++ b/src/rars/RISCVprogram.java @@ -5,8 +5,7 @@ import rars.simulator.BackStepper; import rars.simulator.Simulator; -import java.io.BufferedReader; -import java.io.FileReader; +import java.io.*; import java.util.ArrayList; import java.util.Arrays; @@ -238,7 +237,7 @@ public void readSource(String file) throws AssemblyException { BufferedReader inputFile; String line; try { - inputFile = new BufferedReader(new FileReader(file)); + inputFile = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); line = inputFile.readLine(); while (line != null) { sourceList.add(line); diff --git a/src/rars/venus/EditTabbedPane.java b/src/rars/venus/EditTabbedPane.java index 5e139378..84e8af77 100644 --- a/src/rars/venus/EditTabbedPane.java +++ b/src/rars/venus/EditTabbedPane.java @@ -13,10 +13,7 @@ import javax.swing.filechooser.FileFilter; import java.awt.*; import java.beans.PropertyChangeListener; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; /* @@ -295,7 +292,7 @@ private boolean saveFile(EditPane editPane) { } File theFile = new File(editPane.getPathname()); try { - BufferedWriter outFileStream = new BufferedWriter(new FileWriter(theFile)); + BufferedWriter outFileStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(theFile), "UTF-8")); outFileStream.write(editPane.getSource(), 0, editPane.getSource().length()); outFileStream.close(); } catch (java.io.IOException c) { @@ -388,7 +385,7 @@ private File saveAsFile(EditPane editPane) { // Either file with selected name does not exist or user wants to // overwrite it, so go for it! try { - BufferedWriter outFileStream = new BufferedWriter(new FileWriter(theFile)); + BufferedWriter outFileStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(theFile), "UTF-8")); outFileStream.write(editPane.getSource(), 0, editPane.getSource().length()); outFileStream.close(); } catch (java.io.IOException c) { @@ -732,4 +729,4 @@ public void propertyChange(java.beans.PropertyChangeEvent e) { } -} \ No newline at end of file +} From 940d0f95341716e2081b99d5c928ee75172acfe6 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 21 Dec 2023 12:11:08 -0500 Subject: [PATCH 033/199] build script: make jar files executable (thanks binfmt_misc) --- build-jar-flatlaf.sh | 1 + build-jar.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/build-jar-flatlaf.sh b/build-jar-flatlaf.sh index ef0c2d0a..ba7ec218 100755 --- a/build-jar-flatlaf.sh +++ b/build-jar-flatlaf.sh @@ -22,3 +22,4 @@ Main-Class: rars.Launch EOF jar cfm ../rars-flatlaf.jar META-INF/MANIFEST.MF * +chmod +x ../rars-flatlaf.jar diff --git a/build-jar.sh b/build-jar.sh index 5ed6e294..6f75fafd 100755 --- a/build-jar.sh +++ b/build-jar.sh @@ -12,6 +12,7 @@ if git submodule status | grep \( > /dev/null ; then cp README.md License.txt build cd build jar cfm ../rars.jar ./META-INF/MANIFEST.MF * + chmod +x ../rars.jar else echo "It looks like JSoftFloat is not cloned. Consider running \"git submodule update --init\"" fi From 4bb7e07e9b862792076523d2dbc2b5a06a720a0a Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 14:47:29 -0500 Subject: [PATCH 034/199] Syscall readInt can read 64bit numbers --- src/rars/util/SystemIO.java | 4 ++-- test/riscv-tests-64/sysreadint.s | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/riscv-tests-64/sysreadint.s diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 0a7ef67b..bdd67006 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -84,10 +84,10 @@ public class SystemIO { * @return int value corresponding to user input */ - public static int readInteger(int serviceNumber) { + public static long readInteger(int serviceNumber) { String input = readStringInternal("0", "Enter an integer value (syscall " + serviceNumber + ")", -1); // Client is responsible for catching NumberFormatException - return Integer.parseInt(input.trim()); + return Long.parseLong(input.trim()); } private static String readStringInternal(String init, String prompt, int maxlength) { diff --git a/test/riscv-tests-64/sysreadint.s b/test/riscv-tests-64/sysreadint.s new file mode 100644 index 00000000..13556144 --- /dev/null +++ b/test/riscv-tests-64/sysreadint.s @@ -0,0 +1,28 @@ +#stdin:1\n-1\n123456789\n2410117871984078658\n + li a7, 5 # ReadInt + + ecall + li a1, 1 + bne a0, a1, fail + + ecall + li a1, -1 + bne a0, a1, fail + + ecall + li a1, 123456789 + bne a0, a1, fail + + ecall + li a1, 2410117871984078658 + bne a0, a1, fail + +pass: + li a0, 42 + li a7, 93 + ecall + +fail: + li a0, 0 + li a7, 93 + ecall From b79b2938113c6cb0a6f310e17dfa00fcdb29a955 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 15:58:50 -0500 Subject: [PATCH 035/199] Binary: add helper that include the length (in bytes) --- src/rars/util/Binary.java | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/rars/util/Binary.java b/src/rars/util/Binary.java index 013d2e04..0f7a820b 100644 --- a/src/rars/util/Binary.java +++ b/src/rars/util/Binary.java @@ -294,6 +294,31 @@ public static String intToHexString(int d) { return t; } + public static String intToHexString(long d, int length) { + System.out.println("hex: " + d + " s:"+ length); + String leadingZero = new String("0"); + String leadingX = new String("0x"); + String t = Long.toUnsignedString(d, 16); + while (t.length() < 2*length) + t = leadingZero.concat(t); + + t = leadingX.concat(t); + return t; + } + + /** + * Perform a sign extension of `length` bytes of `d` as a whole 64bit long value. + * */ + public static long signExtension(long d, int length) { + int l = (8-length)*8; + return (d << l) >> l; + } + + public static String intToDecString(long d, int length) { + d = signExtension(d, length); + return Long.toString(d); + } + /** * Returns a 6 character string representing the 16-bit hexadecimal equivalent of the * given integer value. First two characters are "0x". It assumes value will "fit" @@ -354,8 +379,12 @@ public static String unsignedIntToIntString(int d) { * @return String that represents ASCII equivalent */ public static String intToAscii(int d) { + return intToAscii(d, 4); + } + + public static String intToAscii(long d, int length) { StringBuilder result = new StringBuilder(8); - for (int i = 3; i >= 0; i--) { + for (int i = length-1; i >= 0; i--) { int byteValue = getByte(d, i); result.append((byteValue < Globals.ASCII_TABLE.length) ? Globals.ASCII_TABLE[byteValue] : Globals.ASCII_NON_PRINT); } @@ -616,8 +645,11 @@ public static int setByte(int value, int bite, int replace) { * @return zero-extended byte value in low order byte. **/ - public static int getByte(int value, int bite) { - return value << ((3 - bite) << 3) >>> 24; + public static int getByte(long value, int bite) { + int v = (int)(value >>> (bite*8)) & 0xFF; + System.out.println("getbyte " + value + " b:" + bite + " -> " + v); + return v; + //return (int)(value << ((3 - bite) << 3) >>> 24); } // KENV 1/4/05 From 7afeb9c5b42ed866d3ca809fe39bcff36cfab57b Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 15:59:19 -0500 Subject: [PATCH 036/199] Memory: add gerRaw with a length, return 'unsigned' values --- src/rars/riscv/hardware/Memory.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/rars/riscv/hardware/Memory.java b/src/rars/riscv/hardware/Memory.java index 3efc9f62..6a1562e6 100644 --- a/src/rars/riscv/hardware/Memory.java +++ b/src/rars/riscv/hardware/Memory.java @@ -625,6 +625,19 @@ public int get(int address, int length) throws AddressErrorException { return get(address, length, true); } + public long getRaw(int address, int length) throws AddressErrorException { + if (length == 8) { + long low = get(address, 4, false); + long high = get(address+4, 4, false); + if (low < 0) low += 0x100000000l; + return (high << 32) | low; + } else { + long v = get(address, length, false); + if (v < 0) v += 0x100000000l; + return v; + } + } + // Does the real work, but includes option to NOT notify observers. private int get(int address, int length, boolean notify) throws AddressErrorException { int value = 0; From e9d42723325bbf4d4d60bbe054ded7bda209de6e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 16:00:00 -0500 Subject: [PATCH 037/199] NumberDisplayBaseChooser: add a length parameter --- src/rars/venus/NumberDisplayBaseChooser.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/rars/venus/NumberDisplayBaseChooser.java b/src/rars/venus/NumberDisplayBaseChooser.java index 1d8ed6cc..eb77c907 100644 --- a/src/rars/venus/NumberDisplayBaseChooser.java +++ b/src/rars/venus/NumberDisplayBaseChooser.java @@ -1,6 +1,7 @@ package rars.venus; import rars.Globals; +import rars.riscv.InstructionSet; import rars.util.Binary; import javax.swing.*; @@ -138,20 +139,20 @@ public static String formatUnsignedInteger(int value, int base) { * @param base the numerical base to use (currently 10 or 16) * @return a String equivalent of the value rendered appropriately. */ - public static String formatNumber(int value, int base) { + public static String formatNumber(long value, int base, int length) { String result; switch (base) { case HEXADECIMAL: - result = Binary.intToHexString(value); + result = Binary.intToHexString(value, length); break; case DECIMAL: - result = Integer.toString(value); + result = Binary.intToDecString(value, length); break; case ASCII: - result = Binary.intToAscii(value); + result = Binary.intToAscii(value, length); break; default: - result = Integer.toString(value); + result = Binary.intToDecString(value, length); } return result; // if (base == NumberDisplayBaseChooser.HEXADECIMAL) { @@ -163,11 +164,7 @@ public static String formatNumber(int value, int base) { } public static String formatNumber(long value, int base) { - if (base == NumberDisplayBaseChooser.HEXADECIMAL) { - return Binary.longToHexString(value); - } else { - return Long.toString(value); - } + return formatNumber(value, base, InstructionSet.rv64 ? 8 : 4); } /** From b4642b7784fedd5b5b46bf951439ca653f1938ea Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 16:01:51 -0500 Subject: [PATCH 038/199] make values per row and bytes per row variable --- src/rars/venus/DataSegmentWindow.java | 117 ++++++++++++++------------ 1 file changed, 62 insertions(+), 55 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index ad1c52a1..28011896 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -67,16 +67,16 @@ public class DataSegmentWindow extends JInternalFrame implements Observer { private JButton dataButton, nextButton, prevButton, stakButton, globButton, heapButton, extnButton, mmioButton, textButton; private JCheckBox asciiDisplayCheckBox; - private static final int VALUES_PER_ROW = 8; - private static final int NUMBER_OF_ROWS = 16; // with 8 value columns, this shows 512 bytes; - private static final int NUMBER_OF_COLUMNS = VALUES_PER_ROW + 1;// 1 for address and 8 for values - private static final int BYTES_PER_VALUE = 4; - private static final int BYTES_PER_ROW = VALUES_PER_ROW * BYTES_PER_VALUE; - private static final int MEMORY_CHUNK_SIZE = NUMBER_OF_ROWS * BYTES_PER_ROW; + private int valuesPerRow = 8; + private int numberOfRows = 16; // with 8 value columns, this shows 512 bytes; + private int numberOfColumns; // 1 for address and 8 for values + private int bytesPerValue; + private int bytesPerRow; + private int memoryChunkSize; // PREV_NEXT_CHUNK_SIZE determines how many rows will be scrolled when Prev or Next buttons fire. // MEMORY_CHUNK_SIZE/2 means scroll half a table up or down. Easier to view series that flows off the edge. // MEMORY_CHUNK_SIZE means scroll a full table's worth. Scrolls through memory faster. DPS 26-Jan-09 - private static final int PREV_NEXT_CHUNK_SIZE = MEMORY_CHUNK_SIZE / 2; + private int prevNextChunkSize = memoryChunkSize / 2; private static final int ADDRESS_COLUMN = 0; private static final boolean USER_MODE = false; private static final boolean KERNEL_MODE = true; @@ -173,7 +173,25 @@ public void itemStateChanged(ItemEvent e) { }); features.add(asciiDisplayCheckBox); + contentPane.add(features, BorderLayout.SOUTH); + DataSegmentWindow.this.setDimensions(8, 16, 4); + } + + public void setDimensions(int valuesPerRow, int numberOfRows, int bytesPerValue) { + this.valuesPerRow = valuesPerRow; + this.numberOfRows = numberOfRows; // with 8 value columns, this shows 512 bytes; + numberOfColumns = this.valuesPerRow + 1;// 1 for address and 8 for values + this.bytesPerValue = bytesPerValue; + bytesPerRow = this.valuesPerRow * this.bytesPerValue; + memoryChunkSize = this.numberOfRows * bytesPerRow; + // PREV_NEXT_CHUNK_SIZE determines how many rows will be scrolled when Prev or Next buttons fire. + // MEMORY_CHUNK_SIZE/2 means scroll half a table up or down. Easier to view series that flows off the edge. + // MEMORY_CHUNK_SIZE means scroll a full table's worth. Scrolls through memory faster. DPS 26-Jan-09 + prevNextChunkSize = memoryChunkSize / 2; + + DataSegmentWindow.this.updateValues(); + DataSegmentWindow.this.updateDataAddresses(); } public void updateBaseAddressComboBox() { @@ -274,30 +292,30 @@ private Point displayCellForAddress(int address) { if (baseAddress == -1) { if (desiredComboBoxIndex == GLOBAL_POINTER_ADDRESS_INDEX) { baseAddress = RegisterFile.getValue(RegisterFile.GLOBAL_POINTER_REGISTER) - - (RegisterFile.getValue(RegisterFile.GLOBAL_POINTER_REGISTER) % BYTES_PER_ROW); + - (RegisterFile.getValue(RegisterFile.GLOBAL_POINTER_REGISTER) % bytesPerRow); } else if (desiredComboBoxIndex == STACK_POINTER_BASE_ADDRESS_INDEX) { baseAddress = RegisterFile.getValue(RegisterFile.STACK_POINTER_REGISTER) - - (RegisterFile.getValue(RegisterFile.STACK_POINTER_REGISTER) % BYTES_PER_ROW); + - (RegisterFile.getValue(RegisterFile.STACK_POINTER_REGISTER) % bytesPerRow); } else { return null;// shouldn't happen since these are the only two } } int byteOffset = address - baseAddress; - int chunkOffset = byteOffset / MEMORY_CHUNK_SIZE; - int byteOffsetIntoChunk = byteOffset % MEMORY_CHUNK_SIZE; + int chunkOffset = byteOffset / memoryChunkSize; + int byteOffsetIntoChunk = byteOffset % memoryChunkSize; // Subtract 1 from chunkOffset because we're gonna call the "next" action // listener to get the correct chunk loaded and displayed, and the first // thing it does is increment firstAddress by MEMORY_CHUNK_SIZE. Here // we do an offsetting decrement in advance because we don't want the // increment but we want the other actions that method provides. - firstAddress = firstAddress + chunkOffset * MEMORY_CHUNK_SIZE - PREV_NEXT_CHUNK_SIZE; + firstAddress = firstAddress + chunkOffset * memoryChunkSize - prevNextChunkSize; nextButton.getActionListeners()[0].actionPerformed(null); // STEP 4: Find cell containing this address. Add 1 to column calculation // because table column 0 displays address, not memory contents. The // "convertColumnIndexToView()" is not necessary because the columns cannot be // reordered, but I included it as a precautionary measure in case that changes. - int addrRow = byteOffsetIntoChunk / BYTES_PER_ROW; - int addrColumn = byteOffsetIntoChunk % BYTES_PER_ROW / BYTES_PER_VALUE + 1; + int addrRow = byteOffsetIntoChunk / bytesPerRow; + int addrColumn = byteOffsetIntoChunk % bytesPerRow / bytesPerValue + 1; addrColumn = dataTable.convertColumnIndexToView(addrColumn); Rectangle addressCell = dataTable.getCellRect(addrRow, addrColumn, true); // STEP 5: Center the row containing the cell of interest, to the extent possible. @@ -410,23 +428,10 @@ private int getBaseAddressIndexForAddress(int address) { // Generates the Address/Data part of the Data Segment window. // Returns the JScrollPane for the Address/Data part of the Data Segment window. private JScrollPane generateDataPanel() { - dataData = new Object[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS]; - int valueBase = Globals.getGui().getMainPane().getExecutePane().getValueDisplayBase(); + dataData = new Object[numberOfRows][numberOfColumns]; int addressBase = Globals.getGui().getMainPane().getExecutePane().getAddressDisplayBase(); - int address = this.homeAddress; - for (int row = 0; row < NUMBER_OF_ROWS; row++) { - dataData[row][ADDRESS_COLUMN] = NumberDisplayBaseChooser.formatUnsignedInteger(address, addressBase); - for (int column = 1; column < NUMBER_OF_COLUMNS; column++) { - try { - dataData[row][column] = NumberDisplayBaseChooser.formatNumber(Globals.memory.getRawWord(address), valueBase); - } catch (AddressErrorException aee) { - dataData[row][column] = NumberDisplayBaseChooser.formatNumber(0, valueBase); - } - address += BYTES_PER_VALUE; - } - } - String[] names = new String[NUMBER_OF_COLUMNS]; - for (int i = 0; i < NUMBER_OF_COLUMNS; i++) { + String[] names = new String[numberOfColumns]; + for (int i = 0; i < numberOfColumns; i++) { names[i] = getHeaderStringForColumn(i, addressBase); } dataTable = new MyTippedJTable(new DataTableModel(dataData, names)); @@ -440,7 +445,7 @@ private JScrollPane generateDataPanel() { dataTable.getColumnModel().getColumn(ADDRESS_COLUMN).setCellRenderer(monoRightCellRenderer); // Data cells are columns 1 onward, render right-justitifed in mono font but highlightable. AddressCellRenderer addressCellRenderer = new AddressCellRenderer(); - for (int i = 1; i < NUMBER_OF_COLUMNS; i++) { + for (int i = 1; i < numberOfColumns; i++) { dataTable.getColumnModel().getColumn(i).setPreferredWidth(60); dataTable.getColumnModel().getColumn(i).setCellRenderer(addressCellRenderer); } @@ -451,7 +456,7 @@ private JScrollPane generateDataPanel() { // Little helper. Is called when headers set up and each time number base changes. private String getHeaderStringForColumn(int i, int base) { - return (i == ADDRESS_COLUMN) ? "Address" : "Value (+" + Integer.toString((i - 1) * BYTES_PER_VALUE, base) + ")"; + return (i == ADDRESS_COLUMN) ? "Address" : "Value (+" + Integer.toString((i - 1) * bytesPerValue, base) + ")"; } @@ -507,12 +512,14 @@ public void updateModelForMemoryRange(int firstAddr) { int valueBase = getValueDisplayFormat(); int addressBase = Globals.getGui().getMainPane().getExecutePane().getAddressDisplayBase(); int address = firstAddr; - TableModel dataModel = dataTable.getModel(); - for (int row = 0; row < NUMBER_OF_ROWS; row++) { - ((DataTableModel) dataModel).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatUnsignedInteger(address, addressBase), row, ADDRESS_COLUMN); - for (int column = 1; column < NUMBER_OF_COLUMNS; column++) { + DataTableModel dataModel = (DataTableModel) dataTable.getModel(); + for (int row = 0; row < numberOfRows; row++) { + dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatUnsignedInteger(address, addressBase), row, ADDRESS_COLUMN); + for (int column = 1; column < numberOfColumns; column++) { try { - ((DataTableModel) dataModel).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(Globals.memory.getWordNoNotify(address), valueBase), row, column); + long datum = Globals.memory.getRaw(address, bytesPerValue); + System.out.printf("mem[%x]=%x\n", address, datum); + dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(datum, valueBase, bytesPerValue), row, column); } catch (AddressErrorException aee) { // Bit of a hack here. Memory will throw an exception if you try to read directly from text segment when the // self-modifying code setting is disabled. This is a good thing if it is the executing MIPS program trying to @@ -537,10 +544,10 @@ public void updateModelForMemoryRange(int firstAddr) { // With 4.4, I added the above IF statement to work with the text segment but inadvertently removed this line! // Now it becomes the "else" part, executed when not in text segment. DPS 8-July-2014. else { - ((DataTableModel) dataModel).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(0, valueBase), row, column); + dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(0, valueBase, bytesPerValue), row, column); } } - address += BYTES_PER_VALUE; + address += bytesPerValue; } } } @@ -551,11 +558,11 @@ public void updateModelForMemoryRange(int firstAddr) { public void updateCell(int address, int value) { int offset = address - this.firstAddress; - if (offset < 0 || offset >= MEMORY_CHUNK_SIZE) { // out of range + if (offset < 0 || offset >= memoryChunkSize) { // out of range return; } - int row = offset / BYTES_PER_ROW; - int column = (offset % BYTES_PER_ROW) / BYTES_PER_VALUE + 1; // column 0 reserved for address + int row = offset / bytesPerRow; + int column = (offset % bytesPerRow) / bytesPerValue + 1; // column 0 reserved for address int valueBase = Globals.getGui().getMainPane().getExecutePane().getValueDisplayBase(); ((DataTableModel) dataTable.getModel()).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(value, valueBase), row, column); @@ -571,13 +578,13 @@ public void updateDataAddresses() { int addressBase = Globals.getGui().getMainPane().getExecutePane().getAddressDisplayBase(); int address = this.firstAddress; String formattedAddress; - for (int i = 0; i < NUMBER_OF_ROWS; i++) { + for (int i = 0; i < numberOfRows; i++) { formattedAddress = NumberDisplayBaseChooser.formatUnsignedInteger(address, addressBase); ((DataTableModel) dataTable.getModel()).setDisplayAndModelValueAt(formattedAddress, i, 0); - address += BYTES_PER_ROW; + address += bytesPerRow; } // column headers include address offsets, so translate them too - for (int i = 1; i < NUMBER_OF_COLUMNS; i++) { + for (int i = 1; i < numberOfColumns; i++) { dataTable.getColumnModel().getColumn(i).setHeaderValue(getHeaderStringForColumn(i, addressBase)); } dataTable.getTableHeader().repaint(); @@ -606,8 +613,8 @@ public void resetMemoryRange() { public void resetValues() { int valueBase = Globals.getGui().getMainPane().getExecutePane().getValueDisplayBase(); TableModel dataModel = dataTable.getModel(); - for (int row = 0; row < NUMBER_OF_ROWS; row++) { - for (int column = 1; column < NUMBER_OF_COLUMNS; column++) { + for (int row = 0; row < numberOfRows; row++) { + for (int column = 1; column < numberOfColumns; column++) { ((DataTableModel) dataModel).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(0, valueBase), row, column); } } @@ -682,7 +689,7 @@ public void actionPerformed(ActionEvent ae) { // updateModelForMemoryRange requires argument to be multiple of 4 // but for cleaner display we'll make it multiple of 32 (last nibble is 0). // This makes it easier to mentally calculate address from row address + column offset. - firstAddress = firstAddress - (firstAddress % BYTES_PER_ROW); + firstAddress = firstAddress - (firstAddress % bytesPerRow); homeAddress = firstAddress; firstAddress = setFirstAddressAndPrevNextButtonEnableStatus(firstAddress); updateModelForMemoryRange(firstAddress); @@ -696,7 +703,7 @@ public void actionPerformed(ActionEvent ae) { // get $sp stack pointer, but guard against it having value below data segment firstAddress = Math.max(Memory.dataSegmentBaseAddress, RegisterFile.getValue(RegisterFile.STACK_POINTER_REGISTER)); // See comment above for gloButton... - firstAddress = firstAddress - (firstAddress % BYTES_PER_ROW); + firstAddress = firstAddress - (firstAddress % bytesPerRow); homeAddress = Memory.stackBaseAddress; firstAddress = setFirstAddressAndPrevNextButtonEnableStatus(firstAddress); updateModelForMemoryRange(firstAddress); @@ -786,8 +793,8 @@ private int setFirstAddressAndPrevNextButtonEnableStatus(int lowAddress) { } else { prevButton.setEnabled(true); } - if (lowAddress >= highLimit - MEMORY_CHUNK_SIZE) { - lowAddress = highLimit - MEMORY_CHUNK_SIZE + 1; + if (lowAddress >= highLimit - memoryChunkSize) { + lowAddress = highLimit - memoryChunkSize + 1; nextButton.setEnabled(false); } else { nextButton.setEnabled(true); @@ -951,7 +958,7 @@ public void setValueAt(Object value, int row, int col) { // calculate address from row and column try { - address = Binary.stringToInt((String) data[row][ADDRESS_COLUMN]) + (col - 1) * BYTES_PER_VALUE; // KENV 1/6/05 + address = Binary.stringToInt((String) data[row][ADDRESS_COLUMN]) + (col - 1) * bytesPerValue; // KENV 1/6/05 } catch (NumberFormatException nfe) { // can't really happen since memory addresses are completely under // the control of my software. @@ -1060,7 +1067,7 @@ public String getToolTipText(MouseEvent e) { int index = columnModel.getColumnIndexAtX(p.x); int realIndex = columnModel.getColumn(index).getModelIndex(); return (realIndex < 2) ? columnToolTips[realIndex] - : columnToolTips[2] + ((realIndex - 1) * 4) + columnToolTips[3]; + : columnToolTips[2] + ((realIndex - 1) * bytesPerValue) + columnToolTips[3]; } }; } @@ -1083,7 +1090,7 @@ public PrevButton(Icon ico) { // This one will respond when either timer goes off or button lifted. public void actionPerformed(ActionEvent ae) { - firstAddress -= PREV_NEXT_CHUNK_SIZE; + firstAddress -= prevNextChunkSize; firstAddress = setFirstAddressAndPrevNextButtonEnableStatus(firstAddress); updateModelForMemoryRange(firstAddress); } @@ -1106,7 +1113,7 @@ public NextButton(Icon ico) { // This one will respond when either timer goes off or button lifted. public void actionPerformed(ActionEvent ae) { - firstAddress += PREV_NEXT_CHUNK_SIZE; + firstAddress += prevNextChunkSize; firstAddress = setFirstAddressAndPrevNextButtonEnableStatus(firstAddress); updateModelForMemoryRange(firstAddress); } From 61768407ada8cb625453df91b2588f6483666d84 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 16:02:15 -0500 Subject: [PATCH 039/199] DataSegmentWindow add a combobox to select the cell size --- src/rars/venus/DataSegmentWindow.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index 28011896..9ba2983e 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -173,6 +173,20 @@ public void itemStateChanged(ItemEvent e) { }); features.add(asciiDisplayCheckBox); + String[] bytesPerValueStrings = {"1 byte", "2 half","4 word","8 dword"}; + JComboBox bytesPerValueBox = new JComboBox(bytesPerValueStrings); + bytesPerValueBox.setSelectedIndex(2); // word + bytesPerValueBox.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e) { + JComboBox cb = (JComboBox)e.getSource(); + int bytesPerValue = 1 << cb.getSelectedIndex(); + //String choice = ((String)cb.getSelectedItem()).substring(0, 1); + //int bytesPerValue = Integer.parseInt(choice); + DataSegmentWindow.this.setDimensions(valuesPerRow, numberOfRows, bytesPerValue); + } + }); + features.add(bytesPerValueBox); contentPane.add(features, BorderLayout.SOUTH); DataSegmentWindow.this.setDimensions(8, 16, 4); From 30093a4ba800f18ab3c9d3e3d0f86cb6d4978fbf Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 16:18:20 -0500 Subject: [PATCH 040/199] fix somw displaying of 64/32 bit values --- src/rars/venus/DataSegmentWindow.java | 10 +++++----- src/rars/venus/LabelsWindow.java | 4 ++-- src/rars/venus/TextSegmentWindow.java | 2 +- src/rars/venus/registers/ControlAndStatusWindow.java | 8 ++------ src/rars/venus/registers/RegistersWindow.java | 6 +----- 5 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index 9ba2983e..f33dad2f 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -540,17 +540,17 @@ public void updateModelForMemoryRange(int firstAddr) { // read. But not a good thing if it is the DataSegmentDisplay trying to read. I'll trick Memory by // temporarily enabling the setting as "non persistent" so it won't write through to the registry. if (Memory.inTextSegment(address)) { - int displayValue = 0; + long displayValue = 0; if (!Globals.getSettings().getBooleanSetting(Settings.Bool.SELF_MODIFYING_CODE_ENABLED)) { Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.SELF_MODIFYING_CODE_ENABLED, true); try { - displayValue = Globals.memory.getWordNoNotify(address); + displayValue = Globals.memory.getRaw(address, bytesPerValue); } catch (AddressErrorException e) { // Still got an exception? Doesn't seem possible but if we drop through it will write default value 0. } Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.SELF_MODIFYING_CODE_ENABLED, false); } - ((DataTableModel) dataModel).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(displayValue, valueBase), row, column); + dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(displayValue, valueBase, bytesPerValue), row, column); } // Bug Fix: the following line of code disappeared during the release 4.4 mods, but is essential to // display values of 0 for valid MIPS addresses that are outside the MARS simulated address space. Such @@ -626,10 +626,10 @@ public void resetMemoryRange() { public void resetValues() { int valueBase = Globals.getGui().getMainPane().getExecutePane().getValueDisplayBase(); - TableModel dataModel = dataTable.getModel(); + DataTableModel dataModel = (DataTableModel)dataTable.getModel(); for (int row = 0; row < numberOfRows; row++) { for (int column = 1; column < numberOfColumns; column++) { - ((DataTableModel) dataModel).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(0, valueBase), row, column); + dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(0, valueBase, bytesPerValue), row, column); } } disableAllButtons(); diff --git a/src/rars/venus/LabelsWindow.java b/src/rars/venus/LabelsWindow.java index 424ecaff..046a7e24 100644 --- a/src/rars/venus/LabelsWindow.java +++ b/src/rars/venus/LabelsWindow.java @@ -338,7 +338,7 @@ private JTable generateLabelTable() { for (int i = 0; i < symbols.size(); i++) {//sets up the label table Symbol s = symbols.get(i); labelData[i][LABEL_COLUMN] = s.getName(); - labelData[i][ADDRESS_COLUMN] = NumberDisplayBaseChooser.formatNumber(s.getAddress(), addressBase); + labelData[i][ADDRESS_COLUMN] = NumberDisplayBaseChooser.formatNumber(s.getAddress(), addressBase, 4); } LabelTableModel m = new LabelTableModel(labelData, LabelsWindow.columnNames); if (labelTable == null) { @@ -360,7 +360,7 @@ public void updateLabelAddresses() { int numSymbols = (labelData == null) ? 0 : labelData.length; for (int i = 0; i < numSymbols; i++) { address = symbols.get(i).getAddress(); - formattedAddress = NumberDisplayBaseChooser.formatNumber(address, addressBase); + formattedAddress = NumberDisplayBaseChooser.formatNumber(address, addressBase, 4); labelTable.getModel().setValueAt(formattedAddress, i, ADDRESS_COLUMN); } } diff --git a/src/rars/venus/TextSegmentWindow.java b/src/rars/venus/TextSegmentWindow.java index e7bad860..2e8f1c63 100644 --- a/src/rars/venus/TextSegmentWindow.java +++ b/src/rars/venus/TextSegmentWindow.java @@ -136,7 +136,7 @@ public void setupTable() { addressRows.put(intAddresses[i], i); data[i][BREAK_COLUMN] = false; data[i][ADDRESS_COLUMN] = NumberDisplayBaseChooser.formatUnsignedInteger(statement.getAddress(), addressBase); - data[i][CODE_COLUMN] = NumberDisplayBaseChooser.formatNumber(statement.getBinaryStatement(), 16); + data[i][CODE_COLUMN] = NumberDisplayBaseChooser.formatNumber(statement.getBinaryStatement(), 16, 4); data[i][BASIC_COLUMN] = statement.getPrintableBasicAssemblyStatement(); String sourceString = ""; if (!statement.getSource().equals("")) { diff --git a/src/rars/venus/registers/ControlAndStatusWindow.java b/src/rars/venus/registers/ControlAndStatusWindow.java index 3fb21358..53f600c5 100644 --- a/src/rars/venus/registers/ControlAndStatusWindow.java +++ b/src/rars/venus/registers/ControlAndStatusWindow.java @@ -32,15 +32,11 @@ public class ControlAndStatusWindow extends RegisterBlockWindow { }; public ControlAndStatusWindow() { - super(ControlAndStatusRegisterFile.getRegisters(), regToolTips, "Current 32 bit value"); + super(ControlAndStatusRegisterFile.getRegisters(), regToolTips, "Current value"); } protected String formatRegister(Register value, int base) { - if (Globals.getSettings().getBooleanSetting(Settings.Bool.RV64_ENABLED)){ - return NumberDisplayBaseChooser.formatNumber(value.getValue(), base); - }else { - return NumberDisplayBaseChooser.formatNumber((int)value.getValue(), base); - } + return NumberDisplayBaseChooser.formatNumber(value.getValue(), base); } protected void beginObserving() { diff --git a/src/rars/venus/registers/RegistersWindow.java b/src/rars/venus/registers/RegistersWindow.java index 694cb4b4..638b964b 100644 --- a/src/rars/venus/registers/RegistersWindow.java +++ b/src/rars/venus/registers/RegistersWindow.java @@ -63,11 +63,7 @@ private static Register[] getRegisters() { } protected String formatRegister(Register value, int base) { - if (Globals.getSettings().getBooleanSetting(Settings.Bool.RV64_ENABLED)){ - return NumberDisplayBaseChooser.formatNumber(value.getValue(), base); - }else { - return NumberDisplayBaseChooser.formatNumber((int)value.getValue(), base); - } + return NumberDisplayBaseChooser.formatNumber(value.getValue(), base); } protected void beginObserving() { From 82e22bc56fb0c8de5c62751418517ba5df927f11 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 16:20:11 -0500 Subject: [PATCH 041/199] datasegment: fix cell update with various byte length --- src/rars/venus/DataSegmentWindow.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index f33dad2f..d70fd07c 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -578,7 +578,7 @@ public void updateCell(int address, int value) { int row = offset / bytesPerRow; int column = (offset % bytesPerRow) / bytesPerValue + 1; // column 0 reserved for address int valueBase = Globals.getGui().getMainPane().getExecutePane().getValueDisplayBase(); - ((DataTableModel) dataTable.getModel()).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(value, valueBase), + ((DataTableModel) dataTable.getModel()).setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(value, valueBase, bytesPerValue), row, column); } @@ -982,7 +982,7 @@ public void setValueAt(Object value, int row, int col) { Globals.memoryAndRegistersLock.lock(); try { try { - Globals.memory.setRawWord(address, val); + Globals.memory.set(address, val, bytesPerValue); } // somehow, user was able to display out-of-range address. Most likely to occur between // stack base and Kernel. Also text segment with self-modifying-code setting off. @@ -993,7 +993,7 @@ public void setValueAt(Object value, int row, int col) { Globals.memoryAndRegistersLock.unlock(); }// end synchronized block int valueBase = Globals.getGui().getMainPane().getExecutePane().getValueDisplayBase(); - data[row][col] = NumberDisplayBaseChooser.formatNumber(val, valueBase); + data[row][col] = NumberDisplayBaseChooser.formatNumber(val, valueBase, bytesPerValue); fireTableCellUpdated(row, col); } From 85256f864ea8147e0a68f6e6992cc11e3f3ce3ea Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 16:23:01 -0500 Subject: [PATCH 042/199] Remove debugging print that should not have been committed --- src/rars/util/Binary.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rars/util/Binary.java b/src/rars/util/Binary.java index 0f7a820b..d6a60224 100644 --- a/src/rars/util/Binary.java +++ b/src/rars/util/Binary.java @@ -295,7 +295,6 @@ public static String intToHexString(int d) { } public static String intToHexString(long d, int length) { - System.out.println("hex: " + d + " s:"+ length); String leadingZero = new String("0"); String leadingX = new String("0x"); String t = Long.toUnsignedString(d, 16); From fd34014efd65b3cb5a52f1729c3b8240cae0c332 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jan 2024 16:34:26 -0500 Subject: [PATCH 043/199] Remove debugging print that should not have been committed --- src/rars/venus/DataSegmentWindow.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index d70fd07c..ae7b2a09 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -532,7 +532,6 @@ public void updateModelForMemoryRange(int firstAddr) { for (int column = 1; column < numberOfColumns; column++) { try { long datum = Globals.memory.getRaw(address, bytesPerValue); - System.out.printf("mem[%x]=%x\n", address, datum); dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(datum, valueBase, bytesPerValue), row, column); } catch (AddressErrorException aee) { // Bit of a hack here. Memory will throw an exception if you try to read directly from text segment when the From a039b02ec1c0bf0939dca4be2fa2bf4486ad6277 Mon Sep 17 00:00:00 2001 From: lorlouis Date: Tue, 23 Jan 2024 18:57:23 -0500 Subject: [PATCH 044/199] added the original text to the tokens --- src/rars/assembler/OperandFormat.java | 2 +- src/rars/assembler/Token.java | 8 +++++++- src/rars/assembler/Tokenizer.java | 7 ++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/rars/assembler/OperandFormat.java b/src/rars/assembler/OperandFormat.java index 810ae96b..60f336c7 100644 --- a/src/rars/assembler/OperandFormat.java +++ b/src/rars/assembler/OperandFormat.java @@ -113,7 +113,7 @@ private static boolean operandTypeCheck(TokenList cand, Instruction spec, ErrorL // Not an error if spec calls for identifier and candidate is operator, since operator names can be used as labels. // TODO: maybe add more cases in here if (specType == TokenTypes.IDENTIFIER && candType == TokenTypes.OPERATOR) { - Token replacement = new Token(TokenTypes.IDENTIFIER, candToken.getValue(), candToken.getSourceProgram(), candToken.getSourceLine(), candToken.getStartPos()); + Token replacement = new Token(TokenTypes.IDENTIFIER, candToken.getValue(), candToken.getSourceProgram(), candToken.getSourceLine(), candToken.getStartPos(), candToken.getOriginalText()); cand.set(i, replacement); continue; } diff --git a/src/rars/assembler/Token.java b/src/rars/assembler/Token.java index 7436826c..0689b9f1 100644 --- a/src/rars/assembler/Token.java +++ b/src/rars/assembler/Token.java @@ -47,6 +47,7 @@ public class Token { // original program and line will differ from the above if token was defined in an included file private RISCVprogram originalProgram; private int originalSourceLine; + private String originalText; /** * Constructor for Token class. @@ -59,7 +60,7 @@ public class Token { * @see TokenTypes **/ - public Token(TokenTypes type, String value, RISCVprogram sourceProgram, int line, int start) { + public Token(TokenTypes type, String value, RISCVprogram sourceProgram, int line, int start, String originalText) { this.type = type; this.value = value; this.sourceProgram = sourceProgram; @@ -67,6 +68,7 @@ public Token(TokenTypes type, String value, RISCVprogram sourceProgram, int line this.sourcePos = start; this.originalProgram = sourceProgram; this.originalSourceLine = line; + this.originalText = originalText; } @@ -103,6 +105,10 @@ public int getOriginalSourceLine() { return this.originalSourceLine; } + public String getOriginalText() { + return this.originalText; + } + /** * Produces token type of this token. * diff --git a/src/rars/assembler/Tokenizer.java b/src/rars/assembler/Tokenizer.java index d6ffd30f..0a763cd0 100644 --- a/src/rars/assembler/Tokenizer.java +++ b/src/rars/assembler/Tokenizer.java @@ -339,7 +339,7 @@ public TokenList tokenizeLine(RISCVprogram program, int lineNum, String theLine, tokenStartPos = linePos + 1; token[tokenPos++] = c; if (line.length > linePos + 3 && line[linePos + 1] == 'I' && line[linePos + 2] == 'n' && line[linePos + 3] == 'f') { - result.add(new Token(TokenTypes.REAL_NUMBER, "-Inf", program, lineNum, tokenStartPos)); + result.add(new Token(TokenTypes.REAL_NUMBER, "-Inf", program, lineNum, tokenStartPos, "-Inf")); linePos += 3; tokenPos = 0; break; @@ -491,7 +491,7 @@ private TokenList processEqv(RISCVprogram program, int lineNum, String theLine, // multiple tokens, so I want to get everything from the IDENTIFIER to either the // COMMENT or to the end. int startExpression = tokens.get(dirPos + 2).getStartPos(); - int endExpression = tokens.get(tokenPosLastOperand).getStartPos() + tokens.get(tokenPosLastOperand).getValue().length(); + int endExpression = tokens.get(tokenPosLastOperand).getStartPos() + tokens.get(tokenPosLastOperand).getOriginalText().length(); String expression = theLine.substring(startExpression - 1, endExpression - 1); // Symbol cannot be redefined - the only reason for this is to act like the Gnu .eqv if (equivalents.containsKey(symbol) && !equivalents.get(symbol).equals(expression)) { @@ -536,13 +536,14 @@ public ErrorList getErrors() { private void processCandidateToken(char[] token, RISCVprogram program, int line, String theLine, int tokenPos, int tokenStartPos, TokenList tokenList) { String value = new String(token, 0, tokenPos); + String original = value; if (value.length() > 0 && value.charAt(0) == '\'') value = preprocessCharacterLiteral(value); TokenTypes type = TokenTypes.matchTokenType(value); if (type == TokenTypes.ERROR) { errors.add(new ErrorMessage(program, line, tokenStartPos, theLine + "\nInvalid language element: " + value)); } - Token toke = new Token(type, value, program, line, tokenStartPos); + Token toke = new Token(type, value, program, line, tokenStartPos, original); tokenList.add(toke); } From 2f802b016e5c12a38f3b0b15d64ece77f9b0fdbb Mon Sep 17 00:00:00 2001 From: lorlouis Date: Tue, 23 Jan 2024 19:08:31 -0500 Subject: [PATCH 045/199] added a test --- test/eqv_char.s | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test/eqv_char.s diff --git a/test/eqv_char.s b/test/eqv_char.s new file mode 100644 index 00000000..9c355c78 --- /dev/null +++ b/test/eqv_char.s @@ -0,0 +1,8 @@ +.eqv SUBSTITUTE 'a' # a is 97 + +.text + li s0, SUBSTITUTE # this must build + + li a0, 42 + li a7, 93 + ecall From 0c86e2f7b4c2cd71f450b9877847e197ef93ae9e Mon Sep 17 00:00:00 2001 From: lorlouis Date: Tue, 23 Jan 2024 19:23:09 -0500 Subject: [PATCH 046/199] added a doc comment --- src/rars/assembler/Token.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/rars/assembler/Token.java b/src/rars/assembler/Token.java index 0689b9f1..7ed9a81c 100644 --- a/src/rars/assembler/Token.java +++ b/src/rars/assembler/Token.java @@ -105,6 +105,13 @@ public int getOriginalSourceLine() { return this.originalSourceLine; } + /** + * Produces the token's original text. In most cases, this is equivalent to + * {@code Token.getValue()} but when the token is a character literal this + * will return {@code "'a'"} rather then {@code getValue}'s {@code "97"}. + * + * @return original text representing this token + **/ public String getOriginalText() { return this.originalText; } From 6545c073bdc247d1409fdf4a3e68118d41f42767 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 1 Feb 2024 16:40:21 -0500 Subject: [PATCH 047/199] test/eqv_char.s: add comma on .eqv for gnu as compatibility --- test/eqv_char.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/eqv_char.s b/test/eqv_char.s index 9c355c78..6fa33629 100644 --- a/test/eqv_char.s +++ b/test/eqv_char.s @@ -1,6 +1,6 @@ -.eqv SUBSTITUTE 'a' # a is 97 + .eqv SUBSTITUTE, 'a' # a is 97 -.text + .text li s0, SUBSTITUTE # this must build li a0, 42 From 12a2246a35fa23112c3dfa4ab5b0ac579bb70577 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 6 Mar 2024 15:40:23 -0500 Subject: [PATCH 048/199] fix alignment on .dword --- src/rars/assembler/Assembler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rars/assembler/Assembler.java b/src/rars/assembler/Assembler.java index e4dc2164..defe2fec 100644 --- a/src/rars/assembler/Assembler.java +++ b/src/rars/assembler/Assembler.java @@ -937,6 +937,9 @@ private void storeInteger(Token token, Directives directive, ErrorList errors) { } if (directive == Directives.DWORD){ + if (this.autoAlign) { + this.dataAddress.set(this.alignToBoundary(this.dataAddress.get(), 8)); + } writeToDataSegment((int)longvalue, 4, token, errors); writeToDataSegment((int)(longvalue>>32), 4, token, errors); return; From 6c06b9149e900b7aee549bcbd2810421e28897b5 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 6 Mar 2024 15:40:53 -0500 Subject: [PATCH 049/199] test auto-aligned directives --- test/align.s | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 test/align.s diff --git a/test/align.s b/test/align.s new file mode 100644 index 00000000..ecbb04f6 --- /dev/null +++ b/test/align.s @@ -0,0 +1,41 @@ + .data + # autoalign by default +z: .byte 0x11 +b: .byte 0x12 + .byte 0x13 +h: .half 0x2222 +w: .word 0x44444444 +d: .dword 0x8888888888888888 + + .text + la s0, z + la s1, b + la s2, h + la s3, w + la s4, d + + sub a0, s1, s0 + li t0, 1 + bne a0, t0, fail + + sub a0, s2, s0 + li t0, 4 + bne a0, t0, fail + + sub a0, s3, s0 + li t0, 8 + bne a0, t0, fail + + sub a0, s4, s0 + li t0, 16 + bne a0, t0, fail + + li a7, 93 # Exit2 + li a0, 42 + ecall + +fail: + li a7, 93 # Exit2 + li a0, 0 + ecall + From 1d476179a772555c3088ca5144225e39cf2f4a04 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 6 Mar 2024 16:01:43 -0500 Subject: [PATCH 050/199] Binary.intToHexString fix behavior with negative numbers --- src/rars/util/Binary.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rars/util/Binary.java b/src/rars/util/Binary.java index d6a60224..d4b9b84a 100644 --- a/src/rars/util/Binary.java +++ b/src/rars/util/Binary.java @@ -298,6 +298,10 @@ public static String intToHexString(long d, int length) { String leadingZero = new String("0"); String leadingX = new String("0x"); String t = Long.toUnsignedString(d, 16); + if (t.length() > 2*length) { + // drop possible leading FF when negative number are used + t = t.substring(t.length() - 2*length); + } while (t.length() < 2*length) t = leadingZero.concat(t); From ff6de0640e5182f2b8653e1f16d8bb3afb24874a Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 6 Mar 2024 16:07:15 -0500 Subject: [PATCH 051/199] Binary: remove leftover debug println --- src/rars/util/Binary.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rars/util/Binary.java b/src/rars/util/Binary.java index d4b9b84a..181613f0 100644 --- a/src/rars/util/Binary.java +++ b/src/rars/util/Binary.java @@ -650,7 +650,6 @@ public static int setByte(int value, int bite, int replace) { public static int getByte(long value, int bite) { int v = (int)(value >>> (bite*8)) & 0xFF; - System.out.println("getbyte " + value + " b:" + bite + " -> " + v); return v; //return (int)(value << ((3 - bite) << 3) >>> 24); } From c9f568533f75a707da8b895330e94fcfa2596287 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 6 Mar 2024 16:47:56 -0500 Subject: [PATCH 052/199] Other CellRenderer are based on MonoRightCellRenderer so they use the left-side ellipsis --- src/rars/venus/DataSegmentWindow.java | 2 +- src/rars/venus/MonoRightCellRenderer.java | 32 +++++++++++++++++++ src/rars/venus/TextSegmentWindow.java | 4 +-- .../venus/registers/RegisterBlockWindow.java | 2 +- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index ae7b2a09..ea282103 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -1024,7 +1024,7 @@ private void printDebugData() { // Special renderer capable of highlighting cells by changing background color. // Will set background to highlight color if certain conditions met. - class AddressCellRenderer extends DefaultTableCellRenderer { + class AddressCellRenderer extends MonoRightCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { diff --git a/src/rars/venus/MonoRightCellRenderer.java b/src/rars/venus/MonoRightCellRenderer.java index 9c4af347..349c2a24 100644 --- a/src/rars/venus/MonoRightCellRenderer.java +++ b/src/rars/venus/MonoRightCellRenderer.java @@ -37,6 +37,10 @@ a copy of this software and associated documentation files (the * I am using it to render integer addresses and values that are stored as * Strings containing either the decimal or hexidecimal version * of the integer value. + * + * This also add the ellipsis on the left on narrow columns, so the low order bytes are show first. + * e.g. "0x0000000000001234" is shown as "...01234" if not enough with in the column. + * */ public class MonoRightCellRenderer extends DefaultTableCellRenderer { public static final Font MONOSPACED_PLAIN_12POINT = new Font("Monospaced", Font.PLAIN, 12); @@ -47,6 +51,34 @@ public Component getTableCellRendererComponent(JTable table, Object value, isSelected, hasFocus, row, column); cell.setFont(MONOSPACED_PLAIN_12POINT); cell.setHorizontalAlignment(SwingConstants.RIGHT); + + // Determine the width available to render the text + + int availableWidth = table.getColumnModel().getColumn(column).getWidth(); + availableWidth -= (int)table.getIntercellSpacing().getWidth(); + Insets borderInsets = getBorder().getBorderInsets(cell); + availableWidth -= (borderInsets.left + borderInsets.right); + String cellText = cell.getText(); + FontMetrics fm = getFontMetrics( getFont() ); + + // Not enough space so start rendering from the end of the string + // until all the space is used up + if (fm.stringWidth(cellText) > availableWidth) { + String dots = "..."; + int textWidth = fm.stringWidth(dots); + int i = cellText.length() - 1; + + for (; i > 0; i--) { + textWidth += fm.charWidth(cellText.charAt(i)); + + if (textWidth > availableWidth) { + break; + } + } + + cell.setText(dots + cellText.substring(i + 1)); + } + return cell; } } \ No newline at end of file diff --git a/src/rars/venus/TextSegmentWindow.java b/src/rars/venus/TextSegmentWindow.java index 2e8f1c63..9f58cdf5 100644 --- a/src/rars/venus/TextSegmentWindow.java +++ b/src/rars/venus/TextSegmentWindow.java @@ -839,13 +839,11 @@ public Component getTableCellRendererComponent(JTable table, Object value, * Cell renderer for Machine Code column. Alternates background color by row but otherwise is * same as MonoRightCellRenderer. */ - class MachineCodeCellRenderer extends DefaultTableCellRenderer { + class MachineCodeCellRenderer extends MonoRightCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel cell = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - cell.setFont(MonoRightCellRenderer.MONOSPACED_PLAIN_12POINT); - cell.setHorizontalAlignment(SwingConstants.RIGHT); if (row % 2 == 0) { cell.setBackground(Globals.getSettings().getColorSettingByPosition(Settings.EVEN_ROW_BACKGROUND)); cell.setForeground(Globals.getSettings().getColorSettingByPosition(Settings.EVEN_ROW_FOREGROUND)); diff --git a/src/rars/venus/registers/RegisterBlockWindow.java b/src/rars/venus/registers/RegisterBlockWindow.java index 6e832028..8251d132 100644 --- a/src/rars/venus/registers/RegisterBlockWindow.java +++ b/src/rars/venus/registers/RegisterBlockWindow.java @@ -234,7 +234,7 @@ private void updateRowHeight() { * don't want highlighting for a given column, don't use this. Currently we highlight * all columns. */ - private class RegisterCellRenderer extends DefaultTableCellRenderer { + private class RegisterCellRenderer extends MonoRightCellRenderer { private Font font; private int alignment; From 785e3b5f4cb6ed45e76fe0d6f6757c724dabec97 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 30 May 2024 13:16:46 -0400 Subject: [PATCH 053/199] output in separate window --- src/rars/util/SystemIO.java | 4 +- src/rars/venus/MessagesPane.java | 101 ++++++++++++++++++++++--------- 2 files changed, 76 insertions(+), 29 deletions(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index bdd67006..c7d2368d 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -465,7 +465,7 @@ private static BufferedWriter getOutputWriter(){ private static void print2Gui(String output){ long time = System.currentTimeMillis(); if (time > lasttime) { - Globals.getGui().getMessagesPane().postRunMessage(buffer+output); + Globals.getGui().getMessagesPane().postOutput(buffer+output); buffer = ""; lasttime = time + 100; } else { @@ -479,7 +479,7 @@ private static void print2Gui(String output){ public static void flush(boolean force) { long time = System.currentTimeMillis(); if (buffer != "" && (force || time > lasttime)){ - Globals.getGui().getMessagesPane().postRunMessage(buffer); + Globals.getGui().getMessagesPane().postOutput(buffer); buffer = ""; lasttime = time + 100; } diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index a0a3aedc..b53c67dc 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -24,23 +24,23 @@ Developed by Pete Sanderson (psanderson@otterbein.edu) and Kenneth Vollmar (kenvollmar@missouristate.edu) -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. (MIT license, http://www.opensource.org/licenses/mit-license.html) @@ -52,9 +52,12 @@ a copy of this software and associated documentation files (the * @author Team JSpim **/ -public class MessagesPane extends JTabbedPane { - JTextArea assemble, run; - private JPanel assembleTab, runTab; +public class MessagesPane extends JPanel { + private JTabbedPane leftPane; + private JTabbedPane rightPane; + private JSplitPane splitter; + JTextArea assemble, run, output; + private JPanel assembleTab, runTab, outputTab; // These constants are designed to keep scrolled contents of the // two message areas from becoming overwhelmingly large (which // seems to slow things down as new text is appended). Once it @@ -71,10 +74,14 @@ public class MessagesPane extends JTabbedPane { public MessagesPane() { super(); this.setMinimumSize(new Dimension(0, 0)); + leftPane = new JTabbedPane(); + rightPane = new JTabbedPane(); assemble = new JTextArea(); run = new JTextArea(); + output = new JTextArea(); assemble.setEditable(false); run.setEditable(false); + output.setEditable(false); // Set both text areas to mono font. For assemble // pane, will make messages more readable. For run // pane, will allow properly aligned "text graphics" @@ -82,6 +89,7 @@ public MessagesPane() { Font monoFont = new Font(Font.MONOSPACED, Font.PLAIN, 12); assemble.setFont(monoFont); run.setFont(monoFont); + output.setFont(monoFont); JButton assembleTabClearButton = new JButton("Clear"); assembleTabClearButton.setToolTipText("Clear the Messages area"); @@ -160,7 +168,7 @@ public void mouseClicked(MouseEvent e) { }); JButton runTabClearButton = new JButton("Clear"); - runTabClearButton.setToolTipText("Clear the Run I/O area"); + runTabClearButton.setToolTipText("Clear the Run area"); runTabClearButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -172,12 +180,35 @@ public void actionPerformed(ActionEvent e) { runTab.add(new JScrollPane(run, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); - this.addTab("Messages", assembleTab); - this.addTab("Run I/O", runTab); - this.setForeground(Color.BLACK); + JButton outputTabClearButton = new JButton("Clear"); + outputTabClearButton.setToolTipText("Clear the Output area"); + outputTabClearButton.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e) { + output.setText(""); + } + }); + outputTab = new JPanel(new BorderLayout()); + outputTab.add(createBoxForButton(outputTabClearButton), BorderLayout.EAST); + outputTab.add(new JScrollPane(output, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); - this.setToolTipTextAt(0, "Messages produced by Run menu. Click on assemble error message to select erroneous line"); - this.setToolTipTextAt(1, "Simulated console input and output"); + leftPane.addTab("Messages", assembleTab); + leftPane.addTab("Run", runTab); + leftPane.setForeground(Color.BLACK); + rightPane.addTab("Output", outputTab); + rightPane.setForeground(Color.BLACK); + + leftPane.setToolTipTextAt(0, "Messages produced by Run menu. Click on assemble error message to select erroneous line"); + leftPane.setToolTipTextAt(1, "Simulated console input and other run messages"); + rightPane.setToolTipTextAt(0, "Simulated console output"); + + splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPane, rightPane); + splitter.setOneTouchExpandable(true); + splitter.resetToPreferredSizes(); + splitter.setResizeWeight(0.5); + this.setLayout(new BorderLayout()); + this.add(splitter); } // Center given button in a box, centered vertically and 6 pixels on left and right @@ -294,7 +325,7 @@ public void postMessage(String message) { } } assemble.setCaretPosition(assemble.getDocument().getLength()); - setSelectedComponent(assembleTab); + leftPane.setSelectedComponent(assembleTab); } /** @@ -313,7 +344,7 @@ public void postRunMessage(String message) { SwingUtilities.invokeLater( new Runnable() { public void run() { - setSelectedComponent(runTab); + leftPane.setSelectedComponent(runTab); run.append(mess); // can do some crude cutting here. If the document gets "very large", // let's cut off the oldest text. This will limit scrolling but the limit @@ -329,18 +360,34 @@ public void run() { }); } + public void postOutput(String message) { + final String mess = message; + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + output.append(mess); + if (output.getDocument().getLength() > MAXIMUM_SCROLLED_CHARACTERS) { + try { + output.getDocument().remove(0, NUMBER_OF_CHARACTERS_TO_CUT); + } catch (BadLocationException ble) { + } + } + } + }); + } + /** * Make the assembler message tab current (up front) */ public void selectMessageTab() { - setSelectedComponent(assembleTab); + leftPane.setSelectedComponent(assembleTab); } /** * Make the runtime message tab current (up front) */ public void selectRunMessageTab() { - setSelectedComponent(runTab); + leftPane.setSelectedComponent(runTab); } /** @@ -527,4 +574,4 @@ String response() { } } // Asker class //////////////////////////////////////////////////////////////////////////// -} +} \ No newline at end of file From fb1f0a4bcdd7ee9a9b414dcb0f6cc610bb595ded Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 30 May 2024 13:25:21 -0400 Subject: [PATCH 054/199] input window created --- src/rars/venus/MessagesPane.java | 33 +++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index b53c67dc..9e40bc99 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -56,8 +56,8 @@ public class MessagesPane extends JPanel { private JTabbedPane leftPane; private JTabbedPane rightPane; private JSplitPane splitter; - JTextArea assemble, run, output; - private JPanel assembleTab, runTab, outputTab; + JTextArea assemble, run, input, output; + private JPanel assembleTab, runTab, inputTab, outputTab; // These constants are designed to keep scrolled contents of the // two message areas from becoming overwhelmingly large (which // seems to slow things down as new text is appended). Once it @@ -78,9 +78,11 @@ public MessagesPane() { rightPane = new JTabbedPane(); assemble = new JTextArea(); run = new JTextArea(); + input = new JTextArea(); output = new JTextArea(); assemble.setEditable(false); run.setEditable(false); + input.setEditable(true); output.setEditable(false); // Set both text areas to mono font. For assemble // pane, will make messages more readable. For run @@ -89,6 +91,7 @@ public MessagesPane() { Font monoFont = new Font(Font.MONOSPACED, Font.PLAIN, 12); assemble.setFont(monoFont); run.setFont(monoFont); + input.setFont(monoFont); output.setFont(monoFont); JButton assembleTabClearButton = new JButton("Clear"); @@ -180,6 +183,19 @@ public void actionPerformed(ActionEvent e) { runTab.add(new JScrollPane(run, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); + JButton inputTabClearButton = new JButton("Clear"); + inputTabClearButton.setToolTipText("Clear the input area"); + inputTabClearButton.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e) { + input.setText(""); + } + }); + inputTab = new JPanel(new BorderLayout()); + inputTab.add(createBoxForButton(inputTabClearButton), BorderLayout.WEST); + inputTab.add(new JScrollPane(input, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); + JButton outputTabClearButton = new JButton("Clear"); outputTabClearButton.setToolTipText("Clear the Output area"); outputTabClearButton.addActionListener( @@ -195,12 +211,14 @@ public void actionPerformed(ActionEvent e) { leftPane.addTab("Messages", assembleTab); leftPane.addTab("Run", runTab); + leftPane.addTab("Input", inputTab); leftPane.setForeground(Color.BLACK); rightPane.addTab("Output", outputTab); rightPane.setForeground(Color.BLACK); leftPane.setToolTipTextAt(0, "Messages produced by Run menu. Click on assemble error message to select erroneous line"); - leftPane.setToolTipTextAt(1, "Simulated console input and other run messages"); + leftPane.setToolTipTextAt(1, "Simulated console input (used while running) and other run messages"); + leftPane.setToolTipTextAt(2, "Simulated console input (to use before running)"); rightPane.setToolTipTextAt(0, "Simulated console output"); splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPane, rightPane); @@ -307,6 +325,15 @@ public JTextArea getRunTextArea() { return run; } + /** + * Returns the text written in the input field + * + * @return input text field content + */ + public String getInputField() { + return input.getText(); + } + /** * Post a message to the assembler display * From ea5b56ba06c1553740066f12be4ab0966042bc9b Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 30 May 2024 13:29:06 -0400 Subject: [PATCH 055/199] structure to read input from input window --- src/rars/util/SystemIO.java | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index c7d2368d..7b0001cb 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -425,9 +425,11 @@ public static void closeFile(int fd) { /** * Reset all files -- clears out the file descriptor table. + * Reset the buffered reader from the input field of the gui. */ public static void resetFiles() { FileIOData.resetFiles(); + InputFromGui.reset(); } /** @@ -439,6 +441,17 @@ public static String getFileErrorMessage() { return fileErrorString; } + /** + * @return BufferedReader from the input field of the gui + */ + private static BufferedReader getInputReaderFromGui() { + if (InputFromGui.inputReaderFromGui == null) { + InputFromGui.inputReaderFromGui = + new BufferedReader(new StringReader(Globals.getGui().getMessagesPane().getInputField())); + } + return InputFromGui.inputReaderFromGui; + } + /////////////////////////////////////////////////////////////////////// // Private method to simply return the BufferedReader used for // keyboard input, redirected input, or piped input. @@ -685,4 +698,22 @@ private static int nowOpening(String filename, int flag) { } } // end private class FileIOData -} + + /** + * Maintain information on input from input window of GUI + */ + private static class InputFromGui { + public static BufferedReader inputReaderFromGui; + + private static void reset() { + if (inputReaderFromGui != null) { + try { + inputReaderFromGui.close(); + inputReaderFromGui=null; + } catch (IOException ioe) { + } + } + } + + } +} \ No newline at end of file From 6a638e37e7ca356cafccbb07a91139a930d0b563 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 30 May 2024 13:30:41 -0400 Subject: [PATCH 056/199] reading input from input window --- src/rars/util/SystemIO.java | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 7b0001cb..a20fd9ce 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -102,6 +102,13 @@ private static String readStringInternal(String init, String prompt, int maxleng } else { if (Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { input = Globals.getGui().getMessagesPane().getInputString(prompt); + } else if (!Globals.getGui().getMessagesPane().getInputField().isEmpty()) { + try { + input = getInputReaderFromGui().readLine(); + if (input == null) + input = ""; + } catch (IOException e) { + } } else { input = Globals.getGui().getMessagesPane().getInputString(maxlength); } @@ -273,13 +280,30 @@ public static int readFromFile(int fd, byte[] myBuffer, int lengthRequested) { /////////////// DPS 8-Jan-2013 ////////////////////////////////////////////////// /// Read from STDIN file descriptor while using IDE - get input from Messages pane. if (fd == STDIN && Globals.getGui() != null) { - String input = Globals.getGui().getMessagesPane().getInputString(lengthRequested); - byte[] bytesRead = input.getBytes(); + //asks user for input in run pane + if (Globals.getGui().getMessagesPane().getInputField().isEmpty()) { + String input = Globals.getGui().getMessagesPane().getInputString(lengthRequested); + byte[] bytesRead = input.getBytes(); - for (int i = 0; i < myBuffer.length; i++) { - myBuffer[i] = (i < bytesRead.length) ? bytesRead[i] : 0; + for (int i = 0; i < myBuffer.length; i++) { + myBuffer[i] = (i < bytesRead.length) ? bytesRead[i] : 0; + } + return Math.min(myBuffer.length, bytesRead.length); + //takes input from input pane + } else { + try { + String input = ""; + for (int i = 0; i < myBuffer.length; i++) { + input = input + (char) getInputReaderFromGui().read(); + } + byte[] bytesRead = input.getBytes(); + for (int i = 0; i < myBuffer.length; i++) { + myBuffer[i] = (i < bytesRead.length) ? bytesRead[i] : 0; + } + return Math.min(myBuffer.length, bytesRead.length); + } catch (IOException e) { + } } - return Math.min(myBuffer.length, bytesRead.length); } //////////////////////////////////////////////////////////////////////////////////// //// When running in command mode, code below works for either regular file or STDIN From bd5c6fde209fc9575ea97e7f1eba6cdc85ff5e67 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 19 Jun 2024 17:19:22 -0400 Subject: [PATCH 057/199] comments and exception handling ++ --- src/rars/util/SystemIO.java | 39 ++++++++++++++++++++------------ src/rars/venus/MessagesPane.java | 9 ++++++++ 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index a20fd9ce..b604dd78 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -107,7 +107,7 @@ private static String readStringInternal(String init, String prompt, int maxleng input = getInputReaderFromGui().readLine(); if (input == null) input = ""; - } catch (IOException e) { + } catch (IOException e) { // as above } } else { input = Globals.getGui().getMessagesPane().getInputString(maxlength); @@ -266,6 +266,20 @@ public static int writeToFile(int fd, byte[] myBuffer, int lengthRequested) { } // end writeToFile + /** + * Read bytes from string in a byte buffer + * + * @param input input to read + * @param buffer byte array to contain bytes read + * @return number of bytes read + */ + private static int readInBuffer(String input, byte[] buffer) { + byte[] bytesRead = input.getBytes(); + for (int i = 0; i < buffer.length; i++) { + buffer[i] = (i < bytesRead.length) ? bytesRead[i] : 0; + } + return Math.min(buffer.length, bytesRead.length); + } /** * Read bytes from file. @@ -283,25 +297,18 @@ public static int readFromFile(int fd, byte[] myBuffer, int lengthRequested) { //asks user for input in run pane if (Globals.getGui().getMessagesPane().getInputField().isEmpty()) { String input = Globals.getGui().getMessagesPane().getInputString(lengthRequested); - byte[] bytesRead = input.getBytes(); - - for (int i = 0; i < myBuffer.length; i++) { - myBuffer[i] = (i < bytesRead.length) ? bytesRead[i] : 0; - } - return Math.min(myBuffer.length, bytesRead.length); - //takes input from input pane + return readInBuffer(input, myBuffer); + //takes input from input pane } else { try { String input = ""; for (int i = 0; i < myBuffer.length; i++) { input = input + (char) getInputReaderFromGui().read(); } - byte[] bytesRead = input.getBytes(); - for (int i = 0; i < myBuffer.length; i++) { - myBuffer[i] = (i < bytesRead.length) ? bytesRead[i] : 0; - } - return Math.min(myBuffer.length, bytesRead.length); + return readInBuffer(input, myBuffer); } catch (IOException e) { + fileErrorString = "IO Exception on read from the input window of GUI"; + return -1; } } } @@ -733,9 +740,11 @@ private static void reset() { if (inputReaderFromGui != null) { try { inputReaderFromGui.close(); - inputReaderFromGui=null; - } catch (IOException ioe) { + } catch (IOException e) { + // will only read the above line if this inputReader has been opened } + inputReaderFromGui=null; + } } diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index 9e40bc99..f3e366d4 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -387,16 +387,25 @@ public void run() { }); } + /** + * Post a message to the output display + * + * @param message + */ public void postOutput(String message) { final String mess = message; SwingUtilities.invokeLater( new Runnable() { public void run() { output.append(mess); + // as in method above: if the document gets "very large", + // let's cut off the oldest text. This will limit scrolling but the limit + // can be set reasonably high. if (output.getDocument().getLength() > MAXIMUM_SCROLLED_CHARACTERS) { try { output.getDocument().remove(0, NUMBER_OF_CHARACTERS_TO_CUT); } catch (BadLocationException ble) { + // as above } } } From a1f97c15f9bd9d659cfae7de74b6581086f690e0 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 20 Jun 2024 09:52:51 -0400 Subject: [PATCH 058/199] formatting and cleanup --- src/rars/venus/MessagesPane.java | 35 +++++++++++++++----------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index f3e366d4..c81c8c81 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -24,23 +24,23 @@ Developed by Pete Sanderson (psanderson@otterbein.edu) and Kenneth Vollmar (kenvollmar@missouristate.edu) -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. (MIT license, http://www.opensource.org/licenses/mit-license.html) @@ -390,7 +390,7 @@ public void run() { /** * Post a message to the output display * - * @param message + * @param message String to append to output display text */ public void postOutput(String message) { final String mess = message; @@ -398,14 +398,11 @@ public void postOutput(String message) { new Runnable() { public void run() { output.append(mess); - // as in method above: if the document gets "very large", - // let's cut off the oldest text. This will limit scrolling but the limit - // can be set reasonably high. + // as in method above: if document gets "very large", cuts off the oldest text. if (output.getDocument().getLength() > MAXIMUM_SCROLLED_CHARACTERS) { try { output.getDocument().remove(0, NUMBER_OF_CHARACTERS_TO_CUT); - } catch (BadLocationException ble) { - // as above + } catch (BadLocationException ble) { // as above } } } From a2b08f1c9b5f8c8effc18b825ff65de0b4dbb7e5 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 26 Jun 2024 10:43:53 -0400 Subject: [PATCH 059/199] Enable Github Action This builds test and publish rars: https://github.com/privat/rars/releases/download/lastest/rars-flatlaf.jar Close #15 --- .github/workflows/makefile.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/makefile.yml diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml new file mode 100644 index 00000000..9c64ba81 --- /dev/null +++ b/.github/workflows/makefile.yml @@ -0,0 +1,27 @@ +name: Makefile CI + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - run: sudo apt-get update && sudo apt-get install openjdk-17-jdk-headless + - uses: actions/checkout@v4 + - run: git submodule update --init + - run: ./build-jar.sh + - run: ./build-jar-flatlaf.sh + - uses: actions/upload-artifact@v4 + with: + path: '*.jar' + - run: ./test.sh + - uses: softprops/action-gh-release@v2 + if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/test-ci' + with: + files: rars-flatlaf.jar + tag_name: 'lastest' + make_latest: true From 3ff93b541784d8780ad8666f145110e2daa89df5 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 26 Jun 2024 15:00:45 -0400 Subject: [PATCH 060/199] set a rars version based on git describe --- .gitignore | 2 ++ build-jar.sh | 2 ++ src/rars/Globals.java | 11 ++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 91399c8e..1fab025b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ out # Build products build rars.jar +rars-flatlaf.jar +src/Version.properties # Eclipse project files .classpath diff --git a/build-jar.sh b/build-jar.sh index 6f75fafd..fc3e185a 100755 --- a/build-jar.sh +++ b/build-jar.sh @@ -1,5 +1,7 @@ #!/bin/bash if git submodule status | grep \( > /dev/null ; then + version=$(git describe --tags --match 'v*' --dirty | cut -c2-) + echo "Version = $version" > src/Version.properties mkdir -p build find src -name "*.java" | xargs javac --release 8 -d build if [[ "$OSTYPE" == "darwin"* ]]; then diff --git a/src/rars/Globals.java b/src/rars/Globals.java index 7ba6ee40..06a677c9 100644 --- a/src/rars/Globals.java +++ b/src/rars/Globals.java @@ -51,6 +51,7 @@ public class Globals { // List these first because they are referenced by methods called at initialization. private static String configPropertiesFile = "Config"; private static String syscallPropertiesFile = "Syscall"; + private static String versionPropertiesFile = "Version"; /** * The set of implemented instructions. @@ -100,7 +101,15 @@ public class Globals { /** * The current version number. Can't wait for "initialize()" call to get it. */ - public static final String version = "1.6"; + public static final String version = getVersion(); + /** + * Get the current version from a property file set at built-time. + * */ + private static String getVersion() { + String v = getPropertyEntry(versionPropertiesFile, "Version"); + if (v == null) return "1.6-undefined"; + return v; + } /** * List of accepted file extensions for RISCV assembly source files. */ From 801cb5b7480f5f1216abeca429bbd95ec6d86671 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 26 Jun 2024 15:11:17 -0400 Subject: [PATCH 061/199] github action: retrieve full git history and tags for versioning --- .github/workflows/makefile.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 9c64ba81..681c2fca 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -12,6 +12,7 @@ jobs: steps: - run: sudo apt-get update && sudo apt-get install openjdk-17-jdk-headless - uses: actions/checkout@v4 + - run: git fetch origin --tags --unshallow - run: git submodule update --init - run: ./build-jar.sh - run: ./build-jar-flatlaf.sh From c1def93d8f7e9d345e9b65dcaafa2b3a04d1fa9b Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 27 Jun 2024 12:40:31 -0400 Subject: [PATCH 062/199] TextSegmentWindow: fix max width of breakpointm, adress and code columns --- src/rars/venus/TextSegmentWindow.java | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/rars/venus/TextSegmentWindow.java b/src/rars/venus/TextSegmentWindow.java index 9f58cdf5..b46e5b11 100644 --- a/src/rars/venus/TextSegmentWindow.java +++ b/src/rars/venus/TextSegmentWindow.java @@ -163,12 +163,6 @@ public void setupTable() { // prevents cells in row from being highlighted when user clicks on breakpoint checkbox table.setRowSelectionAllowed(false); - table.getColumnModel().getColumn(BREAK_COLUMN).setPreferredWidth(40); - table.getColumnModel().getColumn(ADDRESS_COLUMN).setPreferredWidth(80); - table.getColumnModel().getColumn(CODE_COLUMN).setPreferredWidth(80); - table.getColumnModel().getColumn(BASIC_COLUMN).setPreferredWidth(160); - table.getColumnModel().getColumn(SOURCE_COLUMN).setPreferredWidth(280); - CodeCellRenderer codeStepHighlighter = new CodeCellRenderer(); table.getColumnModel().getColumn(BASIC_COLUMN).setCellRenderer(codeStepHighlighter); table.getColumnModel().getColumn(SOURCE_COLUMN).setCellRenderer(codeStepHighlighter); @@ -187,12 +181,28 @@ public void setupTable() { addProgramArgumentsPanel(); } + setColumnMaxWidth(table.getColumnModel().getColumn(BREAK_COLUMN), columnNames[0]); + setColumnMaxWidth(table.getColumnModel().getColumn(ADDRESS_COLUMN), "0x00000000"); + setColumnMaxWidth(table.getColumnModel().getColumn(CODE_COLUMN), "0x00000000"); + table.getColumnModel().getColumn(BASIC_COLUMN).setPreferredWidth(160); + table.getColumnModel().getColumn(SOURCE_COLUMN).setPreferredWidth(280); + deleteAsTextSegmentObserver(); if (Globals.getSettings().getBooleanSetting(Settings.Bool.SELF_MODIFYING_CODE_ENABLED)) { addAsTextSegmentObserver(); } } + /** + * + */ + public void setColumnMaxWidth(TableColumn column, String referenceText) { + Component component = this; // column.getCellRenderer().getTableCellRendererComponent(); + FontMetrics fontMetrics = component.getFontMetrics(component.getFont()); + int width = fontMetrics.stringWidth(referenceText) + 10; + column.setMaxWidth(width); + column.setPreferredWidth(width); + } //////////// Support for program arguments added DPS 17-July-2008 ////////////// /** From 310f25358476e51b72c33987ace0159e5f2a5d02 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 27 Jun 2024 12:41:29 -0400 Subject: [PATCH 063/199] RegisterWindow: reduce the column width of name and number --- src/rars/venus/registers/RegisterBlockWindow.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rars/venus/registers/RegisterBlockWindow.java b/src/rars/venus/registers/RegisterBlockWindow.java index 8251d132..58a18827 100644 --- a/src/rars/venus/registers/RegisterBlockWindow.java +++ b/src/rars/venus/registers/RegisterBlockWindow.java @@ -82,9 +82,9 @@ public RegisterBlockWindow(Register[] registers, String[] registerDescriptions, new String[]{"Each register has a tool tip describing its usage convention", "Corresponding register number", valueTip}) { }; updateRowHeight(); - table.getColumnModel().getColumn(NAME_COLUMN).setPreferredWidth(50); - table.getColumnModel().getColumn(NUMBER_COLUMN).setPreferredWidth(25); - table.getColumnModel().getColumn(VALUE_COLUMN).setPreferredWidth(60); + table.getColumnModel().getColumn(NAME_COLUMN).setPreferredWidth(20); + table.getColumnModel().getColumn(NUMBER_COLUMN).setPreferredWidth(10); + table.getColumnModel().getColumn(VALUE_COLUMN).setPreferredWidth(150); // Display register values (String-ified) right-justified in mono font table.getColumnModel().getColumn(NAME_COLUMN).setCellRenderer(new RegisterCellRenderer(MonoRightCellRenderer.MONOSPACED_PLAIN_12POINT, SwingConstants.LEFT)); From eb610d136b91fd0c7b7e6b5db9941f4df6d11ee7 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 27 Jun 2024 13:40:14 -0400 Subject: [PATCH 064/199] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e35cf7ba..eafccd61 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,5 @@ Fork of [RARS](https://github.com/TheThirdOne/rars) with added features (PRed up * https://github.com/TheThirdOne/rars/pull/195 * https://github.com/TheThirdOne/rars/pull/196 * https://github.com/TheThirdOne/rars/pull/197 + +Unfortunately, upstream is not responsive, so we stopped doing PR as they require some unmerges ones. From 3967128fa3ea426aef03357e63fe6d06d0b5c85e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 27 Jun 2024 17:47:53 -0400 Subject: [PATCH 065/199] add MessagesPane.isInteractiveMode() --- src/rars/util/SystemIO.java | 2 +- src/rars/venus/MessagesPane.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index b604dd78..478166b6 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -102,7 +102,7 @@ private static String readStringInternal(String init, String prompt, int maxleng } else { if (Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { input = Globals.getGui().getMessagesPane().getInputString(prompt); - } else if (!Globals.getGui().getMessagesPane().getInputField().isEmpty()) { + } else if (!Globals.getGui().getMessagesPane().isInteractiveMode()) { try { input = getInputReaderFromGui().readLine(); if (input == null) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index c81c8c81..f88356cb 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -325,6 +325,14 @@ public JTextArea getRunTextArea() { return run; } + /** + * Return true if the execution is (or will be) in interactive mode and false for batch mode. + * Currently, batch mode means that the input field is not empty. + */ + public Boolean isInteractiveMode() { + return input.getText().isEmpty(); + } + /** * Returns the text written in the input field * From 838de0d1abefb1a58981dd8ee0202ce3082a1625 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 27 Jun 2024 17:51:23 -0400 Subject: [PATCH 066/199] add MessagesPane.append to factorize code --- src/rars/venus/MessagesPane.java | 46 ++++++++++++-------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index f88356cb..e4a1f783 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -342,24 +342,29 @@ public String getInputField() { return input.getText(); } - /** - * Post a message to the assembler display - * - * @param message String to append to assembler display text - */ - public void postMessage(String message) { - assemble.append(message); + /** Append a message to a textarea and garbage collect very old text if needed. */ + private void append(JTextArea area, String string) { + area.append(string); // can do some crude cutting here. If the document gets "very large", // let's cut off the oldest text. This will limit scrolling but the limit // can be set reasonably high. - if (assemble.getDocument().getLength() > MAXIMUM_SCROLLED_CHARACTERS) { + if (area.getDocument().getLength() > MAXIMUM_SCROLLED_CHARACTERS) { try { - assemble.getDocument().remove(0, NUMBER_OF_CHARACTERS_TO_CUT); + area.getDocument().remove(0, NUMBER_OF_CHARACTERS_TO_CUT); } catch (BadLocationException ble) { // only if NUMBER_OF_CHARACTERS_TO_CUT > MAXIMUM_SCROLLED_CHARACTERS } } - assemble.setCaretPosition(assemble.getDocument().getLength()); + area.setCaretPosition(area.getDocument().getLength()); + } + + /** + * Post a message to the assembler display + * + * @param message String to append to assembler display text + */ + public void postMessage(String message) { + append(assemble, message); leftPane.setSelectedComponent(assembleTab); } @@ -380,17 +385,7 @@ public void postRunMessage(String message) { new Runnable() { public void run() { leftPane.setSelectedComponent(runTab); - run.append(mess); - // can do some crude cutting here. If the document gets "very large", - // let's cut off the oldest text. This will limit scrolling but the limit - // can be set reasonably high. - if (run.getDocument().getLength() > MAXIMUM_SCROLLED_CHARACTERS) { - try { - run.getDocument().remove(0, NUMBER_OF_CHARACTERS_TO_CUT); - } catch (BadLocationException ble) { - // only if NUMBER_OF_CHARACTERS_TO_CUT > MAXIMUM_SCROLLED_CHARACTERS - } - } + append(run, mess); } }); } @@ -405,14 +400,7 @@ public void postOutput(String message) { SwingUtilities.invokeLater( new Runnable() { public void run() { - output.append(mess); - // as in method above: if document gets "very large", cuts off the oldest text. - if (output.getDocument().getLength() > MAXIMUM_SCROLLED_CHARACTERS) { - try { - output.getDocument().remove(0, NUMBER_OF_CHARACTERS_TO_CUT); - } catch (BadLocationException ble) { // as above - } - } + append(output, mess); } }); } From 165a06e4564cf2ca6bffafb0e47970a6677cb153 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 27 Jun 2024 18:01:57 -0400 Subject: [PATCH 067/199] MessagesPane: new layout batch vs. interactive --- src/rars/venus/MessagesPane.java | 34 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index e4a1f783..5d9971e1 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -54,8 +54,7 @@ a copy of this software and associated documentation files (the public class MessagesPane extends JPanel { private JTabbedPane leftPane; - private JTabbedPane rightPane; - private JSplitPane splitter; + private JSplitPane batchTab; JTextArea assemble, run, input, output; private JPanel assembleTab, runTab, inputTab, outputTab; // These constants are designed to keep scrolled contents of the @@ -75,7 +74,6 @@ public MessagesPane() { super(); this.setMinimumSize(new Dimension(0, 0)); leftPane = new JTabbedPane(); - rightPane = new JTabbedPane(); assemble = new JTextArea(); run = new JTextArea(); input = new JTextArea(); @@ -183,7 +181,7 @@ public void actionPerformed(ActionEvent e) { runTab.add(new JScrollPane(run, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); - JButton inputTabClearButton = new JButton("Clear"); + JButton inputTabClearButton = new JButton("Clear input"); inputTabClearButton.setToolTipText("Clear the input area"); inputTabClearButton.addActionListener( new ActionListener() { @@ -196,7 +194,7 @@ public void actionPerformed(ActionEvent e) { inputTab.add(new JScrollPane(input, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); - JButton outputTabClearButton = new JButton("Clear"); + JButton outputTabClearButton = new JButton("Clear output"); outputTabClearButton.setToolTipText("Clear the Output area"); outputTabClearButton.addActionListener( new ActionListener() { @@ -209,24 +207,22 @@ public void actionPerformed(ActionEvent e) { outputTab.add(new JScrollPane(output, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); + batchTab = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, inputTab, outputTab); + batchTab.setOneTouchExpandable(true); + batchTab.resetToPreferredSizes(); + batchTab.setResizeWeight(0.5); + leftPane.addTab("Messages", assembleTab); - leftPane.addTab("Run", runTab); - leftPane.addTab("Input", inputTab); + leftPane.addTab("Interactive", runTab); + leftPane.addTab("Batch", batchTab); leftPane.setForeground(Color.BLACK); - rightPane.addTab("Output", outputTab); - rightPane.setForeground(Color.BLACK); leftPane.setToolTipTextAt(0, "Messages produced by Run menu. Click on assemble error message to select erroneous line"); leftPane.setToolTipTextAt(1, "Simulated console input (used while running) and other run messages"); leftPane.setToolTipTextAt(2, "Simulated console input (to use before running)"); - rightPane.setToolTipTextAt(0, "Simulated console output"); - splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPane, rightPane); - splitter.setOneTouchExpandable(true); - splitter.resetToPreferredSizes(); - splitter.setResizeWeight(0.5); this.setLayout(new BorderLayout()); - this.add(splitter); + this.add(leftPane); } // Center given button in a box, centered vertically and 6 pixels on left and right @@ -384,8 +380,13 @@ public void postRunMessage(String message) { SwingUtilities.invokeLater( new Runnable() { public void run() { - leftPane.setSelectedComponent(runTab); + if (isInteractiveMode()) { + leftPane.setSelectedComponent(runTab); + } else { + leftPane.setSelectedComponent(batchTab); + } append(run, mess); + append(output, mess); } }); } @@ -400,6 +401,7 @@ public void postOutput(String message) { SwingUtilities.invokeLater( new Runnable() { public void run() { + append(run, mess); append(output, mess); } }); From db9811ef74052762255bb26f8bbaface2b0850d3 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 28 Jun 2024 13:58:48 -0400 Subject: [PATCH 068/199] SystemIO.readChar consistently read UTF-8 bytes --- src/rars/util/SystemIO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index b604dd78..5fdf7f26 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -193,7 +193,7 @@ public static int readChar(int serviceNumber) { if (Globals.getGui() != null && Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { String input = readStringInternal("0", "Enter a character value (syscall " + serviceNumber + ")", 1); if (input.length()>0) - returnValue = input.charAt(0); // truncate + returnValue = input.getBytes(StandardCharsets.UTF_8) [0] & 0xFF; // truncate else returnValue = -1; // assume EOF on empty string } else { @@ -201,7 +201,7 @@ public static int readChar(int serviceNumber) { byte[] input = new byte[1]; int len = readFromFile(0, input, 1); if (len>0) - returnValue = input[0]; + returnValue = input[0] & 0xFF; else returnValue = -1; } From 8365b4ec76cac0e79bc69f791e72016847df9bc0 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 28 Jun 2024 13:59:45 -0400 Subject: [PATCH 069/199] SyscallPrintChar.simulate consistently writes UFT-8 bytes --- src/rars/riscv/syscalls/SyscallPrintChar.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallPrintChar.java b/src/rars/riscv/syscalls/SyscallPrintChar.java index 58b130f9..6f4fe372 100644 --- a/src/rars/riscv/syscalls/SyscallPrintChar.java +++ b/src/rars/riscv/syscalls/SyscallPrintChar.java @@ -5,6 +5,8 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; +import java.nio.charset.StandardCharsets; + /* Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar @@ -40,8 +42,9 @@ public SyscallPrintChar() { } public void simulate(ProgramStatement statement) { - char t = (char) (RegisterFile.getValue("a0") & 0x000000ff); - SystemIO.printString(Character.toString(t)); + byte[] t = new byte[1]; + t[0] = (byte) RegisterFile.getValue("a0"); + SystemIO.printString(new String(t, StandardCharsets.UTF_8)); } } \ No newline at end of file From 0522776c59e674e4d28e1a5092e798a978c7c35e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 28 Jun 2024 14:00:16 -0400 Subject: [PATCH 070/199] tests: update readchar.s --- test/readchar.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/readchar.s b/test/readchar.s index 38baaad2..db755f8b 100644 --- a/test/readchar.s +++ b/test/readchar.s @@ -1,5 +1,5 @@ #stdin:a b\n\n! -#stdout:97a32 98b10\n10\n33!-1ÿ-1ÿ +#stdout:97a32 98b10\n10\n33!-1�-1� .eqv PrintInt, 1 .eqv ReadChar, 12 From aba8bc1b147097a72e895f6e0125798095d95ede Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sat, 29 Jun 2024 17:05:49 -0400 Subject: [PATCH 071/199] assemble and simulate erro exit code default to 1 and 2 --- src/rars/Launch.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rars/Launch.java b/src/rars/Launch.java index 52bb8303..d9c15a2d 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -146,8 +146,8 @@ private Launch(String[] args) { assembleProject = false; countInstructions = false; instructionCount = 0; - assembleErrorExitCode = 0; - simulateErrorExitCode = 0; + assembleErrorExitCode = 1; + simulateErrorExitCode = 2; registerDisplayList = new ArrayList<>(); memoryDisplayList = new ArrayList<>(); filenameList = new ArrayList<>(); From 85d08b25f1d0dce3b97d7d57bb58092a306a078f Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sat, 29 Jun 2024 17:06:39 -0400 Subject: [PATCH 072/199] new exit code 3 for max step error --- src/rars/Launch.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rars/Launch.java b/src/rars/Launch.java index d9c15a2d..afe8f31f 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -131,6 +131,7 @@ public class Launch { private ArrayList programArgumentList; // optional program args for program (becomes argc, argv) private int assembleErrorExitCode; // RARS command exit code to return if assemble error occurs private int simulateErrorExitCode;// RARS command exit code to return if simulation error occurs + private int maxStepsErrorExitCode;// RARS command exit code to return if max number of instructions is reached public static void main(String[] args){ new Launch(args); @@ -148,6 +149,7 @@ private Launch(String[] args) { instructionCount = 0; assembleErrorExitCode = 1; simulateErrorExitCode = 2; + maxStepsErrorExitCode = 3; registerDisplayList = new ArrayList<>(); memoryDisplayList = new ArrayList<>(); filenameList = new ArrayList<>(); @@ -512,6 +514,7 @@ private Program runCommand() { Simulator.Reason done = program.simulate(); if (done == Simulator.Reason.MAX_STEPS) { out.println("\nProgram terminated when maximum step limit " + options.maxSteps + " reached."); + Globals.exitCode = maxStepsErrorExitCode; break; } else if (done == Simulator.Reason.CLIFF_TERMINATION) { out.println("\nProgram terminated by dropping off the bottom."); From 43ed5b09bc52d0e2b52fc8dbd68dfbfe9cb87699 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sat, 29 Jun 2024 17:06:53 -0400 Subject: [PATCH 073/199] Launch.java: remove unused import --- src/rars/Launch.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/rars/Launch.java b/src/rars/Launch.java index afe8f31f..351e62ba 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -5,7 +5,6 @@ import rars.riscv.dump.DumpFormat; import rars.riscv.dump.DumpFormatLoader; import rars.riscv.hardware.*; -import rars.simulator.ProgramArgumentList; import rars.simulator.Simulator; import rars.util.Binary; import rars.util.FilenameFinder; @@ -20,8 +19,6 @@ import java.io.PrintStream; import java.util.ArrayList; import java.util.Iterator; -import java.util.Observable; -import java.util.Observer; /* Copyright (c) 2003-2012, Pete Sanderson and Kenneth Vollmar From 5f18d5cb6aa2a7944520e82b44b4668b3b43c655 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sat, 29 Jun 2024 17:14:24 -0400 Subject: [PATCH 074/199] cli: always use stderr for messages --- src/rars/Launch.java | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/rars/Launch.java b/src/rars/Launch.java index 351e62ba..bf8aad37 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -151,7 +151,7 @@ private Launch(String[] args) { memoryDisplayList = new ArrayList<>(); filenameList = new ArrayList<>(); MemoryConfigurations.setCurrentConfiguration(MemoryConfigurations.getDefaultConfiguration()); - out = System.out; + out = System.err; if (!parseCommandArgs(args)) { System.exit(Globals.exitCode); @@ -255,16 +255,11 @@ public void run() { private boolean parseCommandArgs(String[] args) { String noCopyrightSwitch = "nc"; - String displayMessagesToErrSwitch = "me"; boolean argsOK = true; boolean inProgramArgumentList = false; programArgumentList = null; if (args.length == 0) return true; // should not get here... - // If the option to display RARS messages to standard erro is used, - // it must be processed before any others (since messages may be - // generated during option parsing). - processDisplayMessagesToErrSwitch(args, displayMessagesToErrSwitch); displayCopyright(args, noCopyrightSwitch); // ..or not.. if (args.length == 1 && args[0].equals("h")) { displayHelp(); @@ -286,8 +281,8 @@ private boolean parseCommandArgs(String[] args) { inProgramArgumentList = true; continue; } - // messages-to-standard-error switch already processed, so ignore. - if (args[i].toLowerCase().equals(displayMessagesToErrSwitch)) { + // messages-to-standard-error removed, so ignore. + if (args[i].toLowerCase().equals("me")) { continue; } // no-copyright switch already processed, so ignore. @@ -671,18 +666,6 @@ private void displayMemoryPostMortem(Memory memory) { } } - /////////////////////////////////////////////////////////////////////// - // If option to display RARS messages to standard err (System.err) is - // present, it must be processed before all others. Since messages may - // be output as early as during the command parse. - private void processDisplayMessagesToErrSwitch(String[] args, String displayMessagesToErrSwitch) { - for (String arg : args) { - if (arg.toLowerCase().equals(displayMessagesToErrSwitch)) { - out = System.err; - return; - } - } - } /////////////////////////////////////////////////////////////////////// // Decide whether copyright should be displayed, and display // if so. From 527e05d5022e0da02c81bb208f02a9500c606941 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sat, 29 Jun 2024 17:26:46 -0400 Subject: [PATCH 075/199] cli: display version and copyright only when requested --- src/rars/Launch.java | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/rars/Launch.java b/src/rars/Launch.java index bf8aad37..50375a8c 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -254,13 +254,11 @@ public void run() { // Returns true if command args parse OK, false otherwise. private boolean parseCommandArgs(String[] args) { - String noCopyrightSwitch = "nc"; boolean argsOK = true; boolean inProgramArgumentList = false; programArgumentList = null; if (args.length == 0) return true; // should not get here... - displayCopyright(args, noCopyrightSwitch); // ..or not.. if (args.length == 1 && args[0].equals("h")) { displayHelp(); return false; @@ -285,8 +283,12 @@ private boolean parseCommandArgs(String[] args) { if (args[i].toLowerCase().equals("me")) { continue; } - // no-copyright switch already processed, so ignore. - if (args[i].toLowerCase().equals(noCopyrightSwitch)) { + // no-copyright switch removed, so ignore. + if (args[i].toLowerCase().equals("nc")) { + continue; + } + if (args[i].toLowerCase().equals("version")) { + displayVersion(); continue; } if (args[i].toLowerCase().equals("dump")) { @@ -666,17 +668,11 @@ private void displayMemoryPostMortem(Memory memory) { } } - /////////////////////////////////////////////////////////////////////// - // Decide whether copyright should be displayed, and display - // if so. - - private void displayCopyright(String[] args, String noCopyrightSwitch) { - for (String arg : args) { - if (arg.toLowerCase().equals(noCopyrightSwitch)) { - return; - } - } - out.println("RARS " + Globals.version + " Copyright " + Globals.copyrightYears + " " + Globals.copyrightHolders + "\n"); + /** + * Display version and copyright. + * */ + private void displayVersion() { + out.println("RARS " + Globals.version + " Copyright " + Globals.copyrightYears + " " + Globals.copyrightHolders + "\n"); } From 8137cc2a279a67548ac11c6577efad7afed82c73 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sat, 29 Jun 2024 17:40:51 -0400 Subject: [PATCH 076/199] cli: update help --- src/help/Command.html | 5 ++--- src/rars/Launch.java | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/help/Command.html b/src/help/Command.html index c4acdbf8..34e24693 100644 --- a/src/help/Command.html +++ b/src/help/Command.html @@ -41,13 +41,12 @@

Using RARS from a command line.

possible values are Default for the default 32-bit address space, CompactDataAtZero for a 32KB address space with data segment at address 0, or CompactTextAtZero for a 32KB address space with text segment at address 0.3.7 -medisplay RARS messages to standard err instead of standard out. Allows you to separate RARS messages from program output using redirection.4.3 -nccopyright notice will not be displayed. Useful if redirecting or piping program output.3.5 nppseudo-instructions or extended instruction formats are not permitted.3.0 pproject option - will assemble the specified file and all other assembly files (*.asm; *.s) in its directory.3.1 senterminate RARS with exit code n if simulate (run) error occurs4.1 smstart execution at statement having global label 'main' if defined3.8 smcSelf Modifying Code - Program can write and execute in either text or data segment4.4 +versionshow copyright notice and version will not be displayed. weassembler warnings will be considered errors.3.5 nwhere n is an integer maximum count of execution steps to simulate. If 0, negative or not specified, there is no maximum.1.0 @@ -97,4 +96,4 @@

Using RARS from a command line.

or if you want to run a number of different programs such as for grading purposes. - \ No newline at end of file + diff --git a/src/rars/Launch.java b/src/rars/Launch.java index 50375a8c..1e512cb2 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -719,15 +719,13 @@ private void displayHelp() { out.println(" 32-bit address space, CompactDataAtZero for a 32KB memory with"); out.println(" data segment at address 0, or CompactTextAtZero for a 32KB"); out.println(" memory with text segment at address 0."); - out.println(" me -- display RARS messages to standard err instead of standard out. "); - out.println(" Can separate messages from program output using redirection"); - out.println(" nc -- do not display copyright notice (for cleaner redirected/piped output)."); out.println(" np -- use of pseudo instructions and formats not permitted"); out.println(" p -- Project mode - assemble all files in the same directory as given file."); out.println(" se -- terminate RARS with integer exit code if a simulation (run) error occurs."); out.println(" sm -- start execution at statement with global label main, if defined"); out.println(" smc -- Self Modifying Code - Program can write and branch to either text or data segment"); out.println(" rv64 -- Enables 64 bit assembly and executables (Not fully compatible with rv32)"); + out.println(" version -- Show version and copyright"); out.println(" -- where is an integer maximum count of steps to simulate."); out.println(" If 0, negative or not specified, there is no maximum."); out.println(" x -- where is number or name (e.g. 5, t3, f10) of register whose "); From d5e51b6dbe2f84907836197f1ca20f6382f44dc4 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 1 Jul 2024 14:45:31 -0400 Subject: [PATCH 077/199] selectRunMessageTab select the correct run or batch component --- src/rars/venus/MessagesPane.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index 5d9971e1..79a368a0 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -380,11 +380,7 @@ public void postRunMessage(String message) { SwingUtilities.invokeLater( new Runnable() { public void run() { - if (isInteractiveMode()) { - leftPane.setSelectedComponent(runTab); - } else { - leftPane.setSelectedComponent(batchTab); - } + selectRunMessageTab(); append(run, mess); append(output, mess); } @@ -418,7 +414,11 @@ public void selectMessageTab() { * Make the runtime message tab current (up front) */ public void selectRunMessageTab() { - leftPane.setSelectedComponent(runTab); + if (isInteractiveMode()) { + leftPane.setSelectedComponent(runTab); + } else { + leftPane.setSelectedComponent(batchTab); + } } /** From f3566bb871a07b66652d42df2fcdab2999e13811 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 1 Jul 2024 17:27:49 -0400 Subject: [PATCH 078/199] revamp runio tab: the mode is selectable with radio butons --- src/rars/Settings.java | 4 ++ src/rars/venus/MessagesPane.java | 113 +++++++++++++++++++++---------- 2 files changed, 83 insertions(+), 34 deletions(-) diff --git a/src/rars/Settings.java b/src/rars/Settings.java index 16bcf9fb..e0c77d05 100644 --- a/src/rars/Settings.java +++ b/src/rars/Settings.java @@ -137,6 +137,10 @@ public enum Bool { * Flag to control whether or not simulator will use popup dialog for input syscalls */ POPUP_SYSCALL_INPUT("PopupSyscallInput", false), + /** + * Flag to controg whether or not the run I/O mode is batch (true) or interactive (false). + */ + BATCH_IOMODE("BatchIOMode", false), /** * Flag to control whether or not to use generic text editor instead of language-aware styled editor */ diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index 79a368a0..9c308de4 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -2,6 +2,7 @@ import rars.ErrorList; import rars.Globals; +import rars.Settings; import rars.simulator.Simulator; import javax.swing.*; @@ -53,10 +54,15 @@ a copy of this software and associated documentation files (the **/ public class MessagesPane extends JPanel { + private final Box runButtonBox; + private final JRadioButton buttonPopup; + private final JRadioButton buttonInteractive; + private final JRadioButton buttonBatch; + private final JButton inputTabClearButton; private JTabbedPane leftPane; private JSplitPane batchTab; JTextArea assemble, run, input, output; - private JPanel assembleTab, runTab, inputTab, outputTab; + private JPanel assembleTab, runTab, inputTab, runioTab; // These constants are designed to keep scrolled contents of the // two message areas from becoming overwhelmingly large (which // seems to slow things down as new text is appended). Once it @@ -168,65 +174,108 @@ public void mouseClicked(MouseEvent e) { } }); - JButton runTabClearButton = new JButton("Clear"); - runTabClearButton.setToolTipText("Clear the Run area"); + JButton runTabClearButton = new JButton("Clear output"); + runTabClearButton.setToolTipText("Clear the output area"); runTabClearButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { run.setText(""); + output.setText(""); } }); - runTab = new JPanel(new BorderLayout()); - runTab.add(createBoxForButton(runTabClearButton), BorderLayout.WEST); - runTab.add(new JScrollPane(run, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); - - JButton inputTabClearButton = new JButton("Clear input"); - inputTabClearButton.setToolTipText("Clear the input area"); + inputTabClearButton = new JButton("Clear input"); + inputTabClearButton.setToolTipText("Clear the input area (batch mode only)"); inputTabClearButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { input.setText(""); } }); - inputTab = new JPanel(new BorderLayout()); - inputTab.add(createBoxForButton(inputTabClearButton), BorderLayout.WEST); - inputTab.add(new JScrollPane(input, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + + /* Stack of buttons on the left */ + runButtonBox = Box.createVerticalBox(); + buttonPopup = new JRadioButton("Popups"); + buttonInteractive = new JRadioButton("Interactive"); + buttonBatch = new JRadioButton("Batch"); + ButtonGroup bg = new ButtonGroup(); + bg.add(buttonPopup); + bg.add(buttonInteractive); + bg.add(buttonBatch); + ActionListener bl = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + updateIOTab(); + } + }; + buttonPopup.addActionListener(bl); + buttonInteractive.addActionListener(bl); + buttonBatch.addActionListener(bl); + runButtonBox.add(buttonPopup); + runButtonBox.add(buttonInteractive); + runButtonBox.add(buttonBatch); + runButtonBox.add(runTabClearButton); + runButtonBox.add(inputTabClearButton); + if (Globals.getSettings().getBooleanSetting(Settings.Bool.BATCH_IOMODE)) { + buttonBatch.setSelected(true); + } else if (Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { + buttonPopup.setSelected(true); + } else { + buttonInteractive.setSelected(true); + } + + /* runTab: A single interactive text area */ + runTab = new JPanel(new BorderLayout()); + runTab.add(createBoxForButton(runButtonBox), BorderLayout.WEST); + runTab.add(new JScrollPane(run, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); - JButton outputTabClearButton = new JButton("Clear output"); - outputTabClearButton.setToolTipText("Clear the Output area"); - outputTabClearButton.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent e) { - output.setText(""); - } - }); - outputTab = new JPanel(new BorderLayout()); - outputTab.add(createBoxForButton(outputTabClearButton), BorderLayout.EAST); + /* batchTab: A dual text area */ + JPanel inputTab = new JPanel(new BorderLayout()); + inputTab.add(new JScrollPane(input, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); + JPanel outputTab = new JPanel(new BorderLayout()); outputTab.add(new JScrollPane(output, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); - batchTab = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, inputTab, outputTab); batchTab.setOneTouchExpandable(true); batchTab.resetToPreferredSizes(); batchTab.setResizeWeight(0.5); + /* The runio, the content is dynamic */ + runioTab = new JPanel(new BorderLayout()); + updateIOTab(); + leftPane.addTab("Messages", assembleTab); - leftPane.addTab("Interactive", runTab); - leftPane.addTab("Batch", batchTab); + leftPane.addTab("Run I/O", runioTab); leftPane.setForeground(Color.BLACK); leftPane.setToolTipTextAt(0, "Messages produced by Run menu. Click on assemble error message to select erroneous line"); leftPane.setToolTipTextAt(1, "Simulated console input (used while running) and other run messages"); - leftPane.setToolTipTextAt(2, "Simulated console input (to use before running)"); this.setLayout(new BorderLayout()); this.add(leftPane); } + /** Update the content of the runio tab according to the selected radio buttons. */ + private void updateIOTab() { + runioTab.removeAll(); + runioTab.add(createBoxForButton(runButtonBox), BorderLayout.WEST); + if (buttonBatch.isSelected() ) { + Globals.getSettings().setBooleanSetting(Settings.Bool.BATCH_IOMODE, true); + Globals.getSettings().setBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT, false); + runioTab.add(batchTab); + inputTabClearButton.setEnabled(true); + } else { + Globals.getSettings().setBooleanSetting(Settings.Bool.BATCH_IOMODE, false); + runioTab.add(runTab); + Globals.getSettings().setBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT, buttonPopup.isSelected()); + inputTabClearButton.setEnabled(false); + } + this.repaint(); + } + // Center given button in a box, centered vertically and 6 pixels on left and right - private Box createBoxForButton(JButton button) { + private Box createBoxForButton(Component button) { Box buttonRow = Box.createHorizontalBox(); buttonRow.add(Box.createHorizontalStrut(6)); buttonRow.add(button); @@ -326,7 +375,7 @@ public JTextArea getRunTextArea() { * Currently, batch mode means that the input field is not empty. */ public Boolean isInteractiveMode() { - return input.getText().isEmpty(); + return ! Globals.getSettings().getBooleanSetting(Settings.Bool.BATCH_IOMODE); } /** @@ -414,11 +463,7 @@ public void selectMessageTab() { * Make the runtime message tab current (up front) */ public void selectRunMessageTab() { - if (isInteractiveMode()) { - leftPane.setSelectedComponent(runTab); - } else { - leftPane.setSelectedComponent(batchTab); - } + leftPane.setSelectedComponent(runioTab); } /** From e160e2b20a376c272b7dd30d0bf50a35c0876dc2 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 1 Jul 2024 17:29:36 -0400 Subject: [PATCH 079/199] kill settingsPopupInput menu entry --- src/rars/venus/VenusUI.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index 15c976a2..a4046cc2 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -83,7 +83,7 @@ public class VenusUI extends JFrame { private JMenuItem fileNew, fileOpen, fileClose, fileCloseAll, fileSave, fileSaveAs, fileSaveAll, fileDumpMemory, fileExit; private JMenuItem editUndo, editRedo, editCut, editCopy, editPaste, editFindReplace, editSelectAll; private JMenuItem runGo, runStep, runBackstep, runReset, runAssemble, runStop, runPause, runClearBreakpoints, runToggleBreakpoints; - private JCheckBoxMenuItem settingsLabel, settingsPopupInput, settingsValueDisplayBase, settingsAddressDisplayBase, + private JCheckBoxMenuItem settingsLabel, settingsValueDisplayBase, settingsAddressDisplayBase, settingsExtended, settingsAssembleOnOpen, settingsAssembleAll, settingsAssembleOpen, settingsWarningsAreErrors, settingsStartAtMain, settingsProgramArguments, settingsSelfModifyingCode, settingsRV64, settingsDeriveCurrentWorkingDirectory; private JMenuItem settingsExceptionHandler, settingsEditor, settingsHighlighting, settingsMemoryConfiguration; @@ -106,7 +106,7 @@ public class VenusUI extends JFrame { private Action editCutAction, editCopyAction, editPasteAction, editFindReplaceAction, editSelectAllAction; private Action runAssembleAction, runGoAction, runStepAction, runBackstepAction, runResetAction, runStopAction, runPauseAction, runClearBreakpointsAction, runToggleBreakpointsAction; - private Action settingsLabelAction, settingsPopupInputAction, settingsValueDisplayBaseAction, settingsAddressDisplayBaseAction, + private Action settingsLabelAction, settingsValueDisplayBaseAction, settingsAddressDisplayBaseAction, settingsExtendedAction, settingsAssembleOnOpenAction, settingsAssembleOpenAction, settingsAssembleAllAction, settingsWarningsAreErrorsAction, settingsStartAtMainAction, settingsProgramArgumentsAction, settingsExceptionHandlerAction, settingsEditorAction, settingsHighlightingAction, settingsMemoryConfigurationAction, @@ -411,9 +411,6 @@ public void handler(boolean visibility) { System.out.println("ExecutePane reference 2"); } }; - settingsPopupInputAction = new SettingsAction("Popup dialog for input syscalls (5,6,7,8,12)", - "If set, use popup dialog for input syscalls (5,6,7,8,12) instead of cursor in Run I/O window", - Settings.Bool.POPUP_SYSCALL_INPUT); settingsValueDisplayBaseAction = new SettingsAction("Values displayed in hexadecimal", "Toggle between hexadecimal and decimal display of memory/register values", @@ -613,8 +610,6 @@ private JMenuBar setUpMenuBar() { settingsLabel = new JCheckBoxMenuItem(settingsLabelAction); settingsLabel.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.LABEL_WINDOW_VISIBILITY)); - settingsPopupInput = new JCheckBoxMenuItem(settingsPopupInputAction); - settingsPopupInput.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)); settingsValueDisplayBase = new JCheckBoxMenuItem(settingsValueDisplayBaseAction); settingsValueDisplayBase.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.DISPLAY_VALUES_IN_HEX));//mainPane.getExecutePane().getValueDisplayBaseChooser().isSelected()); // Tell the corresponding JCheckBox in the Execute Pane about me -- it has already been created. @@ -650,7 +645,6 @@ private JMenuBar setUpMenuBar() { settings.add(settingsLabel); settings.add(settingsProgramArguments); - settings.add(settingsPopupInput); settings.add(settingsAddressDisplayBase); settings.add(settingsValueDisplayBase); settings.addSeparator(); From 862fd1c709e8c79caf4c0dddad4bb603fa2fd1a9 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 1 Jul 2024 20:48:35 -0400 Subject: [PATCH 080/199] SystemIO use isInteractiveMode to know how to read --- src/rars/util/SystemIO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 478166b6..84ff55ae 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -295,7 +295,7 @@ public static int readFromFile(int fd, byte[] myBuffer, int lengthRequested) { /// Read from STDIN file descriptor while using IDE - get input from Messages pane. if (fd == STDIN && Globals.getGui() != null) { //asks user for input in run pane - if (Globals.getGui().getMessagesPane().getInputField().isEmpty()) { + if (Globals.getGui().getMessagesPane().isInteractiveMode()) { String input = Globals.getGui().getMessagesPane().getInputString(lengthRequested); return readInBuffer(input, myBuffer); //takes input from input pane From c00e359ffa8fe113be1dca4bfb8ab53586dc2425 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 1 Jul 2024 20:49:22 -0400 Subject: [PATCH 081/199] SystemIO: improve reading from the input batch mode --- src/rars/util/SystemIO.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 84ff55ae..2be4be0d 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -301,10 +301,10 @@ public static int readFromFile(int fd, byte[] myBuffer, int lengthRequested) { //takes input from input pane } else { try { - String input = ""; - for (int i = 0; i < myBuffer.length; i++) { - input = input + (char) getInputReaderFromGui().read(); - } + char[] chars = new char[lengthRequested]; + int len = getInputReaderFromGui().read(chars); + if (len <= 0) return len; + String input = new String(chars); return readInBuffer(input, myBuffer); } catch (IOException e) { fileErrorString = "IO Exception on read from the input window of GUI"; From 7fe55c573684e0483495ba24d5503f53beb13de7 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 1 Jul 2024 20:50:08 -0400 Subject: [PATCH 082/199] runio: update only the content on change, not the whole pane --- src/rars/venus/MessagesPane.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index 9c308de4..d1fda3b5 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -59,6 +59,7 @@ public class MessagesPane extends JPanel { private final JRadioButton buttonInteractive; private final JRadioButton buttonBatch; private final JButton inputTabClearButton; + private final Box runioContent; private JTabbedPane leftPane; private JSplitPane batchTab; JTextArea assemble, run, input, output; @@ -242,7 +243,10 @@ public void actionPerformed(ActionEvent e) { batchTab.setResizeWeight(0.5); /* The runio, the content is dynamic */ + runioContent = Box.createHorizontalBox(); runioTab = new JPanel(new BorderLayout()); + runioTab.add(createBoxForButton(runButtonBox), BorderLayout.WEST); + runioTab.add(runioContent); updateIOTab(); leftPane.addTab("Messages", assembleTab); @@ -258,16 +262,15 @@ public void actionPerformed(ActionEvent e) { /** Update the content of the runio tab according to the selected radio buttons. */ private void updateIOTab() { - runioTab.removeAll(); - runioTab.add(createBoxForButton(runButtonBox), BorderLayout.WEST); + runioContent.removeAll(); if (buttonBatch.isSelected() ) { Globals.getSettings().setBooleanSetting(Settings.Bool.BATCH_IOMODE, true); Globals.getSettings().setBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT, false); - runioTab.add(batchTab); + runioContent.add(batchTab); inputTabClearButton.setEnabled(true); } else { Globals.getSettings().setBooleanSetting(Settings.Bool.BATCH_IOMODE, false); - runioTab.add(runTab); + runioContent.add(runTab); Globals.getSettings().setBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT, buttonPopup.isSelected()); inputTabClearButton.setEnabled(false); } From f33612ba37e0809ed8f34bf50d5f825a358a80ec Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 1 Jul 2024 21:06:20 -0400 Subject: [PATCH 083/199] Select runmessagetab after a sucessful assemble --- src/rars/venus/run/RunAssembleAction.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rars/venus/run/RunAssembleAction.java b/src/rars/venus/run/RunAssembleAction.java index 5e5bec6c..7ba88fd1 100644 --- a/src/rars/venus/run/RunAssembleAction.java +++ b/src/rars/venus/run/RunAssembleAction.java @@ -138,6 +138,7 @@ public void actionPerformed(ActionEvent e) { mainUI.setReset(true); mainUI.setStarted(false); mainUI.getMainPane().setSelectedComponent(executePane); + mainUI.getMessagesPane().selectRunMessageTab(); // Aug. 24, 2005 Ken Vollmar SystemIO.resetFiles(); // Ensure that I/O "file descriptors" are initialized for a new program run From 4b4bad99819404b4bdf68d6d94aa3e1f300ed755 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 2 Jul 2024 04:49:25 -0400 Subject: [PATCH 084/199] run action: do not bring CSR on exception, it's annoying --- src/rars/venus/run/RunGoAction.java | 4 ++-- src/rars/venus/run/RunStepAction.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/rars/venus/run/RunGoAction.java b/src/rars/venus/run/RunGoAction.java index d4c152dc..cf1d5ea5 100644 --- a/src/rars/venus/run/RunGoAction.java +++ b/src/rars/venus/run/RunGoAction.java @@ -161,9 +161,9 @@ public void stopped(SimulationException pe, Simulator.Reason reason) { executePane.getDataSegmentWindow().updateValues(); FileStatus.set(FileStatus.TERMINATED); SystemIO.resetFiles(); // close any files opened in MIPS program - // Bring CSRs to the front if terminated due to exception. if (pe != null) { - mainUI.getRegistersPane().setSelectedComponent(executePane.getControlAndStatusWindow()); + // Do not bring CSRs to the front if terminated due to exception. + // It's annoying, and confusing for the beginners executePane.getTextSegmentWindow().setCodeHighlighting(true); executePane.getTextSegmentWindow().unhighlightAllSteps(); executePane.getTextSegmentWindow().highlightStepAtAddress(RegisterFile.getProgramCounter() - 4); diff --git a/src/rars/venus/run/RunStepAction.java b/src/rars/venus/run/RunStepAction.java index 96b86bae..1ccb0bc1 100644 --- a/src/rars/venus/run/RunStepAction.java +++ b/src/rars/venus/run/RunStepAction.java @@ -126,7 +126,6 @@ public void stepped(boolean done, Simulator.Reason reason, SimulationException p pe.error().generateReport()); mainUI.getMessagesPane().postMessage( "\n" + name + ": execution terminated with errors.\n\n"); - mainUI.getRegistersPane().setSelectedComponent(executePane.getControlAndStatusWindow()); FileStatus.set(FileStatus.TERMINATED); // should be redundant. executePane.getTextSegmentWindow().setCodeHighlighting(true); executePane.getTextSegmentWindow().unhighlightAllSteps(); From 27f14d0a79a290475d29a86c24896200432b1013 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 2 Jul 2024 04:50:04 -0400 Subject: [PATCH 085/199] run action: echo the runtie exception on the runmessage pane --- src/rars/venus/run/RunGoAction.java | 1 + src/rars/venus/run/RunStepAction.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/rars/venus/run/RunGoAction.java b/src/rars/venus/run/RunGoAction.java index cf1d5ea5..350e9ce3 100644 --- a/src/rars/venus/run/RunGoAction.java +++ b/src/rars/venus/run/RunGoAction.java @@ -188,6 +188,7 @@ public void stopped(SimulationException pe, Simulator.Reason reason) { pe.error().generateReport()); mainUI.getMessagesPane().postMessage( "\n" + name + ": execution terminated with errors.\n\n"); + mainUI.getMessagesPane().postRunMessage("\n"+pe.error().getMessage()); break; case STOP: mainUI.getMessagesPane().postMessage( diff --git a/src/rars/venus/run/RunStepAction.java b/src/rars/venus/run/RunStepAction.java index 1ccb0bc1..104c1837 100644 --- a/src/rars/venus/run/RunStepAction.java +++ b/src/rars/venus/run/RunStepAction.java @@ -126,6 +126,7 @@ public void stepped(boolean done, Simulator.Reason reason, SimulationException p pe.error().generateReport()); mainUI.getMessagesPane().postMessage( "\n" + name + ": execution terminated with errors.\n\n"); + mainUI.getMessagesPane().postRunMessage("\n"+pe.error().getMessage()); FileStatus.set(FileStatus.TERMINATED); // should be redundant. executePane.getTextSegmentWindow().setCodeHighlighting(true); executePane.getTextSegmentWindow().unhighlightAllSteps(); From 4b06f44b36e6d4a6175853c18c093a426fd2aab3 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 2 Jul 2024 04:50:27 -0400 Subject: [PATCH 086/199] reset action: use the message pane --- src/rars/venus/run/RunResetAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rars/venus/run/RunResetAction.java b/src/rars/venus/run/RunResetAction.java index 4659bf69..c1844e44 100644 --- a/src/rars/venus/run/RunResetAction.java +++ b/src/rars/venus/run/RunResetAction.java @@ -103,7 +103,7 @@ public void actionPerformed(ActionEvent e) { // Aug. 24, 2005 Ken Vollmar SystemIO.resetFiles(); // Ensure that I/O "file descriptors" are initialized for a new program run - mainUI.getMessagesPane().postRunMessage( + mainUI.getMessagesPane().postMessage( "\n" + name + ": reset completed.\n\n"); } } \ No newline at end of file From cb18a0e791a3e8391bba88022a8cd421c53f0ad3 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 2 Jul 2024 13:19:54 -0400 Subject: [PATCH 087/199] ReadChar rejects non-ascii characters --- src/rars/riscv/syscalls/SyscallReadChar.java | 7 +++---- src/rars/util/SystemIO.java | 7 ++++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallReadChar.java b/src/rars/riscv/syscalls/SyscallReadChar.java index 223c5889..ced65f30 100644 --- a/src/rars/riscv/syscalls/SyscallReadChar.java +++ b/src/rars/riscv/syscalls/SyscallReadChar.java @@ -40,13 +40,12 @@ public SyscallReadChar() { } public void simulate(ProgramStatement statement) throws ExitingException { - try { - RegisterFile.updateRegister("a0", SystemIO.readChar(this.getNumber())); - } catch (IndexOutOfBoundsException e) // means null input - { + int character = SystemIO.readChar(this.getNumber()); + if (character == -2) { throw new ExitingException(statement, "invalid char input (syscall " + this.getNumber() + ")"); } + RegisterFile.updateRegister("a0", character); } } \ No newline at end of file diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 5fdf7f26..7809da26 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -182,9 +182,10 @@ public static String readString(int serviceNumber, int maxLength) { /** * Implements syscall having 12 in $v0, to read a char value. + * Only printable characters are accepted (9, 10, and 32 to 126). * * @param serviceNumber the number assigned to Read Char syscall (default 12) - * @return int value with lowest byte corresponding to user input or -1 on EOF + * @return int value with lowest byte corresponding to user input, -1 on EOF, or -2 on invalid ASCII character. */ public static int readChar(int serviceNumber) { int returnValue; @@ -206,6 +207,10 @@ public static int readChar(int serviceNumber) { returnValue = -1; } + if ((returnValue < 32 || returnValue >= 127) && returnValue != -1 && returnValue != '\n' && returnValue != '\t') { + return -2; + } + return returnValue; } From 9c619b7b59380f8ee5282b339d0429a708e29756 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 19 Jun 2024 14:34:13 -0400 Subject: [PATCH 088/199] changing highlight settings for explicit reading and writing --- src/rars/Settings.java | 44 +++++++++---------- .../settings/SettingsHighlightingAction.java | 12 ++--- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/rars/Settings.java b/src/rars/Settings.java index 16bcf9fb..8461fa0b 100644 --- a/src/rars/Settings.java +++ b/src/rars/Settings.java @@ -114,13 +114,13 @@ public enum Bool { */ PROGRAM_ARGUMENTS("ProgramArguments", false), /** - * Flag to control whether or not highlighting is applied to data segment window + * Flag to control whether or not highlighting is applied when explicit writing */ - DATA_SEGMENT_HIGHLIGHTING("DataSegmentHighlighting", true), + EXPLICIT_WRITE_HIGHLIGHTING("ExplicitWriteHighlighting", true), /** - * Flag to control whether or not highlighting is applied to register windows + * Flag to control whether or not highlighting is applied when explicit reading */ - REGISTERS_HIGHLIGHTING("RegistersHighlighting", true), + EXPLICIT_READ_HIGHLIGHTING("ExplicitReadHighlighting", true), /** * Flag to control whether or not assembler automatically initializes program counter to 'main's address */ @@ -244,25 +244,25 @@ String getName() { */ public static final int TEXTSEGMENT_DELAYSLOT_HIGHLIGHT_FONT = 4; /** - * Font for text segment highlighted background + * Font for data segment highlighted background */ - public static final int DATASEGMENT_HIGHLIGHT_FONT = 5; + public static final int EXPLICIT_WRITE_HIGHLIGHT_FONT = 5; /** - * Font for register highlighted background + * Font for data segment highlighted background */ - public static final int REGISTER_HIGHLIGHT_FONT = 6; + public static final int EXPLICIT_READ_HIGHLIGHT_FONT = 6; private static final String[] fontFamilySettingsKeys = {"EditorFontFamily", "EvenRowFontFamily", "OddRowFontFamily", " TextSegmentHighlightFontFamily", "TextSegmentDelayslotHighightFontFamily", - "DataSegmentHighlightFontFamily", "RegisterHighlightFontFamily" + "ExplicitWriteHighlightFontFamily","ExplicitReadHighlightFontFamily" }; private static final String[] fontStyleSettingsKeys = {"EditorFontStyle", "EvenRowFontStyle", "OddRowFontStyle", " TextSegmentHighlightFontStyle", "TextSegmentDelayslotHighightFontStyle", - "DataSegmentHighlightFontStyle", "RegisterHighlightFontStyle" + "ExplicitWriteHighlightFontStyle", "ExplicitWriteHighlightFontStyle" }; private static final String[] fontSizeSettingsKeys = {"EditorFontSize", "EvenRowFontSize", "OddRowFontSize", " TextSegmentHighlightFontSize", "TextSegmentDelayslotHighightFontSize", - "DataSegmentHighlightFontSize", "RegisterHighlightFontSize" + "ExplicitWriteHighlightFontSize", "ExplicitWriteHighlightFontSize" }; @@ -321,21 +321,21 @@ String getName() { */ public static final int TEXTSEGMENT_DELAYSLOT_HIGHLIGHT_FOREGROUND = 7; /** - * RGB color for text segment highlighted background + * RGB color for highlighted background when explicitly writing data */ - public static final int DATASEGMENT_HIGHLIGHT_BACKGROUND = 8; + public static final int EXPLICIT_WRITE_HIGHLIGHT_BACKGROUND = 8; /** - * RGB color for text segment highlighted foreground + * RGB color for highlighted foreground when explicitly writing data */ - public static final int DATASEGMENT_HIGHLIGHT_FOREGROUND = 9; + public static final int EXPLICIT_WRITE_HIGHLIGHT_FOREGROUND = 9; /** - * RGB color for register highlighted background + * RGB color for highlighted background when explicitly reading data */ - public static final int REGISTER_HIGHLIGHT_BACKGROUND = 10; + public static final int EXPLICIT_READ_HIGHLIGHT_BACKGROUND = 10; /** - * RGB color for register highlighted foreground + * RGB color for highlighted foreground when explicitly reading data */ - public static final int REGISTER_HIGHLIGHT_FOREGROUND = 11; + public static final int EXPLICIT_READ_HIGHLIGHT_FOREGROUND = 11; /** * RGB background color of Editor */ @@ -371,8 +371,8 @@ public enum ColorMode { "EvenRowBackground", "EvenRowForeground", "OddRowBackground", "OddRowForeground", "TextSegmentHighlightBackground", "TextSegmentHighlightForeground", "TextSegmentDelaySlotHighlightBackground", "TextSegmentDelaySlotHighlightForeground", - "DataSegmentHighlightBackground", "DataSegmentHighlightForeground", - "RegisterHighlightBackground", "RegisterHighlightForeground", + "ExplicitWriteHighlightBackground", "ExplicitWriteHighlightForeground", + "ExplicitReadHighlightBackground", "ExplicitReadRegisterHighlightForeground", "EditorBackground", "EditorForeground", "EditorLineHighlight", "EditorSelection", "EditorCaretColor"}; /** * Last resort default values for color settings; @@ -381,7 +381,7 @@ public enum ColorMode { * Must match key by list position. */ private static String[] defaultColorSettingsValues = { - "0x00e0e0e0", "0", "0x00ffffff", "0", "0x00ffff99", "0", "0x0033ff00", "0", "0x0099ccff", "0", "0x0099cc55", "0", "0x00ffffff", "0x00000000", "0x00eeeeee", "0x00ccccff", "0x00000000"}; + "0x00e0e0e0", "0", "0x00ffffff", "0", "0x00ffff99", "0", "0x0033ff00", "0", "0x00ff8080", "0", "0x0099ccff","0", "0x00ffffff", "0x00000000", "0x00eeeeee", "0x00ccccff", "0x00000000"}; interface SystemColorProvider { Color getColor();} private SystemColorProvider[] systemColors; diff --git a/src/rars/venus/settings/SettingsHighlightingAction.java b/src/rars/venus/settings/SettingsHighlightingAction.java index aec35325..40b0ee25 100644 --- a/src/rars/venus/settings/SettingsHighlightingAction.java +++ b/src/rars/venus/settings/SettingsHighlightingAction.java @@ -55,8 +55,8 @@ public class SettingsHighlightingAction extends GuiAction { private static final int[] backgroundSettingPositions = { Settings.TEXTSEGMENT_HIGHLIGHT_BACKGROUND, Settings.TEXTSEGMENT_DELAYSLOT_HIGHLIGHT_BACKGROUND, - Settings.DATASEGMENT_HIGHLIGHT_BACKGROUND, - Settings.REGISTER_HIGHLIGHT_BACKGROUND, + Settings.EXPLICIT_WRITE_HIGHLIGHT_BACKGROUND, + Settings.EXPLICIT_READ_HIGHLIGHT_BACKGROUND, Settings.EVEN_ROW_BACKGROUND, Settings.ODD_ROW_BACKGROUND }; @@ -64,8 +64,8 @@ public class SettingsHighlightingAction extends GuiAction { private static final int[] foregroundSettingPositions = { Settings.TEXTSEGMENT_HIGHLIGHT_FOREGROUND, Settings.TEXTSEGMENT_DELAYSLOT_HIGHLIGHT_FOREGROUND, - Settings.DATASEGMENT_HIGHLIGHT_FOREGROUND, - Settings.REGISTER_HIGHLIGHT_FOREGROUND, + Settings.EXPLICIT_WRITE_HIGHLIGHT_FOREGROUND, + Settings.EXPLICIT_READ_HIGHLIGHT_FOREGROUND, Settings.EVEN_ROW_FOREGROUND, Settings.ODD_ROW_FOREGROUND }; @@ -73,8 +73,8 @@ public class SettingsHighlightingAction extends GuiAction { private static final int[] fontSettingPositions = { Settings.TEXTSEGMENT_HIGHLIGHT_FONT, Settings.TEXTSEGMENT_DELAYSLOT_HIGHLIGHT_FONT, - Settings.DATASEGMENT_HIGHLIGHT_FONT, - Settings.REGISTER_HIGHLIGHT_FONT, + Settings.EXPLICIT_WRITE_HIGHLIGHT_FONT, + Settings.EXPLICIT_READ_HIGHLIGHT_FONT, Settings.EVEN_ROW_FONT, Settings.ODD_ROW_FONT }; From b07ec3e3ea6fd3239852925a84b97bd690321335 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 2 Jul 2024 14:48:49 -0400 Subject: [PATCH 089/199] changing in UI highlight settings --- .../settings/SettingsHighlightingAction.java | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/rars/venus/settings/SettingsHighlightingAction.java b/src/rars/venus/settings/SettingsHighlightingAction.java index 40b0ee25..81b08ab6 100644 --- a/src/rars/venus/settings/SettingsHighlightingAction.java +++ b/src/rars/venus/settings/SettingsHighlightingAction.java @@ -87,9 +87,9 @@ public class SettingsHighlightingAction extends GuiAction { Color[] currentNondefaultBackground, currentNondefaultForeground; Color[] initialSettingsBackground, initialSettingsForeground; Font[] initialFont, currentFont, currentNondefaultFont; - JButton dataHighlightButton, registerHighlightButton; - boolean currentDataHighlightSetting, initialDataHighlightSetting; - boolean currentRegisterHighlightSetting, initialRegisterHighlightSetting; + JButton explicitWriteHighlightButton, explicitReadHighlightButton; + boolean currentExplicitWriteHighlightSetting, initialExplicitWriteHighlightSetting; + boolean currentExplicitReadHighlightSetting, initialExplicitReadHighlightSetting; private static final int gridVGap = 2; private static final int gridHGap = 2; @@ -105,8 +105,8 @@ public class SettingsHighlightingAction extends GuiAction { public static final String RESET_TOOL_TIP_TEXT = "Reset to initial settings without applying"; public static final String CANCEL_TOOL_TIP_TEXT = "Close dialog without applying current settings"; // Tool tips for the data and register highlighting enable/disable controls - private static final String DATA_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT = "Click, to enable or disable highlighting in Data Segment window"; - private static final String REGISTER_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT = "Click, to enable or disable highlighting in Register windows"; + private static final String EXPLICIT_WRITE_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT = "Click, to enable or disable explicit writing highlighting"; + private static final String EXPLICIT_READ_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT = "Click, to enable or disable explicit reading highlighting"; private static final String fontButtonText = "font"; /** @@ -185,8 +185,8 @@ private JPanel buildDialogPanel() { // Note the labels have to match buttons by position... descriptions.add(new JLabel("Text Segment highlighting", SwingConstants.RIGHT)); descriptions.add(new JLabel("Text Segment Delay Slot highlighting", SwingConstants.RIGHT)); - descriptions.add(new JLabel("Data Segment highlighting *", SwingConstants.RIGHT)); - descriptions.add(new JLabel("Register highlighting *", SwingConstants.RIGHT)); + descriptions.add(new JLabel("Explicit writing highlighting *", SwingConstants.RIGHT)); + descriptions.add(new JLabel("Explicit reading highlighting *", SwingConstants.RIGHT)); descriptions.add(new JLabel("Even row normal", SwingConstants.RIGHT)); descriptions.add(new JLabel("Odd row normal", SwingConstants.RIGHT)); @@ -225,36 +225,36 @@ protected void processKeyEvent(KeyEvent e) { contents.add(instructions, BorderLayout.NORTH); // Control highlighting enable/disable for Data Segment window and Register windows - JPanel dataRegisterHighlightControl = new JPanel(new GridLayout(2, 1)); - dataHighlightButton = new JButton(); - dataHighlightButton.setText(getHighlightControlText(currentDataHighlightSetting)); - dataHighlightButton.setToolTipText(DATA_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT); - dataHighlightButton.addActionListener( + JPanel explicitReadWriteHighlightControl = new JPanel(new GridLayout(2, 1)); + explicitWriteHighlightButton = new JButton(); + explicitWriteHighlightButton.setText(getHighlightControlText(currentExplicitWriteHighlightSetting)); + explicitWriteHighlightButton.setToolTipText(EXPLICIT_WRITE_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT); + explicitWriteHighlightButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { - currentDataHighlightSetting = !currentDataHighlightSetting; - dataHighlightButton.setText(getHighlightControlText(currentDataHighlightSetting)); + currentExplicitWriteHighlightSetting = !currentExplicitWriteHighlightSetting; + explicitWriteHighlightButton.setText(getHighlightControlText(currentExplicitWriteHighlightSetting)); } }); - registerHighlightButton = new JButton(); - registerHighlightButton.setText(getHighlightControlText(currentRegisterHighlightSetting)); - registerHighlightButton.setToolTipText(REGISTER_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT); - registerHighlightButton.addActionListener( + explicitReadHighlightButton = new JButton(); + explicitReadHighlightButton.setText(getHighlightControlText(currentExplicitReadHighlightSetting)); + explicitReadHighlightButton.setToolTipText(EXPLICIT_READ_HIGHLIGHT_ENABLE_TOOL_TIP_TEXT); + explicitReadHighlightButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { - currentRegisterHighlightSetting = !currentRegisterHighlightSetting; - registerHighlightButton.setText(getHighlightControlText(currentRegisterHighlightSetting)); + currentExplicitReadHighlightSetting = !currentExplicitReadHighlightSetting; + explicitReadHighlightButton.setText(getHighlightControlText(currentExplicitReadHighlightSetting)); } }); - JPanel dataHighlightPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); - JPanel registerHighlightPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); - dataHighlightPanel.add(new JLabel("* Data Segment highlighting is")); - dataHighlightPanel.add(dataHighlightButton); - registerHighlightPanel.add(new JLabel("* Register highlighting is")); - registerHighlightPanel.add(registerHighlightButton); - dataRegisterHighlightControl.setBorder(new LineBorder(Color.BLACK)); - dataRegisterHighlightControl.add(dataHighlightPanel); - dataRegisterHighlightControl.add(registerHighlightPanel); + JPanel explicitWriteHighlightPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + JPanel explicitReadHighlightPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + explicitWriteHighlightPanel.add(new JLabel("* Explicit writing highlighting is")); + explicitReadHighlightPanel.add(new JLabel("* Explicit reading highlighting is")); + explicitWriteHighlightPanel.add(explicitWriteHighlightButton); + explicitReadHighlightPanel.add(explicitReadHighlightButton); + explicitReadWriteHighlightControl.setBorder(new LineBorder(Color.BLACK)); + explicitReadWriteHighlightControl.add(explicitWriteHighlightPanel); + explicitReadWriteHighlightControl.add(explicitReadHighlightPanel); // Bottom row - the control buttons for Apply&Close, Apply, Cancel Box controlPanel = Box.createHorizontalBox(); @@ -302,7 +302,7 @@ public void actionPerformed(ActionEvent e) { controlPanel.add(Box.createHorizontalGlue()); JPanel allControls = new JPanel(new GridLayout(2, 1)); - allControls.add(dataRegisterHighlightControl); + allControls.add(explicitReadWriteHighlightControl); allControls.add(controlPanel); contents.add(allControls, BorderLayout.SOUTH); return contents; @@ -346,8 +346,8 @@ private void initializeButtonColors() { foregroundButtons[i].setEnabled(!usingDefaults); fontButtons[i].setEnabled(!usingDefaults); } - currentDataHighlightSetting = initialDataHighlightSetting = settings.getBooleanSetting(Settings.Bool.DATA_SEGMENT_HIGHLIGHTING); - currentRegisterHighlightSetting = initialRegisterHighlightSetting = settings.getBooleanSetting(Settings.Bool.REGISTERS_HIGHLIGHTING); + currentExplicitWriteHighlightSetting = initialExplicitWriteHighlightSetting = settings.getBooleanSetting(Settings.Bool.EXPLICIT_WRITE_HIGHLIGHTING); + currentExplicitReadHighlightSetting = initialExplicitReadHighlightSetting = settings.getBooleanSetting(Settings.Bool.EXPLICIT_READ_HIGHLIGHTING); } @@ -359,8 +359,8 @@ private void setHighlightingSettings() { settings.setColorSettingByPosition(foregroundSettingPositions[i], foregroundButtons[i].getBackground()); settings.setFontByPosition(fontSettingPositions[i], samples[i].getFont());//fontButtons[i].getFont()); } - settings.setBooleanSetting(Settings.Bool.DATA_SEGMENT_HIGHLIGHTING, currentDataHighlightSetting); - settings.setBooleanSetting(Settings.Bool.REGISTERS_HIGHLIGHTING, currentRegisterHighlightSetting); + settings.setBooleanSetting(Settings.Bool.EXPLICIT_WRITE_HIGHLIGHTING, currentExplicitWriteHighlightSetting); + settings.setBooleanSetting(Settings.Bool.EXPLICIT_READ_HIGHLIGHTING, currentExplicitReadHighlightSetting); ExecutePane executePane = Globals.getGui().getMainPane().getExecutePane(); executePane.getRegistersWindow().refresh(); executePane.getControlAndStatusWindow().refresh(); @@ -379,8 +379,8 @@ private void setHighlightingSettings() { // Called when Reset selected. private void resetButtonColors() { Settings settings = Globals.getSettings(); - dataHighlightButton.setText(getHighlightControlText(initialDataHighlightSetting)); - registerHighlightButton.setText(getHighlightControlText(initialRegisterHighlightSetting)); + explicitWriteHighlightButton.setText(getHighlightControlText(initialExplicitWriteHighlightSetting)); + explicitReadHighlightButton.setText(getHighlightControlText(initialExplicitReadHighlightSetting)); Color backgroundSetting, foregroundSetting; Font fontSetting; for (int i = 0; i < backgroundSettingPositions.length; i++) { From 105937e4fcdb49296697e96b1ca6b1698b88c388 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 2 Jul 2024 14:51:11 -0400 Subject: [PATCH 090/199] read highlight in data segment --- src/rars/venus/DataSegmentWindow.java | 28 +++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index ea282103..fffeb7c0 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -82,6 +82,7 @@ public class DataSegmentWindow extends JInternalFrame implements Observer { private static final boolean KERNEL_MODE = true; private boolean addressHighlighting = false; + private boolean writingHighlight = false; private boolean asciiDisplay = false; private int addressRow, addressColumn, addressRowFirstAddress; private Settings settings; @@ -118,6 +119,7 @@ public DataSegmentWindow(NumberDisplayBaseChooser[] choosers) { firstAddress = homeAddress; // first address to display at any given time userOrKernelMode = USER_MODE; addressHighlighting = false; + writingHighlight = false; contentPane = this.getContentPane(); tablePanel = new JPanel(new GridLayout(1, 2, 10, 0)); JPanel features = new JPanel(); @@ -855,7 +857,15 @@ public void update(Observable observable, Object obj) { int address = access.getAddress(); // Use the same highlighting technique as for Text Segment -- see // AddressCellRenderer class below. + writingHighlight = true; this.highlightCellForAddress(address); + } else if (access.getAccessType() == AccessNotice.READ) { + int address = access.getAddress(); + // If it's not fetching an instruction, will highlight in data segment the cell corresponding to the address + if (!Memory.inTextSegment(address)) { + writingHighlight = false; //so it is a reading highlight + this.highlightCellForAddress(address); + } } } } @@ -865,7 +875,8 @@ private void updateRowHeight() { return; } Font possibleFonts[] = { - settings.getFontByPosition(Settings.DATASEGMENT_HIGHLIGHT_FONT), + settings.getFontByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_FONT), + settings.getFontByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FONT), settings.getFontByPosition(Settings.EVEN_ROW_FONT), settings.getFontByPosition(Settings.ODD_ROW_FONT), }; @@ -1033,11 +1044,16 @@ public Component getTableCellRendererComponent(JTable table, Object value, cell.setHorizontalAlignment(SwingConstants.RIGHT); int rowFirstAddress = Binary.stringToInt(table.getValueAt(row, ADDRESS_COLUMN).toString()); - if (settings.getBooleanSetting(Settings.Bool.DATA_SEGMENT_HIGHLIGHTING) && addressHighlighting && - rowFirstAddress == addressRowFirstAddress && column == addressColumn) { - cell.setBackground(settings.getColorSettingByPosition(Settings.DATASEGMENT_HIGHLIGHT_BACKGROUND)); - cell.setForeground(settings.getColorSettingByPosition(Settings.DATASEGMENT_HIGHLIGHT_FOREGROUND)); - cell.setFont(settings.getFontByPosition(Settings.DATASEGMENT_HIGHLIGHT_FONT)); + if (settings.getBooleanSetting(Settings.Bool.EXPLICIT_WRITE_HIGHLIGHTING) && addressHighlighting && + rowFirstAddress == addressRowFirstAddress && column == addressColumn && writingHighlight) { + cell.setBackground(settings.getColorSettingByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_BACKGROUND)); + cell.setForeground(settings.getColorSettingByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_FOREGROUND)); + cell.setFont(settings.getFontByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_FONT)); + } else if (settings.getBooleanSetting(Settings.Bool.EXPLICIT_READ_HIGHLIGHTING) && addressHighlighting && + rowFirstAddress == addressRowFirstAddress && column == addressColumn && !writingHighlight) { //not writing highlight means reading highlight + cell.setBackground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_BACKGROUND)); + cell.setForeground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FOREGROUND)); + cell.setFont(settings.getFontByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FONT)); } else if (row % 2 == 0) { cell.setBackground(settings.getColorSettingByPosition(Settings.EVEN_ROW_BACKGROUND)); cell.setForeground(settings.getColorSettingByPosition(Settings.EVEN_ROW_FOREGROUND)); From 38006341cc1133736832f62b96121717c5576621 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 2 Jul 2024 14:52:17 -0400 Subject: [PATCH 091/199] new class to deal with register access notices --- .../venus/registers/RegisterBlockWindow.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/rars/venus/registers/RegisterBlockWindow.java b/src/rars/venus/registers/RegisterBlockWindow.java index 8251d132..eff196a2 100644 --- a/src/rars/venus/registers/RegisterBlockWindow.java +++ b/src/rars/venus/registers/RegisterBlockWindow.java @@ -19,6 +19,7 @@ import javax.swing.table.JTableHeader; import java.awt.*; import java.awt.event.MouseEvent; +import java.util.Arrays; import java.util.Observable; import java.util.Observer; @@ -395,4 +396,49 @@ public String getToolTipText(MouseEvent e) { }; } } + + ////////////////////////////////////////////////////////////// + // + // Contains the access notice linked to each register. + // Each register is represented by the row in which it appears in the register window + // + private class RegistersAccessNotice { + private int[] accessNoticeTypes; + + //Constructor which sets all access notices to none + public RegistersAccessNotice() { + accessNoticeTypes = new int[32]; + Arrays.fill(accessNoticeTypes, -1); + } + + //Adds an access notice linked to a register. Overwrites with a "write" type if there is a reading + //and a writing access notice for the same register, and that both highlighting are enabled + public void add(int row, int type) { + if (0 <= row && row < accessNoticeTypes.length) + if (accessNoticeTypes[row] == -1 || + (accessNoticeTypes[row] == AccessNotice.READ && settings.getBooleanSetting(Settings.Bool.EXPLICIT_WRITE_HIGHLIGHTING))) + accessNoticeTypes[row] = type; + } + + //Clears all register access notice + public void clear() { + Arrays.fill(accessNoticeTypes, -1); + } + + //Returns the access notice type of a register + public int getAccessNoticeType(int row) { + if (0 <= row && row < accessNoticeTypes.length) + return accessNoticeTypes[row]; + else + return -1; + } + + // Returns true iff there is an access notice for a certain register + public boolean contains(int row) { + if (0 <= row && row < accessNoticeTypes.length) { + return accessNoticeTypes[row] != -1; + } else + return false; + } + } } From f0fb563a92c3b6aea9443e7231ce14f3629ba9dd Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 2 Jul 2024 14:56:33 -0400 Subject: [PATCH 092/199] read and write register highlight by step --- .../venus/registers/RegisterBlockWindow.java | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/src/rars/venus/registers/RegisterBlockWindow.java b/src/rars/venus/registers/RegisterBlockWindow.java index eff196a2..0f91f4f6 100644 --- a/src/rars/venus/registers/RegisterBlockWindow.java +++ b/src/rars/venus/registers/RegisterBlockWindow.java @@ -60,7 +60,7 @@ a copy of this software and associated documentation files (the public abstract class RegisterBlockWindow extends JPanel implements Observer { private JTable table; private boolean highlighting; - private int highlightRow; + private RegistersAccessNotice stepAccessNotices; //contains the register access notices for the current step private Register[] registers; private static final int NAME_COLUMN = 0; @@ -74,6 +74,7 @@ public abstract class RegisterBlockWindow extends JPanel implements Observer { * Constructor which sets up a fresh window with a table that contains the register values. **/ public RegisterBlockWindow(Register[] registers, String[] registerDescriptions, String valueTip) { + stepAccessNotices = new RegistersAccessNotice(); Simulator.getInstance().addObserver(this); settings = Globals.getSettings(); settings.addObserver(this); @@ -136,7 +137,7 @@ public void clearHighlighting() { if (table != null) { table.tableChanged(new TableModelEvent(table.getModel())); } - highlightRow = -1; // assure highlight will not occur upon re-assemble. + stepAccessNotices.clear(); } /** @@ -163,14 +164,42 @@ public void updateRegisters() { * @param register Register object corresponding to row to be selected. */ private void highlightCellForRegister(Register register) { - for (int i = 0; i < registers.length; i++) { + /*for (int i = 0; i < registers.length; i++) { if (registers[i] == register) { this.highlightRow = i; table.tableChanged(new TableModelEvent(table.getModel())); return; } } - this.highlightRow = -1; + this.highlightRow = -1;*/ + } + + /** + * Adds the given register to the registers to highlight and updates highlighting + * for the current step + * + * @param register Register object corresponding to row to be selected. + * @param accessType the type of access: Write is 0, Read is 1 as in the AccessNotice + */ + private void addRegisterHighlighting(Register register, int accessType) { + stepAccessNotices.add(getRow(register), accessType); + table.tableChanged(new TableModelEvent(table.getModel())); + } + + /** + * Finds the row that contains the given register + * + * @param register Register object corresponding to a certain row + * @return Index of row that contains the given register, + * or -1 if register not found + */ + private int getRow(Register register) { + for (int i = 0; i < registers.length; i++) { + if (registers[i] == register) { + return i; + } + } + return -1; } /** @@ -203,19 +232,18 @@ public void update(Observable observable, Object obj) { } else if (obj instanceof RegisterAccessNotice) { // NOTE: each register is a separate Observable RegisterAccessNotice access = (RegisterAccessNotice) obj; - if (access.getAccessType() == AccessNotice.WRITE) { // Uses the same highlighting technique as for Text Segment -- see // AddressCellRenderer class in DataSegmentWindow.java. - this.highlighting = true; - this.highlightCellForRegister((Register) observable); - Globals.getGui().getRegistersPane().setSelectedComponent(this); - } + this.highlighting = true; + addRegisterHighlighting((Register) observable, access.getAccessType()); + Globals.getGui().getRegistersPane().setSelectedComponent(this); } } private void updateRowHeight() { Font possibleFonts[] = { - settings.getFontByPosition(Settings.REGISTER_HIGHLIGHT_FONT), + settings.getFontByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_FONT), + settings.getFontByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FONT), settings.getFontByPosition(Settings.EVEN_ROW_FONT), settings.getFontByPosition(Settings.ODD_ROW_FONT), }; @@ -251,10 +279,14 @@ public Component getTableCellRendererComponent(JTable table, Object value, isSelected, hasFocus, row, column); cell.setFont(font); cell.setHorizontalAlignment(alignment); - if (settings.getBooleanSetting(Settings.Bool.REGISTERS_HIGHLIGHTING) && highlighting && row == highlightRow) { - cell.setBackground(settings.getColorSettingByPosition(Settings.REGISTER_HIGHLIGHT_BACKGROUND)); - cell.setForeground(settings.getColorSettingByPosition(Settings.REGISTER_HIGHLIGHT_FOREGROUND)); - cell.setFont(settings.getFontByPosition(Settings.REGISTER_HIGHLIGHT_FONT)); + if (highlighting && stepAccessNotices.contains(row) && settings.getBooleanSetting(Settings.Bool.EXPLICIT_WRITE_HIGHLIGHTING) && stepAccessNotices.getAccessNoticeType(row) == AccessNotice.WRITE) { + cell.setBackground(settings.getColorSettingByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_BACKGROUND)); + cell.setForeground(settings.getColorSettingByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_FOREGROUND)); + cell.setFont(settings.getFontByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_FONT)); + } else if (highlighting && stepAccessNotices.contains(row) && settings.getBooleanSetting(Settings.Bool.EXPLICIT_READ_HIGHLIGHTING) && stepAccessNotices.getAccessNoticeType(row) == AccessNotice.READ) { + cell.setBackground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_BACKGROUND)); + cell.setForeground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FOREGROUND)); + cell.setFont(settings.getFontByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FONT)); } else if (row % 2 == 0) { cell.setBackground(settings.getColorSettingByPosition(Settings.EVEN_ROW_BACKGROUND)); cell.setForeground(settings.getColorSettingByPosition(Settings.EVEN_ROW_FOREGROUND)); From 261a2cb0057c582296e16cba7fab0d7e12c21394 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 2 Jul 2024 14:58:30 -0400 Subject: [PATCH 093/199] clear step highlight after step --- src/rars/venus/run/RunBackstepAction.java | 5 +++++ src/rars/venus/run/RunGoAction.java | 3 +++ src/rars/venus/run/RunResetAction.java | 7 +++---- src/rars/venus/run/RunStepAction.java | 3 +++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/rars/venus/run/RunBackstepAction.java b/src/rars/venus/run/RunBackstepAction.java index 0f6e63fd..f89f369f 100644 --- a/src/rars/venus/run/RunBackstepAction.java +++ b/src/rars/venus/run/RunBackstepAction.java @@ -84,7 +84,12 @@ public void actionPerformed(ActionEvent e) { executePane.getFloatingPointWindow().updateRegisters(); executePane.getControlAndStatusWindow().updateRegisters(); executePane.getDataSegmentWindow().updateValues(); + executePane.getRegistersWindow().clearHighlighting(); + executePane.getFloatingPointWindow().clearHighlighting(); + executePane.getControlAndStatusWindow().clearHighlighting(); + executePane.getDataSegmentWindow().clearHighlighting(); executePane.getTextSegmentWindow().highlightStepAtPC(); // Argument aded 25 June 2007 + Globals.getGui().getRegistersPane().setSelectedComponent(executePane.getRegistersWindow()); FileStatus.set(FileStatus.RUNNABLE); // if we've backed all the way, disable the button // if (Globals.program.getBackStepper().empty()) { diff --git a/src/rars/venus/run/RunGoAction.java b/src/rars/venus/run/RunGoAction.java index d4c152dc..d235339b 100644 --- a/src/rars/venus/run/RunGoAction.java +++ b/src/rars/venus/run/RunGoAction.java @@ -83,6 +83,9 @@ public void actionPerformed(ActionEvent e) { mainUI.getMessagesPane().selectRunMessageTab(); executePane.getTextSegmentWindow().setCodeHighlighting(false); executePane.getTextSegmentWindow().unhighlightAllSteps(); + //clears highlight of registers and data segment if the run step was used before + executePane.getRegistersWindow().clearHighlighting(); + executePane.getDataSegmentWindow().clearHighlighting(); //FileStatus.set(FileStatus.RUNNING); mainUI.setMenuState(FileStatus.RUNNING); diff --git a/src/rars/venus/run/RunResetAction.java b/src/rars/venus/run/RunResetAction.java index 4659bf69..1a2bed6c 100644 --- a/src/rars/venus/run/RunResetAction.java +++ b/src/rars/venus/run/RunResetAction.java @@ -83,13 +83,12 @@ public void actionPerformed(ActionEvent e) { FloatingPointRegisterFile.resetRegisters(); ControlAndStatusRegisterFile.resetRegisters(); InterruptController.reset(); - - executePane.getRegistersWindow().clearHighlighting(); executePane.getRegistersWindow().updateRegisters(); - executePane.getFloatingPointWindow().clearHighlighting(); + executePane.getRegistersWindow().clearHighlighting(); executePane.getFloatingPointWindow().updateRegisters(); - executePane.getControlAndStatusWindow().clearHighlighting(); + executePane.getFloatingPointWindow().clearHighlighting(); executePane.getControlAndStatusWindow().updateRegisters(); + executePane.getControlAndStatusWindow().clearHighlighting(); executePane.getDataSegmentWindow().highlightCellForAddress(Memory.dataBaseAddress); executePane.getDataSegmentWindow().clearHighlighting(); executePane.getTextSegmentWindow().resetModifiedSourceCode(); diff --git a/src/rars/venus/run/RunStepAction.java b/src/rars/venus/run/RunStepAction.java index 96b86bae..6363eb64 100644 --- a/src/rars/venus/run/RunStepAction.java +++ b/src/rars/venus/run/RunStepAction.java @@ -86,6 +86,8 @@ public void update(Observable o, Object simulator) { } }; Simulator.getInstance().addObserver(stopListener); + executePane.getRegistersWindow().clearHighlighting(); //clears highlight of previous step + executePane.getDataSegmentWindow().clearHighlighting(); Globals.program.startSimulation(1, null); } else { @@ -108,6 +110,7 @@ public void stepped(boolean done, Simulator.Reason reason, SimulationException p if (done) { RunGoAction.resetMaxSteps(); executePane.getTextSegmentWindow().unhighlightAllSteps(); + executePane.getTextSegmentWindow().setCodeHighlighting(false); FileStatus.set(FileStatus.TERMINATED); } if (done && pe == null) { From 01d30a0a60b477cac03c71b72279974f09b56b45 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 2 Jul 2024 15:46:32 -0400 Subject: [PATCH 094/199] dont notify sp and gp when implicit reading --- src/rars/riscv/hardware/RegisterBlock.java | 10 ++++++++++ src/rars/riscv/hardware/RegisterFile.java | 11 +++++++++++ src/rars/venus/DataSegmentWindow.java | 4 ++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/rars/riscv/hardware/RegisterBlock.java b/src/rars/riscv/hardware/RegisterBlock.java index 8566867b..b0644406 100644 --- a/src/rars/riscv/hardware/RegisterBlock.java +++ b/src/rars/riscv/hardware/RegisterBlock.java @@ -91,6 +91,16 @@ public long getValue(int num) { return getRegister(num).getValue(); } + /** + * Returns the value of the register. Observers are not notified. + * + * @param num The register's number. + * @return value The value of the given register. + */ + public long getValueNoNotify(int num) { + return getRegister(num).getValueNoNotify(); + } + /** * Returns the value of the register. * diff --git a/src/rars/riscv/hardware/RegisterFile.java b/src/rars/riscv/hardware/RegisterFile.java index 41c02640..d40b52c3 100644 --- a/src/rars/riscv/hardware/RegisterFile.java +++ b/src/rars/riscv/hardware/RegisterFile.java @@ -110,6 +110,17 @@ public static int getValue(int num) { } + /** + * Returns the value of the register. Observers are not notified. + * + * @param num The register's number. + * @return value The value of the given register. + */ + public static int getValueNoNotify(int num) { + return (int) instance.getValueNoNotify(num); + + } + /** * Returns the value of the register. * diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index fffeb7c0..402d3da4 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -413,7 +413,7 @@ private int getBaseAddressIndexForAddress(int address) { desiredComboBoxIndex = EXTERN_BASE_ADDRESS_INDEX; } // Check distance from global pointer; can be either side of it... - thisDistance = Math.abs(address - RegisterFile.getValue(RegisterFile.GLOBAL_POINTER_REGISTER)); // distance from global pointer + thisDistance = Math.abs(address - RegisterFile.getValueNoNotify(RegisterFile.GLOBAL_POINTER_REGISTER)); // distance from global pointer if (thisDistance < shortDistance) { shortDistance = thisDistance; desiredComboBoxIndex = GLOBAL_POINTER_ADDRESS_INDEX; @@ -431,7 +431,7 @@ private int getBaseAddressIndexForAddress(int address) { desiredComboBoxIndex = HEAP_BASE_ADDRESS_INDEX; } // Check distance from stack pointer. Can be on either side of it... - thisDistance = Math.abs(address - RegisterFile.getValue(RegisterFile.STACK_POINTER_REGISTER)); + thisDistance = Math.abs(address - RegisterFile.getValueNoNotify(RegisterFile.STACK_POINTER_REGISTER)); if (thisDistance < shortDistance) { shortDistance = thisDistance; desiredComboBoxIndex = STACK_POINTER_BASE_ADDRESS_INDEX; From 56d3fc1efbdfb58e321615ceb2ff6d5f59c5e66b Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 3 Jul 2024 11:54:46 -0400 Subject: [PATCH 095/199] updated setting file --- src/Settings.properties | 12 ++++++------ src/rars/Settings.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Settings.properties b/src/Settings.properties index 3b0a023a..197de2e9 100644 --- a/src/Settings.properties +++ b/src/Settings.properties @@ -3,7 +3,7 @@ AssembleAll = false AssembleOnOpen = false BareMachine = false -DataSegmentHighlighting = true +ExplicitWriteHighlighting = true DelayedBranching = false DisplayAddressesInHex = true DisplayValuesInHex = true @@ -13,7 +13,7 @@ ExtendedAssembler = true LabelWindowVisibility = false LoadExceptionHandler = false ProgramArguments = false -RegistersHighlighting = true +ExplicitReadHighlighting = true StartAtMain = false WarningsAreErrors = false PopupInstructionGuidance = true @@ -26,8 +26,8 @@ TextSegmentHighlightBackground = 0x00ffff99 TextSegmentHighlightForeground = 0 TextSegmentDelaySlotHighlightBackground = 0x33ff00 TextSegmentDelaySlotHighlightForeground = 0 -DataSegmentHighlightBackground = 0x0099ccff -DataSegmentHighlightForeground = 0 -RegisterHighlightBackground = 0x0099cc55 -RegisterHighlightForeground = 0 +ExplicitWriteHighlightBackground = 0x00ff8080 +ExplicitWriteHighlightForeground = 0 +ExplicitReadHighlightBackground = 0x0099ccff +ExplicitReadHighlightForeground = 0 DeriveCurrentDirectory = false diff --git a/src/rars/Settings.java b/src/rars/Settings.java index 8461fa0b..dd722c5a 100644 --- a/src/rars/Settings.java +++ b/src/rars/Settings.java @@ -372,7 +372,7 @@ public enum ColorMode { "TextSegmentHighlightBackground", "TextSegmentHighlightForeground", "TextSegmentDelaySlotHighlightBackground", "TextSegmentDelaySlotHighlightForeground", "ExplicitWriteHighlightBackground", "ExplicitWriteHighlightForeground", - "ExplicitReadHighlightBackground", "ExplicitReadRegisterHighlightForeground", + "ExplicitReadHighlightBackground", "ExplicitReadHighlightForeground", "EditorBackground", "EditorForeground", "EditorLineHighlight", "EditorSelection", "EditorCaretColor"}; /** * Last resort default values for color settings; From cd2205efc488e153ac430614cf5a8dc4472d1038 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 3 Jul 2024 13:31:36 -0400 Subject: [PATCH 096/199] default file with .s extension --- src/rars/venus/Editor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rars/venus/Editor.java b/src/rars/venus/Editor.java index 371cd599..4dbc8290 100644 --- a/src/rars/venus/Editor.java +++ b/src/rars/venus/Editor.java @@ -149,11 +149,11 @@ void setCurrentSaveDirectory(String currentSaveDirectory) { /** * Generates a default file name * - * @return returns string mipsN.asm, where N is 1,2,3,... + * @return returns string mipsN.s, where N is 1,2,3,... */ public String getNextDefaultFilename() { newUsageCount++; - return "riscv" + newUsageCount + ".asm"; + return "riscv" + newUsageCount + ".s"; } From 03bafbca9f4cf2ca4094aaf67c74d7ba4bff2724 Mon Sep 17 00:00:00 2001 From: Hugo Leblanc Date: Thu, 4 Jul 2024 11:00:28 -0400 Subject: [PATCH 097/199] Fix #27 - Change service to get initial screen size Toolkit.getDefaultToolkit().getScreenSize() is not especially aware of High DPI screen of the size of usable real-estate. Replaced it with GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds() to have usable values for the first layout generation. --- src/rars/venus/VenusUI.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index a4046cc2..80d28b9a 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -52,10 +52,10 @@ a copy of this software and associated documentation files (the * @author Sanderson and Team JSpim **/ - /* Heavily modified by Pete Sanderson, July 2004, to incorporate JSPIMMenu and JSPIMToolbar - * not as subclasses of JMenuBar and JToolBar, but as instances of them. They are both - * here primarily so both can share the Action objects. - */ +/* Heavily modified by Pete Sanderson, July 2004, to incorporate JSPIMMenu and JSPIMToolbar + * not as subclasses of JMenuBar and JToolBar, but as instances of them. They are both + * here primarily so both can share the Action objects. + */ public class VenusUI extends JFrame { VenusUI mainUI; @@ -126,9 +126,9 @@ public VenusUI(String name, ArrayList paths) { mainUI = this; Globals.setGui(this); this.editor = new Editor(this); - - double screenWidth = Toolkit.getDefaultToolkit().getScreenSize().getWidth(); - double screenHeight = Toolkit.getDefaultToolkit().getScreenSize().getHeight(); + Rectangle maximumWindowBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); + double screenWidth = maximumWindowBounds.getWidth(); + double screenHeight = maximumWindowBounds.getHeight(); // basically give up some screen space if running at 800 x 600 double messageWidthPct = (screenWidth < 1000.0) ? 0.67 : 0.73; double messageHeightPct = (screenWidth < 1000.0) ? 0.12 : 0.15; From 956e934def45cd9bb52db32dac79b3324a6290a5 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 4 Jul 2024 15:25:54 -0400 Subject: [PATCH 098/199] indentation correction and deletion of unused method --- src/rars/venus/DataSegmentWindow.java | 6 +++--- .../venus/registers/RegisterBlockWindow.java | 16 ---------------- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index 402d3da4..1f2b23b4 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -1051,9 +1051,9 @@ public Component getTableCellRendererComponent(JTable table, Object value, cell.setFont(settings.getFontByPosition(Settings.EXPLICIT_WRITE_HIGHLIGHT_FONT)); } else if (settings.getBooleanSetting(Settings.Bool.EXPLICIT_READ_HIGHLIGHTING) && addressHighlighting && rowFirstAddress == addressRowFirstAddress && column == addressColumn && !writingHighlight) { //not writing highlight means reading highlight - cell.setBackground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_BACKGROUND)); - cell.setForeground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FOREGROUND)); - cell.setFont(settings.getFontByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FONT)); + cell.setBackground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_BACKGROUND)); + cell.setForeground(settings.getColorSettingByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FOREGROUND)); + cell.setFont(settings.getFontByPosition(Settings.EXPLICIT_READ_HIGHLIGHT_FONT)); } else if (row % 2 == 0) { cell.setBackground(settings.getColorSettingByPosition(Settings.EVEN_ROW_BACKGROUND)); cell.setForeground(settings.getColorSettingByPosition(Settings.EVEN_ROW_FOREGROUND)); diff --git a/src/rars/venus/registers/RegisterBlockWindow.java b/src/rars/venus/registers/RegisterBlockWindow.java index 0f91f4f6..697ad9c5 100644 --- a/src/rars/venus/registers/RegisterBlockWindow.java +++ b/src/rars/venus/registers/RegisterBlockWindow.java @@ -158,22 +158,6 @@ public void updateRegisters() { } } - /** - * Highlight the row corresponding to the given register. - * - * @param register Register object corresponding to row to be selected. - */ - private void highlightCellForRegister(Register register) { - /*for (int i = 0; i < registers.length; i++) { - if (registers[i] == register) { - this.highlightRow = i; - table.tableChanged(new TableModelEvent(table.getModel())); - return; - } - } - this.highlightRow = -1;*/ - } - /** * Adds the given register to the registers to highlight and updates highlighting * for the current step From 4b84f962219f2f1865f7c235a5adad55e6a0677e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 4 Jul 2024 16:17:55 -0400 Subject: [PATCH 099/199] SystemIO readChar don't use magic number --- src/rars/riscv/syscalls/SyscallReadChar.java | 4 ++-- src/rars/util/SystemIO.java | 14 ++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallReadChar.java b/src/rars/riscv/syscalls/SyscallReadChar.java index ced65f30..96ef5bf0 100644 --- a/src/rars/riscv/syscalls/SyscallReadChar.java +++ b/src/rars/riscv/syscalls/SyscallReadChar.java @@ -41,9 +41,9 @@ public SyscallReadChar() { public void simulate(ProgramStatement statement) throws ExitingException { int character = SystemIO.readChar(this.getNumber()); - if (character == -2) { + if (character == SystemIO.NOTASCII) { throw new ExitingException(statement, - "invalid char input (syscall " + this.getNumber() + ")"); + "invalid or non printable ASCII input (syscall " + this.getNumber() + ")"); } RegisterFile.updateRegister("a0", character); } diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 7809da26..fa9763b5 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -76,6 +76,12 @@ public class SystemIO { private static final int STDOUT = 1; private static final int STDERR = 2; + // special result of readChar + /** End of stream reached */ + public static final int EOF = -1; + /** the character is not a printable ASCII */ + public static final int NOTASCII = -2; + /** * Implements syscall to read an integer value. * Client is responsible for catching NumberFormatException. @@ -185,7 +191,7 @@ public static String readString(int serviceNumber, int maxLength) { * Only printable characters are accepted (9, 10, and 32 to 126). * * @param serviceNumber the number assigned to Read Char syscall (default 12) - * @return int value with lowest byte corresponding to user input, -1 on EOF, or -2 on invalid ASCII character. + * @return int value with lowest byte corresponding to user input, EOF on end of data, or NOTASCII on invalid ASCII character. */ public static int readChar(int serviceNumber) { int returnValue; @@ -196,7 +202,7 @@ public static int readChar(int serviceNumber) { if (input.length()>0) returnValue = input.getBytes(StandardCharsets.UTF_8) [0] & 0xFF; // truncate else - returnValue = -1; // assume EOF on empty string + returnValue = EOF; // assume EOF on empty string } else { // Otherwise delegate to the Read syscall byte[] input = new byte[1]; @@ -204,11 +210,11 @@ public static int readChar(int serviceNumber) { if (len>0) returnValue = input[0] & 0xFF; else - returnValue = -1; + returnValue = EOF; } if ((returnValue < 32 || returnValue >= 127) && returnValue != -1 && returnValue != '\n' && returnValue != '\t') { - return -2; + return NOTASCII; } return returnValue; From 91f9ccf0b592d2df1608e003c6fb36ece575aec5 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 5 Jul 2024 19:59:57 -0400 Subject: [PATCH 100/199] move program arguments to the message panel. close #31 # Conflicts: # src/rars/Settings.java --- src/rars/Settings.java | 4 --- src/rars/venus/MessagesPane.java | 31 ++++++++++++++++++++++ src/rars/venus/TextSegmentWindow.java | 38 --------------------------- src/rars/venus/VenusUI.java | 18 ++----------- src/rars/venus/run/RunGoAction.java | 18 +------------ src/rars/venus/run/RunStepAction.java | 16 +---------- 6 files changed, 35 insertions(+), 90 deletions(-) diff --git a/src/rars/Settings.java b/src/rars/Settings.java index 6c8501c9..084bfe0b 100644 --- a/src/rars/Settings.java +++ b/src/rars/Settings.java @@ -109,10 +109,6 @@ public enum Bool { * Flag to determine whether or not assembler warnings are considered errors. */ WARNINGS_ARE_ERRORS("WarningsAreErrors", false), - /** - * Flag to determine whether or not to display and use program arguments - */ - PROGRAM_ARGUMENTS("ProgramArguments", false), /** * Flag to control whether or not highlighting is applied when explicit writing */ diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index d1fda3b5..cf73bf72 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -3,6 +3,7 @@ import rars.ErrorList; import rars.Globals; import rars.Settings; +import rars.simulator.ProgramArgumentList; import rars.simulator.Simulator; import javax.swing.*; @@ -60,6 +61,7 @@ public class MessagesPane extends JPanel { private final JRadioButton buttonBatch; private final JButton inputTabClearButton; private final Box runioContent; + private final JTextArea programArguments; private JTabbedPane leftPane; private JSplitPane batchTab; JTextArea assemble, run, input, output; @@ -85,6 +87,7 @@ public MessagesPane() { run = new JTextArea(); input = new JTextArea(); output = new JTextArea(); + programArguments = new JTextArea(); assemble.setEditable(false); run.setEditable(false); input.setEditable(true); @@ -98,6 +101,8 @@ public MessagesPane() { run.setFont(monoFont); input.setFont(monoFont); output.setFont(monoFont); + programArguments.setFont(monoFont); + programArguments.getDocument().putProperty("filterNewlines", Boolean.TRUE); // single line JButton assembleTabClearButton = new JButton("Clear"); assembleTabClearButton.setToolTipText("Clear the Messages area"); @@ -249,12 +254,28 @@ public void actionPerformed(ActionEvent e) { runioTab.add(runioContent); updateIOTab(); + /* The program argument tab */ + JButton programArgumentsClearButton = new JButton("Clear"); + programArgumentsClearButton.setToolTipText("Clear the program arguments"); + programArgumentsClearButton.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e) { + programArguments.setText(""); + } + }); + JPanel programArgumentsPanel = new JPanel(new BorderLayout()); + programArgumentsPanel.add(createBoxForButton(programArgumentsClearButton), BorderLayout.WEST); + programArgumentsPanel.add(new JScrollPane(programArguments, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); + leftPane.addTab("Messages", assembleTab); leftPane.addTab("Run I/O", runioTab); + leftPane.addTab("Program Arguments", programArgumentsPanel); leftPane.setForeground(Color.BLACK); leftPane.setToolTipTextAt(0, "Messages produced by Run menu. Click on assemble error message to select erroneous line"); leftPane.setToolTipTextAt(1, "Simulated console input (used while running) and other run messages"); + leftPane.setToolTipTextAt(2, "Arguments provided to program at runtime via a0 (argc) and a1 (argv)"); this.setLayout(new BorderLayout()); this.add(leftPane); @@ -469,6 +490,16 @@ public void selectRunMessageTab() { leftPane.setSelectedComponent(runioTab); } + /** + * Method to store any program arguments into memory and registers before + * execution begins. Arguments go into the gap between $sp and kernel memory. + * Argument pointers and count go into runtime stack and $sp is adjusted accordingly. + * $a0 gets argument count (argc), $a1 gets stack address of first arg pointer (argv). + */ + public void processProgramArgumentsIfAny() { + new ProgramArgumentList(programArguments.getText()).storeProgramArguments(); + } + /** * Method used by the SystemIO class to get interactive user input * requested by a running MIPS program (e.g. syscall #5 to read an diff --git a/src/rars/venus/TextSegmentWindow.java b/src/rars/venus/TextSegmentWindow.java index b46e5b11..f4676b5d 100644 --- a/src/rars/venus/TextSegmentWindow.java +++ b/src/rars/venus/TextSegmentWindow.java @@ -50,9 +50,6 @@ a copy of this software and associated documentation files (the **/ public class TextSegmentWindow extends JInternalFrame implements Observer { - private JPanel programArgumentsPanel; // DPS 17-July-2008 - private JTextField programArgumentsTextField; // DPS 17-July-2008 - private static final int PROGRAM_ARGUMENT_TEXTFIELD_COLUMNS = 40; private JTable table; private JScrollPane tableScroller; private Object[][] data; @@ -96,11 +93,6 @@ public TextSegmentWindow() { contentPane = this.getContentPane(); codeHighlighting = true; breakpointsEnabled = true; - programArgumentsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); - programArgumentsPanel.add(new JLabel("Program Arguments: ")); - programArgumentsTextField = new JTextField(PROGRAM_ARGUMENT_TEXTFIELD_COLUMNS); - programArgumentsTextField.setToolTipText("Arguments provided to program at runtime via a0 (argc) and a1 (argv)"); - programArgumentsPanel.add(programArgumentsTextField); } @@ -177,9 +169,6 @@ public void setupTable() { tableScroller = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); contentPane.add(tableScroller); - if (Globals.getSettings().getBooleanSetting(Settings.Bool.PROGRAM_ARGUMENTS)) { - addProgramArgumentsPanel(); - } setColumnMaxWidth(table.getColumnModel().getColumn(BREAK_COLUMN), columnNames[0]); setColumnMaxWidth(table.getColumnModel().getColumn(ADDRESS_COLUMN), "0x00000000"); @@ -203,33 +192,6 @@ public void setColumnMaxWidth(TableColumn column, String referenceText) { column.setMaxWidth(width); column.setPreferredWidth(width); } - //////////// Support for program arguments added DPS 17-July-2008 ////////////// - - /** - * Get program arguments from text field in south border of text segment window. - * - * @return String containing program arguments - */ - public String getProgramArguments() { - return programArgumentsTextField.getText(); - } - - public void addProgramArgumentsPanel() { - // Don't add it if text segment window blank (file closed or no assemble yet) - if (contentPane != null && contentPane.getComponentCount() > 0) { - contentPane.add(programArgumentsPanel, BorderLayout.NORTH); - contentPane.validate(); - } - } - - public void removeProgramArgumentsPanel() { - if (contentPane != null) { - contentPane.remove(programArgumentsPanel); - contentPane.validate(); - } - } - // - ///////////////////////// end program arguments section //////////////////////// /** * remove all components diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index 80d28b9a..782048c1 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -85,7 +85,7 @@ public class VenusUI extends JFrame { private JMenuItem runGo, runStep, runBackstep, runReset, runAssemble, runStop, runPause, runClearBreakpoints, runToggleBreakpoints; private JCheckBoxMenuItem settingsLabel, settingsValueDisplayBase, settingsAddressDisplayBase, settingsExtended, settingsAssembleOnOpen, settingsAssembleAll, settingsAssembleOpen, settingsWarningsAreErrors, - settingsStartAtMain, settingsProgramArguments, settingsSelfModifyingCode, settingsRV64, settingsDeriveCurrentWorkingDirectory; + settingsStartAtMain, settingsSelfModifyingCode, settingsRV64, settingsDeriveCurrentWorkingDirectory; private JMenuItem settingsExceptionHandler, settingsEditor, settingsHighlighting, settingsMemoryConfiguration; private JMenuItem helpHelp, helpAbout; @@ -108,7 +108,7 @@ public class VenusUI extends JFrame { runStopAction, runPauseAction, runClearBreakpointsAction, runToggleBreakpointsAction; private Action settingsLabelAction, settingsValueDisplayBaseAction, settingsAddressDisplayBaseAction, settingsExtendedAction, settingsAssembleOnOpenAction, settingsAssembleOpenAction, settingsAssembleAllAction, - settingsWarningsAreErrorsAction, settingsStartAtMainAction, settingsProgramArgumentsAction, + settingsWarningsAreErrorsAction, settingsStartAtMainAction, settingsExceptionHandlerAction, settingsEditorAction, settingsHighlightingAction, settingsMemoryConfigurationAction, settingsSelfModifyingCodeAction, settingsRV64Action, settingsDeriveCurrentWorkingDirectoryAction; private Action helpHelpAction, helpAboutAction; @@ -444,17 +444,6 @@ public void handler(boolean isHex) { settingsStartAtMainAction = new SettingsAction("Initialize Program Counter to global 'main' if defined", "If set, assembler will initialize Program Counter to text address globally labeled 'main', if defined.", Settings.Bool.START_AT_MAIN); - settingsProgramArgumentsAction = new SettingsAction("Program arguments provided to program", - "If set, program arguments for the program can be entered in border of Text Segment window.", - Settings.Bool.PROGRAM_ARGUMENTS) { - public void handler(boolean selected) { - if (selected) { - mainPane.getExecutePane().getTextSegmentWindow().addProgramArgumentsPanel(); - } else { - mainPane.getExecutePane().getTextSegmentWindow().removeProgramArgumentsPanel(); - } - } - }; settingsSelfModifyingCodeAction = new SettingsAction("Self-modifying code", "If set, the program can write and branch to both text and data segments.", Settings.Bool.SELF_MODIFYING_CODE_ENABLED); @@ -636,15 +625,12 @@ private JMenuBar setUpMenuBar() { settingsWarningsAreErrors.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.WARNINGS_ARE_ERRORS)); settingsStartAtMain = new JCheckBoxMenuItem(settingsStartAtMainAction); settingsStartAtMain.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.START_AT_MAIN)); - settingsProgramArguments = new JCheckBoxMenuItem(settingsProgramArgumentsAction); - settingsProgramArguments.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.PROGRAM_ARGUMENTS)); settingsEditor = new JMenuItem(settingsEditorAction); settingsHighlighting = new JMenuItem(settingsHighlightingAction); settingsExceptionHandler = new JMenuItem(settingsExceptionHandlerAction); settingsMemoryConfiguration = new JMenuItem(settingsMemoryConfigurationAction); settings.add(settingsLabel); - settings.add(settingsProgramArguments); settings.add(settingsAddressDisplayBase); settings.add(settingsValueDisplayBase); settings.addSeparator(); diff --git a/src/rars/venus/run/RunGoAction.java b/src/rars/venus/run/RunGoAction.java index 08fa1041..7aa58a67 100644 --- a/src/rars/venus/run/RunGoAction.java +++ b/src/rars/venus/run/RunGoAction.java @@ -72,7 +72,7 @@ public void actionPerformed(ActionEvent e) { executePane = mainUI.getMainPane().getExecutePane(); if (FileStatus.isAssembled()) { if (!mainUI.getStarted()) { - processProgramArgumentsIfAny(); // DPS 17-July-2008 + mainUI.getMessagesPane().processProgramArgumentsIfAny(); // DPS 17-July-2008 } if (mainUI.getReset() || mainUI.getStarted()) { @@ -217,20 +217,4 @@ public void stopped(SimulationException pe, Simulator.Reason reason) { public static void resetMaxSteps() { maxSteps = defaultMaxSteps; } - - //////////////////////////////////////////////////////////////////////////////////// - // Method to store any program arguments into MIPS memory and registers before - // execution begins. Arguments go into the gap between $sp and kernel memory. - // Argument pointers and count go into runtime stack and $sp is adjusted accordingly. - // $a0 gets argument count (argc), $a1 gets stack address of first arg pointer (argv). - private void processProgramArgumentsIfAny() { - String programArguments = executePane.getTextSegmentWindow().getProgramArguments(); - if (programArguments == null || programArguments.length() == 0 || - !Globals.getSettings().getBooleanSetting(Settings.Bool.PROGRAM_ARGUMENTS)) { - return; - } - new ProgramArgumentList(programArguments).storeProgramArguments(); - } - - } \ No newline at end of file diff --git a/src/rars/venus/run/RunStepAction.java b/src/rars/venus/run/RunStepAction.java index 06c29fa7..2166d1b3 100644 --- a/src/rars/venus/run/RunStepAction.java +++ b/src/rars/venus/run/RunStepAction.java @@ -69,7 +69,7 @@ public void actionPerformed(ActionEvent e) { executePane = mainUI.getMainPane().getExecutePane(); if (FileStatus.isAssembled()) { if (!mainUI.getStarted()) { // DPS 17-July-2008 - processProgramArgumentsIfAny(); + mainUI.getMessagesPane().processProgramArgumentsIfAny(); } mainUI.setStarted(true); mainUI.getMessagesPane().selectRunMessageTab(); @@ -137,18 +137,4 @@ public void stepped(boolean done, Simulator.Reason reason, SimulationException p } mainUI.setReset(false); } - - //////////////////////////////////////////////////////////////////////////////////// - // Method to store any program arguments into MIPS memory and registers before - // execution begins. Arguments go into the gap between $sp and kernel memory. - // Argument pointers and count go into runtime stack and $sp is adjusted accordingly. - // $a0 gets argument count (argc), $a1 gets stack address of first arg pointer (argv). - private void processProgramArgumentsIfAny() { - String programArguments = executePane.getTextSegmentWindow().getProgramArguments(); - if (programArguments == null || programArguments.length() == 0 || - !Globals.getSettings().getBooleanSetting(Settings.Bool.PROGRAM_ARGUMENTS)) { - return; - } - new ProgramArgumentList(programArguments).storeProgramArguments(); - } } \ No newline at end of file From 13212dd30c4430bd97064079fe9ea581da28d4c1 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jul 2024 14:39:29 -0400 Subject: [PATCH 101/199] remove deprecated feature: `new Integer` --- src/rars/venus/NumberDisplayBaseChooser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rars/venus/NumberDisplayBaseChooser.java b/src/rars/venus/NumberDisplayBaseChooser.java index eb77c907..321e2e2a 100644 --- a/src/rars/venus/NumberDisplayBaseChooser.java +++ b/src/rars/venus/NumberDisplayBaseChooser.java @@ -218,7 +218,7 @@ public String formatNumber(int value) { if (base == NumberDisplayBaseChooser.HEXADECIMAL) { return Binary.intToHexString(value); } else { - return new Integer(value).toString(); + return Integer.toString(value); } } From 574929bda8e3e5bc44a9633ef06527d36aa3fd5e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 8 Jul 2024 14:07:59 -0400 Subject: [PATCH 102/199] try basic support for maven --- .github/workflows/maven.yml | 28 ++++++++++++++++ pom.xml | 67 +++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 .github/workflows/maven.yml create mode 100644 pom.xml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 00000000..e80ab366 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,28 @@ +name: gradle +on: + push: + braches: + - master + pull_request: + braches: + - master + +jobs: + gradle: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'zulu' + cache: maven + - name: Build with Maven + run: mvn --batch-mode --update-snapshots verify + - run: mkdir staging && cp target/*.jar staging + - uses: actions/upload-artifact@v4 + with: + name: Package + path: staging diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..ec10750a --- /dev/null +++ b/pom.xml @@ -0,0 +1,67 @@ + + 4.0.0 + rars + rars + 1.6-git + jar + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + + com.formdev + flatlaf + 3.4.1 + runtime + + + + src + + + src + true + + **/*.java + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + jar-with-dependencies + + + + rars.Launch + + + + + + assemble-all + package + + single + + + + + + + + 8 + 8 + 8 + UTF-8 + + From a5d1976f9164bea95e5edc22590acd87a745984d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 8 Jul 2024 15:19:46 -0400 Subject: [PATCH 103/199] test.sh return non 0 on errors --- test.sh | 2 ++ test/Test.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/test.sh b/test.sh index fe1fd0cd..2b52fd61 100755 --- a/test.sh +++ b/test.sh @@ -1,4 +1,6 @@ #!/bin/bash javac -cp rars.jar test/Test.java java -cp test:rars.jar Test +err=$? rm test/Test.class +exit "$err" diff --git a/test/Test.java b/test/Test.java index 8f33ec53..57a36c7d 100644 --- a/test/Test.java +++ b/test/Test.java @@ -73,6 +73,9 @@ public static void main(String[] args){ System.out.println(total); checkBinary(); checkPsuedo(); + if (total.length()>1) { + System.exit(1); + } } public static String run(String path, Program p){ int[] errorlines = null; From 5a3206ccce8470828d9473975b6df485bfb48cc1 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 8 Jul 2024 15:24:51 -0400 Subject: [PATCH 104/199] tests accept self modifying code. Fix #13 --- test/Test.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Test.java b/test/Test.java index 57a36c7d..bacfa32f 100644 --- a/test/Test.java +++ b/test/Test.java @@ -17,6 +17,7 @@ public static void main(String[] args){ Options opt = new Options(); opt.startAtMain = true; opt.maxSteps = 1000; + opt.selfModifyingCode = true; Program p = new Program(opt); File[] tests = new File("./test").listFiles(), riscv_tests = new File("./test/riscv-tests").listFiles(), riscv_tests_64 = new File("./test/riscv-tests-64").listFiles(); if(tests == null){ From 280b3d2ff2b55253a027e07486ef7b272a75b883 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 8 Jul 2024 17:37:24 -0400 Subject: [PATCH 105/199] tests: add success flag --- test/Test.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/Test.java b/test/Test.java index bacfa32f..0f0628d7 100644 --- a/test/Test.java +++ b/test/Test.java @@ -9,7 +9,15 @@ import java.util.Iterator; public class Test { + boolean success = true; + public static void main(String[] args){ + Test self = new Test(); + self.checkBinary(); + self.checkPsuedo(); + if (!self.success) { + System.exit(1); + } Globals.initialize(); Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,false); InstructionSet.rv64 = false; @@ -72,11 +80,6 @@ public static void main(String[] args){ } } System.out.println(total); - checkBinary(); - checkPsuedo(); - if (total.length()>1) { - System.exit(1); - } } public static String run(String path, Program p){ int[] errorlines = null; @@ -149,7 +152,7 @@ public static String run(String path, Program p){ } } - public static void checkBinary(){ + public void checkBinary(){ Options opt = new Options(); opt.startAtMain = true; opt.maxSteps = 500; @@ -232,7 +235,8 @@ public static void checkBinary(){ } } } - public static void checkPsuedo(){ + + public void checkPsuedo(){ Options opt = new Options(); opt.startAtMain = true; opt.maxSteps = 500; From b8db17f69b85da157703504fd05bbb2a498ea9d3 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 8 Jul 2024 17:37:49 -0400 Subject: [PATCH 106/199] tests: factorise tests in directories --- test/Test.java | 62 +++++++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/test/Test.java b/test/Test.java index 0f0628d7..b712f75d 100644 --- a/test/Test.java +++ b/test/Test.java @@ -10,14 +10,19 @@ public class Test { boolean success = true; + StringBuilder total = new StringBuilder("\n"); public static void main(String[] args){ Test self = new Test(); + self.checkPrograms(); self.checkBinary(); self.checkPsuedo(); if (!self.success) { System.exit(1); } + } + + public void checkPrograms() { Globals.initialize(); Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,false); InstructionSet.rv64 = false; @@ -27,49 +32,28 @@ public static void main(String[] args){ opt.maxSteps = 1000; opt.selfModifyingCode = true; Program p = new Program(opt); - File[] tests = new File("./test").listFiles(), riscv_tests = new File("./test/riscv-tests").listFiles(), riscv_tests_64 = new File("./test/riscv-tests-64").listFiles(); - if(tests == null){ - System.out.println("./test doesn't exist"); - return; - } - StringBuilder total = new StringBuilder("\n"); - for(File test : tests){ - if(test.isFile() && test.getName().endsWith(".s")){ - String errors = run(test.getPath(),p); - if(errors.equals("")) { - System.out.print('.'); - }else{ - System.out.print('X'); - total.append(errors).append('\n'); - } - } - } - if(riscv_tests == null){ - System.out.println("./test/riscv-tests doesn't exist"); - return; - } - for(File test : riscv_tests){ - if(test.isFile() && test.getName().endsWith(".s")){ - String errors = run(test.getPath(),p); - if(errors.equals("")) { - System.out.print('.'); - }else{ - System.out.print('X'); - total.append(errors).append('\n'); - } - } - } + runDirectory("./test", p); + runDirectory("./test/riscv-tests", p); - if(riscv_tests_64 == null){ - System.out.println("./test/riscv-tests-64 doesn't exist"); - return; - } Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,true); InstructionSet.rv64 = true; Globals.instructionSet.populate(); - for(File test : riscv_tests_64){ - if(test.isFile() && test.getName().toLowerCase().endsWith(".s")){ + runDirectory("./test", p); + runDirectory("./test/riscv-tests-64", p); + + System.out.println(total); + } + + public void runDirectory(String directory, Program p) { + File[] tests = new File(directory).listFiles(); + if(tests == null){ + System.out.println(directory + " doesn't exist"); + success = false; + return; + } + for(File test : tests){ + if(test.isFile() && test.getName().endsWith(".s")){ String errors = run(test.getPath(),p); if(errors.equals("")) { System.out.print('.'); @@ -79,8 +63,8 @@ public static void main(String[] args){ } } } - System.out.println(total); } + public static String run(String path, Program p){ int[] errorlines = null; String stdin = "", stdout = "", stderr =""; From 8873545636322a124f598ba67876d36c09cfe757 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 8 Jul 2024 17:38:24 -0400 Subject: [PATCH 107/199] tests: make tests/dword.s arch-independant --- test/dword.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/dword.s b/test/dword.s index b9e6ee93..ffb04b88 100644 --- a/test/dword.s +++ b/test/dword.s @@ -1,4 +1,4 @@ -#stdout:87654321HGFEDCBA0x100100000x00000000 +#stdout:87654321HGFEDCBA2685009920 .data data: .eqv eqv, 0x3132333435363738 @@ -14,7 +14,7 @@ la a0, data ecall la s1, data2 -li a7, 34 # PrintIntHex +li a7, 1 # PrintInt lw a0, 0(s1) ecall lw a0, 4(s1) From 10c0f7022ef97555ab259d0e0371103be17df822 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 08:49:23 -0400 Subject: [PATCH 108/199] tests: activate most risc 64 tests (.S was filtered out) --- test/riscv-tests-64/{add.S => add.s} | 0 test/riscv-tests-64/{addi.S => addi.s} | 0 test/riscv-tests-64/{addiw.S => addiw.s} | 0 test/riscv-tests-64/{addw.S => addw.s} | 0 test/riscv-tests-64/{and.S => and.s} | 0 test/riscv-tests-64/{andi.S => andi.s} | 0 test/riscv-tests-64/{lb.S => lb.s} | 0 test/riscv-tests-64/{lbu.S => lbu.s} | 0 test/riscv-tests-64/{ld.S => ld.s} | 0 test/riscv-tests-64/{lh.S => lh.s} | 0 test/riscv-tests-64/{lhu.S => lhu.s} | 0 test/riscv-tests-64/{lui.S => lui.s} | 0 test/riscv-tests-64/{lw.S => lw.s} | 0 test/riscv-tests-64/{lwu.S => lwu.s} | 0 test/riscv-tests-64/{or.S => or.s} | 0 test/riscv-tests-64/{ori.S => ori.s} | 0 test/riscv-tests-64/{sb.S => sb.s} | 0 test/riscv-tests-64/{sd.S => sd.s} | 0 test/riscv-tests-64/{sh.S => sh.s} | 0 test/riscv-tests-64/{simple.S => simple.s} | 0 test/riscv-tests-64/{sll.S => sll.s} | 0 test/riscv-tests-64/{slli.S => slli.s} | 0 test/riscv-tests-64/{slliw.S => slliw.s} | 0 test/riscv-tests-64/{sllw.S => sllw.s} | 0 test/riscv-tests-64/{slt.S => slt.s} | 0 test/riscv-tests-64/{slti.S => slti.s} | 0 test/riscv-tests-64/{sltiu.S => sltiu.s} | 0 test/riscv-tests-64/{sltu.S => sltu.s} | 0 test/riscv-tests-64/{sra.S => sra.s} | 0 test/riscv-tests-64/{srai.S => srai.s} | 0 test/riscv-tests-64/{sraiw.S => sraiw.s} | 0 test/riscv-tests-64/{sraw.S => sraw.s} | 0 test/riscv-tests-64/{srl.S => srl.s} | 0 test/riscv-tests-64/{srli.S => srli.s} | 0 test/riscv-tests-64/{srliw.S => srliw.s} | 0 test/riscv-tests-64/{srlw.S => srlw.s} | 0 test/riscv-tests-64/{sub.S => sub.s} | 0 test/riscv-tests-64/{subw.S => subw.s} | 0 test/riscv-tests-64/{sw.S => sw.s} | 0 test/riscv-tests-64/{xor.S => xor.s} | 0 test/riscv-tests-64/{xori.S => xori.s} | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename test/riscv-tests-64/{add.S => add.s} (100%) rename test/riscv-tests-64/{addi.S => addi.s} (100%) rename test/riscv-tests-64/{addiw.S => addiw.s} (100%) rename test/riscv-tests-64/{addw.S => addw.s} (100%) rename test/riscv-tests-64/{and.S => and.s} (100%) rename test/riscv-tests-64/{andi.S => andi.s} (100%) rename test/riscv-tests-64/{lb.S => lb.s} (100%) rename test/riscv-tests-64/{lbu.S => lbu.s} (100%) rename test/riscv-tests-64/{ld.S => ld.s} (100%) rename test/riscv-tests-64/{lh.S => lh.s} (100%) rename test/riscv-tests-64/{lhu.S => lhu.s} (100%) rename test/riscv-tests-64/{lui.S => lui.s} (100%) rename test/riscv-tests-64/{lw.S => lw.s} (100%) rename test/riscv-tests-64/{lwu.S => lwu.s} (100%) rename test/riscv-tests-64/{or.S => or.s} (100%) rename test/riscv-tests-64/{ori.S => ori.s} (100%) rename test/riscv-tests-64/{sb.S => sb.s} (100%) rename test/riscv-tests-64/{sd.S => sd.s} (100%) rename test/riscv-tests-64/{sh.S => sh.s} (100%) rename test/riscv-tests-64/{simple.S => simple.s} (100%) rename test/riscv-tests-64/{sll.S => sll.s} (100%) rename test/riscv-tests-64/{slli.S => slli.s} (100%) rename test/riscv-tests-64/{slliw.S => slliw.s} (100%) rename test/riscv-tests-64/{sllw.S => sllw.s} (100%) rename test/riscv-tests-64/{slt.S => slt.s} (100%) rename test/riscv-tests-64/{slti.S => slti.s} (100%) rename test/riscv-tests-64/{sltiu.S => sltiu.s} (100%) rename test/riscv-tests-64/{sltu.S => sltu.s} (100%) rename test/riscv-tests-64/{sra.S => sra.s} (100%) rename test/riscv-tests-64/{srai.S => srai.s} (100%) rename test/riscv-tests-64/{sraiw.S => sraiw.s} (100%) rename test/riscv-tests-64/{sraw.S => sraw.s} (100%) rename test/riscv-tests-64/{srl.S => srl.s} (100%) rename test/riscv-tests-64/{srli.S => srli.s} (100%) rename test/riscv-tests-64/{srliw.S => srliw.s} (100%) rename test/riscv-tests-64/{srlw.S => srlw.s} (100%) rename test/riscv-tests-64/{sub.S => sub.s} (100%) rename test/riscv-tests-64/{subw.S => subw.s} (100%) rename test/riscv-tests-64/{sw.S => sw.s} (100%) rename test/riscv-tests-64/{xor.S => xor.s} (100%) rename test/riscv-tests-64/{xori.S => xori.s} (100%) diff --git a/test/riscv-tests-64/add.S b/test/riscv-tests-64/add.s similarity index 100% rename from test/riscv-tests-64/add.S rename to test/riscv-tests-64/add.s diff --git a/test/riscv-tests-64/addi.S b/test/riscv-tests-64/addi.s similarity index 100% rename from test/riscv-tests-64/addi.S rename to test/riscv-tests-64/addi.s diff --git a/test/riscv-tests-64/addiw.S b/test/riscv-tests-64/addiw.s similarity index 100% rename from test/riscv-tests-64/addiw.S rename to test/riscv-tests-64/addiw.s diff --git a/test/riscv-tests-64/addw.S b/test/riscv-tests-64/addw.s similarity index 100% rename from test/riscv-tests-64/addw.S rename to test/riscv-tests-64/addw.s diff --git a/test/riscv-tests-64/and.S b/test/riscv-tests-64/and.s similarity index 100% rename from test/riscv-tests-64/and.S rename to test/riscv-tests-64/and.s diff --git a/test/riscv-tests-64/andi.S b/test/riscv-tests-64/andi.s similarity index 100% rename from test/riscv-tests-64/andi.S rename to test/riscv-tests-64/andi.s diff --git a/test/riscv-tests-64/lb.S b/test/riscv-tests-64/lb.s similarity index 100% rename from test/riscv-tests-64/lb.S rename to test/riscv-tests-64/lb.s diff --git a/test/riscv-tests-64/lbu.S b/test/riscv-tests-64/lbu.s similarity index 100% rename from test/riscv-tests-64/lbu.S rename to test/riscv-tests-64/lbu.s diff --git a/test/riscv-tests-64/ld.S b/test/riscv-tests-64/ld.s similarity index 100% rename from test/riscv-tests-64/ld.S rename to test/riscv-tests-64/ld.s diff --git a/test/riscv-tests-64/lh.S b/test/riscv-tests-64/lh.s similarity index 100% rename from test/riscv-tests-64/lh.S rename to test/riscv-tests-64/lh.s diff --git a/test/riscv-tests-64/lhu.S b/test/riscv-tests-64/lhu.s similarity index 100% rename from test/riscv-tests-64/lhu.S rename to test/riscv-tests-64/lhu.s diff --git a/test/riscv-tests-64/lui.S b/test/riscv-tests-64/lui.s similarity index 100% rename from test/riscv-tests-64/lui.S rename to test/riscv-tests-64/lui.s diff --git a/test/riscv-tests-64/lw.S b/test/riscv-tests-64/lw.s similarity index 100% rename from test/riscv-tests-64/lw.S rename to test/riscv-tests-64/lw.s diff --git a/test/riscv-tests-64/lwu.S b/test/riscv-tests-64/lwu.s similarity index 100% rename from test/riscv-tests-64/lwu.S rename to test/riscv-tests-64/lwu.s diff --git a/test/riscv-tests-64/or.S b/test/riscv-tests-64/or.s similarity index 100% rename from test/riscv-tests-64/or.S rename to test/riscv-tests-64/or.s diff --git a/test/riscv-tests-64/ori.S b/test/riscv-tests-64/ori.s similarity index 100% rename from test/riscv-tests-64/ori.S rename to test/riscv-tests-64/ori.s diff --git a/test/riscv-tests-64/sb.S b/test/riscv-tests-64/sb.s similarity index 100% rename from test/riscv-tests-64/sb.S rename to test/riscv-tests-64/sb.s diff --git a/test/riscv-tests-64/sd.S b/test/riscv-tests-64/sd.s similarity index 100% rename from test/riscv-tests-64/sd.S rename to test/riscv-tests-64/sd.s diff --git a/test/riscv-tests-64/sh.S b/test/riscv-tests-64/sh.s similarity index 100% rename from test/riscv-tests-64/sh.S rename to test/riscv-tests-64/sh.s diff --git a/test/riscv-tests-64/simple.S b/test/riscv-tests-64/simple.s similarity index 100% rename from test/riscv-tests-64/simple.S rename to test/riscv-tests-64/simple.s diff --git a/test/riscv-tests-64/sll.S b/test/riscv-tests-64/sll.s similarity index 100% rename from test/riscv-tests-64/sll.S rename to test/riscv-tests-64/sll.s diff --git a/test/riscv-tests-64/slli.S b/test/riscv-tests-64/slli.s similarity index 100% rename from test/riscv-tests-64/slli.S rename to test/riscv-tests-64/slli.s diff --git a/test/riscv-tests-64/slliw.S b/test/riscv-tests-64/slliw.s similarity index 100% rename from test/riscv-tests-64/slliw.S rename to test/riscv-tests-64/slliw.s diff --git a/test/riscv-tests-64/sllw.S b/test/riscv-tests-64/sllw.s similarity index 100% rename from test/riscv-tests-64/sllw.S rename to test/riscv-tests-64/sllw.s diff --git a/test/riscv-tests-64/slt.S b/test/riscv-tests-64/slt.s similarity index 100% rename from test/riscv-tests-64/slt.S rename to test/riscv-tests-64/slt.s diff --git a/test/riscv-tests-64/slti.S b/test/riscv-tests-64/slti.s similarity index 100% rename from test/riscv-tests-64/slti.S rename to test/riscv-tests-64/slti.s diff --git a/test/riscv-tests-64/sltiu.S b/test/riscv-tests-64/sltiu.s similarity index 100% rename from test/riscv-tests-64/sltiu.S rename to test/riscv-tests-64/sltiu.s diff --git a/test/riscv-tests-64/sltu.S b/test/riscv-tests-64/sltu.s similarity index 100% rename from test/riscv-tests-64/sltu.S rename to test/riscv-tests-64/sltu.s diff --git a/test/riscv-tests-64/sra.S b/test/riscv-tests-64/sra.s similarity index 100% rename from test/riscv-tests-64/sra.S rename to test/riscv-tests-64/sra.s diff --git a/test/riscv-tests-64/srai.S b/test/riscv-tests-64/srai.s similarity index 100% rename from test/riscv-tests-64/srai.S rename to test/riscv-tests-64/srai.s diff --git a/test/riscv-tests-64/sraiw.S b/test/riscv-tests-64/sraiw.s similarity index 100% rename from test/riscv-tests-64/sraiw.S rename to test/riscv-tests-64/sraiw.s diff --git a/test/riscv-tests-64/sraw.S b/test/riscv-tests-64/sraw.s similarity index 100% rename from test/riscv-tests-64/sraw.S rename to test/riscv-tests-64/sraw.s diff --git a/test/riscv-tests-64/srl.S b/test/riscv-tests-64/srl.s similarity index 100% rename from test/riscv-tests-64/srl.S rename to test/riscv-tests-64/srl.s diff --git a/test/riscv-tests-64/srli.S b/test/riscv-tests-64/srli.s similarity index 100% rename from test/riscv-tests-64/srli.S rename to test/riscv-tests-64/srli.s diff --git a/test/riscv-tests-64/srliw.S b/test/riscv-tests-64/srliw.s similarity index 100% rename from test/riscv-tests-64/srliw.S rename to test/riscv-tests-64/srliw.s diff --git a/test/riscv-tests-64/srlw.S b/test/riscv-tests-64/srlw.s similarity index 100% rename from test/riscv-tests-64/srlw.S rename to test/riscv-tests-64/srlw.s diff --git a/test/riscv-tests-64/sub.S b/test/riscv-tests-64/sub.s similarity index 100% rename from test/riscv-tests-64/sub.S rename to test/riscv-tests-64/sub.s diff --git a/test/riscv-tests-64/subw.S b/test/riscv-tests-64/subw.s similarity index 100% rename from test/riscv-tests-64/subw.S rename to test/riscv-tests-64/subw.s diff --git a/test/riscv-tests-64/sw.S b/test/riscv-tests-64/sw.s similarity index 100% rename from test/riscv-tests-64/sw.S rename to test/riscv-tests-64/sw.s diff --git a/test/riscv-tests-64/xor.S b/test/riscv-tests-64/xor.s similarity index 100% rename from test/riscv-tests-64/xor.S rename to test/riscv-tests-64/xor.s diff --git a/test/riscv-tests-64/xori.S b/test/riscv-tests-64/xori.s similarity index 100% rename from test/riscv-tests-64/xori.S rename to test/riscv-tests-64/xori.s From 8077f8658724b009a37c52e79ee047b0464af1da Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 11:48:14 -0400 Subject: [PATCH 109/199] tests: extract setupProgram --- test/Test.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/Test.java b/test/Test.java index b712f75d..de1963dc 100644 --- a/test/Test.java +++ b/test/Test.java @@ -22,17 +22,21 @@ public static void main(String[] args){ } } - public void checkPrograms() { + Program setupProgram(boolean rv64) { Globals.initialize(); - Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,false); - InstructionSet.rv64 = false; + Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,rv64); + InstructionSet.rv64 = rv64; Globals.instructionSet.populate(); Options opt = new Options(); opt.startAtMain = true; - opt.maxSteps = 1000; + opt.maxSteps = 1000000; opt.selfModifyingCode = true; - Program p = new Program(opt); + return new Program(opt); + } + + public void checkPrograms() { + Program p = setupProgram(false); runDirectory("./test", p); runDirectory("./test/riscv-tests", p); From 368807705b3205ad879d721814f74da333f45843 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 11:48:34 -0400 Subject: [PATCH 110/199] tests: extract runFile --- test/Test.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/Test.java b/test/Test.java index de1963dc..87834be5 100644 --- a/test/Test.java +++ b/test/Test.java @@ -58,17 +58,21 @@ public void runDirectory(String directory, Program p) { } for(File test : tests){ if(test.isFile() && test.getName().endsWith(".s")){ - String errors = run(test.getPath(),p); - if(errors.equals("")) { - System.out.print('.'); - }else{ - System.out.print('X'); - total.append(errors).append('\n'); - } + runFile(test.getPath(), p); } } } + public void runFile(String path, Program p) { + String errors = run(path, p); + if (errors.equals("")) { + System.out.print('.'); + } else { + System.out.print('X'); + total.append(errors).append('\n'); + } + } + public static String run(String path, Program p){ int[] errorlines = null; String stdin = "", stdout = "", stderr =""; From 8f4da7bb98e01fbccb63d9d30e29506b8d34671b Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 11:49:06 -0400 Subject: [PATCH 111/199] tests: trim output --- test/Test.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Test.java b/test/Test.java index 87834be5..4a958f45 100644 --- a/test/Test.java +++ b/test/Test.java @@ -91,9 +91,9 @@ public static String run(String path, Program p){ } else if (line.startsWith("#stdin:")) { stdin = line.replaceFirst("#stdin:", "").replaceAll("\\\\n","\n"); } else if (line.startsWith("#stdout:")) { - stdout = line.replaceFirst("#stdout:", "").replaceAll("\\\\n","\n"); + stdout = line.replaceFirst("#stdout:", "").replaceAll("\\\\n","\n").trim(); } else if (line.startsWith("#stderr:")) { - stderr = line.replaceFirst("#stderr:", "").replaceAll("\\\\n","\n"); + stderr = line.replaceFirst("#stderr:", "").replaceAll("\\\\n","\n").trim(); } line = br.readLine(); } @@ -115,10 +115,10 @@ public static String run(String path, Program p){ if(p.getExitCode() != 42) { return "Final exit code was wrong for " + path; } - if(!p.getSTDOUT().equals(stdout)){ + if(!p.getSTDOUT().trim().equals(stdout)){ return "STDOUT was wrong for " + path + "\n Expected \""+stdout+"\" got \""+p.getSTDOUT()+"\""; } - if(!p.getSTDERR().equals(stderr)){ + if(!p.getSTDERR().trim().equals(stderr)){ return "STDERR was wrong for " + path; } return ""; From 9e413becfba3d762619ae32f4a4ef4c71f5f48c3 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 11:49:40 -0400 Subject: [PATCH 112/199] test: spell assembly --- test/Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test.java b/test/Test.java index 4a958f45..137ea065 100644 --- a/test/Test.java +++ b/test/Test.java @@ -105,7 +105,7 @@ public static String run(String path, Program p){ try { p.assemble(path); if(errorlines != null){ - return "Expected asssembly error, but successfully assembled " + path; + return "Expected assembly error, but successfully assembled " + path; } p.setup(null,stdin); Simulator.Reason r = p.simulate(); From 14dcde3dca67d3e1a326ada9ece20b8edac2fa86 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 11:50:33 -0400 Subject: [PATCH 113/199] tests: accept command line argument --- test/Test.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/Test.java b/test/Test.java index 137ea065..782e666f 100644 --- a/test/Test.java +++ b/test/Test.java @@ -14,6 +14,22 @@ public class Test { public static void main(String[] args){ Test self = new Test(); + if (args.length != 0) { + Program p = self.setupProgram(true); + for (String arg : args) { + File file = new File(arg); + if (file.isDirectory()) { + self.runDirectory(arg, p); + } else if (file.isFile()) { + self.runFile(arg, p); + } else { + System.out.println(arg + " bad file"); + self.success = false; + } + } + System.out.println(self.total); + System.exit(self.success ? 0 : 1); + } self.checkPrograms(); self.checkBinary(); self.checkPsuedo(); From 2a4d6d3c15c42b87277917176ffc29a6a0764d6d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 11:51:01 -0400 Subject: [PATCH 114/199] tests: collect test directive anywhere in the source file --- test/Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test.java b/test/Test.java index 782e666f..b324f126 100644 --- a/test/Test.java +++ b/test/Test.java @@ -97,7 +97,7 @@ public static String run(String path, Program p){ try { BufferedReader br = new BufferedReader(new FileReader(path)); String line = br.readLine(); - while(line.startsWith("#")){ + while(line != null){ if (line.startsWith("#error on lines:")) { String[] linenumbers = line.replaceFirst("#error on lines:", "").split(","); errorlines = new int[linenumbers.length]; From 82504da7f61a0377a320e2cace84a5d43c472c52 Mon Sep 17 00:00:00 2001 From: Hugo Leblanc Date: Tue, 9 Jul 2024 12:08:14 -0400 Subject: [PATCH 115/199] Remove assembly plugin from Maven pom.xml to reduce final JAR file size. The dependency added the assembly plugin classes to the jar file, which is not needed. --- pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pom.xml b/pom.xml index ec10750a..11dda680 100644 --- a/pom.xml +++ b/pom.xml @@ -6,12 +6,6 @@ 1.6-git jar - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - com.formdev From c14ad466469478d828470f0fd21c3402749cfc2a Mon Sep 17 00:00:00 2001 From: Hugo Leblanc Date: Tue, 9 Jul 2024 12:09:09 -0400 Subject: [PATCH 116/199] Typos in GH action workflow --- .github/workflows/maven.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index e80ab366..3c0c3de3 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -1,14 +1,14 @@ -name: gradle +name: maven on: push: - braches: + branches: - master pull_request: - braches: + branches: - master jobs: - gradle: + maven: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From 4a86015edb080641ab0912e823b9f69802ab131b Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 13:23:11 -0400 Subject: [PATCH 117/199] ci/cd: limit PR and branches targets --- .github/workflows/makefile.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 681c2fca..1c7f5c93 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -2,7 +2,11 @@ name: Makefile CI on: push: + branches: + - master pull_request: + branches: + - master jobs: build: From d50d6db62a9bb475e86e972c2b4780ea1157b1d4 Mon Sep 17 00:00:00 2001 From: Hugo Leblanc Date: Tue, 9 Jul 2024 13:44:21 -0400 Subject: [PATCH 118/199] Changed program arguments from JTextArea to JTextField Includes a refactoring of createBoxForButton to createBoxForComponent since we now use it for the JTextField too. --- src/rars/venus/MessagesPane.java | 37 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index cf73bf72..673237f2 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -61,7 +61,7 @@ public class MessagesPane extends JPanel { private final JRadioButton buttonBatch; private final JButton inputTabClearButton; private final Box runioContent; - private final JTextArea programArguments; + private final JTextField programArguments; private JTabbedPane leftPane; private JSplitPane batchTab; JTextArea assemble, run, input, output; @@ -87,7 +87,7 @@ public MessagesPane() { run = new JTextArea(); input = new JTextArea(); output = new JTextArea(); - programArguments = new JTextArea(); + programArguments = new JTextField(); assemble.setEditable(false); run.setEditable(false); input.setEditable(true); @@ -102,7 +102,6 @@ public MessagesPane() { input.setFont(monoFont); output.setFont(monoFont); programArguments.setFont(monoFont); - programArguments.getDocument().putProperty("filterNewlines", Boolean.TRUE); // single line JButton assembleTabClearButton = new JButton("Clear"); assembleTabClearButton.setToolTipText("Clear the Messages area"); @@ -113,7 +112,7 @@ public void actionPerformed(ActionEvent e) { } }); assembleTab = new JPanel(new BorderLayout()); - assembleTab.add(createBoxForButton(assembleTabClearButton), BorderLayout.WEST); + assembleTab.add(createBoxForComponent(assembleTabClearButton), BorderLayout.WEST); assembleTab.add(new JScrollPane(assemble, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); assemble.addMouseListener( @@ -231,7 +230,7 @@ public void actionPerformed(ActionEvent e) { /* runTab: A single interactive text area */ runTab = new JPanel(new BorderLayout()); - runTab.add(createBoxForButton(runButtonBox), BorderLayout.WEST); + runTab.add(createBoxForComponent(runButtonBox), BorderLayout.WEST); runTab.add(new JScrollPane(run, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); @@ -250,7 +249,7 @@ public void actionPerformed(ActionEvent e) { /* The runio, the content is dynamic */ runioContent = Box.createHorizontalBox(); runioTab = new JPanel(new BorderLayout()); - runioTab.add(createBoxForButton(runButtonBox), BorderLayout.WEST); + runioTab.add(createBoxForComponent(runButtonBox), BorderLayout.WEST); runioTab.add(runioContent); updateIOTab(); @@ -264,9 +263,9 @@ public void actionPerformed(ActionEvent e) { } }); JPanel programArgumentsPanel = new JPanel(new BorderLayout()); - programArgumentsPanel.add(createBoxForButton(programArgumentsClearButton), BorderLayout.WEST); - programArgumentsPanel.add(new JScrollPane(programArguments, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); + programArgumentsPanel.add(createBoxForComponent(programArgumentsClearButton), BorderLayout.WEST); + programArguments.setMaximumSize(new Dimension(Integer.MAX_VALUE, programArguments.getPreferredSize().height)); + programArgumentsPanel.add(createBoxForComponent(programArguments), BorderLayout.CENTER); leftPane.addTab("Messages", assembleTab); leftPane.addTab("Run I/O", runioTab); @@ -299,16 +298,16 @@ private void updateIOTab() { } // Center given button in a box, centered vertically and 6 pixels on left and right - private Box createBoxForButton(Component button) { - Box buttonRow = Box.createHorizontalBox(); - buttonRow.add(Box.createHorizontalStrut(6)); - buttonRow.add(button); - buttonRow.add(Box.createHorizontalStrut(6)); - Box buttonBox = Box.createVerticalBox(); - buttonBox.add(Box.createVerticalGlue()); - buttonBox.add(buttonRow); - buttonBox.add(Box.createVerticalGlue()); - return buttonBox; + private Box createBoxForComponent(Component component) { + Box componentRow = Box.createHorizontalBox(); + componentRow.add(Box.createHorizontalStrut(6)); + componentRow.add(component); + componentRow.add(Box.createHorizontalStrut(6)); + Box componentBox = Box.createVerticalBox(); + componentBox.add(Box.createVerticalGlue()); + componentBox.add(componentRow); + componentBox.add(Box.createVerticalGlue()); + return componentBox; } /** From 361ba91796de466fbecda2e34947b6ef415bf300 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 16:13:52 -0400 Subject: [PATCH 119/199] maven: git ignore taget directory --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1fab025b..727146cc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ rars.jar rars-flatlaf.jar src/Version.properties +# Maven +target/ + # Eclipse project files .classpath .project From c6da467bba0cf8503caa37a9687502270608ec42 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 16:15:47 -0400 Subject: [PATCH 120/199] junit: add junit and a smoke tests that asserts true --- pom.xml | 27 +++++++++++++++++++++++++++ test/SmokeTest.java | 11 +++++++++++ 2 files changed, 38 insertions(+) create mode 100644 test/SmokeTest.java diff --git a/pom.xml b/pom.xml index 11dda680..c342d11c 100644 --- a/pom.xml +++ b/pom.xml @@ -13,9 +13,17 @@ 3.4.1 runtime + + + org.junit.jupiter + junit-jupiter + 5.10.3 + test + src + test src @@ -50,8 +58,27 @@ + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.3.0 + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 3.3.0 + + + 8 8 diff --git a/test/SmokeTest.java b/test/SmokeTest.java new file mode 100644 index 00000000..9f68f286 --- /dev/null +++ b/test/SmokeTest.java @@ -0,0 +1,11 @@ +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SmokeTest { + @Test + public void assertTrueTest() { + assertTrue(true); + } + +} From d08529ac6765aafadb002cdfefe1590ce55d834f Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 17:38:01 -0400 Subject: [PATCH 121/199] githubactions: add action-junit-report --- .github/workflows/maven.yml | 14 ++++++++++++++ .github/workflows/report.yml | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 .github/workflows/report.yml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 3c0c3de3..2520b273 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,8 +21,22 @@ jobs: cache: maven - name: Build with Maven run: mvn --batch-mode --update-snapshots verify + - uses: actions/upload-artifact@v4 + if: success() || failure() # always run even if the previous step fails + with: + name: junit-test-results + path: target/surefire-reports/ - run: mkdir staging && cp target/*.jar staging - uses: actions/upload-artifact@v4 with: name: Package path: staging + event_file: + name: "Event File" + runs-on: ubuntu-latest + steps: + - name: Upload + uses: actions/upload-artifact@v4 + with: + name: Event File + path: ${{ github.event_path }} diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml new file mode 100644 index 00000000..3e3c8a16 --- /dev/null +++ b/.github/workflows/report.yml @@ -0,0 +1,34 @@ +name: Test Results +on: + workflow_run: + workflows: ["maven"] + types: + - completed +permissions: {} +jobs: + test-results: + name: Test Results + runs-on: ubuntu-latest + if: github.event.workflow_run.conclusion != 'skipped' + + permissions: + checks: write + # needed unless run with comment_mode: off + pull-requests: write + # required by download step to access artifacts API + actions: read + + steps: + - name: Download and Extract Artifacts + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d + with: + run_id: ${{ github.event.workflow_run.id }} + path: artifacts + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v2 + with: + commit: ${{ github.event.workflow_run.head_sha }} + event_file: artifacts/Event File/event.json + event_name: ${{ github.event.workflow_run.event }} + files: "**/*.xml" From a5bdbd7fc654396eaa444c8c4c4e724b7986a3fa Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 11 Jul 2024 08:35:10 -0400 Subject: [PATCH 122/199] tokenmarker: new method updated to track document change --- src/rars/venus/editors/jeditsyntax/SyntaxDocument.java | 2 ++ .../venus/editors/jeditsyntax/tokenmarker/TokenMarker.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java b/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java index b2801f45..44e80930 100644 --- a/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java +++ b/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java @@ -135,6 +135,7 @@ protected void fireInsertUpdate(DocumentEvent evt) { ch.getChildrenAdded().length - ch.getChildrenRemoved().length); } + tokenMarker.updated(evt); } super.fireInsertUpdate(evt); @@ -154,6 +155,7 @@ protected void fireRemoveUpdate(DocumentEvent evt) { ch.getChildrenRemoved().length - ch.getChildrenAdded().length); } + tokenMarker.updated(evt); } super.fireRemoveUpdate(evt); diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java index 69d4684c..30a0d062 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java @@ -11,6 +11,7 @@ import rars.venus.editors.jeditsyntax.PopupHelpItem; +import javax.swing.event.DocumentEvent; import javax.swing.text.Segment; import java.util.ArrayList; @@ -314,6 +315,12 @@ protected void addToken(int length, byte id) { } } + /** + * method called when there is a change in the document. + */ + public void updated(DocumentEvent evt) { + } + /** * Inner class for storing information about tokenized lines. */ From 57114e6ec7f33b51c5f63e2220d9dd28145916ae Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 11 Jul 2024 08:35:52 -0400 Subject: [PATCH 123/199] KeywordMap: add lookup(String) and clear methods --- .../venus/editors/jeditsyntax/KeywordMap.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/rars/venus/editors/jeditsyntax/KeywordMap.java b/src/rars/venus/editors/jeditsyntax/KeywordMap.java index 86e4f08b..943f4492 100644 --- a/src/rars/venus/editors/jeditsyntax/KeywordMap.java +++ b/src/rars/venus/editors/jeditsyntax/KeywordMap.java @@ -13,6 +13,7 @@ import rars.venus.editors.jeditsyntax.tokenmarker.Token; import javax.swing.text.Segment; +import java.util.Arrays; /** * A KeywordMap is similar to a hashtable in that it maps keys @@ -74,6 +75,22 @@ public byte lookup(Segment text, int offset, int length) { return Token.NULL; } + /** + * Looks up a key. + */ + public byte lookup(String keyword) { + if (keyword.isEmpty()) + return Token.NULL; + char[] chars = keyword.toCharArray(); + Keyword k = map[getStringMapKey(keyword)]; + while (k != null) { + if (Arrays.equals(k.keyword, chars)) + return k.id; + k = k.next; + } + return Token.NULL; + } + /** * Adds a key-value mapping. * @@ -85,6 +102,15 @@ public void add(String keyword, byte id) { map[key] = new Keyword(keyword.toCharArray(), id, map[key]); } + /** + * remove all keywords. + */ + public void clear() { + for (int i = 0; i < mapLength; i++) { + map[i] = null; + } + } + /** * Returns true if the keyword map is set to be case insensitive, * false otherwise. From 2e755eb821b91ea42eed347263a0ae7dd9690c38 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 11 Jul 2024 08:48:48 -0400 Subject: [PATCH 124/199] tokenmarker: colorize label usages --- .../tokenmarker/RISCVTokenMarker.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java index 2602c6de..ca94349b 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java @@ -9,8 +9,7 @@ package rars.venus.editors.jeditsyntax.tokenmarker; -import rars.Globals; -import rars.Settings; +import rars.*; import rars.assembler.Directives; import rars.riscv.BasicInstruction; import rars.riscv.hardware.FloatingPointRegisterFile; @@ -19,7 +18,9 @@ import rars.riscv.Instruction; import rars.venus.editors.jeditsyntax.KeywordMap; import rars.venus.editors.jeditsyntax.PopupHelpItem; +import rars.venus.editors.jeditsyntax.SyntaxDocument; +import javax.swing.event.DocumentEvent; import javax.swing.text.Segment; import java.util.ArrayList; import java.util.HashMap; @@ -71,6 +72,14 @@ public static String[] getRISCVTokenExamples() { return tokenExamples; } + @Override + public void updated(DocumentEvent evt) { + SyntaxDocument document = (SyntaxDocument) evt.getDocument(); + // clear info and retokenize all to collect label definitions + labelKeywords.clear(); + document.tokenizeLines(); + } + public byte markTokensImpl(byte token, Segment line, int lineIndex) { char[] array = line.array; @@ -119,16 +128,22 @@ public byte markTokensImpl(byte token, Segment line, int lineIndex) { // (3) there are spaces between label name and colon, (4) label is valid // MIPS identifier (otherwise would catch, say, 0 (zero) in .word 0:10) backslash = false; - //String lab = new String(array, lastOffset, i1-lastOffset-1).trim(); boolean validIdentifier = false; + String label = null; try { - validIdentifier = rars.assembler.TokenTypes.isValidIdentifier(new String(array, lastOffset, i1 - lastOffset - 1).trim()); + label = new String(array, lastOffset, i1 - lastOffset - 1).trim(); + validIdentifier = rars.assembler.TokenTypes.isValidIdentifier(label); } catch (StringIndexOutOfBoundsException e) { validIdentifier = false; } if (validIdentifier) { addToken(i1 - lastOffset, Token.LABEL); lastOffset = lastKeyword = i1; + // Register the label, if new, to recognize its usages + byte t = labelKeywords.lookup(label); + if (t == Token.NULL) { + labelKeywords.add(label, Token.LABEL); + } } break; case '#': @@ -454,6 +469,7 @@ private static KeywordMap getKeywords() { // private members private static KeywordMap cKeywords; private static String[] tokenLabels, tokenExamples; + private KeywordMap labelKeywords = new KeywordMap(false); private KeywordMap keywords; private int lastOffset; private int lastKeyword; @@ -463,6 +479,9 @@ private void doKeyword(Segment line, int i, char c) { int len = i - lastKeyword; byte id = keywords.lookup(line, lastKeyword, len); + if (id == Token.NULL) { + id = labelKeywords.lookup(line, lastKeyword, len); + } if (id != Token.NULL) { // If this is a Token.KEYWORD1 and line already contains a keyword, // then assume this one is a label reference and ignore it. From 83a1af8cf43e1de025e5d614821afba87027dfe7 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 11 Jul 2024 08:49:37 -0400 Subject: [PATCH 125/199] tokenmarker: remove commented out code --- .../editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java index ca94349b..acf6f442 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java @@ -483,16 +483,10 @@ private void doKeyword(Segment line, int i, char c) { id = labelKeywords.lookup(line, lastKeyword, len); } if (id != Token.NULL) { - // If this is a Token.KEYWORD1 and line already contains a keyword, - // then assume this one is a label reference and ignore it. - // if (id == Token.KEYWORD1 && tokenListContainsKeyword()) { - // } - // else { if (lastKeyword != lastOffset) addToken(lastKeyword - lastOffset, Token.NULL); addToken(len, id); lastOffset = i; - // } } lastKeyword = i1; } From 29982e703212679c78489272043b6d0b35a30156 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 18 Jul 2024 13:31:33 -0400 Subject: [PATCH 126/199] fix highlight register pane --- src/rars/venus/run/RunStepAction.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rars/venus/run/RunStepAction.java b/src/rars/venus/run/RunStepAction.java index 2166d1b3..8e4b07cb 100644 --- a/src/rars/venus/run/RunStepAction.java +++ b/src/rars/venus/run/RunStepAction.java @@ -86,7 +86,10 @@ public void update(Observable o, Object simulator) { } }; Simulator.getInstance().addObserver(stopListener); - executePane.getRegistersWindow().clearHighlighting(); //clears highlight of previous step + //clears highlight of previous step + executePane.getRegistersWindow().clearHighlighting(); + executePane.getFloatingPointWindow().clearHighlighting(); + executePane.getControlAndStatusWindow().clearHighlighting(); executePane.getDataSegmentWindow().clearHighlighting(); Globals.program.startSimulation(1, null); From 3292ddd7c5a2c6a1a6a2094cf6eca0c4aa71e782 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Sun, 7 Jul 2024 17:12:50 -0400 Subject: [PATCH 127/199] Factorise some code from RunGoAction and RunStepAction --- src/rars/venus/VenusUI.java | 118 +++++++++++++++++++ src/rars/venus/run/RunGoAction.java | 156 +++----------------------- src/rars/venus/run/RunStepAction.java | 91 +++------------ 3 files changed, 151 insertions(+), 214 deletions(-) diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index 782048c1..6496f522 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -2,9 +2,11 @@ import rars.Globals; import rars.Settings; +import rars.SimulationException; import rars.riscv.InstructionSet; import rars.riscv.dump.DumpFormatLoader; import rars.simulator.Simulator; +import rars.simulator.SimulatorNotice; import rars.venus.registers.ControlAndStatusWindow; import rars.venus.registers.FloatingPointWindow; import rars.venus.registers.RegistersPane; @@ -1044,6 +1046,122 @@ public static int getMenuState() { return menuState; } + /** + * Method called when a simulation is started to update the UI. + * + * @return true if the ui was updated to start the simulation. + */ + public boolean onStartedSimulation(String name) { + ExecutePane executePane = getMainPane().getExecutePane(); + + if (!FileStatus.isAssembled()) { + // note: this should never occur since "Go" and "Step" are only enabled after successful assembly. + JOptionPane.showMessageDialog(this, "The program must be assembled before it can be run."); + return false; + } + + if (!getStarted()) { + getMessagesPane().processProgramArgumentsIfAny(); + } + + if (!getReset() && !getStarted()) { + // This should never occur because at termination the Go and Step buttons are disabled. + JOptionPane.showMessageDialog(this, "reset " + mainUI.getReset() + " started " + mainUI.getStarted());//"You must reset before you can execute the program again."); + return false; + } + + setStarted(true); // added 8/27/05 + + getMessagesPane().postMessage(name + ": running " + FileStatus.getFile().getName() + "\n\n"); + getMessagesPane().selectRunMessageTab(); + executePane.getTextSegmentWindow().setCodeHighlighting(false); + executePane.getTextSegmentWindow().unhighlightAllSteps(); + //clears highlight of registers and data segment if the run step was used before + executePane.getRegistersWindow().clearHighlighting(); + executePane.getFloatingPointWindow().clearHighlighting(); + executePane.getControlAndStatusWindow().clearHighlighting(); + executePane.getDataSegmentWindow().clearHighlighting(); + //FileStatus.set(FileStatus.RUNNING); + setMenuState(FileStatus.RUNNING); + + return true; + } + + /** + * Method called when a simulation is stopped to update the UI. + */ + public void onStoppedSimulation(String name, SimulatorNotice notice) { + ExecutePane executePane = getMainPane().getExecutePane(); + executePane.getRegistersWindow().updateRegisters(); + executePane.getFloatingPointWindow().updateRegisters(); + executePane.getControlAndStatusWindow().updateRegisters(); + executePane.getDataSegmentWindow().updateValues(); + + if (notice.getDone()) { + RunGoAction.resetMaxSteps(); + executePane.getTextSegmentWindow().unhighlightAllSteps(); + executePane.getTextSegmentWindow().setCodeHighlighting(false); + FileStatus.set(FileStatus.TERMINATED); + } else { + executePane.getTextSegmentWindow().setCodeHighlighting(true); + executePane.getTextSegmentWindow().highlightStepAtPC(); + FileStatus.set(FileStatus.RUNNABLE); + } + + Simulator.Reason reason = notice.getReason(); + switch (reason) { + case NORMAL_TERMINATION: + mainUI.getMessagesPane().postMessage( + "\n" + name + ": execution completed successfully.\n\n"); + mainUI.getMessagesPane().postRunMessage( + "\n-- program is finished running (" + Globals.exitCode + ") --\n\n"); + mainUI.getMessagesPane().selectRunMessageTab(); + break; + case CLIFF_TERMINATION: + mainUI.getMessagesPane().postMessage( + "\n" + name + ": execution terminated by null instruction.\n\n"); + mainUI.getMessagesPane().postRunMessage( + "\n-- program is finished running (dropped off bottom) --\n\n"); + mainUI.getMessagesPane().selectRunMessageTab(); + break; + case EXCEPTION: + SimulationException pe = notice.getException(); + mainUI.getMessagesPane().postMessage( + pe.error().generateReport()); + mainUI.getMessagesPane().postMessage( + "\n" + name + ": execution terminated with errors.\n\n"); + mainUI.getMessagesPane().postRunMessage("\n"+pe.error().getMessage()); + break; + case STOP: + mainUI.getMessagesPane().postMessage( + "\n" + name + ": execution terminated by user.\n\n"); + mainUI.getMessagesPane().selectMessageTab(); + break; + case MAX_STEPS: + int maxSteps = notice.getMaxSteps(); + if (maxSteps != 1) { + // do not display something on Step Action + mainUI.getMessagesPane().postMessage( + "\n" + name + ": execution step limit of " + maxSteps + " exceeded.\n\n"); + mainUI.getMessagesPane().selectMessageTab(); + } + break; + case BREAKPOINT: + mainUI.getMessagesPane().postMessage( + "\n" + name + ": execution paused at breakpoint: " + FileStatus.getFile().getName() + "\n\n"); + break; + case PAUSE: + mainUI.getMessagesPane().postMessage( + "\n" + name + ": execution paused by user: " + FileStatus.getFile().getName() + "\n\n"); + break; + default: + // Ne devrait pas arriver + throw new IllegalStateException("Unexpected value: " + reason); + } + + mainUI.setReset(false); + } + /** * To set whether the register values are reset. * diff --git a/src/rars/venus/run/RunGoAction.java b/src/rars/venus/run/RunGoAction.java index 7aa58a67..0fdd2329 100644 --- a/src/rars/venus/run/RunGoAction.java +++ b/src/rars/venus/run/RunGoAction.java @@ -54,8 +54,6 @@ public class RunGoAction extends GuiAction { public static int defaultMaxSteps = -1; // "forever", formerly 10000000; // 10 million public static int maxSteps = defaultMaxSteps; - private String name; - private ExecutePane executePane; private VenusUI mainUI; public RunGoAction(String name, Icon icon, String descrip, @@ -68,146 +66,26 @@ public RunGoAction(String name, Icon icon, String descrip, * Action to take when GO is selected -- run the MIPS program! */ public void actionPerformed(ActionEvent e) { - name = this.getValue(Action.NAME).toString(); - executePane = mainUI.getMainPane().getExecutePane(); - if (FileStatus.isAssembled()) { - if (!mainUI.getStarted()) { - mainUI.getMessagesPane().processProgramArgumentsIfAny(); // DPS 17-July-2008 - } - if (mainUI.getReset() || mainUI.getStarted()) { - - mainUI.setStarted(true); // added 8/27/05 - - mainUI.getMessagesPane().postMessage( - name + ": running " + FileStatus.getFile().getName() + "\n\n"); - mainUI.getMessagesPane().selectRunMessageTab(); - executePane.getTextSegmentWindow().setCodeHighlighting(false); - executePane.getTextSegmentWindow().unhighlightAllSteps(); - //clears highlight of registers and data segment if the run step was used before - executePane.getRegistersWindow().clearHighlighting(); - executePane.getDataSegmentWindow().clearHighlighting(); - //FileStatus.set(FileStatus.RUNNING); - mainUI.setMenuState(FileStatus.RUNNING); - - // Setup cleanup procedures for the simulation - final Observer stopListener = - new Observer() { - public void update(Observable o, Object simulator) { - SimulatorNotice notice = ((SimulatorNotice) simulator); - if (notice.getAction() != SimulatorNotice.SIMULATOR_STOP) return; - Simulator.Reason reason = notice.getReason(); - if (reason == Simulator.Reason.PAUSE || reason == Simulator.Reason.BREAKPOINT) { - EventQueue.invokeLater(()->paused(notice.getDone(), reason, notice.getException())); - } else { - EventQueue.invokeLater(()->stopped(notice.getException(), reason)); - } - o.deleteObserver(this); - } - }; - Simulator.getInstance().addObserver(stopListener); - - int[] breakPoints = executePane.getTextSegmentWindow().getSortedBreakPointsArray(); - Globals.program.startSimulation(maxSteps, breakPoints); - } else { - // This should never occur because at termination the Go and Step buttons are disabled. - JOptionPane.showMessageDialog(mainUI, "reset " + mainUI.getReset() + " started " + mainUI.getStarted());//"You must reset before you can execute the program again."); - } - } else { - // note: this should never occur since "Go" is only enabled after successful assembly. - JOptionPane.showMessageDialog(mainUI, "The program must be assembled before it can be run."); - } - } - - /** - * Method to be called when Pause is selected through menu/toolbar/shortcut. This should only - * happen when MIPS program is running (FileStatus.RUNNING). See VenusUI.java for enabled - * status of menu items based on FileStatus. Set GUI as if at breakpoint or executing - * step by step. - */ - - public void paused(boolean done, Simulator.Reason pauseReason, SimulationException pe) { - // I doubt this can happen (pause when execution finished), but if so treat it as stopped. - if (done) { - stopped(pe, Simulator.Reason.NORMAL_TERMINATION); + String name = this.getValue(Action.NAME).toString(); + if (!mainUI.onStartedSimulation(name)) { return; } - if (pauseReason == Simulator.Reason.BREAKPOINT) { - mainUI.getMessagesPane().postMessage( - name + ": execution paused at breakpoint: " + FileStatus.getFile().getName() + "\n\n"); - } else { - mainUI.getMessagesPane().postMessage( - name + ": execution paused by user: " + FileStatus.getFile().getName() + "\n\n"); - } - mainUI.getMessagesPane().selectMessageTab(); - executePane.getTextSegmentWindow().setCodeHighlighting(true); - executePane.getTextSegmentWindow().highlightStepAtPC(); - executePane.getRegistersWindow().updateRegisters(); - executePane.getFloatingPointWindow().updateRegisters(); - executePane.getControlAndStatusWindow().updateRegisters(); - executePane.getDataSegmentWindow().updateValues(); - FileStatus.set(FileStatus.RUNNABLE); - mainUI.setReset(false); - } - - /** - * Method to be called when Stop is selected through menu/toolbar/shortcut. This should only - * happen when MIPS program is running (FileStatus.RUNNING). See VenusUI.java for enabled - * status of menu items based on FileStatus. Display finalized values as if execution - * terminated due to completion or exception. - */ - public void stopped(SimulationException pe, Simulator.Reason reason) { - // show final register and data segment values. - executePane.getRegistersWindow().updateRegisters(); - executePane.getFloatingPointWindow().updateRegisters(); - executePane.getControlAndStatusWindow().updateRegisters(); - executePane.getDataSegmentWindow().updateValues(); - FileStatus.set(FileStatus.TERMINATED); - SystemIO.resetFiles(); // close any files opened in MIPS program - if (pe != null) { - // Do not bring CSRs to the front if terminated due to exception. - // It's annoying, and confusing for the beginners - executePane.getTextSegmentWindow().setCodeHighlighting(true); - executePane.getTextSegmentWindow().unhighlightAllSteps(); - executePane.getTextSegmentWindow().highlightStepAtAddress(RegisterFile.getProgramCounter() - 4); - } - switch (reason) { - case NORMAL_TERMINATION: - mainUI.getMessagesPane().postMessage( - "\n" + name + ": execution completed successfully.\n\n"); - mainUI.getMessagesPane().postRunMessage( - "\n-- program is finished running (" + Globals.exitCode + ") --\n\n"); - mainUI.getMessagesPane().selectRunMessageTab(); - break; - case CLIFF_TERMINATION: - mainUI.getMessagesPane().postMessage( - "\n" + name + ": execution terminated by null instruction.\n\n"); - mainUI.getMessagesPane().postRunMessage( - "\n-- program is finished running (dropped off bottom) --\n\n"); - mainUI.getMessagesPane().selectRunMessageTab(); - break; - case EXCEPTION: - mainUI.getMessagesPane().postMessage( - pe.error().generateReport()); - mainUI.getMessagesPane().postMessage( - "\n" + name + ": execution terminated with errors.\n\n"); - mainUI.getMessagesPane().postRunMessage("\n"+pe.error().getMessage()); - break; - case STOP: - mainUI.getMessagesPane().postMessage( - "\n" + name + ": execution terminated by user.\n\n"); - mainUI.getMessagesPane().selectMessageTab(); - break; - case MAX_STEPS: - mainUI.getMessagesPane().postMessage( - "\n" + name + ": execution step limit of " + maxSteps + " exceeded.\n\n"); - mainUI.getMessagesPane().selectMessageTab(); - break; - default: - // should never get here, because the other two cases are covered by paused() - } - RunGoAction.resetMaxSteps(); - mainUI.setReset(false); + // Setup cleanup procedures for the simulation + final Observer stopListener = + new Observer() { + public void update(Observable o, Object simulator) { + SimulatorNotice notice = ((SimulatorNotice) simulator); + if (notice.getAction() != SimulatorNotice.SIMULATOR_STOP) return; + EventQueue.invokeLater(() -> mainUI.onStoppedSimulation(name, notice)); + o.deleteObserver(this); + } + }; + Simulator.getInstance().addObserver(stopListener); + + ExecutePane executePane = mainUI.getMainPane().getExecutePane(); + int[] breakPoints = executePane.getTextSegmentWindow().getSortedBreakPointsArray(); + Globals.program.startSimulation(maxSteps, breakPoints); } /** diff --git a/src/rars/venus/run/RunStepAction.java b/src/rars/venus/run/RunStepAction.java index 8e4b07cb..932add5d 100644 --- a/src/rars/venus/run/RunStepAction.java +++ b/src/rars/venus/run/RunStepAction.java @@ -51,8 +51,6 @@ a copy of this software and associated documentation files (the */ public class RunStepAction extends GuiAction { - private String name; - private ExecutePane executePane; private VenusUI mainUI; public RunStepAction(String name, Icon icon, String descrip, @@ -65,79 +63,22 @@ public RunStepAction(String name, Icon icon, String descrip, * perform next simulated instruction step. */ public void actionPerformed(ActionEvent e) { - name = this.getValue(Action.NAME).toString(); - executePane = mainUI.getMainPane().getExecutePane(); - if (FileStatus.isAssembled()) { - if (!mainUI.getStarted()) { // DPS 17-July-2008 - mainUI.getMessagesPane().processProgramArgumentsIfAny(); - } - mainUI.setStarted(true); - mainUI.getMessagesPane().selectRunMessageTab(); - executePane.getTextSegmentWindow().setCodeHighlighting(true); - - // Setup callback for after step finishes - final Observer stopListener = - new Observer() { - public void update(Observable o, Object simulator) { - SimulatorNotice notice = ((SimulatorNotice) simulator); - if (notice.getAction() != SimulatorNotice.SIMULATOR_STOP) return; - EventQueue.invokeLater(() -> stepped(notice.getDone(), notice.getReason(), notice.getException())); - o.deleteObserver(this); - } - }; - Simulator.getInstance().addObserver(stopListener); - //clears highlight of previous step - executePane.getRegistersWindow().clearHighlighting(); - executePane.getFloatingPointWindow().clearHighlighting(); - executePane.getControlAndStatusWindow().clearHighlighting(); - executePane.getDataSegmentWindow().clearHighlighting(); - - Globals.program.startSimulation(1, null); - } else { - // note: this should never occur since "Step" is only enabled after successful assembly. - JOptionPane.showMessageDialog(mainUI, "The program must be assembled before it can be run."); + String name = this.getValue(Action.NAME).toString(); + if (!mainUI.onStartedSimulation(name)) { + return; } - } - // When step is completed, control returns here (from execution thread, indirectly) - // to update the GUI. - public void stepped(boolean done, Simulator.Reason reason, SimulationException pe) { - executePane.getRegistersWindow().updateRegisters(); - executePane.getFloatingPointWindow().updateRegisters(); - executePane.getControlAndStatusWindow().updateRegisters(); - executePane.getDataSegmentWindow().updateValues(); - if (!done) { - executePane.getTextSegmentWindow().highlightStepAtPC(); - FileStatus.set(FileStatus.RUNNABLE); - } - if (done) { - RunGoAction.resetMaxSteps(); - executePane.getTextSegmentWindow().unhighlightAllSteps(); - executePane.getTextSegmentWindow().setCodeHighlighting(false); - FileStatus.set(FileStatus.TERMINATED); - } - if (done && pe == null) { - mainUI.getMessagesPane().postMessage( - "\n" + name + ": execution " + - ((reason == Simulator.Reason.CLIFF_TERMINATION) ? "terminated due to null instruction." - : "completed successfully.") + "\n\n"); - mainUI.getMessagesPane().postRunMessage( - "\n-- program is finished running" + - ((reason == Simulator.Reason.CLIFF_TERMINATION) ? "(dropped off bottom)" : " (" + Globals.exitCode + ")") + " --\n\n"); - mainUI.getMessagesPane().selectRunMessageTab(); - } - if (pe != null) { - RunGoAction.resetMaxSteps(); - mainUI.getMessagesPane().postMessage( - pe.error().generateReport()); - mainUI.getMessagesPane().postMessage( - "\n" + name + ": execution terminated with errors.\n\n"); - mainUI.getMessagesPane().postRunMessage("\n"+pe.error().getMessage()); - FileStatus.set(FileStatus.TERMINATED); // should be redundant. - executePane.getTextSegmentWindow().setCodeHighlighting(true); - executePane.getTextSegmentWindow().unhighlightAllSteps(); - executePane.getTextSegmentWindow().highlightStepAtAddress(RegisterFile.getProgramCounter() - 4); - } - mainUI.setReset(false); + // Setup callback for after step finishes + final Observer stopListener = + new Observer() { + public void update(Observable o, Object simulator) { + SimulatorNotice notice = ((SimulatorNotice) simulator); + if (notice.getAction() != SimulatorNotice.SIMULATOR_STOP) return; + EventQueue.invokeLater(() -> mainUI.onStoppedSimulation(name, notice)); + o.deleteObserver(this); + } + }; + Simulator.getInstance().addObserver(stopListener); + Globals.program.startSimulation(1, null); } -} \ No newline at end of file +} From 93f3544531ae24e34362e039d0318a448fd68139 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 15 Jul 2024 12:40:25 -0400 Subject: [PATCH 128/199] ui: set FileStatus.RUNNING on GoAction only (not StepAction) --- src/rars/venus/VenusUI.java | 2 -- src/rars/venus/run/RunGoAction.java | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index 6496f522..c47981d5 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -1081,8 +1081,6 @@ public boolean onStartedSimulation(String name) { executePane.getFloatingPointWindow().clearHighlighting(); executePane.getControlAndStatusWindow().clearHighlighting(); executePane.getDataSegmentWindow().clearHighlighting(); - //FileStatus.set(FileStatus.RUNNING); - setMenuState(FileStatus.RUNNING); return true; } diff --git a/src/rars/venus/run/RunGoAction.java b/src/rars/venus/run/RunGoAction.java index 0fdd2329..8f8a7894 100644 --- a/src/rars/venus/run/RunGoAction.java +++ b/src/rars/venus/run/RunGoAction.java @@ -70,6 +70,7 @@ public void actionPerformed(ActionEvent e) { if (!mainUI.onStartedSimulation(name)) { return; } + mainUI.setMenuState(FileStatus.RUNNING); // Setup cleanup procedures for the simulation final Observer stopListener = From 8b49b38aa197c9544e8c0ebd87e511af3ee65a0d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 12:59:11 -0400 Subject: [PATCH 129/199] tests: add exit code information to existing tests --- test/align.s | 1 + test/csr.s | 1 + test/dword.s | 1 + test/eqv_char.s | 1 + test/exception.s | 1 + test/jalr.s | 1 + test/literal.s | 1 + test/loop.s | 1 + test/memory.s | 1 + test/read.s | 1 + test/readchar.s | 1 + test/readstring.s | 1 + test/riscv-tests-64/add.s | 1 + test/riscv-tests-64/addi.s | 1 + test/riscv-tests-64/addiw.s | 1 + test/riscv-tests-64/addw.s | 1 + test/riscv-tests-64/and.s | 1 + test/riscv-tests-64/andi.s | 1 + test/riscv-tests-64/lb.s | 1 + test/riscv-tests-64/lbu.s | 1 + test/riscv-tests-64/ld.s | 1 + test/riscv-tests-64/lh.s | 1 + test/riscv-tests-64/lhu.s | 1 + test/riscv-tests-64/lui.s | 1 + test/riscv-tests-64/lw.s | 1 + test/riscv-tests-64/lwu.s | 1 + test/riscv-tests-64/or.s | 1 + test/riscv-tests-64/ori.s | 1 + test/riscv-tests-64/sb.s | 1 + test/riscv-tests-64/sd.s | 1 + test/riscv-tests-64/sh.s | 1 + test/riscv-tests-64/simple.s | 1 + test/riscv-tests-64/sll.s | 1 + test/riscv-tests-64/slli.s | 1 + test/riscv-tests-64/slliw.s | 1 + test/riscv-tests-64/sllw.s | 1 + test/riscv-tests-64/slt.s | 1 + test/riscv-tests-64/slti.s | 1 + test/riscv-tests-64/sltiu.s | 1 + test/riscv-tests-64/sltu.s | 1 + test/riscv-tests-64/sra.s | 1 + test/riscv-tests-64/srai.s | 1 + test/riscv-tests-64/sraiw.s | 1 + test/riscv-tests-64/sraw.s | 1 + test/riscv-tests-64/srl.s | 1 + test/riscv-tests-64/srli.s | 1 + test/riscv-tests-64/srliw.s | 1 + test/riscv-tests-64/srlw.s | 1 + test/riscv-tests-64/sub.s | 1 + test/riscv-tests-64/subw.s | 1 + test/riscv-tests-64/sw.s | 1 + test/riscv-tests-64/sysprintint.s | 1 + test/riscv-tests-64/sysreadint.s | 1 + test/riscv-tests-64/xor.s | 1 + test/riscv-tests-64/xori.s | 1 + test/riscv-tests/add.s | 1 + test/riscv-tests/addi.s | 1 + test/riscv-tests/and.s | 1 + test/riscv-tests/andi.s | 1 + test/riscv-tests/div.s | 1 + test/riscv-tests/divu.s | 1 + test/riscv-tests/fadd.s | 1 + test/riscv-tests/faddd.s | 1 + test/riscv-tests/fclass.s | 1 + test/riscv-tests/fclassd.s | 1 + test/riscv-tests/fcmp.s | 1 + test/riscv-tests/fcmpd.s | 1 + test/riscv-tests/fcvt.s | 1 + test/riscv-tests/fcvt_w.s | 1 + test/riscv-tests/fcvt_wd.s | 1 + test/riscv-tests/fcvtd.s | 1 + test/riscv-tests/fdiv.s | 1 + test/riscv-tests/fdivd.s | 1 + test/riscv-tests/fmadd.s | 1 + test/riscv-tests/fmaddd.s | 1 + test/riscv-tests/fmin.s | 1 + test/riscv-tests/fmind.s | 1 + test/riscv-tests/ldst.s | 1 + test/riscv-tests/ldstd.s | 1 + test/riscv-tests/lui.s | 1 + test/riscv-tests/move.s | 1 + test/riscv-tests/mul.s | 1 + test/riscv-tests/mulh.s | 1 + test/riscv-tests/mulhsu.s | 1 + test/riscv-tests/mulhu.s | 1 + test/riscv-tests/or.s | 1 + test/riscv-tests/ori.s | 1 + test/riscv-tests/recoding.s | 1 + test/riscv-tests/recodingd.s | 1 + test/riscv-tests/rem.s | 1 + test/riscv-tests/remu.s | 1 + test/riscv-tests/simple.s | 1 + test/riscv-tests/sll.s | 1 + test/riscv-tests/slli.s | 1 + test/riscv-tests/slt.s | 1 + test/riscv-tests/slti.s | 1 + test/riscv-tests/sltiu.s | 1 + test/riscv-tests/sltu.s | 1 + test/riscv-tests/sra.s | 1 + test/riscv-tests/srai.s | 1 + test/riscv-tests/srl.s | 1 + test/riscv-tests/srli.s | 1 + test/riscv-tests/sub.s | 1 + test/riscv-tests/sysprintint.s | 1 + test/riscv-tests/xor.s | 1 + test/riscv-tests/xori.s | 1 + test/selfmod.s | 3 +-- test/success.s | 1 + test/unicode.s | 1 + test/unicode_fail.s | 3 ++- 110 files changed, 111 insertions(+), 3 deletions(-) diff --git a/test/align.s b/test/align.s index ecbb04f6..9bccc42c 100644 --- a/test/align.s +++ b/test/align.s @@ -1,3 +1,4 @@ +#exit:42 .data # autoalign by default z: .byte 0x11 diff --git a/test/csr.s b/test/csr.s index 6114b966..ea25a774 100644 --- a/test/csr.s +++ b/test/csr.s @@ -1,3 +1,4 @@ +#exit:42 .globl main .text main: diff --git a/test/dword.s b/test/dword.s index ffb04b88..147f8536 100644 --- a/test/dword.s +++ b/test/dword.s @@ -1,4 +1,5 @@ #stdout:87654321HGFEDCBA2685009920 +#exit:42 .data data: .eqv eqv, 0x3132333435363738 diff --git a/test/eqv_char.s b/test/eqv_char.s index 6fa33629..a80e231f 100644 --- a/test/eqv_char.s +++ b/test/eqv_char.s @@ -1,3 +1,4 @@ +#exit:42 .eqv SUBSTITUTE, 'a' # a is 97 .text diff --git a/test/exception.s b/test/exception.s index 60dccda8..ec8029f8 100644 --- a/test/exception.s +++ b/test/exception.s @@ -1,3 +1,4 @@ +#exit:42 .globl main .text main: diff --git a/test/jalr.s b/test/jalr.s index 3c3ae660..89383a14 100644 --- a/test/jalr.s +++ b/test/jalr.s @@ -1,3 +1,4 @@ +#exit:42 .globl main .text main: diff --git a/test/literal.s b/test/literal.s index 9341822e..a4065510 100644 --- a/test/literal.s +++ b/test/literal.s @@ -1,4 +1,5 @@ #stdout:168 +#exit:42 .text main: li a0, 42 diff --git a/test/loop.s b/test/loop.s index a7c8ceeb..4f9ea6d1 100644 --- a/test/loop.s +++ b/test/loop.s @@ -1,3 +1,4 @@ +#exit:42 .globl main .text main: diff --git a/test/memory.s b/test/memory.s index 2378a8ea..287129ea 100644 --- a/test/memory.s +++ b/test/memory.s @@ -1,3 +1,4 @@ +#exit:42 .globl main .data buffer: .space 8 diff --git a/test/read.s b/test/read.s index 7efc0b94..ef978633 100644 --- a/test/read.s +++ b/test/read.s @@ -1,5 +1,6 @@ #stdin:hello\nworldXremain #stdout:11hello\nworld....\n1Xello\nworld....\n0Xello\nworld....\n6remainworld....\n0remainworld....\n +#exit:42 .eqv PrintInt, 1 .eqv Read, 63 diff --git a/test/readchar.s b/test/readchar.s index db755f8b..f1528981 100644 --- a/test/readchar.s +++ b/test/readchar.s @@ -1,5 +1,6 @@ #stdin:a b\n\n! #stdout:97a32 98b10\n10\n33!-1�-1� +#exit:42 .eqv PrintInt, 1 .eqv ReadChar, 12 diff --git a/test/readstring.s b/test/readstring.s index f70fab1b..386c0086 100644 --- a/test/readstring.s +++ b/test/readstring.s @@ -1,5 +1,6 @@ #stdin:hello\n\nworldNOTWORLD\nXXXX\nYYYY\nremain #stdout:0hello\n1\n2world34A5remain\n6\n +#exit:42 .eqv PrintInt, 1 .eqv ReadString, 8 diff --git a/test/riscv-tests-64/add.s b/test/riscv-tests-64/add.s index 34f228c7..a196c14d 100644 --- a/test/riscv-tests-64/add.s +++ b/test/riscv-tests-64/add.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/add.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # add.S diff --git a/test/riscv-tests-64/addi.s b/test/riscv-tests-64/addi.s index f314e968..fadcebda 100644 --- a/test/riscv-tests-64/addi.s +++ b/test/riscv-tests-64/addi.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/addi.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # addi.S diff --git a/test/riscv-tests-64/addiw.s b/test/riscv-tests-64/addiw.s index b1c18c80..aa4b78aa 100644 --- a/test/riscv-tests-64/addiw.s +++ b/test/riscv-tests-64/addiw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/addiw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # addiw.S diff --git a/test/riscv-tests-64/addw.s b/test/riscv-tests-64/addw.s index b4d88385..a078e5ae 100644 --- a/test/riscv-tests-64/addw.s +++ b/test/riscv-tests-64/addw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/addw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # addw.S diff --git a/test/riscv-tests-64/and.s b/test/riscv-tests-64/and.s index f5347f25..c34363c6 100644 --- a/test/riscv-tests-64/and.s +++ b/test/riscv-tests-64/and.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/and.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # and.S diff --git a/test/riscv-tests-64/andi.s b/test/riscv-tests-64/andi.s index 676475b3..0cee3a22 100644 --- a/test/riscv-tests-64/andi.s +++ b/test/riscv-tests-64/andi.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/andi.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # andi.S diff --git a/test/riscv-tests-64/lb.s b/test/riscv-tests-64/lb.s index d91c8534..f8c45afc 100644 --- a/test/riscv-tests-64/lb.s +++ b/test/riscv-tests-64/lb.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/lb.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # lb.S diff --git a/test/riscv-tests-64/lbu.s b/test/riscv-tests-64/lbu.s index 71baf4eb..a03c3a04 100644 --- a/test/riscv-tests-64/lbu.s +++ b/test/riscv-tests-64/lbu.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/lbu.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # lbu.S diff --git a/test/riscv-tests-64/ld.s b/test/riscv-tests-64/ld.s index 0e142ffd..f04ac62d 100644 --- a/test/riscv-tests-64/ld.s +++ b/test/riscv-tests-64/ld.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/ld.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # ld.S diff --git a/test/riscv-tests-64/lh.s b/test/riscv-tests-64/lh.s index 9006d3fe..cf8bb874 100644 --- a/test/riscv-tests-64/lh.s +++ b/test/riscv-tests-64/lh.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/lh.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # lh.S diff --git a/test/riscv-tests-64/lhu.s b/test/riscv-tests-64/lhu.s index bf98af12..387eaa09 100644 --- a/test/riscv-tests-64/lhu.s +++ b/test/riscv-tests-64/lhu.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/lhu.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # lhu.S diff --git a/test/riscv-tests-64/lui.s b/test/riscv-tests-64/lui.s index 00759079..62ceb999 100644 --- a/test/riscv-tests-64/lui.s +++ b/test/riscv-tests-64/lui.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/lui.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # lui.S diff --git a/test/riscv-tests-64/lw.s b/test/riscv-tests-64/lw.s index 75e71ecf..33d2c9be 100644 --- a/test/riscv-tests-64/lw.s +++ b/test/riscv-tests-64/lw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/lw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # lw.S diff --git a/test/riscv-tests-64/lwu.s b/test/riscv-tests-64/lwu.s index 03f1248c..502c2418 100644 --- a/test/riscv-tests-64/lwu.s +++ b/test/riscv-tests-64/lwu.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/lwu.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # lwu.S diff --git a/test/riscv-tests-64/or.s b/test/riscv-tests-64/or.s index 730060ab..7784524f 100644 --- a/test/riscv-tests-64/or.s +++ b/test/riscv-tests-64/or.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/or.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # or.S diff --git a/test/riscv-tests-64/ori.s b/test/riscv-tests-64/ori.s index 470bd2c2..4d129fb1 100644 --- a/test/riscv-tests-64/ori.s +++ b/test/riscv-tests-64/ori.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/ori.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # ori.S diff --git a/test/riscv-tests-64/sb.s b/test/riscv-tests-64/sb.s index cc6761de..3f9f6422 100644 --- a/test/riscv-tests-64/sb.s +++ b/test/riscv-tests-64/sb.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sb.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sb.S diff --git a/test/riscv-tests-64/sd.s b/test/riscv-tests-64/sd.s index 6818aa3b..4e10b49e 100644 --- a/test/riscv-tests-64/sd.s +++ b/test/riscv-tests-64/sd.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sd.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sd.S diff --git a/test/riscv-tests-64/sh.s b/test/riscv-tests-64/sh.s index 7bdebece..87f30dbe 100644 --- a/test/riscv-tests-64/sh.s +++ b/test/riscv-tests-64/sh.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sh.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sh.S diff --git a/test/riscv-tests-64/simple.s b/test/riscv-tests-64/simple.s index f8baa736..ca3ff60b 100644 --- a/test/riscv-tests-64/simple.s +++ b/test/riscv-tests-64/simple.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/simple.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # simple.S diff --git a/test/riscv-tests-64/sll.s b/test/riscv-tests-64/sll.s index 641e90be..cd39f512 100644 --- a/test/riscv-tests-64/sll.s +++ b/test/riscv-tests-64/sll.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sll.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sll.S diff --git a/test/riscv-tests-64/slli.s b/test/riscv-tests-64/slli.s index 0829bfe5..1e58724b 100644 --- a/test/riscv-tests-64/slli.s +++ b/test/riscv-tests-64/slli.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/slli.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # slli.S diff --git a/test/riscv-tests-64/slliw.s b/test/riscv-tests-64/slliw.s index 95875b23..930c7e27 100644 --- a/test/riscv-tests-64/slliw.s +++ b/test/riscv-tests-64/slliw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/slliw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # slliw.S diff --git a/test/riscv-tests-64/sllw.s b/test/riscv-tests-64/sllw.s index 6697920f..934961cc 100644 --- a/test/riscv-tests-64/sllw.s +++ b/test/riscv-tests-64/sllw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sllw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sllw.S diff --git a/test/riscv-tests-64/slt.s b/test/riscv-tests-64/slt.s index 28431cbc..71130526 100644 --- a/test/riscv-tests-64/slt.s +++ b/test/riscv-tests-64/slt.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/slt.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # slt.S diff --git a/test/riscv-tests-64/slti.s b/test/riscv-tests-64/slti.s index d490e4b8..ca44d723 100644 --- a/test/riscv-tests-64/slti.s +++ b/test/riscv-tests-64/slti.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/slti.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # slti.S diff --git a/test/riscv-tests-64/sltiu.s b/test/riscv-tests-64/sltiu.s index b06d633e..a29b042e 100644 --- a/test/riscv-tests-64/sltiu.s +++ b/test/riscv-tests-64/sltiu.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sltiu.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sltiu.S diff --git a/test/riscv-tests-64/sltu.s b/test/riscv-tests-64/sltu.s index b804473b..d492e361 100644 --- a/test/riscv-tests-64/sltu.s +++ b/test/riscv-tests-64/sltu.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sltu.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sltu.S diff --git a/test/riscv-tests-64/sra.s b/test/riscv-tests-64/sra.s index a62be65d..c1ea62f0 100644 --- a/test/riscv-tests-64/sra.s +++ b/test/riscv-tests-64/sra.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sra.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sra.S diff --git a/test/riscv-tests-64/srai.s b/test/riscv-tests-64/srai.s index 9e54a162..736e170d 100644 --- a/test/riscv-tests-64/srai.s +++ b/test/riscv-tests-64/srai.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/srai.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # srai.S diff --git a/test/riscv-tests-64/sraiw.s b/test/riscv-tests-64/sraiw.s index 905c98b1..d079760c 100644 --- a/test/riscv-tests-64/sraiw.s +++ b/test/riscv-tests-64/sraiw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sraiw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sraiw.S diff --git a/test/riscv-tests-64/sraw.s b/test/riscv-tests-64/sraw.s index 5792a850..9db63c81 100644 --- a/test/riscv-tests-64/sraw.s +++ b/test/riscv-tests-64/sraw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sraw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sraw.S diff --git a/test/riscv-tests-64/srl.s b/test/riscv-tests-64/srl.s index d921f591..30bb88c5 100644 --- a/test/riscv-tests-64/srl.s +++ b/test/riscv-tests-64/srl.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/srl.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # srl.S diff --git a/test/riscv-tests-64/srli.s b/test/riscv-tests-64/srli.s index 06b16d53..bf483a43 100644 --- a/test/riscv-tests-64/srli.s +++ b/test/riscv-tests-64/srli.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/srli.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # srli.S diff --git a/test/riscv-tests-64/srliw.s b/test/riscv-tests-64/srliw.s index 221b0734..fd0d6487 100644 --- a/test/riscv-tests-64/srliw.s +++ b/test/riscv-tests-64/srliw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/srliw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # srliw.S diff --git a/test/riscv-tests-64/srlw.s b/test/riscv-tests-64/srlw.s index 1d4b9a98..9854398d 100644 --- a/test/riscv-tests-64/srlw.s +++ b/test/riscv-tests-64/srlw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/srlw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # srlw.S diff --git a/test/riscv-tests-64/sub.s b/test/riscv-tests-64/sub.s index b4c8c578..55e43ea6 100644 --- a/test/riscv-tests-64/sub.s +++ b/test/riscv-tests-64/sub.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sub.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sub.S diff --git a/test/riscv-tests-64/subw.s b/test/riscv-tests-64/subw.s index 8f3ed515..7d69f9ac 100644 --- a/test/riscv-tests-64/subw.s +++ b/test/riscv-tests-64/subw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/subw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # subw.S diff --git a/test/riscv-tests-64/sw.s b/test/riscv-tests-64/sw.s index 4bcc8efe..0461d401 100644 --- a/test/riscv-tests-64/sw.s +++ b/test/riscv-tests-64/sw.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/sw.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # sw.S diff --git a/test/riscv-tests-64/sysprintint.s b/test/riscv-tests-64/sysprintint.s index 0334703a..d9e894e2 100644 --- a/test/riscv-tests-64/sysprintint.s +++ b/test/riscv-tests-64/sysprintint.s @@ -1,4 +1,5 @@ #stdout:2147483647 0x000000007fffffff 0000000000000000000000000000000001111111111111111111111111111111 2147483647\n2147483648 0x0000000080000000 0000000000000000000000000000000010000000000000000000000000000000 2147483648\n-2147483648 0xffffffff80000000 1111111111111111111111111111111110000000000000000000000000000000 18446744071562067968\n9223372036854775807 0x7fffffffffffffff 0111111111111111111111111111111111111111111111111111111111111111 9223372036854775807\n-9223372036854775808 0x8000000000000000 1000000000000000000000000000000000000000000000000000000000000000 9223372036854775808\n-9223372036854775808 0x8000000000000000 1000000000000000000000000000000000000000000000000000000000000000 9223372036854775808\n +#exit:42 li s0, 0x7FFFFFFF jal printAll addi s0, s0, 1 diff --git a/test/riscv-tests-64/sysreadint.s b/test/riscv-tests-64/sysreadint.s index 13556144..db620c27 100644 --- a/test/riscv-tests-64/sysreadint.s +++ b/test/riscv-tests-64/sysreadint.s @@ -1,4 +1,5 @@ #stdin:1\n-1\n123456789\n2410117871984078658\n +#exit:42 li a7, 5 # ReadInt ecall diff --git a/test/riscv-tests-64/xor.s b/test/riscv-tests-64/xor.s index 8d54f518..d91af8b1 100644 --- a/test/riscv-tests-64/xor.s +++ b/test/riscv-tests-64/xor.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/xor.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # xor.S diff --git a/test/riscv-tests-64/xori.s b/test/riscv-tests-64/xori.s index e3933b3c..65575920 100644 --- a/test/riscv-tests-64/xori.s +++ b/test/riscv-tests-64/xori.s @@ -6,6 +6,7 @@ # 32 "" 2 # 1 "isa/rv64ui/xori.S" # See LICENSE for license details. +#exit:42 #***************************************************************************** # xori.S diff --git a/test/riscv-tests/add.s b/test/riscv-tests/add.s index 96660e1b..86cec8a2 100644 --- a/test/riscv-tests/add.s +++ b/test/riscv-tests/add.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/addi.s b/test/riscv-tests/addi.s index 34194b01..4b3e4911 100644 --- a/test/riscv-tests/addi.s +++ b/test/riscv-tests/addi.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/and.s b/test/riscv-tests/and.s index 8e5a216b..fea45de2 100644 --- a/test/riscv-tests/and.s +++ b/test/riscv-tests/and.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/andi.s b/test/riscv-tests/andi.s index 74322ba0..febd181f 100644 --- a/test/riscv-tests/andi.s +++ b/test/riscv-tests/andi.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/div.s b/test/riscv-tests/div.s index 8e711c36..a4fb03aa 100644 --- a/test/riscv-tests/div.s +++ b/test/riscv-tests/div.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/divu.s b/test/riscv-tests/divu.s index 7914f648..338eba13 100644 --- a/test/riscv-tests/divu.s +++ b/test/riscv-tests/divu.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fadd.s b/test/riscv-tests/fadd.s index f4c75529..b0124687 100644 --- a/test/riscv-tests/fadd.s +++ b/test/riscv-tests/fadd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/faddd.s b/test/riscv-tests/faddd.s index ac054cbd..d2ff241c 100644 --- a/test/riscv-tests/faddd.s +++ b/test/riscv-tests/faddd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fclass.s b/test/riscv-tests/fclass.s index 3d4d61e9..506ce56c 100644 --- a/test/riscv-tests/fclass.s +++ b/test/riscv-tests/fclass.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fclassd.s b/test/riscv-tests/fclassd.s index 9add288f..eea3e81c 100644 --- a/test/riscv-tests/fclassd.s +++ b/test/riscv-tests/fclassd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fcmp.s b/test/riscv-tests/fcmp.s index cfa05ef5..d39e831e 100644 --- a/test/riscv-tests/fcmp.s +++ b/test/riscv-tests/fcmp.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fcmpd.s b/test/riscv-tests/fcmpd.s index f9c3a7d7..a04b864c 100644 --- a/test/riscv-tests/fcmpd.s +++ b/test/riscv-tests/fcmpd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/fcvt.s b/test/riscv-tests/fcvt.s index 57433257..c6725739 100644 --- a/test/riscv-tests/fcvt.s +++ b/test/riscv-tests/fcvt.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fcvt_w.s b/test/riscv-tests/fcvt_w.s index aaa9d441..ac6bdd93 100644 --- a/test/riscv-tests/fcvt_w.s +++ b/test/riscv-tests/fcvt_w.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fcvt_wd.s b/test/riscv-tests/fcvt_wd.s index 0453c5e1..a8bf1840 100644 --- a/test/riscv-tests/fcvt_wd.s +++ b/test/riscv-tests/fcvt_wd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fcvtd.s b/test/riscv-tests/fcvtd.s index a5ecc39a..1f4ea2ce 100644 --- a/test/riscv-tests/fcvtd.s +++ b/test/riscv-tests/fcvtd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/fdiv.s b/test/riscv-tests/fdiv.s index 5ff2e29e..0e509b39 100644 --- a/test/riscv-tests/fdiv.s +++ b/test/riscv-tests/fdiv.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fdivd.s b/test/riscv-tests/fdivd.s index 3709735d..952244a2 100644 --- a/test/riscv-tests/fdivd.s +++ b/test/riscv-tests/fdivd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/fmadd.s b/test/riscv-tests/fmadd.s index f5eeb6cc..4d927d86 100644 --- a/test/riscv-tests/fmadd.s +++ b/test/riscv-tests/fmadd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fmaddd.s b/test/riscv-tests/fmaddd.s index b3ded18e..98b76e13 100644 --- a/test/riscv-tests/fmaddd.s +++ b/test/riscv-tests/fmaddd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/fmin.s b/test/riscv-tests/fmin.s index 67eb0161..5d141a91 100644 --- a/test/riscv-tests/fmin.s +++ b/test/riscv-tests/fmin.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/fmind.s b/test/riscv-tests/fmind.s index 7aa523bd..51b7cfea 100644 --- a/test/riscv-tests/fmind.s +++ b/test/riscv-tests/fmind.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/ldst.s b/test/riscv-tests/ldst.s index 56eabe0a..abb5e2b8 100644 --- a/test/riscv-tests/ldst.s +++ b/test/riscv-tests/ldst.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/ldstd.s b/test/riscv-tests/ldstd.s index eeac3596..606cc760 100644 --- a/test/riscv-tests/ldstd.s +++ b/test/riscv-tests/ldstd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: la s0, tdat diff --git a/test/riscv-tests/lui.s b/test/riscv-tests/lui.s index 57f5808e..03cd50ec 100644 --- a/test/riscv-tests/lui.s +++ b/test/riscv-tests/lui.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/move.s b/test/riscv-tests/move.s index dc37a21f..52a9f5c3 100644 --- a/test/riscv-tests/move.s +++ b/test/riscv-tests/move.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/mul.s b/test/riscv-tests/mul.s index 2171ef57..1a825283 100644 --- a/test/riscv-tests/mul.s +++ b/test/riscv-tests/mul.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/mulh.s b/test/riscv-tests/mulh.s index 27cca46a..e112d0eb 100644 --- a/test/riscv-tests/mulh.s +++ b/test/riscv-tests/mulh.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/mulhsu.s b/test/riscv-tests/mulhsu.s index 749070ea..25f9e5eb 100644 --- a/test/riscv-tests/mulhsu.s +++ b/test/riscv-tests/mulhsu.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/mulhu.s b/test/riscv-tests/mulhu.s index 15badc35..9e167f6a 100644 --- a/test/riscv-tests/mulhu.s +++ b/test/riscv-tests/mulhu.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/or.s b/test/riscv-tests/or.s index 9df72ae5..58def350 100644 --- a/test/riscv-tests/or.s +++ b/test/riscv-tests/or.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/ori.s b/test/riscv-tests/ori.s index 3d1b357b..8d828c6f 100644 --- a/test/riscv-tests/ori.s +++ b/test/riscv-tests/ori.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/recoding.s b/test/riscv-tests/recoding.s index 6d1556a9..46540342 100644 --- a/test/riscv-tests/recoding.s +++ b/test/riscv-tests/recoding.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/recodingd.s b/test/riscv-tests/recodingd.s index d1920680..c0d60cd3 100644 --- a/test/riscv-tests/recodingd.s +++ b/test/riscv-tests/recodingd.s @@ -1,3 +1,4 @@ +#exit:42 .text main: # Make sure infinities with different mantissas compare as equal. diff --git a/test/riscv-tests/rem.s b/test/riscv-tests/rem.s index b5239b38..6353cb46 100644 --- a/test/riscv-tests/rem.s +++ b/test/riscv-tests/rem.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/remu.s b/test/riscv-tests/remu.s index 1af97405..472d757b 100644 --- a/test/riscv-tests/remu.s +++ b/test/riscv-tests/remu.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/simple.s b/test/riscv-tests/simple.s index bc068447..e62dc7bf 100644 --- a/test/riscv-tests/simple.s +++ b/test/riscv-tests/simple.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/sll.s b/test/riscv-tests/sll.s index 85ed8220..6e6171da 100644 --- a/test/riscv-tests/sll.s +++ b/test/riscv-tests/sll.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/slli.s b/test/riscv-tests/slli.s index a7109bbf..84025740 100644 --- a/test/riscv-tests/slli.s +++ b/test/riscv-tests/slli.s @@ -1,3 +1,4 @@ +#exit:42 .text main: #------------------------------------------------------------- diff --git a/test/riscv-tests/slt.s b/test/riscv-tests/slt.s index e580ff23..8936cf5f 100644 --- a/test/riscv-tests/slt.s +++ b/test/riscv-tests/slt.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/slti.s b/test/riscv-tests/slti.s index 3959b131..df674bdf 100644 --- a/test/riscv-tests/slti.s +++ b/test/riscv-tests/slti.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/sltiu.s b/test/riscv-tests/sltiu.s index 9237f737..981cc213 100644 --- a/test/riscv-tests/sltiu.s +++ b/test/riscv-tests/sltiu.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/sltu.s b/test/riscv-tests/sltu.s index 8dcdf365..89b0db6d 100644 --- a/test/riscv-tests/sltu.s +++ b/test/riscv-tests/sltu.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/sra.s b/test/riscv-tests/sra.s index 9c84b7e1..0f666127 100644 --- a/test/riscv-tests/sra.s +++ b/test/riscv-tests/sra.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/srai.s b/test/riscv-tests/srai.s index 59478bb9..58230593 100644 --- a/test/riscv-tests/srai.s +++ b/test/riscv-tests/srai.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/srl.s b/test/riscv-tests/srl.s index ebce5af7..cb6b2151 100644 --- a/test/riscv-tests/srl.s +++ b/test/riscv-tests/srl.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/srli.s b/test/riscv-tests/srli.s index e0c1251c..4bb744ec 100644 --- a/test/riscv-tests/srli.s +++ b/test/riscv-tests/srli.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/sub.s b/test/riscv-tests/sub.s index 7dbe7b6b..35c8131b 100644 --- a/test/riscv-tests/sub.s +++ b/test/riscv-tests/sub.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/sysprintint.s b/test/riscv-tests/sysprintint.s index 0172ad92..cee887d1 100644 --- a/test/riscv-tests/sysprintint.s +++ b/test/riscv-tests/sysprintint.s @@ -1,4 +1,5 @@ #stdout:2147483647 0x7fffffff 01111111111111111111111111111111 2147483647\n-2147483648 0x80000000 10000000000000000000000000000000 2147483648\n-2147483648 0x80000000 10000000000000000000000000000000 2147483648\n +#exit:42 li s0, 0x7FFFFFFF jal printAll addi s0, s0, 1 diff --git a/test/riscv-tests/xor.s b/test/riscv-tests/xor.s index f64ebcdb..89277ec3 100644 --- a/test/riscv-tests/xor.s +++ b/test/riscv-tests/xor.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/riscv-tests/xori.s b/test/riscv-tests/xori.s index b87a140b..8e4cad2c 100644 --- a/test/riscv-tests/xori.s +++ b/test/riscv-tests/xori.s @@ -1,3 +1,4 @@ +#exit:42 .text main: diff --git a/test/selfmod.s b/test/selfmod.s index 94b9f320..a317e4c5 100644 --- a/test/selfmod.s +++ b/test/selfmod.s @@ -1,5 +1,4 @@ - -# TODO: make this run with self modifications +#exit:42 .text main: la s0, toload diff --git a/test/success.s b/test/success.s index c100f7e3..73b4ecce 100644 --- a/test/success.s +++ b/test/success.s @@ -1,3 +1,4 @@ +#exit:42 .globl main .text main: diff --git a/test/unicode.s b/test/unicode.s index 715eef82..b0aa5f51 100644 --- a/test/unicode.s +++ b/test/unicode.s @@ -1,4 +1,5 @@ #stdout:© █ T ★ \n +#exit:42 .data test1: .string "© █ \u0054 \u2605 \n" diff --git a/test/unicode_fail.s b/test/unicode_fail.s index 03633e33..dd4dbe3b 100644 --- a/test/unicode_fail.s +++ b/test/unicode_fail.s @@ -1,4 +1,5 @@ -#error on lines: 4 +#error on lines: 5 +#exit:42 .data test1: .string "© █ \u0054 \u2605 \n\u37" From 628953bd1b0afd3c277e478954e652280655872c Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 13:05:01 -0400 Subject: [PATCH 130/199] tests: add custom expected exit code. default to 0 --- test/Test.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/Test.java b/test/Test.java index b324f126..6385b023 100644 --- a/test/Test.java +++ b/test/Test.java @@ -92,6 +92,7 @@ public void runFile(String path, Program p) { public static String run(String path, Program p){ int[] errorlines = null; String stdin = "", stdout = "", stderr =""; + int exitCode = 0; // TODO: better config system // This is just a temporary solution that should work for the tests I want to write try { @@ -110,6 +111,8 @@ public static String run(String path, Program p){ stdout = line.replaceFirst("#stdout:", "").replaceAll("\\\\n","\n").trim(); } else if (line.startsWith("#stderr:")) { stderr = line.replaceFirst("#stderr:", "").replaceAll("\\\\n","\n").trim(); + } else if (line.startsWith("#exit:")) { + exitCode = Integer.parseInt(line.replaceFirst("#exit:", "")); } line = br.readLine(); } @@ -128,8 +131,8 @@ public static String run(String path, Program p){ if(r != Simulator.Reason.NORMAL_TERMINATION){ return "Ended abnormally while executing " + path; }else{ - if(p.getExitCode() != 42) { - return "Final exit code was wrong for " + path; + if(p.getExitCode() != exitCode) { + return "Final exit code was wrong for " + path + "\n Expected "+exitCode+" got "+p.getExitCode(); } if(!p.getSTDOUT().trim().equals(stdout)){ return "STDOUT was wrong for " + path + "\n Expected \""+stdout+"\" got \""+p.getSTDOUT()+"\""; From a5db6c40e67cc41b775ba4d049902175377362f5 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 13:05:19 -0400 Subject: [PATCH 131/199] tests: verbose message on stderr mismatch --- test/Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test.java b/test/Test.java index 6385b023..cf9a9ad8 100644 --- a/test/Test.java +++ b/test/Test.java @@ -138,7 +138,7 @@ public static String run(String path, Program p){ return "STDOUT was wrong for " + path + "\n Expected \""+stdout+"\" got \""+p.getSTDOUT()+"\""; } if(!p.getSTDERR().trim().equals(stderr)){ - return "STDERR was wrong for " + path; + return "STDERR was wrong for " + path + "\n Expected \""+stderr+"\" got \""+p.getSTDERR()+"\""; } return ""; } From 644adfdbebacda6624a21fe65eca72f0ce0a5197 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 9 Jul 2024 11:53:08 -0400 Subject: [PATCH 132/199] tests: print information on abnormal terminaisons --- test/Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test.java b/test/Test.java index cf9a9ad8..35311da5 100644 --- a/test/Test.java +++ b/test/Test.java @@ -129,7 +129,7 @@ public static String run(String path, Program p){ p.setup(null,stdin); Simulator.Reason r = p.simulate(); if(r != Simulator.Reason.NORMAL_TERMINATION){ - return "Ended abnormally while executing " + path; + return "Ended abnormally " + r + " while executing " + path; }else{ if(p.getExitCode() != exitCode) { return "Final exit code was wrong for " + path + "\n Expected "+exitCode+" got "+p.getExitCode(); From 79e0322173cbe22bcebc5be9b655fb257b9c3e71 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 24 Jul 2024 13:58:23 -0400 Subject: [PATCH 133/199] add array to contain all text segment lines --- src/rars/RISCVprogram.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rars/RISCVprogram.java b/src/rars/RISCVprogram.java index 49ffaf66..3f9853a8 100644 --- a/src/rars/RISCVprogram.java +++ b/src/rars/RISCVprogram.java @@ -56,6 +56,7 @@ public class RISCVprogram { private ArrayList tokenList; private ArrayList parsedList; private ArrayList machineList; + private ArrayList textSegmentLines; private BackStepper backStepper; private SymbolTable localSymbolTable; private MacroPool macroPool; @@ -165,6 +166,10 @@ public ArrayList getMachineList() { return machineList; } + public ArrayList getTextSegmentLines() { + return textSegmentLines; + } + /** * Returns BackStepper associated with this program. It is created upon successful assembly. From 76f053c65f9f944132bf4652cdea308f85a165a3 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 24 Jul 2024 14:04:03 -0400 Subject: [PATCH 134/199] assemble method changed to add all source lines in new array --- src/rars/RISCVprogram.java | 12 ++++++++++- src/rars/assembler/Assembler.java | 33 +++++++++++++++++++------------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/rars/RISCVprogram.java b/src/rars/RISCVprogram.java index 3f9853a8..10f15019 100644 --- a/src/rars/RISCVprogram.java +++ b/src/rars/RISCVprogram.java @@ -143,6 +143,16 @@ public ArrayList createParsedList() { return parsedList; } + public ArrayList createMachineList() { + machineList = new ArrayList<>(); + return machineList; + } + + public ArrayList createTextSegmentLines() { + textSegmentLines = new ArrayList<>(); + return textSegmentLines; + } + /** * Produces existing list of parsed source code statements. * @@ -337,7 +347,7 @@ public ErrorList assemble(ArrayList programsToAssemble, boolean ex boolean warningsAreErrors) throws AssemblyException { this.backStepper = null; Assembler asm = new Assembler(); - this.machineList = asm.assemble(programsToAssemble, extendedAssemblerEnabled, warningsAreErrors); + asm.assemble(programsToAssemble, extendedAssemblerEnabled, warningsAreErrors, this); this.backStepper = new BackStepper(); return asm.getErrorList(); } diff --git a/src/rars/assembler/Assembler.java b/src/rars/assembler/Assembler.java index defe2fec..86ae99fe 100644 --- a/src/rars/assembler/Assembler.java +++ b/src/rars/assembler/Assembler.java @@ -88,17 +88,14 @@ public ErrorList getErrorList() { * considered errors and terminate the assemble; false means the * assembler will produce warning message but otherwise ignore * warnings. - * @return An ArrayList representing the assembled program. Each member of - * the list is a ProgramStatement object containing the source, - * intermediate, and machine binary representations of a program - * statement. Returns null if incoming array list is null or empty. + * @param programAssembled The whole program currently being assembled. * @see ProgramStatement **/ - public ArrayList assemble(ArrayList tokenizedProgramFiles, boolean extendedAssemblerEnabled, - boolean warningsAreErrors) throws AssemblyException { + public void assemble(ArrayList tokenizedProgramFiles, boolean extendedAssemblerEnabled, + boolean warningsAreErrors, RISCVprogram programAssembled) throws AssemblyException { if (tokenizedProgramFiles == null || tokenizedProgramFiles.size() == 0) - return null; + return; textAddress = new AddressSpace(Memory.textBaseAddress); dataAddress = new AddressSpace(Memory.dataBaseAddress); externAddress = Memory.externBaseAddress; @@ -106,7 +103,8 @@ public ArrayList assemble(ArrayList tokenizedPro accumulatedDataSegmentForwardReferences = new DataSegmentForwardReferences(); Globals.symbolTable.clear(); Globals.memory.clear(); - ArrayList machineList = new ArrayList<>(); + ArrayList machineList = programAssembled.createMachineList(); + ArrayList textSegmentLines = programAssembled.createTextSegmentLines(); this.errors = new ErrorList(); if (Globals.debug) System.out.println("Assembler first pass begins:"); @@ -136,6 +134,7 @@ public ArrayList assemble(ArrayList tokenizedPro // tokenList is an ArrayList of TokenList objects, one per source line; // each ArrayList in tokenList consists of Token objects. ArrayList sourceLineList = fileCurrentlyBeingAssembled.getSourceLineList(); + ArrayList sourceLines = fileCurrentlyBeingAssembled.getSourceList(); ArrayList tokenList = fileCurrentlyBeingAssembled.getTokenList(); ArrayList parsedList = fileCurrentlyBeingAssembled.createParsedList(); // each file keeps its own macro definitions @@ -156,6 +155,11 @@ public ArrayList assemble(ArrayList tokenizedPro extendedAssemblerEnabled); if (statements != null) { parsedList.addAll(statements); + } else if (!sourceLines.get(i).isBlank()) { //not an instruction and not a blank line + ProgramStatement programStatement = new ProgramStatement(sourceLineList.get(i).getRISCVprogram(), + sourceLines.get(i), tokenList.get(i), null, null, + -1, sourceLineList.get(i).getLineNumber()); + parsedList.add(programStatement); } } if (inMacroSegment) { @@ -197,13 +201,15 @@ public ArrayList assemble(ArrayList tokenizedPro this.fileCurrentlyBeingAssembled = program; ArrayList parsedList = fileCurrentlyBeingAssembled.getParsedList(); for (ProgramStatement statement : parsedList) { - statement.buildBasicStatementFromBasicInstruction(errors); + if (statement.getInstruction() != null) + statement.buildBasicStatementFromBasicInstruction(errors); if (errors.errorsOccurred()) { throw new AssemblyException(errors); } if (statement.getInstruction() instanceof BasicInstruction) { machineList.add(statement); - } else { + textSegmentLines.add(statement); + } else if (statement.getInstruction() != null) { // It is a pseudo-instruction: // 1. Fetch its basic instruction template list // 2. For each template in the list, @@ -266,9 +272,11 @@ public ArrayList assemble(ArrayList tokenizedPro textAddress.increment(Instruction.INSTRUCTION_LENGTH); ps.buildBasicStatementFromBasicInstruction(errors); machineList.add(ps); + textSegmentLines.add(ps); } // end of FOR loop, repeated for each template in list. - } // end of ELSE part for extended instruction. - + } else { + textSegmentLines.add(statement); //not an instruction + } } // end of assembler second pass. } if (Globals.debug) @@ -309,7 +317,6 @@ public ArrayList assemble(ArrayList tokenizedPro if (errors.errorsOccurred() || errors.warningsOccurred() && warningsAreErrors) { throw new AssemblyException(errors); } - return machineList; } // assemble() // ////////////////////////////////////////////////////////////////////// From c97744b2fba04b2dc6f30fa39638c7602a338bff Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 24 Jul 2024 14:05:04 -0400 Subject: [PATCH 135/199] change text segment table to have all source lines showed --- src/rars/venus/TextSegmentWindow.java | 119 +++++++++++++++++--------- 1 file changed, 79 insertions(+), 40 deletions(-) diff --git a/src/rars/venus/TextSegmentWindow.java b/src/rars/venus/TextSegmentWindow.java index f4676b5d..cd23b700 100644 --- a/src/rars/venus/TextSegmentWindow.java +++ b/src/rars/venus/TextSegmentWindow.java @@ -101,48 +101,14 @@ public TextSegmentWindow() { * Should convert the lines of code over to the table rows and columns. **/ public void setupTable() { - int addressBase = Globals.getGui().getMainPane().getExecutePane().getAddressDisplayBase(); codeHighlighting = true; breakpointsEnabled = true; - ArrayList sourceStatementList = Globals.program.getMachineList(); + ArrayList sourceStatementList = Globals.program.getTextSegmentLines(); data = new Object[sourceStatementList.size()][columnNames.length]; intAddresses = new int[data.length]; addressRows = new Hashtable<>(data.length); executeMods = new Hashtable<>(data.length); - // Get highest source line number to determine #leading spaces so line numbers will vertically align - // In multi-file situation, this will not necessarily be the last line b/c sourceStatementList contains - // source lines from all files. DPS 3-Oct-10 - int maxSourceLineNumber = 0; - for (int i = sourceStatementList.size() - 1; i >= 0; i--) { - ProgramStatement statement = sourceStatementList.get(i); - if (statement.getSourceLine() > maxSourceLineNumber) { - maxSourceLineNumber = statement.getSourceLine(); - } - } - int sourceLineDigits = ("" + maxSourceLineNumber).length(); - int leadingSpaces = 0; - int lastLine = -1; - for (int i = 0; i < sourceStatementList.size(); i++) { - ProgramStatement statement = sourceStatementList.get(i); - intAddresses[i] = statement.getAddress(); - addressRows.put(intAddresses[i], i); - data[i][BREAK_COLUMN] = false; - data[i][ADDRESS_COLUMN] = NumberDisplayBaseChooser.formatUnsignedInteger(statement.getAddress(), addressBase); - data[i][CODE_COLUMN] = NumberDisplayBaseChooser.formatNumber(statement.getBinaryStatement(), 16, 4); - data[i][BASIC_COLUMN] = statement.getPrintableBasicAssemblyStatement(); - String sourceString = ""; - if (!statement.getSource().equals("")) { - leadingSpaces = sourceLineDigits - ("" + statement.getSourceLine()).length(); - String lineNumber = " ".substring(0, leadingSpaces) - + statement.getSourceLine() + ": "; - if (statement.getSourceLine() == lastLine) - lineNumber = " ".substring(0, sourceLineDigits) + " "; - sourceString = lineNumber - + rars.util.EditorFont.substituteSpacesForTabs(statement.getSource()); - } - data[i][SOURCE_COLUMN] = sourceString; - lastLine = statement.getSourceLine(); - } + addRows(sourceStatementList); contentPane.removeAll(); tableModel = new TextTableModel(data); if (tableModelListener != null) { @@ -182,6 +148,66 @@ public void setupTable() { } } + /** + * Add rows in the data array from the information in the sourceStatementList. + * + * @param sourceStatementList contains the statements from de source code (comments, .eqv, instructions, ...) + * and the linked information (address, code, basic instruction, source code, ...) + */ + private void addRows(ArrayList sourceStatementList) { + int maxSourceLineNumber = getMaxSourceLineNumber(sourceStatementList); + int addressBase = Globals.getGui().getMainPane().getExecutePane().getAddressDisplayBase(); + int sourceLineDigits = ("" + maxSourceLineNumber).length(); + int leadingSpaces = 0; + int lastLine = -1; + + for (int i = 0; i < sourceStatementList.size(); i++) { + ProgramStatement statement = sourceStatementList.get(i); + intAddresses[i] = statement.getAddress(); + addressRows.put(intAddresses[i], i); + data[i][BREAK_COLUMN] = false; + String address = ""; + String code = ""; + String basicInstruction = ""; + String sourceString = ""; + if (statement.getInstruction() != null) { + address = NumberDisplayBaseChooser.formatUnsignedInteger(statement.getAddress(), addressBase); + code = NumberDisplayBaseChooser.formatNumber(statement.getBinaryStatement(), 16, 4); + basicInstruction = statement.getPrintableBasicAssemblyStatement(); + } + if (!statement.getSource().equals("")) { + leadingSpaces = sourceLineDigits - ("" + statement.getSourceLine()).length(); + String lineNumber = " ".substring(0, leadingSpaces) + + statement.getSourceLine() + ": "; + if (statement.getSourceLine() == lastLine) + lineNumber = " ".substring(0, sourceLineDigits) + " "; + sourceString = lineNumber + + rars.util.EditorFont.substituteSpacesForTabs(statement.getSource()); + } + data[i][ADDRESS_COLUMN] = address; + data[i][CODE_COLUMN] = code; + data[i][BASIC_COLUMN] = basicInstruction; + data[i][SOURCE_COLUMN] = sourceString; + lastLine = statement.getSourceLine(); + } + } + + /** + * Get highest source line number to determine #leading spaces so line numbers will vertically align + * In multi-file situation, this will not necessarily be the last line b/c sourceStatementList contains + * source lines from all files. DPS 3-Oct-10 + */ + private static int getMaxSourceLineNumber(ArrayList sourceStatementList) { + int maxSourceLineNumber = 0; + for (int i = sourceStatementList.size() - 1; i >= 0; i--) { + ProgramStatement statement = sourceStatementList.get(i); + if (statement.getSourceLine() > maxSourceLineNumber) { + maxSourceLineNumber = statement.getSourceLine(); + } + } + return maxSourceLineNumber; + } + /** * */ @@ -219,11 +245,12 @@ public void updateCodeAddresses() { if (contentPane.getComponentCount() == 0) return; // ignore if no content to change int addressBase = Globals.getGui().getMainPane().getExecutePane().getAddressDisplayBase(); - int address; String formattedAddress; for (int i = 0; i < intAddresses.length; i++) { - formattedAddress = NumberDisplayBaseChooser.formatUnsignedInteger(intAddresses[i], addressBase); - table.getModel().setValueAt(formattedAddress, i, ADDRESS_COLUMN); + if (intAddresses[i] != -1) { + formattedAddress = NumberDisplayBaseChooser.formatUnsignedInteger(intAddresses[i], addressBase); + table.getModel().setValueAt(formattedAddress, i, ADDRESS_COLUMN); + } } } @@ -414,7 +441,19 @@ public int[] getSortedBreakPointsArray() { breakpointCount = 0; for (int i = 0; i < data.length; i++) { if ((Boolean) data[i][BREAK_COLUMN]) { - breakpoints[breakpointCount++] = intAddresses[i]; + int index = i; + //if a breakpoint is not on an instruction, puts a breakpoint at next instruction + if(intAddresses[i] == -1) { + for (int j = index; j < data.length; j++) + if (intAddresses[j] != -1) { + index = j; + break; + } + if (index == i) //no instruction follows the breakpoint + continue; //don't add breakpoint + } + breakpoints[breakpointCount++] = intAddresses[index]; + //TODO: we should probably, in place of this, lock the possibility to put a breakpoint if not an instruction } } Arrays.sort(breakpoints); From d62a1667597b4ed4c8ab5c39a2aa867ea703c627 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Wed, 24 Jul 2024 14:41:06 -0400 Subject: [PATCH 136/199] change to java 11 --- build-jar.sh | 2 +- pom.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build-jar.sh b/build-jar.sh index fc3e185a..259c3375 100755 --- a/build-jar.sh +++ b/build-jar.sh @@ -3,7 +3,7 @@ if git submodule status | grep \( > /dev/null ; then version=$(git describe --tags --match 'v*' --dirty | cut -c2-) echo "Version = $version" > src/Version.properties mkdir -p build - find src -name "*.java" | xargs javac --release 8 -d build + find src -name "*.java" | xargs javac --release 11 -d build if [[ "$OSTYPE" == "darwin"* ]]; then find src -type f -not -name "*.java" -exec rsync -R {} build \; else diff --git a/pom.xml b/pom.xml index 11dda680..93addd56 100644 --- a/pom.xml +++ b/pom.xml @@ -53,9 +53,9 @@ - 8 - 8 - 8 + 11 + 11 + 11 UTF-8 From a4cb4976a15839b6716f63a1ff615540dca3519e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 01:22:41 -0400 Subject: [PATCH 137/199] maven: add plugin jacoco for coverage analysis --- pom.xml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/pom.xml b/pom.xml index a5611774..400ef1e0 100644 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,46 @@ maven-surefire-plugin 3.3.0 + + org.jacoco + jacoco-maven-plugin + 0.8.12 + + + default-prepare-agent + + prepare-agent + + + + default-report + test + + report + + + + default-check + + check + + + + + BUNDLE + + + COMPLEXITY + COVEREDRATIO + 0.70 + + + + + + + + From 9174034b39680712088685d6a1fd15218a1281e2 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 01:23:27 -0400 Subject: [PATCH 138/199] test: rename class Test because its bad name conflics with junit --- test.sh | 6 +++--- test/{Test.java => RarsTest.java} | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) rename test/{Test.java => RarsTest.java} (99%) diff --git a/test.sh b/test.sh index 2b52fd61..d261df54 100755 --- a/test.sh +++ b/test.sh @@ -1,6 +1,6 @@ #!/bin/bash -javac -cp rars.jar test/Test.java -java -cp test:rars.jar Test +javac -cp rars.jar test/RarsTest.java +java -cp test:rars.jar RarsTest err=$? -rm test/Test.class +rm test/RarsTest.class exit "$err" diff --git a/test/Test.java b/test/RarsTest.java similarity index 99% rename from test/Test.java rename to test/RarsTest.java index 35311da5..4d0f1cb0 100644 --- a/test/Test.java +++ b/test/RarsTest.java @@ -8,12 +8,12 @@ import java.util.ArrayList; import java.util.Iterator; -public class Test { +public class RarsTest { boolean success = true; StringBuilder total = new StringBuilder("\n"); public static void main(String[] args){ - Test self = new Test(); + RarsTest self = new RarsTest(); if (args.length != 0) { Program p = self.setupProgram(true); for (String arg : args) { @@ -32,7 +32,7 @@ public static void main(String[] args){ } self.checkPrograms(); self.checkBinary(); - self.checkPsuedo(); + self.checkPseudo(); if (!self.success) { System.exit(1); } @@ -247,7 +247,7 @@ public void checkBinary(){ } } - public void checkPsuedo(){ + public void checkPseudo(){ Options opt = new Options(); opt.startAtMain = true; opt.maxSteps = 500; From e42451a0783f87051da922990a0d46e65d9a6d1d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 01:26:13 -0400 Subject: [PATCH 139/199] run rars test as junit tests --- test/RarsUnitTest.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 test/RarsUnitTest.java diff --git a/test/RarsUnitTest.java b/test/RarsUnitTest.java new file mode 100644 index 00000000..83b2e14b --- /dev/null +++ b/test/RarsUnitTest.java @@ -0,0 +1,21 @@ +import org.junit.jupiter.api.Test; + +public class RarsUnitTest extends RarsTest { + @Override + @Test + public void checkBinary() { + super.checkBinary(); + } + + @Override + @Test + public void checkPseudo() { + super.checkPseudo(); + } + + @Override + @Test + public void checkPrograms() { + super.checkPrograms(); + } +} From bf473a2e20bd289117e5d574f3db20daf749b4c5 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 01:56:31 -0400 Subject: [PATCH 140/199] test program arguments (to check if coverage improves) --- src/rars/simulator/ProgramArgumentList.java | 5 ++++- test/RarsTest.java | 7 ++++++- test/riscv-tests-64/args.s | 15 +++++++++++++++ test/riscv-tests/args.s | 15 +++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/riscv-tests-64/args.s create mode 100644 test/riscv-tests/args.s diff --git a/src/rars/simulator/ProgramArgumentList.java b/src/rars/simulator/ProgramArgumentList.java index 6d8fefe1..97e0ce5c 100644 --- a/src/rars/simulator/ProgramArgumentList.java +++ b/src/rars/simulator/ProgramArgumentList.java @@ -50,6 +50,10 @@ public class ProgramArgumentList { private ArrayList programArgumentList; + public ArrayList getProgramArgumentList() { + return programArgumentList; + } + /** * Constructor that parses string to produce list. Delimiters * are the default Java StringTokenizer delimiters (space, tab, @@ -118,7 +122,6 @@ public ProgramArgumentList(ArrayList list, int startPosition) { } } - ////////////////////////////////////////////////////////////////////// // Place any program arguments into memory and registers // Arguments are stored starting at highest word of non-kernel diff --git a/test/RarsTest.java b/test/RarsTest.java index 4d0f1cb0..66387d70 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -2,6 +2,7 @@ import rars.api.Options; import rars.api.Program; import rars.riscv.*; +import rars.simulator.ProgramArgumentList; import rars.simulator.Simulator; import java.io.*; @@ -92,6 +93,7 @@ public void runFile(String path, Program p) { public static String run(String path, Program p){ int[] errorlines = null; String stdin = "", stdout = "", stderr =""; + ArrayList programArgumentList = null; int exitCode = 0; // TODO: better config system // This is just a temporary solution that should work for the tests I want to write @@ -113,6 +115,9 @@ public static String run(String path, Program p){ stderr = line.replaceFirst("#stderr:", "").replaceAll("\\\\n","\n").trim(); } else if (line.startsWith("#exit:")) { exitCode = Integer.parseInt(line.replaceFirst("#exit:", "")); + } else if (line.startsWith("#args:")) { + String args = line.replaceFirst("#args:", ""); + programArgumentList = new ProgramArgumentList(args).getProgramArgumentList(); } line = br.readLine(); } @@ -126,7 +131,7 @@ public static String run(String path, Program p){ if(errorlines != null){ return "Expected assembly error, but successfully assembled " + path; } - p.setup(null,stdin); + p.setup(programArgumentList, stdin); Simulator.Reason r = p.simulate(); if(r != Simulator.Reason.NORMAL_TERMINATION){ return "Ended abnormally " + r + " while executing " + path; diff --git a/test/riscv-tests-64/args.s b/test/riscv-tests-64/args.s new file mode 100644 index 00000000..f0d9806d --- /dev/null +++ b/test/riscv-tests-64/args.s @@ -0,0 +1,15 @@ +#args:hello world +#stdout:2helloworld +mv s0, a0 # argc +mv s1, a1 # argv + +li a7, 1 +ecall +li a7, 4 +ld a0, 0(s1) +ecall +ld a0, 8(s1) +ecall + +li a7, 10 +ecall diff --git a/test/riscv-tests/args.s b/test/riscv-tests/args.s new file mode 100644 index 00000000..27132752 --- /dev/null +++ b/test/riscv-tests/args.s @@ -0,0 +1,15 @@ +#args:hello world +#stdout:2helloworld +mv s0, a0 # argc +mv s1, a1 # argv + +li a7, 1 +ecall +li a7, 4 +lw a0, 0(s1) +ecall +lw a0, 4(s1) +ecall + +li a7, 10 +ecall \ No newline at end of file From 6f869fb5fad6626cebbe95dc66bb07c74f25bfee Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 08:21:06 -0400 Subject: [PATCH 141/199] test for runtime errors --- test/RarsTest.java | 8 ++++++-- test/exception_instruction_access_fault.s | 2 ++ test/exception_instruction_addr_misaligned.s | 4 ++++ test/exception_load_access_fault.s | 2 ++ test/exception_load_address_misaligned.s | 6 ++++++ test/exception_store_access_fault.s | 2 ++ test/exception_store_address_misaligned.s | 6 ++++++ 7 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 test/exception_instruction_access_fault.s create mode 100644 test/exception_instruction_addr_misaligned.s create mode 100644 test/exception_load_access_fault.s create mode 100644 test/exception_load_address_misaligned.s create mode 100644 test/exception_store_access_fault.s create mode 100644 test/exception_store_address_misaligned.s diff --git a/test/RarsTest.java b/test/RarsTest.java index 66387d70..910766eb 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -92,7 +92,7 @@ public void runFile(String path, Program p) { public static String run(String path, Program p){ int[] errorlines = null; - String stdin = "", stdout = "", stderr =""; + String stdin = "", stdout = "", stderr ="", errorMessage = ""; ArrayList programArgumentList = null; int exitCode = 0; // TODO: better config system @@ -118,6 +118,8 @@ public static String run(String path, Program p){ } else if (line.startsWith("#args:")) { String args = line.replaceFirst("#args:", ""); programArgumentList = new ProgramArgumentList(args).getProgramArgumentList(); + } else if (line.startsWith("#error:")) { + errorMessage = line.replaceFirst("#error:", ""); } line = br.readLine(); } @@ -164,7 +166,9 @@ public static String run(String path, Program p){ } return ""; } catch (SimulationException se){ - return "Crashed while executing " + path; + if (se.error().getMessage().equals(errorMessage)) + return ""; + return "Crashed while executing " + path + "; " + se.error().generateReport(); } } diff --git a/test/exception_instruction_access_fault.s b/test/exception_instruction_access_fault.s new file mode 100644 index 00000000..15d2c6c5 --- /dev/null +++ b/test/exception_instruction_access_fault.s @@ -0,0 +1,2 @@ +#error:Instruction load access error +jr zero diff --git a/test/exception_instruction_addr_misaligned.s b/test/exception_instruction_addr_misaligned.s new file mode 100644 index 00000000..192eda4a --- /dev/null +++ b/test/exception_instruction_addr_misaligned.s @@ -0,0 +1,4 @@ +#error:Instruction load alignment error +auipc a0, 0 +addi a0, a0, 2 +jr a0 diff --git a/test/exception_load_access_fault.s b/test/exception_load_access_fault.s new file mode 100644 index 00000000..0775591c --- /dev/null +++ b/test/exception_load_access_fault.s @@ -0,0 +1,2 @@ +#error:Runtime exception at 0x00400000: address out of range 0x00000000 +lw a0, 0(zero) diff --git a/test/exception_load_address_misaligned.s b/test/exception_load_address_misaligned.s new file mode 100644 index 00000000..201bf839 --- /dev/null +++ b/test/exception_load_address_misaligned.s @@ -0,0 +1,6 @@ +#error:Runtime exception at 0x00400008: Load address not aligned to word boundary 0x10010001 +.data +d: .word 42 +.text +la a0, d +lw a1, 1(a0) diff --git a/test/exception_store_access_fault.s b/test/exception_store_access_fault.s new file mode 100644 index 00000000..2034af57 --- /dev/null +++ b/test/exception_store_access_fault.s @@ -0,0 +1,2 @@ +#error:Runtime exception at 0x00400000: address out of range 0x00000000 +sw a0, 0(zero) diff --git a/test/exception_store_address_misaligned.s b/test/exception_store_address_misaligned.s new file mode 100644 index 00000000..1d4fcbe7 --- /dev/null +++ b/test/exception_store_address_misaligned.s @@ -0,0 +1,6 @@ +#error:Runtime exception at 0x00400008: Store address not aligned to word boundary 0x10010001 +.data +d: .word 42 +.text +la a0, d +sw a1, 1(a0) From f64d40eaffab8d70a3b1d0d74e1d6d2e71326c1d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 08:39:49 -0400 Subject: [PATCH 142/199] test other exit reasons: cliff, ebreak, max_steps --- test/RarsTest.java | 15 ++++++++++++--- test/cliff.s | 1 + test/ebreak.s | 2 ++ test/max_steps.s | 2 ++ 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 test/cliff.s create mode 100644 test/ebreak.s create mode 100644 test/max_steps.s diff --git a/test/RarsTest.java b/test/RarsTest.java index 910766eb..4e8d6f29 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -92,7 +92,7 @@ public void runFile(String path, Program p) { public static String run(String path, Program p){ int[] errorlines = null; - String stdin = "", stdout = "", stderr ="", errorMessage = ""; + String stdin = "", stdout = "", stderr ="", errorMessage = "", exitReason = ""; ArrayList programArgumentList = null; int exitCode = 0; // TODO: better config system @@ -114,7 +114,12 @@ public static String run(String path, Program p){ } else if (line.startsWith("#stderr:")) { stderr = line.replaceFirst("#stderr:", "").replaceAll("\\\\n","\n").trim(); } else if (line.startsWith("#exit:")) { - exitCode = Integer.parseInt(line.replaceFirst("#exit:", "")); + exitReason = line.replaceFirst("#exit:", ""); + try { + exitCode = Integer.parseInt(exitReason); + } catch (NumberFormatException nfe) { + exitCode = -1; + } } else if (line.startsWith("#args:")) { String args = line.replaceFirst("#args:", ""); programArgumentList = new ProgramArgumentList(args).getProgramArgumentList(); @@ -136,7 +141,11 @@ public static String run(String path, Program p){ p.setup(programArgumentList, stdin); Simulator.Reason r = p.simulate(); if(r != Simulator.Reason.NORMAL_TERMINATION){ - return "Ended abnormally " + r + " while executing " + path; + if (r.toString().toLowerCase().equals(exitReason)) { + return ""; + } else { + return "Ended abnormally " + r + " while executing " + path; + } }else{ if(p.getExitCode() != exitCode) { return "Final exit code was wrong for " + path + "\n Expected "+exitCode+" got "+p.getExitCode(); diff --git a/test/cliff.s b/test/cliff.s new file mode 100644 index 00000000..bef8827d --- /dev/null +++ b/test/cliff.s @@ -0,0 +1 @@ +#exit:cliff_termination diff --git a/test/ebreak.s b/test/ebreak.s new file mode 100644 index 00000000..ad93734b --- /dev/null +++ b/test/ebreak.s @@ -0,0 +1,2 @@ +#exit:breakpoint +ebreak diff --git a/test/max_steps.s b/test/max_steps.s new file mode 100644 index 00000000..8e8f41e6 --- /dev/null +++ b/test/max_steps.s @@ -0,0 +1,2 @@ +#exit:max_steps +loop: j loop From fc879a496c058c4b187cbc95ea928fa4d7f1cd91 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 08:48:50 -0400 Subject: [PATCH 143/199] minimum coveragre is 20% (there is a lot of work) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 400ef1e0..fe5996cd 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ COMPLEXITY COVEREDRATIO - 0.70 + 0.20 From 3cbad97cc738151759fe25aeebe40dbeef304832 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 30 Jul 2024 16:57:52 -0400 Subject: [PATCH 144/199] Dark mode (#56) close #53 : new dark mode option can be set ! In the menu bar, there is now the possibility of enabling a dark mode. The change happens dynamically. New colors, and a dark background for sensitive eyes and for those that prefer the darker look. Light mode stays the default one, and one just has to uncheck the dark mode setting to revert to it. --- src/Settings.properties | 2 +- src/rars/Launch.java | 9 ++- src/rars/Settings.java | 65 ++++++++++++++++++- src/rars/venus/MainPane.java | 2 - src/rars/venus/MessagesPane.java | 1 - src/rars/venus/VenusUI.java | 27 +++++++- .../editors/jeditsyntax/SyntaxUtilities.java | 43 ++++++++++++ src/rars/venus/registers/RegistersPane.java | 1 - 8 files changed, 138 insertions(+), 12 deletions(-) diff --git a/src/Settings.properties b/src/Settings.properties index 197de2e9..cff9a37f 100644 --- a/src/Settings.properties +++ b/src/Settings.properties @@ -26,7 +26,7 @@ TextSegmentHighlightBackground = 0x00ffff99 TextSegmentHighlightForeground = 0 TextSegmentDelaySlotHighlightBackground = 0x33ff00 TextSegmentDelaySlotHighlightForeground = 0 -ExplicitWriteHighlightBackground = 0x00ff8080 +ExplicitWriteHighlightBackground = 0x00ffaaaa ExplicitWriteHighlightForeground = 0 ExplicitReadHighlightBackground = 0x0099ccff ExplicitReadHighlightForeground = 0 diff --git a/src/rars/Launch.java b/src/rars/Launch.java index 1e512cb2..f4b36adc 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -231,7 +231,14 @@ private void dumpSegments(Program program) { private void launchIDE() { // System.setProperty("apple.laf.useScreenMenuBar", "true"); // Puts RARS menu on Mac OS menu bar try { - UIManager.setLookAndFeel("com.formdev.flatlaf.FlatIntelliJLaf"); + if (Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED)) { + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatDarkLaf"); + Globals.getSettings().setDarkMode(); + } + else { + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatIntelliJLaf"); + Globals.getSettings().setLightMode(); + } } catch( Exception ex ) { System.err.println( "Failed to initialize LaF. Continue with default LaF." ); } diff --git a/src/rars/Settings.java b/src/rars/Settings.java index 084bfe0b..fcd39780 100644 --- a/src/rars/Settings.java +++ b/src/rars/Settings.java @@ -158,7 +158,11 @@ public enum Bool { * Flag to determine whether to calculate relative paths from the current working directory * or from the RARS executable path. */ - DERIVE_CURRENT_WORKING_DIRECTORY("DeriveCurrentWorkingDirectory", false); + DERIVE_CURRENT_WORKING_DIRECTORY("DeriveCurrentWorkingDirectory", false), + /** + * Flag to determine whether rars is in dark mode instead of light mode. + */ + DARK_MODE_ENABLED("DarkModeEnabled", false); // TODO: add option for turning off user trap handling and interrupts private String name; @@ -374,14 +378,21 @@ public enum ColorMode { "ExplicitWriteHighlightBackground", "ExplicitWriteHighlightForeground", "ExplicitReadHighlightBackground", "ExplicitReadHighlightForeground", "EditorBackground", "EditorForeground", "EditorLineHighlight", "EditorSelection", "EditorCaretColor"}; + + // default light color settings for editor (not syntax) and execute/register panes + private static String[] defaultLightColorSettingsValues = { + "0x00e0e0e0", "0", "0x00ffffff", "0", "0x00ffff99", "0", "0x0033ff00", "0", "0x00ffaaaa", "0", "0x0099ccff","0", "0x00ffffff", "0x00000000", "0x00eeeeee", "0x00ccccff", "0x00000000"}; + + // default dark color settings for editor (not syntax) and execute/register panes + private static String[] defaultDarkColorSettingsValues = { + "0x00333333", "0x00cccccc", "0x00202020", "0x00cccccc", "0x00ffff99", "0", "0x0033ff00", "0", "0x00ffaaaa", "0", "0x0099ccff", "0", "0x00202020", "0x00bbbbbb","0x00333333", "0x00304060", "0x00bbbbbb"}; /** * Last resort default values for color settings; * will use only if neither the Preferences nor the properties file work. * If you wish to change, do so before instantiating the Settings object. * Must match key by list position. */ - private static String[] defaultColorSettingsValues = { - "0x00e0e0e0", "0", "0x00ffffff", "0", "0x00ffff99", "0", "0x0033ff00", "0", "0x00ff8080", "0", "0x0099ccff","0", "0x00ffffff", "0x00000000", "0x00eeeeee", "0x00ccccff", "0x00000000"}; + private static String[] defaultColorSettingsValues = defaultLightColorSettingsValues; interface SystemColorProvider { Color getColor();} private SystemColorProvider[] systemColors; @@ -1308,4 +1319,52 @@ private int[] getTextSegmentColumnOrder(String stringOfColumnIndexes) { return list; } + /* + * Sets dark default syntax styles and dark default color settings/highlights. + * If light default was used as current color, changes to dark default. If custom colors, doesn't change them. + */ + public void setDarkMode() { + defaultColorSettingsValues = defaultDarkColorSettingsValues; + SyntaxUtilities.setDarkDefaultStyles(); + SyntaxStyle[] syntaxStyle = SyntaxUtilities.getDefaultSyntaxStyles(); + defaultSyntaxStyleColorSettingsValues = new String[syntaxStyle.length]; + for (int i = 0; i < syntaxStyle.length; i++) + defaultSyntaxStyleColorSettingsValues[i] = syntaxStyle[i].getColorAsHexString(); + + oldDefaultToNew(SyntaxUtilities.getLightDefaultSyntaxStyles(), defaultSyntaxStyleColorSettingsValues, + defaultLightColorSettingsValues, defaultDarkColorSettingsValues); + } + + /* + * Sets light default syntax styles and light default color settings/highlights. + * If dark default was used as current color, changes to light default. If custom colors, doesn't change them. + */ + public void setLightMode() { + defaultColorSettingsValues = defaultLightColorSettingsValues; + SyntaxUtilities.setLightDefaultStyles(); + SyntaxStyle[] syntaxStyle = SyntaxUtilities.getDefaultSyntaxStyles(); + defaultSyntaxStyleColorSettingsValues = new String[syntaxStyle.length]; + for (int i = 0; i < syntaxStyle.length; i++) + defaultSyntaxStyleColorSettingsValues[i] = syntaxStyle[i].getColorAsHexString(); + + oldDefaultToNew(SyntaxUtilities.getDarkDefaultSyntaxStyles(), defaultSyntaxStyleColorSettingsValues, + defaultDarkColorSettingsValues, defaultColorSettingsValues); + } + + /* + * Sets current colors to the new default colors specified iff it was set to the opposite default before. + */ + private void oldDefaultToNew(SyntaxStyle[] oppositeSyntaxDefault, String[] newDefaultSyntax, + String[] oppositeDefaultColorSettingsValues, String[] newDefaultColorSettingsValues) { + for (int i = 0; i < syntaxStyleColorSettingsValues.length; i++) + if (syntaxStyleColorSettingsValues[i].equals(oppositeSyntaxDefault[i].getColorAsHexString())) { + syntaxStyleColorSettingsValues[i] = newDefaultSyntax[i]; + } + + for (int i = 0; i < colorSettingsValues.length; i++) + if (colorSettingsValues[i].equals(oppositeDefaultColorSettingsValues[i])) { + colorSettingsValues[i] = newDefaultColorSettingsValues[i]; + } + } + } diff --git a/src/rars/venus/MainPane.java b/src/rars/venus/MainPane.java index 663c9452..0bd7f09a 100644 --- a/src/rars/venus/MainPane.java +++ b/src/rars/venus/MainPane.java @@ -76,8 +76,6 @@ public MainPane(VenusUI appFrame, Editor editor, RegistersWindow regs, this.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); this.addTab(editTabTitle, editTabIcon, editTabbedPane); - this.setForeground(Color.black); - this.addTab(executeTabTitle, executeTabIcon, executeTab); this.setToolTipTextAt(0, "Text editor for composing RISCV programs."); diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index 673237f2..6f305291 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -270,7 +270,6 @@ public void actionPerformed(ActionEvent e) { leftPane.addTab("Messages", assembleTab); leftPane.addTab("Run I/O", runioTab); leftPane.addTab("Program Arguments", programArgumentsPanel); - leftPane.setForeground(Color.BLACK); leftPane.setToolTipTextAt(0, "Messages produced by Run menu. Click on assemble error message to select erroneous line"); leftPane.setToolTipTextAt(1, "Simulated console input (used while running) and other run messages"); diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index c47981d5..07fd8f46 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -87,7 +87,7 @@ public class VenusUI extends JFrame { private JMenuItem runGo, runStep, runBackstep, runReset, runAssemble, runStop, runPause, runClearBreakpoints, runToggleBreakpoints; private JCheckBoxMenuItem settingsLabel, settingsValueDisplayBase, settingsAddressDisplayBase, settingsExtended, settingsAssembleOnOpen, settingsAssembleAll, settingsAssembleOpen, settingsWarningsAreErrors, - settingsStartAtMain, settingsSelfModifyingCode, settingsRV64, settingsDeriveCurrentWorkingDirectory; + settingsStartAtMain, settingsSelfModifyingCode, settingsRV64, settingsDeriveCurrentWorkingDirectory, settingsDarkMode; private JMenuItem settingsExceptionHandler, settingsEditor, settingsHighlighting, settingsMemoryConfiguration; private JMenuItem helpHelp, helpAbout; @@ -112,7 +112,7 @@ public class VenusUI extends JFrame { settingsExtendedAction, settingsAssembleOnOpenAction, settingsAssembleOpenAction, settingsAssembleAllAction, settingsWarningsAreErrorsAction, settingsStartAtMainAction, settingsExceptionHandlerAction, settingsEditorAction, settingsHighlightingAction, settingsMemoryConfigurationAction, - settingsSelfModifyingCodeAction, settingsRV64Action, settingsDeriveCurrentWorkingDirectoryAction; + settingsSelfModifyingCodeAction, settingsRV64Action, settingsDeriveCurrentWorkingDirectoryAction, settingsDarkModeAction; private Action helpHelpAction, helpAboutAction; @@ -464,7 +464,8 @@ public void handler(boolean value) { settingsDeriveCurrentWorkingDirectoryAction = new SettingsAction("Derive current working directory", "If set, the working directory is derived from the main file instead of the RARS executable directory.", Settings.Bool.DERIVE_CURRENT_WORKING_DIRECTORY); - + settingsDarkModeAction = new SettingsAction("Dark mode", "If set, RARS will be in dark mode at the next opening. Uncheck for light mode", + Settings.Bool.DARK_MODE_ENABLED); settingsEditorAction = new SettingsEditorAction("Editor...", null, "View and modify text editor settings.", null, null @@ -617,6 +618,25 @@ private JMenuBar setUpMenuBar() { settingsRV64.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.RV64_ENABLED)); settingsDeriveCurrentWorkingDirectory = new JCheckBoxMenuItem(settingsDeriveCurrentWorkingDirectoryAction); settingsDeriveCurrentWorkingDirectory.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.DERIVE_CURRENT_WORKING_DIRECTORY)); + settingsDarkMode = new JCheckBoxMenuItem(settingsDarkModeAction); + settingsDarkMode.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED)); + settingsDarkMode.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + if (settingsDarkMode.isSelected()) { + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatDarkLaf"); + SwingUtilities.updateComponentTreeUI(mainUI); + Globals.getSettings().setDarkMode(); + } else { + UIManager.setLookAndFeel("com.formdev.flatlaf.FlatIntelliJLaf"); + SwingUtilities.updateComponentTreeUI(mainUI); + Globals.getSettings().setLightMode(); + } + } catch (Exception ex) { + System.err.println( "Failed to initialize LaF. Continue with default LaF." ); + } + } + }); settingsAssembleOnOpen = new JCheckBoxMenuItem(settingsAssembleOnOpenAction); settingsAssembleOnOpen.setSelected(Globals.getSettings().getBooleanSetting(Settings.Bool.ASSEMBLE_ON_OPEN)); settingsAssembleAll = new JCheckBoxMenuItem(settingsAssembleAllAction); @@ -647,6 +667,7 @@ private JMenuBar setUpMenuBar() { settings.add(settingsSelfModifyingCode); settings.add(settingsRV64); settings.addSeparator(); + settings.add(settingsDarkMode); settings.add(settingsEditor); settings.add(settingsHighlighting); settings.add(settingsExceptionHandler); diff --git a/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java b/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java index 9a5dc518..8643d560 100644 --- a/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java +++ b/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java @@ -27,6 +27,8 @@ * @version $Id: SyntaxUtilities.java,v 1.9 1999/12/13 03:40:30 sp Exp $ */ public class SyntaxUtilities { + + private static SyntaxStyle[] defaultStyles = getLightDefaultSyntaxStyles(); /** * Checks if a subregion of a Segment is equal to a * string. @@ -89,6 +91,13 @@ public static boolean regionMatches(boolean ignoreCase, Segment text, * to use the default syntax styles. */ public static SyntaxStyle[] getDefaultSyntaxStyles() { + return defaultStyles; + } + + /** + * Returns the light default style table. + */ + public static SyntaxStyle[] getLightDefaultSyntaxStyles() { SyntaxStyle[] styles = new SyntaxStyle[Token.ID_COUNT]; // SyntaxStyle constructor params: color, italic?, bold? @@ -108,6 +117,40 @@ public static SyntaxStyle[] getDefaultSyntaxStyles() { return styles; } + /** + * Returns the dark default style table. + */ + public static SyntaxStyle[] getDarkDefaultSyntaxStyles() { + SyntaxStyle[] styles = new SyntaxStyle[Token.ID_COUNT]; + + // SyntaxStyle constructor params: color, italic?, bold? + // All need to be assigned even if not used by language (no gaps in array) + styles[Token.NULL] = new SyntaxStyle(Color.black, false, false); + styles[Token.COMMENT1] = new SyntaxStyle(new Color(0x00CC66), true, false); + styles[Token.COMMENT2] = new SyntaxStyle(new Color(0x990033), true, false); + styles[Token.KEYWORD1] = new SyntaxStyle(new Color(0x66CCFF), false, false); + styles[Token.KEYWORD2] = new SyntaxStyle(new Color(0x9999FF), false, false); + styles[Token.KEYWORD3] = new SyntaxStyle(new Color(0xFF9999), false, false); + styles[Token.LITERAL1] = new SyntaxStyle(new Color(0x00CC66), false, false); + styles[Token.LITERAL2] = new SyntaxStyle(new Color(0x00CC66), false, false); + styles[Token.LABEL] = new SyntaxStyle(new Color(0xFFCC66), true, false); + styles[Token.OPERATOR] = new SyntaxStyle(Color.black, false, true); + styles[Token.INVALID] = new SyntaxStyle(Color.red, false, false); + styles[Token.MACRO_ARG] = new SyntaxStyle(new Color(150, 150, 0), false, false); + return styles; + } + + /** + * sets the default style table to the dark default + */ + public static void setDarkDefaultStyles() { + defaultStyles = getDarkDefaultSyntaxStyles(); + } + + public static void setLightDefaultStyles() { + defaultStyles = getLightDefaultSyntaxStyles(); + } + /** * Returns the CURRENT style table. This can be passed to the * setStyles() method of SyntaxDocument diff --git a/src/rars/venus/registers/RegistersPane.java b/src/rars/venus/registers/RegistersPane.java index e17a22f9..c9fdae39 100644 --- a/src/rars/venus/registers/RegistersPane.java +++ b/src/rars/venus/registers/RegistersPane.java @@ -66,7 +66,6 @@ public RegistersPane(VenusUI appFrame, RegistersWindow regs, FloatingPointWindow this.addTab("Registers", regsTab); this.addTab("Floating Point", fpTab); this.addTab("Control and Status", csrTab); - this.setForeground(Color.black); this.setToolTipTextAt(0, "CPU registers"); this.setToolTipTextAt(1, "Floating point unit registers"); From 0edcf5af21046392a7fd110663324bc697dd1891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Wed, 31 Jul 2024 14:11:19 +0200 Subject: [PATCH 145/199] Updated gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 727146cc..ff48bea2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,12 @@ out .idea +.settings *.class # Build products build +tmp +flatlaf-3.2.jar rars.jar rars-flatlaf.jar src/Version.properties From 5c64dbcf60e045692fb8bed03831a4c477999aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Wed, 31 Jul 2024 14:16:37 +0200 Subject: [PATCH 146/199] .settings for emacs --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ff48bea2..defa8290 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ out .idea -.settings *.class # Build products @@ -19,6 +18,9 @@ target/ .project examples/riscv +# Emacs +.settings + # MacOS .DS_Store */.DS_Store From 80ce1e6a79882d82edcb3ae38c4968f78ade9fd9 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 1 Aug 2024 14:18:59 -0400 Subject: [PATCH 147/199] new symbole token type --- .../editors/jeditsyntax/SyntaxUtilities.java | 3 +++ .../tokenmarker/RISCVTokenMarker.java | 2 ++ .../jeditsyntax/tokenmarker/Token.java | 20 ++++++++++++------- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java b/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java index 8643d560..1f169ef2 100644 --- a/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java +++ b/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java @@ -111,6 +111,7 @@ public static SyntaxStyle[] getLightDefaultSyntaxStyles() { styles[Token.LITERAL1] = new SyntaxStyle(new Color(0x00CC33), false, false);//(new Color(0x650099),false,false); styles[Token.LITERAL2] = new SyntaxStyle(new Color(0x00CC33), false, false);//(new Color(0x650099),false,true); styles[Token.LABEL] = new SyntaxStyle(Color.black, true, false);//(new Color(0x990033),false,true); + styles[Token.SYMBOL] = new SyntaxStyle(new Color(0x006666), false, false); styles[Token.OPERATOR] = new SyntaxStyle(Color.black, false, true); styles[Token.INVALID] = new SyntaxStyle(Color.red, false, false); styles[Token.MACRO_ARG] = new SyntaxStyle(new Color(150, 150, 0), false, false); @@ -134,6 +135,7 @@ public static SyntaxStyle[] getDarkDefaultSyntaxStyles() { styles[Token.LITERAL1] = new SyntaxStyle(new Color(0x00CC66), false, false); styles[Token.LITERAL2] = new SyntaxStyle(new Color(0x00CC66), false, false); styles[Token.LABEL] = new SyntaxStyle(new Color(0xFFCC66), true, false); + styles[Token.SYMBOL] = new SyntaxStyle(new Color(0x00AAAAA), false, false); styles[Token.OPERATOR] = new SyntaxStyle(Color.black, false, true); styles[Token.INVALID] = new SyntaxStyle(Color.red, false, false); styles[Token.MACRO_ARG] = new SyntaxStyle(new Color(150, 150, 0), false, false); @@ -170,6 +172,7 @@ public static SyntaxStyle[] getCurrentSyntaxStyles() { styles[Token.LITERAL1] = Globals.getSettings().getEditorSyntaxStyleByPosition(Token.LITERAL1); styles[Token.LITERAL2] = Globals.getSettings().getEditorSyntaxStyleByPosition(Token.LITERAL2); styles[Token.LABEL] = Globals.getSettings().getEditorSyntaxStyleByPosition(Token.LABEL); + styles[Token.SYMBOL] = Globals.getSettings().getEditorSyntaxStyleByPosition(Token.SYMBOL); styles[Token.OPERATOR] = Globals.getSettings().getEditorSyntaxStyleByPosition(Token.OPERATOR); styles[Token.INVALID] = Globals.getSettings().getEditorSyntaxStyleByPosition(Token.INVALID); styles[Token.MACRO_ARG] = Globals.getSettings().getEditorSyntaxStyleByPosition(Token.MACRO_ARG); diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java index acf6f442..3162ee87 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java @@ -47,6 +47,7 @@ public static String[] getRISCVTokenLabels() { tokenLabels[Token.LITERAL1] = "String literal"; tokenLabels[Token.LITERAL2] = "Character literal"; tokenLabels[Token.LABEL] = "Label"; + tokenLabels[Token.SYMBOL] = "Symbol"; tokenLabels[Token.KEYWORD1] = "Instruction"; tokenLabels[Token.KEYWORD2] = "Assembler directive"; tokenLabels[Token.KEYWORD3] = "Register"; @@ -63,6 +64,7 @@ public static String[] getRISCVTokenExamples() { tokenExamples[Token.LITERAL1] = "\"First\""; tokenExamples[Token.LITERAL2] = "'\\n'"; tokenExamples[Token.LABEL] = "main:"; + tokenExamples[Token.SYMBOL] = "PrintInt"; tokenExamples[Token.KEYWORD1] = "lui"; tokenExamples[Token.KEYWORD2] = ".text"; tokenExamples[Token.KEYWORD3] = "zero"; diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java index a885ffae..2b63cb65 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java @@ -64,49 +64,55 @@ public class Token { */ public static final byte LABEL = 5; + /** + * Symbol token id. This can be used to mark symbols + * This should be used to mark symbols declared with .eqv + */ + public static final byte SYMBOL = 6; + /** * Keyword 1 token id. This can be used to mark a * keyword. This should be used for general language * constructs. */ - public static final byte KEYWORD1 = 6; + public static final byte KEYWORD1 = 7; /** * Keyword 2 token id. This can be used to mark a * keyword. This should be used for preprocessor * commands, or variables. */ - public static final byte KEYWORD2 = 7; + public static final byte KEYWORD2 = 8; /** * Keyword 3 token id. This can be used to mark a * keyword. This should be used for data types. */ - public static final byte KEYWORD3 = 8; + public static final byte KEYWORD3 = 9; /** * Operator token id. This can be used to mark an * operator. (eg, SQL mode marks +, -, etc with this * token type) */ - public static final byte OPERATOR = 9; + public static final byte OPERATOR = 10; /** * Invalid token id. This can be used to mark invalid * or incomplete tokens, so the user can easily spot * syntax errors. */ - public static final byte INVALID = 10; + public static final byte INVALID = 11; /** * Macro parameter token. Added for MARS 4.3. */ - public static final byte MACRO_ARG = 11; + public static final byte MACRO_ARG = 12; /** * The total number of defined token ids. */ - public static final byte ID_COUNT = 12; + public static final byte ID_COUNT = 13; /** * The first id that can be used for internal state From 29cd81346983b158e5d25aebeefe68a0afe2267e Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 1 Aug 2024 14:29:27 -0400 Subject: [PATCH 148/199] add symbol keywords --- src/rars/assembler/TokenTypes.java | 18 ++++++++------ .../tokenmarker/RISCVTokenMarker.java | 24 +++++++++++++++---- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/rars/assembler/TokenTypes.java b/src/rars/assembler/TokenTypes.java index df5fe385..cee2a3a1 100644 --- a/src/rars/assembler/TokenTypes.java +++ b/src/rars/assembler/TokenTypes.java @@ -250,13 +250,17 @@ public static boolean isFloatingTokenType(TokenTypes type) { // DPS 14-Jul-2008: added '$' as valid symbol. Permits labels to include $. // MIPS-target GCC will produce labels that start with $. public static boolean isValidIdentifier(String value) { - boolean result = - (Character.isLetter(value.charAt(0)) || value.charAt(0) == '_' || value.charAt(0) == '.' || value.charAt(0) == '$'); - int index = 1; - while (result && index < value.length()) { - if (!(Character.isLetterOrDigit(value.charAt(index)) || value.charAt(index) == '_' || value.charAt(index) == '.' || value.charAt(index) == '$')) - result = false; - index++; + boolean result; + try { + result = (Character.isLetter(value.charAt(0)) || value.charAt(0) == '_' || value.charAt(0) == '.' || value.charAt(0) == '$'); + int index = 1; + while (result && index < value.length()) { + if (!(Character.isLetterOrDigit(value.charAt(index)) || value.charAt(index) == '_' || value.charAt(index) == '.' || value.charAt(index) == '$')) + result = false; + index++; + } + } catch (StringIndexOutOfBoundsException e) { + result = false; } return result; } diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java index 3162ee87..b90c7dbc 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java @@ -78,7 +78,7 @@ public static String[] getRISCVTokenExamples() { public void updated(DocumentEvent evt) { SyntaxDocument document = (SyntaxDocument) evt.getDocument(); // clear info and retokenize all to collect label definitions - labelKeywords.clear(); + changingKeywords.clear(); document.tokenizeLines(); } @@ -142,9 +142,9 @@ public byte markTokensImpl(byte token, Segment line, int lineIndex) { addToken(i1 - lastOffset, Token.LABEL); lastOffset = lastKeyword = i1; // Register the label, if new, to recognize its usages - byte t = labelKeywords.lookup(label); + byte t = changingKeywords.lookup(label); if (t == Token.NULL) { - labelKeywords.add(label, Token.LABEL); + changingKeywords.add(label, Token.LABEL); } } break; @@ -471,18 +471,32 @@ private static KeywordMap getKeywords() { // private members private static KeywordMap cKeywords; private static String[] tokenLabels, tokenExamples; - private KeywordMap labelKeywords = new KeywordMap(false); + private KeywordMap changingKeywords = new KeywordMap(false); //for labels and .eqv symbols private KeywordMap keywords; private int lastOffset; private int lastKeyword; + private boolean lastKeywordIsEqv = false; private void doKeyword(Segment line, int i, char c) { int i1 = i + 1; int len = i - lastKeyword; byte id = keywords.lookup(line, lastKeyword, len); + String keyword; + try { + keyword = line.toString().substring(lastKeyword - line.getBeginIndex(), i - line.getBeginIndex()); + } catch (IndexOutOfBoundsException e) { + keyword = ""; + } if (id == Token.NULL) { - id = labelKeywords.lookup(line, lastKeyword, len); + id = changingKeywords.lookup(line, lastKeyword, len); + if (id == Token.NULL && lastKeywordIsEqv) { + if (rars.assembler.TokenTypes.isValidIdentifier(keyword)) + changingKeywords.add(keyword, Token.SYMBOL); + lastKeywordIsEqv = false; + } + } else if (id == Token.KEYWORD2 && keyword.equals(".eqv")) { + lastKeywordIsEqv = true; } if (id != Token.NULL) { if (lastKeyword != lastOffset) From eb0447614d9990f2b81ad7c1aaa360838989812a Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Thu, 1 Aug 2024 14:59:13 -0400 Subject: [PATCH 149/199] fix colors of help menu in dark mode --- src/rars/venus/HelpHelpAction.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/rars/venus/HelpHelpAction.java b/src/rars/venus/HelpHelpAction.java index 03234bcc..b0b41a3d 100644 --- a/src/rars/venus/HelpHelpAction.java +++ b/src/rars/venus/HelpHelpAction.java @@ -1,6 +1,7 @@ package rars.venus; import rars.Globals; +import rars.Settings; import rars.assembler.Directives; import rars.riscv.*; @@ -67,9 +68,6 @@ private Dimension getSize() { return new Dimension(800, 600); } - // Light gray background color for alternating lines of the instruction lists - static Color altBackgroundColor = new Color(0xEE, 0xEE, 0xEE); - /** * Separates Instruction name descriptor from detailed (operation) description * in help string. @@ -188,7 +186,11 @@ private JPanel createRarsHelpInfoPanel() { // Set up MIPS help tab. Most contents are generated from instruction set info. private JPanel createHelpInfoPanel() { JPanel helpInfo = new JPanel(new BorderLayout()); - String helpRemarksColor = "CCFF99"; + String helpRemarksColor; + if (Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED)) + helpRemarksColor = "006655"; + else + helpRemarksColor = "CCFF99"; // Introductory remarks go at the top as a label // TODO: update this to consider 12 and 20 bit numbers rather than 16 String helpRemarks = @@ -386,7 +388,7 @@ public Component getListCellRendererComponent( setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { - setBackground((index % 2 == 0) ? altBackgroundColor : list.getBackground()); + setBackground((index % 2 == 0) ? Globals.getSettings().getColorSettingByPosition(Settings.EVEN_ROW_BACKGROUND) : list.getBackground()); setForeground(list.getForeground()); } setEnabled(list.isEnabled()); From e1322ef92828c9e5c32d8373dfedaef20d3f33bd Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 1 Aug 2024 15:55:45 -0400 Subject: [PATCH 150/199] Fix dark-monde changes on the message panes --- src/rars/venus/MessagesPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index 6f305291..1a865a69 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -293,7 +293,8 @@ private void updateIOTab() { Globals.getSettings().setBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT, buttonPopup.isSelected()); inputTabClearButton.setEnabled(false); } - this.repaint(); + // Force the repaint and the application of the look-and-feel + SwingUtilities.updateComponentTreeUI(runioContent); } // Center given button in a box, centered vertically and 6 pixels on left and right From dfb9a74e19549fb50b819c407b003ec5954bd29c Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 30 Jul 2024 15:59:39 -0400 Subject: [PATCH 151/199] Add tests for Simulator and BackStepper --- src/rars/api/Program.java | 4 ++ test/rars/simulator/BackStepperTest.java | 65 ++++++++++++++++++++++++ test/rars/simulator/SimulatorTest.java | 45 ++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 test/rars/simulator/BackStepperTest.java create mode 100644 test/rars/simulator/SimulatorTest.java diff --git a/src/rars/api/Program.java b/src/rars/api/Program.java index e49d2c6d..70d41039 100644 --- a/src/rars/api/Program.java +++ b/src/rars/api/Program.java @@ -154,6 +154,10 @@ public void setup(ArrayList args, String STDIN){ } } + public RISCVprogram getCode() { + return code; + } + /** * Simulates a processor executing the machine code. * diff --git a/test/rars/simulator/BackStepperTest.java b/test/rars/simulator/BackStepperTest.java new file mode 100644 index 00000000..b2114ed9 --- /dev/null +++ b/test/rars/simulator/BackStepperTest.java @@ -0,0 +1,65 @@ +package rars.simulator; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import rars.Globals; +import rars.api.Program; +import rars.riscv.hardware.Memory; + +import static org.junit.jupiter.api.Assertions.*; + +class BackStepperTest { + @AfterEach + void tearDown() { + Globals.program = null; + Globals.memory = null; + } + + @Test + public void testSimulateRegister() throws Exception { + Program p = new Program(); + p.assembleString("li a0, 42"); + p.setup(null, null); + p.setRegisterValue("a0", 123); + Globals.program = p.getCode(); // Shouldn't have to do this... + + assertEquals(123, p.getRegisterValue("a0")); + assertTrue(p.getCode().getBackStepper().empty()); + + Simulator.Reason reason = p.simulate(); + + assertFalse(p.getCode().getBackStepper().empty()); + assertEquals(42, p.getRegisterValue("a0")); + + p.getCode().getBackStepper().backStep(); + + assertTrue(p.getCode().getBackStepper().empty()); + assertEquals(123, p.getRegisterValue("a0")); + } + + @Test + public void testSimulateMemory() throws Exception { + Program p = new Program(); + p.assembleString("sw a0, 0(a1)"); + p.setup(null, null); + int dataSegment = Memory.dataBaseAddress; + p.setRegisterValue("a0", 42); + p.setRegisterValue("a1", dataSegment); + p.getMemory().setWord(dataSegment, 123); + Globals.program = p.getCode(); // Shouldn't have to do this... + + assertEquals(123, p.getMemory().getWord(dataSegment)); + assertTrue(p.getCode().getBackStepper().empty()); + + Simulator.Reason reason = p.simulate(); + Globals.memory = p.getMemory(); // Neither this... + + assertFalse(p.getCode().getBackStepper().empty()); + assertEquals(42, p.getMemory().getWord(dataSegment)); + + p.getCode().getBackStepper().backStep(); + + assertTrue(p.getCode().getBackStepper().empty()); + assertEquals(123, p.getMemory().getWord(dataSegment)); + } +} \ No newline at end of file diff --git a/test/rars/simulator/SimulatorTest.java b/test/rars/simulator/SimulatorTest.java new file mode 100644 index 00000000..1ae7e6ed --- /dev/null +++ b/test/rars/simulator/SimulatorTest.java @@ -0,0 +1,45 @@ +package rars.simulator; + +import org.junit.jupiter.api.Test; +import rars.api.Program; +import rars.riscv.hardware.Memory; + +import static org.junit.jupiter.api.Assertions.*; + +class SimulatorTest { + + @Test + public void testSimulateRegister() throws Exception { + Program p = new Program(); + p.assembleString("li a0, 42"); + p.setup(null, null); + p.setRegisterValue("a0", 123); + + assertEquals(123, p.getRegisterValue("a0")); + + Simulator.Reason reason = p.simulate(); + + assertEquals(Simulator.Reason.CLIFF_TERMINATION, reason); + assertEquals(42, p.getRegisterValue("a0")); + assertEquals(0, p.getExitCode()); + } + + @Test + public void testSimulateMemory() throws Exception { + Program p = new Program(); + p.assembleString("sw a0, 0(a1)"); + p.setup(null, null); + int dataSegment = Memory.dataBaseAddress; + p.setRegisterValue("a0", 42); + p.setRegisterValue("a1", dataSegment); + p.getMemory().setWord(dataSegment, 123); + + assertEquals(123, p.getMemory().getWord(dataSegment)); + + Simulator.Reason reason = p.simulate(); + + assertEquals(Simulator.Reason.CLIFF_TERMINATION, reason); + assertEquals(42, p.getMemory().getWord(dataSegment)); + assertEquals(0, p.getExitCode()); + } +} \ No newline at end of file From 13b4b0c99c8419b647b8efce7732fc900f56c00f Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 2 Aug 2024 10:30:33 -0400 Subject: [PATCH 152/199] github actions: matrix run on 3 environments Try to run the maven build, including the tests, on various os --- .github/workflows/maven.yml | 14 +++++++++----- .github/workflows/report.yml | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 2520b273..383700b3 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -9,7 +9,10 @@ on: jobs: maven: - runs-on: ubuntu-latest + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 with: @@ -20,17 +23,18 @@ jobs: distribution: 'zulu' cache: maven - name: Build with Maven - run: mvn --batch-mode --update-snapshots verify + run: mvn --batch-mode --update-snapshots verify site - uses: actions/upload-artifact@v4 if: success() || failure() # always run even if the previous step fails with: - name: junit-test-results - path: target/surefire-reports/ + name: maven-target-${{ matrix.os }} + path: target/ - run: mkdir staging && cp target/*.jar staging - uses: actions/upload-artifact@v4 with: - name: Package + name: Package-${{ matrix.os }} path: staging + event_file: name: "Event File" runs-on: ubuntu-latest diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index 3e3c8a16..be729611 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -31,4 +31,4 @@ jobs: commit: ${{ github.event.workflow_run.head_sha }} event_file: artifacts/Event File/event.json event_name: ${{ github.event.workflow_run.event }} - files: "**/*.xml" + files: "**/TEST-*.xml" From 1225b63326ef57331a29c03d436e608dc82ec94c Mon Sep 17 00:00:00 2001 From: ElTitoDG <43906735+ElTitoDG@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:56:25 +0200 Subject: [PATCH 153/199] Add jpackage plugin for creating app distribution binaries (#62) * tested jpackage plugin * added color icon version + mac dmg * icons for other platforms * added win config and linux * config changed to build package based on Host OS close #60 --- pom.xml | 71 ++++++++++++++++++++++++++++++++++++++++++++ res/riscvColor.icns | Bin 0 -> 14249 bytes res/riscvColor.ico | Bin 0 -> 7431 bytes res/riscvColor.png | Bin 0 -> 43325 bytes 4 files changed, 71 insertions(+) create mode 100644 res/riscvColor.icns create mode 100644 res/riscvColor.ico create mode 100644 res/riscvColor.png diff --git a/pom.xml b/pom.xml index fe5996cd..27dcaba6 100644 --- a/pom.xml +++ b/pom.xml @@ -108,8 +108,79 @@ + + + org.panteleyev + jpackage-maven-plugin + 1.6.4 + + + ${project.basedir}/target + RARS + 1.6 + ${icon.path} + Privat + rars.Launch + + ${project.build.finalName}-jar-with-dependencies.jar + + ${project.basedir}/target + MIT License + + + + + package-${os.family} + package + + jpackage + + + + + + + MacOs Profile<--> + mac + + + Mac + + + + ${project.basedir}/res/riscvColor.icns + Mac + + + Windows Profile<--> + windows + + + Windows + + + + ${project.basedir}/res/riscvColor.ico + Windows + + + Linux Profile<--> + linux + + + Unix + Linux + + + + ${project.basedir}/res/riscvColor.png + Linux + + + + diff --git a/res/riscvColor.icns b/res/riscvColor.icns new file mode 100644 index 0000000000000000000000000000000000000000..d7cbbc522a88362d76d4b0f543683be7117e62ce GIT binary patch literal 14249 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 Wd|h5|sGbLnAh^zrYvo#ZpZpIGu9{Q; literal 0 HcmV?d00001 diff --git a/res/riscvColor.ico b/res/riscvColor.ico new file mode 100644 index 0000000000000000000000000000000000000000..7af0fdef752b3c286d3cd8ea2655845b0d078b50 GIT binary patch literal 7431 zcmbtZc|26_zdv)#7>wQ6*X$%@DYA{SM#h#c%Y;-2g(#WDlqAAeQI-smWQiimHcAqO zLP=sM+0u+;8_V1?eP8$9*ZueYX3m^*o;lBXp3n1H-tW)n8~}hpU-kzEC;&?`03ZgP zUvqY{<>Qg!flm4C?W|ncSJ^)CNQdi4NIe&1{%i7TLZnFs9S1 z=$n$9FLinUgDs6On^%=sfm5xsGB*<8{T}gZ#OwlYuNNv0v-^}%juCL4yw*{OL&xcN zMa=QlaO9J&UcQB;$_$X3WrME%fvxpsr6QyxS4mfB62I_{2H9K@S#F79A>UPWbDI@J z-W4F*0{7aarz_+(?-EIW5H_Hq_2R)YU`PAaZFS&YhnN^{XhU40>uc7vm?8c7eNgi= zO8W=<;{Lkz@R#AgZa9`ki=+DY4MoKTD;73;$3H!89%q{jQUHnnySu%9cz=|y#H=;U z$Of>dJnEvisrB|4yU>%{!5x8?>T7XS9ZVb#RS0y}=kOn>7kEJ5k;=Iht@oZ0n>siC z=B{BLx^fr>+o%Yu)jAInp_=V&#n%r zmT0J}>;8EAtVdm2+c@PPVRLPA$JX{NgC3{j0 zR#=dbL_03b>fGta^om5r8qFojqKRXS>jz2C8PMjKA?suIMUf_Px<;0vlU@UUvLih` zAwI%(%5Yu5(j+&kx-Mq{UmHr5e1{@Dlyt1ajAqF==8U|Hj3l-vHQ>xfc%PE}D2Sg( zB(Yp%$Q3|iE+d@3yh(g=bamPcw|@lI1{4tmI+|&F7~m-YOS;<8irdvB=gSwBA2k^+<8=UjnSu05i)*n%b_K3p>X)iYiBctavs)& z7&}LBu^b=)}a-U zE+x(Ep5qw#a^;6C578MYey_O=Jp9qd8IXik`ijCuOumDiv{$3dduZPB=q@5!e?Y9? ztcYFf{{U;U#BV%0l5SPKE8-@C?GwjgTD8v9&9Y)!!}n*hK!4;%;wP#;uA;uR(rGl` zGQD0Ld&^^kTR}XyyMkcV3_Em(gC;u;V_w4y=@e?q2PV}UJKYlS=8MP@V5Nkooecg~ zm6g6y5u^A}tT#*p;8A!1HhHYJR-a>TXVtH^@!#d>r9SFNr0p{fx{bhdY2V86AGRst zw&@NB4CU`N61weN-a97raTvM&US3Xr{Fvw71H1k|MLj(ghZXG~yIkzGk5zq5r*Fe!#9XLnZC9qrvO_oy59LLM>`%^mmGSn9yP2V#>5RgOpD7os*FOzAH` zJniPMbr5-nlSI%YU}-RE!$pqy=Jxax(*+M!#<02fh)%u=BrxhSz)XS1B(5Fu_Hcad z46KR*FWE-_k9UV)wG4Hj3vX|5DLWx%Fdd9a1B49-YxY{ZXMzp9j<1KT&rNwpIUu>& zlM?gB>m9$v1@u6Op_;S}A;w)pBas0OP$F_YWMhuGDPC7qAaVmy4j73Q{Kbv`UOV;K zv)?_gL0!BPniZkNuS!Y+wfPU1G#Q;bjhpsoDN?MhPmJupe!?(dqD^Ye#oFYIPhDKl zte2+gZJy=FlV2h2L3W>2-SihuwXp0rUlh3>X*jt`cn;7~ga?26^)e<}4`O#gT zH#x~56VXLprk3F})nU;ce6;fn2Sz)NJD$_A7z(j&ZfdhdW#TXIT3%BgIUp`co_v8K zvnA-uuMM08_uC;~cG%+pBYv5M%4@DeHpOeaFH-FkcM*4R3KF0bqMS6?@tGFL;Be-u z0Y8!cMG6yV2S)bbx9yE)o2NFR!jbueRwOaQ&gYR97VxU>IiP^ZcK_ z?3~wgxTi7pd*IhQ9+mn1Hf9`%_k2znO6Wc2$Y)i!$h-&GX>n1Gu5O4`z+!c`WwzW7 zz>ntsT*ev4^NtDNIcswHzwGWMVzjP=@CE^%(Ptg+iUOR#)#@HjN$lc|WLQ-^=~77mKWY zI%H*62@U;=x4>~lWJBzS@tx-~e{$YfIybD1t0G@}pQ~+gHW4MNkN$9O2gi5oN>*j=*5^uggZSa9 z-(&eELEjRRy+SJ)NbcEHhM-;dFTnrrUT{#$XsmC*%VKEcYi6jyCxN{_Ef#Jm zh=R-~(~`9}Y%xD>_Ynu|;EAJpp?`%%dFUP{&BtAZA~;=upv< z?)PVt04G44bltE-4w(+Sc2*rwp;pl1b*cCNnEsZe3aSv{TokqQfht6qOo0eQEKYWW z|9sM;@BQBe8K9CmBC5`-a=pMPGYm21RC@D!BpgFBRftdYC4VsRm7$>g}Y_cFr|Dq`TLDr#69XD8aM>&bU84lw4UQDTn~{m#6vp5 zUZOFo1IRHB{=f7H{lSHI9YASup82cGPW#m=iSQii5{>)cDdrq05h>na1?}j+ZS^C3 zmcm9H;iZ4$r=|~n2|V@N9;dzjZ$_kSR(>F~Y3!5K=U)p;GY?Zt717Kj&cC;gA~N9@ ztx|qb@^_aXn9Ov|EIOV;z3fF-4gTx~_z6*i8CqVlFb~o+l%$A1fQu(hDyAsx3T_Ik zU*y^o+qUmp4)dnf)+HjCf){=PAO>P#Lm(FYnPVUEmg40sl0Lj~Tpt|tCg$y_y#uEB z4=M5skS0!j=ce#WepM%GbK~$g5d&FRY9LK6?oAR!AFMp>yN8Z6P_BGJWZef!a<3&v z%29qDjPFb7zeB831}yTa?{E|+?wBU=+H5ez$w>4zIIE?TRQFsNchSMQRdq}2Z+fvR zMw|+Y^2UJAJ}M84;Kg*W{ss9>6sAt{Qoj!188J&2xc!4Sgm?r^>_Us@%ATJ-4yj}y zip=;jZhM&rC9KOQ;b#qtM>QIpdNtwf!7>}`sa(Iq&Rz22MM}L|r{b^cWli48qN`Psi;^p2DWaKvMumefqmaXc7yB8Ydbqn zhzoyHf+)F1q_$#zPJ?RRDh*wwWX`K?PLMK|6oFXD%(6*ysx>Z>7tON8@j?T1UI+Mz z74y--$?F$uxp1Z)&aduIgGxL_$;L{eU`6uz!9GFJti#Mupvlv;I#$9uD7~Dkw_

a!22n}>9zwSY#_E1C-f$*^VIkJ(Iwn~Rfv>cuh}pecxj z6C6>~+Orpz8XMuBMn7j+nY{YO>$5tbk!D$0S*V@uKlS{Tc$Nr8&q%U>vx~G``ia1K zo1=!K(V>VHN#&U{bzgizClg5NIFpe*;OTpiP$q5MBlUW<@v{e!qO1Ta2(DiJ<@0uZXjrevPyjw;i#V1EEkp|YN8g(99nq+E>uA7oI?NX*4tg{LLcXMcrU5Gw7y5ZCjrfx+9erGgHy*fEj)x1-4%GDv=#BTvZ;VOf&S>2XGg9Rl#E^mZ0%utSvfcY zj{rGh(S)n_SQl`)eAfeFmHof&B>a9}1g2QP9!Mvy!5Vir_pnTSd^l=fHnbmL>NL!~ zXEjp9vD+HNcwwqsty~pw3m5#nS<}*UvhrsHVF7#A_|)U$ODx&aI!KQu+_>HGh?Xi+ zE;Y1P#+2vR&7^igUTmD_nyz?j+)&*4>YPHV`__Ed=0&TuL4NPH~kl z4^<5GA}#!CqvY~4)+!XShx<|HFA~mrN}v9`oR&5wRc%5f%-TA%Hm)gMA-NNdswEUdEuFm)i; zY;GpKKI66Z5b>;MUa7sMg-2#3Y-?f~L34muTJRI7E86a}o9;9adI+WkORO(sZc3Go zyG}^=-UU+}VD+~jZAiO5uRI!ES~MQfm8N56ju^heaE1A23y{a{{B4qTAC3#*4 zTj#SipEWV1l<3KJe14dE8|WF&Y95pF&6s~CKk&ex%%>fr|GMX0t6nV_9y@UG?jBq+ zL6Uwy6T2-QpMUB5W?l&XJG&~)x{GAg5v+0#pzL~|A1((jlHHAaum}r|e)7A0i&G|2 zYrQCYf7mIb6?ufY>1bT=bsilZo&B1-XCzcqc7`us*C38aa{W$jyc#gLP3&52-Vi4f zx;2}SGG2_3aj`pd&wtT(M}}N{p-G$@EKeZ#1RNZ5)bK>!XuXDUpe`L?=LydrbsaaO zFjx7J@o{vftH6m-$0BnYVsP^zQ~3j8f%Kk-XPAcM;b^dO0M ze4&{!cCDi?ai1sJ)FOW(tEqz|A07qOlikcP8~NbLd9K`uO<=!2F4K zmVV_sYNSuizgyK|rrh(?Wg1^CXBA?hBcxXLC%DJ89?9=g&#u-we>yv_==CVG7G6mH z8ju%w+Wk&X<8B=-fPeQ+2I*MPQXI$H`4yABFMQuZ1|P_Z4NYsj@##uFxtTdM8vjMs zbt?gLmKGNvI<>sxJ28DTycZm>f~@N#f!g`!!ti)i)kY2-`SVXJSIjMR?pFk3_XQXG zPwy?eYuewO{Pd8tEAe9*W+_2_dpKq_OCEyokuxV0V&C}$&ikOefdq0h zYskS+=X2Himli&Iz6$Q~U!6=SV#=n6Z@<1@RLz;-v%$}vA`f&9&*5(9>Rvi(^E|GrfrSIia&p7-r^f81*#i?q=?~Fi!m(QZpJm33 z{y3vkS&wj+f7s$3Vj`j;(Q2~+baN|N%fM7}R)Iu1r=;!r>e1*;o#mQup1FYr`*@#v zY_;u@KdNY74W0rMlo&VIv=@`pPleO@I-o>sC9)gz68aNAfcR)-2cYs7+(Z&Hw(4cJ zhga7Ru08btZv)z(MW%Lp*pcdI?I4y^-qB0zr*YK6F2UNwNIy*+PqM9WxhH^XM}QUN zH7a~p4E^IYBKsqk3TK?YeVvtoBX+qFVx#}uiVB}mT3r_x%aO3Q9zQ=R_u<<_|Bz-C zb2HjnA(yB@LA#UlI}{nZUOXP;Po;xVh4sitA(BDdDL#L8R(`PcLT8iD*L{C}bx?|n zLobi?>58&ua0Sy-aSquT%{HwX&(wXttW#J^Z|_)l-SQL*l@xaMd3b;Grs_4!#oj7X zhn|A6$ahk7a32PCTZMH4B7m(e*H0;D2`>9S7M6~8<;y3(!VC)s-TLu5v)Jr+{>gf* zdrcoQT}Xs@D@H~r`N`GHX-i0w`$FFgmA-uOkNt`^s&_mj0r!}6nTB4&k0JmLahX9W@l+_>H$yQ(BqO+~v3e4E!igpZnn}#ilcG=f zi7*#lU&lvw*(b|iO`nl;A=H~Vl36D`|az;a<5#R4^Z*T z9G_H=vptt^z!Eq_HKmNh?>xHZqx+fmo92Wj5<1t9-q|r^jE#PjoYi(nYdBxB-VTf2 z22XP@&C=!K3bXFW-d?cq_P+vEeS$nxV<`SOa+wIq**c*HgSBskg4FEC=EXH`ECa@x zU8F6$T6c%V2QT#&P!)vYW(TjB=^)G`?Xto)Uy8CUN*`f7mny|(C#-{{AOF+<)KF9< zdUyGJlRRT((2~xT#!0ZSTH2pns7#*zVM(9F>8o zJwJ(X?VHnG@1TTrC99}c)_rS&Gry!^(Q6fr(c;3SO9b5hwc6M7M2mDD79YtF?QsbZ zWmV#8yWChL+N)C$ChVLADp(B2kEwc}bL0gMui^X-m!zRLc?*IX-j{C=wI4S7-K;JtFfFAm0Ru3*!r+!QWlK3vEymQgd~jmJ_fy1@dxBC+&rJh zGBCL?qUxFeg;}bt5&Gtlo#m$jGTMG87>;0JBRbH#ARdJfI7RGj%U-4O1AFs? zja0(gHf9N&Bd5w2J0C}8g!1|vgmtC?TS{Fg*N_tc2U~cPwMJZlX&6JCuEI(X$W$W#YFIQFM3#_70r^PL>KZ$;(jw_Bu-IwEHTcTgWWZtdvhs2WCq5H}Qwx|9cII z>5p=t)>nP5qn$O06v<&`Wh2GN0+{Rq(R$;8Rx!AC8^slK;cKbBfMf zA)}%>`v!-@MsM$`$_1V+wem?MAOHVu#^-kU&a57ZW{Sa2L+>yFduu1FnuEBc{{r}k B@vr~@ literal 0 HcmV?d00001 diff --git a/res/riscvColor.png b/res/riscvColor.png new file mode 100644 index 0000000000000000000000000000000000000000..ba091820d3629056161640757225d3af3ea6d321 GIT binary patch literal 43325 zcmeFad036>|37-K=1oc{p-C;W6=iCs+9aWDLlbGB!O*Nx(;^g6Ss^rTQ?^n|Q8X@+ zBn`AnX;e{ZE>fD#`+nB*WPi_f{yFD&o$FlZ`t9eszTeIB+{63*de86sUOwmlG}50l zYw;|E&>VwpTlOF%V1f`|uK*vsnb>Bs3I6k&>o)Tf2(6aG|3~w=tL=r53^LfFyU!=K zr%~Jeu<6NHpR(=>U6~W7KHp2`81HG579sg1>8i?~MYlDb$~$#V!mxJF`p?_;ecAcX ztSx8D)o#S8qYZ^yhkL(BGdh~WI{yCSGXD{efZfqNQ$G0%X~^2yh#A}T^Cmq(-u%*H z0mQiN8P^^i)1T%n^}%2@e;GGIEN`W)!U(bXA7)&V&ws5FYbG4ai;z_7+WN{?7#gGv zgWg_XaUp9Bqx3oQ`ERsO1D9sZZu&xl!0fTF_OlVP9y%k6(BZh{zE|6=WbYuDOL{ud6E!5O6G;f>3Q*hQLY~TA5!uA{LhX=rAl=tYbz)ENKUkeZc*R z@zo^-uP)%_7?_n^8Aj>n6S)xDIu@Y!x3Mmrp!$z;aUUvL(Km$N#{8EV={)NqgOFPjlM={Jnj*vc6tnO1|VX z!CxIl*2BSIYToz_5P12f9YZVYr&FhYFPRpK1LeCenXH3QUuKC4;DD~Rt*x(?aZZCj z_89{I1F2DTZTlQ99*}5!w`1Fdetlu!`faeW3_{bcH`_bRCV{*iBj!x)>?DBAp)>m3eAjJC98PxPkkK!%B)_QTnejs@E=U1~pu^UX_&pXc_0PV0oMXXiL zS?lrBCm?dM*I*`Wi)Rnv&)07$MOlPP!JlfSRlz(?JPyB)U*FS?09m10CF12bm6BwF zrv=kj+E0E1z}bOMA911UF~(S(*pK5b5u>F+@03*?ZUateRG?c2_SeOrd;x4-fDLp# zo!ZVvgIL*pF~(L|m|*hkTui}G61ExCP?b#lcYG;k^Cf>2>|+u8a=H-yD+^wZ@r=cX z)iNdxJ7uI52YP&c_Ho#g@yrdtLW4utdrmzCDcEnv z%Qv3HhJgH7i;2b5@M3RFh{bB>V-VRpF;BlAAY@>@YfAYf3~zD627DzBn;f#*qv6GM5|MlNt zhz^z+=UD+{kk47*ne!xKL35r393tQ^j6X1q#PcVPVw`6dXA}6#e~VI>{O^vbC8P+} zOHB;Q`6^JzP%mNNYN6lDxbL;BEb$I@fQS^u;HSM5)o9*p2dq2dK#gy(ICcrH{5jb@+Z}^{T z`{6HN#~_Wpx5bPm@pf#i+n8BhUX^od3)BC}iTv(>oYhSK$@|ZVNqr-2ee*jy(!3M0 zce)33`$Ihvr+vb6*ry`^mhMI<17cLu3H_^iZ^r*BT$`TjNioAvHPsfexmEQ?F(`2#`Xlh~UF z^HJ^6l$IlAS2<8tyn;7ko6VlzF(=>XyNJS);@ixg>r#VuMjFc_t?R7Q1sN-G9cTUth<;_!tNNN=%Ui4soi>_tU3FBAN?gdNe zoTX5B(Mppzc5B|wp>CW}5>I%;ZPPfq@1qJ`hIhbP9CwL_@i#6tIM09Xg#_Y1_rkFW zg#Jr!DC77qyCaeKzmwc5sm7=(1!~786j=7>=KD>3l}qEeO*EhkrK@*&fq&=svM*)5 z>s)n|T%=WER2OQd^~Y;(yG|;g#NS~DnrF*d>skg*L^L$V7ha5_CuNlf)vEXBLm`Ww z0kegg9SNJh{gl*R!Yg(x&8BE?<6uO^j~@a35VRUA|De_?ZadVWcoB^p+5EX|OAR;xZ+j-fZ#q^E@T;$n4Kn|DHgthW`e z8lenGdb-m+@5EGnh-JapqDAamzbP!gb!O2IFNmO5g+msSYcuTTZ^eD4LrZ}_Q-f5g z@jx5gK!oV$`a*#5+dPxVEhLRBet5w<&xEzGVy?aaWr)pV9vvJC2lkoz{^*c2H3%GM zcf%+-nH1}JBXjM0&WYtXkn1Tn8%v38wP>8U$c0wg@P@JKa-TK$er;XaztEnuA>Bex zoW_1BpddpMR~wZqAcxGvZFqa0Gn5ZcMivlp8TEB(lzc89i$2hSzpJf%G3z>G zaYVv!~}7+ zV@!%{MeG*>3JiI_FUoE7lCI5Dfp{E)Kf6|a+N0agh6hP3vf)*3*jq^O%?PM~LmqpGXdxBi782+A zU*6?E#r@x1ai=Sq8tJN+?VZE}?^|CBzV%A*O-f>q=#{)vJ%{)cYEPL~vbasG$Ldc7 z&$)7v|EuJEK6O)Jac^Pz!aqjEr?=g?;(Ji!!a(xl&~;0>2FjpSh@V-%x>Kirb+2Sn zIA0N3@vlbJe?$L6;6DWZ|B1kh(tLg-9%^b}G%m$8Vq5bA8+cDq$xq%8>l?OBKcLs| z4f$5jtD{V9JfdB%8K>N=h11dP2?4^i;~DgY@E_#55Fa6Op8tHu{~HKc_X}*N?gISp z>z{Lb{17AL=FX-#y1Kb^bX8Y%ZoyHkc8tGnz{}>qjd7M`CztRbwG}UBS@)|)$v*j@Dz5|RPN-VwZ2)CjyG(_wf$BxC!Tz7avVP~6(vp_ z`nV>Qv^O5jm)4lL>B4Q1P4X%IQ8Sd(TrOrNe(YhL8OGs(0* zfg6p$Au)IQla*~X2mdPUKhQx=WCzB!*9S#y40_GqAG-dFxt@5|HG`?V?;FD!MDWy7 zgqoM7Ft}Ms#++(Lu(?aJe{wKV*jaC}@IlWZ!`C*@c-$EiyE-G3Jz_XyQ+k zI27z!X>*oj1}UF}H+dg@e~ocX#AFU^3kngXXo7C2vAps;CHW}t>0UoLqQ(#7^2w10 zQC;7@772CGGAI5ad=&8|1fLUfo-639RFc zLT5yjw034P0?t6jr|a_O&T-QjZt+fm&_eVH4Hi&{ zKhAIS${=58Rc1v&V23(q5;e& z&R#vQWPgN+G;3K+rwA}MikL*gR{7s+de$V6tw1#4Bm!$E3MlxfknKZdnK0<})ykwK zdXwEj>yT>(DnTQxP-QNL!(0>BZ(eilV_ou|1WZk8;wygO>Kp5XHX$-=ZH~Yu!h;m}kQbas%6S({XM(iqAl!Q$S;|?|>;{$(a=mj# zlpSRV;n{yYnwwya?Pk_~IV<6Xlw|AT3w1T-;xr`p{Z>B>@wIA|;H22^eMiE=skdK$ zEQBOuuEmzuz?ptW5@g!sqqgt=pVh*Dt$_c}5g-aSP^0koaD}zs4?6ej`u!N2e~eXi zgVoj)m!$>OkN%wCkKje@rvaR#XxE@A)4X{zQdTsqcX}nCF`oZpIO&7Dfl>Ob)kaYh zu}W)Rby>olGV3d3<|Gk!uUE`Kth=pjWVj;1vYAgzzWYP(!-XB%)>?358BB(?B!jN> z6JMW0jH~y0ul??vR~w2K%O3omoRcq&7;f`9C&9`qm%J--9G<+?(yEobWVO+uhXRP* z2^Y8UBlClAVTU=dSi$GgUNM9&o*{cpeeWJODlU0cR8uBaP`p?KF?7k**m4b?8ATnt z(o{`DV;!Ds<$>&z%>3BvHaMy7T3fI&XzJTfx|Q=|wTMc%jC+LK%DVVw<^lRM%L3=k zVcJ8>9o&_xm;wBaDs*|R__YH z7wX_?cz84?=3ejWm`uN@cEyrndTD$y7ZMl6_uAlLiyZmr9B&)n{yrNn{Yn?(`@QhE z+SaI=@4T5gzO00vT)h-Z^;0Bb;bv7{9}MgB42O0wO9=|C^-1EDkzxI+n9T9o$BpL9 z4EhIyYm-KBO?HC%tZZ0c7Lyr6_l>H4FgME#t`uG-7v(z^5LWc$fFfMo#25bXBggU# zE3#wi70ic=u>53teev~Av9Ji(-2m=0r*y#8L7|)E5?dc|_#Cn`gmnG@wWs@m<9}?T zn~!MCL+s~N>TbXUwS!e6*Z{o?=^|Sc2rVTlWJ@Xcu))a0K9qFn`GZtj~7=V(61vj{H76ZcIO#V*uhJ zHtD!5Q2sqqZ%e;zlE zKh1;d(};pq#;L(_@KL`xVhmC@K=?t!OW_9qATcg`_bJ-$Z*cOCYL{(= z+x0>e3EzMO2T@bSlTy4$O__Yln2@H5H~25ckYaDqd?|{QEvc>f=b9q68tKWA z)Hc|l4c}A7j}H%?NSRv8Wjs-enkY|9Btb;+cw(VEH8H-FKAazd(8y*Iq5(l*C(2?A zj0&ct7lf;0#Aep~Dy~$K3;&bt=dPP7H)MvB;fuq z#lT1+NS+=QUkr}bfZUrU-~F^TyZLvxu}}HKp50YmQFPS+$c?q|6>R)iPcJw4f;+BS z@zk3N2yDxrZAzwXxjhTDQGStH&^S_-c|ucA1<*qw9E4u_kT0{CLnl%>zqDP+iddm`T71X zhMTue*ZxBW3%2?93=e7@_kDP4(|xNwVX3Xj)A{E^liLN6^^S8SHTou3s_nMC&Co;) zmvtomuh*OpHTL2`18RlDeQd(sG`U6&=|oK`bYk{m7?;AE`TIrDI9jF!~75jYQFQrIvT39qjp>cl3qzH zF#~WxcWAAxKGIo8vHaMALM}0kVnzd)(IYe@@i_G^yG>U1D~4_!1zq@xH^=6S^aJLJ zJE&0_cUB~qhSt&@kd6bzhDU{-7yRbwEJbti0=o?np?Y5Y$YVyHs)p&@C~@}8GWQ8I z9RSUGicpUa##{cW6G4^s6nm1!SBxb&1eDFpOqn6zctEryHaMMig8Efap=zalDF4_K z%W|y_VJ%oIw;~)dR5(&@xt$R@x>1vBH2c$$p93Lc2@@TLTP8lpPy5and1P6>X>xSzr6W)G5H*dKJCXwhwZus%|#6zor67j>LBAyc)*rTJ5qLmZ1Q(u7c#=qrgaH4en z$*&!SqlZL-F0B?5d1S8S5L4(tD+XI??HlnBc_oSl=p;{D{HHF}sEQ=aS#2UR=+F?c zN=(0xYos(8hHN2+XxU37_|G4ieK_oF^s2;-n{xNN%@;{y?nQ|kNSb^excP6&yx$h+ zIH=zsyvpQvV|FG%QKmgdQP`et6>TjbJA5c}HHH3Cbd(=n%YYRS`rtuKRw^{bjgZg+KmI->FV;^|EaSQ}JJ7NN>n zmK<|#seL6q<*O-SXeu(eW6RqQrFF|6{r2-UFvH?i;uvmZm!fRb)|Uma&ifr=u3DB4 z5u?|Kb0vduPi=glB1y@-AtgFPLv^-B8HQmFxp?CFP5HKi&4us2eE^xQ)fC9a3lBI^ zpSvu#zAXK8B>Q}U<)hj=V!BzFOQ}yq9PjY)&|DE0+16&uM~um_fn!BlIo#;xn=p=t zeEcpc%`7);+*I*v1O3PoZ@1}Y1=K<-oW+<_J3pS2P^lNzgB8o?r3@xM=F^drU+`Rp=Lqpx%XQB1sHoS1qp!c%BPQ+DaS^<0$LYc1fMAGD1zlWSEx_XLNtIim# zgdH?`04xMQJ$1>Uqd#2N2WU$e7MHB5T&!olO7>7xEDc>EorI2Q-i1(%dq1BT>q#;Y za%3@Sk=f1?Ke)rJ;G4`d-o+1BB*zRK<3;|jIBLkq_gNGaC$Px2SSNUr3DPt?#L)(w z=G+V8r;0wiuHRS^eu^(UJXAxI3*E#j3=bp!sv}+*DamaRSR#ZN zj?~PjAKZeZY-1(4eoM{ZMlvy^-|?@P$+grK7PT|he`yHL$Ch;PjNSnMyjDd`p77V| zbJ58%4%;Z+e(sO93#IKsY8P-!dSpFgqX8#^#}%5`x&U6V(sJqslI+M0Ce zS@rkLjZWriZ>6!Lwx~Ui7*m%iHc&kqGXu!&IQnLRU{E~_3yu=aO9aU;n7_M z$+wY(Pfypl3-K^Ek@1S5)eqWS-y`6&yh8_d@{+W?{(e&JW`0FDBWdNEH&|%TNudqp ztxZk58_P{g940j-anVJEBXW4M7CHGyxG6Y|wVGU+pCtrP00ni~kUgyVCY&Mf3IrHY z5P$J?vCs`u1ZjouF81?{abZW`eAF!mNCYRJ+h)Ct9P^AsYQKe(S64Od9 z{K|ahl|1BCY9&Ia^uf_F$|*JcvMx38-KJP>bI2jsODPl51phG({J&Jf@Ci_BNGWk} z8NGmGtHfy%?Z>6yjeo8LLLm7O6^ZE)Lba+CkqKEGBJ-^;gY}P-u>kdwiW${2*QW(* z->(@-x;RQQ_{CsvmJ7AFCEnZ4i^qQ-F#Adrd0eD+uLoDCQ6A3NH9_n^DOK-}Zo;=P zgumd0c2Nrj%8Lwc(&Unry^y|NZ%Z8L;W+7%P~(6*NCTDB}_VTo%lB1T^PJTuFQJ zpzYA@>D|OBXT*tlXB>lU`4M}QKV%T!3PYB@ED4sD(jFb{7a4R_9=zMU(5=8@Dp1-9 z{Nr2ZXzt8ifXdwtfU$dC>_PjG$^%$OYWWLiwInZ(lI9m#<1W|qeJE>l88&ata*4XE~t9x|FDxRBBqnyGJy16q@LVNTt-HDFMPYHv)3yEKWFh=~O zErXU-$jVyU>m&ARL50MnnOau|BWnA2e9=wWf|s3{u97X$N4)^Jm#ot@ zuAFmjYxy*ouGIb6@v7t>{faNFEO-)&1Qpa)BykSB7k_rz;-4U?+dm-!LVJAOhS#c{ zv$2l+C74c*P+T6sj?ZTeClK$4xd zBDshIiB_pY;VhEGL{m%f(cS<_l;j^ujxUb4p~scpQ6&-6N)Sl#vu${}?D9I1Z!cDY zTRQSr0YpjS`P*`i{@%1bCj^7+LETP}Mvu}mxI52c!`2ERO=}>^R6*^u@xNcW&a-^j z!oHCHK<-vK1cfB3UXhgzd?S>&Fn2#qr<+<(L_{7`0t&piANqKWtJJdZz>{mZM1eop zWk<#w|MlYG_u6^{G@SnD>#s>YC_5Pn1267>E%0|V5e0RVoFIX3`JME-jF8;@&zJt6 zURm1lR~{woib@cWa2%xOrgb77CUKYq8;XRIf^_cA6oOsKW(SsGw}>%%XZb#JZi9RXU?!yX03KJ-cG;L0CLQkRGCpc5h6!7LAq7q>{Tg~*YeJXwmDa}# z-~IFSbbxulcr;?~HiVks*T<_TGz-VxbYo`63Ig z#tq2jT7EAFw`Ks^_UJVvAE9bNJq=% z4c|Uz1zx6p0T8pCrJmr zR#tlR)xO@!kyI_M5P-OFCGbAUW|Gj`p9el!Z?Tjjve}D7UKxsKubynbtA<+rL ztMy%V=It7=5&1fi$MGN{iBb@GX~)D?imGRz{6_IV7ic1_y+CipWEln5iAxx+OxN94 zs=quds3WE2lZveZ`4{Fw%6@PYRTK|c1Op~m>2w?*@2>kEMVWKOhH|0A`ClQtXmrDz zxPtPTFDep-{B?6c?5+o|R3DN~cui?UkqlTv%PHgCCJV=Z+EN6qCZv&YU+z$P#jYbH zMm??lb+pG#7$l=-kVvFi9iYtZU@RE%$!S&iRDOM-oo8PEu46N^=&*x~kSkZa9EpVW zLR^jAYyld7&P}MLNGWk${~ZdG$gXT~r+;mFM#`C`0F@>(H_H;z8fj+=BhXBt^d*4n1G!eMbu&zb=z@EwG>C%m z_Lgd3A(VLD`9k_l2YpJoutNq8&7nA?bDl)s@{C;!e=5^LXnhGtIJqY@;ukVdx$E3k zgeKbC@X;$I*64;2`0FDVHE>uG{uc|N{>P#u2P3I*D6;q7iez7}m(jndxS=BAc3E<8 z!!OkC89)=s>*a@EW6ZI|*y?MM#V1hvnzi!H*R`6hlrEvy-zq?Z_xvN`7BBf|4#m>i zIDj^?^%nM`FI6ZmptQLO>J}yWXcaXOwV0`htSJfinMG-vv1mttK{Oz`W4mI z;rvRqaz9uT3jYGOs^|4`FU4}?QIIctcM1WIkI=8hBfo~KRfPMjrWQASm>ngABpLzU zn4ZuMDpq(sfnXa4c^kGmi3ZU0?w-(t6b_Mgcy(Q{-jeWID(JElz%MbB)WM5?pN^+I zV9!^KMxtA47{;w9m=b_Fwor+eKsE?Ifa>GnZ4p|0J3Q3D>*XejnVe&jy&lNg1+f46 zPv?8e-l~^tGHOmjFkoAjg{5bghtFjA*77)MX+-Ewcf)Uyl+G{?I;L|Uc@hQmjC=u( zjNR_|Jw3TZn{%%FEowI}`c?%UNe#_bvwXklsSXWUG2uY} z{9gI%I|KdI9*g^rcH9oq8Xf%v$6Wa7eT><&1PvTe`~dlQ-tV2K`@JT4tQOfjI;|aZ zn;RjlB*?k>l6Yh4Er=i-$}C7=iZh2H0F!dTZ#5(2Z1io*%rfigrUg;vvU7bi0jkbnb>0`Nr2?lB;|s)3J+CeE#Z6dI8wJ^yHszJpHbw~v=Y7RlS3nvF5?D3sM?m@L5}GsY(XayP-{ zc(F>A53d~?{8ZWcsW@o*6-T_bwa`ceG#{#z3n3`VK){^g%-o>q6Oz;FFR#0dkIy0G z%b-I-vcDe!A@Y9*Ht?{(s!sl#XyqObhdRt=pl#!{)jFMF#}~gvrman3#BUe37ktqO zhqe%)PDA?s5PGVWTG*-ggx&*Xj<*voyr}EH>9Nn~pmzS?FdoPrd{|R@!zFvb(K{;% z>Wqco(UI_E!m4WY*&>tuS~fFYHo6Tb9T7uA+Uk6+cK)x0nT z$Fp7^a*jF?C(2?RZ(Axkz@f+feq1t7L_mmC`S<5SkU;Q41$5KK@=CR#*Omj6^Qs?R z1!*wE;n!K`!Od)mp*}S4NsC^m1Y*ac*%E8(jplNgRH58ce$oBY0pcK&xu(#-Oqcse zg@I8q2c6mwH!q}9@sM!2N2pw(WlcGQr8EsT)%l2sN={U=tn~^OQ-?NI=OX~d1Ze;D zWzk$OFK@q-^F)Gsgc$KSM8rwHqYenzAJn*CoF7OA@*9vYEWrI%U;W5YZnMeaWtA*IQZx< zbs`5T!2Gd4iGkYAE*940hNG@G;hk&A5C@%pW0s2&`1X_R-y*pwP&Q>lvUvi$ty&7G z4#0nqI&Rvs1v>NVg6gm4JQdAB*_mhg|xGE--MY!spR8)S7 zPeFi?4zLrQ5U4nY-v4u%QZUQpmbutPNqT}1v@~z+B88CHoNMyDsj)F$NcK=5V>CKBkCLV9W3zznU zQb&G_z@h!T{LsihDMsj((BIghzH=b+oyuK6-=741>xgXW*B9*%@QH!rhsSG<6U`@K zWCZ>Vh9*%1*=wR4kv~xoeJji1Xn-N8Pg|&338+sfD5igzGbPi`2zybVvRnu2Pe zQUr|ZVY=K?N)D5s)ZK)futaGfq1733qg40xTj8O+*s=_{&Qy-6LTmA{g``MSkHDsx z$t^MKB|c)ZxH%4Slsa7WXa+T_x7DxoorYusnzf*3(Z^&cU^C&k6ZCer62!Otj`QJ@ z;>@R#lj_N^Yi3UU-rKVnjgXNIeb4@jl46c?O=+F1=4ne;KAx5_PNF#ANug`#xy1rD zUDDQr7}xg0soM?7=WW!~m{{~_1t@m~C_p2v@()Pr9rOpBsJR=5ad#;^Q8f^<`y+n? z8sO^usS^N?9R%wqKih%M&Bm!vNw~EpHFs5q5yMpxtWc|T`9+xnRNp?k?POjoxUkNv z*lW!OOQ`!NgUBDh_1tX|)*}#4IlGT(;i2c}%Sco;_IAn0mcv2m zep@JQ^}Kj?QRw%2!|@{6)VK0dU{{P#wCBU59q8mVLcjtmIa#u3E~6I$q#aM)9*SPe z=_L|WG}M!^&Z!DO^LG&KvRKqbDbtZ8kk0TOHFHboIX!*} zQr#N4>c>G~PCrGq6?)A$(wxLxW5r1V#mNX22Os~K&0)_AXlF@#Zc$8^!y`M-j)88z z4p00*V2%sSd`oYtbx|pm?3xtkp9c1~I913hO_PH4<6q&SAgnJ&nnyvLR$E^hc=78L z0*g=Hgj)wue2je!9SzKjbxPmdnHL02v-J&NsogySBUE$cWnfGo-0?Q4oXt>QkkdIKHcDnD_}a-knaJ*YJ#L_ zkK6;t>~&d^CL#iM8B81>AGuG6+f|K{ftD)d&rC^L!oYrB_6K#^dpGKf;#Sf1?~*~L z=Wui4s^oJUG9%VGk#ce6k(&UksfZgBbXW(pG!-_UIiCQXf(9zhYG5TqMlRt=DI^kqh%Bb50=KF#8niY zMxk8n3G=F8UcBB*wH)q5U7V)c>qoZbKyr_t&dZ>5IVItYRRq{Fo?FEAMxZxLe3Y<+ zj0J$aEXmdEPDJxGu$9HOM1Fc&%jgs_if!X0+v<0F*8X-+U@W)+ZV^<3%S1!wf}a*w z6F2P#_cJ!P{6^?uD0nAZ{m2Tk1`=ws&x?IlY?RzU@TTj|r?WS9p`D$?d5Q+MZC-4n ztv-7lK_Jdsz{MWnBekJ6L8EV1(CAjdhj0f#BRn(%z~M6^GE&_W6RV&lfgg=SA|lhp z_fLxrgE~xZd;h!ArZy7T+D6=ve;dx|08NEhS&A2U3aSw$shdFxmpu%^&bKTVgR{BY z`0#KJZeA_dJpILO7Los+;We=HM)2u$O+YISmXGS-XKtHC!V8D~m&}7(l zTOZ^0;C|l96Uh)JLAuhUbbs2<{}Fs4rd{ZD%ad7&Y2Z8|02z^(eJffnxUzE%u(Qz{ zkXWgC+KYrLv0KIFPnw8jGWvNOa%ZS_ddWmf$JFUXB9|-_H#%wRv=`+hf1NiC#rLr{ zyFezOqaC-95REgrjYknQ?$_LBR1oP+t1)QkIg*V8Qb(P}Cr=~U;?}8xvtTKa z{#+wkeNN8CfJGv0prUdIK*!@Gb+bqnt=y+7G6*Gjj6;adj=VAv@k2gR127 zlmkbVFZ7-@y(qfi$tiJnUc-O*_FtS6*}!-$x_&f`p;gPMRgfu-GL?|)v01`$5Y!2> zTgkg;o^AvD3%VWul@tf5iZca z+B#KQn3QyD14}z~J3n%)HLo6txGPsnWg;nsAC?vcIjp%ez~EMK+_WTNx%$dj8q45^ zalKV^xb+V*7z`*#Wr**YkTbf&X#J8gxT3_jONcS&q>=j`jnk84!NNW+6+Jzs&n#9F zPUtKBf|}jp+Y>!_*nEZ$GJ{r2J`W^2r7g+DicM1!{q$Yt7gtzx(YRGH_5O;DG?uQa zaeebuh^wR&d!p0Y&KJ|Cql!GGD)<(#stFz{_cAlyi}a8OsEoz|Pvyby1=G8xHYA32 zYg((8IkZ*L_0O(DDqSx{WgKsEARGS*|8(_gNt*VjsTgTZJFbxie-){sqoVA zI;2(L=n-5aBjEeD&!4LFx&)9<@KNUOE&;}zXK5d&Zh7#GcQpfq#4~ULP}t3EdoPKW z48_`F6sXdLrFYGgv2%wva;&^_Y&;1FRU%c6(d*7Za=F+&Y-d~P^MOLlvoNV z%lF_(nW0(+zR9E_+DP%?>XC(a|X9 zzmrr)|6}O=?Enalc$fs`xgPxNa}CB$L3=g0Ecd838Z)Qe;Jge!IyM-NB2gJM-lAS| z$Ac&Lj&t^Hy7YWgP8>&q&)1jeV)?88{c-9UkPGuyl=Oa(UP5-)7pzaXq`h2yHE8bA z51_fx;SAHAQ5W;4sPx5Ws@liX0za3xi zY3_8N>TOm{A&5jP+EfZO?Io;>51Kelo5B3S5Ct8o07SJc*x+jWeTvJ26qkkllQUOG z=iID#Rcx>ctIJ$dhO&=m)jE-Q5M(286cA%Yf1)> zPis;};H{EyDUB&{6{tx(ub?BIp4}xB6+8WUx`qs&Es}%*OA{uep zQSmCoTxo3Nm`-2k*o&$wpgBc4@~%hji=6I{rH78W09KAeSMtIz}kdjx9O8l8&9 z-cV>q&RCz zgHp7DBkB)EV^t-Tgjjbmw_xSK?Gih~LVb!>D{w0Xn^Je|)O0+7a>-b~J z8|~U3zH*bi`ifXC)=|PwVRaq9-tKd-Abw`dXyg4>md9)z8pmnjT|lGr%dM&?j`$ZD zBfq}%W8=kGcb*)i4N)f!?1-3G_ql3!VX=aHBE;%Fs^LU}HNXv6tUsQcCTSg}C4Yk) zaizV@Z{j1xXPQ~~N+Xc_g0*0@f6o}L-{enfgpx8a*f7H&{q~QaMRUm8(I&(cy4F-TcX90M-(xromZ}X_Tu9EWXbr6Y-0s z%k8f73ud&L39E9vF=qElyZ_#TW|x?smpJBs?%1X!5lsK`b4~ud;;f7Zy$RqXR(e)l zV(wHO^V1;zO|aVITSd`y@xkg5RYGWV{+Nk5Bu|VyyM45QAgyH-UN_r)stVFbx>?Zx zsV>l-e{;s(`(#Rt&o_@}%`5nwAVS9gt5?|WqWd1R*~kL?m=(Agx0pYyvf@a|^oTJP4igA&K_jAC&u zBdxLEDyJMoJ}%&`Z?-=MPshOi9DBMohVFlAP>s4;bJ(RjCbjtP0mKK}kPf{{u)RBr zVm9j9?F$tKLOZgM;9G<0k&3%=)>py(FfFe3jeea8?kV;DDw}o=RfroS|8B~~)zfdk z7qOyrLDLRWC409$Mb=WUk>E=RS`MUP+FBQGBMr*h0lZKcy^2_8hM?Q@j=P%qoS4kc z*LV=q_tb+2b+1Xdqz??JaQlmME6H?2?@@MBXy6Rvvnoc%w|`_U>9gH zX`{?P5a3PZYB=;rTnQf~6WozH2vtL6D^O-7a8rJ0pUnywnu=@&z#hvO{7jBH^yCC9 zO1-AB>_83lnDvV1+>w7X8z(dKXA@|-qbyt z)ekfjLqCH5>|T_43PQtU@Y(6hlE~YqY-z*pdrKyk>_y|YzTbyJ2@!fCxI1mgtgcvyQ&__Kv z5KAw&pUCWdK3m6zlWyQ}Ty|~Fa*i#vjE8@{SAX;NQJPl?fO@^+m2e%??*om`cF&W^ z6I}vkcb&6?9Y0lDau#NN>>6@fiBxO}UHM*Y^JxLY=>!Fqlh_9(XHkw|eXw9bzfg`d zm^;AWB<7v!(#XA#@#5c@Ng8p^_1WFd(fT!9141y;jTvNL+IN6o9EbKJrH_8rSPqg2 zU)mDDV1RD}d+}u7l?xBG#3Za`Rwri$DN53k6{j~I+n?RGisPeNiY4qz3l<3|(~bT{ zW?|zGdX>P(zSHqk)V z`WMrm9$)D7E}#pXkof%y&#KAs=#X6%cQ>PRpjB4%v5KD8!J-VB&vth*uhR4Cth)hs z*-uI=AA{7Tsbtz%119qwyHfPDHQ0@podB7|ZN>2ErW+wE5x3i(CwUbKf+iea)+Jgefag`*YVKBR$`5JjU0;#d1QmDOmQe^=5d(RqFxCoYg}Frp4}1JN`09N`Zq_FgcIq>}X$BAD zyZEwa2b+EuWL3f7BY=^uTW_&Z{*776GT zYD$eulL6V$cb88|0^E8k-E5w zV<*;=M&0+uAz8JS1VY~Vt4zh(-YhE7LXNNOsz-iculspJsNb5EoFtd=!_8Q=(G4WO6TQpmfu_nkrqC?AnBw4a>*=e9GOD1GMgD4vX)F#Gi_! zS>_jC|2Q|F$PQX2C94fpS4q+a{8A^7cr2&zfh=J)v!~HBgv4r5QmJ1k?ZVpoNId0N zhzUS&XIGWJN@j7)|jnejLDR57%jRT30*3qXgwq?oo|YjxvpCWkZYVWAA4w(dKy!vPrY#+<&Gyb0_Rgk`k$FbjO( zHh1If+w0|tx<_YGv1e89r0R-OSrCOF2cB@-v}Af+i4(;4%pyPz=cuAt=CRpXA2{wM z5!}LIPg>wdF!=qJKL)4m2bXv0*2$v4)8OTE0l{=NCzt+boaW)1n>B_%Mn8Xwl1n^g z3P!S&e#NT#p+@b&dx!}f;ZZ2;?%q`j!;boYba{vA}d zw8LBQJcrxF+}+Ij?5<7zzN77BdNKyMs~FJH72AAaI#jca=2dpWzvgfYju5RG0tIB9Tj&O%Z+e($A^+qZ4l*OK-~e6~6~3vFW-)1!$TRQz;4nE;;ah3FOpaC;oo z;4y=!$!{*WVoEG&4`SWqM0ul(r|B2*od9^)0|%=Oe?Si=>hPVv(B@ev@HwXloJrMc z#YkI|yjSXW)}^vgbKM=(atU0n_eb%~-Z8fOG!BuM1K3{R5+BB-jsaem-?NtEioabs zj8K^s@@BsyMip5jN1i027hh6-P+TB((N_G8A%W3x?OSlc`tFk{?k(oBU+Hll`Y}?fLDu=mT zc~Ns9zgP2j_)&y*r+U8g8ds=JZ3p`WbIEgK$Aa70T@t;eM)yBXEibYAB#1^u{*@Wn zxy=)IA(_nibhyzY3BrTqHT?(83(65An$s!cGBLMYsJ5!{kpjt@_s;HnC*CUMv?`WB zNJgXKNs9SK&m#?S23#vjs>gv%9}K;KL%DCSy}qKfrQvq?xhIoKlAJTd z4`gg5w~PtzzLx`Wzxz+<7c|%j>zG%p`F6PFTEevO4(}dWPKc^K*ikxu)utP&n7H

J;*1-YMczFt$&pT`o>jibFU7%f^z(kbwA#lx4|-k560mh8+nY@Fa-6QT z4-dsWWX<06@+lXi%=ZEqR{l|D@OzOQ(!RYC+;}x_9~)2eZqSZ)rdccPyk_NR9eK@k zS~9w?mORyFNee|;K%U?U!de5Bnh^48qCz(4N$a|)t)#+FsXdJ8gQjRo;gD|h?K+x| z5?SFwis7aq*-!2|QtI325kAXa9y*>;?e`pck!Gj5(bhvP*MhqW-%E~@)!RtLV`q)# zGj=dc+rZs4o0}2m{wrh?erg0xz*tw8M-@n4aRw!2tWw$Ten2(uaB!Vy6dhXH@DFNu zm(ITo93^~8x~n--=5m*tF}dc(M8FkoX#FYy zkKz|_%!6zfynTq`EBJM%!oTt&BX^7J!*H2{9S*BZuukWFCgw1-#h2Y!T`bxs=CCl+ner&e1G4 zaUah5IqOg{XBWnX8)T-TSzLD#5@g68G8CJB@-Tj74wCd6*ZNwl1QqyRaQ;zB!OD*8 zuA8t?JZGbzjgZ1Eb_wL_$(czV+%~fl#Z7Wgab#8N1{ohroBo3orbElCpggRdG4y5^ciMbQ&7Mhl?-R|=Mxs!rr%J0bQ2YuDeT z#wT9K#aX_Vzq_N#fi!S;(3vbbWbw(?hB4`8^<>hMs$1&cOZqqG2q{=_esQGP1|D}B zrlNS-{u5t8fY&+cYY1)P)->pLg_^hJXVhaP#%M*UxY1xfxj z-z0K_6yS0vo^>^?ZIKu zuI0~do%NLKjBavFpKQtQPlAEuLCS!FQFODwxrbT)onFkBg{q83H%m_nl!Z@8_Se*%=;Wu z=5SXN`9!59&3zsTo!J$Vzs4Mbz%o_?qrh!5EyT)E%Ll`2rdrQsAYmhb(k|vSSA3Fj zzgnN24UY11`#o1aq}_jSCVAjDxOZ1`l)V1W){v+%?1*{U1OL(wc6_5YyWHaD7pj)E zzEsU5f8)qnodhZem3}u%YwOfzG2yRBJfF-G4&q~z=SrMh5!G}Z^L1GdY;b2s(WU;O z3D)DZf6*bF;t*ft1sS1)RoIYGKVroH^U3+4en;wD7 z1uZX16PoTp3!aQ{>Lv7&6J27Ajb7;!!{U5@L)DAV4b8|qkJj^@ql=do)<9c+4U|-< zHn;S1LZR|DqKB{4`1~Z<4UAEK1E!{C>-7f|x8|`HH1-#=Ff%a^tjPnF`ALm*zg~2( ziUkT?VBmgGjoaEvtN5s{V6!m})G6fgIm-a*tAm(CXo)D69E7g^M%Q1#u#Jwvk>(^E z?0W$zF@29A48Nn}Oo$=rm8G>z0J9RTcEgGKDey8#mo%|5Kpyd-tt$ZxtN)5ce8G6Z~XO1-VRb+9fpDG7UOg6;~o%s=0(cqQ5s3Bf8V z_9`6YEQNk0KK(MjCeMnC?rWJO`CTTt{23hHVaXXXOJ6KPIW3QljfX)({Kj3v|3G$d z8F?nWUGt#SUxJ!8V=@Dv`fL?A{N96m%*0t@40+BW_#AQxEZ>6&_`vvXIm8y& zVaD&oklC7GQT0&#v071Srq)%^gtgwK$FFh}W-Z9Wo}_Q{n(afrzE&Hsc@{|7O1fA$9&;r#AtObH>PL0W_t>D!9Px2r~*@NFLX@jQinEgly82j00 zTxXn=%MNvx#*^MJ^ZD*Zk0vo&2gPDhsTEw~J+{6Vga!9BdMq>upXH!Dm(X;1qrW@0~`}CVXiTQ zedQtRc|Jhx3yBJ*FwBjY#ZUQqh+}gTl+4LaT&)RZlIHnE0VdhpEs|RD>Tu4McHQ1> z?cxdYau%y>Qw=A2+&wlPLyv|l2sKXWS~vJ-T#L9eMI!XF35x^`&|}7cX>_}jg|^+8 z`Vbsj7m}9)dQMlA`aQBCGUFjL*!q%G+X5-R6kLvj*A=9^#_X*I&e6>hAqNMSmO!hE zq3X&ju-Th1phD7v_du0dg>|Vk)Fj z=Kuder6k$y&ebtdB%?M*BUEeK$x*Fbi;RR#j*vl#(ZNR1j>^=a)2N7v++s?xvJyq;XiXWy; z5;`la$UEzJQe^Fc1{?H&XQXa6TG9#pjzai$;UF2>s$fmMqhI4lF)h*&@8L9vY&(v% zo@#_1ni7Emg3loPjHMc09mXaS0p-ncl*i3voQRX-&l|=R{^2gUzL=~A;fmP~>>O%u zI6DXXk!~YC$kDt42)!H;$>VwoPR!$W6(8O|XO9j#$ncy__|N#OjeM_;lf_SJY9QCz z%s20sqxm2fMWERqJs=ngagd-{O`2*5_`029ItFFcW{R$;oC|n+4e*wxONeFiJ=c53 zXV0u{FptI9+UWIPBy`?xiaxkPwr=cvCRocL@!}Xw1@?{eoL4LSH%*Gq0^~_HbNOSn zN-H0wZnjWAmrbDac!Q`tfk4QpOreK2S@>_c(wA8e^NL;XR>zi+t_YN`nqSgjeEtBa zMsS34r1TJ%Ap)qN4tezZDk7dI+ z%JL}xlNaLAy7{08YA`+kk_|+MYC}>m2yyUyVXxI5^3Rp29RR)DLeZ14<^OTfjPh}m z3g@(1qFx3-Z!){SJjjNaZ+5F=@#uUCKu9^t=}J5@6+NCG5b-;2LW>jkAYdv%BN~~u zVW*CCXm#&ct^CUS;%q~FfNJVBYRB0gYhD1FBjs4i_HXsmzdJI)v6DUWwu7+kkSn7GfKu#FuOvUPZm=NrKrBv=9? z{xUP@QidI(OUlr)RTM> z??tVr(d#4>G6D3#4x&yw%micS4(WF6f-Z~PIMFEQ#ZriZLyH{~T8qZowZ7Zs5$TKGVV(;SC=g(YhXW%e*ycWo8nU!p#-{Yc;AHLr(`H`nwYlJn}{-*A;MG4mr}OP zN)QAomm{A4nj}ewgDXTI8sjQMd9t9t$eCYbYslCMYfO7}2CqIttH$^f9AF9|PCD?u zDyrr~6J+2JoOJ-VkrS8~CmADv=2(~p^3)0E83;I}ng4Vus z=eLQqKOK_J9)=T#X_aH@;c=w&rHmngjC{nf4*vm^Lx>n7n7#xosH^Ne!YE6qPf!>( ziB?`C=U1VMcq}z$Um!1*z`Y=+NZ*&+DQ;i5^j`|3Z2OBLR{@Dvj1@dhty2=-6RQGw zqp~vB5~uZcdQuZveJc&MX_awBmn>Su5@C-%@h(8o*8)l}fB*>+Q?HK(yDpY(2wtvs z>N$Kz1u<)^IiY{-@8iuI+;Mh8WwL=vit2qzYG1$}La!6Db31cbIeZa9if!!M z6n$rjEK|d{S^Q!ddwUcV{mSwr=e<4pWj308DAz7T?(AcNBXffzp}mjW+AQlR>~Q=| z@7S!gGtgQ%)B|VArid~mV=Giw@UkW--O<4WW7EIoeml?b3Fh|MIfT!%C*tVsG~hSA z3W;1(RMPCM?-={4B*Im6P;!7EDhE1uG0`!O#78-^r%awhHrKpsKNyA7dl`8;k&yDp zC|{PCLjhJ+PJ-Y~lQzHJy}9O zM!0nnYAP3XBxUB6_Qy}XAa|2vF5%S^de=$)^q|d3 zk|>XY!vwKR#dz;<%}@T=`D8~pm*wt>_6eJ6vYElZ_|KESoVn5_ z1QmGlPs&1)7`;M$@xnl!&JIXw;dE4yz+fiCeeW_Q>!OB}U!A(rvq!?-_bG_pvX!E< zdUW`a&^$nKzt+7wj4HXSBNEo!LPFezEM>;}+mi85*Q+b8U zqt+H)c4rOhl}4RyBv9HAi~Fl>D{^SZp(GCnab}rN!dfW%m#71c=SEN!A7+@7 z)0$mG@6~dxeu7MY6uK*FdtYRk)@0_%Omd<1^XI=I)1mJrq>qAl(KdNyN^Ya_-OwIF zRI?V!YYlJv7Hq-Si2?Zkaq#VF93>7%6FSP>TJvYn5C3^xw6KP--6f>jnP8HN$HRpa*Zj z{YS!7Kl_5YGJbRCpL;KJWwzuQ<)^3~kES_OH7`HaZE`B>J=Nc_gK}H*1Y#PE_2rPX^!p7(G0%)A-P}-F-W| z%J2M=CRp>>dN!!0OYP`J+@`qut-bnH!X`ht-+OoCGDl%JY_>P0lBAoRWxOH9T-TsU zP9np${ODS_D@W!|VXtJ7C#t?Pwf{QSmSJSnASc;Ycd~S7q-5&jEozO2d-!5{+sV>B zL-Imq&PO0V$NLzomulQTtF&}mOj)kc)TC4A>;U|_5`2((aWrWl=i{wVc(iT;dUOqX zw5x+&_Xz`?juUniIR2|Sy_K`Tm$y`dw)okBs-Ub7A7%rtHbt+9!e5i0?2bJb^PzPY zt)EFS!;kE5V`Jd$DKV8XvFm0~LqqKj{tK`rnwo&5;6brD};n3w+--})}Vg&C{@L|93ymWktMV##|o?({cdH(9Ai<{hE zIBgW2udZq`xBnW~x|YVi=^eChY*WRu!IVmlf|;XpMLKgcEbpOsWw{M{bqa1S2CU+= zM5*HXJ@t!nv-j{!%eHck*$9_KiN2QkA?N2z<-Mm%K`JNWd;EJ>3a!J^o`h2~CFdLl z*&|aUhwY^{!kszWJ5D6_r2EMRMS~>LGMp{~Apy&-UkC1)ZQj#h9#|kM1y`&Sgu?a6|AT#ks}rwXGY;&R+fTRBw+y z#zRYy(DXK^=6o#2NA^b5ldLt#+pQU7JFor~RI{wJy5a{L42(voSN&AKD3)3S#vV2r zJe7a`VZpw4CDMXLOGSrRloRv1TG0V^yP&uCUj z8UPWu!BBHQ8;Z2_kUl4c>}<{8eHJgx0e0)-5y|j6Uhvj{zh_8MF%8)V{KqCO>&D@^ zMSqA+p75Lte=`lUrpy`S9b=ZauGP~E?B2JUbzf{CXYPrl%zLCcok^eH%;6}^*p>?& zC<~>#H}PGO7msFl-dCTHAT&ne$LD<9i-fYhL&&P`k(rpE;&Mk?HAQoJ9sdzsuGvOB zknK1yFe;eqcCSAo(o@xjx8;m-v;o=5hH92_R^>kNSe5I(>}#t$3f^wvd-blYY63H9 zg2_!=>u!t(L%pqihNc&;Tl=Hf;(*0MERCE}4&4OaGF zvp{mvHF360Je@?{4&fmHkt2!K1zG|nLKhP^**PESPqt|QwyEh?yH#LCO=s#Cac(2k z!Ydq2H4^@}iRCqIW`?ZV`+KS9rTV#sCi!PS2S+ViW7cdNQ}i%V>iurwTeI;SZOEoD zn`(Yq;<;yZLkr_@{wk+j8_;P2;Wxt7x`%Hh1Gq9n(iP85f6ND=0Aeh&X(<14@2d9IFRG>DCVrv6(6iv}Lm2mJ2mda8K5ISkYGEh*($LP%-!HVR ztX!7TVn$+QRf!ge>1Frz=mmX(j2Iyow=SdUpCwO+fMN!C0 zyCgku%cD6sJzecn{~`@A@J3HDU5@@w&Nu5w z>yk8NiHD6RYfc}8$)x(I5Ta;m%H?CSX1@R)D)j_Y>6l}9Go zL>*Qy7nCQ)raIF6TI;lqBri9MAhuYT^YfUi0qLyWF$8NaLy94}ZD2@vJl=3{-}#GT z9jynKbHBwjXpno(-dVPKg(}Dyw+BX;SmF1Ym(^~*JV1g_rtw524Rg*+!@`e=udYwb zPA-8UnDe+lqMX#1?JqQs?=I0`JqpmVOkyk`qL|>G<7Jl`+#_TCUR~Y!|Kz|ZA@KNi z1Q;qt!T%8=p}wnI&5dkfK}HGJGa;TO}~J-5(Uex&+g}6>-8QeFy0>uw-_u zKCCQnHumFRCrbgIg-qXH>V1b4d2OI~&vJhzpd7Nw@%D9WzgH<;q0=pYhq@*AM^tu& zed*tLk-xd{v!dm07Em@sIsGvo_hq7&#Vj+c+jTOfd;TlL)pclskBrXz}|#Y_N-IHe~Z>wTlz+=&Hv zSrf;4Duj2=5`b}Q9WyO4^FtP4NMPaMxwxE=R?-3<1BI9t41r$HmU=v;1H>jZ@aJJTSo0th4XQc}dIc ziuc(vtOdj_$6s&dn}dHWBrMO2y)0uVc$&bQ^ z^q7lzM0^A7vppLRNo*5Skz#uiR1pJBSt36P9#Xuv^VMg@g5#!P2|ah=!GU6DId_lb z1eoWzQf+&?bBtq1`YVIIl7x#3WxQ>P^m+xKxxN*w=7tq3KLa$ZT=Juzg9jj{cY-d^GObHf1kq{IwEQInb0R!8}GgkJXId4kQ+ z_J4z$`S-m$_11_V*l>`E*cRxk-8HEf!TJdJVuC zVl*jAO^GPjUs*aXz{L9tg#Doq;Rt*e$8>u?B0-F@(n;koq{I|-t?lLRHs=^bSd`u+ zf_<>MJ(jrL)r4kT9Bgq1A%4B3kTg~zQc%{gDup^8e4#9O2tz!z8_eUjGGTFYuMp)f z%iBf)cXqQ(Z{8d463SB7Fc$ELm7Vw*0{xZegOHJ3nPyK3K~Y|!v{kpIh>l5%adwaY zR^_W`7^Eoa-ch=fE*BP{uqy(OPvY5r-y$M4Na4YNd-|P%qW*|JaQfqA*#`$;2gk(G z>%imII)#xMheSl--Yv@oA>&y#jv{8~2=PV^LXv$C-zZf+r6sM6b+cTI@FhR{fqjt0 z%vUkfg!xHtObHBo@T{kVo1XalIwUwEO=$DMz-Qn2Rn4(t#vAD zh`F;M`NsLkL<;b2Z;fp>@l=n;Z}m{Xt80p|$xe16*#Xx!izl`_RlklOKYC@6o9kws zkP5d`FZUKeax-(TL^UMVN~d-fb0RPp3j>ybg5w35-l!B$RaYJf7A+Ep7qJgvU}et7 zRFK^Yz%6)rcbC)f8yR_yhr{$q09EoC@vs2*ZgV$QqVM+dbTw*-vZ*53%9?@s5blC$ zLFVrBqd^u>M!<2UGhZV)3h99#^WS!WJVhO`q>oa;6FaF456IQ|-0CEQY9_^lP=vvqth2mPy#24D}vc55dsG$V$VE9l(1mFTB zWGwP%(S`kiO(#pImm4k~tWamaQ2cksw#{vI8Q-+pPcf>tWLADo3GaZ!?~k7Q09><# z{&{UcdW=$)B$0MePB!(R-uLTV6yroFGEHD1*5%%CeI^fy7^N)j)4a$~<&?v`Lv|99 zQ)IDTLkC93w^doxFY2QXmvrwzfZlmfF(?$tghd`r#$dKPy!FB&CE05@d^^5@-;^ zifmc6aLKL1Uo<|0_ni58<%D*sr>d+(Q8ZyrMYSfPWDr?Em7C_DPCK6oC&>%M0k}%+ zW<^~@?t8&k{Z(Jd)cBXYEpt@eLkx=_ffX+%R@WQ@aWIw;^A3K;#4zLz%8xFD`#=e& zS^e866J~(@smS1}2EhC$M#v7G z&5YOn%^REuGv_Kqlbp&%KVpMCTUsI7mRRV`O1x;MW*phQF!c5*ATM0=#=OG8w5|`{R>t;*HK~!OT zT9YKq&Z7GQ&<;Mmv44zV^RuWw?m7e?NSNyc01LE2_*x9K0w;tmmbe-4*8Yk}jP5)Y zy_Mbmodt9`MhVJzIK#7|gDK3dx>*KY-IcOmyNKT zq6@GbuGa8z^uZ6tMLiIvBM6i7IP=C!DKb=MFkbP*2)-KH?sQQw7On>_Nz#XEjo>jp zw=>LvVN)$o#)Nzg>v9R{EC7cPoJN*B`EC;=o$@e%ycVxb|I{xv`BFxnHiBR632VZ& zzr_D)k0}iEd5xT#O5t@P)E>VWumk`u5i-Vp~x$^KEq5@h=&17vOP>o(v&0xi@SeN zO4g!f;Ntu{T_ny2COW+`x~1X&l-+GY_BVo0eQ)*=etcKe^TtsSnK3BI4PVpV{ZvS< z(V7-eyiH3UDM{)%c=cywZ8{|}xD)w_(~V!zLo*1=JrM+|DhGl5gbVW%xfos5vcD{y zfT;jeTgQe^cVrA)_>DRHvfn~!k!5^6lp78rui%a-GZ9;Y%clkRHJ|O-PqS%kG5b@3 zrGyqNw?$+gJAJid{*i9Jne(x!#jH$%wE@4FbYug{F7X1H)B&0XZg`-6T0GiMeqJ?) zh9(YagCgfo<5DAA4P(=Q@iuQqcW+5@A?{vRv5YtQn5hVU$UTniE}=cv2kztLYR0vL z?gjzU+^H6D=fr$;xjn&s8~n^ByvCCQ#b+pRVw0$pvowo=6Z5KSf6y9S7I>wXvHLKe z>>9UZdEPEW7vKMF$Ol#m7rA@EGPFQj9G?Wg?k|#h8`0DbXDr5SDRbcZ;6)QA#HbEq z>BA6o^!P~qD##UCsYcdk!FtdFP9OOLnJ({#%db+=fbGbz{l{4-A%@G%>wz}OS%hcU zZO{ju-JXZ`Jq!#0O6utD9>}6i;P#UMsiug58f&6Oti{_8_#*xQvL|;i9Io&4gG!jO zIl6vFuhwllnqR1sigS0yKaJGoAci-Ha41Igk#60EpIXFV=Raq9n~oSSlRISpb$}#e z&3lf5z8v3QCl393I*eiL^u1c`6(HcjBP>vc%v*}~5cyskNJa%hGNBIC{V7yg7{s_%A;?Ba6qA0SPPO~|L^ZV-0` z;Bdk77VnGq27liAsF9dh0sF@Imay!rs0AQsyH2%+CA9&s z+QBZ@#ln!2a7PoWd!h;}P+yp)lJGP+cMFCR9$%ExVVr%SJV9+uoC6_!0bGJ&B5(3i z>KU^;5BvM_c@S$;rD!E0+a$Z9ML2!FQtfdivOpU>WULr=0Ggc$ z?S69uvMP*Yfga+zABv+B4*CdL&05y+PdTW8Jw1^}#Y~}IaeSel^J_S?(F3~k&@<{p zB!&@>7aWil4UxPjLgB#Q2L1hG4*CnxFqHP{zI8r}%7k8vc{l@{@C~HStY?2(BeNWa zaG#)xA#X0n6+XEG+yrlE2n}mn(xkt{dPbok48OT%HF=yqq}4OX;J8X~dES?MH0QHu zy^-Fi3pRfZ)I68Q?q#ST0>E|L|Hb|JyAKnFFhKDU7|jaMo}K$P>O6)D>JD%fW((H! zKbV zc_kw)Gq_zsXn|(=w9{?dvv-!vS?!sx`s}-}{GY*3DP!CK@MrJ8N@GCGxWDoorf?oQ zRlR4%;Mu$1Lg2K(NVkzz)~b65fF|FAgNMzI57Y)`pW`XQUAPyE+8AbC^%LX5Yetj` zqrE$}WNvc6czc5$C@~U)D%|{*V}q>+hroR*NwZKA;9WA93cHZW{7ta`RWwYDQB5p< JOy5mA`+vD!Fc<&; literal 0 HcmV?d00001 From 3e721e2e35284cb182d56bda939545b9c1d220ea Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 2 Aug 2024 12:01:06 -0400 Subject: [PATCH 154/199] Remove unused images --- src/images/ALUcontrol.png | Bin 215567 -> 0 bytes src/images/Edit_tab.jpg | Bin 935 -> 0 bytes src/images/Execute_tab.jpg | Bin 1479 -> 0 bytes src/images/control.png | Bin 244179 -> 0 bytes src/images/datapath.png | Bin 171232 -> 0 bytes src/images/register.png | Bin 258564 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/images/ALUcontrol.png delete mode 100644 src/images/Edit_tab.jpg delete mode 100644 src/images/Execute_tab.jpg delete mode 100644 src/images/control.png delete mode 100644 src/images/datapath.png delete mode 100644 src/images/register.png diff --git a/src/images/ALUcontrol.png b/src/images/ALUcontrol.png deleted file mode 100644 index a91bd94bd8fb3eb4fcc90bb738261e21ab7df503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215567 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⁣n~}KT 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 diff --git a/src/images/Edit_tab.jpg b/src/images/Edit_tab.jpg deleted file mode 100644 index d421d69e4717303e4031ee4be1f9b9b8f7ad7ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-1hG+&kW=16jCP7AKLB{__7^D~&m>Ge90RdQ8nVHx?a@qn6OiWCS z%s{{jk!ECKW?>Ly6;d=5b_`@wY7`MIG)hdGxDlvWl97Rl8QB;HCKd)pW;URdvLKMb z%)-PBw*#nFkeS6$NYOD+*r;*i!T+}ycz~LLf`Sb84DD@_&;PA0o10m9@xV9xK!eI8 zzqwmHm*u}wsC+4VexI3-US;o<#3~-6a#622%GaB_x>}BiD!5DS+doAm`}33{MQhoK z9d{nRy1i+dnlR^7p2SD1U*w*%JkiZ>1)H!;%)~9cJf_RniGg9HRJD9GeS^-5 zS4Yik%sMX~`)u`D=fj!~8SM(bp5C84jFQWQn5TX%D2uo__tYwln@J@MKMxk35>XVW zdw-ra&dT^|)MkPD0QXM$KektE|I7({_j1~nulpaA&D^}D_Np)MarLEl?Nn7C=oZJU z-7S(;Rkf1GW8adN9}|B~`LaIm@X1f5Z|zNXR^8XnTyrNqqVrBc{)X#Kho3*Fu0Qi3 z=g+zPN!yNmyp;6!+GAfS=4&b6``2Hc+mfm6GjY53Ceh$4;Vyl5j~DjE?=7Ahl|0d4 zO{jos)dju9Eg5Au-`%=C`CprUTi!37>gG8rEwi=v&Gwc`kXg5V&cn8>jq(3)0s!Wj BS1kYl diff --git a/src/images/Execute_tab.jpg b/src/images/Execute_tab.jpg deleted file mode 100644 index 76895e2c0662f86832454131a03aee47738537ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1479 zcmb7UI&5S`~#x)}&<9c$=PK2n|v56dyD@-GDMyZFj2sww@=b@w` zgWSiYS=)#lC31~pNSjL9wZsldYgW%b&-VAe-#_2?`F!73IxT$#pq(9#IRGFC0N~yM zQZZl$AYgC=9EL!^5lAFL28BkUWMxq*`xNETI2Ak|r-H>2G<1jrH7#{4R?|RJOIMGo zPgNz-jA#@i9SW856#^oWNR$jp8HG}&5U>Qw|CUq;U}S)601*n30SE?!VnAsxpb7v` z@N3&|f+L_X$ev}01|Sd+3V}nR@P7j!1Pa3daFP-op{zn??srQKj4ssDHa=o^doQo{ zl>@@RfdD830QaUN_e=@~fB1HTKvz3zo^?IY0aevrWDqtij33l@wB_5CnPdoRylO`q z6z=6(Hf@)f4af@pc|Gk*`RCOMBj82Sj!I>r2ZB2@L-iKu@Fmosqd$aY zOf<)XHz4~{7WKBrX)aMallA=GxH?gxUfx)eF5>ZhW6mE55g`!E4BJbI1V78;31siv z)f4KQ_9w>S_U_$E-6;F?r#zwITk-nPF$SmJES+*M<6%{qLa6@=>AOxwg+`{hbBD9w z^WH~SlI|N+z=|k4Ft3BF(TQ36v zmDUM!9{bHjsZJ!s3WbB?Hp)CteT6_w4n^Btf%Z~=MG@cH#bg#S!nv~~IgXenzG*!1 zyv8~o`z$P`{+t&%^{8HU>k#i`^2i!eK2epiH=7&86mAZ_vF=rWhvKVl_j@IEOjiZf z-t0KHF8Y4CvHEO?@4g;&`RKlf?XRh@X6&g{lUpRgcWLSPev59KUDJM#sRT8S*Svqj@-p``Pn$WZo#pE*;8D*sF5A&K7p$s?o}~3V7o%|kn{ZiB5Pc(zuqskvJ31Hd55#BV zMP|ebJYm7js3yn*E)yR4zXW=glk}*&CAj6 zvjp(M_ot-5+~(BPmO6-MYS8t8r(M^JOmnwGwQnt*`Jln4(`yZ%pfo4)bLuT#QbwC2 z+cmoGu>4(|j+;C`il;K%8-D;&6P!BtDp`>;&1$>v889oz zZ&LljC?urFw|4SulPjrfB{HnZR+`T#17>KH*%kGxzSI@ek(42;M(eHd`Pef81uw1- zyht~Q_h}$@6NriZxFu>|${Qj(xx~Gx`QToOzQ9Bl#Fcj0-d4oMpcM=qBfZkbPZsoK zQd7wt$Vb+FrGKt16qJ*)Cw}&%1}G?rsMfks}}9;GJ#d5=DDwJtr|yauh740E;WNp&$L)X4w6{JrdoL zBH^W#w@K_G8H?@3rM!5Wr@)TZsXDcjRT@RbRgs5nYHjDjw)A{g8`zb<77xCT3MFM~ rUagPt-^$Y)YvbTtbz!p=t{XN{!=kph@X@<|##Z(O({Pc4qjcsU?%HE1 diff --git a/src/images/control.png b/src/images/control.png deleted file mode 100644 index 1c5328684721fe73d749c61d8da72ee7855344c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244179 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

Q5>)cK@sr940psg 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 diff --git a/src/images/datapath.png b/src/images/datapath.png deleted file mode 100644 index 7f4ee347ca9136c7027dcbe88c41ef01cb71ee18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171232 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 Hi*$sb+*S;lclwb+K}X{cIO}J`$IxQ^L0}I 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

G_ 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

-

RARS - RISC-V Assembler and Runtime Simulator

-

Release 1.0

-

August 2017

-

Using RARS through its Integrated Development Environment (IDE)

+

RARS - RISC-V Assembler and Runtime Simulator

+

Release 1.0

+

August 2017

+

Using RARS through its Integrated Development Environment (IDE)

- -The IDE is invoked when RARS is run with no command arguments, e.g. java -jar rars.jar. -It may also be launched from a graphical interface by double-clicking the rars.jar icon -that represents this executable JAR file. -The IDE provides basic editing, assembling and execution capabilities. Hopefully it -is intuitive to use. Here are comments on some features. +The IDE is invoked when RARS is run with no command arguments, e.g. java -jar rars.jar. It may also be launched +from a graphical interface by double-clicking the rars.jar icon that represents this executable JAR file. The +IDE provides basic editing, assembling and execution capabilities. Hopefully it is intuitive to use. Here are comments +on some features.
    -
  • Menus and Toolbar: Most menu items have equivalent toolbar icons. -If the function of a toolbar icon is not obvious, just hover the mouse over it and -a tool tip will soon appear. Nearly all menu items also have keyboard shortcuts. -Any menu item not appropriate in a given situation is disabled.
  • -
  • - Editor: RARS includes two integrated text editors. The default editor features syntax-aware color - highlighting of most language elements and popup instruction guides. The original, generic, text - editor without these features is still available and can be selected in the Editor Settings dialog. - It supports a single font which can be modified in the Editor Settings dialog. - The bottom border of either editor includes the cursor line - and column position and there is a checkbox to display line numbers. - They are displayed outside the editing area. If you use an external editor, RARS provides - a convenience setting that will automatically assemble a file as soon as it is opened. See - the Settings menu. -
  • Message Areas: There are two tabbed message areas at the -bottom of the screen. The Run I/O tab is used at runtime for -displaying console output and entering console input as program execution progresses. -You have the option of entering console input into a pop-up dialog then echoes to the message area. -The RARS Messages tab is used for other messages such as assembly or -runtime errors and informational messages. You can click on assembly error messages to -select the corresponding line of code in the editor. -
  • Registers: Registers are displayed at all times, even -when you are editing and not running a program. While writing your program, -this serves as a useful reference for register names and their conventional -uses (hover mouse over the register name to see tool tips). There are three -register tabs: the Register File (integer registers $0 through $31 plus LO, -HI and the Program Counter), selected Coprocesor 0 registers (exceptions and -interrupts), and Coprocessor 1 floating point registers. - -
  • Assembly: Select Assemble from the Run menu or the -corresponding toolbar icon to assemble the file currently in the Edit tab. -files in current directory. With the Assemble All setting turned on the assembler will assemble -the current file as the "main" program and also assemble all other assembly -files (*.asm; *.s) in the same directory. And with the Assemble Open option, currently -open the assembler will also assemble currently open files. The results are linked and if all these -operations were successful the program can be executed. Labels that are -declared global with the ".globl" directive may be referenced in any of the -other files in the project. There is also a setting that permits -automatic loading and assembly of a selected exception handler file. - - -
  • Execution: Once a program successfully assembles, the -registers are initialized and three windows -in the Execute tab are filled: Text Segment, Data Segment, -and Program Labels. The major execution-time features are described below. - -
  • Labels Window: Display of the Labels window (symbol table) is -controlled through the Settings menu. When displayed, you can click on any label -or its associated address to center and highlight the contents of that address -in the Text Segment window or Data Segment window as appropriate. +
  • + Menus and Toolbar: Most menu items have equivalent toolbar icons. If the function of a toolbar icon is + not obvious, just hover the mouse over it and a tool tip will soon appear. Nearly all menu items also have + keyboard shortcuts. Any menu item not appropriate in a given situation is disabled. +
  • +
  • + Editor: RARS includes two integrated text editors. The default editor features syntax-aware color + highlighting of most language elements and popup instruction guides. The original, generic, text editor without + these features is still available and can be selected in the Editor Settings dialog. It supports a single font + which can be modified in the Editor Settings dialog. The bottom border of either editor includes the cursor line + and column position and there is a checkbox to display line numbers. They are displayed outside the editing + area. If you use an external editor, RARS provides a convenience setting that will automatically assemble a file + as soon as it is opened. See the Settings menu. +
  • +
  • + Registers: Registers are displayed at all times, even when you are editing and not running a program. + While writing your program, this serves as a useful reference for register names and their conventional uses + (hover mouse over the register name to see tool tips). There are three register tabs: the Register File (integer + registers $0 through $31 plus LO, HI and the Program Counter), selected Coprocesor 0 registers (exceptions and + interrupts), and Coprocessor 1 floating point registers. +
  • +
  • + Assembly: Select Assemble from the Run menu or the corresponding toolbar icon to assemble + the file currently in the Edit tab. With the Assemble All setting turned on the assembler will assemble the + current file as the "main" program and also assemble all other assembly files (*.asm; *.s) in the same + directory. And with the Assemble Open option, currently open the assembler will also assemble currently open + files. The results are linked and if all these operations were successful the program can be executed. Labels + that are declared global with the ".globl" directive may be referenced in any of the other files in the project. + There is also a setting that permits automatic loading and assembly of a selected exception handler file. +
  • +
  • + Execution: Once a program successfully assembles, the registers are initialized and three windows in the + Execute tab are filled: Text Segment, Data Segment, and Program Labels. The major + execution-time features are described below. +
  • +
  • + Labels Window: Display of the Labels window (symbol table) is controlled through the Settings menu. When + displayed, you can click on any label or its associated address to center and highlight the contents of that + address in the Text Segment window or Data Segment window as appropriate. +
- -

The assembler and simulator are invoked from the IDE -when you select the Assemble, Go, -or Step operations from the Run menu or their corresponding -toolbar icons or keyboard shortcuts. RARS messages are displayed on the -RARS Messages tab of the message area at the bottom of the screen. -Runtime console input and output is handled in the Run I/O tab. +

The assembler and simulator are invoked from the IDE when you select the Assemble, Go, or Step + operations from the Run menu or their corresponding toolbar icons or keyboard shortcuts. RARS messages are + displayed on the RARS Messages tab of the message area at the bottom of the screen. Runtime console input and + output is handled in the Run I/O tab. \ No newline at end of file From 727f683e9f040e635cd0d917020ab9cc4a570e72 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 6 Aug 2024 14:04:35 -0400 Subject: [PATCH 162/199] new documentation for message areas --- src/help/IDE.html | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/help/IDE.html b/src/help/IDE.html index 466faefc..2407f6bb 100644 --- a/src/help/IDE.html +++ b/src/help/IDE.html @@ -26,6 +26,32 @@

Using RARS through its Integrated Development Environment (IDE)

area. If you use an external editor, RARS provides a convenience setting that will automatically assemble a file as soon as it is opened. See the Settings menu. +
  • + Message Areas: There are three tabbed message areas at the bottom of the screen.
    The Messages + tab is used for messages such as assembly or runtime errors and informational messages. You can click on + assembly error messages to select the corresponding line of code in the editor.
    The Run I/O tab is + used at runtime for displaying console output and entering console input. In that tab, you have three options to + choose from. +
      +
    • Popups : You enter console input into a pop-up dialog that echoes to the message area. The output also + appears in that message area. +
    • +
    • Interactive : You enter console input directly into the message area. The output also appears in the + same message area. +
    • +
    • Batch : The message area is separated into two windows. The first one (left) takes the whole input that + you want for the program execution. The second one (right) will show the output. During execution, the + input will be read from the first window, character by character, as if you entered those manually one + by one in the interactive option when the program was asking for an entry. You have to be careful to + respect how the input is taken by the program. For example, Syscall ReadInt reads until there is a '\n' + to terminate the entry, so you have to put a line break after the number for that entry. +
    • +
    + The Program Arguments tab is used to provide arguments to the program. If that message area is used, a0 + (argc) will then be initialised to the number of arguments provided, a1 (argv) will contain the address of an + argv array (the argv array is of size argc). This array will contain pointers to Strings corresponding to each + argument provided. +
  • Registers: Registers are displayed at all times, even when you are editing and not running a program. While writing your program, this serves as a useful reference for register names and their conventional uses From a3c2f79684da71608405e0956ef3694e90f90262 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 6 Aug 2024 15:27:46 -0400 Subject: [PATCH 163/199] remove protection on reading in text segment --- src/rars/riscv/hardware/Memory.java | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/rars/riscv/hardware/Memory.java b/src/rars/riscv/hardware/Memory.java index 6a1562e6..baf04ee8 100644 --- a/src/rars/riscv/hardware/Memory.java +++ b/src/rars/riscv/hardware/Memory.java @@ -657,22 +657,15 @@ private int get(int address, int length, boolean notify) throws AddressErrorExce } else if (inTextSegment(address)) { // Burch Mod (Jan 2013): replace throw with calls to getStatementNoNotify & getBinaryStatement // DPS adaptation 5-Jul-2013: either throw or call, depending on setting - if (Globals.getSettings().getBooleanSetting(Settings.Bool.SELF_MODIFYING_CODE_ENABLED)) { - if(address%4+length > 4){ - // TODO: add checks for halfword load not aligned to halfword boundary - throw new AddressErrorException( - "Load address not aligned to word boundary ", - SimulationException.LOAD_ADDRESS_MISALIGNED, address); - } - ProgramStatement stmt = getStatementNoNotify((address/4)*4); - // TODO: maybe find a way to make the bit manipulation more clear - // It just selects the right bytes from the word loaded - value = stmt == null ? 0 : length == 4 ? stmt.getBinaryStatement() : stmt.getBinaryStatement()>>(8*(address%4))&((1< 4){ + // TODO: add checks for halfword load not aligned to halfword boundary throw new AddressErrorException( - "Cannot read directly from text segment!", - SimulationException.LOAD_ACCESS_FAULT, address); + "Load address not aligned to word boundary ", SimulationException.LOAD_ADDRESS_MISALIGNED, address); } + ProgramStatement stmt = getStatementNoNotify((address/4)*4); + // TODO: maybe find a way to make the bit manipulation more clear + // It just selects the right bytes from the word loaded + value = stmt == null ? 0 : length == 4 ? stmt.getBinaryStatement() : stmt.getBinaryStatement()>>(8*(address%4))&((1< Date: Fri, 9 Aug 2024 10:46:22 -0400 Subject: [PATCH 164/199] SyscallReadChar dont inject unneeded imports --- src/rars/riscv/syscalls/SyscallReadChar.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallReadChar.java b/src/rars/riscv/syscalls/SyscallReadChar.java index a05fbf7e..62567822 100644 --- a/src/rars/riscv/syscalls/SyscallReadChar.java +++ b/src/rars/riscv/syscalls/SyscallReadChar.java @@ -2,8 +2,6 @@ import rars.*; import rars.riscv.AbstractSyscall; -import rars.riscv.Instruction; -import rars.riscv.hardware.Register; import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; @@ -49,4 +47,4 @@ public void simulate(ProgramStatement statement) throws SimulationException { RegisterFile.updateRegister("a0", character); } -} \ No newline at end of file +} From 7daceea1faef63c4fb328225c062fcc51e918956 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Mon, 12 Aug 2024 09:53:36 -0400 Subject: [PATCH 165/199] delete hack to read text segment for display --- src/rars/venus/DataSegmentWindow.java | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index 1f2b23b4..39fdbeca 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -536,31 +536,12 @@ public void updateModelForMemoryRange(int firstAddr) { long datum = Globals.memory.getRaw(address, bytesPerValue); dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(datum, valueBase, bytesPerValue), row, column); } catch (AddressErrorException aee) { - // Bit of a hack here. Memory will throw an exception if you try to read directly from text segment when the - // self-modifying code setting is disabled. This is a good thing if it is the executing MIPS program trying to - // read. But not a good thing if it is the DataSegmentDisplay trying to read. I'll trick Memory by - // temporarily enabling the setting as "non persistent" so it won't write through to the registry. - if (Memory.inTextSegment(address)) { - long displayValue = 0; - if (!Globals.getSettings().getBooleanSetting(Settings.Bool.SELF_MODIFYING_CODE_ENABLED)) { - Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.SELF_MODIFYING_CODE_ENABLED, true); - try { - displayValue = Globals.memory.getRaw(address, bytesPerValue); - } catch (AddressErrorException e) { - // Still got an exception? Doesn't seem possible but if we drop through it will write default value 0. - } - Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.SELF_MODIFYING_CODE_ENABLED, false); - } - dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(displayValue, valueBase, bytesPerValue), row, column); - } // Bug Fix: the following line of code disappeared during the release 4.4 mods, but is essential to // display values of 0 for valid MIPS addresses that are outside the MARS simulated address space. Such // addresses cause an AddressErrorException. Prior to 4.4, they performed this line of code unconditionally. // With 4.4, I added the above IF statement to work with the text segment but inadvertently removed this line! // Now it becomes the "else" part, executed when not in text segment. DPS 8-July-2014. - else { - dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(0, valueBase, bytesPerValue), row, column); - } + dataModel.setDisplayAndModelValueAt(NumberDisplayBaseChooser.formatNumber(0, valueBase, bytesPerValue), row, column); } address += bytesPerValue; } From f11b78bd8572806afc7f91c9ad6a757e38078d51 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 12 Aug 2024 21:34:35 -0400 Subject: [PATCH 166/199] add Program.getOptions --- src/rars/api/Program.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rars/api/Program.java b/src/rars/api/Program.java index 70d41039..cf3c9a1d 100644 --- a/src/rars/api/Program.java +++ b/src/rars/api/Program.java @@ -60,6 +60,10 @@ public Program(Options set){ simulation = new Memory(); } + public Options getOptions() { + return set; + } + /** * Assembles from a list of files * From d6eed01683d74566835f5cc092ab73a57902c116 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 12 Aug 2024 21:35:39 -0400 Subject: [PATCH 167/199] tests: new config `selfmod` to enable selfmodifying code (disabled by default) --- test/RarsTest.java | 7 ++++++- test/selfmod.s | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/test/RarsTest.java b/test/RarsTest.java index 4e8d6f29..a1006cb2 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -47,7 +47,6 @@ Program setupProgram(boolean rv64) { Options opt = new Options(); opt.startAtMain = true; opt.maxSteps = 1000000; - opt.selfModifyingCode = true; return new Program(opt); } @@ -97,6 +96,7 @@ public static String run(String path, Program p){ int exitCode = 0; // TODO: better config system // This is just a temporary solution that should work for the tests I want to write + p.getOptions().selfModifyingCode = false; try { BufferedReader br = new BufferedReader(new FileReader(path)); String line = br.readLine(); @@ -125,6 +125,11 @@ public static String run(String path, Program p){ programArgumentList = new ProgramArgumentList(args).getProgramArgumentList(); } else if (line.startsWith("#error:")) { errorMessage = line.replaceFirst("#error:", ""); + } else if (line.startsWith("#selfmod:")) { + String selfmod = line.replaceFirst("#selfmod:", ""); + if (selfmod.equals("true")) { + p.getOptions().selfModifyingCode = true; + } } line = br.readLine(); } diff --git a/test/selfmod.s b/test/selfmod.s index a317e4c5..8b2f965f 100644 --- a/test/selfmod.s +++ b/test/selfmod.s @@ -1,4 +1,5 @@ #exit:42 +#selfmod:true .text main: la s0, toload From cac2e3bec945941cc4f3f3114017028c225a560e Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 12 Aug 2024 21:36:16 -0400 Subject: [PATCH 168/199] tests: ensure RV64_ENABLED is false for ./test/riscv-tests --- test/RarsTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/RarsTest.java b/test/RarsTest.java index a1006cb2..dda33027 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -53,6 +53,7 @@ Program setupProgram(boolean rv64) { public void checkPrograms() { Program p = setupProgram(false); + Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,false); runDirectory("./test", p); runDirectory("./test/riscv-tests", p); From ea79eace20f80c2cfbc5ed0b2b58d8f39e17976d Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Mon, 12 Aug 2024 21:39:04 -0400 Subject: [PATCH 169/199] tests: add more test/selfmod_*.s programs --- test/selfmod_fail.s | 59 +++++++++++++++++++++++++++++++++++++++++++++ test/selfmod_read.s | 8 ++++++ 2 files changed, 67 insertions(+) create mode 100644 test/selfmod_fail.s create mode 100644 test/selfmod_read.s diff --git a/test/selfmod_fail.s b/test/selfmod_fail.s new file mode 100644 index 00000000..22b07dd5 --- /dev/null +++ b/test/selfmod_fail.s @@ -0,0 +1,59 @@ +#error:Instruction load access error +.text +main: + la s0, toload + la s1, torun + + li a0, 2 + call toload + + # First copy by word to data + lw t0, (s0) + sw t0, (s1) + lw t0, 4(s0) + sw t0, 4(s1) + + # try running it + call torun + + # Copy by byte to data + mv s2, a0 + mv a0, s0 + mv a1, s1 + call copy + + mv a0, s2 + call torun + + # copy to .text + mv s2, a0 + la a0, torun + la a1, main + call copy + + mv a0, s2 + call main + + + li a7, 93 + ecall + +toload: + addi a0, a0, 10 + ret + +copy: + li t0, 0 + li t3, 8 +loop: + add t1, a0, t0 + lb t1, (t1) + add t2, a1, t0 + sb t1, (t2) + addi t0, t0, 1 + blt t0, t3, loop + ret + +.data +torun: + .space 8 diff --git a/test/selfmod_read.s b/test/selfmod_read.s new file mode 100644 index 00000000..f7e4f742 --- /dev/null +++ b/test/selfmod_read.s @@ -0,0 +1,8 @@ +# Test read-only in the code segment (should not require selfmod to be set) +#stdout:1050771 + .text +foo: li a7, 1 # PrintInt + lw a0, foo + ecall + li a7, 10 + ecall From 3119d0d9ece194ae0c94aa98b20b7045a3ef35e5 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 13 Aug 2024 12:55:25 -0400 Subject: [PATCH 170/199] tests: new annotation `#lib:` to inject additional asm files --- test/RarsTest.java | 8 +++++++- test/test_printf.s | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/test_printf.s diff --git a/test/RarsTest.java b/test/RarsTest.java index 4e8d6f29..e415fa61 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -6,6 +6,7 @@ import rars.simulator.Simulator; import java.io.*; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Iterator; @@ -94,6 +95,8 @@ public static String run(String path, Program p){ int[] errorlines = null; String stdin = "", stdout = "", stderr ="", errorMessage = "", exitReason = ""; ArrayList programArgumentList = null; + ArrayList fileList = new ArrayList<>(); + fileList.add(path); int exitCode = 0; // TODO: better config system // This is just a temporary solution that should work for the tests I want to write @@ -107,6 +110,9 @@ public static String run(String path, Program p){ for(int i = 0; i < linenumbers.length; i++){ errorlines[i] = Integer.parseInt(linenumbers[i].trim()); } + } else if (line.startsWith("#lib:")) { + String lib = line.replaceFirst("#lib:", ""); + fileList.add(Paths.get(path).getParent().resolve(lib).toString()); } else if (line.startsWith("#stdin:")) { stdin = line.replaceFirst("#stdin:", "").replaceAll("\\\\n","\n"); } else if (line.startsWith("#stdout:")) { @@ -134,7 +140,7 @@ public static String run(String path, Program p){ return "Error reading " + path; } try { - p.assemble(path); + p.assemble(fileList, path); if(errorlines != null){ return "Expected assembly error, but successfully assembled " + path; } diff --git a/test/test_printf.s b/test/test_printf.s new file mode 100644 index 00000000..aa45f58a --- /dev/null +++ b/test/test_printf.s @@ -0,0 +1,14 @@ +#lib:../examples/printf.s +#lib:../examples/printstr.s +#lib:../examples/printnum.s +#stdout:Hello_World!42 + + la a0, hello_world + li a1, 42 + call printf + + li a7, 10 + ecall + + .data +hello_world: .string "Hello_World!%d\n" From 9118ac0f0d396dde296e08d2ffa0f450840bd723 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 13 Aug 2024 13:41:09 -0400 Subject: [PATCH 171/199] instructions in .data written in memory --- src/rars/assembler/Assembler.java | 93 ++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/src/rars/assembler/Assembler.java b/src/rars/assembler/Assembler.java index 86ae99fe..d6f811a3 100644 --- a/src/rars/assembler/Assembler.java +++ b/src/rars/assembler/Assembler.java @@ -207,7 +207,16 @@ public void assemble(ArrayList tokenizedProgramFiles, boolean exte throw new AssemblyException(errors); } if (statement.getInstruction() instanceof BasicInstruction) { - machineList.add(statement); + //if statement is in .text, add to machineList + if (Memory.inTextSegment(statement.getAddress())) + machineList.add(statement); + //if statement is in .data, write instruction code in data segment of memory + else if (Memory.inDataSegment(statement.getAddress())) { + dataAddress.set(statement.getAddress()); + statement.buildMachineStatementFromBasicStatement(errors); + writeToDataSegment(statement.getBinaryStatement(), Instruction.INSTRUCTION_LENGTH, + statement.getStrippedTokenList().get(0), errors); + } textSegmentLines.add(statement); } else if (statement.getInstruction() != null) { // It is a pseudo-instruction: @@ -265,14 +274,29 @@ public void assemble(ArrayList tokenizedProgramFiles, boolean exte Instruction instr = OperandFormat.bestOperandMatch(newTokenList, instrMatches); // Only first generated instruction is linked to original source - ProgramStatement ps = new ProgramStatement( - this.fileCurrentlyBeingAssembled, - (instrNumber == 0) ? statement.getSource() : "", newTokenList, - newTokenList, instr, textAddress.get(), statement.getSourceLine()); - textAddress.increment(Instruction.INSTRUCTION_LENGTH); - ps.buildBasicStatementFromBasicInstruction(errors); - machineList.add(ps); - textSegmentLines.add(ps); + // Once again, need refactoring, should treat data and text segment the same way + // If in text segment, add current instruction to machineList + if (Memory.inTextSegment(statement.getAddress())) { + ProgramStatement ps = new ProgramStatement( + this.fileCurrentlyBeingAssembled, + (instrNumber == 0) ? statement.getSource() : "", newTokenList, + newTokenList, instr, textAddress.get(), statement.getSourceLine()); + textAddress.increment(Instruction.INSTRUCTION_LENGTH); + ps.buildBasicStatementFromBasicInstruction(errors); + machineList.add(ps); + textSegmentLines.add(ps); + // If in data segment, write instruction code in memory + } else if (Memory.inDataSegment(statement.getAddress())) { + ProgramStatement ps = new ProgramStatement( + this.fileCurrentlyBeingAssembled, + (instrNumber == 0) ? statement.getSource() : "", newTokenList, + newTokenList, instr, dataAddress.get(), statement.getSourceLine()); + ps.buildBasicStatementFromBasicInstruction(errors); + ps.buildMachineStatementFromBasicStatement(errors); + writeToDataSegment(ps.getBinaryStatement(), Instruction.INSTRUCTION_LENGTH, + ps.getStrippedTokenList().get(0), errors); //also increments dataAddress + textSegmentLines.add(ps); + } } // end of FOR loop, repeated for each template in list. } else { textSegmentLines.add(statement); //not an instruction @@ -476,35 +500,36 @@ private ArrayList parseLine(TokenList tokenList, String source return null; } - // If we are in the text segment, the variable "token" must now refer to - // an OPERATOR - // token. If not, it is either a syntax error or the specified operator - // is not - // yet implemented. - if (!this.inDataSegment) { - ArrayList instrMatches = this.matchInstruction(token); - if (instrMatches == null) - return ret; - // OK, we've got an operator match, let's check the operands. - Instruction inst = OperandFormat.bestOperandMatch(tokens, instrMatches); - // Here's the place to flag use of extended (pseudo) instructions - // when setting disabled. - if (inst instanceof ExtendedInstruction && !extendedAssemblerEnabled) { - errors.add(new ErrorMessage(token.getSourceProgram(), token.getSourceLine(), - token.getStartPos(), - "Extended (pseudo) instruction or format not permitted. See Settings.")); - } - if (OperandFormat.tokenOperandMatch(tokens, inst, errors)) { - programStatement = new ProgramStatement(this.fileCurrentlyBeingAssembled, source, - tokenList, tokens, inst, textAddress.get(), sourceLineNumber); - // instruction length is 4 for all basic instruction, varies for extended instruction - // Modified to permit use of compact expansion if address fits - // in 15 bits. DPS 4-Aug-2009 + // If we are here, the variable "token" must now refer to an OPERATOR token. + // If not, it is either a syntax error or the specified operator is not yet implemented. + ArrayList instrMatches = this.matchInstruction(token); + if (instrMatches == null) + return ret; + // OK, we've got an operator match, let's check the operands. + Instruction inst = OperandFormat.bestOperandMatch(tokens, instrMatches); + // Here's the place to flag use of extended (pseudo) instructions + // when setting disabled. + if (inst instanceof ExtendedInstruction && !extendedAssemblerEnabled) { + errors.add(new ErrorMessage(token.getSourceProgram(), token.getSourceLine(), + token.getStartPos(), + "Extended (pseudo) instruction or format not permitted. See Settings.")); + } + if (OperandFormat.tokenOperandMatch(tokens, inst, errors)) { + // need refactoring, shouldn't have to treat this with two cases + if (!this.inDataSegment) { + programStatement = new ProgramStatement(this.fileCurrentlyBeingAssembled, source, tokenList, + tokens, inst, textAddress.get(), sourceLineNumber); int instLength = inst.getInstructionLength(); textAddress.increment(instLength); ret.add(programStatement); - return ret; + } else { + programStatement = new ProgramStatement(this.fileCurrentlyBeingAssembled, source, tokenList, + tokens, inst, dataAddress.get(), sourceLineNumber); + int instLength = inst.getInstructionLength(); + dataAddress.increment(instLength); + ret.add(programStatement); } + return ret; } return null; } // parseLine() From fb54b76829eba5fa08cefc7e9f9ef8276474e8fc Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 13 Aug 2024 13:44:17 -0400 Subject: [PATCH 172/199] warning when instructions are in .data --- src/rars/assembler/Assembler.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/rars/assembler/Assembler.java b/src/rars/assembler/Assembler.java index d6f811a3..caaa1664 100644 --- a/src/rars/assembler/Assembler.java +++ b/src/rars/assembler/Assembler.java @@ -58,6 +58,7 @@ public class Assembler { // macro definition segment private int externAddress; private boolean autoAlign; + private boolean instructionInDataWarningGiven; private Directives dataDirective; private RISCVprogram fileCurrentlyBeingAssembled; private TokenList globalDeclarationList; @@ -206,6 +207,13 @@ public void assemble(ArrayList tokenizedProgramFiles, boolean exte if (errors.errorsOccurred()) { throw new AssemblyException(errors); } + // add warning if instructions were written in .data + if (Memory.inDataSegment(statement.getAddress()) && !instructionInDataWarningGiven) { + errors.add(new ErrorMessage(true, statement.getSourceProgram(), statement.getSourceLine(), + statement.getStrippedTokenList().get(0).getStartPos(), + "Instructions in .data !")); + instructionInDataWarningGiven = true; + } if (statement.getInstruction() instanceof BasicInstruction) { //if statement is in .text, add to machineList if (Memory.inTextSegment(statement.getAddress())) From 1f7aaa08ba8cd169cfe842741722de88a7f81589 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 13 Aug 2024 13:49:41 -0400 Subject: [PATCH 173/199] weird edge case bugs fix --- src/Settings.properties | 2 +- src/rars/Settings.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Settings.properties b/src/Settings.properties index cff9a37f..dc0d4966 100644 --- a/src/Settings.properties +++ b/src/Settings.properties @@ -24,7 +24,7 @@ OddRowBackground = 0x00ffffff OddRowForeground = 0 TextSegmentHighlightBackground = 0x00ffff99 TextSegmentHighlightForeground = 0 -TextSegmentDelaySlotHighlightBackground = 0x33ff00 +TextSegmentDelaySlotHighlightBackground = 0x0033ff00 TextSegmentDelaySlotHighlightForeground = 0 ExplicitWriteHighlightBackground = 0x00ffaaaa ExplicitWriteHighlightForeground = 0 diff --git a/src/rars/Settings.java b/src/rars/Settings.java index fcd39780..b88a9c22 100644 --- a/src/rars/Settings.java +++ b/src/rars/Settings.java @@ -1362,7 +1362,7 @@ private void oldDefaultToNew(SyntaxStyle[] oppositeSyntaxDefault, String[] newDe } for (int i = 0; i < colorSettingsValues.length; i++) - if (colorSettingsValues[i].equals(oppositeDefaultColorSettingsValues[i])) { + if (colorSettingsValues[i].equals(oppositeDefaultColorSettingsValues[i]) || (colorSettingsValues[i].equals("0x00000000") && oppositeDefaultColorSettingsValues[i].equals("0"))) { colorSettingsValues[i] = newDefaultColorSettingsValues[i]; } } From 969e138e22dc04a2f717bcbffe89ee15a1106440 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 13 Aug 2024 14:25:48 -0400 Subject: [PATCH 174/199] ReadChar in command-line feeds from the buffered input reader Using the read system call cause buffering issue since characters might be in the buffer, so no more available. --- src/rars/util/SystemIO.java | 13 +++++++++++-- test/readintchar.s | 12 ++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test/readintchar.s diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index 15acbe33..a896b2d0 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -199,8 +199,17 @@ public static String readString(int serviceNumber, int maxLength) throws CancelE public static int readChar(int serviceNumber) throws CancelException { int returnValue; - // Need a popup? - if (Globals.getGui() != null && Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { + if (Globals.getGui() == null) { + try { + //Read the next char from the buffered input reader + returnValue = getInputReader().read(); + if (returnValue == -1) + returnValue = EOF; + } catch (IOException e) { + returnValue = EOF; + } + } else if (Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { + // Need a popup? String input = readStringInternal("0", "Enter a character value (syscall " + serviceNumber + ")", 1); if (input.length()>0) returnValue = input.getBytes(StandardCharsets.UTF_8) [0] & 0xFF; // truncate diff --git a/test/readintchar.s b/test/readintchar.s new file mode 100644 index 00000000..ea658563 --- /dev/null +++ b/test/readintchar.s @@ -0,0 +1,12 @@ +li a7, 5 # ReadInt +ecall +li a7, 1 # PrintInt +ecall +li a7, 12 # ReadChar +ecall +li a7, 11 # PrintChar +ecall +li a7, 10 # Exit +ecall +#stdin:42\n* +#stdout:42* From 6823b1f53e1bc9eaabc0e9ffebc0ea1a2a6123a1 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 13 Aug 2024 15:09:55 -0400 Subject: [PATCH 175/199] update tools for dark mode part 1 --- src/rars/tools/AbstractToolAndApplication.java | 3 --- src/rars/tools/BitmapDisplay.java | 6 ------ src/rars/tools/CacheSimulator.java | 17 ++--------------- src/rars/tools/DigitalLabSim.java | 12 +++++++----- src/rars/tools/FloatRepresentation.java | 17 ++++++----------- 5 files changed, 15 insertions(+), 40 deletions(-) diff --git a/src/rars/tools/AbstractToolAndApplication.java b/src/rars/tools/AbstractToolAndApplication.java index 91b80859..80016897 100644 --- a/src/rars/tools/AbstractToolAndApplication.java +++ b/src/rars/tools/AbstractToolAndApplication.java @@ -76,8 +76,6 @@ public abstract class AbstractToolAndApplication extends JFrame implements Tool, // Some GUI settings private EmptyBorder emptyBorder = new EmptyBorder(4, 4, 4, 4); - private Color backgroundColor = Color.WHITE; - private int lowMemoryAddress = Memory.dataSegmentBaseAddress; private int highMemoryAddress = Memory.stackBaseAddress; @@ -375,7 +373,6 @@ public void actionPerformed(ActionEvent e) { operationStatusMessages = new MessageField("No file open."); operationStatusMessages.setColumns(40); operationStatusMessages.setMargin(new Insets(0, 3, 0, 3)); //(top, left, bottom, right) - operationStatusMessages.setBackground(backgroundColor); operationStatusMessages.setFocusable(false); operationStatusMessages.setToolTipText("Display operation status messages"); diff --git a/src/rars/tools/BitmapDisplay.java b/src/rars/tools/BitmapDisplay.java index 58808c71..d59ca0f8 100644 --- a/src/rars/tools/BitmapDisplay.java +++ b/src/rars/tools/BitmapDisplay.java @@ -60,7 +60,6 @@ public class BitmapDisplay extends AbstractToolAndApplication { // Some GUI settings private EmptyBorder emptyBorder = new EmptyBorder(4, 4, 4, 4); private Font countFonts = new Font("Times", Font.BOLD, 12); - private Color backgroundColor = Color.WHITE; // Values for Combo Boxes @@ -268,7 +267,6 @@ private JComponent buildOrganizationArea() { visualizationUnitPixelWidthSelector = new JComboBox<>(visualizationUnitPixelWidthChoices); visualizationUnitPixelWidthSelector.setEditable(false); - visualizationUnitPixelWidthSelector.setBackground(backgroundColor); visualizationUnitPixelWidthSelector.setSelectedIndex(defaultVisualizationUnitPixelWidthIndex); visualizationUnitPixelWidthSelector.setToolTipText("Width in pixels of rectangle representing memory word"); visualizationUnitPixelWidthSelector.addActionListener( @@ -281,7 +279,6 @@ public void actionPerformed(ActionEvent e) { }); visualizationUnitPixelHeightSelector = new JComboBox<>(visualizationUnitPixelHeightChoices); visualizationUnitPixelHeightSelector.setEditable(false); - visualizationUnitPixelHeightSelector.setBackground(backgroundColor); visualizationUnitPixelHeightSelector.setSelectedIndex(defaultVisualizationUnitPixelHeightIndex); visualizationUnitPixelHeightSelector.setToolTipText("Height in pixels of rectangle representing memory word"); visualizationUnitPixelHeightSelector.addActionListener( @@ -294,7 +291,6 @@ public void actionPerformed(ActionEvent e) { }); visualizationPixelWidthSelector = new JComboBox<>(displayAreaPixelWidthChoices); visualizationPixelWidthSelector.setEditable(false); - visualizationPixelWidthSelector.setBackground(backgroundColor); visualizationPixelWidthSelector.setSelectedIndex(defaultDisplayWidthIndex); visualizationPixelWidthSelector.setToolTipText("Total width in pixels of display area"); visualizationPixelWidthSelector.addActionListener( @@ -309,7 +305,6 @@ public void actionPerformed(ActionEvent e) { }); visualizationPixelHeightSelector = new JComboBox<>(displayAreaPixelHeightChoices); visualizationPixelHeightSelector.setEditable(false); - visualizationPixelHeightSelector.setBackground(backgroundColor); visualizationPixelHeightSelector.setSelectedIndex(defaultDisplayHeightIndex); visualizationPixelHeightSelector.setToolTipText("Total height in pixels of display area"); visualizationPixelHeightSelector.addActionListener( @@ -324,7 +319,6 @@ public void actionPerformed(ActionEvent e) { }); displayBaseAddressSelector = new JComboBox<>(displayBaseAddressChoices); displayBaseAddressSelector.setEditable(false); - displayBaseAddressSelector.setBackground(backgroundColor); displayBaseAddressSelector.setSelectedIndex(defaultBaseAddressIndex); displayBaseAddressSelector.setToolTipText("Base address for display area (upper left corner)"); displayBaseAddressSelector.addActionListener( diff --git a/src/rars/tools/CacheSimulator.java b/src/rars/tools/CacheSimulator.java index 2c6bf884..0fb36d91 100644 --- a/src/rars/tools/CacheSimulator.java +++ b/src/rars/tools/CacheSimulator.java @@ -74,7 +74,7 @@ public class CacheSimulator extends AbstractToolAndApplication { // Some GUI settings private EmptyBorder emptyBorder = new EmptyBorder(4, 4, 4, 4); private Font countFonts = new Font("Times", Font.BOLD, 12); - private Color backgroundColor = Color.WHITE; + private Color backgroundColor = super.getBackground(); // Values for Combo Boxes private int[] cacheBlockSizeChoicesInt, cacheBlockCountChoicesInt; @@ -163,13 +163,11 @@ public void itemStateChanged(ItemEvent e) { debug = e.getStateChange() == ItemEvent.SELECTED; resetLogDisplay(); logText.setEnabled(debug); - logText.setBackground(debug ? Color.WHITE : logPanel.getBackground()); } }); logPanel.add(logShow); logText = new JTextArea(5, 70); logText.setEnabled(debug); - logText.setBackground(debug ? Color.WHITE : logPanel.getBackground()); logText.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); logText.setToolTipText("Displays cache activity log if enabled"); logScroll = new JScrollPane(logText, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); @@ -186,7 +184,6 @@ private JComponent buildOrganizationArea() { organization.setBorder(otb); cachePlacementSelector = new JComboBox<>(placementPolicyChoices); cachePlacementSelector.setEditable(false); - cachePlacementSelector.setBackground(backgroundColor); cachePlacementSelector.setSelectedIndex(defaultPlacementPolicyIndex); cachePlacementSelector.addActionListener( new ActionListener() { @@ -198,12 +195,10 @@ public void actionPerformed(ActionEvent e) { cacheReplacementSelector = new JComboBox<>(replacementPolicyChoices); cacheReplacementSelector.setEditable(false); - cacheReplacementSelector.setBackground(backgroundColor); cacheReplacementSelector.setSelectedIndex(defaultReplacementPolicyIndex); cacheBlockSizeSelector = new JComboBox<>(cacheBlockSizeChoices); cacheBlockSizeSelector.setEditable(false); - cacheBlockSizeSelector.setBackground(backgroundColor); cacheBlockSizeSelector.setSelectedIndex(defaultCacheBlockSizeIndex); cacheBlockSizeSelector.addActionListener( new ActionListener() { @@ -214,7 +209,6 @@ public void actionPerformed(ActionEvent e) { }); cacheBlockCountSelector = new JComboBox<>(cacheBlockCountChoices); cacheBlockCountSelector.setEditable(false); - cacheBlockCountSelector.setBackground(backgroundColor); cacheBlockCountSelector.setSelectedIndex(defaultCacheBlockCountIndex); cacheBlockCountSelector.addActionListener( new ActionListener() { @@ -230,7 +224,6 @@ public void actionPerformed(ActionEvent e) { cacheSetSizeSelector = new JComboBox<>(cacheSetSizeChoices); cacheSetSizeSelector.setEditable(false); - cacheSetSizeSelector.setBackground(backgroundColor); cacheSetSizeSelector.setSelectedIndex(defaultCacheSetSizeIndex); cacheSetSizeSelector.addActionListener( new ActionListener() { @@ -286,7 +279,6 @@ public void actionPerformed(ActionEvent e) { cacheSizeDisplay = new JTextField(8); cacheSizeDisplay.setHorizontalAlignment(JTextField.RIGHT); cacheSizeDisplay.setEditable(false); - cacheSizeDisplay.setBackground(backgroundColor); cacheSizeDisplay.setFont(countFonts); cacheTotalSizeRow.add(cacheSizeDisplay, BorderLayout.EAST); updateCacheSizeDisplay(); @@ -315,7 +307,6 @@ private JComponent buildPerformanceArea() { memoryAccessCountDisplay = new JTextField(10); memoryAccessCountDisplay.setHorizontalAlignment(JTextField.RIGHT); memoryAccessCountDisplay.setEditable(false); - memoryAccessCountDisplay.setBackground(backgroundColor); memoryAccessCountDisplay.setFont(countFonts); memoryAccessCountRow.add(memoryAccessCountDisplay, BorderLayout.EAST); @@ -325,7 +316,6 @@ private JComponent buildPerformanceArea() { cacheHitCountDisplay = new JTextField(10); cacheHitCountDisplay.setHorizontalAlignment(JTextField.RIGHT); cacheHitCountDisplay.setEditable(false); - cacheHitCountDisplay.setBackground(backgroundColor); cacheHitCountDisplay.setFont(countFonts); cacheHitCountRow.add(cacheHitCountDisplay, BorderLayout.EAST); @@ -335,7 +325,6 @@ private JComponent buildPerformanceArea() { cacheMissCountDisplay = new JTextField(10); cacheMissCountDisplay.setHorizontalAlignment(JTextField.RIGHT); cacheMissCountDisplay.setEditable(false); - cacheMissCountDisplay.setBackground(backgroundColor); cacheMissCountDisplay.setFont(countFonts); cacheMissCountRow.add(cacheMissCountDisplay, BorderLayout.EAST); @@ -345,7 +334,6 @@ private JComponent buildPerformanceArea() { cacheHitRateDisplay = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100); cacheHitRateDisplay.setStringPainted(true); cacheHitRateDisplay.setForeground(Color.BLUE); - cacheHitRateDisplay.setBackground(backgroundColor); cacheHitRateDisplay.setFont(countFonts); cacheHitRateRow.add(cacheHitRateDisplay, BorderLayout.EAST); @@ -854,8 +842,7 @@ private class Animation { private JTextField[] blocks; public final Color hitColor = Color.GREEN; public final Color missColor = Color.RED; - public final Color defaultColor = Color.WHITE; - + public final Color defaultColor = backgroundColor; public Animation() { animation = Box.createVerticalBox(); } diff --git a/src/rars/tools/DigitalLabSim.java b/src/rars/tools/DigitalLabSim.java index 8ef7f915..23c1bd8c 100644 --- a/src/rars/tools/DigitalLabSim.java +++ b/src/rars/tools/DigitalLabSim.java @@ -1,6 +1,6 @@ package rars.tools; -import rars.Globals; +import rars.*; import rars.riscv.hardware.*; import rars.util.Binary; @@ -28,6 +28,7 @@ public class DigitalLabSim extends AbstractToolAndApplication { // GUI Interface. private static JPanel panelTools; + private Color backgroundColor = super.getBackground(); // Seven Segment display private SevenSegmentPanel sevenSegPanel; // Keyboard @@ -305,7 +306,7 @@ public HexaKeyboard() { button = new JButton[16]; for (i = 0; i < 16; i++) { button[i] = new JButton(Integer.toHexString(i)); - button[i].setBackground(Color.WHITE); + button[i].setBackground(backgroundColor); button[i].setMargin(new Insets(10, 10, 10, 10)); button[i].addMouseListener(new EcouteurClick(i)); this.add(button[i]); @@ -316,7 +317,7 @@ public void resetHexaKeyboard() { int i; KeyBoardValueButtonClick = -1; for (i = 0; i < 16; i++) { - button[i].setBackground(Color.WHITE); + button[i].setBackground(backgroundColor); } } @@ -345,10 +346,11 @@ public void mouseClicked(MouseEvent arg0) { KeyBoardValueButtonClick = -1; updateMMIOControlAndData(OUT_ADRESS_HEXA_KEYBOARD, 0); for (i = 0; i < 16; i++) - button[i].setBackground(Color.WHITE); + button[i].setBackground(backgroundColor); } else { // new button pressed KeyBoardValueButtonClick = buttonValue; - button[KeyBoardValueButtonClick].setBackground(Color.GREEN); + Color ColorButtonPressed = Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED) ? new Color(0x00,0x66,0x55) : Color.GREEN; + button[KeyBoardValueButtonClick].setBackground(ColorButtonPressed); if (KeyboardInterruptOnOff) { InterruptController.registerExternalInterrupt(EXTERNAL_INTERRUPT_HEXA_KEYBOARD); } diff --git a/src/rars/tools/FloatRepresentation.java b/src/rars/tools/FloatRepresentation.java index e3f13fcc..32dbd8b5 100644 --- a/src/rars/tools/FloatRepresentation.java +++ b/src/rars/tools/FloatRepresentation.java @@ -1,6 +1,6 @@ package rars.tools; -import rars.Globals; +import rars.*; import rars.riscv.hardware.AccessNotice; import rars.riscv.hardware.FloatingPointRegisterFile; import rars.riscv.hardware.Register; @@ -73,9 +73,8 @@ public class FloatRepresentation extends AbstractToolAndApplication { private static final Font binaryDisplayFont = new Font("Courier", Font.PLAIN, 18); private static final Font decimalDisplayFont = new Font("Courier", Font.PLAIN, 18); private static final Color hexDisplayColor = Color.red; - private static final Color binaryDisplayColor = Color.black; - private static final Color decimalDisplayColor = Color.blue; - private static final String expansionFontTag = ""; + private static final String expansionFontTagLight = ""; + private static final String expansionFontTagDark = ""; private static final String instructionFontTag = ""; private static final int exponentBias = 127; // 32 bit floating point exponent bias @@ -222,7 +221,6 @@ protected JComponent buildDisplayArea() { binarySignDisplay = new JTextField(defaultBinarySign, maxLengthBinarySign + 1); binarySignDisplay.setFont(binaryDisplayFont); - binarySignDisplay.setForeground(binaryDisplayColor); binarySignDisplay.setHorizontalAlignment(JTextField.RIGHT); binarySignDisplay.setToolTipText("The sign bit"); binarySignDisplay.setEditable(true); @@ -230,7 +228,6 @@ protected JComponent buildDisplayArea() { binaryExponentDisplay = new JTextField(defaultBinaryExponent, maxLengthBinaryExponent + 1); binaryExponentDisplay.setFont(binaryDisplayFont); - binaryExponentDisplay.setForeground(binaryDisplayColor); binaryExponentDisplay.setHorizontalAlignment(JTextField.RIGHT); binaryExponentDisplay.setToolTipText("" + maxLengthBinaryExponent + "-bit exponent"); binaryExponentDisplay.setEditable(true); @@ -238,7 +235,6 @@ protected JComponent buildDisplayArea() { binaryFractionDisplay = new BinaryFractionDisplayTextField(defaultBinaryFraction, maxLengthBinaryFraction + 1); binaryFractionDisplay.setFont(binaryDisplayFont); - binaryFractionDisplay.setForeground(binaryDisplayColor); binaryFractionDisplay.setHorizontalAlignment(JTextField.RIGHT); binaryFractionDisplay.setToolTipText("" + maxLengthBinaryFraction + "-bit fraction"); binaryFractionDisplay.setEditable(true); @@ -286,7 +282,7 @@ protected JComponent buildDisplayArea() { // Editable display for decimal version of float value. decimalDisplay = new JTextField(defaultDecimal, maxLengthDecimal + 1); decimalDisplay.setFont(decimalDisplayFont); - decimalDisplay.setForeground(decimalDisplayColor); + decimalDisplay.setForeground(Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED)? new Color(0x66,0xCC,0xFF) : Color.blue); decimalDisplay.setHorizontalAlignment(JTextField.RIGHT); decimalDisplay.setToolTipText("Decimal floating point value"); decimalDisplay.setMargin(new Insets(0, 0, 0, 0)); @@ -303,11 +299,10 @@ protected JComponent buildDisplayArea() { JPanel place2 = new JPanel(rightPanelLayout); JPanel place3 = new JPanel(rightPanelLayout); JPanel place4 = new JPanel(rightPanelLayout); - + String expansionFontTag = Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED) ? expansionFontTagDark : expansionFontTagLight; JEditorPane hexExplain = new JEditorPane("text/html", expansionFontTag + "<  Hexadecimal representation" + ""); hexExplain.setEditable(false); hexExplain.setFocusable(false); - hexExplain.setForeground(Color.black); hexExplain.setBackground(place1.getBackground()); JEditorPane hexToBinExplain = new JEditorPane("text/html", expansionFontTag + "<  Each hex digit represents 4 bits" + ""); hexToBinExplain.setEditable(false); @@ -533,7 +528,7 @@ public String buildExpansionFromBinaryString(String binaryString) { String stringExponent = Integer.toString(biasedExponent - exponentBias); // stringExponent length will range from 1 to 4 (e.g. "0" to "-128") characters. // Right-pad with HTML spaces (" ") to total length 5 displayed characters. - return "" + expansionFontTag + return "" + (Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED) ? expansionFontTagDark : expansionFontTagLight) + "-1" + binaryString.substring(0, maxLengthBinarySign) + "  *  2" + stringExponent + HTMLspaces.substring(0, (5 - stringExponent.length()) * 6) + "  *  " From d63870d6a1c9503d963a19b43bd540e1b5ed476b Mon Sep 17 00:00:00 2001 From: cc791999 Date: Wed, 14 Aug 2024 14:27:14 -0400 Subject: [PATCH 176/199] Memory Ref Visualization updated for dark mode --- src/rars/tools/MemoryReferenceVisualization.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/rars/tools/MemoryReferenceVisualization.java b/src/rars/tools/MemoryReferenceVisualization.java index d0b55f11..353d24a5 100644 --- a/src/rars/tools/MemoryReferenceVisualization.java +++ b/src/rars/tools/MemoryReferenceVisualization.java @@ -1,5 +1,6 @@ package rars.tools; +import rars.*; import rars.riscv.hardware.AccessNotice; import rars.riscv.hardware.Memory; import rars.riscv.hardware.MemoryAccessNotice; @@ -64,7 +65,6 @@ public class MemoryReferenceVisualization extends AbstractToolAndApplication { // Some GUI settings private EmptyBorder emptyBorder = new EmptyBorder(4, 4, 4, 4); private Font countFonts = new Font("Times", Font.BOLD, 12); - private Color backgroundColor = Color.WHITE; // Values for Combo Boxes @@ -93,7 +93,7 @@ public class MemoryReferenceVisualization extends AbstractToolAndApplication { // This array of (count,color) pairs must be kept sorted! count is low end of subrange. // This array will grow if user adds colors at additional counter points (see below). private CounterColor[] defaultCounterColors = - {new CounterColor(0, Color.black), + {new CounterColor(0, Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED) ? Color.white: Color.black), new CounterColor(1, Color.blue), new CounterColor(2, Color.green), new CounterColor(3, Color.yellow), @@ -297,7 +297,6 @@ public void actionPerformed(ActionEvent e) { }); wordsPerUnitSelector = new JComboBox<>(wordsPerUnitChoices); wordsPerUnitSelector.setEditable(false); - wordsPerUnitSelector.setBackground(backgroundColor); wordsPerUnitSelector.setSelectedIndex(defaultWordsPerUnitIndex); wordsPerUnitSelector.setToolTipText("Number of memory words represented by one visualization element (rectangle)"); wordsPerUnitSelector.addActionListener( @@ -309,7 +308,6 @@ public void actionPerformed(ActionEvent e) { }); visualizationUnitPixelWidthSelector = new JComboBox<>(visualizationUnitPixelWidthChoices); visualizationUnitPixelWidthSelector.setEditable(false); - visualizationUnitPixelWidthSelector.setBackground(backgroundColor); visualizationUnitPixelWidthSelector.setSelectedIndex(defaultVisualizationUnitPixelWidthIndex); visualizationUnitPixelWidthSelector.setToolTipText("Width in pixels of rectangle representing memory access"); visualizationUnitPixelWidthSelector.addActionListener( @@ -322,7 +320,6 @@ public void actionPerformed(ActionEvent e) { }); visualizationUnitPixelHeightSelector = new JComboBox<>(visualizationUnitPixelHeightChoices); visualizationUnitPixelHeightSelector.setEditable(false); - visualizationUnitPixelHeightSelector.setBackground(backgroundColor); visualizationUnitPixelHeightSelector.setSelectedIndex(defaultVisualizationUnitPixelHeightIndex); visualizationUnitPixelHeightSelector.setToolTipText("Height in pixels of rectangle representing memory access"); visualizationUnitPixelHeightSelector.addActionListener( @@ -335,7 +332,6 @@ public void actionPerformed(ActionEvent e) { }); visualizationPixelWidthSelector = new JComboBox<>(displayAreaPixelWidthChoices); visualizationPixelWidthSelector.setEditable(false); - visualizationPixelWidthSelector.setBackground(backgroundColor); visualizationPixelWidthSelector.setSelectedIndex(defaultDisplayWidthIndex); visualizationPixelWidthSelector.setToolTipText("Total width in pixels of visualization area"); visualizationPixelWidthSelector.addActionListener( @@ -351,7 +347,6 @@ public void actionPerformed(ActionEvent e) { }); visualizationPixelHeightSelector = new JComboBox<>(displayAreaPixelHeightChoices); visualizationPixelHeightSelector.setEditable(false); - visualizationPixelHeightSelector.setBackground(backgroundColor); visualizationPixelHeightSelector.setSelectedIndex(defaultDisplayHeightIndex); visualizationPixelHeightSelector.setToolTipText("Total height in pixels of visualization area"); visualizationPixelHeightSelector.addActionListener( @@ -367,7 +362,6 @@ public void actionPerformed(ActionEvent e) { }); displayBaseAddressSelector = new JComboBox<>(displayBaseAddressChoices); displayBaseAddressSelector.setEditable(false); - displayBaseAddressSelector.setBackground(backgroundColor); displayBaseAddressSelector.setSelectedIndex(defaultBaseAddressIndex); displayBaseAddressSelector.setToolTipText("Base address for visualization area (upper left corner)"); displayBaseAddressSelector.addActionListener( From 3ded436764848271222e1ae0f4853494b84e6c05 Mon Sep 17 00:00:00 2001 From: cc791999 Date: Wed, 14 Aug 2024 15:26:05 -0400 Subject: [PATCH 177/199] update open file for dark mode and update filter name --- src/rars/venus/EditTabbedPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rars/venus/EditTabbedPane.java b/src/rars/venus/EditTabbedPane.java index 84e8af77..b641222d 100644 --- a/src/rars/venus/EditTabbedPane.java +++ b/src/rars/venus/EditTabbedPane.java @@ -552,7 +552,7 @@ public FileOpener(Editor theEditor) { // Note: add sequence is significant - last one added becomes default. fileFilterList = new ArrayList<>(); fileFilterList.add(fileChooser.getAcceptAllFileFilter()); - fileFilterList.add(FilenameFinder.getFileFilter(Globals.fileExtensions, "Assembler Files", true)); + fileFilterList.add(FilenameFinder.getFileFilter(Globals.fileExtensions, "Assembly Files", true)); fileFilterCount = 0; // this will trigger fileChooser file filter load in next line setChoosableFileFilters(); } @@ -561,6 +561,7 @@ public FileOpener(Editor theEditor) { * Launch a file chooser for name of file to open. Return true if file opened, false otherwise */ private boolean openFile() { + fileChooser.updateUI(); // The fileChooser's list may be rebuilt from the master ArrayList if a new filter // has been added by the user. setChoosableFileFilters(); From 4a131ffddf9f6ffd5f545858fb3a382a0230d17a Mon Sep 17 00:00:00 2001 From: Hugo Leblanc Date: Thu, 15 Aug 2024 13:30:20 -0400 Subject: [PATCH 178/199] Refactor checkPrograms to setup for 32 and 64 bits the same way --- test/RarsTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/RarsTest.java b/test/RarsTest.java index dda33027..4b3848d5 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -52,14 +52,13 @@ Program setupProgram(boolean rv64) { public void checkPrograms() { + // 32-bit tests Program p = setupProgram(false); - Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,false); runDirectory("./test", p); runDirectory("./test/riscv-tests", p); - Globals.getSettings().setBooleanSettingNonPersistent(Settings.Bool.RV64_ENABLED,true); - InstructionSet.rv64 = true; - Globals.instructionSet.populate(); + // 64-bit tests + p = setupProgram(true); runDirectory("./test", p); runDirectory("./test/riscv-tests-64", p); From 40454af92e0ad79916bc80872ab04798206192d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Fri, 16 Aug 2024 13:17:34 +0200 Subject: [PATCH 179/199] new conversion tool --- src/rars/tools/ConversionTool.java | 242 +++++++++++++++++++++++++++++ src/rars/venus/VenusUI.java | 3 + 2 files changed, 245 insertions(+) create mode 100644 src/rars/tools/ConversionTool.java diff --git a/src/rars/tools/ConversionTool.java b/src/rars/tools/ConversionTool.java new file mode 100644 index 00000000..961ee7e6 --- /dev/null +++ b/src/rars/tools/ConversionTool.java @@ -0,0 +1,242 @@ +package rars.tools; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; + +public class ConversionTool { + private boolean updating = false; + + /** + * Creates a panel containing the conversion tool. + * + * @return A JPanel containing the conversion tool. + */ + + public JPanel createConversionToolPanel() { + JPanel panel = new JPanel(); + panel.setLayout(new FlowLayout()); + + // Create labels and text fields for each format + JLabel decimalLabel = new JLabel("Decimal:"); + JTextField decimalField = new JTextField(5); + decimalField.setToolTipText("Enter a decimal number (e.g., 97)"); + + JLabel hexLabel = new JLabel("Hex:"); + JTextField hexField = new JTextField(7); + hexField.setToolTipText("Enter a hexadecimal number with or without '0x' prefix (e.g., 0x61)"); + + JLabel binaryLabel = new JLabel("Binary:"); + JTextField binaryField = new JTextField(10); + binaryField.setToolTipText("Enter a binary number with or without '0b' prefix (e.g., 0b01100001)"); + + JLabel charLabel = new JLabel("Ascii:"); + JTextField charField = new JTextField(2); + charField.setToolTipText("Enter a single character (e.g., a)"); + + // Add labels and text fields to the panel + panel.add(decimalLabel); + panel.add(decimalField); + panel.add(hexLabel); + panel.add(hexField); + panel.add(binaryLabel); + panel.add(binaryField); + panel.add(charLabel); + panel.add(charField); + + // Document Listeners to the all formats text fields to update it when the user types + addDocumentListeners(decimalField, hexField, binaryField, charField); + + return panel; + } + + /** + * Adds document listeners to the text fields to update the other fields when the user types. + * + * @param decimalField The decimal text field. + * @param hexField The hexadecimal text field. + * @param binaryField The binary text field. + * @param charField The character text field. + */ + private void addDocumentListeners(JTextField decimalField, JTextField hexField, JTextField binaryField, JTextField charField) { + decimalField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updateFromDecimal(decimalField, hexField, binaryField, charField); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateFromDecimal(decimalField, hexField, binaryField, charField); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateFromDecimal(decimalField, hexField, binaryField, charField); + } + }); + + hexField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updateFromHex(hexField, decimalField, binaryField, charField); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateFromHex(hexField, decimalField, binaryField, charField); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateFromHex(hexField, decimalField, binaryField, charField); + } + }); + + binaryField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updateFromBinary(binaryField, decimalField, hexField, charField); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateFromBinary(binaryField, decimalField, hexField, charField); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateFromBinary(binaryField, decimalField, hexField, charField); + } + }); + + charField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updateFromChar(charField, decimalField, hexField, binaryField); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateFromChar(charField, decimalField, hexField, binaryField); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateFromChar(charField, decimalField, hexField, binaryField); + } + }); + } + + /** + * Updates the other fields when the decimal field is changed. + * + * @param decimalField The decimal text field. + * @param hexField The hexadecimal text field. + * @param binaryField The binary text field. + * @param charField The character text field. + */ + private void updateFromDecimal(JTextField decimalField, JTextField hexField, JTextField binaryField, JTextField charField) { + if (updating) return; + updating = true; + try { + int decimal = Integer.parseInt(decimalField.getText()); + hexField.setText("0x" + Integer.toHexString(decimal)); + binaryField.setText("0b" + Integer.toBinaryString(decimal)); + charField.setText(Character.toString((char) decimal)); + } catch (NumberFormatException ex) { + hexField.setText(""); + binaryField.setText(""); + charField.setText(""); + } + updating = false; + } + + /** + * Updates the other fields when the hexadecimal field is changed. + * + * @param hexField The hexadecimal text field. + * @param decimalField The decimal text field. + * @param binaryField The binary text field. + * @param charField The character text field. + */ + private void updateFromHex(JTextField hexField, JTextField decimalField, JTextField binaryField, JTextField charField) { + if (updating) return; + updating = true; + try { + String hexInput = hexField.getText(); + if (hexInput.startsWith("0x")) { + hexInput = hexInput.substring(2); + } + int decimal = Integer.parseInt(hexInput, 16); + decimalField.setText(Integer.toString(decimal)); + binaryField.setText("0b" + Integer.toBinaryString(decimal)); + charField.setText(Character.toString((char) decimal)); + } catch (NumberFormatException ex) { + decimalField.setText(""); + binaryField.setText(""); + charField.setText(""); + } + updating = false; + } + + /** + * Updates the other fields when the binary field is changed. + * + * @param binaryField The binary text field. + * @param decimalField The decimal text field. + * @param hexField The hexadecimal text field. + * @param charField The character text field. + */ + private void updateFromBinary(JTextField binaryField, JTextField decimalField, JTextField hexField, JTextField charField) { + if (updating) return; + updating = true; + try { + String binaryInput = binaryField.getText(); + if (binaryInput.startsWith("0b")) { + binaryInput = binaryInput.substring(2); + } + int decimal = Integer.parseInt(binaryInput, 2); + decimalField.setText(Integer.toString(decimal)); + hexField.setText("0x" + Integer.toHexString(decimal)); + charField.setText(Character.toString((char) decimal)); + } catch (NumberFormatException ex) { + decimalField.setText(""); + hexField.setText(""); + charField.setText(""); + } + updating = false; + } + + /** + * Updates the other fields when the character field is changed. + * + * @param charField The character text field. + * @param decimalField The decimal text field. + * @param hexField The hexadecimal text field. + * @param binaryField The binary text field. + */ + private void updateFromChar(JTextField charField, JTextField decimalField, JTextField hexField, JTextField binaryField) { + if (updating) return; + updating = true; + try { + if (charField.getText().length() > 0) { + char character = charField.getText().charAt(0); + int decimal = (int) character; + decimalField.setText(Integer.toString(decimal)); + hexField.setText("0x" + Integer.toHexString(decimal)); + binaryField.setText("0b" + Integer.toBinaryString(decimal)); + } else { + decimalField.setText(""); + hexField.setText(""); + binaryField.setText(""); + } + } catch (Exception ex) { + decimalField.setText(""); + hexField.setText(""); + binaryField.setText(""); + } + updating = false; + } +} \ No newline at end of file diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index 07fd8f46..997fe117 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -7,6 +7,7 @@ import rars.riscv.dump.DumpFormatLoader; import rars.simulator.Simulator; import rars.simulator.SimulatorNotice; +import rars.tools.ConversionTool; import rars.venus.registers.ControlAndStatusWindow; import rars.venus.registers.FloatingPointWindow; import rars.venus.registers.RegistersPane; @@ -96,6 +97,7 @@ public class VenusUI extends JFrame { private JButton New, Open, Save, SaveAs, SaveAll, DumpMemory; private JButton Run, Assemble, Reset, Step, Backstep, Stop, Pause; private JButton Help; + ConversionTool conversionTool = new ConversionTool(); // The "action" objects, which include action listeners. One of each will be created then // shared between a menu item and its corresponding toolbar button. This is a very cool @@ -204,6 +206,7 @@ public VenusUI(String name, ArrayList paths) { JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT)); jp.add(toolbar); jp.add(RunSpeedPanel.getInstance()); + jp.add(conversionTool.createConversionToolPanel()); JPanel center = new JPanel(new BorderLayout()); center.add(jp, BorderLayout.NORTH); center.add(horizonSplitter); From fe6526236a23b9f3e2f5889568ad070ce196148b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sat, 17 Aug 2024 11:26:58 +0200 Subject: [PATCH 180/199] small fixes + ascii limit --- src/rars/tools/ConversionTool.java | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/rars/tools/ConversionTool.java b/src/rars/tools/ConversionTool.java index 961ee7e6..68582a46 100644 --- a/src/rars/tools/ConversionTool.java +++ b/src/rars/tools/ConversionTool.java @@ -19,7 +19,7 @@ public JPanel createConversionToolPanel() { panel.setLayout(new FlowLayout()); // Create labels and text fields for each format - JLabel decimalLabel = new JLabel("Decimal:"); + JLabel decimalLabel = new JLabel("Dec:"); JTextField decimalField = new JTextField(5); decimalField.setToolTipText("Enter a decimal number (e.g., 97)"); @@ -27,11 +27,11 @@ public JPanel createConversionToolPanel() { JTextField hexField = new JTextField(7); hexField.setToolTipText("Enter a hexadecimal number with or without '0x' prefix (e.g., 0x61)"); - JLabel binaryLabel = new JLabel("Binary:"); + JLabel binaryLabel = new JLabel("Bin:"); JTextField binaryField = new JTextField(10); binaryField.setToolTipText("Enter a binary number with or without '0b' prefix (e.g., 0b01100001)"); - JLabel charLabel = new JLabel("Ascii:"); + JLabel charLabel = new JLabel("ASCII:"); JTextField charField = new JTextField(2); charField.setToolTipText("Enter a single character (e.g., a)"); @@ -144,7 +144,10 @@ private void updateFromDecimal(JTextField decimalField, JTextField hexField, JTe int decimal = Integer.parseInt(decimalField.getText()); hexField.setText("0x" + Integer.toHexString(decimal)); binaryField.setText("0b" + Integer.toBinaryString(decimal)); - charField.setText(Character.toString((char) decimal)); + if (decimal <= 127) + charField.setText(Character.toString((char) decimal)); + else + charField.setText(""); } catch (NumberFormatException ex) { hexField.setText(""); binaryField.setText(""); @@ -172,7 +175,10 @@ private void updateFromHex(JTextField hexField, JTextField decimalField, JTextFi int decimal = Integer.parseInt(hexInput, 16); decimalField.setText(Integer.toString(decimal)); binaryField.setText("0b" + Integer.toBinaryString(decimal)); - charField.setText(Character.toString((char) decimal)); + if (decimal <= 127) + charField.setText(Character.toString((char) decimal)); + else + charField.setText(""); } catch (NumberFormatException ex) { decimalField.setText(""); binaryField.setText(""); @@ -200,7 +206,10 @@ private void updateFromBinary(JTextField binaryField, JTextField decimalField, J int decimal = Integer.parseInt(binaryInput, 2); decimalField.setText(Integer.toString(decimal)); hexField.setText("0x" + Integer.toHexString(decimal)); - charField.setText(Character.toString((char) decimal)); + if (decimal <= 127) + charField.setText(Character.toString((char) decimal)); + else + charField.setText(""); } catch (NumberFormatException ex) { decimalField.setText(""); hexField.setText(""); From cc03a09422c596e09979b8923a1857619af65a0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sat, 17 Aug 2024 11:41:18 +0200 Subject: [PATCH 181/199] Deleted license from base src/rars dir --- src/rars/AssemblyException.java | 27 --------------------------- src/rars/ErrorList.java | 27 --------------------------- src/rars/ErrorMessage.java | 27 --------------------------- src/rars/Globals.java | 28 ---------------------------- src/rars/Launch.java | 28 ---------------------------- src/rars/ProgramStatement.java | 28 ---------------------------- src/rars/RISCVprogram.java | 28 ---------------------------- src/rars/Settings.java | 28 ---------------------------- 8 files changed, 221 deletions(-) diff --git a/src/rars/AssemblyException.java b/src/rars/AssemblyException.java index 81df89b1..e81dd6a6 100644 --- a/src/rars/AssemblyException.java +++ b/src/rars/AssemblyException.java @@ -1,32 +1,5 @@ package rars; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Exception wrapping ErrorList, used mainly in Tokenizer and Assembler; Represents errors that occurs while assembling a RISCV program. * diff --git a/src/rars/ErrorList.java b/src/rars/ErrorList.java index d38a17a3..e34d87b4 100644 --- a/src/rars/ErrorList.java +++ b/src/rars/ErrorList.java @@ -1,33 +1,6 @@ package rars; import java.util.ArrayList; -/* -Copyright (c) 2003-2012, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Maintains list of generated error messages, regardless of source (tokenizing, parsing, diff --git a/src/rars/ErrorMessage.java b/src/rars/ErrorMessage.java index ef019e23..248e459c 100644 --- a/src/rars/ErrorMessage.java +++ b/src/rars/ErrorMessage.java @@ -4,33 +4,6 @@ import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; -/* -Copyright (c) 2003-2012, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Represents occurrance of an error detected during tokenizing, assembly or simulation. diff --git a/src/rars/Globals.java b/src/rars/Globals.java index 06a677c9..aaa43535 100644 --- a/src/rars/Globals.java +++ b/src/rars/Globals.java @@ -13,34 +13,6 @@ import java.util.StringTokenizer; import java.util.concurrent.locks.ReentrantLock; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Collection of globally-available data structures. * diff --git a/src/rars/Launch.java b/src/rars/Launch.java index f4b36adc..ea5609d6 100644 --- a/src/rars/Launch.java +++ b/src/rars/Launch.java @@ -20,34 +20,6 @@ import java.util.ArrayList; import java.util.Iterator; -/* -Copyright (c) 2003-2012, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Launch the application * diff --git a/src/rars/ProgramStatement.java b/src/rars/ProgramStatement.java index 1499dff3..41b05410 100644 --- a/src/rars/ProgramStatement.java +++ b/src/rars/ProgramStatement.java @@ -16,34 +16,6 @@ import java.util.ArrayList; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents one assembly/machine statement. This represents the "bare machine" level. * Pseudo-instructions have already been processed at this point and each assembly diff --git a/src/rars/RISCVprogram.java b/src/rars/RISCVprogram.java index 10f15019..7bda71d9 100644 --- a/src/rars/RISCVprogram.java +++ b/src/rars/RISCVprogram.java @@ -9,34 +9,6 @@ import java.util.ArrayList; import java.util.Arrays; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Internal representations of the program. Connects source, tokens and machine code. Having * all these structures available facilitates construction of good messages, diff --git a/src/rars/Settings.java b/src/rars/Settings.java index b88a9c22..fba66145 100644 --- a/src/rars/Settings.java +++ b/src/rars/Settings.java @@ -13,34 +13,6 @@ import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Contains various IDE settings. Persistent settings are maintained for the * current user and on the current machine using From c49a8b72984ee7120666e7faaddfb5ca290cdb51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 17:36:30 +0200 Subject: [PATCH 182/199] clean files inside src/rars/assembler + little coments to ConversionTool --- src/rars/assembler/Assembler.java | 29 --------------------------- src/rars/assembler/DataTypes.java | 29 --------------------------- src/rars/assembler/Directives.java | 28 -------------------------- src/rars/assembler/Macro.java | 25 ----------------------- src/rars/assembler/MacroPool.java | 25 ----------------------- src/rars/assembler/OperandFormat.java | 28 -------------------------- src/rars/assembler/SourceLine.java | 28 -------------------------- src/rars/assembler/Symbol.java | 28 -------------------------- src/rars/assembler/SymbolTable.java | 28 -------------------------- src/rars/assembler/Token.java | 28 -------------------------- src/rars/assembler/TokenList.java | 28 -------------------------- src/rars/assembler/TokenTypes.java | 28 -------------------------- src/rars/assembler/Tokenizer.java | 28 -------------------------- src/rars/tools/ConversionTool.java | 7 +++++++ 14 files changed, 7 insertions(+), 360 deletions(-) diff --git a/src/rars/assembler/Assembler.java b/src/rars/assembler/Assembler.java index caaa1664..d17af87e 100644 --- a/src/rars/assembler/Assembler.java +++ b/src/rars/assembler/Assembler.java @@ -13,35 +13,6 @@ import java.util.ArrayList; import java.util.Collections; - -/* - Copyright (c) 2003-2012, Pete Sanderson and Kenneth Vollmar - - Developed by Pete Sanderson (psanderson@otterbein.edu) - and Kenneth Vollmar (kenvollmar@missouristate.edu) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject - to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - (MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * An Assembler is capable of assembling a RISCV program. It has only one public * method, assemble(), which implements a two-pass assembler. It diff --git a/src/rars/assembler/DataTypes.java b/src/rars/assembler/DataTypes.java index 5134b5bc..a94f3a90 100644 --- a/src/rars/assembler/DataTypes.java +++ b/src/rars/assembler/DataTypes.java @@ -1,34 +1,5 @@ package rars.assembler; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - /** * Information about data types. * diff --git a/src/rars/assembler/Directives.java b/src/rars/assembler/Directives.java index dcd84a53..8febcf22 100644 --- a/src/rars/assembler/Directives.java +++ b/src/rars/assembler/Directives.java @@ -2,34 +2,6 @@ import java.util.ArrayList; -/* -Copyright (c) 2003-2012, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Class representing RISCV assembler directives. If Java had enumerated types, these * would probably be implemented that way. Each directive is represented by a unique object. diff --git a/src/rars/assembler/Macro.java b/src/rars/assembler/Macro.java index f6fb2127..5a669a70 100644 --- a/src/rars/assembler/Macro.java +++ b/src/rars/assembler/Macro.java @@ -9,31 +9,6 @@ import java.util.ArrayList; import java.util.Collections; -/* -Copyright (c) 2013-2014. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Stores information of a macro definition. * diff --git a/src/rars/assembler/MacroPool.java b/src/rars/assembler/MacroPool.java index 7ec2b9c4..44a200b7 100644 --- a/src/rars/assembler/MacroPool.java +++ b/src/rars/assembler/MacroPool.java @@ -4,31 +4,6 @@ import java.util.ArrayList; -/* -Copyright (c) 2013. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Stores information of macros defined by now.
    * Will be used in first pass of assembling RISCV source code. When reached diff --git a/src/rars/assembler/OperandFormat.java b/src/rars/assembler/OperandFormat.java index 60f336c7..ad2c5e7c 100644 --- a/src/rars/assembler/OperandFormat.java +++ b/src/rars/assembler/OperandFormat.java @@ -6,34 +6,6 @@ import java.util.ArrayList; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Provides utility method related to operand formats. * diff --git a/src/rars/assembler/SourceLine.java b/src/rars/assembler/SourceLine.java index a0fdcf47..5f6da08c 100644 --- a/src/rars/assembler/SourceLine.java +++ b/src/rars/assembler/SourceLine.java @@ -2,34 +2,6 @@ import rars.RISCVprogram; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Handy class to represent, for a given line of source code, the code * itself, the program containing it, and its line number within that program. diff --git a/src/rars/assembler/Symbol.java b/src/rars/assembler/Symbol.java index 30a448f4..5251519e 100644 --- a/src/rars/assembler/Symbol.java +++ b/src/rars/assembler/Symbol.java @@ -1,33 +1,5 @@ package rars.assembler; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents a program identifier to be stored in the symbol table. * diff --git a/src/rars/assembler/SymbolTable.java b/src/rars/assembler/SymbolTable.java index 523f5bbf..8512ee4a 100644 --- a/src/rars/assembler/SymbolTable.java +++ b/src/rars/assembler/SymbolTable.java @@ -6,34 +6,6 @@ import java.util.ArrayList; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Creats a table of Symbol objects. * diff --git a/src/rars/assembler/Token.java b/src/rars/assembler/Token.java index 7ed9a81c..c889bcf3 100644 --- a/src/rars/assembler/Token.java +++ b/src/rars/assembler/Token.java @@ -2,34 +2,6 @@ import rars.RISCVprogram; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents one token in the input program. Each Token carries, along with its * type and value, the position (line, column) in which its source appears in the program. diff --git a/src/rars/assembler/TokenList.java b/src/rars/assembler/TokenList.java index 0fc51ce6..dae1e068 100644 --- a/src/rars/assembler/TokenList.java +++ b/src/rars/assembler/TokenList.java @@ -3,34 +3,6 @@ import java.util.ArrayList; import java.util.Iterator; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents the list of tokens in a single line of code. It uses, but is not * a subclass of, ArrayList. diff --git a/src/rars/assembler/TokenTypes.java b/src/rars/assembler/TokenTypes.java index cee2a3a1..2c04cfa5 100644 --- a/src/rars/assembler/TokenTypes.java +++ b/src/rars/assembler/TokenTypes.java @@ -7,34 +7,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.Binary; - /* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Constants to identify the types of tokens found in RISCV programs. * diff --git a/src/rars/assembler/Tokenizer.java b/src/rars/assembler/Tokenizer.java index 0a763cd0..70a30f57 100644 --- a/src/rars/assembler/Tokenizer.java +++ b/src/rars/assembler/Tokenizer.java @@ -7,34 +7,6 @@ import java.util.HashMap; import java.util.Map; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * A tokenizer is capable of tokenizing a complete source program, or a given line from * a source program. Since RARS assembly is line-oriented, each line defines a complete statement. diff --git a/src/rars/tools/ConversionTool.java b/src/rars/tools/ConversionTool.java index 68582a46..1692f642 100644 --- a/src/rars/tools/ConversionTool.java +++ b/src/rars/tools/ConversionTool.java @@ -5,6 +5,13 @@ import javax.swing.event.DocumentListener; import java.awt.*; +/** + * Add conversion for decimal, hexadecimal, binary and ascii tool to the toolbar + * + * @author Julián Hinojosa + * @version August 2024 + **/ + public class ConversionTool { private boolean updating = false; From 3b8b4e4ce7b62cfa6fe21e7486cf23cd52e406fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 19:53:41 +0200 Subject: [PATCH 183/199] clean files inside src/rars/riscv/dumb and hardware files --- src/rars/riscv/dump/AbstractDumpFormat.java | 27 ----------------- src/rars/riscv/dump/AsciiTextDumpFormat.java | 27 ----------------- src/rars/riscv/dump/BinaryDumpFormat.java | 27 ----------------- src/rars/riscv/dump/BinaryTextDumpFormat.java | 27 ----------------- src/rars/riscv/dump/DumpFormat.java | 27 ----------------- src/rars/riscv/dump/DumpFormatLoader.java | 28 ------------------ src/rars/riscv/dump/HexTextDumpFormat.java | 27 ----------------- .../riscv/dump/SegmentWindowDumpFormat.java | 27 ----------------- src/rars/riscv/hardware/AccessNotice.java | 28 ------------------ .../riscv/hardware/AddressErrorException.java | 28 ------------------ .../ControlAndStatusRegisterFile.java | 27 ----------------- .../hardware/FloatingPointRegisterFile.java | 28 ------------------ src/rars/riscv/hardware/LinkedRegister.java | 27 ----------------- src/rars/riscv/hardware/Memory.java | 28 ------------------ .../riscv/hardware/MemoryAccessNotice.java | 28 ------------------ .../riscv/hardware/MemoryConfiguration.java | 28 ------------------ .../riscv/hardware/MemoryConfigurations.java | 28 ------------------ src/rars/riscv/hardware/Register.java | 28 ------------------ .../riscv/hardware/RegisterAccessNotice.java | 28 ------------------ src/rars/riscv/hardware/RegisterBlock.java | 29 ------------------- src/rars/riscv/hardware/RegisterFile.java | 28 ------------------ 21 files changed, 580 deletions(-) diff --git a/src/rars/riscv/dump/AbstractDumpFormat.java b/src/rars/riscv/dump/AbstractDumpFormat.java index 587a7c30..5276b150 100644 --- a/src/rars/riscv/dump/AbstractDumpFormat.java +++ b/src/rars/riscv/dump/AbstractDumpFormat.java @@ -5,33 +5,6 @@ import java.io.File; import java.io.IOException; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Abstract class for memory dump file formats. Provides constructors and diff --git a/src/rars/riscv/dump/AsciiTextDumpFormat.java b/src/rars/riscv/dump/AsciiTextDumpFormat.java index 869c294d..0f82006f 100644 --- a/src/rars/riscv/dump/AsciiTextDumpFormat.java +++ b/src/rars/riscv/dump/AsciiTextDumpFormat.java @@ -8,33 +8,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; -/* -Copyright (c) 2003-2011, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Class that represents the "ASCII text" memory dump format. Memory contents diff --git a/src/rars/riscv/dump/BinaryDumpFormat.java b/src/rars/riscv/dump/BinaryDumpFormat.java index f9f65ad3..fabf6ecc 100644 --- a/src/rars/riscv/dump/BinaryDumpFormat.java +++ b/src/rars/riscv/dump/BinaryDumpFormat.java @@ -7,33 +7,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Class that represents the "binary" memory dump format. The output diff --git a/src/rars/riscv/dump/BinaryTextDumpFormat.java b/src/rars/riscv/dump/BinaryTextDumpFormat.java index 93a5b601..64774814 100644 --- a/src/rars/riscv/dump/BinaryTextDumpFormat.java +++ b/src/rars/riscv/dump/BinaryTextDumpFormat.java @@ -7,33 +7,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Class that represents the "binary text" memory dump format. The output diff --git a/src/rars/riscv/dump/DumpFormat.java b/src/rars/riscv/dump/DumpFormat.java index 571186df..4685846e 100644 --- a/src/rars/riscv/dump/DumpFormat.java +++ b/src/rars/riscv/dump/DumpFormat.java @@ -5,33 +5,6 @@ import java.io.File; import java.io.IOException; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Interface for memory dump file formats. All RARS needs to be able diff --git a/src/rars/riscv/dump/DumpFormatLoader.java b/src/rars/riscv/dump/DumpFormatLoader.java index 7d01bcf2..621a2108 100644 --- a/src/rars/riscv/dump/DumpFormatLoader.java +++ b/src/rars/riscv/dump/DumpFormatLoader.java @@ -5,34 +5,6 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /* This class provides functionality to bring external memory dump format definitions * into RARS. This is adapted from the ToolLoader class, which is in turn adapted diff --git a/src/rars/riscv/dump/HexTextDumpFormat.java b/src/rars/riscv/dump/HexTextDumpFormat.java index 113d6a1d..a57c33cb 100644 --- a/src/rars/riscv/dump/HexTextDumpFormat.java +++ b/src/rars/riscv/dump/HexTextDumpFormat.java @@ -7,33 +7,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Class that represents the "hexadecimal text" memory dump format. The output diff --git a/src/rars/riscv/dump/SegmentWindowDumpFormat.java b/src/rars/riscv/dump/SegmentWindowDumpFormat.java index 4d30b946..35481ac1 100644 --- a/src/rars/riscv/dump/SegmentWindowDumpFormat.java +++ b/src/rars/riscv/dump/SegmentWindowDumpFormat.java @@ -11,33 +11,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Dump memory contents in Segment Window format. Each line of diff --git a/src/rars/riscv/hardware/AccessNotice.java b/src/rars/riscv/hardware/AccessNotice.java index de486ead..cc331128 100644 --- a/src/rars/riscv/hardware/AccessNotice.java +++ b/src/rars/riscv/hardware/AccessNotice.java @@ -1,33 +1,5 @@ package rars.riscv.hardware; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Object provided to Observers of runtime access to memory or registers. * The access types READ and WRITE defined here; use subclasses defined for diff --git a/src/rars/riscv/hardware/AddressErrorException.java b/src/rars/riscv/hardware/AddressErrorException.java index 673997a8..9e8676e5 100644 --- a/src/rars/riscv/hardware/AddressErrorException.java +++ b/src/rars/riscv/hardware/AddressErrorException.java @@ -2,34 +2,6 @@ import rars.util.Binary; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents AddressErrorException. This is generated by the simulator when the * source code references a memory address not valid for the context. diff --git a/src/rars/riscv/hardware/ControlAndStatusRegisterFile.java b/src/rars/riscv/hardware/ControlAndStatusRegisterFile.java index f0336e09..3fe1719d 100644 --- a/src/rars/riscv/hardware/ControlAndStatusRegisterFile.java +++ b/src/rars/riscv/hardware/ControlAndStatusRegisterFile.java @@ -4,33 +4,6 @@ import java.util.Observer; -/* -Copyright (c) 2017-2019, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents the implemented control and status registers. The main classes are fcsr (for floating point errors), * timers, and interrupt handling. diff --git a/src/rars/riscv/hardware/FloatingPointRegisterFile.java b/src/rars/riscv/hardware/FloatingPointRegisterFile.java index 949bcc0c..48b092d5 100644 --- a/src/rars/riscv/hardware/FloatingPointRegisterFile.java +++ b/src/rars/riscv/hardware/FloatingPointRegisterFile.java @@ -4,34 +4,6 @@ import java.util.Observer; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents the Floating Point Unit (FPU) * diff --git a/src/rars/riscv/hardware/LinkedRegister.java b/src/rars/riscv/hardware/LinkedRegister.java index 3d2af631..d4399470 100644 --- a/src/rars/riscv/hardware/LinkedRegister.java +++ b/src/rars/riscv/hardware/LinkedRegister.java @@ -1,32 +1,5 @@ package rars.riscv.hardware; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * A register which aliases a subset of another register */ diff --git a/src/rars/riscv/hardware/Memory.java b/src/rars/riscv/hardware/Memory.java index baf04ee8..0b48b523 100644 --- a/src/rars/riscv/hardware/Memory.java +++ b/src/rars/riscv/hardware/Memory.java @@ -13,34 +13,6 @@ import java.util.Observer; import java.util.Vector; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents memory. Different segments are represented by different data structs. * diff --git a/src/rars/riscv/hardware/MemoryAccessNotice.java b/src/rars/riscv/hardware/MemoryAccessNotice.java index fecd4fa0..1f9ac052 100644 --- a/src/rars/riscv/hardware/MemoryAccessNotice.java +++ b/src/rars/riscv/hardware/MemoryAccessNotice.java @@ -1,33 +1,5 @@ package rars.riscv.hardware; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Object provided to Observers of runtime access to memory. * Observer can get the access type (R/W), address and length in bytes (4,2,1). diff --git a/src/rars/riscv/hardware/MemoryConfiguration.java b/src/rars/riscv/hardware/MemoryConfiguration.java index 8cb46eb9..d4ba37e1 100644 --- a/src/rars/riscv/hardware/MemoryConfiguration.java +++ b/src/rars/riscv/hardware/MemoryConfiguration.java @@ -1,33 +1,5 @@ package rars.riscv.hardware; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Models the memory configuration for the simulated MIPS machine. * "configuration" refers to the starting memory addresses for diff --git a/src/rars/riscv/hardware/MemoryConfigurations.java b/src/rars/riscv/hardware/MemoryConfigurations.java index 22a1d4cd..fb384a5d 100644 --- a/src/rars/riscv/hardware/MemoryConfigurations.java +++ b/src/rars/riscv/hardware/MemoryConfigurations.java @@ -5,34 +5,6 @@ import java.util.ArrayList; import java.util.Iterator; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Models the collection of MIPS memory configurations. * The default configuration is based on SPIM. Starting with MARS 3.7, diff --git a/src/rars/riscv/hardware/Register.java b/src/rars/riscv/hardware/Register.java index d50667b1..91235460 100644 --- a/src/rars/riscv/hardware/Register.java +++ b/src/rars/riscv/hardware/Register.java @@ -2,34 +2,6 @@ import java.util.Observable; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Abstraction to represent a register of a MIPS Assembler. * diff --git a/src/rars/riscv/hardware/RegisterAccessNotice.java b/src/rars/riscv/hardware/RegisterAccessNotice.java index ced06218..cc3cea9c 100644 --- a/src/rars/riscv/hardware/RegisterAccessNotice.java +++ b/src/rars/riscv/hardware/RegisterAccessNotice.java @@ -1,33 +1,5 @@ package rars.riscv.hardware; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Object provided to Observers of runtime access to register. * Observer can get the access type (R/W) and register number. diff --git a/src/rars/riscv/hardware/RegisterBlock.java b/src/rars/riscv/hardware/RegisterBlock.java index b0644406..9fdcbfa9 100644 --- a/src/rars/riscv/hardware/RegisterBlock.java +++ b/src/rars/riscv/hardware/RegisterBlock.java @@ -4,35 +4,6 @@ import java.util.Observer; -/* -Copyright (c) 2003-2017, Pete Sanderson, Benjamin Landers and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu), -Benjamin Landers (benjaminrlanders@gmail.com) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Helper class for RegisterFile, FPRegisterFile, and CSRFile *

    diff --git a/src/rars/riscv/hardware/RegisterFile.java b/src/rars/riscv/hardware/RegisterFile.java index d40b52c3..872d70d6 100644 --- a/src/rars/riscv/hardware/RegisterFile.java +++ b/src/rars/riscv/hardware/RegisterFile.java @@ -7,34 +7,6 @@ import java.util.Observer; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents the collection of RISCV integer registers. * From 59422890574b6204e7671a19bb9463f0e6e79382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 20:06:30 +0200 Subject: [PATCH 184/199] clean instruction folder --- src/rars/riscv/instructions/ADD.java | 28 ------------------- src/rars/riscv/instructions/ADDI.java | 27 ------------------ src/rars/riscv/instructions/AND.java | 28 ------------------- src/rars/riscv/instructions/ANDI.java | 27 ------------------ src/rars/riscv/instructions/AUIPC.java | 27 ------------------ src/rars/riscv/instructions/Arithmetic.java | 27 ------------------ src/rars/riscv/instructions/BEQ.java | 27 ------------------ src/rars/riscv/instructions/BGE.java | 27 ------------------ src/rars/riscv/instructions/BGEU.java | 27 ------------------ src/rars/riscv/instructions/BLT.java | 27 ------------------ src/rars/riscv/instructions/BLTU.java | 27 ------------------ src/rars/riscv/instructions/BNE.java | 27 ------------------ src/rars/riscv/instructions/Branch.java | 27 ------------------ src/rars/riscv/instructions/CSRRC.java | 26 ----------------- src/rars/riscv/instructions/CSRRCI.java | 26 ----------------- src/rars/riscv/instructions/CSRRS.java | 26 ----------------- src/rars/riscv/instructions/CSRRSI.java | 26 ----------------- src/rars/riscv/instructions/CSRRW.java | 26 ----------------- src/rars/riscv/instructions/CSRRWI.java | 26 ----------------- src/rars/riscv/instructions/DIV.java | 28 ------------------- src/rars/riscv/instructions/DIVU.java | 28 ------------------- src/rars/riscv/instructions/EBREAK.java | 27 ------------------ src/rars/riscv/instructions/ECALL.java | 27 ------------------ src/rars/riscv/instructions/FADDS.java | 27 ------------------ src/rars/riscv/instructions/FCLASSS.java | 27 ------------------ src/rars/riscv/instructions/FCVTSW.java | 27 ------------------ src/rars/riscv/instructions/FCVTSWU.java | 27 ------------------ src/rars/riscv/instructions/FCVTWS.java | 27 ------------------ src/rars/riscv/instructions/FCVTWUS.java | 27 ------------------ src/rars/riscv/instructions/FDIVS.java | 27 ------------------ src/rars/riscv/instructions/FENCE.java | 27 ------------------ src/rars/riscv/instructions/FENCEI.java | 27 ------------------ src/rars/riscv/instructions/FEQS.java | 27 ------------------ src/rars/riscv/instructions/FLES.java | 27 ------------------ src/rars/riscv/instructions/FLTS.java | 27 ------------------ src/rars/riscv/instructions/FLW.java | 27 ------------------ src/rars/riscv/instructions/FMADDS.java | 27 ------------------ src/rars/riscv/instructions/FMAXS.java | 27 ------------------ src/rars/riscv/instructions/FMINS.java | 27 ------------------ src/rars/riscv/instructions/FMSUBS.java | 27 ------------------ src/rars/riscv/instructions/FMULS.java | 27 ------------------ src/rars/riscv/instructions/FMVSX.java | 27 ------------------ src/rars/riscv/instructions/FMVXS.java | 27 ------------------ src/rars/riscv/instructions/FNMADDS.java | 27 ------------------ src/rars/riscv/instructions/FNMSUBS.java | 27 ------------------ src/rars/riscv/instructions/FSGNJNS.java | 27 ------------------ src/rars/riscv/instructions/FSGNJS.java | 27 ------------------ src/rars/riscv/instructions/FSGNJXS.java | 27 ------------------ src/rars/riscv/instructions/FSQRTS.java | 27 ------------------ src/rars/riscv/instructions/FSUBS.java | 27 ------------------ src/rars/riscv/instructions/FSW.java | 27 ------------------ src/rars/riscv/instructions/Floating.java | 27 ------------------ src/rars/riscv/instructions/FusedFloat.java | 27 ------------------ .../instructions/ImmediateInstruction.java | 27 ------------------ src/rars/riscv/instructions/JAL.java | 27 ------------------ src/rars/riscv/instructions/JALR.java | 27 ------------------ src/rars/riscv/instructions/LB.java | 27 ------------------ src/rars/riscv/instructions/LBU.java | 27 ------------------ src/rars/riscv/instructions/LH.java | 27 ------------------ src/rars/riscv/instructions/LHU.java | 27 ------------------ src/rars/riscv/instructions/LUI.java | 27 ------------------ src/rars/riscv/instructions/LW.java | 27 ------------------ src/rars/riscv/instructions/Load.java | 27 ------------------ src/rars/riscv/instructions/MUL.java | 28 ------------------- src/rars/riscv/instructions/MULH.java | 28 ------------------- src/rars/riscv/instructions/MULHSU.java | 28 ------------------- src/rars/riscv/instructions/MULHU.java | 28 ------------------- src/rars/riscv/instructions/OR.java | 28 ------------------- src/rars/riscv/instructions/ORI.java | 27 ------------------ src/rars/riscv/instructions/REM.java | 28 ------------------- src/rars/riscv/instructions/REMU.java | 28 ------------------- src/rars/riscv/instructions/SB.java | 27 ------------------ src/rars/riscv/instructions/SH.java | 27 ------------------ src/rars/riscv/instructions/SLL.java | 28 ------------------- src/rars/riscv/instructions/SLLI.java | 28 ------------------- src/rars/riscv/instructions/SLT.java | 28 ------------------- src/rars/riscv/instructions/SLTI.java | 27 ------------------ src/rars/riscv/instructions/SLTIU.java | 27 ------------------ src/rars/riscv/instructions/SLTU.java | 28 ------------------- src/rars/riscv/instructions/SRA.java | 28 ------------------- src/rars/riscv/instructions/SRAI.java | 27 ------------------ src/rars/riscv/instructions/SRL.java | 28 ------------------- src/rars/riscv/instructions/SRLI.java | 28 ------------------- src/rars/riscv/instructions/SUB.java | 27 ------------------ src/rars/riscv/instructions/SW.java | 27 ------------------ src/rars/riscv/instructions/Store.java | 27 ------------------ src/rars/riscv/instructions/URET.java | 26 ----------------- src/rars/riscv/instructions/WFI.java | 27 ------------------ src/rars/riscv/instructions/XOR.java | 28 ------------------- src/rars/riscv/instructions/XORI.java | 27 ------------------ 90 files changed, 2442 deletions(-) diff --git a/src/rars/riscv/instructions/ADD.java b/src/rars/riscv/instructions/ADD.java index 4719e4b7..997735ed 100644 --- a/src/rars/riscv/instructions/ADD.java +++ b/src/rars/riscv/instructions/ADD.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class ADD extends Arithmetic { public ADD() { super("add t1,t2,t3", "Addition: set t1 to (t2 plus t3)", diff --git a/src/rars/riscv/instructions/ADDI.java b/src/rars/riscv/instructions/ADDI.java index 7cc8aa1e..cdf68df6 100644 --- a/src/rars/riscv/instructions/ADDI.java +++ b/src/rars/riscv/instructions/ADDI.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class ADDI extends ImmediateInstruction { public ADDI() { super("addi t1,t2,-100", "Addition immediate: set t1 to (t2 plus signed 12-bit immediate)", "000"); diff --git a/src/rars/riscv/instructions/AND.java b/src/rars/riscv/instructions/AND.java index 4f0998f5..860146fb 100644 --- a/src/rars/riscv/instructions/AND.java +++ b/src/rars/riscv/instructions/AND.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class AND extends Arithmetic { public AND() { super("and t1,t2,t3", "Bitwise AND : Set t1 to bitwise AND of t2 and t3", diff --git a/src/rars/riscv/instructions/ANDI.java b/src/rars/riscv/instructions/ANDI.java index 88e1f22a..2be50051 100644 --- a/src/rars/riscv/instructions/ANDI.java +++ b/src/rars/riscv/instructions/ANDI.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class ANDI extends ImmediateInstruction { public ANDI() { super("andi t1,t2,-100", "Bitwise AND immediate : Set t1 to bitwise AND of t2 and sign-extended 12-bit immediate", "111"); diff --git a/src/rars/riscv/instructions/AUIPC.java b/src/rars/riscv/instructions/AUIPC.java index cd5d6559..6dc267fd 100644 --- a/src/rars/riscv/instructions/AUIPC.java +++ b/src/rars/riscv/instructions/AUIPC.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class AUIPC extends BasicInstruction { public AUIPC() { super("auipc t1,100000", "Add upper immediate to pc: set t1 to (pc plus an upper 20-bit immediate)", diff --git a/src/rars/riscv/instructions/Arithmetic.java b/src/rars/riscv/instructions/Arithmetic.java index 194d1570..b60f140d 100644 --- a/src/rars/riscv/instructions/Arithmetic.java +++ b/src/rars/riscv/instructions/Arithmetic.java @@ -6,33 +6,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Base class for all integer instructions using immediates * diff --git a/src/rars/riscv/instructions/BEQ.java b/src/rars/riscv/instructions/BEQ.java index 250ce4b2..49e0639d 100644 --- a/src/rars/riscv/instructions/BEQ.java +++ b/src/rars/riscv/instructions/BEQ.java @@ -3,33 +3,6 @@ import rars.ProgramStatement; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class BEQ extends Branch { public BEQ() { super("beq t1,t2,label", "Branch if equal : Branch to statement at label's address if t1 and t2 are equal", "000"); diff --git a/src/rars/riscv/instructions/BGE.java b/src/rars/riscv/instructions/BGE.java index bb293912..544aff86 100644 --- a/src/rars/riscv/instructions/BGE.java +++ b/src/rars/riscv/instructions/BGE.java @@ -3,33 +3,6 @@ import rars.ProgramStatement; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class BGE extends Branch { public BGE() { super("bge t1,t2,label", "Branch if greater than or equal: Branch to statement at label's address if t1 is greater than or equal to t2", "101"); diff --git a/src/rars/riscv/instructions/BGEU.java b/src/rars/riscv/instructions/BGEU.java index 4afca9a2..fc27439d 100644 --- a/src/rars/riscv/instructions/BGEU.java +++ b/src/rars/riscv/instructions/BGEU.java @@ -3,33 +3,6 @@ import rars.ProgramStatement; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class BGEU extends Branch { public BGEU() { super("bgeu t1,t2,label", "Branch if greater than or equal to (unsigned): Branch to statement at label's address if t1 is greater than or equal to t2 (with an unsigned interpretation)", "111"); diff --git a/src/rars/riscv/instructions/BLT.java b/src/rars/riscv/instructions/BLT.java index df552406..cb3df55d 100644 --- a/src/rars/riscv/instructions/BLT.java +++ b/src/rars/riscv/instructions/BLT.java @@ -3,33 +3,6 @@ import rars.ProgramStatement; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class BLT extends Branch { public BLT() { super("blt t1,t2,label", "Branch if less than: Branch to statement at label's address if t1 is less than t2", "100"); diff --git a/src/rars/riscv/instructions/BLTU.java b/src/rars/riscv/instructions/BLTU.java index f7545533..ee24ce9c 100644 --- a/src/rars/riscv/instructions/BLTU.java +++ b/src/rars/riscv/instructions/BLTU.java @@ -3,33 +3,6 @@ import rars.ProgramStatement; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class BLTU extends Branch { public BLTU() { super("bltu t1,t2,label", "Branch if less than (unsigned): Branch to statement at label's address if t1 is less than t2 (with an unsigned interpretation)", "110"); diff --git a/src/rars/riscv/instructions/BNE.java b/src/rars/riscv/instructions/BNE.java index 44c56ba8..391bef9a 100644 --- a/src/rars/riscv/instructions/BNE.java +++ b/src/rars/riscv/instructions/BNE.java @@ -3,33 +3,6 @@ import rars.ProgramStatement; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class BNE extends Branch { public BNE() { super("bne t1,t2,label", "Branch if not equal : Branch to statement at label's address if t1 and t2 are not equal", "001"); diff --git a/src/rars/riscv/instructions/Branch.java b/src/rars/riscv/instructions/Branch.java index 2700e8e5..e15232dd 100644 --- a/src/rars/riscv/instructions/Branch.java +++ b/src/rars/riscv/instructions/Branch.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstructionFormat; import rars.riscv.InstructionSet; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Base class for all branching instructions *

    diff --git a/src/rars/riscv/instructions/CSRRC.java b/src/rars/riscv/instructions/CSRRC.java index ceea2863..e0e4dc0f 100644 --- a/src/rars/riscv/instructions/CSRRC.java +++ b/src/rars/riscv/instructions/CSRRC.java @@ -7,32 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ public class CSRRC extends BasicInstruction { public CSRRC() { super("csrrc t0, fcsr, t1", "Atomic Read/Clear CSR: read from the CSR into t0 and clear bits of the CSR according to t1", diff --git a/src/rars/riscv/instructions/CSRRCI.java b/src/rars/riscv/instructions/CSRRCI.java index 13a97d38..0ffec495 100644 --- a/src/rars/riscv/instructions/CSRRCI.java +++ b/src/rars/riscv/instructions/CSRRCI.java @@ -7,32 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ public class CSRRCI extends BasicInstruction { public CSRRCI() { super("csrrci t0, fcsr, 10", "Atomic Read/Clear CSR Immediate: read from the CSR into t0 and clear bits of the CSR according to a constant", diff --git a/src/rars/riscv/instructions/CSRRS.java b/src/rars/riscv/instructions/CSRRS.java index 80a4c8ff..d405a062 100644 --- a/src/rars/riscv/instructions/CSRRS.java +++ b/src/rars/riscv/instructions/CSRRS.java @@ -7,32 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ public class CSRRS extends BasicInstruction { public CSRRS() { super("csrrs t0, fcsr, t1", "Atomic Read/Set CSR: read from the CSR into t0 and logical or t1 into the CSR", diff --git a/src/rars/riscv/instructions/CSRRSI.java b/src/rars/riscv/instructions/CSRRSI.java index b0e5e9f9..a31c00d9 100644 --- a/src/rars/riscv/instructions/CSRRSI.java +++ b/src/rars/riscv/instructions/CSRRSI.java @@ -7,32 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ public class CSRRSI extends BasicInstruction { public CSRRSI() { super("csrrsi t0, fcsr, 10", "Atomic Read/Set CSR Immediate: read from the CSR into t0 and logical or a constant into the CSR", diff --git a/src/rars/riscv/instructions/CSRRW.java b/src/rars/riscv/instructions/CSRRW.java index 7cb44d46..07f613e1 100644 --- a/src/rars/riscv/instructions/CSRRW.java +++ b/src/rars/riscv/instructions/CSRRW.java @@ -7,32 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ public class CSRRW extends BasicInstruction { public CSRRW() { super("csrrw t0, fcsr, t1", "Atomic Read/Write CSR: read from the CSR into t0 and write t1 into the CSR", diff --git a/src/rars/riscv/instructions/CSRRWI.java b/src/rars/riscv/instructions/CSRRWI.java index 40efe473..1621f2f2 100644 --- a/src/rars/riscv/instructions/CSRRWI.java +++ b/src/rars/riscv/instructions/CSRRWI.java @@ -7,32 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ public class CSRRWI extends BasicInstruction { public CSRRWI() { super("csrrwi t0, fcsr, 10", "Atomic Read/Write CSR Immediate: read from the CSR into t0 and write a constant into the CSR", diff --git a/src/rars/riscv/instructions/DIV.java b/src/rars/riscv/instructions/DIV.java index 5553d929..25e65189 100644 --- a/src/rars/riscv/instructions/DIV.java +++ b/src/rars/riscv/instructions/DIV.java @@ -2,34 +2,6 @@ import rars.riscv.hardware.ControlAndStatusRegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class DIV extends Arithmetic { public DIV() { super("div t1,t2,t3", "Division: set t1 to the result of t2/t3", diff --git a/src/rars/riscv/instructions/DIVU.java b/src/rars/riscv/instructions/DIVU.java index 27001a04..3c7a250f 100644 --- a/src/rars/riscv/instructions/DIVU.java +++ b/src/rars/riscv/instructions/DIVU.java @@ -2,34 +2,6 @@ import rars.riscv.hardware.ControlAndStatusRegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class DIVU extends Arithmetic { public DIVU() { super("divu t1,t2,t3", "Division: set t1 to the result of t2/t3 using unsigned division", diff --git a/src/rars/riscv/instructions/EBREAK.java b/src/rars/riscv/instructions/EBREAK.java index e8547146..9ce87ee0 100644 --- a/src/rars/riscv/instructions/EBREAK.java +++ b/src/rars/riscv/instructions/EBREAK.java @@ -6,33 +6,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class EBREAK extends BasicInstruction { public EBREAK() { super("ebreak", "Pause execution", diff --git a/src/rars/riscv/instructions/ECALL.java b/src/rars/riscv/instructions/ECALL.java index 48e66c7d..a963dcbf 100644 --- a/src/rars/riscv/instructions/ECALL.java +++ b/src/rars/riscv/instructions/ECALL.java @@ -7,33 +7,6 @@ import rars.riscv.BasicInstructionFormat; import rars.riscv.InstructionSet; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class ECALL extends BasicInstruction { public ECALL() { super("ecall", "Issue a system call : Execute the system call specified by value in a7", diff --git a/src/rars/riscv/instructions/FADDS.java b/src/rars/riscv/instructions/FADDS.java index ba9271ac..fb49a73b 100644 --- a/src/rars/riscv/instructions/FADDS.java +++ b/src/rars/riscv/instructions/FADDS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FCLASSS.java b/src/rars/riscv/instructions/FCLASSS.java index ad613829..645e5bd8 100644 --- a/src/rars/riscv/instructions/FCLASSS.java +++ b/src/rars/riscv/instructions/FCLASSS.java @@ -7,33 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FCLASSS extends BasicInstruction { public FCLASSS() { super("fclass.s t1, f1", "Classify a floating point number", diff --git a/src/rars/riscv/instructions/FCVTSW.java b/src/rars/riscv/instructions/FCVTSW.java index 3902630c..6e156940 100644 --- a/src/rars/riscv/instructions/FCVTSW.java +++ b/src/rars/riscv/instructions/FCVTSW.java @@ -11,33 +11,6 @@ import java.math.BigInteger; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FCVTSW extends BasicInstruction { public FCVTSW() { super("fcvt.s.w f1, t1, dyn", "Convert float from integer: Assigns the value of t1 to f1", diff --git a/src/rars/riscv/instructions/FCVTSWU.java b/src/rars/riscv/instructions/FCVTSWU.java index 4a452ae8..3817698c 100644 --- a/src/rars/riscv/instructions/FCVTSWU.java +++ b/src/rars/riscv/instructions/FCVTSWU.java @@ -11,33 +11,6 @@ import java.math.BigInteger; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FCVTSWU extends BasicInstruction { public FCVTSWU() { super("fcvt.s.wu f1, t1, dyn", "Convert float from unsigned integer: Assigns the value of t1 to f1", diff --git a/src/rars/riscv/instructions/FCVTWS.java b/src/rars/riscv/instructions/FCVTWS.java index 84792325..eba5e607 100644 --- a/src/rars/riscv/instructions/FCVTWS.java +++ b/src/rars/riscv/instructions/FCVTWS.java @@ -13,33 +13,6 @@ import java.math.BigInteger; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FCVTWS extends BasicInstruction { public FCVTWS() { super("fcvt.w.s t1, f1, dyn", "Convert integer from float: Assigns the value of f1 (rounded) to t1", diff --git a/src/rars/riscv/instructions/FCVTWUS.java b/src/rars/riscv/instructions/FCVTWUS.java index 3babac10..5b71bd34 100644 --- a/src/rars/riscv/instructions/FCVTWUS.java +++ b/src/rars/riscv/instructions/FCVTWUS.java @@ -11,33 +11,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FCVTWUS extends BasicInstruction { public FCVTWUS() { super("fcvt.wu.s t1, f1, dyn", "Convert unsinged integer from float: Assigns the value of f1 (rounded) to t1", diff --git a/src/rars/riscv/instructions/FDIVS.java b/src/rars/riscv/instructions/FDIVS.java index 3b9e2c6d..117b5223 100644 --- a/src/rars/riscv/instructions/FDIVS.java +++ b/src/rars/riscv/instructions/FDIVS.java @@ -4,33 +4,6 @@ import jsoftfloat.types.Float32; import rars.riscv.hardware.ControlAndStatusRegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FDIVS extends Floating { public FDIVS() { super("fdiv.s", "Floating DIVide: assigns f1 to f2 / f3", "0001100"); diff --git a/src/rars/riscv/instructions/FENCE.java b/src/rars/riscv/instructions/FENCE.java index e5324a6c..61c10d7a 100644 --- a/src/rars/riscv/instructions/FENCE.java +++ b/src/rars/riscv/instructions/FENCE.java @@ -4,33 +4,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FENCE extends BasicInstruction { public FENCE() { super("fence 1, 1", "Ensure that IO and memory accesses before the fence happen before the following IO and memory accesses as viewed by a different thread", diff --git a/src/rars/riscv/instructions/FENCEI.java b/src/rars/riscv/instructions/FENCEI.java index a53d2d53..9c5d36b5 100644 --- a/src/rars/riscv/instructions/FENCEI.java +++ b/src/rars/riscv/instructions/FENCEI.java @@ -4,33 +4,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FENCEI extends BasicInstruction { public FENCEI() { super("fence.i", "Ensure that stores to instruction memory are visible to instruction fetches", diff --git a/src/rars/riscv/instructions/FEQS.java b/src/rars/riscv/instructions/FEQS.java index 5c7f71d3..e16b5ca8 100644 --- a/src/rars/riscv/instructions/FEQS.java +++ b/src/rars/riscv/instructions/FEQS.java @@ -9,33 +9,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FEQS extends BasicInstruction { public FEQS() { super("feq.s t1, f1, f2", "Floating EQuals: if f1 = f2, set t1 to 1, else set t1 to 0", diff --git a/src/rars/riscv/instructions/FLES.java b/src/rars/riscv/instructions/FLES.java index f0404acf..5be1f80c 100644 --- a/src/rars/riscv/instructions/FLES.java +++ b/src/rars/riscv/instructions/FLES.java @@ -9,33 +9,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FLES extends BasicInstruction { public FLES() { super("fle.s t1, f1, f2", "Floating Less than or Equals: if f1 <= f2, set t1 to 1, else set t1 to 0", diff --git a/src/rars/riscv/instructions/FLTS.java b/src/rars/riscv/instructions/FLTS.java index b979eb53..4282347d 100644 --- a/src/rars/riscv/instructions/FLTS.java +++ b/src/rars/riscv/instructions/FLTS.java @@ -9,33 +9,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FLTS extends BasicInstruction { public FLTS() { super("flt.s t1, f1, f2", "Floating Less Than: if f1 < f2, set t1 to 1, else set t1 to 0", diff --git a/src/rars/riscv/instructions/FLW.java b/src/rars/riscv/instructions/FLW.java index 76565885..a435c19e 100644 --- a/src/rars/riscv/instructions/FLW.java +++ b/src/rars/riscv/instructions/FLW.java @@ -9,33 +9,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FLW extends BasicInstruction { public FLW() { super("flw f1, -100(t1)", "Load a float from memory", diff --git a/src/rars/riscv/instructions/FMADDS.java b/src/rars/riscv/instructions/FMADDS.java index 347be21d..cb702392 100644 --- a/src/rars/riscv/instructions/FMADDS.java +++ b/src/rars/riscv/instructions/FMADDS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FMAXS.java b/src/rars/riscv/instructions/FMAXS.java index 5def2248..b9cab35d 100644 --- a/src/rars/riscv/instructions/FMAXS.java +++ b/src/rars/riscv/instructions/FMAXS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FMINS.java b/src/rars/riscv/instructions/FMINS.java index 293ae25d..68f0904d 100644 --- a/src/rars/riscv/instructions/FMINS.java +++ b/src/rars/riscv/instructions/FMINS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FMSUBS.java b/src/rars/riscv/instructions/FMSUBS.java index a5b78c80..1f82cecb 100644 --- a/src/rars/riscv/instructions/FMSUBS.java +++ b/src/rars/riscv/instructions/FMSUBS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FMULS.java b/src/rars/riscv/instructions/FMULS.java index 0ce957a8..4b53ea7c 100644 --- a/src/rars/riscv/instructions/FMULS.java +++ b/src/rars/riscv/instructions/FMULS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FMVSX.java b/src/rars/riscv/instructions/FMVSX.java index 7670a204..a581de39 100644 --- a/src/rars/riscv/instructions/FMVSX.java +++ b/src/rars/riscv/instructions/FMVSX.java @@ -6,33 +6,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FMVSX extends BasicInstruction { public FMVSX() { super("fmv.s.x f1, t1", "Move float: move bits representing a float from an integer register", diff --git a/src/rars/riscv/instructions/FMVXS.java b/src/rars/riscv/instructions/FMVXS.java index 095f34e5..0679a9ba 100644 --- a/src/rars/riscv/instructions/FMVXS.java +++ b/src/rars/riscv/instructions/FMVXS.java @@ -6,33 +6,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FMVXS extends BasicInstruction { public FMVXS() { super("fmv.x.s t1, f1", "Move float: move bits representing a float to an integer register", diff --git a/src/rars/riscv/instructions/FNMADDS.java b/src/rars/riscv/instructions/FNMADDS.java index 51220a61..65d32ac9 100644 --- a/src/rars/riscv/instructions/FNMADDS.java +++ b/src/rars/riscv/instructions/FNMADDS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FNMSUBS.java b/src/rars/riscv/instructions/FNMSUBS.java index 54308b9e..ea73ea05 100644 --- a/src/rars/riscv/instructions/FNMSUBS.java +++ b/src/rars/riscv/instructions/FNMSUBS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FSGNJNS.java b/src/rars/riscv/instructions/FSGNJNS.java index e8d3b3c0..094b0a45 100644 --- a/src/rars/riscv/instructions/FSGNJNS.java +++ b/src/rars/riscv/instructions/FSGNJNS.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FSGNJNS extends BasicInstruction { public FSGNJNS() { super("fsgnjn.s f1, f2, f3", "Floating point sign injection (inverted): replace the sign bit of f2 with the opposite of sign bit of f3 and assign it to f1", diff --git a/src/rars/riscv/instructions/FSGNJS.java b/src/rars/riscv/instructions/FSGNJS.java index 19cec7c8..1f9badc4 100644 --- a/src/rars/riscv/instructions/FSGNJS.java +++ b/src/rars/riscv/instructions/FSGNJS.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FSGNJS extends BasicInstruction { public FSGNJS() { super("fsgnj.s f1, f2, f3", "Floating point sign injection: replace the sign bit of f2 with the sign bit of f3 and assign it to f1", diff --git a/src/rars/riscv/instructions/FSGNJXS.java b/src/rars/riscv/instructions/FSGNJXS.java index 8f9aae61..88e86609 100644 --- a/src/rars/riscv/instructions/FSGNJXS.java +++ b/src/rars/riscv/instructions/FSGNJXS.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FSGNJXS extends BasicInstruction { public FSGNJXS() { super("fsgnjx.s f1, f2, f3", "Floating point sign injection (xor): xor the sign bit of f2 with the sign bit of f3 and assign it to f1", diff --git a/src/rars/riscv/instructions/FSQRTS.java b/src/rars/riscv/instructions/FSQRTS.java index 0c889d79..8a15c30e 100644 --- a/src/rars/riscv/instructions/FSQRTS.java +++ b/src/rars/riscv/instructions/FSQRTS.java @@ -9,33 +9,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FSQRTS extends BasicInstruction { public FSQRTS() { super("fsqrt.s f1, f2, dyn", "Floating SQuare RooT: Assigns f1 to the square root of f2", diff --git a/src/rars/riscv/instructions/FSUBS.java b/src/rars/riscv/instructions/FSUBS.java index 11974226..f1e0812e 100644 --- a/src/rars/riscv/instructions/FSUBS.java +++ b/src/rars/riscv/instructions/FSUBS.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import jsoftfloat.Environment; import jsoftfloat.types.Float32; diff --git a/src/rars/riscv/instructions/FSW.java b/src/rars/riscv/instructions/FSW.java index 3c5cbee3..b442002f 100644 --- a/src/rars/riscv/instructions/FSW.java +++ b/src/rars/riscv/instructions/FSW.java @@ -9,33 +9,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class FSW extends BasicInstruction { public FSW() { super("fsw f1, -100(t1)", "Store a float to memory", diff --git a/src/rars/riscv/instructions/Floating.java b/src/rars/riscv/instructions/Floating.java index 5955db2f..ff31623f 100644 --- a/src/rars/riscv/instructions/Floating.java +++ b/src/rars/riscv/instructions/Floating.java @@ -11,33 +11,6 @@ import rars.riscv.BasicInstructionFormat; import jsoftfloat.Environment; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Base class for float to float operations * diff --git a/src/rars/riscv/instructions/FusedFloat.java b/src/rars/riscv/instructions/FusedFloat.java index 893ac6d1..0294f9f7 100644 --- a/src/rars/riscv/instructions/FusedFloat.java +++ b/src/rars/riscv/instructions/FusedFloat.java @@ -10,33 +10,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Helper class for 4 argument floating point instructions */ diff --git a/src/rars/riscv/instructions/ImmediateInstruction.java b/src/rars/riscv/instructions/ImmediateInstruction.java index bb9a081a..a03ee5e9 100644 --- a/src/rars/riscv/instructions/ImmediateInstruction.java +++ b/src/rars/riscv/instructions/ImmediateInstruction.java @@ -6,33 +6,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Base class for all integer instructions using immediates * diff --git a/src/rars/riscv/instructions/JAL.java b/src/rars/riscv/instructions/JAL.java index 685bed0a..09964e20 100644 --- a/src/rars/riscv/instructions/JAL.java +++ b/src/rars/riscv/instructions/JAL.java @@ -7,33 +7,6 @@ import rars.riscv.Instruction; import rars.riscv.InstructionSet; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class JAL extends BasicInstruction { public JAL() { super("jal t1, target", "Jump and link : Set t1 to Program Counter (return address) then jump to statement at target address", diff --git a/src/rars/riscv/instructions/JALR.java b/src/rars/riscv/instructions/JALR.java index 2f209ac5..5a2e0b50 100644 --- a/src/rars/riscv/instructions/JALR.java +++ b/src/rars/riscv/instructions/JALR.java @@ -6,33 +6,6 @@ import rars.riscv.BasicInstructionFormat; import rars.riscv.InstructionSet; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class JALR extends BasicInstruction { public JALR() { super("jalr t1, t2, -100", "Jump and link register: Set t1 to Program Counter (return address) then jump to statement at t2 + immediate", diff --git a/src/rars/riscv/instructions/LB.java b/src/rars/riscv/instructions/LB.java index 5fad1587..eb0a011b 100644 --- a/src/rars/riscv/instructions/LB.java +++ b/src/rars/riscv/instructions/LB.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class LB extends Load { public LB() { super("lb t1, -100(t2)", "Set t1 to sign-extended 8-bit value from effective memory byte address", "000"); diff --git a/src/rars/riscv/instructions/LBU.java b/src/rars/riscv/instructions/LBU.java index 7714a81e..a40d2e13 100644 --- a/src/rars/riscv/instructions/LBU.java +++ b/src/rars/riscv/instructions/LBU.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class LBU extends Load { public LBU() { super("lbu t1, -100(t2)", "Set t1 to zero-extended 8-bit value from effective memory byte address", "100"); diff --git a/src/rars/riscv/instructions/LH.java b/src/rars/riscv/instructions/LH.java index 70a4d818..22f28976 100644 --- a/src/rars/riscv/instructions/LH.java +++ b/src/rars/riscv/instructions/LH.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class LH extends Load { public LH() { super("lh t1, -100(t2)", "Set t1 to sign-extended 16-bit value from effective memory halfword address", "001"); diff --git a/src/rars/riscv/instructions/LHU.java b/src/rars/riscv/instructions/LHU.java index e345ada8..65952861 100644 --- a/src/rars/riscv/instructions/LHU.java +++ b/src/rars/riscv/instructions/LHU.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class LHU extends Load { public LHU() { super("lhu t1, -100(t2)", "Set t1 to zero-extended 16-bit value from effective memory halfword address", "101"); diff --git a/src/rars/riscv/instructions/LUI.java b/src/rars/riscv/instructions/LUI.java index 0a162a71..f7bbe06c 100644 --- a/src/rars/riscv/instructions/LUI.java +++ b/src/rars/riscv/instructions/LUI.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class LUI extends BasicInstruction { public LUI() { super("lui t1,100000", "Load upper immediate: set t1 to 20-bit followed by 12 0s", diff --git a/src/rars/riscv/instructions/LW.java b/src/rars/riscv/instructions/LW.java index 4fd0998a..8d011e6b 100644 --- a/src/rars/riscv/instructions/LW.java +++ b/src/rars/riscv/instructions/LW.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class LW extends Load { public LW() { super("lw t1, -100(t2)", "Set t1 to contents of effective memory word address", "010"); diff --git a/src/rars/riscv/instructions/Load.java b/src/rars/riscv/instructions/Load.java index e2c89eb7..9956aa2d 100644 --- a/src/rars/riscv/instructions/Load.java +++ b/src/rars/riscv/instructions/Load.java @@ -7,33 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Base class for all Load instructions * diff --git a/src/rars/riscv/instructions/MUL.java b/src/rars/riscv/instructions/MUL.java index 5b95ba76..86ffa6a2 100644 --- a/src/rars/riscv/instructions/MUL.java +++ b/src/rars/riscv/instructions/MUL.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class MUL extends Arithmetic { public MUL() { super("mul t1,t2,t3", "Multiplication: set t1 to the lower 32 bits of t2*t3", diff --git a/src/rars/riscv/instructions/MULH.java b/src/rars/riscv/instructions/MULH.java index d65c0077..b8024361 100644 --- a/src/rars/riscv/instructions/MULH.java +++ b/src/rars/riscv/instructions/MULH.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - import java.math.BigInteger; public class MULH extends Arithmetic { diff --git a/src/rars/riscv/instructions/MULHSU.java b/src/rars/riscv/instructions/MULHSU.java index a92389a4..20c05f80 100644 --- a/src/rars/riscv/instructions/MULHSU.java +++ b/src/rars/riscv/instructions/MULHSU.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - import java.math.BigInteger; public class MULHSU extends Arithmetic { diff --git a/src/rars/riscv/instructions/MULHU.java b/src/rars/riscv/instructions/MULHU.java index 52e5f379..4de07193 100644 --- a/src/rars/riscv/instructions/MULHU.java +++ b/src/rars/riscv/instructions/MULHU.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - import java.math.BigInteger; public class MULHU extends Arithmetic { diff --git a/src/rars/riscv/instructions/OR.java b/src/rars/riscv/instructions/OR.java index 94c7ba24..1b5b15b8 100644 --- a/src/rars/riscv/instructions/OR.java +++ b/src/rars/riscv/instructions/OR.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class OR extends Arithmetic { public OR() { super("or t1,t2,t3", "Bitwise OR : Set t1 to bitwise OR of t2 and t3", diff --git a/src/rars/riscv/instructions/ORI.java b/src/rars/riscv/instructions/ORI.java index ac4dede8..7cf6123c 100644 --- a/src/rars/riscv/instructions/ORI.java +++ b/src/rars/riscv/instructions/ORI.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class ORI extends ImmediateInstruction { public ORI() { super("ori t1,t2,-100", "Bitwise OR immediate : Set t1 to bitwise OR of t2 and sign-extended 12-bit immediate", "110"); diff --git a/src/rars/riscv/instructions/REM.java b/src/rars/riscv/instructions/REM.java index 1fa9644e..f6a4198a 100644 --- a/src/rars/riscv/instructions/REM.java +++ b/src/rars/riscv/instructions/REM.java @@ -2,34 +2,6 @@ import rars.riscv.hardware.ControlAndStatusRegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class REM extends Arithmetic { public REM() { super("rem t1,t2,t3", "Remainder: set t1 to the remainder of t2/t3", diff --git a/src/rars/riscv/instructions/REMU.java b/src/rars/riscv/instructions/REMU.java index b7f517e1..c2901a8d 100644 --- a/src/rars/riscv/instructions/REMU.java +++ b/src/rars/riscv/instructions/REMU.java @@ -2,34 +2,6 @@ import rars.riscv.hardware.ControlAndStatusRegisterFile; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class REMU extends Arithmetic { public REMU() { super("remu t1,t2,t3", "Remainder: set t1 to the remainder of t2/t3 using unsigned division", diff --git a/src/rars/riscv/instructions/SB.java b/src/rars/riscv/instructions/SB.java index bc8f3446..fd0e32c2 100644 --- a/src/rars/riscv/instructions/SB.java +++ b/src/rars/riscv/instructions/SB.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SB extends Store { public SB() { super("sb t1, -100(t2)", "Store byte : Store the low-order 8 bits of t1 into the effective memory byte address", "000"); diff --git a/src/rars/riscv/instructions/SH.java b/src/rars/riscv/instructions/SH.java index 829b6cba..66e9aa49 100644 --- a/src/rars/riscv/instructions/SH.java +++ b/src/rars/riscv/instructions/SH.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SH extends Store { public SH() { super("sh t1, -100(t2)", "Store halfword : Store the low-order 16 bits of t1 into the effective memory halfword address", "001"); diff --git a/src/rars/riscv/instructions/SLL.java b/src/rars/riscv/instructions/SLL.java index 6ea995fd..40fad9f3 100644 --- a/src/rars/riscv/instructions/SLL.java +++ b/src/rars/riscv/instructions/SLL.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class SLL extends Arithmetic { public SLL() { super("sll t1,t2,t3", "Shift left logical: Set t1 to result of shifting t2 left by number of bits specified by value in low-order 5 bits of t3", diff --git a/src/rars/riscv/instructions/SLLI.java b/src/rars/riscv/instructions/SLLI.java index 550b2b12..a1bd264e 100644 --- a/src/rars/riscv/instructions/SLLI.java +++ b/src/rars/riscv/instructions/SLLI.java @@ -5,34 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class SLLI extends BasicInstruction { public SLLI() { super("slli t1,t2,10", "Shift left logical : Set t1 to result of shifting t2 left by number of bits specified by immediate", diff --git a/src/rars/riscv/instructions/SLT.java b/src/rars/riscv/instructions/SLT.java index 322f935d..1a77b0ed 100644 --- a/src/rars/riscv/instructions/SLT.java +++ b/src/rars/riscv/instructions/SLT.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class SLT extends Arithmetic { public SLT() { super("slt t1,t2,t3", "Set less than : If t2 is less than t3, then set t1 to 1 else set t1 to 0", diff --git a/src/rars/riscv/instructions/SLTI.java b/src/rars/riscv/instructions/SLTI.java index 8b390b5d..b54e4146 100644 --- a/src/rars/riscv/instructions/SLTI.java +++ b/src/rars/riscv/instructions/SLTI.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SLTI extends ImmediateInstruction { public SLTI() { super("slti t1,t2,-100", "Set less than immediate : If t2 is less than sign-extended 12-bit immediate, then set t1 to 1 else set t1 to 0", diff --git a/src/rars/riscv/instructions/SLTIU.java b/src/rars/riscv/instructions/SLTIU.java index 9e31f5b2..7ca1dc09 100644 --- a/src/rars/riscv/instructions/SLTIU.java +++ b/src/rars/riscv/instructions/SLTIU.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SLTIU extends ImmediateInstruction { public SLTIU() { super("sltiu t1,t2,-100", "Set less than immediate unsigned : If t2 is less than sign-extended 16-bit immediate using unsigned comparison, then set t1 to 1 else set t1 to 0", diff --git a/src/rars/riscv/instructions/SLTU.java b/src/rars/riscv/instructions/SLTU.java index b1f090b8..9171e86b 100644 --- a/src/rars/riscv/instructions/SLTU.java +++ b/src/rars/riscv/instructions/SLTU.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class SLTU extends Arithmetic { public SLTU() { super("sltu t1,t2,t3", "Set less than : If t2 is less than t3 using unsigned comparision, then set t1 to 1 else set t1 to 0", diff --git a/src/rars/riscv/instructions/SRA.java b/src/rars/riscv/instructions/SRA.java index 858c9362..6eab564c 100644 --- a/src/rars/riscv/instructions/SRA.java +++ b/src/rars/riscv/instructions/SRA.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class SRA extends Arithmetic { public SRA() { super("sra t1,t2,t3", "Shift right arithmetic: Set t1 to result of sign-extended shifting t2 right by number of bits specified by value in low-order 5 bits of t3", diff --git a/src/rars/riscv/instructions/SRAI.java b/src/rars/riscv/instructions/SRAI.java index f4b6bd3c..c613e4ec 100644 --- a/src/rars/riscv/instructions/SRAI.java +++ b/src/rars/riscv/instructions/SRAI.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SRAI extends BasicInstruction { public SRAI() { super("srai t1,t2,10", "Shift right arithmetic : Set t1 to result of sign-extended shifting t2 right by number of bits specified by immediate", diff --git a/src/rars/riscv/instructions/SRL.java b/src/rars/riscv/instructions/SRL.java index 56f94c0c..5c3e56b0 100644 --- a/src/rars/riscv/instructions/SRL.java +++ b/src/rars/riscv/instructions/SRL.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class SRL extends Arithmetic { public SRL() { super("srl t1,t2,t3", "Shift right logical: Set t1 to result of shifting t2 right by number of bits specified by value in low-order 5 bits of t3", diff --git a/src/rars/riscv/instructions/SRLI.java b/src/rars/riscv/instructions/SRLI.java index 37b20024..8df89087 100644 --- a/src/rars/riscv/instructions/SRLI.java +++ b/src/rars/riscv/instructions/SRLI.java @@ -5,34 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class SRLI extends BasicInstruction { public SRLI() { super("srli t1,t2,10", "Shift right logical : Set t1 to result of shifting t2 right by number of bits specified by immediate", diff --git a/src/rars/riscv/instructions/SUB.java b/src/rars/riscv/instructions/SUB.java index 640649f4..49b1d3c8 100644 --- a/src/rars/riscv/instructions/SUB.java +++ b/src/rars/riscv/instructions/SUB.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SUB extends Arithmetic { public SUB() { super("sub t1,t2,t3", "Subtraction: set t1 to (t2 minus t3)", diff --git a/src/rars/riscv/instructions/SW.java b/src/rars/riscv/instructions/SW.java index 73b3ca65..33726dcd 100644 --- a/src/rars/riscv/instructions/SW.java +++ b/src/rars/riscv/instructions/SW.java @@ -3,33 +3,6 @@ import rars.Globals; import rars.riscv.hardware.AddressErrorException; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SW extends Store { public SW() { super("sw t1, -100(t2)", "Store word : Store contents of t1 into effective memory word address", "010"); diff --git a/src/rars/riscv/instructions/Store.java b/src/rars/riscv/instructions/Store.java index 7f309041..33114a2e 100644 --- a/src/rars/riscv/instructions/Store.java +++ b/src/rars/riscv/instructions/Store.java @@ -7,33 +7,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Base class for all Store instructions * diff --git a/src/rars/riscv/instructions/URET.java b/src/rars/riscv/instructions/URET.java index 2c142e3d..ebcdec46 100644 --- a/src/rars/riscv/instructions/URET.java +++ b/src/rars/riscv/instructions/URET.java @@ -6,32 +6,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ public class URET extends BasicInstruction { public URET() { super("uret", "Return from handling an interrupt or exception (to uepc)", diff --git a/src/rars/riscv/instructions/WFI.java b/src/rars/riscv/instructions/WFI.java index 54d05d26..e3bb9897 100644 --- a/src/rars/riscv/instructions/WFI.java +++ b/src/rars/riscv/instructions/WFI.java @@ -5,33 +5,6 @@ import rars.riscv.BasicInstruction; import rars.riscv.BasicInstructionFormat; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class WFI extends BasicInstruction { public WFI() { super("wfi", "Wait for Interrupt", diff --git a/src/rars/riscv/instructions/XOR.java b/src/rars/riscv/instructions/XOR.java index 425397be..33cf7bba 100644 --- a/src/rars/riscv/instructions/XOR.java +++ b/src/rars/riscv/instructions/XOR.java @@ -1,33 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - public class XOR extends Arithmetic { public XOR() { super("xor t1,t2,t3", "Bitwise XOR : Set t1 to bitwise XOR of t2 and t3", diff --git a/src/rars/riscv/instructions/XORI.java b/src/rars/riscv/instructions/XORI.java index 96b5ab0e..1ed5d1ff 100644 --- a/src/rars/riscv/instructions/XORI.java +++ b/src/rars/riscv/instructions/XORI.java @@ -1,32 +1,5 @@ package rars.riscv.instructions; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class XORI extends ImmediateInstruction { public XORI() { super("xori t1,t2,-100", "Bitwise XOR immediate : Set t1 to bitwise XOR of t2 and sign-extended 12-bit immediate", "100"); From b81c44c4c20e995aebb9bef1675dc60b7d71a863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 20:11:38 +0200 Subject: [PATCH 185/199] cleanup of remaining files inside of riscv folder --- src/rars/riscv/AbstractSyscall.java | 28 -------------- src/rars/riscv/BasicInstruction.java | 28 -------------- src/rars/riscv/BasicInstructionFormat.java | 27 -------------- src/rars/riscv/ExtendedInstruction.java | 28 -------------- src/rars/riscv/Instruction.java | 28 -------------- src/rars/riscv/InstructionSet.java | 28 -------------- src/rars/riscv/SyscallLoader.java | 30 --------------- src/rars/riscv/SyscallNumberOverride.java | 28 -------------- src/rars/riscv/syscalls/NullString.java | 29 --------------- src/rars/riscv/syscalls/RandomStreams.java | 29 --------------- src/rars/riscv/syscalls/SyscallBrk.java | 28 -------------- src/rars/riscv/syscalls/SyscallClose.java | 28 -------------- .../riscv/syscalls/SyscallConfirmDialog.java | 28 -------------- src/rars/riscv/syscalls/SyscallExit.java | 31 ---------------- src/rars/riscv/syscalls/SyscallExit2.java | 28 -------------- src/rars/riscv/syscalls/SyscallGetCWD.java | 27 -------------- .../syscalls/SyscallInputDialogDouble.java | 28 -------------- .../syscalls/SyscallInputDialogFloat.java | 28 -------------- .../riscv/syscalls/SyscallInputDialogInt.java | 28 -------------- .../syscalls/SyscallInputDialogString.java | 28 -------------- src/rars/riscv/syscalls/SyscallLSeek.java | 27 -------------- .../riscv/syscalls/SyscallMessageDialog.java | 28 -------------- .../syscalls/SyscallMessageDialogDouble.java | 28 -------------- .../syscalls/SyscallMessageDialogFloat.java | 28 -------------- .../syscalls/SyscallMessageDialogInt.java | 28 -------------- .../syscalls/SyscallMessageDialogString.java | 28 -------------- src/rars/riscv/syscalls/SyscallMidiOut.java | 29 --------------- .../riscv/syscalls/SyscallMidiOutSync.java | 37 ------------------- src/rars/riscv/syscalls/SyscallOpen.java | 28 -------------- src/rars/riscv/syscalls/SyscallPrintChar.java | 28 -------------- .../riscv/syscalls/SyscallPrintDouble.java | 28 -------------- .../riscv/syscalls/SyscallPrintFloat.java | 28 -------------- src/rars/riscv/syscalls/SyscallPrintInt.java | 28 -------------- .../riscv/syscalls/SyscallPrintIntBinary.java | 28 -------------- .../riscv/syscalls/SyscallPrintIntHex.java | 28 -------------- .../syscalls/SyscallPrintIntUnsigned.java | 28 -------------- .../riscv/syscalls/SyscallPrintString.java | 28 -------------- .../riscv/syscalls/SyscallRandDouble.java | 29 --------------- src/rars/riscv/syscalls/SyscallRandFloat.java | 28 -------------- src/rars/riscv/syscalls/SyscallRandInt.java | 28 -------------- .../riscv/syscalls/SyscallRandIntRange.java | 28 -------------- src/rars/riscv/syscalls/SyscallRandSeed.java | 28 -------------- src/rars/riscv/syscalls/SyscallRead.java | 28 -------------- src/rars/riscv/syscalls/SyscallReadChar.java | 28 -------------- .../riscv/syscalls/SyscallReadDouble.java | 29 --------------- src/rars/riscv/syscalls/SyscallReadFloat.java | 28 -------------- src/rars/riscv/syscalls/SyscallReadInt.java | 28 -------------- .../riscv/syscalls/SyscallReadString.java | 29 --------------- src/rars/riscv/syscalls/SyscallSbrk.java | 28 -------------- src/rars/riscv/syscalls/SyscallSleep.java | 28 -------------- src/rars/riscv/syscalls/SyscallTime.java | 28 -------------- src/rars/riscv/syscalls/SyscallWrite.java | 29 --------------- src/rars/riscv/syscalls/ToneGenerator.java | 29 --------------- 53 files changed, 1503 deletions(-) diff --git a/src/rars/riscv/AbstractSyscall.java b/src/rars/riscv/AbstractSyscall.java index 4bf9b4e8..cfb5120e 100644 --- a/src/rars/riscv/AbstractSyscall.java +++ b/src/rars/riscv/AbstractSyscall.java @@ -2,34 +2,6 @@ import rars.ProgramStatement; import rars.SimulationException; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Abstract class that a syscall system service must extend. A qualifying service diff --git a/src/rars/riscv/BasicInstruction.java b/src/rars/riscv/BasicInstruction.java index 03ac3e3a..27b022cd 100644 --- a/src/rars/riscv/BasicInstruction.java +++ b/src/rars/riscv/BasicInstruction.java @@ -1,33 +1,5 @@ package rars.riscv; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import rars.ProgramStatement; import rars.SimulationException; diff --git a/src/rars/riscv/BasicInstructionFormat.java b/src/rars/riscv/BasicInstructionFormat.java index c607e051..4a9c8613 100644 --- a/src/rars/riscv/BasicInstructionFormat.java +++ b/src/rars/riscv/BasicInstructionFormat.java @@ -1,32 +1,5 @@ package rars.riscv; -/* -Copyright (c) 2017-2019, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * These are seven RISCV-defined formats of basic machine instructions: * R, R4, I, S, B, U, and J. Examples of each respectively would be add, fmadd, addi, sw, beq, lui, and jal. diff --git a/src/rars/riscv/ExtendedInstruction.java b/src/rars/riscv/ExtendedInstruction.java index 217b39a9..c3b2aa06 100644 --- a/src/rars/riscv/ExtendedInstruction.java +++ b/src/rars/riscv/ExtendedInstruction.java @@ -8,34 +8,6 @@ import java.util.ArrayList; import java.util.StringTokenizer; - /* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * ExtendedInstruction represents a RISCV extended (a.k.a pseudo) instruction. This * assembly language instruction does not have a corresponding machine instruction. Instead diff --git a/src/rars/riscv/Instruction.java b/src/rars/riscv/Instruction.java index caf9ac7c..bbd227a6 100644 --- a/src/rars/riscv/Instruction.java +++ b/src/rars/riscv/Instruction.java @@ -6,34 +6,6 @@ import java.util.StringTokenizer; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Base class to represent member of RISCV instruction set. * diff --git a/src/rars/riscv/InstructionSet.java b/src/rars/riscv/InstructionSet.java index b186eb2f..c6b95f93 100644 --- a/src/rars/riscv/InstructionSet.java +++ b/src/rars/riscv/InstructionSet.java @@ -16,34 +16,6 @@ import java.lang.reflect.Modifier; import java.util.*; - /* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * The list of Instruction objects, each of which represents a RISCV instruction. * The instruction may either be basic (translates into binary machine code) or diff --git a/src/rars/riscv/SyscallLoader.java b/src/rars/riscv/SyscallLoader.java index 46ea065f..31cc9bb9 100644 --- a/src/rars/riscv/SyscallLoader.java +++ b/src/rars/riscv/SyscallLoader.java @@ -6,36 +6,6 @@ import java.util.ArrayList; import java.util.HashSet; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - - /** * This class provides functionality to bring external Syscall definitions * into RARS. This permits anyone with knowledge of the Rars public interfaces, diff --git a/src/rars/riscv/SyscallNumberOverride.java b/src/rars/riscv/SyscallNumberOverride.java index 4e2c45a1..cc25d7ab 100644 --- a/src/rars/riscv/SyscallNumberOverride.java +++ b/src/rars/riscv/SyscallNumberOverride.java @@ -1,33 +1,5 @@ package rars.riscv; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents User override of default syscall number assignment. * Such overrides are specified in the Syscall.properties file read when diff --git a/src/rars/riscv/syscalls/NullString.java b/src/rars/riscv/syscalls/NullString.java index bfd26418..00afc287 100644 --- a/src/rars/riscv/syscalls/NullString.java +++ b/src/rars/riscv/syscalls/NullString.java @@ -9,35 +9,6 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; -/* -Copyright (c) 2003-2017, Pete Sanderson,Benjamin Landers and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu), -Benjamin Landers (benjaminrlanders@gmail.com), -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Small helper class to wrap getting null terminated strings from memory */ diff --git a/src/rars/riscv/syscalls/RandomStreams.java b/src/rars/riscv/syscalls/RandomStreams.java index b4718327..a6978665 100644 --- a/src/rars/riscv/syscalls/RandomStreams.java +++ b/src/rars/riscv/syscalls/RandomStreams.java @@ -5,35 +5,6 @@ import java.util.HashMap; import java.util.Random; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - /** * This small class serves only to hold a static HashMap for storing * random number generators for use by all the random number generator diff --git a/src/rars/riscv/syscalls/SyscallBrk.java b/src/rars/riscv/syscalls/SyscallBrk.java index 841f888c..b1503d01 100644 --- a/src/rars/riscv/syscalls/SyscallBrk.java +++ b/src/rars/riscv/syscalls/SyscallBrk.java @@ -6,34 +6,6 @@ import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallBrk extends AbstractSyscall { public SyscallBrk() { super("Brk", "Set and get heap address. Is compatible with the low level Linux brk syscall (not the POSIX one).", "a0 = wanted heap address, or 0 to get it", "a0 = resulting heap address"); diff --git a/src/rars/riscv/syscalls/SyscallClose.java b/src/rars/riscv/syscalls/SyscallClose.java index 1f96be13..12c028bd 100644 --- a/src/rars/riscv/syscalls/SyscallClose.java +++ b/src/rars/riscv/syscalls/SyscallClose.java @@ -5,34 +5,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallClose extends AbstractSyscall { public SyscallClose() { super("Close", "Close a file", "a0 = the file descriptor to close", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallConfirmDialog.java b/src/rars/riscv/syscalls/SyscallConfirmDialog.java index f046c0ba..8924dc5c 100644 --- a/src/rars/riscv/syscalls/SyscallConfirmDialog.java +++ b/src/rars/riscv/syscalls/SyscallConfirmDialog.java @@ -7,34 +7,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallConfirmDialog extends AbstractSyscall { public SyscallConfirmDialog() { super("ConfirmDialog", "Service to display a message to user", diff --git a/src/rars/riscv/syscalls/SyscallExit.java b/src/rars/riscv/syscalls/SyscallExit.java index 0b8f7a12..b598c83a 100644 --- a/src/rars/riscv/syscalls/SyscallExit.java +++ b/src/rars/riscv/syscalls/SyscallExit.java @@ -5,37 +5,6 @@ import rars.ProgramStatement; import rars.riscv.AbstractSyscall; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - - - public class SyscallExit extends AbstractSyscall { public SyscallExit() { super("Exit", "Exits the program with code 0"); diff --git a/src/rars/riscv/syscalls/SyscallExit2.java b/src/rars/riscv/syscalls/SyscallExit2.java index 26cdf76f..c61bdc6c 100644 --- a/src/rars/riscv/syscalls/SyscallExit2.java +++ b/src/rars/riscv/syscalls/SyscallExit2.java @@ -6,34 +6,6 @@ import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallExit2 extends AbstractSyscall { public SyscallExit2() { super("Exit2", "Exits the program with a code", "a0 = the number to exit with", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallGetCWD.java b/src/rars/riscv/syscalls/SyscallGetCWD.java index 5172eb6d..ac031120 100644 --- a/src/rars/riscv/syscalls/SyscallGetCWD.java +++ b/src/rars/riscv/syscalls/SyscallGetCWD.java @@ -9,33 +9,6 @@ import java.nio.charset.StandardCharsets; -/* -Copyright (c) 20017, Benjamin Landers - -Developed by Benjamin Landers (benjaminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallGetCWD extends AbstractSyscall { public SyscallGetCWD() { super("GetCWD", "Writes the path of the current working directory into a buffer", diff --git a/src/rars/riscv/syscalls/SyscallInputDialogDouble.java b/src/rars/riscv/syscalls/SyscallInputDialogDouble.java index a51fbd00..1e8c4fe7 100644 --- a/src/rars/riscv/syscalls/SyscallInputDialogDouble.java +++ b/src/rars/riscv/syscalls/SyscallInputDialogDouble.java @@ -10,34 +10,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Service to input data. */ diff --git a/src/rars/riscv/syscalls/SyscallInputDialogFloat.java b/src/rars/riscv/syscalls/SyscallInputDialogFloat.java index 3437b2f1..ce4dc916 100644 --- a/src/rars/riscv/syscalls/SyscallInputDialogFloat.java +++ b/src/rars/riscv/syscalls/SyscallInputDialogFloat.java @@ -8,34 +8,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Service to input data. *

    diff --git a/src/rars/riscv/syscalls/SyscallInputDialogInt.java b/src/rars/riscv/syscalls/SyscallInputDialogInt.java index ffac8081..98937e54 100644 --- a/src/rars/riscv/syscalls/SyscallInputDialogInt.java +++ b/src/rars/riscv/syscalls/SyscallInputDialogInt.java @@ -7,34 +7,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Service to input data. *

    diff --git a/src/rars/riscv/syscalls/SyscallInputDialogString.java b/src/rars/riscv/syscalls/SyscallInputDialogString.java index 209e0c7a..eadd5a55 100644 --- a/src/rars/riscv/syscalls/SyscallInputDialogString.java +++ b/src/rars/riscv/syscalls/SyscallInputDialogString.java @@ -10,34 +10,6 @@ import javax.swing.*; import java.nio.charset.StandardCharsets; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Service to input data. *

    diff --git a/src/rars/riscv/syscalls/SyscallLSeek.java b/src/rars/riscv/syscalls/SyscallLSeek.java index cd0812f6..83676bbe 100644 --- a/src/rars/riscv/syscalls/SyscallLSeek.java +++ b/src/rars/riscv/syscalls/SyscallLSeek.java @@ -6,33 +6,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2017, Benjamin Landers - -Developed by Benjamin Landers (benjminrlanders@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallLSeek extends AbstractSyscall { public SyscallLSeek() { super("LSeek", "Seek to a position in a file", diff --git a/src/rars/riscv/syscalls/SyscallMessageDialog.java b/src/rars/riscv/syscalls/SyscallMessageDialog.java index db2c60bd..936abd25 100644 --- a/src/rars/riscv/syscalls/SyscallMessageDialog.java +++ b/src/rars/riscv/syscalls/SyscallMessageDialog.java @@ -7,34 +7,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallMessageDialog extends AbstractSyscall { public SyscallMessageDialog() { super("MessageDialog", "Service to display a message to user", diff --git a/src/rars/riscv/syscalls/SyscallMessageDialogDouble.java b/src/rars/riscv/syscalls/SyscallMessageDialogDouble.java index 7980f8f7..13006da9 100644 --- a/src/rars/riscv/syscalls/SyscallMessageDialogDouble.java +++ b/src/rars/riscv/syscalls/SyscallMessageDialogDouble.java @@ -10,34 +10,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Service to display a message to user. */ diff --git a/src/rars/riscv/syscalls/SyscallMessageDialogFloat.java b/src/rars/riscv/syscalls/SyscallMessageDialogFloat.java index 83822d9d..04b17973 100644 --- a/src/rars/riscv/syscalls/SyscallMessageDialogFloat.java +++ b/src/rars/riscv/syscalls/SyscallMessageDialogFloat.java @@ -7,34 +7,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallMessageDialogFloat extends AbstractSyscall { public SyscallMessageDialogFloat() { super("MessageDialogFloat", "Service to display a message followed by a float to user", diff --git a/src/rars/riscv/syscalls/SyscallMessageDialogInt.java b/src/rars/riscv/syscalls/SyscallMessageDialogInt.java index daaeb97f..091ea1f4 100644 --- a/src/rars/riscv/syscalls/SyscallMessageDialogInt.java +++ b/src/rars/riscv/syscalls/SyscallMessageDialogInt.java @@ -7,34 +7,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallMessageDialogInt extends AbstractSyscall { public SyscallMessageDialogInt() { super("MessageDialogInt", "Service to display a message followed by a int to user", diff --git a/src/rars/riscv/syscalls/SyscallMessageDialogString.java b/src/rars/riscv/syscalls/SyscallMessageDialogString.java index f2c422d0..5dcdbfee 100644 --- a/src/rars/riscv/syscalls/SyscallMessageDialogString.java +++ b/src/rars/riscv/syscalls/SyscallMessageDialogString.java @@ -6,34 +6,6 @@ import javax.swing.*; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallMessageDialogString extends AbstractSyscall { public SyscallMessageDialogString() { super("MessageDialogString", "Service to display a message followed by a string to user", diff --git a/src/rars/riscv/syscalls/SyscallMidiOut.java b/src/rars/riscv/syscalls/SyscallMidiOut.java index f2bfd0bc..35d82906 100644 --- a/src/rars/riscv/syscalls/SyscallMidiOut.java +++ b/src/rars/riscv/syscalls/SyscallMidiOut.java @@ -4,35 +4,6 @@ import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; - -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallMidiOut extends AbstractSyscall { // Endpoints of ranges for the three "byte" parameters. The duration // parameter is limited at the high end only by the int range. diff --git a/src/rars/riscv/syscalls/SyscallMidiOutSync.java b/src/rars/riscv/syscalls/SyscallMidiOutSync.java index 77aa6f71..6005c84e 100644 --- a/src/rars/riscv/syscalls/SyscallMidiOutSync.java +++ b/src/rars/riscv/syscalls/SyscallMidiOutSync.java @@ -4,43 +4,6 @@ import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2003-2007, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Modified 2009-10-19 by Max Hailperin -to use a specific method for synchronously generating -a tone, rather than using an asyncronous method followed -by a Thread.sleep, because sleeping isn't a reliable -synchronization method -- depending on thread scheduling, -the actual tone generation could have been delayed, in -which case the tone might still be playing when the -sleep ended. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallMidiOutSync extends AbstractSyscall { // Endpoints of ranges for the three "byte" parameters. The duration diff --git a/src/rars/riscv/syscalls/SyscallOpen.java b/src/rars/riscv/syscalls/SyscallOpen.java index 8eb50b1a..174823c6 100644 --- a/src/rars/riscv/syscalls/SyscallOpen.java +++ b/src/rars/riscv/syscalls/SyscallOpen.java @@ -6,34 +6,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallOpen extends AbstractSyscall { public SyscallOpen() { super("Open", "Opens a file from a path
    Only supported flags (a1) are read-only (0), write-only (1) and" + diff --git a/src/rars/riscv/syscalls/SyscallPrintChar.java b/src/rars/riscv/syscalls/SyscallPrintChar.java index 6f4fe372..f375fbf8 100644 --- a/src/rars/riscv/syscalls/SyscallPrintChar.java +++ b/src/rars/riscv/syscalls/SyscallPrintChar.java @@ -7,34 +7,6 @@ import java.nio.charset.StandardCharsets; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintChar extends AbstractSyscall { public SyscallPrintChar() { super("PrintChar", "Prints an ascii character", diff --git a/src/rars/riscv/syscalls/SyscallPrintDouble.java b/src/rars/riscv/syscalls/SyscallPrintDouble.java index dc4942be..bd5ca1bb 100644 --- a/src/rars/riscv/syscalls/SyscallPrintDouble.java +++ b/src/rars/riscv/syscalls/SyscallPrintDouble.java @@ -7,34 +7,6 @@ import rars.util.Binary; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintDouble extends AbstractSyscall { /** * Build an instance of the Print Double syscall. Default service number diff --git a/src/rars/riscv/syscalls/SyscallPrintFloat.java b/src/rars/riscv/syscalls/SyscallPrintFloat.java index 51102270..23fbb85a 100644 --- a/src/rars/riscv/syscalls/SyscallPrintFloat.java +++ b/src/rars/riscv/syscalls/SyscallPrintFloat.java @@ -5,34 +5,6 @@ import rars.riscv.hardware.FloatingPointRegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintFloat extends AbstractSyscall { public SyscallPrintFloat() { super("PrintFloat", "Prints a floating point number", "fa0 = float to print", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallPrintInt.java b/src/rars/riscv/syscalls/SyscallPrintInt.java index 9a94543f..a8e5811b 100644 --- a/src/rars/riscv/syscalls/SyscallPrintInt.java +++ b/src/rars/riscv/syscalls/SyscallPrintInt.java @@ -5,34 +5,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintInt extends AbstractSyscall { public SyscallPrintInt() { super("PrintInt", "Prints an integer", "a0 = integer to print", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallPrintIntBinary.java b/src/rars/riscv/syscalls/SyscallPrintIntBinary.java index 7670d5e9..a2ff243b 100644 --- a/src/rars/riscv/syscalls/SyscallPrintIntBinary.java +++ b/src/rars/riscv/syscalls/SyscallPrintIntBinary.java @@ -7,34 +7,6 @@ import rars.util.Binary; import rars.util.SystemIO; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintIntBinary extends AbstractSyscall { public SyscallPrintIntBinary() { super("PrintIntBinary", "Prints an integer (in binary format left-padded with zeroes) ", "a0 = integer to print", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallPrintIntHex.java b/src/rars/riscv/syscalls/SyscallPrintIntHex.java index 833187fe..34fdb0e7 100644 --- a/src/rars/riscv/syscalls/SyscallPrintIntHex.java +++ b/src/rars/riscv/syscalls/SyscallPrintIntHex.java @@ -7,34 +7,6 @@ import rars.util.Binary; import rars.util.SystemIO; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintIntHex extends AbstractSyscall { public SyscallPrintIntHex() { super("PrintIntHex", "Prints an integer (in hexdecimal format left-padded with zeroes)", "a0 = integer to print", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java b/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java index 80ed915f..f6177c2d 100644 --- a/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java +++ b/src/rars/riscv/syscalls/SyscallPrintIntUnsigned.java @@ -7,34 +7,6 @@ import rars.util.Binary; import rars.util.SystemIO; -/* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintIntUnsigned extends AbstractSyscall { public SyscallPrintIntUnsigned() { super("PrintIntUnsigned", "Prints an integer (unsigned)", "a0 = integer to print", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallPrintString.java b/src/rars/riscv/syscalls/SyscallPrintString.java index 93061e38..3d38d64e 100644 --- a/src/rars/riscv/syscalls/SyscallPrintString.java +++ b/src/rars/riscv/syscalls/SyscallPrintString.java @@ -5,34 +5,6 @@ import rars.riscv.AbstractSyscall; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallPrintString extends AbstractSyscall { public SyscallPrintString() { super("PrintString", "Prints a null-terminated string to the console", diff --git a/src/rars/riscv/syscalls/SyscallRandDouble.java b/src/rars/riscv/syscalls/SyscallRandDouble.java index 396ef692..9368ab08 100644 --- a/src/rars/riscv/syscalls/SyscallRandDouble.java +++ b/src/rars/riscv/syscalls/SyscallRandDouble.java @@ -8,35 +8,6 @@ import java.util.Random; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - /** * Service to return a random floating point value. */ diff --git a/src/rars/riscv/syscalls/SyscallRandFloat.java b/src/rars/riscv/syscalls/SyscallRandFloat.java index def7ab43..19a83061 100644 --- a/src/rars/riscv/syscalls/SyscallRandFloat.java +++ b/src/rars/riscv/syscalls/SyscallRandFloat.java @@ -6,34 +6,6 @@ import java.util.Random; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallRandFloat extends AbstractSyscall { public SyscallRandFloat() { super("RandFloat", "Get a random float", "a0 = index of pseudorandom number generator", diff --git a/src/rars/riscv/syscalls/SyscallRandInt.java b/src/rars/riscv/syscalls/SyscallRandInt.java index 0a15b848..d6738f08 100644 --- a/src/rars/riscv/syscalls/SyscallRandInt.java +++ b/src/rars/riscv/syscalls/SyscallRandInt.java @@ -6,34 +6,6 @@ import java.util.Random; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallRandInt extends AbstractSyscall { public SyscallRandInt() { super("RandInt", "Get a random integer", "a0 = index of pseudorandom number generator", "a0 = random integer"); diff --git a/src/rars/riscv/syscalls/SyscallRandIntRange.java b/src/rars/riscv/syscalls/SyscallRandIntRange.java index e0fb8494..4a72bfc6 100644 --- a/src/rars/riscv/syscalls/SyscallRandIntRange.java +++ b/src/rars/riscv/syscalls/SyscallRandIntRange.java @@ -7,34 +7,6 @@ import java.util.Random; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallRandIntRange extends AbstractSyscall { public SyscallRandIntRange() { super("RandIntRange", "Get a random bounded integer", "a0 = index of pseudorandom number generator
    a1 = upper bound for random number", diff --git a/src/rars/riscv/syscalls/SyscallRandSeed.java b/src/rars/riscv/syscalls/SyscallRandSeed.java index 77d0969d..07e4c55d 100644 --- a/src/rars/riscv/syscalls/SyscallRandSeed.java +++ b/src/rars/riscv/syscalls/SyscallRandSeed.java @@ -6,34 +6,6 @@ import java.util.Random; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallRandSeed extends AbstractSyscall { public SyscallRandSeed() { super("RandSeed", "Set seed for the underlying Java pseudorandom number generator", diff --git a/src/rars/riscv/syscalls/SyscallRead.java b/src/rars/riscv/syscalls/SyscallRead.java index f2c97642..3643c768 100644 --- a/src/rars/riscv/syscalls/SyscallRead.java +++ b/src/rars/riscv/syscalls/SyscallRead.java @@ -8,34 +8,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallRead extends AbstractSyscall { public SyscallRead() { super("Read", "Read from a file descriptor into a buffer", diff --git a/src/rars/riscv/syscalls/SyscallReadChar.java b/src/rars/riscv/syscalls/SyscallReadChar.java index 62567822..bac868c9 100644 --- a/src/rars/riscv/syscalls/SyscallReadChar.java +++ b/src/rars/riscv/syscalls/SyscallReadChar.java @@ -5,34 +5,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallReadChar extends AbstractSyscall { public SyscallReadChar() { super("ReadChar", "Reads a character from input console", "N/A", "a0 = the character or -1 if end of input."); diff --git a/src/rars/riscv/syscalls/SyscallReadDouble.java b/src/rars/riscv/syscalls/SyscallReadDouble.java index edd318e8..d3bb1c41 100644 --- a/src/rars/riscv/syscalls/SyscallReadDouble.java +++ b/src/rars/riscv/syscalls/SyscallReadDouble.java @@ -7,35 +7,6 @@ import rars.riscv.AbstractSyscall; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - /** * Service to read the bits of console input double into $f0 and $f1. * $f1 contains high order word of the double. diff --git a/src/rars/riscv/syscalls/SyscallReadFloat.java b/src/rars/riscv/syscalls/SyscallReadFloat.java index 407c9e60..7c43a001 100644 --- a/src/rars/riscv/syscalls/SyscallReadFloat.java +++ b/src/rars/riscv/syscalls/SyscallReadFloat.java @@ -7,34 +7,6 @@ import rars.riscv.hardware.FloatingPointRegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallReadFloat extends AbstractSyscall { public SyscallReadFloat() { super("ReadFloat", "Reads a float from input console", "N/A", "fa0 = the float"); diff --git a/src/rars/riscv/syscalls/SyscallReadInt.java b/src/rars/riscv/syscalls/SyscallReadInt.java index 994d097b..d70d834c 100644 --- a/src/rars/riscv/syscalls/SyscallReadInt.java +++ b/src/rars/riscv/syscalls/SyscallReadInt.java @@ -5,34 +5,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallReadInt extends AbstractSyscall { public SyscallReadInt() { super("ReadInt", "Reads an int from input console", "N/A", "a0 = the int"); diff --git a/src/rars/riscv/syscalls/SyscallReadString.java b/src/rars/riscv/syscalls/SyscallReadString.java index 884aa5ad..f8d5e52e 100644 --- a/src/rars/riscv/syscalls/SyscallReadString.java +++ b/src/rars/riscv/syscalls/SyscallReadString.java @@ -8,35 +8,6 @@ import java.nio.charset.StandardCharsets; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - /** * Service to read console input string into buffer starting at address in a0 for a1-1 bytes. *

    diff --git a/src/rars/riscv/syscalls/SyscallSbrk.java b/src/rars/riscv/syscalls/SyscallSbrk.java index 117274f0..63b484ee 100644 --- a/src/rars/riscv/syscalls/SyscallSbrk.java +++ b/src/rars/riscv/syscalls/SyscallSbrk.java @@ -6,34 +6,6 @@ import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallSbrk extends AbstractSyscall { public SyscallSbrk() { super("Sbrk", "Allocate heap memory", "a0 = amount of memory in bytes", "a0 = address to the allocated block"); diff --git a/src/rars/riscv/syscalls/SyscallSleep.java b/src/rars/riscv/syscalls/SyscallSleep.java index 05254aa3..afa35442 100644 --- a/src/rars/riscv/syscalls/SyscallSleep.java +++ b/src/rars/riscv/syscalls/SyscallSleep.java @@ -4,34 +4,6 @@ import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallSleep extends AbstractSyscall { public SyscallSleep() { super("Sleep", "Set the current thread to sleep for a time (not precise)", "a0 = time to sleep in milliseconds", "N/A"); diff --git a/src/rars/riscv/syscalls/SyscallTime.java b/src/rars/riscv/syscalls/SyscallTime.java index 02ed400e..1f930dab 100644 --- a/src/rars/riscv/syscalls/SyscallTime.java +++ b/src/rars/riscv/syscalls/SyscallTime.java @@ -5,34 +5,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.Binary; -/* -Copyright (c) 2003-2007, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class SyscallTime extends AbstractSyscall { public SyscallTime() { super("Time", "Get the current time (milliseconds since 1 January 1970)", "N/A", "a0 = low order 32 bits
    a1=high order 32 bits"); diff --git a/src/rars/riscv/syscalls/SyscallWrite.java b/src/rars/riscv/syscalls/SyscallWrite.java index 29fc528f..6af8783c 100644 --- a/src/rars/riscv/syscalls/SyscallWrite.java +++ b/src/rars/riscv/syscalls/SyscallWrite.java @@ -8,35 +8,6 @@ import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - /** * Service to write to file descriptor given in a0. a1 specifies buffer * and a2 specifies length. Number of characters written is returned in a0. diff --git a/src/rars/riscv/syscalls/ToneGenerator.java b/src/rars/riscv/syscalls/ToneGenerator.java index acd1cea7..3ab59872 100644 --- a/src/rars/riscv/syscalls/ToneGenerator.java +++ b/src/rars/riscv/syscalls/ToneGenerator.java @@ -7,35 +7,6 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -/* -Copyright (c) 2003-2007, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // From a1563230d17c002af32f2657374bfc761ffc0813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 20:15:56 +0200 Subject: [PATCH 186/199] clean more folders inside of rars --- src/rars/simulator/BackStepper.java | 28 ------------------ src/rars/simulator/ProgramArgumentList.java | 28 ------------------ src/rars/simulator/Simulator.java | 28 ------------------ src/rars/simulator/SimulatorNotice.java | 28 ------------------ .../tools/AbstractToolAndApplication.java | 28 ------------------ src/rars/tools/BHTEntry.java | 27 ----------------- src/rars/tools/BHTSimGUI.java | 27 ----------------- src/rars/tools/BHTSimulator.java | 27 ----------------- src/rars/tools/BHTableModel.java | 27 ----------------- src/rars/tools/BitmapDisplay.java | 28 ------------------ src/rars/tools/CacheSimulator.java | 28 ------------------ src/rars/tools/FloatRepresentation.java | 28 ------------------ src/rars/tools/InstructionCounter.java | 26 ----------------- src/rars/tools/InstructionMemoryDump.java | 27 ----------------- src/rars/tools/InstructionStatistics.java | 27 ----------------- .../tools/KeyboardAndDisplaySimulator.java | 29 ------------------- .../tools/MemoryReferenceVisualization.java | 28 ------------------ src/rars/tools/TimerTool.java | 25 ---------------- src/rars/tools/Tool.java | 29 ------------------- src/rars/util/Binary.java | 28 ------------------ src/rars/util/EditorFont.java | 28 ------------------ src/rars/util/FilenameFinder.java | 28 ------------------ src/rars/util/MemoryDump.java | 27 ----------------- src/rars/util/PropertiesFile.java | 28 ------------------ src/rars/util/SystemIO.java | 28 ------------------ 25 files changed, 690 deletions(-) diff --git a/src/rars/simulator/BackStepper.java b/src/rars/simulator/BackStepper.java index 6396d593..2ff210ce 100644 --- a/src/rars/simulator/BackStepper.java +++ b/src/rars/simulator/BackStepper.java @@ -7,34 +7,6 @@ import rars.riscv.hardware.RegisterFile; import rars.riscv.Instruction; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Used to "step backward" through execution, undoing each instruction. * diff --git a/src/rars/simulator/ProgramArgumentList.java b/src/rars/simulator/ProgramArgumentList.java index 97e0ce5c..038efb6a 100644 --- a/src/rars/simulator/ProgramArgumentList.java +++ b/src/rars/simulator/ProgramArgumentList.java @@ -9,34 +9,6 @@ import java.util.ArrayList; import java.util.StringTokenizer; - /* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Models Program Arguments, one or more strings provided to the source * program at runtime. Equivalent to C's main(int argc, char **argv) or diff --git a/src/rars/simulator/Simulator.java b/src/rars/simulator/Simulator.java index 6af22544..f1afb9e8 100644 --- a/src/rars/simulator/Simulator.java +++ b/src/rars/simulator/Simulator.java @@ -13,34 +13,6 @@ import java.util.Arrays; import java.util.Observable; - /* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Used to simulate the execution of an assembled source program. * diff --git a/src/rars/simulator/SimulatorNotice.java b/src/rars/simulator/SimulatorNotice.java index 33b78fbf..4db465fe 100644 --- a/src/rars/simulator/SimulatorNotice.java +++ b/src/rars/simulator/SimulatorNotice.java @@ -1,33 +1,5 @@ package rars.simulator; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - import rars.SimulationException; import rars.venus.run.RunSpeedPanel; diff --git a/src/rars/tools/AbstractToolAndApplication.java b/src/rars/tools/AbstractToolAndApplication.java index 80016897..723ba45e 100644 --- a/src/rars/tools/AbstractToolAndApplication.java +++ b/src/rars/tools/AbstractToolAndApplication.java @@ -22,34 +22,6 @@ import java.util.Observable; import java.util.Observer; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * An abstract class that provides generic components to facilitate implementation of * a Tool and/or stand-alone Rars-based application. Provides default definitions diff --git a/src/rars/tools/BHTEntry.java b/src/rars/tools/BHTEntry.java index 81c8bd8a..a5ef990b 100644 --- a/src/rars/tools/BHTEntry.java +++ b/src/rars/tools/BHTEntry.java @@ -1,30 +1,3 @@ -/* -Copyright (c) 2009, Ingo Kofler, ITEC, Klagenfurt University, Austria - -Developed by Ingo Kofler (ingo.kofler@itec.uni-klu.ac.at) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - package rars.tools;//.bhtsim; /** diff --git a/src/rars/tools/BHTSimGUI.java b/src/rars/tools/BHTSimGUI.java index 44e5c2a9..854e7e2f 100644 --- a/src/rars/tools/BHTSimGUI.java +++ b/src/rars/tools/BHTSimGUI.java @@ -1,30 +1,3 @@ -/* -Copyright (c) 2009, Ingo Kofler, ITEC, Klagenfurt University, Austria - -Developed by Ingo Kofler (ingo.kofler@itec.uni-klu.ac.at) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - package rars.tools;//.bhtsim; import javax.swing.*; diff --git a/src/rars/tools/BHTSimulator.java b/src/rars/tools/BHTSimulator.java index d363daf8..1dc246c9 100644 --- a/src/rars/tools/BHTSimulator.java +++ b/src/rars/tools/BHTSimulator.java @@ -1,30 +1,3 @@ -/* -Copyright (c) 2009, Ingo Kofler, ITEC, Klagenfurt University, Austria - -Developed by Ingo Kofler (ingo.kofler@itec.uni-klu.ac.at) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - package rars.tools; import rars.ProgramStatement; diff --git a/src/rars/tools/BHTableModel.java b/src/rars/tools/BHTableModel.java index 1206a717..d7a09e66 100644 --- a/src/rars/tools/BHTableModel.java +++ b/src/rars/tools/BHTableModel.java @@ -1,30 +1,3 @@ -/* -Copyright (c) 2009, Ingo Kofler, ITEC, Klagenfurt University, Austria - -Developed by Ingo Kofler (ingo.kofler@itec.uni-klu.ac.at) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - package rars.tools;//.bhtsim; import javax.swing.table.AbstractTableModel; diff --git a/src/rars/tools/BitmapDisplay.java b/src/rars/tools/BitmapDisplay.java index d59ca0f8..a5d33b76 100644 --- a/src/rars/tools/BitmapDisplay.java +++ b/src/rars/tools/BitmapDisplay.java @@ -11,34 +11,6 @@ import java.awt.event.ActionListener; import java.util.Observable; -/* -Copyright (c) 2010-2011, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Bitmapp display simulator. It can be run either as a stand-alone Java application having * access to the rars package, or through RARS as an item in its Tools menu. It makes diff --git a/src/rars/tools/CacheSimulator.java b/src/rars/tools/CacheSimulator.java index 0fb36d91..72d685b5 100644 --- a/src/rars/tools/CacheSimulator.java +++ b/src/rars/tools/CacheSimulator.java @@ -16,34 +16,6 @@ import java.util.Observable; import java.util.Random; -/* -Copyright (c) 2003-2011, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * A data cache simulator. It can be run either as a stand-alone Java application having * access to the rars package, or through RARS as an item in its Tools menu. It makes diff --git a/src/rars/tools/FloatRepresentation.java b/src/rars/tools/FloatRepresentation.java index 32dbd8b5..f05da66f 100644 --- a/src/rars/tools/FloatRepresentation.java +++ b/src/rars/tools/FloatRepresentation.java @@ -15,34 +15,6 @@ import java.awt.event.KeyEvent; import java.util.Observable; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Tool to help students learn about IEEE 754 representation of 32 bit * floating point values. This representation is used by the "float" diff --git a/src/rars/tools/InstructionCounter.java b/src/rars/tools/InstructionCounter.java index bcf84694..9ad3f169 100644 --- a/src/rars/tools/InstructionCounter.java +++ b/src/rars/tools/InstructionCounter.java @@ -1,29 +1,3 @@ -/* -Copyright (c) 2008, Felipe Lessa - -Developed by Felipe Lessa (felipe.lessa@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ package rars.tools; import rars.ProgramStatement; diff --git a/src/rars/tools/InstructionMemoryDump.java b/src/rars/tools/InstructionMemoryDump.java index 0a680c42..79c4ac51 100644 --- a/src/rars/tools/InstructionMemoryDump.java +++ b/src/rars/tools/InstructionMemoryDump.java @@ -1,30 +1,3 @@ -/* - Copyright (c) 2019, John Owens - - Developed by John Owens (jowens@ece.ucdavis.edu) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject - to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - (MIT license, http://www.opensource.org/licenses/mit-license.html) -*/ - /** * Instructions for use * diff --git a/src/rars/tools/InstructionStatistics.java b/src/rars/tools/InstructionStatistics.java index ef96d88d..3e26093e 100644 --- a/src/rars/tools/InstructionStatistics.java +++ b/src/rars/tools/InstructionStatistics.java @@ -1,30 +1,3 @@ -/* -Copyright (c) 2009, Ingo Kofler, ITEC, Klagenfurt University, Austria - -Developed by Ingo Kofler (ingo.kofler@itec.uni-klu.ac.at) -Based on the Instruction Counter tool by Felipe Lessa (felipe.lessa@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ package rars.tools; import rars.ProgramStatement; diff --git a/src/rars/tools/KeyboardAndDisplaySimulator.java b/src/rars/tools/KeyboardAndDisplaySimulator.java index 4b8d9c25..a96d4a89 100644 --- a/src/rars/tools/KeyboardAndDisplaySimulator.java +++ b/src/rars/tools/KeyboardAndDisplaySimulator.java @@ -18,35 +18,6 @@ import java.util.Observable; import java.util.Random; - -/* -Copyright (c) 2003-2014, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - // TODO: make an example that uses this. I'm not sure it wasn't broken in the porting process. /** diff --git a/src/rars/tools/MemoryReferenceVisualization.java b/src/rars/tools/MemoryReferenceVisualization.java index 353d24a5..63991b1a 100644 --- a/src/rars/tools/MemoryReferenceVisualization.java +++ b/src/rars/tools/MemoryReferenceVisualization.java @@ -15,34 +15,6 @@ import java.util.Arrays; import java.util.Observable; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Memory reference visualization. It can be run either as a stand-alone Java application having * access to the rars package, or through RARS as an item in its Tools menu. It makes diff --git a/src/rars/tools/TimerTool.java b/src/rars/tools/TimerTool.java index 99213e2a..2b3d6faf 100644 --- a/src/rars/tools/TimerTool.java +++ b/src/rars/tools/TimerTool.java @@ -1,28 +1,3 @@ -/* -Developed by Zachary Selk at the University of Alberta (zrselk@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) -*/ - package rars.tools; import rars.Globals; diff --git a/src/rars/tools/Tool.java b/src/rars/tools/Tool.java index 9d64be37..5dbd420c 100644 --- a/src/rars/tools/Tool.java +++ b/src/rars/tools/Tool.java @@ -1,34 +1,5 @@ package rars.tools; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - /** * Interface for any tool that interacts with an executing program. * A qualifying tool must be a class in the Tools package that diff --git a/src/rars/util/Binary.java b/src/rars/util/Binary.java index 181613f0..e9df75fc 100644 --- a/src/rars/util/Binary.java +++ b/src/rars/util/Binary.java @@ -4,34 +4,6 @@ import java.util.Arrays; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Some utility methods for working with binary representations. * diff --git a/src/rars/util/EditorFont.java b/src/rars/util/EditorFont.java index be2bc26f..f00179e8 100644 --- a/src/rars/util/EditorFont.java +++ b/src/rars/util/EditorFont.java @@ -5,34 +5,6 @@ import java.awt.*; import java.util.Arrays; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Specialized Font class designed to be used by both the * settings menu methods and the Settings class. diff --git a/src/rars/util/FilenameFinder.java b/src/rars/util/FilenameFinder.java index 1504e7d8..baca891f 100644 --- a/src/rars/util/FilenameFinder.java +++ b/src/rars/util/FilenameFinder.java @@ -12,34 +12,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -/* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Utility class to perform necessary file-related search * operations. One is to find file names in JAR file, diff --git a/src/rars/util/MemoryDump.java b/src/rars/util/MemoryDump.java index ed5847b0..746d4671 100644 --- a/src/rars/util/MemoryDump.java +++ b/src/rars/util/MemoryDump.java @@ -2,33 +2,6 @@ import rars.riscv.hardware.Memory; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ // TODO: refactor this out of existance public class MemoryDump { private static final String[] segmentNames = {".text", ".data"}; diff --git a/src/rars/util/PropertiesFile.java b/src/rars/util/PropertiesFile.java index 71859f48..382e63a7 100644 --- a/src/rars/util/PropertiesFile.java +++ b/src/rars/util/PropertiesFile.java @@ -4,34 +4,6 @@ import java.io.InputStream; import java.util.Properties; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Provides means to work with ".properties" files which are used to store * various RARS settings. diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index a896b2d0..d753186f 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -9,34 +9,6 @@ import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; - /* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Provides standard i/o services needed to simulate the RISCV syscall * routines. These methods will detect whether the simulator is being From e5832827ed343c72ad05486611a59d0896d1af89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 20:20:45 +0200 Subject: [PATCH 187/199] cleanup firsts files inside VenusUI --- src/rars/venus/DataSegmentWindow.java | 28 ------------------- src/rars/venus/EditFindReplaceAction.java | 28 ------------------- src/rars/venus/EditPane.java | 28 ------------------- src/rars/venus/EditTabbedPane.java | 28 ------------------- src/rars/venus/Editor.java | 28 ------------------- src/rars/venus/ExecutePane.java | 28 ------------------- src/rars/venus/FileDumpMemoryAction.java | 28 ------------------- src/rars/venus/FileStatus.java | 28 ------------------- src/rars/venus/GuiAction.java | 28 ------------------- src/rars/venus/HelpAboutAction.java | 28 ------------------- src/rars/venus/HelpHelpAction.java | 28 ------------------- src/rars/venus/LabelsWindow.java | 28 ------------------- src/rars/venus/MainPane.java | 29 -------------------- src/rars/venus/MessagesPane.java | 28 ------------------- src/rars/venus/MonoRightCellRenderer.java | 28 ------------------- src/rars/venus/NumberDisplayBaseChooser.java | 28 ------------------- src/rars/venus/TextSegmentWindow.java | 28 ------------------- src/rars/venus/ToolAction.java | 28 ------------------- src/rars/venus/ToolLoader.java | 28 ------------------- src/rars/venus/VenusUI.java | 28 ------------------- 20 files changed, 561 deletions(-) diff --git a/src/rars/venus/DataSegmentWindow.java b/src/rars/venus/DataSegmentWindow.java index 39fdbeca..2a29f321 100644 --- a/src/rars/venus/DataSegmentWindow.java +++ b/src/rars/venus/DataSegmentWindow.java @@ -21,34 +21,6 @@ import java.util.Observable; import java.util.Observer; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents the Data Segment window, which is a type of JInternalFrame. * diff --git a/src/rars/venus/EditFindReplaceAction.java b/src/rars/venus/EditFindReplaceAction.java index 06066faf..c2f8ef1a 100644 --- a/src/rars/venus/EditFindReplaceAction.java +++ b/src/rars/venus/EditFindReplaceAction.java @@ -10,34 +10,6 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action for the Edit -> Find/Replace menu item */ diff --git a/src/rars/venus/EditPane.java b/src/rars/venus/EditPane.java index 85700d1e..f3e0328d 100644 --- a/src/rars/venus/EditPane.java +++ b/src/rars/venus/EditPane.java @@ -20,34 +20,6 @@ import java.util.Observable; import java.util.Observer; -/* -Copyright (c) 2003-2011, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Represents one file opened for editing. Maintains required internal structures. * Before Mars 4.0, there was only one editor pane, a tab, and only one file could diff --git a/src/rars/venus/EditTabbedPane.java b/src/rars/venus/EditTabbedPane.java index b641222d..ebe49575 100644 --- a/src/rars/venus/EditTabbedPane.java +++ b/src/rars/venus/EditTabbedPane.java @@ -16,34 +16,6 @@ import java.io.*; import java.util.ArrayList; - /* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Tabbed pane for the editor. Each of its tabs represents an open file. * diff --git a/src/rars/venus/Editor.java b/src/rars/venus/Editor.java index 4dbc8290..1b2ba08e 100644 --- a/src/rars/venus/Editor.java +++ b/src/rars/venus/Editor.java @@ -2,34 +2,6 @@ import java.io.File; import java.util.ArrayList; - - /* -Copyright (c) 2003-2007, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Manage the file being edited. diff --git a/src/rars/venus/ExecutePane.java b/src/rars/venus/ExecutePane.java index 3ededebc..0c32d6f5 100644 --- a/src/rars/venus/ExecutePane.java +++ b/src/rars/venus/ExecutePane.java @@ -9,34 +9,6 @@ import javax.swing.*; import java.awt.*; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Container for the execution-related windows. Currently displayed as a tabbed pane. * diff --git a/src/rars/venus/FileDumpMemoryAction.java b/src/rars/venus/FileDumpMemoryAction.java index 375fd57e..8585333d 100644 --- a/src/rars/venus/FileDumpMemoryAction.java +++ b/src/rars/venus/FileDumpMemoryAction.java @@ -20,34 +20,6 @@ import java.io.IOException; import java.util.ArrayList; - /* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action for the File -> Save For Dump Memory menu item */ diff --git a/src/rars/venus/FileStatus.java b/src/rars/venus/FileStatus.java index 9eeaa902..abe9a23e 100644 --- a/src/rars/venus/FileStatus.java +++ b/src/rars/venus/FileStatus.java @@ -4,34 +4,6 @@ import java.io.File; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Used to store and return information on the status of the current ASM file that * is being edited in the program. diff --git a/src/rars/venus/GuiAction.java b/src/rars/venus/GuiAction.java index f122be5d..3b3f1e0c 100644 --- a/src/rars/venus/GuiAction.java +++ b/src/rars/venus/GuiAction.java @@ -3,34 +3,6 @@ import javax.swing.*; import java.awt.event.ActionEvent; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * parent class for Action subclasses to be defined for every menu/toolbar * option. diff --git a/src/rars/venus/HelpAboutAction.java b/src/rars/venus/HelpAboutAction.java index 086db2c3..80ba52b0 100644 --- a/src/rars/venus/HelpAboutAction.java +++ b/src/rars/venus/HelpAboutAction.java @@ -5,34 +5,6 @@ import javax.swing.*; import java.awt.event.ActionEvent; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action for the Help -> About menu item */ diff --git a/src/rars/venus/HelpHelpAction.java b/src/rars/venus/HelpHelpAction.java index b0b41a3d..5d986eb4 100644 --- a/src/rars/venus/HelpHelpAction.java +++ b/src/rars/venus/HelpHelpAction.java @@ -23,34 +23,6 @@ import java.util.Collections; import java.util.Vector; - /* -Copyright (c) 2003-2008, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action for the Help -> Help menu item */ diff --git a/src/rars/venus/LabelsWindow.java b/src/rars/venus/LabelsWindow.java index 046a7e24..cc17bef6 100644 --- a/src/rars/venus/LabelsWindow.java +++ b/src/rars/venus/LabelsWindow.java @@ -20,34 +20,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; - - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Represents the Labels window, which is a type of JInternalFrame. Venus user diff --git a/src/rars/venus/MainPane.java b/src/rars/venus/MainPane.java index 0bd7f09a..47ee3e16 100644 --- a/src/rars/venus/MainPane.java +++ b/src/rars/venus/MainPane.java @@ -11,35 +11,6 @@ import javax.swing.plaf.basic.BasicTabbedPaneUI; import java.awt.*; - - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Creates the tabbed areas in the UI and also created the internal windows that * exist in them. diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index eeb83738..be7fa7a3 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -22,34 +22,6 @@ import java.awt.event.MouseEvent; import java.util.concurrent.ArrayBlockingQueue; -/* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Creates the message window at the bottom of the UI. * diff --git a/src/rars/venus/MonoRightCellRenderer.java b/src/rars/venus/MonoRightCellRenderer.java index 349c2a24..f2dad740 100644 --- a/src/rars/venus/MonoRightCellRenderer.java +++ b/src/rars/venus/MonoRightCellRenderer.java @@ -4,34 +4,6 @@ import javax.swing.table.DefaultTableCellRenderer; import java.awt.*; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /* * Use this to render Monospaced and right-aligned data in JTables. * I am using it to render integer addresses and values that are stored as diff --git a/src/rars/venus/NumberDisplayBaseChooser.java b/src/rars/venus/NumberDisplayBaseChooser.java index 321e2e2a..6042a099 100644 --- a/src/rars/venus/NumberDisplayBaseChooser.java +++ b/src/rars/venus/NumberDisplayBaseChooser.java @@ -10,34 +10,6 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Use to select base for displaying numbers. Initially the * choices are only 10 (decimal) and 16 (hex), so I'm using diff --git a/src/rars/venus/TextSegmentWindow.java b/src/rars/venus/TextSegmentWindow.java index cd23b700..22f8c215 100644 --- a/src/rars/venus/TextSegmentWindow.java +++ b/src/rars/venus/TextSegmentWindow.java @@ -15,34 +15,6 @@ import java.awt.event.MouseListener; import java.util.*; - /* -Copyright (c) 2003-2007, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Creates the Text Segment window in the Execute tab of the UI * diff --git a/src/rars/venus/ToolAction.java b/src/rars/venus/ToolAction.java index 809d4f6e..0325c996 100644 --- a/src/rars/venus/ToolAction.java +++ b/src/rars/venus/ToolAction.java @@ -5,34 +5,6 @@ import javax.swing.*; import java.awt.event.ActionEvent; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Connects a Tool class (class that implements Tool interface) to * the Mars menu system by supplying the response to that tool's menu item diff --git a/src/rars/venus/ToolLoader.java b/src/rars/venus/ToolLoader.java index 9196aa73..442376b3 100644 --- a/src/rars/venus/ToolLoader.java +++ b/src/rars/venus/ToolLoader.java @@ -9,34 +9,6 @@ import java.util.ArrayList; import java.util.HashSet; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * This class provides functionality to bring external Mars tools into the Mars * system by adding them to its Tools menu. This permits anyone with knowledge diff --git a/src/rars/venus/VenusUI.java b/src/rars/venus/VenusUI.java index 997fe117..4833e0f5 100644 --- a/src/rars/venus/VenusUI.java +++ b/src/rars/venus/VenusUI.java @@ -21,34 +21,6 @@ import java.net.URL; import java.util.ArrayList; -/* -Copyright (c) 2003-2013, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Top level container for Venus GUI. * From 4c536d9c387500fb73a656a82325f8d92baefbcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 20:27:51 +0200 Subject: [PATCH 188/199] cleanup of the remaining files --- src/rars/venus/editors/TextEditingArea.java | 28 ------------------ .../editors/generic/GenericTextArea.java | 28 ------------------ .../jeditsyntax/DefaultInputHandler.java | 9 ------ .../editors/jeditsyntax/InputHandler.java | 9 ------ .../editors/jeditsyntax/JEditTextArea.java | 9 ------ .../venus/editors/jeditsyntax/KeywordMap.java | 10 ------- .../editors/jeditsyntax/PopupHelpItem.java | 28 ------------------ .../editors/jeditsyntax/SyntaxDocument.java | 9 ------ .../editors/jeditsyntax/SyntaxStyle.java | 9 ------ .../editors/jeditsyntax/SyntaxUtilities.java | 9 ------ .../editors/jeditsyntax/TextAreaDefaults.java | 9 ------ .../editors/jeditsyntax/TextAreaPainter.java | 11 ------- .../editors/jeditsyntax/TextUtilities.java | 9 ------ .../tokenmarker/RISCVTokenMarker.java | 9 ------ .../jeditsyntax/tokenmarker/Token.java | 9 ------ .../jeditsyntax/tokenmarker/TokenMarker.java | 9 ------ .../venus/registers/RegisterBlockWindow.java | 28 ------------------ src/rars/venus/registers/RegistersPane.java | 28 ------------------ src/rars/venus/run/RunAssembleAction.java | 28 ------------------ src/rars/venus/run/RunBackstepAction.java | 28 ------------------ .../venus/run/RunClearBreakpointsAction.java | 28 ------------------ src/rars/venus/run/RunGoAction.java | 28 ------------------ src/rars/venus/run/RunResetAction.java | 28 ------------------ src/rars/venus/run/RunSpeedPanel.java | 28 ------------------ src/rars/venus/run/RunStepAction.java | 28 ------------------ src/rars/venus/settings/SettingsAction.java | 27 ----------------- .../venus/settings/SettingsEditorAction.java | 28 ------------------ .../SettingsExceptionHandlerAction.java | 28 ------------------ .../settings/SettingsHighlightingAction.java | 28 ------------------ .../SettingsMemoryConfigurationAction.java | 28 ------------------ .../venus/util/AbstractFontSettingDialog.java | 28 ------------------ src/rars/venus/util/PopupListener.java | 29 ------------------- 32 files changed, 652 deletions(-) diff --git a/src/rars/venus/editors/TextEditingArea.java b/src/rars/venus/editors/TextEditingArea.java index b1cc0afe..a45322d8 100644 --- a/src/rars/venus/editors/TextEditingArea.java +++ b/src/rars/venus/editors/TextEditingArea.java @@ -4,34 +4,6 @@ import javax.swing.undo.UndoManager; import java.awt.*; -/* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Specifies capabilities that any test editor used in MARS must have. */ diff --git a/src/rars/venus/editors/generic/GenericTextArea.java b/src/rars/venus/editors/generic/GenericTextArea.java index 761e6113..15111411 100644 --- a/src/rars/venus/editors/generic/GenericTextArea.java +++ b/src/rars/venus/editors/generic/GenericTextArea.java @@ -15,34 +15,6 @@ import javax.swing.undo.UndoManager; import java.awt.*; -/* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - public class GenericTextArea extends JTextArea implements TextEditingArea { diff --git a/src/rars/venus/editors/jeditsyntax/DefaultInputHandler.java b/src/rars/venus/editors/jeditsyntax/DefaultInputHandler.java index 18b24573..9dc9ee48 100644 --- a/src/rars/venus/editors/jeditsyntax/DefaultInputHandler.java +++ b/src/rars/venus/editors/jeditsyntax/DefaultInputHandler.java @@ -1,12 +1,3 @@ -/* - * DefaultInputHandler.java - Default implementation of an input handler - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import javax.swing.*; diff --git a/src/rars/venus/editors/jeditsyntax/InputHandler.java b/src/rars/venus/editors/jeditsyntax/InputHandler.java index dd27c509..472580eb 100644 --- a/src/rars/venus/editors/jeditsyntax/InputHandler.java +++ b/src/rars/venus/editors/jeditsyntax/InputHandler.java @@ -1,12 +1,3 @@ -/* - * InputHandler.java - Manages key bindings and executes actions - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import javax.swing.*; diff --git a/src/rars/venus/editors/jeditsyntax/JEditTextArea.java b/src/rars/venus/editors/jeditsyntax/JEditTextArea.java index 7c942a08..a9bab375 100644 --- a/src/rars/venus/editors/jeditsyntax/JEditTextArea.java +++ b/src/rars/venus/editors/jeditsyntax/JEditTextArea.java @@ -1,12 +1,3 @@ -/* - * JEditTextArea.java - jEdit's text component - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import rars.Globals; diff --git a/src/rars/venus/editors/jeditsyntax/KeywordMap.java b/src/rars/venus/editors/jeditsyntax/KeywordMap.java index 943f4492..d9d183f6 100644 --- a/src/rars/venus/editors/jeditsyntax/KeywordMap.java +++ b/src/rars/venus/editors/jeditsyntax/KeywordMap.java @@ -1,13 +1,3 @@ -/* - * KeywordMap.java - Fast keyword->id map - * Copyright (C) 1998, 1999 Slava Pestov - * Copyright (C) 1999 Mike Dillon - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import rars.venus.editors.jeditsyntax.tokenmarker.Token; diff --git a/src/rars/venus/editors/jeditsyntax/PopupHelpItem.java b/src/rars/venus/editors/jeditsyntax/PopupHelpItem.java index 2ecfe57b..3603439f 100644 --- a/src/rars/venus/editors/jeditsyntax/PopupHelpItem.java +++ b/src/rars/venus/editors/jeditsyntax/PopupHelpItem.java @@ -1,31 +1,3 @@ -/* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - package rars.venus.editors.jeditsyntax; import java.util.ArrayList; diff --git a/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java b/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java index 44e80930..5ca1d1a6 100644 --- a/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java +++ b/src/rars/venus/editors/jeditsyntax/SyntaxDocument.java @@ -1,12 +1,3 @@ -/* - * SyntaxDocument.java - Document that can be tokenized - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import rars.venus.editors.jeditsyntax.tokenmarker.TokenMarker; diff --git a/src/rars/venus/editors/jeditsyntax/SyntaxStyle.java b/src/rars/venus/editors/jeditsyntax/SyntaxStyle.java index ea27c999..17405f00 100644 --- a/src/rars/venus/editors/jeditsyntax/SyntaxStyle.java +++ b/src/rars/venus/editors/jeditsyntax/SyntaxStyle.java @@ -1,12 +1,3 @@ -/* - * SyntaxStyle.java - A simple text style class - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import java.awt.*; diff --git a/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java b/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java index 1f169ef2..db0a917c 100644 --- a/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java +++ b/src/rars/venus/editors/jeditsyntax/SyntaxUtilities.java @@ -1,12 +1,3 @@ -/* - * SyntaxUtilities.java - Utility functions used by syntax colorizing - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import rars.Globals; diff --git a/src/rars/venus/editors/jeditsyntax/TextAreaDefaults.java b/src/rars/venus/editors/jeditsyntax/TextAreaDefaults.java index e2f6c5bf..15661748 100644 --- a/src/rars/venus/editors/jeditsyntax/TextAreaDefaults.java +++ b/src/rars/venus/editors/jeditsyntax/TextAreaDefaults.java @@ -1,12 +1,3 @@ -/* - * TextAreaDefaults.java - Encapsulates default values for various settings - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import rars.Settings; diff --git a/src/rars/venus/editors/jeditsyntax/TextAreaPainter.java b/src/rars/venus/editors/jeditsyntax/TextAreaPainter.java index 046d010b..9fab121f 100644 --- a/src/rars/venus/editors/jeditsyntax/TextAreaPainter.java +++ b/src/rars/venus/editors/jeditsyntax/TextAreaPainter.java @@ -1,14 +1,3 @@ -/* - * TextAreaPainter.java - Paints the text area - * Copyright (C) 1999 Slava Pestov - * - * 08/05/2002 Cursor (caret) rendering fixed for JDK 1.4 (Anonymous) - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import rars.venus.editors.jeditsyntax.tokenmarker.Token; diff --git a/src/rars/venus/editors/jeditsyntax/TextUtilities.java b/src/rars/venus/editors/jeditsyntax/TextUtilities.java index 5997fedc..239e7b72 100644 --- a/src/rars/venus/editors/jeditsyntax/TextUtilities.java +++ b/src/rars/venus/editors/jeditsyntax/TextUtilities.java @@ -1,12 +1,3 @@ -/* - * TextUtilities.java - Utility functions used by the text area classes - * Copyright (C) 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax; import javax.swing.text.BadLocationException; diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java index b90c7dbc..fa3e0b7b 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/RISCVTokenMarker.java @@ -1,12 +1,3 @@ -/* - * MIPSTokenMarker.java - MIPS Assembly token marker - * Copyright (C) 1998, 1999 Slava Pestov, 2010 Pete Sanderson - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax.tokenmarker; import rars.*; diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java index 2b63cb65..dadc5a83 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/Token.java @@ -1,12 +1,3 @@ -/* - * Token.java - Generic token - * Copyright (C) 1998, 1999 Slava Pestov - * - * You may use and modify this package for any purpose. Redistribution is - * permitted, in both source and binary form, provided that this notice - * remains intact in all source distributions of this package. - */ - package rars.venus.editors.jeditsyntax.tokenmarker; /** diff --git a/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java b/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java index 30a0d062..0279a9ae 100644 --- a/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java +++ b/src/rars/venus/editors/jeditsyntax/tokenmarker/TokenMarker.java @@ -1,12 +1,3 @@ -/* -* TokenMarker.java - Generic token marker -* Copyright (C) 1998, 1999 Slava Pestov -* -* You may use and modify this package for any purpose. Redistribution is -* permitted, in both source and binary form, provided that this notice -* remains intact in all source distributions of this package. -*/ - package rars.venus.editors.jeditsyntax.tokenmarker; import rars.venus.editors.jeditsyntax.PopupHelpItem; diff --git a/src/rars/venus/registers/RegisterBlockWindow.java b/src/rars/venus/registers/RegisterBlockWindow.java index c3c1964c..b11ffa0c 100644 --- a/src/rars/venus/registers/RegisterBlockWindow.java +++ b/src/rars/venus/registers/RegisterBlockWindow.java @@ -23,34 +23,6 @@ import java.util.Observable; import java.util.Observer; -/* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Sets up a window to display registers in the UI. * diff --git a/src/rars/venus/registers/RegistersPane.java b/src/rars/venus/registers/RegistersPane.java index c9fdae39..7468dd77 100644 --- a/src/rars/venus/registers/RegistersPane.java +++ b/src/rars/venus/registers/RegistersPane.java @@ -5,34 +5,6 @@ import javax.swing.*; import java.awt.Color; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Contains tabbed areas in the UI to display register contents * diff --git a/src/rars/venus/run/RunAssembleAction.java b/src/rars/venus/run/RunAssembleAction.java index 7ba88fd1..866a1e23 100644 --- a/src/rars/venus/run/RunAssembleAction.java +++ b/src/rars/venus/run/RunAssembleAction.java @@ -11,34 +11,6 @@ import java.awt.event.ActionEvent; import java.io.File; import java.util.ArrayList; - - /* -Copyright (c) 2003-2010, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ /** * Action class for the Run -> Assemble menu item (and toolbar icon) diff --git a/src/rars/venus/run/RunBackstepAction.java b/src/rars/venus/run/RunBackstepAction.java index f89f369f..c9e668c6 100644 --- a/src/rars/venus/run/RunBackstepAction.java +++ b/src/rars/venus/run/RunBackstepAction.java @@ -13,34 +13,6 @@ import javax.swing.*; import java.awt.event.ActionEvent; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action for the Run -> Backstep menu item */ diff --git a/src/rars/venus/run/RunClearBreakpointsAction.java b/src/rars/venus/run/RunClearBreakpointsAction.java index 440dc1a5..39a1a40b 100644 --- a/src/rars/venus/run/RunClearBreakpointsAction.java +++ b/src/rars/venus/run/RunClearBreakpointsAction.java @@ -8,34 +8,6 @@ import javax.swing.event.TableModelListener; import java.awt.event.ActionEvent; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action class for the Run menu item to clear execution breakpoints that have been set. * It is a listener and is notified whenever a breakpoint is added or removed, thus will diff --git a/src/rars/venus/run/RunGoAction.java b/src/rars/venus/run/RunGoAction.java index 8f8a7894..fd479378 100644 --- a/src/rars/venus/run/RunGoAction.java +++ b/src/rars/venus/run/RunGoAction.java @@ -19,34 +19,6 @@ import java.util.Observable; import java.util.Observer; - /* -Copyright (c) 2003-2007, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action class for the Run -> Go menu item (and toolbar icon) */ diff --git a/src/rars/venus/run/RunResetAction.java b/src/rars/venus/run/RunResetAction.java index dcb8f5f3..98385b37 100644 --- a/src/rars/venus/run/RunResetAction.java +++ b/src/rars/venus/run/RunResetAction.java @@ -12,34 +12,6 @@ import javax.swing.*; import java.awt.event.ActionEvent; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action for the Run -> Reset menu item */ diff --git a/src/rars/venus/run/RunSpeedPanel.java b/src/rars/venus/run/RunSpeedPanel.java index a434daf3..e74e9166 100644 --- a/src/rars/venus/run/RunSpeedPanel.java +++ b/src/rars/venus/run/RunSpeedPanel.java @@ -7,34 +7,6 @@ import javax.swing.event.ChangeListener; import java.awt.*; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Class for the Run speed slider control. One is created and can be obtained using * getInstance(). diff --git a/src/rars/venus/run/RunStepAction.java b/src/rars/venus/run/RunStepAction.java index 932add5d..6b44270b 100644 --- a/src/rars/venus/run/RunStepAction.java +++ b/src/rars/venus/run/RunStepAction.java @@ -18,34 +18,6 @@ import java.util.Observable; import java.util.Observer; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action for the Run -> Step menu item */ diff --git a/src/rars/venus/settings/SettingsAction.java b/src/rars/venus/settings/SettingsAction.java index eb8c8043..0f71fb92 100644 --- a/src/rars/venus/settings/SettingsAction.java +++ b/src/rars/venus/settings/SettingsAction.java @@ -7,33 +7,6 @@ import javax.swing.*; import java.awt.event.ActionEvent; -/* -Copyright (c) 20017, Benjamin Landers - -Developed by Benjamin Landers - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Simple wrapper for boolean settings actions */ diff --git a/src/rars/venus/settings/SettingsEditorAction.java b/src/rars/venus/settings/SettingsEditorAction.java index e13a2972..dcadb1ba 100644 --- a/src/rars/venus/settings/SettingsEditorAction.java +++ b/src/rars/venus/settings/SettingsEditorAction.java @@ -19,34 +19,6 @@ import java.awt.*; import java.awt.event.*; - /* -Copyright (c) 2003-2011, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action class for the Settings menu item for text editor settings. */ diff --git a/src/rars/venus/settings/SettingsExceptionHandlerAction.java b/src/rars/venus/settings/SettingsExceptionHandlerAction.java index ad524b3d..9df0cff8 100644 --- a/src/rars/venus/settings/SettingsExceptionHandlerAction.java +++ b/src/rars/venus/settings/SettingsExceptionHandlerAction.java @@ -13,34 +13,6 @@ import java.awt.event.WindowEvent; import java.io.File; - /* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action class for the Settings menu item for optionally loading a MIPS exception handler. */ diff --git a/src/rars/venus/settings/SettingsHighlightingAction.java b/src/rars/venus/settings/SettingsHighlightingAction.java index 81b08ab6..bb3f83ec 100644 --- a/src/rars/venus/settings/SettingsHighlightingAction.java +++ b/src/rars/venus/settings/SettingsHighlightingAction.java @@ -15,34 +15,6 @@ import java.awt.*; import java.awt.event.*; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action class for the Settings menu item for text editor settings. */ diff --git a/src/rars/venus/settings/SettingsMemoryConfigurationAction.java b/src/rars/venus/settings/SettingsMemoryConfigurationAction.java index c2ebf72d..dc819d21 100644 --- a/src/rars/venus/settings/SettingsMemoryConfigurationAction.java +++ b/src/rars/venus/settings/SettingsMemoryConfigurationAction.java @@ -19,34 +19,6 @@ import java.util.Map; import java.util.TreeMap; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Action class for the Settings menu item for text editor settings. */ diff --git a/src/rars/venus/util/AbstractFontSettingDialog.java b/src/rars/venus/util/AbstractFontSettingDialog.java index fb97d2e9..fcf375d4 100644 --- a/src/rars/venus/util/AbstractFontSettingDialog.java +++ b/src/rars/venus/util/AbstractFontSettingDialog.java @@ -14,34 +14,6 @@ import java.awt.event.WindowEvent; import java.util.Vector; - /* -Copyright (c) 2003-2009, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - /** * Abstract class for a font selection dialog. */ diff --git a/src/rars/venus/util/PopupListener.java b/src/rars/venus/util/PopupListener.java index 3a94e993..64e7a4e9 100644 --- a/src/rars/venus/util/PopupListener.java +++ b/src/rars/venus/util/PopupListener.java @@ -4,35 +4,6 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -/* -Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar - -Developed by Pete Sanderson (psanderson@otterbein.edu) -and Kenneth Vollmar (kenvollmar@missouristate.edu) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(MIT license, http://www.opensource.org/licenses/mit-license.html) - */ - - // Experimental version 3 August 2006 Pete Sanderson // This will display the Settings popup menu upon right-click. // Menu selections themselves are handled separately. From 623aaed0acececae4c3470787d3b29eb530cf852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Sun, 18 Aug 2024 20:32:51 +0200 Subject: [PATCH 189/199] firsts rename Mips/Mars reference for Risc-V/Rars --- src/Config.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Config.properties b/src/Config.properties index 97acf820..02480115 100644 --- a/src/Config.properties +++ b/src/Config.properties @@ -1,11 +1,11 @@ -# maximum length of scrolled text in Mars Message and Run I/O tabs, in bytes. +# maximum length of scrolled text in Rars Message and Run I/O tabs, in bytes. MessageLimit = 1000000 # Maximum number of errors that can be recorded in one assemble operation. ErrorLimit = 200 # Maximum number of "backstep" operations that can be taken. An instruction # may produce more than one (e.g. trap instruction may set several registers) BackstepLimit = 2000 -# Acceptable file extensions for MIPS assembly files. Separate with spaces. +# Acceptable file extensions for RISC-V assembly files. Separate with spaces. Extensions = asm s # The set of ASCII strings to use for ASCII display or print # of data segment contents. This covers 8-bit ASCII codes 0-255. From 034b3a4ff31b7ca38cd902dd614e9e2ee74fc47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Hinojosa?= Date: Mon, 19 Aug 2024 22:29:01 +0200 Subject: [PATCH 190/199] revision --- License.txt | 8 ++++++++ src/rars/tools/ConversionTool.java | 7 ------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/License.txt b/License.txt index 121fd7b7..e1df356e 100644 --- a/License.txt +++ b/License.txt @@ -23,3 +23,11 @@ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. (MIT license, http://www.opensource.org/licenses/mit-license.html) + +=== + +Copyright (C) 1999 Slava Pestov + +You may use and modify this package for any purpose. Redistribution is +permitted, in both source and binary form, provided that this notice +remains intact in all source distributions of this package. \ No newline at end of file diff --git a/src/rars/tools/ConversionTool.java b/src/rars/tools/ConversionTool.java index 1692f642..68582a46 100644 --- a/src/rars/tools/ConversionTool.java +++ b/src/rars/tools/ConversionTool.java @@ -5,13 +5,6 @@ import javax.swing.event.DocumentListener; import java.awt.*; -/** - * Add conversion for decimal, hexadecimal, binary and ascii tool to the toolbar - * - * @author Julián Hinojosa - * @version August 2024 - **/ - public class ConversionTool { private boolean updating = false; From 167227b6b4ce46efc291ad371516c52182fb6c4b Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 20 Aug 2024 13:25:25 -0400 Subject: [PATCH 191/199] tests: force UTF-8 encoding in program outputs --- src/rars/api/Program.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/rars/api/Program.java b/src/rars/api/Program.java index cf3c9a1d..89f8d5f8 100644 --- a/src/rars/api/Program.java +++ b/src/rars/api/Program.java @@ -8,6 +8,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; /** @@ -203,14 +204,22 @@ public Simulator.Reason simulate() throws SimulationException { * @return converts the bytes sent to stdout into a string (resets to "" when setup is called) */ public String getSTDOUT(){ - return stdout.toString(); + try { + return stdout.toString("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } } /** * @return converts the bytes sent to stderr into a string (resets to "" when setup is called) */ public String getSTDERR(){ - return stderr.toString(); + try { + return stderr.toString("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } } /** From c8f74d9d8da003f021f16e1cf883adcb62ae79bc Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 20 Aug 2024 13:25:45 -0400 Subject: [PATCH 192/199] tests: force UTF-8 encoding in program input --- test/RarsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/RarsTest.java b/test/RarsTest.java index 52d8a58b..888b9a05 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -101,7 +101,7 @@ public static String run(String path, Program p){ // This is just a temporary solution that should work for the tests I want to write p.getOptions().selfModifyingCode = false; try { - BufferedReader br = new BufferedReader(new FileReader(path)); + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8")); String line = br.readLine(); while(line != null){ if (line.startsWith("#error on lines:")) { From 36105f649a5745a9f06e7a921f17250018e98a4d Mon Sep 17 00:00:00 2001 From: Hugo Leblanc Date: Thu, 22 Aug 2024 10:51:14 -0400 Subject: [PATCH 193/199] Rename RISC-V 32 test folder --- test/RarsTest.java | 2 +- test/{riscv-tests => riscv-tests-32}/add.s | 0 test/{riscv-tests => riscv-tests-32}/addi.s | 0 test/{riscv-tests => riscv-tests-32}/and.s | 0 test/{riscv-tests => riscv-tests-32}/andi.s | 0 test/{riscv-tests => riscv-tests-32}/args.s | 0 test/{riscv-tests => riscv-tests-32}/div.s | 0 test/{riscv-tests => riscv-tests-32}/divu.s | 0 test/{riscv-tests => riscv-tests-32}/fadd.s | 0 test/{riscv-tests => riscv-tests-32}/faddd.s | 0 test/{riscv-tests => riscv-tests-32}/fclass.s | 0 test/{riscv-tests => riscv-tests-32}/fclassd.s | 0 test/{riscv-tests => riscv-tests-32}/fcmp.s | 0 test/{riscv-tests => riscv-tests-32}/fcmpd.s | 0 test/{riscv-tests => riscv-tests-32}/fcvt.s | 0 test/{riscv-tests => riscv-tests-32}/fcvt_w.s | 0 test/{riscv-tests => riscv-tests-32}/fcvt_wd.s | 0 test/{riscv-tests => riscv-tests-32}/fcvtd.s | 0 test/{riscv-tests => riscv-tests-32}/fdiv.s | 0 test/{riscv-tests => riscv-tests-32}/fdivd.s | 0 test/{riscv-tests => riscv-tests-32}/fmadd.s | 0 test/{riscv-tests => riscv-tests-32}/fmaddd.s | 0 test/{riscv-tests => riscv-tests-32}/fmin.s | 0 test/{riscv-tests => riscv-tests-32}/fmind.s | 0 test/{riscv-tests => riscv-tests-32}/ldst.s | 0 test/{riscv-tests => riscv-tests-32}/ldstd.s | 0 test/{riscv-tests => riscv-tests-32}/lui.s | 0 test/{riscv-tests => riscv-tests-32}/move.s | 0 test/{riscv-tests => riscv-tests-32}/mul.s | 0 test/{riscv-tests => riscv-tests-32}/mulh.s | 0 test/{riscv-tests => riscv-tests-32}/mulhsu.s | 0 test/{riscv-tests => riscv-tests-32}/mulhu.s | 0 test/{riscv-tests => riscv-tests-32}/or.s | 0 test/{riscv-tests => riscv-tests-32}/ori.s | 0 test/{riscv-tests => riscv-tests-32}/recoding.s | 0 test/{riscv-tests => riscv-tests-32}/recodingd.s | 0 test/{riscv-tests => riscv-tests-32}/rem.s | 0 test/{riscv-tests => riscv-tests-32}/remu.s | 0 test/{riscv-tests => riscv-tests-32}/simple.s | 0 test/{riscv-tests => riscv-tests-32}/sll.s | 0 test/{riscv-tests => riscv-tests-32}/slli.s | 0 test/{riscv-tests => riscv-tests-32}/slt.s | 0 test/{riscv-tests => riscv-tests-32}/slti.s | 0 test/{riscv-tests => riscv-tests-32}/sltiu.s | 0 test/{riscv-tests => riscv-tests-32}/sltu.s | 0 test/{riscv-tests => riscv-tests-32}/sra.s | 0 test/{riscv-tests => riscv-tests-32}/srai.s | 0 test/{riscv-tests => riscv-tests-32}/srl.s | 0 test/{riscv-tests => riscv-tests-32}/srli.s | 0 test/{riscv-tests => riscv-tests-32}/sub.s | 0 test/{riscv-tests => riscv-tests-32}/sysprintint.s | 0 test/{riscv-tests => riscv-tests-32}/xor.s | 0 test/{riscv-tests => riscv-tests-32}/xori.s | 0 test/riscv-tests/readme.txt | 1 - 54 files changed, 1 insertion(+), 2 deletions(-) rename test/{riscv-tests => riscv-tests-32}/add.s (100%) rename test/{riscv-tests => riscv-tests-32}/addi.s (100%) rename test/{riscv-tests => riscv-tests-32}/and.s (100%) rename test/{riscv-tests => riscv-tests-32}/andi.s (100%) rename test/{riscv-tests => riscv-tests-32}/args.s (100%) rename test/{riscv-tests => riscv-tests-32}/div.s (100%) rename test/{riscv-tests => riscv-tests-32}/divu.s (100%) rename test/{riscv-tests => riscv-tests-32}/fadd.s (100%) rename test/{riscv-tests => riscv-tests-32}/faddd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fclass.s (100%) rename test/{riscv-tests => riscv-tests-32}/fclassd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fcmp.s (100%) rename test/{riscv-tests => riscv-tests-32}/fcmpd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fcvt.s (100%) rename test/{riscv-tests => riscv-tests-32}/fcvt_w.s (100%) rename test/{riscv-tests => riscv-tests-32}/fcvt_wd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fcvtd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fdiv.s (100%) rename test/{riscv-tests => riscv-tests-32}/fdivd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fmadd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fmaddd.s (100%) rename test/{riscv-tests => riscv-tests-32}/fmin.s (100%) rename test/{riscv-tests => riscv-tests-32}/fmind.s (100%) rename test/{riscv-tests => riscv-tests-32}/ldst.s (100%) rename test/{riscv-tests => riscv-tests-32}/ldstd.s (100%) rename test/{riscv-tests => riscv-tests-32}/lui.s (100%) rename test/{riscv-tests => riscv-tests-32}/move.s (100%) rename test/{riscv-tests => riscv-tests-32}/mul.s (100%) rename test/{riscv-tests => riscv-tests-32}/mulh.s (100%) rename test/{riscv-tests => riscv-tests-32}/mulhsu.s (100%) rename test/{riscv-tests => riscv-tests-32}/mulhu.s (100%) rename test/{riscv-tests => riscv-tests-32}/or.s (100%) rename test/{riscv-tests => riscv-tests-32}/ori.s (100%) rename test/{riscv-tests => riscv-tests-32}/recoding.s (100%) rename test/{riscv-tests => riscv-tests-32}/recodingd.s (100%) rename test/{riscv-tests => riscv-tests-32}/rem.s (100%) rename test/{riscv-tests => riscv-tests-32}/remu.s (100%) rename test/{riscv-tests => riscv-tests-32}/simple.s (100%) rename test/{riscv-tests => riscv-tests-32}/sll.s (100%) rename test/{riscv-tests => riscv-tests-32}/slli.s (100%) rename test/{riscv-tests => riscv-tests-32}/slt.s (100%) rename test/{riscv-tests => riscv-tests-32}/slti.s (100%) rename test/{riscv-tests => riscv-tests-32}/sltiu.s (100%) rename test/{riscv-tests => riscv-tests-32}/sltu.s (100%) rename test/{riscv-tests => riscv-tests-32}/sra.s (100%) rename test/{riscv-tests => riscv-tests-32}/srai.s (100%) rename test/{riscv-tests => riscv-tests-32}/srl.s (100%) rename test/{riscv-tests => riscv-tests-32}/srli.s (100%) rename test/{riscv-tests => riscv-tests-32}/sub.s (100%) rename test/{riscv-tests => riscv-tests-32}/sysprintint.s (100%) rename test/{riscv-tests => riscv-tests-32}/xor.s (100%) rename test/{riscv-tests => riscv-tests-32}/xori.s (100%) delete mode 100644 test/riscv-tests/readme.txt diff --git a/test/RarsTest.java b/test/RarsTest.java index 888b9a05..db0e3cce 100644 --- a/test/RarsTest.java +++ b/test/RarsTest.java @@ -56,7 +56,7 @@ public void checkPrograms() { // 32-bit tests Program p = setupProgram(false); runDirectory("./test", p); - runDirectory("./test/riscv-tests", p); + runDirectory("./test/riscv-tests-32", p); // 64-bit tests p = setupProgram(true); diff --git a/test/riscv-tests/add.s b/test/riscv-tests-32/add.s similarity index 100% rename from test/riscv-tests/add.s rename to test/riscv-tests-32/add.s diff --git a/test/riscv-tests/addi.s b/test/riscv-tests-32/addi.s similarity index 100% rename from test/riscv-tests/addi.s rename to test/riscv-tests-32/addi.s diff --git a/test/riscv-tests/and.s b/test/riscv-tests-32/and.s similarity index 100% rename from test/riscv-tests/and.s rename to test/riscv-tests-32/and.s diff --git a/test/riscv-tests/andi.s b/test/riscv-tests-32/andi.s similarity index 100% rename from test/riscv-tests/andi.s rename to test/riscv-tests-32/andi.s diff --git a/test/riscv-tests/args.s b/test/riscv-tests-32/args.s similarity index 100% rename from test/riscv-tests/args.s rename to test/riscv-tests-32/args.s diff --git a/test/riscv-tests/div.s b/test/riscv-tests-32/div.s similarity index 100% rename from test/riscv-tests/div.s rename to test/riscv-tests-32/div.s diff --git a/test/riscv-tests/divu.s b/test/riscv-tests-32/divu.s similarity index 100% rename from test/riscv-tests/divu.s rename to test/riscv-tests-32/divu.s diff --git a/test/riscv-tests/fadd.s b/test/riscv-tests-32/fadd.s similarity index 100% rename from test/riscv-tests/fadd.s rename to test/riscv-tests-32/fadd.s diff --git a/test/riscv-tests/faddd.s b/test/riscv-tests-32/faddd.s similarity index 100% rename from test/riscv-tests/faddd.s rename to test/riscv-tests-32/faddd.s diff --git a/test/riscv-tests/fclass.s b/test/riscv-tests-32/fclass.s similarity index 100% rename from test/riscv-tests/fclass.s rename to test/riscv-tests-32/fclass.s diff --git a/test/riscv-tests/fclassd.s b/test/riscv-tests-32/fclassd.s similarity index 100% rename from test/riscv-tests/fclassd.s rename to test/riscv-tests-32/fclassd.s diff --git a/test/riscv-tests/fcmp.s b/test/riscv-tests-32/fcmp.s similarity index 100% rename from test/riscv-tests/fcmp.s rename to test/riscv-tests-32/fcmp.s diff --git a/test/riscv-tests/fcmpd.s b/test/riscv-tests-32/fcmpd.s similarity index 100% rename from test/riscv-tests/fcmpd.s rename to test/riscv-tests-32/fcmpd.s diff --git a/test/riscv-tests/fcvt.s b/test/riscv-tests-32/fcvt.s similarity index 100% rename from test/riscv-tests/fcvt.s rename to test/riscv-tests-32/fcvt.s diff --git a/test/riscv-tests/fcvt_w.s b/test/riscv-tests-32/fcvt_w.s similarity index 100% rename from test/riscv-tests/fcvt_w.s rename to test/riscv-tests-32/fcvt_w.s diff --git a/test/riscv-tests/fcvt_wd.s b/test/riscv-tests-32/fcvt_wd.s similarity index 100% rename from test/riscv-tests/fcvt_wd.s rename to test/riscv-tests-32/fcvt_wd.s diff --git a/test/riscv-tests/fcvtd.s b/test/riscv-tests-32/fcvtd.s similarity index 100% rename from test/riscv-tests/fcvtd.s rename to test/riscv-tests-32/fcvtd.s diff --git a/test/riscv-tests/fdiv.s b/test/riscv-tests-32/fdiv.s similarity index 100% rename from test/riscv-tests/fdiv.s rename to test/riscv-tests-32/fdiv.s diff --git a/test/riscv-tests/fdivd.s b/test/riscv-tests-32/fdivd.s similarity index 100% rename from test/riscv-tests/fdivd.s rename to test/riscv-tests-32/fdivd.s diff --git a/test/riscv-tests/fmadd.s b/test/riscv-tests-32/fmadd.s similarity index 100% rename from test/riscv-tests/fmadd.s rename to test/riscv-tests-32/fmadd.s diff --git a/test/riscv-tests/fmaddd.s b/test/riscv-tests-32/fmaddd.s similarity index 100% rename from test/riscv-tests/fmaddd.s rename to test/riscv-tests-32/fmaddd.s diff --git a/test/riscv-tests/fmin.s b/test/riscv-tests-32/fmin.s similarity index 100% rename from test/riscv-tests/fmin.s rename to test/riscv-tests-32/fmin.s diff --git a/test/riscv-tests/fmind.s b/test/riscv-tests-32/fmind.s similarity index 100% rename from test/riscv-tests/fmind.s rename to test/riscv-tests-32/fmind.s diff --git a/test/riscv-tests/ldst.s b/test/riscv-tests-32/ldst.s similarity index 100% rename from test/riscv-tests/ldst.s rename to test/riscv-tests-32/ldst.s diff --git a/test/riscv-tests/ldstd.s b/test/riscv-tests-32/ldstd.s similarity index 100% rename from test/riscv-tests/ldstd.s rename to test/riscv-tests-32/ldstd.s diff --git a/test/riscv-tests/lui.s b/test/riscv-tests-32/lui.s similarity index 100% rename from test/riscv-tests/lui.s rename to test/riscv-tests-32/lui.s diff --git a/test/riscv-tests/move.s b/test/riscv-tests-32/move.s similarity index 100% rename from test/riscv-tests/move.s rename to test/riscv-tests-32/move.s diff --git a/test/riscv-tests/mul.s b/test/riscv-tests-32/mul.s similarity index 100% rename from test/riscv-tests/mul.s rename to test/riscv-tests-32/mul.s diff --git a/test/riscv-tests/mulh.s b/test/riscv-tests-32/mulh.s similarity index 100% rename from test/riscv-tests/mulh.s rename to test/riscv-tests-32/mulh.s diff --git a/test/riscv-tests/mulhsu.s b/test/riscv-tests-32/mulhsu.s similarity index 100% rename from test/riscv-tests/mulhsu.s rename to test/riscv-tests-32/mulhsu.s diff --git a/test/riscv-tests/mulhu.s b/test/riscv-tests-32/mulhu.s similarity index 100% rename from test/riscv-tests/mulhu.s rename to test/riscv-tests-32/mulhu.s diff --git a/test/riscv-tests/or.s b/test/riscv-tests-32/or.s similarity index 100% rename from test/riscv-tests/or.s rename to test/riscv-tests-32/or.s diff --git a/test/riscv-tests/ori.s b/test/riscv-tests-32/ori.s similarity index 100% rename from test/riscv-tests/ori.s rename to test/riscv-tests-32/ori.s diff --git a/test/riscv-tests/recoding.s b/test/riscv-tests-32/recoding.s similarity index 100% rename from test/riscv-tests/recoding.s rename to test/riscv-tests-32/recoding.s diff --git a/test/riscv-tests/recodingd.s b/test/riscv-tests-32/recodingd.s similarity index 100% rename from test/riscv-tests/recodingd.s rename to test/riscv-tests-32/recodingd.s diff --git a/test/riscv-tests/rem.s b/test/riscv-tests-32/rem.s similarity index 100% rename from test/riscv-tests/rem.s rename to test/riscv-tests-32/rem.s diff --git a/test/riscv-tests/remu.s b/test/riscv-tests-32/remu.s similarity index 100% rename from test/riscv-tests/remu.s rename to test/riscv-tests-32/remu.s diff --git a/test/riscv-tests/simple.s b/test/riscv-tests-32/simple.s similarity index 100% rename from test/riscv-tests/simple.s rename to test/riscv-tests-32/simple.s diff --git a/test/riscv-tests/sll.s b/test/riscv-tests-32/sll.s similarity index 100% rename from test/riscv-tests/sll.s rename to test/riscv-tests-32/sll.s diff --git a/test/riscv-tests/slli.s b/test/riscv-tests-32/slli.s similarity index 100% rename from test/riscv-tests/slli.s rename to test/riscv-tests-32/slli.s diff --git a/test/riscv-tests/slt.s b/test/riscv-tests-32/slt.s similarity index 100% rename from test/riscv-tests/slt.s rename to test/riscv-tests-32/slt.s diff --git a/test/riscv-tests/slti.s b/test/riscv-tests-32/slti.s similarity index 100% rename from test/riscv-tests/slti.s rename to test/riscv-tests-32/slti.s diff --git a/test/riscv-tests/sltiu.s b/test/riscv-tests-32/sltiu.s similarity index 100% rename from test/riscv-tests/sltiu.s rename to test/riscv-tests-32/sltiu.s diff --git a/test/riscv-tests/sltu.s b/test/riscv-tests-32/sltu.s similarity index 100% rename from test/riscv-tests/sltu.s rename to test/riscv-tests-32/sltu.s diff --git a/test/riscv-tests/sra.s b/test/riscv-tests-32/sra.s similarity index 100% rename from test/riscv-tests/sra.s rename to test/riscv-tests-32/sra.s diff --git a/test/riscv-tests/srai.s b/test/riscv-tests-32/srai.s similarity index 100% rename from test/riscv-tests/srai.s rename to test/riscv-tests-32/srai.s diff --git a/test/riscv-tests/srl.s b/test/riscv-tests-32/srl.s similarity index 100% rename from test/riscv-tests/srl.s rename to test/riscv-tests-32/srl.s diff --git a/test/riscv-tests/srli.s b/test/riscv-tests-32/srli.s similarity index 100% rename from test/riscv-tests/srli.s rename to test/riscv-tests-32/srli.s diff --git a/test/riscv-tests/sub.s b/test/riscv-tests-32/sub.s similarity index 100% rename from test/riscv-tests/sub.s rename to test/riscv-tests-32/sub.s diff --git a/test/riscv-tests/sysprintint.s b/test/riscv-tests-32/sysprintint.s similarity index 100% rename from test/riscv-tests/sysprintint.s rename to test/riscv-tests-32/sysprintint.s diff --git a/test/riscv-tests/xor.s b/test/riscv-tests-32/xor.s similarity index 100% rename from test/riscv-tests/xor.s rename to test/riscv-tests-32/xor.s diff --git a/test/riscv-tests/xori.s b/test/riscv-tests-32/xori.s similarity index 100% rename from test/riscv-tests/xori.s rename to test/riscv-tests-32/xori.s diff --git a/test/riscv-tests/readme.txt b/test/riscv-tests/readme.txt deleted file mode 100644 index e919b6d1..00000000 --- a/test/riscv-tests/readme.txt +++ /dev/null @@ -1 +0,0 @@ -The tests in this directory were generated and modified from the riscv-tests repository. They cover basic conformance of instructions to the specification. From b3ae4624166eb1348d1d07dcf415ea0aa09d1d40 Mon Sep 17 00:00:00 2001 From: Hugo Leblanc Date: Thu, 22 Aug 2024 11:01:44 -0400 Subject: [PATCH 194/199] Update and consolidate LICENSE file --- License.txt => LICENSE | 27 +++++++++++++++++++++++++++ src/rars/venus/HelpHelpAction.java | 2 +- test/riscv-tests/LICENSE | 24 ------------------------ 3 files changed, 28 insertions(+), 25 deletions(-) rename License.txt => LICENSE (51%) delete mode 100644 test/riscv-tests/LICENSE diff --git a/License.txt b/LICENSE similarity index 51% rename from License.txt rename to LICENSE index e1df356e..c0db1310 100644 --- a/License.txt +++ b/LICENSE @@ -26,6 +26,33 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. === +Copyright (c) 2012-2015, The Regents of the University of California (Regents). +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the Regents nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, +SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING +OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED +HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE +MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +=== + Copyright (C) 1999 Slava Pestov You may use and modify this package for any purpose. Redistribution is diff --git a/src/rars/venus/HelpHelpAction.java b/src/rars/venus/HelpHelpAction.java index 5d986eb4..7eeeeace 100644 --- a/src/rars/venus/HelpHelpAction.java +++ b/src/rars/venus/HelpHelpAction.java @@ -125,7 +125,7 @@ private JPanel createCopyrightInfoPanel() { JScrollPane copyrightScrollPane; JEditorPane copyrightDisplay; try { - StringBuilder text = loadFiletoStringBuilder("/License.txt").append(""); + StringBuilder text = loadFiletoStringBuilder("/LICENSE").append(""); copyrightDisplay = new JEditorPane("text/html", "

    " + text.toString());
                 copyrightDisplay.setEditable(false);
                 copyrightDisplay.setCaretPosition(0); // assure top of document displayed
    diff --git a/test/riscv-tests/LICENSE b/test/riscv-tests/LICENSE
    deleted file mode 100644
    index 48fe522a..00000000
    --- a/test/riscv-tests/LICENSE
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -Copyright (c) 2012-2015, The Regents of the University of California (Regents).
    -All Rights Reserved.
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions are met:
    -1. Redistributions of source code must retain the above copyright
    -   notice, this list of conditions and the following disclaimer.
    -2. Redistributions in binary form must reproduce the above copyright
    -   notice, this list of conditions and the following disclaimer in the
    -   documentation and/or other materials provided with the distribution.
    -3. Neither the name of the Regents nor the
    -   names of its contributors may be used to endorse or promote products
    -   derived from this software without specific prior written permission.
    -
    -IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
    -SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
    -OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
    -BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    -
    -REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    -PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
    -HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
    -MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
    
    From b0cb5173ff3e764009883daeeecccc5c9ed6ba1b Mon Sep 17 00:00:00 2001
    From: Hugo Leblanc 
    Date: Fri, 6 Sep 2024 23:07:56 -0400
    Subject: [PATCH 195/199] Release 1.7
    
    ---
     build-jar.sh                       |  2 +-
     pom.xml                            |  2 +-
     src/help/Command.html              | 52 ++++++++++++++----------------
     src/help/Debugging.html            |  4 +--
     src/help/History.html              | 12 +++++--
     src/help/IDE.html                  |  4 +--
     src/help/Intro.html                |  4 +--
     src/help/Limits.html               |  5 ++-
     src/rars/venus/HelpHelpAction.java |  2 +-
     9 files changed, 43 insertions(+), 44 deletions(-)
    
    diff --git a/build-jar.sh b/build-jar.sh
    index 259c3375..db49243e 100755
    --- a/build-jar.sh
    +++ b/build-jar.sh
    @@ -11,7 +11,7 @@ if git submodule status | grep \( > /dev/null ; then
         fi
         cp -rf build/src/* build
         rm -r build/src
    -    cp README.md License.txt build
    +    cp README.md LICENSE build
         cd build
         jar cfm ../rars.jar ./META-INF/MANIFEST.MF *
         chmod +x ../rars.jar
    diff --git a/pom.xml b/pom.xml
    index 27dcaba6..0d627776 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -3,7 +3,7 @@
     	4.0.0
     	rars
     	rars
    -	1.6-git
    +	1.7-git
     	jar
     	
     		
    diff --git a/src/help/Command.html b/src/help/Command.html
    index 34e24693..7521844b 100644
    --- a/src/help/Command.html
    +++ b/src/help/Command.html
    @@ -1,11 +1,9 @@
     
    -RARS 1.6 help contents
    +<title>RARS help contents
     
     
     

    RARS - RISC-V Assembler and Runtime Simulator

    -

    Release 1.0

    -

    August 2017

    Using RARS from a command line.

    @@ -22,45 +20,45 @@

    Using RARS from a command line.

    for potentially correct documentation

    - - - - - + + + + + - + - - - - +and .data. Also supports an address range (see m-n below). Current supported dump formats are Binary, HexText, BinaryText, AsciiText. See examples below. + + + + - - - - - - - +for a 32KB address space with text segment at address 0. + + + + + + + + If 0, negative or not specified, there is no maximum. + NOTE: Depending on your command shell, you may need to escape the $, e.g. \$t3 + content to display at end of run. Even-numbered float register displays both float and double. Option may be repeated. $ not required. + m <= n, both must be on word boundary. Option may be repeated. +strings). The count is also at the top of the runtime stack ($sp), followed by the array.This option and its arguments must be the last items in the command!
    OptionDescriptionSince
    aassemble only, do not simulate1.0
    aenterminate RARS with integer exit code n if assembly error occurs4.1
    asciidisplay memory or register contents interpreted as ASCII codes. (alternatives are dec and hex)4.1
    bbrief - do not display register/memory address along with contents2.2
    OptionDescription
    aassemble only, do not simulate
    aenterminate RARS with integer exit code n if assembly error occurs
    asciidisplay memory or register contents interpreted as ASCII codes. (alternatives are dec and hex)
    bbrief - do not display register/memory address along with contents
    ddisplay RARS debugging statements (of interest mainly to RARS developer)
    decdisplay memory or register contents in decimal. (alternatives are ascii and hex)2.2
    decdisplay memory or register contents in decimal. (alternatives are ascii and hex)
    dumpdump memory contents to file. Option has 3 arguments, e.g. dump <segment> <format> <file>. Current supported segments are .text -and .data. Also supports an address range (see m-n below). Current supported dump formats are Binary, HexText, BinaryText, AsciiText. See examples below.3.4
    gforce GUI mode1.6
    hexdisplay memory or register contents in hexadecimal - this is the default. (alternatives are ascii and dec)2.2
    hdisplay this help. Use this option by itself and with no filename.1.0
    icdisplay instruction count; the number of basic instructions 'executed'4.3
    gforce GUI mode
    hexdisplay memory or register contents in hexadecimal - this is the default. (alternatives are ascii and dec)
    hdisplay this help. Use this option by itself and with no filename.
    icdisplay instruction count; the number of basic instructions 'executed'
    mcset memory configuration. Option has 1 argument, e.g. mc <config>. Argument <config> is case-sensitive and its possible values are Default for the default 32-bit address space, CompactDataAtZero for a 32KB address space with data segment at address 0, or CompactTextAtZero -for a 32KB address space with text segment at address 0.3.7
    nppseudo-instructions or extended instruction formats are not permitted.3.0
    pproject option - will assemble the specified file and all other assembly files (*.asm; *.s) in its directory.3.1
    senterminate RARS with exit code n if simulate (run) error occurs4.1
    smstart execution at statement having global label 'main' if defined3.8
    smcSelf Modifying Code - Program can write and execute in either text or data segment4.4
    versionshow copyright notice and version will not be displayed.
    weassembler warnings will be considered errors.3.5
    nppseudo-instructions or extended instruction formats are not permitted.
    pproject option - will assemble the specified file and all other assembly files (*.asm; *.s) in its directory.
    senterminate RARS with exit code n if simulate (run) error occurs
    smstart execution at statement having global label 'main' if defined
    smcSelf Modifying Code - Program can write and execute in either text or data segment
    versionshow copyright notice and version will not be displayed.
    weassembler warnings will be considered errors.
    nwhere n is an integer maximum count of execution steps to simulate. - If 0, negative or not specified, there is no maximum.1.0
    $regwhere reg is number or name (e.g. 5, t3, f10) of register whose content to display at end of run. Even-numbered float register displays both float and double. Option may be repeated. - NOTE: Depending on your command shell, you may need to escape the $, e.g. \$t32.2
    reg_namewhere reg_name is the name (e.g. t3, f10) of register whose - content to display at end of run. Even-numbered float register displays both float and double. Option may be repeated. $ not required.2.2
    m-nmemory address range from m to n whose contents to display at end of run. m and n may be decimal or hexadecimal (starts with 0x), - m <= n, both must be on word boundary. Option may be repeated.2.2
    paprogram arguments - all remaining space-separated items are argument values provided to the program via $a0 (argc - argument count) and $a1 (argv - address of array containing pointers to null-terminated argument -strings). The count is also at the top of the runtime stack ($sp), followed by the array.This option and its arguments must be the last items in the command!3.5

    Example: java -jar rars.jar h
    diff --git a/src/help/Debugging.html b/src/help/Debugging.html index 5e8831c6..ff73928c 100644 --- a/src/help/Debugging.html +++ b/src/help/Debugging.html @@ -1,11 +1,9 @@ -RARS 1.6 help contents +<title>RARS help contents

    RARS - RISC-V Assembler and Runtime Simulator

    -

    Release 1.0

    -

    August 2017

    Interactive Debugging Features

    diff --git a/src/help/History.html b/src/help/History.html index 3a3cac41..638905de 100644 --- a/src/help/History.html +++ b/src/help/History.html @@ -4,10 +4,18 @@

    RARS - RISC-V Assembler and Runtime Simulator

    -

    Release 1.6

    -

    February 2023

    +

    Release 1.7

    +

    Septembre 2024

    Release History

    + +

    + RARS 1.7 was released in Septembre 2024. + This release was for many bugfixes around 64-bit instructions. + Added darkmode. + The new repo can be found at rarsm/rars on Github. +

    +

    RARS 1.6 was released in February 2023. It added some minor features and bugfixes that accumulated diff --git a/src/help/IDE.html b/src/help/IDE.html index 2407f6bb..86997c56 100644 --- a/src/help/IDE.html +++ b/src/help/IDE.html @@ -1,10 +1,8 @@ -RARS 1.6 help contents +RARS help contents

    RARS - RISC-V Assembler and Runtime Simulator

    -

    Release 1.0

    -

    August 2017

    Using RARS through its Integrated Development Environment (IDE)

    The IDE is invoked when RARS is run with no command arguments, e.g. java -jar rars.jar. It may also be launched diff --git a/src/help/Intro.html b/src/help/Intro.html index fe6db650..558cd6bd 100644 --- a/src/help/Intro.html +++ b/src/help/Intro.html @@ -1,11 +1,9 @@ -RARS 1.6 help contents +<title>RARS 1.7 help contents

    RARS - RISC-V Assembler and Runtime Simulator

    -

    Release 1.0

    -

    August 2017

    Introduction

    diff --git a/src/help/Limits.html b/src/help/Limits.html index e7ffd356..533470df 100644 --- a/src/help/Limits.html +++ b/src/help/Limits.html @@ -1,11 +1,10 @@ -RARS 1.6 help contents +<title>RARS help contents

    RARS - RISC-V Assembler and Runtime Simulator

    -

    Release 1.0

    -

    August 2017

    +

    Operating Requirements

    diff --git a/src/rars/venus/HelpHelpAction.java b/src/rars/venus/HelpHelpAction.java index 7eeeeace..f414adbd 100644 --- a/src/rars/venus/HelpHelpAction.java +++ b/src/rars/venus/HelpHelpAction.java @@ -27,7 +27,7 @@ * Action for the Help -> Help menu item */ public class HelpHelpAction extends GuiAction { - private VenusUI mainUI; + private final VenusUI mainUI; public HelpHelpAction(String name, Icon icon, String descrip, Integer mnemonic, KeyStroke accel, VenusUI gui) { From af7bd3d910e5f63efa67dfc75c2fc587ffd0f447 Mon Sep 17 00:00:00 2001 From: Renaud Pacalet Date: Fri, 29 Nov 2024 15:48:35 +0100 Subject: [PATCH 196/199] fix minor bugs in the way FloatRepresentation tool displays subnormal numbers --- src/rars/tools/FloatRepresentation.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/rars/tools/FloatRepresentation.java b/src/rars/tools/FloatRepresentation.java index f05da66f..83910f6c 100644 --- a/src/rars/tools/FloatRepresentation.java +++ b/src/rars/tools/FloatRepresentation.java @@ -38,7 +38,7 @@ public class FloatRepresentation extends AbstractToolAndApplication { private static final int maxLengthBinaryFraction = 23; private static final int maxLengthBinaryTotal = maxLengthBinarySign + maxLengthBinaryExponent + maxLengthBinaryFraction; private static final int maxLengthDecimal = 20; - private static final String denormalizedLabel = " significand (denormalized - no 'hidden bit')"; + private static final String denormalizedLabel = " significand (subnormal - no 'hidden bit')"; private static final String normalizedLabel = " significand ('hidden bit' underlined) "; private static final Font instructionsFont = new Font("Arial", Font.PLAIN, 14); private static final Font hexDisplayFont = new Font("Courier", Font.PLAIN, 32); @@ -497,7 +497,7 @@ private FlavorsOfFloat buildOneFromInt(int intValue) { public String buildExpansionFromBinaryString(String binaryString) { int biasedExponent = Binary.binaryStringToInt( binaryString.substring(maxLengthBinarySign, maxLengthBinarySign + maxLengthBinaryExponent)); - String stringExponent = Integer.toString(biasedExponent - exponentBias); + String stringExponent = Integer.toString(biasedExponent == 0 ? -126 : biasedExponent - exponentBias); // stringExponent length will range from 1 to 4 (e.g. "0" to "-128") characters. // Right-pad with HTML spaces (" ") to total length 5 displayed characters. return "" + (Globals.getSettings().getBooleanSetting(Settings.Bool.DARK_MODE_ENABLED) ? expansionFontTagDark : expansionFontTagLight) @@ -789,6 +789,7 @@ public void paintComponent(Graphics g) { // class BinaryToDecimalFormulaGraphic extends JPanel { final String subtractLabelTrailer = " - 127"; + final String subnormalLabel = "-126"; final int arrowHeadOffset = 5; final int lowerY = 0; final int upperY = 50; @@ -851,7 +852,7 @@ private void drawSubtractLabel(Graphics g, String label) { // format the label for a given integer exponent value... private String buildSubtractLabel(int value) { - return Integer.toString(value) + subtractLabelTrailer; + return (value == 0) ? subnormalLabel : Integer.toString(value) + subtractLabelTrailer; } } @@ -941,4 +942,4 @@ public void paintComponent(Graphics g) { } } -} \ No newline at end of file +} From 4716fa48bfe2bb96dc986b368db70e30c6eec79f Mon Sep 17 00:00:00 2001 From: David Cruz Date: Fri, 29 Nov 2024 11:17:10 -0800 Subject: [PATCH 197/199] Fix 32 bit mode reading long in readInt syscall --- src/rars/riscv/syscalls/SyscallReadInt.java | 7 ++++++- src/rars/util/SystemIO.java | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallReadInt.java b/src/rars/riscv/syscalls/SyscallReadInt.java index d70d834c..da0717f9 100644 --- a/src/rars/riscv/syscalls/SyscallReadInt.java +++ b/src/rars/riscv/syscalls/SyscallReadInt.java @@ -1,6 +1,7 @@ package rars.riscv.syscalls; import rars.*; +import rars.riscv.InstructionSet; import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; @@ -12,7 +13,11 @@ public SyscallReadInt() { public void simulate(ProgramStatement statement) throws SimulationException { try { - RegisterFile.updateRegister("a0", SystemIO.readInteger(this.getNumber())); + if (InstructionSet.rv64) { + RegisterFile.updateRegister("a0", SystemIO.readLong(this.getNumber())); + } else { + RegisterFile.updateRegister("a0", SystemIO.readInteger(this.getNumber())); + } } catch (NumberFormatException e) { if (e.getMessage().equals("Cancel")) throw new CancelException(); diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index d753186f..593266dd 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -64,7 +64,14 @@ public class SystemIO { * @return int value corresponding to user input */ - public static long readInteger(int serviceNumber) throws CancelException { + public static int readInteger(int serviceNumber) throws CancelException { + String input = readStringInternal("0", "Enter an integer value (syscall " + serviceNumber + ")", -1); + // Client is responsible for catching NumberFormatException + if (input == null) throw new CancelException(); + return Integer.parseInt(input.trim()); + } + + public static long readLong(int serviceNumber) throws CancelException { String input = readStringInternal("0", "Enter an integer value (syscall " + serviceNumber + ")", -1); // Client is responsible for catching NumberFormatException if (input == null) throw new CancelException(); From cb376516b293beba81dab5bb71f12e7cdabf640c Mon Sep 17 00:00:00 2001 From: Renaud Pacalet Date: Thu, 5 Dec 2024 10:08:36 +0100 Subject: [PATCH 198/199] fix pseudo "call" instruction that uselessly modified register "t1" --- src/PseudoOps.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PseudoOps.txt b/src/PseudoOps.txt index 6a0c19a9..1892c07f 100644 --- a/src/PseudoOps.txt +++ b/src/PseudoOps.txt @@ -111,7 +111,7 @@ jr t0, -100 ;jalr x0, RG1, VL2 ;#Jump Register: Jump to address in t0 jalr t0, -100 ;jalr x1, RG1, VL2 ;#Jump And Link Register: Jump to address in t0 and set the return address to ra jalr t0,-100(t1);jalr RG1, RG4, VL2;#Jump And Link Register: Jump to address in t1 and set the return address to t0 ret ;jalr x0, x1, 0 ;#Return: return from a subroutine -call label ;auipc x6,PCH1 ;jalr x1, x6, PCL1;#CALL: call a far-away subroutine +call label ;auipc x1,PCH1 ;jalr x1, x1, PCL1;#CALL: call a far-away subroutine tail label ;auipc x6,PCH1 ;jalr x0, x6, PCL1;#TAIL call: tail call (call without saving return address)a far-away subroutine ######################### load/store pseudo-ops start here ########################## From 3f5db6be759b04b20610a3c15274bc5bf5154204 Mon Sep 17 00:00:00 2001 From: Marcel Achim Date: Fri, 20 Dec 2024 15:38:46 -0500 Subject: [PATCH 199/199] fix checkpoint for breakpoint hit on a handler's entry point --- src/rars/simulator/Simulator.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/rars/simulator/Simulator.java b/src/rars/simulator/Simulator.java index f1afb9e8..fce39cdd 100644 --- a/src/rars/simulator/Simulator.java +++ b/src/rars/simulator/Simulator.java @@ -365,6 +365,7 @@ public void run() { // lock variable, then full (albeit heavy-handed) protection of memory and // registers is assured. Not as critical for reading from those resources. Globals.memoryAndRegistersLock.lock(); + boolean checkHandlerBkpt = false; try { // Handle pending interupts and traps first long uip = ControlAndStatusRegisterFile.getValueNoNotify("uip"), uie = ControlAndStatusRegisterFile.getValueNoNotify("uie"); @@ -380,12 +381,14 @@ public void run() { if (handleInterrupt(InterruptController.claimExternal(), SimulationException.EXTERNAL_INTERRUPT, pc)) { pendingExternal = false; uip &= ~0x100; + checkHandlerBkpt = true; } else { return; // if the interrupt can't be handled, but the interrupt enable bit is high, thats an error } } else if (IE && (uip & 0x1) != 0 && (uie & ControlAndStatusRegisterFile.SOFTWARE_INTERRUPT) != 0) { if (handleInterrupt(0, SimulationException.SOFTWARE_INTERRUPT, pc)) { uip &= ~0x1; + checkHandlerBkpt = true; } else { return; // if the interrupt can't be handled, but the interrupt enable bit is high, thats an error } @@ -393,11 +396,13 @@ public void run() { if (handleInterrupt(InterruptController.claimTimer(), SimulationException.TIMER_INTERRUPT, pc)) { pendingTimer = false; uip &= ~0x10; + checkHandlerBkpt = true; } else { return; // if the interrupt can't be handled, but the interrupt enable bit is high, thats an error } } else if (pendingTrap) { // if we have a pending trap and aren't handling an interrupt it must be handled if (handleTrap(InterruptController.claimTrap(), pc - Instruction.INSTRUCTION_LENGTH)) { // account for that the PC has already been incremented + checkHandlerBkpt = true; } else { return; } @@ -408,6 +413,15 @@ public void run() { ControlAndStatusRegisterFile.updateRegister("uip", uip); } + if (checkHandlerBkpt) { + // Return if we've reached a breakpoint on the handler's entry point. + if (ebreak || (breakPoints != null) && + (Arrays.binarySearch(breakPoints, RegisterFile.getProgramCounter()) >= 0)) { + stopExecution(false, Reason.BREAKPOINT); + return; + } + } + // always handle interrupts and traps before quiting // Check number of instructions executed. Return if at limit (-1 is no limit). if (maxSteps > 0) {
  • c?gP9QgZl}Vo#)h6wZfZaQ`KpF-NTK3Oh7#OQ7OZbgukE|r_JZB)>I=mm; ze8w^G%&k|UiF!Pz!y|2Zy~fR9$-G(Y&Tu#etIESgnu5QrS-ymUblZ+c;AU$#YrbpN zPUV1EE0-=}bIB+K=~Lc(4PJWmQMl!Xu`ql3H0X;yRy%j*!nL>F!zo)XJ#7%y(FIOE z1AWCcSeCnpt6AJWl6PYQCz?MKD9P0tdNfXcQT)J#4A47p$pe?*h|HxFOi{2pe~%x( z`x;|N`~bD;G=SvX70~UxYoTtpQ=n=TrhTM= z1KvX|Q*a+H=p{c_(F4m+pp!w95oGDy=4!^}UWUgC;8}ykV@bx401l64T?eHAB$+dL z4&{FIfOrPr+BO2`22^P*1_t+9gKNre?xFEaLN)=`#uU~Ft6ag80r~`@3!g?HAb?yp z&H@GY6#(oD)FmC13JvI4db z9)assr(?Q9W6X*bpS>PZ8nlCv4}JlUJo2bNRr^tjzCjB8OfnDOfm4A3c# zNHPYns@JG7pYl_0q z0bI`5VPK{6Flp*lIK{H8gLqJkkbCaGk7M2tIB(OoZ9roXEM2-3X3d?$T77b%+uz}= z$210*J{~JL7RKn9^s$aJeM_$7c?_hRVKB=a)LyeTy<;~HG)aJ(X^DM7f#QCg@&z48!Ub$q zXXZi@7!=@`aDob|KwaF^e6{F~kdfy*jiF=si4{qPP6v@`%2c)NUKy0@-j;Zs;xLh* zf}**Tiy);9C1FQo1g2cW_j97S<2`ggS#Lh`+_UiazyHF&n89TJqJ^*k6-JBDC4-bl zOINOd<*P7A^qSSMYTa5`gVvbq(5huUS|x5ox0TIk)v^WSLu^AUoE;djlw51mFgRav zuC=?+3WUm0c`DPiX;XHytPsaRo0F-Jioq@EGiwg`KsoMms6` z8OO&1XO0Zipzg->Y3X#LNjrfk3RXsoN2@k1pdtFA6VSSS^pzNaJr*OYC!ncR2E6?A z}-}1{B;)w0SlQKJ}jg z6S^>BKXN47>b22?xjxMM_SB~QT$IS*Bgr>Snj;zl%G*i{KP|-c8);@HPk0Hw zLV?Yb80mG``4@4XW{Ubg^188TTD23#jvJ5WofzGkHZcqi1Xy@Yc76UE+6MyiYGQ<{VPMoBXM=_jA;|MvVW7;(c3tQAknT?L)ay#=2c z4pk_{i<)4I9~{yU%NF3K>WFj4LTuIwsE!#EMn60m2f3P3mZqTx`5xYzDj4U#d90AH zxN08pLSgN>*Z-5jIte1_{S`=>DkW3yQp^@~-f~Xw_YyAXBj$_)b7y z*>*$HPX`mC=Rv#P=R;mfTZqYAi^9I<(CM6;p=SGj5L2xlM8>8-e7)AtwBHCg>g-D) zHe(6qu&x7-PW}%*|KxuG;Zl)@mX1zF2;+cmmfx89+-T9=`Hh&uXv>XThv_H7R~fkZ zzW$y^;lp3&LFaB{5{=q<1v=R%5EyXMVEE+sd1#J&FS^7f!>7N`g}1-@8Q%GNDxdFu z{WJV;>I^vZyi3{anf!|{9d#3YIsG5_VeV4+cGg083Zruq&>-OE@F@$d6o4^J4F4)n zFCB?W+((qQ@@R}pGkEY2R9xUZ7NCRp_~G%7Kx5QE`gO>XEGMnd<~#ME5gyV?D>6G7 z`?S#0+Kp>yY(ffaU~4vL0*R?Lp<$~I7}-4r!EiLhVsJ6iq*Kg*B>Zjuj9*|n#)kRx z`_C}o?x!$!+D~{dnx|u&7YZ1NI2<~or5oiZClhx%5>ZG)4^P{^6Qi(y2tzNp45m;0 z9v;2@Mvhr<&29I=^>^Ke`#v&#ugaDfWIac7#IEgoVf@RJP$*vq9=iP|j71=3@ZnSr zEj36;Byl~=dalAivu5l5L*_5#bDeitKv+mvB@=S69oi<^_n3Vx@ju2~YJ%1b)zI?v zshcl`|GoMI+;hpP%m^KO9K(V#*9YAQdjaD{`KCrbm~TtjeW)))aV;fc+1x!aX*i+|9M-tCKP^7#xsnPG1fgZ?WmqRMgh>z_eq-PB|6&c4;T3WjJ|XfAbCKyNsY-rHc&Ac>;EQ-ffThQh+zn zqC6LXKpH{LH7lSZjKHE^7vwH|$D2e26lT9jAiGuPp78D4&qF*euyq=@;7I#sLz#gZ zkrCJ54d>l(4_q*29Gra4NX*$unpHBA5c9X0zkJ8R-`aIPlC|#y{A)L8z?KhdP+K02 z=9)CoXQHX*7L@8zfEe1ik?X_VkG}w4%$U#qa8ur$h^AcfZX_h2K!aH*k#F3zIo640 zk_LDiEuI6?4ez;Taq_jIL0L0Zk48nFUhE8W*i`sGuJeAKI2@{+~#-#efVPEExOTysuAaCa?h^y5K z?n3v4U_BTVVB2Y2Fc>yqoyH3Bg>H<^*bwcx{NMt0(R>?$iP3HgUrD{}cdkI31!M-y zE8jVQoa;5hG#R`GfIC_sO{?TQpEs{6h%*)dYB6I>(B(Z9taJ0#dcQ1qc6|rWI4TPd@H%r4H-9IeaS0TpwubPu<}*D)_rhYGLK-(=Oa3sdho;9O=#?rRD{M?S2~}x6r#K|!o4gyfZ)Q%EXBuk_!>ckLnD3Nt9bv>lx2Yh1Y0N#1 zYfK=I5(5LamZ5G@0lW4Qo41=d7u4n2*K%F@dM^sDZ=XCJjz0ZD*nxueu@k<5s~&q3 zwxiNx$Q8H19TUHTU0XN75q*w>hd%fP9-90UJo@1;@c5Kp;pxx*fZLyc54LVt54S)2 z7Th%c6%6#Y5pHb`ZkzOcIy14a8#dutjQ-WIj6BhSGNfteU2c0H?QgKI(CHVi?Cep zW4W9Iz?FwxKyCzyE;yIpRB)&~?X2eqQ^r?nCUFNn?U9WFir#}#*NuPgM;J5|U08PS z#8ihz!qflz4J{07GJrShE}6NT;cyVA$pgRPA$|CPo98XTb73VqEI_X$oh=(z**xkV zKo($+_LY1vNjn~kfnnk>HH5P{<%v@_l)4F^iM<9+IA2Yh1xNSo&p_etS+iJTd-9MW z@YD1^G4eG^d9l1V%B2BfviMgL;+Nz#Y0ft0?YwtWsOenS4I6Fd=y%=(&^2E(UHXAQ zcH=gkcrkC%wlgoH2Efqolm~ssrVX%T^F}<^V?@_YvZ=y<2#g9hGU4^tp#=&$F28gnEMBz8Y5&__&Vk6Vd}!6F1B6G%3s@mAu4C6kn>CVr z0`6hxr;<>&In=M44AJPK@cRFL4+!lJMkUO{#PhP(W!^9F0X1q};+O!dfQuTV(XXAv z2#O&En0x0#R-(&Q1xQZ1E1ffC1F84%yh=&alO>k$f zi-3siop3n1Q^nP71%NN7n!=!ST*L{ z6RKi2mN0v9?aV4-) zIzJshGtgC$>QBeit@JykN~IuzB*5XctJK-}3=-<>M!`TPT21W66ul&fG4lpl+U?rD zi(}SsdRM%KlsLP#??%B5<~dj4I+feGeGl#hQ9#DRCa(tF%r$17GIOU{`@M6ip^;kj z_)YZkFGy^*uVpA&AtG&$8+HL)aQ$5{^x{#N_BEA-;G6^9@j>@Q{V)HfSI8$ahN(nH z<$Bvn)UkzMRlu;j!1D4TyHb(dvSuBFzNKx4ac_MC&wVii>R@mksl9Cb=J zxcbB+@H`UE>(vs?&bMeS@`EhRefo>7=@nbIE8yAx2S zAV_~;RM+0Uj)o&Kr}-1(A7=0owtEFM>Tx1e$<36&G(=akF`!h3`rXm0{?syN+!zqfLoRcz*W6v|a9utG6#0HPfZG?y z3-C4;C%(X3^{Wcx4A9cGp$r^A&pTK#M(%my9rmTJ9*-%Zx(wuia0J8+pBo{Rm(QzU z>b1nWEumq96pWct6()T)vkY%1wmSByL%B)7 zIcF-6b%Jdwh_{vB9BU3Eu<-%r3b=`Tc?>BZDflv51qYZjKYRGmxz7drg@JlyTJD{7 zTm@c^MVwl!5cG7+-nGvRh-Z^yBQP=9BdCnWcb(@f6%9%Bcik`W{)$BdYL}zdJdOpA z>oQ@4`rJ>t*0TGf?hPG5AJ0Rg5D)>rf@GNj2}JX&fhe^510NXZ(-Mphzmq{>r>is76Y)v__gwi$orRz1=(a zV)~Ix1nd}`B{K&yFbE0xx{|a|z_~8^G@-L5z-*=+3!jQk-hj2=fDc|`WepZdwlRUD z3xwMpu&$dn1q^gO6Q$u7-}@qTIC>CNt63Lrc=iM6HfRW1MI^!L5Z;?S8Qz`zKD>uMk|jAQz0l=XUg_jyr@%eCF+I{AJkP}_uRr|s z17rXN^+7j;`t>+~5Yg3u6iII=;N0ey0&qFmkA{5^~{=jMLlKLe0> z#^p_zYk@?KGhm5bh@5vYChGh8ptJBzPe(vO8*v6%?kQu!-5?iE*(QPk1JqqXfvgWY zhIoT6o940|)DeMKWm4eF|JI`0M%FH9)w3Vup{9|ov~&Y3AiWTuE6*3?WZ*shA%FKK zh^*EWKK-Ah3@i1aps95C6UCX>(ud54^eL1Vwjp3<`opV5H+>~Qrzmjl05D!ZM38Ix z-e}C3SMV{$HNv#T;UjH_1pRV_>v9jBBJ?+alIzjm+-DezmeNtFV&5g}xXd}8e%3yv zPIt`P=|w4%gc;Ae*2~ybZM^b_$`rNp)V+cEM+AhtZ{RhQrHT4%vzL?2gamDq#>xDm zK;QiBS#!l5M}fKF7oO9MC55k`(3qNYr28p`Cs+~?!+%!UxKH5Vl4s9swjm|lQtbWs(M&hI5cnDiRn&Y zol>$iM4;VB&t`2pu*R!q-TKg=NelGl+l#*)1~pJ~n~j^`!!XreVoD0s(&@CbkwdH%T_4ydJGz!zR9Kn%fX?H>z`y`BJ+NogBf$AtEp-(pPC2*oZ+@yDr4Ta=l zbxiK?8r@T;VMFG%MJqN0<&Mgq>t#b>Rwv$=Anz?%dIB}k5~Czz4r0KQBrTn8&uL?dnl;a=b^ ziWg)3;|g%R@nj62I2v>14VQlmAGt~(M{vMxEq@S8g6{(#ItGb8&K!dg+%eG3!a0A! zDIMxy?)hn$j<6QI{`kFcdiNGA0FOY+9a(ebH1f-XAjdrLEBKVC7~`}2xuJw)3~+G^ z&;v}+%2=J*%({|T*$|54Rwz<2hJP^ho}^_lyBpr$IE%b&j2H`00Rq3y=FKeNvOv=! zLw??LKLK`x?R;Ynnw|4~d3XhV#Rh7qkF$ zh0W?zqZonGeLBVDU4Xf{W+eIqG*fD%a;h8xG(mar)I!1p9Sb7263{@PkT#AC4t4B! zemB1fc+|}?k0<+k5XIw# zAvXQ&0m?iM+(2`p*Ai`|qg~@ovkRWg-_A8Iub`ec#m02i2o`*`YF;hBnaBB|WjI)D zaS$f{C95|x&1+)*UYwwu_zFhoWq3oH>J(j- zq83Leq;tCAIr?PQQ4lQGWp1QC;eIu~>D;eIi!K5iS97l5hs805XC)w=Be2nD85ay5 zL(DtMTMFtVP6+?2pvh=YwLG_#tnqZ7W}Y^JB(-cR1&u27Ewn^)=jr&BX+YOJ=~JPe ztm8b3@SJ3Xb3#L&+hmFn+OsQz+-dm2_^#7cvGOteq6;qfg$Q>%G}GIP;;lfrOkULrr<|!L;9ggJGC!d>N+I zJJ3N24Wo!Mu6zAY84ANMyB;3A>2mn}yB}ckYtO=C6F=f0apb08H0V4Rnd4wglm}|O z^LrU5dcU7j_JTpO4J-SL_*p}c?!f$Py)9NQ6yUi-H@Uo~(BE|GxF(ZY+NWSFXf$~* zfLsKBxpWORkNNmLUkj2J*qc-Okj_cvLb(z?#O(ES5f=cWew@76Yx*b!C}uOoOFV&Y zUBE@7VitOl%JU|lHu%m$kJpSQg)1~yoI!T?8$U^W)ILGjxp-Ji9Ia+e3l#Jz+Z;ZuCu zw(aooXP zfC25S>r;UM3lbFc`7<>3$InC(63iWpgVvnHYM6=&D>s1L8yrslCRZ7?! z>eOLZ5L&m&au{o{Qq{rpy@F?>W#&1OelS)b%$SbVkm)P&J666`VUZCY89?aHpUP9_ zS?U+T0w2|AQWdUXR6)20cnM$1=@kqK2xqZ?M|ecm*K* zka5d`ra1UJZeG|Vixw9LoXdUYe*UCQ4o;{7#1R7!K*uu&HL3*ENt>6Cn>4yl{ua|M zsfYK)_V7@E7c%bxZWch$uJ_X1%5|JSUqy6Aw;V=Zr5p!&pp9%@S9`R#(W_2l#`7|1@6u@7R;#7#;o}~KYE3ODkL!Pz>W3n zDYUF3XgUNPd%}q)LNdDZZQZ&RuDR-JXy3LSJooIgo|d?4qlwL6tk7tlA?;M=UW~%e zR7L&|7gKnz|2dcAcejVX6bOcWn7?feL^%u413|?KP=|nQ*^Kf3x+@TXPM6f@iT>t| zudE=X0b%K{f@~=#U|aw94Yx1beMqW2ts$JyeL|1+BO%zR` zV-}}%GXOE5LLMX=hC-jle2oEzS=@OeU;w*W(9I_;)%rJ=7sjsNnw&d`t{7B@yr;Zf{6r`9^jW!Gacw;PM zi8r{q(KP}Hvx(+Un(G{pZS*9^Sslj%V}S5(3~RO`F1(Uw#1%>ehqN*IWy$R<0_tZs}9q@X{yp zFM;#vZ$1bgjXf0>{WO`=h304OfypR@ntbDlxJiz{a$+eWVvw>QB4jRQU3wewlw-}o z(p6vWIp>pC-sCygSUWjdbPxD*G@;U`UT`kLDz6~OKEic|BmC$|Aj!lapZgw#~3&#Tw4yQ9_m|dnX;D8kjGPa7E`JnQP2g6{|OIz&Dps@DJ-*KYt#&}F7c!$#1oaTEAu>QsnAe{!-it5&TV|NZRK&p^%8 z>TuqOb08mM@DPou8(i(V{9U7FD%>;rQrNV9E!_R&OYrJb55rGieF=#e_s24J0z@R-de?;vF3TGaeai>x`a(eM7) zWBQ;lDHrp%NAd!E*05o)a>a^$`g--MRnWcbktq4D3fGSs4O2cUW5nlj;3nY+^ot|Y zUXE-nbS6-ek1+(A9?=KZFPzO;7FNvs5t?>6mZQs3@HqzaoEEVh8d`=&n2j%w0o~b{ zepl{fo}rB_0~=!vLZ+f5h*E8%Xx|mM6Hn{Ln1`B&?-}$f;OG4^7ciSgp*Zs%-D5VH zJXS=jNh8NG8`lk}tNAv9EgfeDTr0Q|uuMnb_D~$1+bIybvkPQsHs-x_NcD&v`}W!}?%RKE5G zD-_|S;aBN*x*$Hw-ucyN#C1(kA&?`$EmDK7DvZ~^ja3b;%loY9A`mqIUEF7shwyJF zu$&`Il=;%kIZhxrGY{!}DS{xKoA^b`eo#==ER2=&?)&e-JMX;1x`kfAswV^QvVh zR*=_FYGG)QzgKb1E5p)KLEpHNHe1HOY+8Afie~I&oX*z?xa-EA0JzbPi?&-#+8K~L z09!TZ1kM$J=Ns+0e)od)JVfLK${C~^EjrC@l|__Z3ZC;W;JUw3?SwA$rZ1&iWu-TZ zJTK}V@JARyb=j${@n1x+|xzXr&7IxYhIGQ-!1eirw%-_r= zM78I%aAVC*6j%c6^xbD;=xzdh0?9b_3%cS(o&MvEt86?C$c#YSG6LTOwl{6s1P_jT z0IH#>xB=}1zH8U64G-Y;tte?xilg2x#%vS8jbc>T-SN0Ti; zgt2)MF9f2Uu|X`OJ7)p-Qr>9CN%%t=Ckp0cK4}aX?YaZ_bTj_0xrAcQW!COIMk&K0Uk+M9HtZc>4zWTipwsCi!Zp4&r2`581B0L4ycFe z{;s_I3g^1{y|_<$23fSwn4=VoHEY&{jT<(=m6u%sZ4YY=&prJ#?A*0W$GFF2ls3u8 z!vz?)vQfvQVauw8ke`(ftN;ELn&5ZJ9AWsIg;1<=3;;-1U{snBF2Gs(hSf^#$P^1QBAA+p}MV9qsPH`W`FW{BAD{XaJb;Y3rj<;3U`ky;}Tmz z7PJ%F(Hx|2!+piVa=GHH^}M#q!T8=8k6M=ph)X$H$3^6#T680@)_Ya|BJ+?6?4>bg zzLM((uCu_-xa#nnAm5F(jqs5O`;GQoK4pCI-yVK(_=e{{nRjJwq_&G7Qq1wq8_Aqm z)*~wuQvhS?v!iI3*Sk+2=+n0^^gZ@iIJO_1{h(j}{?LEG02nZE0G2xnP20CY z7T!a92Fg71z{3y0!X=C0*4uAmp`?{=QH~mRw=Bh2HDP4WY z1&E8LT)?^U9mjiABQ9ES4>%{Ea}ykn&D-6RHRxPkz`2~HO&8O5dlaGot(S!sa9$&M z(NZlqEtZ}IoELvygk_-@xrb`SwR&gaSMy1#&TJT@h&+@9___fjkU|>>ULzU&8Zb<2 zsZDHb)lyJSRkGCGmBO0{z$QqXPXHscsG9{{wlchF;CAtDS2X}0 zk|rX!IDNjIm2yT|u8J(s2q{-mGSenuWTb`et39Y*Ihv`#Zfd;KRW3JYC)&xW#`PfH}QmyHx zh{k(R9>nX)(9Zr%*nzJT|MSLB0T^R3=N{#DPkATcmX0#1TkDejqjH-769Kh4P7Kef z)|!n@Xbd@)CbAiIfEDwxj3c9Amrbf_*|~1Lhp(x*Iu{|~6M-Nz(pW6z{>RUz-;Eiw zM`*_Lg{v|327@xsHt$8_j%NhCvrq`t2Zc~MKK|-~vJx@Q5TzL>4iqvxV|dE|Y+kR0mt=Oszj+=u^QizN?kfY> z4Ii;~oMb2js*@VnznZ02tL6ycAWwJV=c3rW~nty&zKvu}X2 z&bkb)xbGv_6VnVbx37V#PiO!O{`d&`4mhqfq^gkjaCZ_=)p>>ciRmhzA}91X`Uyk0 z;GN2?LSlVXpI<>S?deQ3jkF zYdIH~6W`EWWdgy;{9zOgu29F!NwWTX*KD!GjS-;cV}^*1m`=8NtJaW(fSg`2FDDB+ zFbtoo`->o_Uimi9yMX&F*Sdh4*6?Dl+GMl%GninIt(ySd09#@fDpJIwz3Z%EI|gxwi?SpvQbHE`Y|Jv|-HIO7cd-JDlndo5&U zWcrk&wyj^czI>UX6i;J-%HUl5$~iC%(k*N69>~tv1I;=e1!>zhLDLRBAs6%8@7=x2 zEvG`0im+esf)?TvhhK?iI##^V-5m`#X~}gXDS|C2ulp_CSb8>?W~0gDzyr>CY{++c zoCL*U&AZ`Eu2?p^tSD3P&0txzNRDRRaZ}MiOa`cvmXpT~>ztgwd7PP(f79Q!O=g^$ zDBC_D%z!uA2+NLGft&(1&&<4g_ilLb(Z}GPd+$Y4(21_U|x8He(bKU%2+~+;_-3#qIc0lb_Hl*W5dE>^7(5Z80`1JG7;Md=$ z!4OP;6p8B$S#B92lpDQWHutn4ZizyuU*CBW;!bAvO}m-SYtS89E03+abc4Zguy-ir-#=8*jX> z6f;@q+@i~<^FsXHjCT(k%6ueH)u(VFQt(JuFwJW}^##|deN8nmW67A{+H@UvTEy4wP2X}5Q zKW>2H4;SxL*3l@}@+*(^Y>XgyYn_J(0#mK~ec!9_uoBPZ|Kj=2Y*;c6&%bBF!oO$1!nreH!JNO~-&u6dfO#`#z~6t(fH^b%gxNEu z!|dtPVdfvxVa6YSz@NYW&gb-Lf55cge)pWy@NYVQhu`U(hGnQ6mB;)3qI>cDXU<#{ z1VoqOjY9Vpvn-nh+-TFC9K>wTysk z-Jp5=;^?C80T`?ZSk@haHo$1|`O~Y-(_&t!Is--{7eDOY?ZF5Wv3#NTq;tv*cEqGb#GEyL#;)pJBl|$zX073Zag(4!-;<$Qt$J|TW0R4*xOvcf z0;OF%ScG!;xDdFKcPGG%+^ryozZ3fLn5DRzWi@YS&9s;bGw4zCc8Ty!ex0(BM7M~DsQu%O~;C>HCGE1He>b(teml_f-y4&bi4|X zQhhnM-FI_sA~t(9tY$1b?bSNWBtt&jbVNl(!uZD@gSBhdGDzRHZ5!06Q3LL|@4kJy zo5omaj!7s4AivSG&p8JcEM5c?CQU@2(8HaoM7u71;>1m$jW2@lJTyzq&e#pjJN3df zZ!I)IAygh(jgWAPf+kClCJ|T(`;-l#Q%h9OSDIIK=3oZe3cy*Wqw^qtI$CoxCo3 zFnIU3?NBwo4kTtRgRh<+32#q$7NX-*N=KVex{Kz6Lc48eo!0ks*M8wBv4ry+X5sbl ztO!Zm3Y_(m`BM1EYt=(@nBgtM{!TlnkCmTkY@4-R<`d-|6~-6#Np}IcufUz>OI^c7 zz;6Uf!oz0lNIUhL3Zr=148W0*k-_dV{vJnk?aDDQ_J5$;C#Ec|g1r9ktUuVdoXzw} zNT%;A0z|bGR6#kf$#^je6<{k@t%jVicFTt(%ya+en^#a^@#|v=X?a#re+n$AM#y$gA-uw()KIUl{dDBxc^2Vp&k{h1n z^P=nJG~X}1L4Lpdrl;XbEPoZ=d(D_9F~a2(*ppE*^P>vi8T)wwTBOADR90r5xMh#; zxhe~;BZT(Wx1R-^*E+%ED#`ZLix-V1kTlvO0)U9X91_(1H1exAma8KNxW_v zWb>fF!)V!g@iOM^y7BX90gc(ak*srMYz7!cQg1e?Mx#XEHHHH3Ap}Ipc0!KACb@I} z`3Kr}=)l0eNs}fpedb>n@X9wz`{}4rk3;isGIyiR3i+aM-n<#^MlE7RI9%*0*aThbiGUAqlPa*?Skw2vOjqpYXjJALU zHd>ZV-DwQ)ZcslJM4Ry@!Y1J{XFsWBd1R_U$^qoUa>DyGCP>3gnkAzJ^=OJry{<_; zjRgVu43G$f^LP@TcE*5ew_JZ;4`A|)H3OXFQ^u>&xQkXyfRzEaM%X|PTr1uHRD!}!M@gBm-VjuJQpdT*Qv@a=m?fPgmNY(Uv8#4%>F^oL*h*cl zvH{l0_P&*pxpyxA1y)ac5!TL_2YIjW#QF@)N{?`Yc(4Ku7{f>+e61Ek~jad=sOz$-TX0lH$jigHDms6?%_pDw7br! zT0#S`&4$33xAPXl1OnqtrfxuVBg^e!d4TxX6?f34pCY-=nfEvR@6%5>B6U&6oPYl2 zfHGtPUk80-f1myb`=JN>!Ga#7g8?JP%sqktIOcYt?kN{fp zhGhjW{?e%^pXUADE8y7^=*)*%4PSb}i~?>`scs+*5K_60!{!F08|*G1NBBy3kQ(4I zAtvCjLM9fR8Sw9bAsr{I8r8_|M#IlmCi&3 z0CK&bH|Nr$PTE3!FE3EzXX%D{e|=EDL4DYZPy{Yn%M}EvERDNV_|{rNY)MgcjxmS%5-rY+kBx_O~lU#Wzl6_*qipjX_!^SkA7iOE1| za)R-UOGx(nJt|ef!sy6svOG((Y~W>a^}?xQ7jao-_t^yq7;qn``*sE3re-&=jI%+e z>YSaSYTeb})_@#|t}U7x$GnX>zjsv|&&lxQAQr6_Ym`g+@WSPZc}ls9k}S${m>Jyoqsph6zG_E1 zJZt7b_a>Q#sU8)MN)SDnLnWP>e%E(4JmP%v*ihjN3%`u!Q|Dy-Jvt^DlH;P_&54ts zO|Rkb#XL;U7@Y!j!q&ha@7@Z}Km9O1kDy0r9fvyGOc6_V@dPfCp^M{knMb_qISZ~1 z^g!i5S6D=RDsdg0z^=UJt2GE!>45Sg+TwG`Be4n)8yzeS`pAn%K>C*DP$i`~yztZ$ zkdl%lT67bCgvO8xBv@dM-)UY-#8?dvKl~`{j;IHjSvhdgkfQ?hrlDU=ndj>YMxs(K zEfwr7ZF4OJDiQ?@U?|*XmPq>^@_pZFtFXr0xvQ8NuBdvAhMn$p7I9jfNn^+rnq6TL z&*#0NH=?T-RJZ^_%)v}b7BAqDeXsaP8cn&Fgzj@V7uCN`HAsQ#a`IK*n_fD9+Ca6T zMD-A6;LU(Ww?>J5d_p2je*9+m>+28D950qlhyVQgeRya57>LI-GVGUYOx&GSp?nbf zh;z?@ufF^e`t&*)P8f6?eEZEee!s5K7WxbUv&S>0;|#Y2NV{*O-xa{n#>&wm74la% zBg_Z^6zj?clmL%Y-W57AHgW*DK3M_1(f)fQyVEmR!|hm}P+dA67%XWtXc{k0-Qtem zn!+1^Ph(91Ki4bUaNaz7OzwHp%s4x6_URYO`cd3rghhULrk@2Fyb|3N zloOwG;3c#OF_{R+1lydXHK!cuUW*c<1@l5#S)2i{J1O0D$DQ!y7hm}KCdyeXA@V|{ zqNg}V80G0F*0MW%;+o9M5Ej9u{#gWIcY(VTxu1a+fq6AM#=0Xgm}?RO^Z9fCf}R7< zhPz&$iMjWhLBWnC@bswO@XJ?kg|r5cf+C)J@+q)r(V`OcYb7mO+;}SMI4c7=GcedI zxpD>ih>S^uv-%FF+lvjFD&F%=Rp%Z1tLh_FKitu!O!oJ8RKD-3w~(8^F+gT?^1dw{Pv6Rb&bTLR1)_I*KyAD^hJ#lwg6;wc8QAW)Z+( z0AaL(0%k;GuA5A6-x+nG_Zp+4qB^+L2B*bxi)ilyLCo@FNDhdl!LW?vJ~}oYqHv>P z(yv8D$D)63yqXD14s_B&61XSQQg(;(I(lJ_+G?q(oOkx>E3bmXG2Pu$Pdtg~wekdC zc<66fs&Mx^07e0eqbH^xj4X*^i#eGQ`EcrD@T;01bB|ZWqy!O*5G_jcc!Gmf=8Jx2jssVHI z5*l;f7nt)fRKV^B%kSSk!H){cz+m+5j_D}!dK?O&-baDcoA+OX0;wc4ZI6Rrrc8kQ z&pj3rldDNUIXXEtTd@;JiCScWZJL`-Jn2L@@0@d?L%VkH^ixmy1gI>oVkb6&;S1-J z7*V;{VNmZR>(W;Z0%V$^KGZpr`N+6qa9zsm%16S+^c*u6OZ~(z6wHbMMPAk(xbU*; z;l#_Ifz4GKLDufgFuZ#LET8#5IBn>#649$77OsP70<*KSp?{yg&=1c~KmMfLUW4X| zqUO0`8&Kq$SUhT$AcyW8$eA?{@IY=8p7~WURWHpdSOLuglv%-~=5>P6Y5O^~FSBzI z@ydOkr{l7?CYOTp6zsJmLE=jCh^HSP2RU08LQ<_JaK+f?;P)TCgc>yya9xe!w1eRo zpqWy&CMHBdVoU@){y4^Gy8C^oQMVDSU$YY4dEy#;9OhfIhhG$M_5lIp55FFKhzePN zeuxNfA8RR4Q7BOKTv&n`vQSak1GpEx{^AE-zz;;V613|;Rhf+oHjpF9SCE5s!30D| zt7tUii~6(hBmEQLF*PRp;hx1(6U)`XwkG8G;h)r znqfZrrVSfI;|2}+Y|@|+tXQ!EHK5^~>XGtYlg8tP=bwjK)ly;9Rafw4r#OwQfh=AP zu+vq7Nd~48>@tENwAB-?4}x z`sncCck^Q??GK>i7xW)2`1AL0Q@eTlz0 z0v>9=^0dR-P9%8gK(;nefsbSEuG(?B*$8gL-&~lTcqtZvd3CxlKLuV(P3)p$c+lGp1mQeo zFgHmVUa#48P1}c7G+ZCmYs%v94Axn=m@jjsTJMn2jmJny?qLfi&*9tTGW8{;OFbAG zbZJx-`0>35Ve_j0Aih=$xbDG^;NlCefj_7Ifay!OqnpiMShIW~y!!I%(7Eqf@XTi` zAhmWwSigEXJagl5(EHc{WqP;DcC+Do;keL0s^9`rF!{p|pkt>_q5rn_4J`$NkOJ3_ z9S5J!NrSMh|G*WGy$qSVcZx|XZP2S~q*U5CQ2;OA#i6E?Hu9tiQuI+(H}O=4Hs)0s z5YQ&od%uagD)rE&U+UEFY(`t?ne;r$r_BJMfVEG&iNkuUI^~PLUjPHihp|>|yUEE+ z?Gk{Yn@IMZq$lJv`x`>M4_tW$1ez{f75fubu=) zbUhyOqEcbW56?hsVoIrdzH$AAnE&~8=-0o$-*ucms zSv%pfGmn7QmR;W@0)S*0{MKk^7NMrun*P+{Dz@<^jmvq;oBOEF z#KZ*L@Q;HvYt}Fj&&kPww6rt^>Q`TL4V-tu`Eb(kt6_Os0_1M^8}4~^BBbN*v_m8w zGyq)wmhnO3fshIFzY~y6z7xcu-yKk5%6mT9ZySk3=F|Kf1-0g0Vr;I1-<^hpKGXAT z0>P$DY;^AA4K{#V0g_`*EC65pI7uU~;GEU!(jKNUOIlR(sZ7J$TOL39pT=#VF@dTs z8a+I|Xzb9)!^nU<&gf?vGkh;@r1N;^oR9ND1gu}R6h>V62xMcngJn}+cLmh6+IWed+%kK`pMhy=*Kf)&rad-2u$ty&$O@M)hT~NeC`GqF{mx<*_(-J7isRG zGtcuk(gdwI%=LUMlSgInS~v=^X3d-hwQAL3Ud=|nrPvM&5R6wvVUw8R7jVir0(O*+ z?v6Xg!u1b-fV7T=rym=GdD?4Y-RLvVQWDCf;Qb_Fn(}d>Pm|_~EjO6`)UcL-HgziT zr+!KlZ4+%<`I*P7@FyK6pcjGL*vK&W`KKRYG-htuQMEq4X9R@rS^`hpb{?E?%8)=z zQ-0TR{J=q+VWWWf7Lgp$bAKm|^{rdC^4LyBb7RWXLFEZ75`Fjin^X4DPlfBH@gmom zK3E^|fXSy#e-k*TXLae)1zw%-ItR{cf8tn3NUjdY^yvUCI`>3AK|g(;wbru+d)8Vb zgroJC1gj=cB(1wXdjMmt!)veZ0dzg)^_&$~496J_%`^c6pv*<})fQ z89j^;N7sDbSE$vFuHUkzQ{`^AI+}DOuYh-?FaAO6I131PEtj>Le&cnU<|kao&2{=K z28C-+KJ*}b@cTBnxLeGB9#HODz1 z9D^pNLw?3~e91g02uA^7Y%*)o$=p72?<#or*_)utkv&WLn1fQjbNh~P%k8(q&|$%E z4YPU67HHP65$sBr-1DJ&%$+j_hMh5#=XQHo3RnsR69tMCkMk~KAGsl$r14evCL^pi z+AyD2D^l>duh|&`VXVkoGu3NM;LOwb@g5bp3fFlt7OA-Udg6-A09@P4z?&hpF5XlP zE!Zq&H=84BfRqtaI$7k6R>65Mmek9^?NUj8pt_XbqKulhK(*yS^_XUQ)2vA@^a4(? zw(Q?o5E~y4NlD4DYVp75Gnc|Zlg-;n@Iyi!tb{;FN^%OEKI|+w_q_9fQfrMkX9S!* z;%pdx_Stae@UvjpnP>8%e#X$DaM~HC!)d3V218C80;dih45yrWDx7@EDR9!sC&LM7 z_Ivz^C%|#X9}k0$I}Qd88UzCd4ut*#2B6TRA9OwPNLaIa4d5xhyj(GLH-}+4<6B-7UD#-#@K{ntG1{V{?sK)+zQ3}TlJF~oXAu@LTsF+7{Kp~y z+Qe#E(|o&7)U*#Z|cA1?MJZk;#?rO}*ySr5k6en78QqEEz>&@=Rk< zgcGCvhU;#)9s`8l2IPW6!9wX^aE=)a(lG@mrQ>|; z$tO6=M{c1x%IBr24-2imX00@r&Df(A&-7*CI%KkOCp8AUo;gkGlzoCJNyD50F@biS z5S_qx%3HjqssP;Z1m8o~d9IV4Kt8R(R6hyPNob-%KjL{~;!dAto#uDZ1)H94RPa&< z)l0w28*$1)=2Hk}yIT!`S*u5yO}WmJd-_j- z0ZZ?lXR6<;F{gDjlPK}0wy>5`r0guACwxI0M-Dn9n^2?4WNo66@H;z40XnqkJK&ub zf6`X*rieBW^c!jX2*Qi>oi!hLJy$o|RK5VOS4&NTuH6EoL2p>EK1_P!4d~nNSigDr zP-)Pwy8dqX^snu3^@y&}rrQ7nwy6EaR+FjkrZp>I{OEIG@1EVeG~H0Iv6P(3sjcms;#gPu>p6WuaopyK;H)}AY{Cd9?o06JzEbn`eZv{C1cu4>TP z7nC0A(VBa-=!M6a(V#n;bfZCEvlND3{s`pkM}s~aQx&#o(W1z%Ux2{(NOXq?xCZ^1 z7h(M5`7pF!6X-kmY{)?$Q#Q*+AM`iJ-vX-^{R@wOjJery&Uj_qO)&5GpHSoe3u@3& zqlHHV^8MUjzk=r{&w==y^)T<3_e#sU&>dYrZoc_u27=}ww~dsP6bAW}mT~m;*ZF9t z>KuL&3dyR$(~qMDJ*g&6Y#4c-`9%4$Fz@a6yYfd7Rv;3oUV;M_rDYcj62uS)%p>sg z-uoVgm;Q$Wyc$hm&-P7lY}+`P`20ACj7JNci5VOgf*9ryp%yaS^St|^M=*X`PAEs)Sw$}cDSz9 zCdP!U*k+NTwC?j1#`A=f<2gjjkmUrGq4`nPW3g~D>$IsvOckQG%V4LVt@G{O0G=Wbm8aU6!~VKwNX+Ozh(Dl`RDcJ90bFLboH=@m!H zt`d1ymaYZVWY0?kS^V(O!lpjQpNxLfG9!cQ!D%NPf~Ed9z#u zso15mQoH~d6P}Frj4>}&^bMp^10c>)9;d!OTanRAnqZqi-DM?s!ypgLDfdH za6reu&_K1Y+7_u@S|#Jyyv%`lo=m>W|Bwc<2Aze1a^|BuNB`5#gSE>Sq1LxM+2 z@a5Yt!=N)S;@?P{PN!(o$-F|ep=CMpQFxJwCiUi+`t#4QefxH3*|H^*G6Z7)0Gz~0 zL_t)%|G{LKHvNwPn~s`35k5HJ!F_GC>%Lm{$S92WfH}>-`1pU&y8G!c@#oDDo=^u8 zvzEhG&yR$6CO*sH+&KcJ(mY_JeGBZ@&%21a$gDj#2ZbI1JYIh3CAOM)^zp~wzl94> z=yJUeI4|l^Jd{+xY_5nBZhOV`$dFH#he?|2z_2EdS zYhLX)^}n-5OBt2jFb^5mF%lXY%{#BS1~~IL5luL+-fXMk=T(#- zac1E%Chn3CUCe(8h-YW)ft1whkXoZA;GU7%P=!TkQMlt5&Vz{`?s=`Q*0a@4@RR&mXc@vM>&pGqcw6u&4gv z#npgtS-T8~*Qr6jtBVSirutO2B+sFBmz~4Jl7{9q6X1>J77r*Ft21}a=J{U1HP3_k zH?@h!HzR&uAv;^JnRe>>O_ptJ-Nx>0W?lCM=lpJ_jVv6H{Q)(ef75-3*=Gd8lv$#< z2R_Z3zkFcJ1)c(d;ETYwD)2R0fF5|7+8QkdN=*R+E*TH2Moc8*`i}x-v+r_1xIU2< zHj!q_qD&e?!Oo&1Gj$2j)s>#L+5)KMxw@e10?gYCBZc?)lCz%}Z4CIKYEEkwSY6cF zT-|8G)vV1(-X+MJw3km_xTzgt{^pg`i^;BTK8)0#uJLnqgW_oRwN0h&1>YN~Jr%|W zU7IfEikdbJ!3*Vqjze?7C=66ng*RRKoQE|gHbx_18^2wGadL#xBIv%=zD!Y^Qhk3A zXn*l(ihGs=t$2JDIux`s&Nky+i^zAm+i2B!)6W`o0_oz#OhM%Y$P1t^>b+zd5g;#5 z@@)z4)!Fpbzhi$IbdPS(zsme9W!gq<<@gHhb1opAH08wONA?~FM-4m~YSgX+*?af+ z`k-@62AT89dho33A=ZT#T?F;(*Dq_e2kriZcnnw-mXE&Gw?Y4N?}L?@b z=%L@o_6;i-1&sFB0pUCsskmG>_X0{4gzFBG0j^ohX{j@NM_$lnLoT4*0C?RP=uSek z(73H8DL;W>MGMA9On|!H%Zs*dJUl>Mg1d-D+eBqA4ALFRJDaz=Cuyo(ux{${HG6mJ zHDH|EC?MS#eI)#xCtH!#~n_vQ9mU$H;B{^ka#^B8AvPX6~U za4$?o*3j>lw#ENi9JnuB9Ys7Z?(nyc(saM@xbUpQyU6cRI8FtqXERu*NYqhi%58X? zfxNnYl;*jG?=db3fvD?X))9q%_cc;t;oV6Spi`f7;PZJHT|7Dk>V&O^-`^Pv&p-1B z5_JD_TxA95rR^6-c%$o)S+m6@Of6g#aPyk4r;Kk|vyA|p)>R{TC*aQ5)vW6TqCIQ2 zv62&QIMpS<*AdF|-a+;gyob==jpp2Ey;hJd8gT*b49<I^b0M_yh4AN*d=%wZ2;JVKUeRVe+T#Y*jt+4?8AQ077X(>=@ z3K&qW6&Nthiz%Cm%YteadtRp%ql&q@uX&p+!oI$162Vy(ZnKERA> z6F5zQCXQkP_}yr)B5`-k+x7+N?jla9ReVj{eWdOzl`rg*uF`gXd83(k&Ef*Ru$w+4 z^XplE%`A172I|INrv3t#V@~DGn>Qb@O7_cD07DzPT6OEgjxC$uwo8X$P^ftL_|2E# z#fR@iQ&!XrA)Ps&wB}4#e15=Z*aGE8fufUv**;Ek&c(s@j*D(dl`W#+~SwO8TzD@~Fv~<43U9+XE z1Yu<@IccpK5E~G#Kw8I$qb1k0XvW&j$4$)$+gW&Ttl?xGHvnHW=(;D-HJr5bYR;$e zYD5?yrOH0DWgY?_^h(6)<@&15TwBK2A?4cWGCZtYmzFZL)81++P$?*27No+#WgO|b ztmXV~70)DPq|NREPwTEo)_I9zvAk>wjPJN(&aMxwqJC)-h)vDJX+c#`&eD8-xGv4F&7WT3p zfByL=)I$?lip2cvGtWTBcI`Qe@1Z)5>3t0R_`{FTwNqy}eee+Y?N^LcUDSau?`Rhl zq-Un@hTETb6>8O~2e(`@6ec|N5Zv{|E6}((M&QO=t*#bQA_RxpQ5ufe9|YPTt}E_Y z23i$KTW51!_*dd^b@xz#7zyDxpSc+$tZ9>ttc-2I4&FRoK zu2~7^^*;hOtXeKwbS!5y=p4yE5C_vKKy{V4J%yfY`b@!GLSj7Rqxt&COGm?5qhEy0 zRT@L)?kzC9dps`(NmQ|QhqK8%V!qf*e!o;|XM=smK@O4&q^K}O9T87IJ z2rsl|Q=m8&ykh}cWsMaZ|EW@Sc6H-5TPFasW*bX5MfsxrmKHfCHMS_@e8Ytm`zrg5)+=%{x8U+)JxE*WuO5tG~Ok^5eaQ0q$jE2GXEMTOahY z5iv;aHX3w4mZu4 zgKKl$SA*^~Q5XMoS)`o^vb>Rz`^9ff1O*bPiZ&bu#0N&Bc;*>Hp)TgrB_G$Mq$G@1 zn+NBgbFN?g9T5=$F$cl#?NrP&o`QLpSFBh87hrz!E*(3;t1rLov?(l%(*B6mgNbg< zsl|{sxtV+6t|woEd9(h6*6lmPIhUOW1l*1PF6WL8pntAkgepy;{h;IG7H)yCMFXj# zgz=_iu^R#1q!!hDde;8@uetd}RLtW-6k1MexfpN61$fgxyh&HScgF?^&*aHwj2JS> zrd`I4#7UNMEr&}JGoI)f{yvC0&!)Nq9VMTh8U1s zxM2*O3~(-@)xJR3Q^1UA-Nf?v70H@|mko$F!Yl*4nXh&1n2oG#o{a{Jz9?)Y7Z%Nd z$Qn4WR6sDh&NiyuGiJDc4jtk>7U&f^&cbm)yh*MUq!Fat+2^8G+~4EOv(AE)32SZpTGJTQ*GtI1J6%@ z-8*)$u*$e`u!(!1H0U%&O5<#AWQbm241+P5!;H3--qRJdxB$-u?e0A^U!|rd!pz@( zgg*U;!AoDRfGSB1A!7Fuc=Mhi@Wn^3LybBO{q2T*%LPKBQTnG>pgUP?;s#vRb=L^n z)eKG6Q0-q{-+8PmXf3p6i{MVAcRW>SfHxJ_32i*-Pif8OodNF?JSOAZ7Fj!GvmjYh z9J6^J;4C6~0n+aJO7n;a&s_mK19m*=)7LW2Si~KdY0u@e8&waaDcm% zr|YsU&;u_x`A`MPJ6brS7I(C6MzrsMTwd{c0jEz>t1+Q-G}l^QB;mSX)Aqz!=-u}r zDLQG~WO1eixUi&MuWLCfZ#45#w{QIpcu@(4(d0X7iY%RFT$JC_#$jP;q`O7BySoG= zltxmdQ@UALN*WPqSQ=@hySuwtI;6YdS%3fM!y8_~9p|1iXJ)SNHFXVuCZ?rneBHhw zU%9GxSS4Mmu|}|8t_9y5i%9m5Wk4=*3?YZ{hS{HQPn>vDbMTTGOs3icBm@b^;SrF# zAX_ouEj2-SRpFg?g63zxIf-jG3e7TSvb#g!1AlDLj)mgvWg_euI*A)NO@=s4(h+sj z(QS@0i;OF85AkuWFvWK?2~FbHhfvDaydLd&6{AhzN%SIn zvat`M6%!zO2?b7l>z$RPhZXvKD?8r+d!$cn;xv^0FBfLv9ebw>bwF*Cq3Zp8#(t$9 zlpI7zlHX+oXQ8I3%59V6vX1geE`{Y8y)zuL&cVv~C084I^kdC2*+!QO2iUgH55?z8 zs`PFQpVQ8_Ytv3DDyjCs{-omQwX{+!Z|nE_hShHApCp`(ZPc}CS+@?$sh6D?V(s-G z#e!UMh7KewFn23XQrT<^K;DFZxjg4)@@ooM_J18Q%CEB>JJ&3?Ah9?V)Gq(zv8}qa zMm)s-+{fZ8(6Qp8V)=P5Wh}G*k~OvWx>ZTW?Nki6ceOx|g@ppV;a?q-ENnArX|NUfx9^4;a1^0w_SHs!k&O*{g- z<^Ww+91AvKtuH~Xg9Q_L;yky+1Z`Y=w@N*$KqGiQDythWAKKSqaA~tLg>ddxuNeMozrA55kkIQ6HKs6QkmuR;^p)(!Q)A! z27*DG>@g-P+Ru@6>zsk2ye~Lc%_^aGQAR4Oiuz89wb~)H6XPi_=)PCGB~E*}lbH*7E&{+ z&*#X9%9w$)Xy8D#qWlgrF~G7~LXWp*arK;HI`q(k zQsnu8dB4yW|8vl@t~I;5v6h*e*^(7pHVwLfpYcuuR{VEkv_id-2zUbXm@_)ga~rm( zorxMf9zhJC0Zfgyem+^E!y#B_EFpLjytSc;2z{6LHyFS{8~oOEdac#R6w78@P2}0t z^Co1kDyCrIu`z}$?0XhA7~;S91Oux1)pwL(iD8O8Vt`o2#Z#*B)l;P+_8pwFm9Kn` zbN`$bOD*J=$=vsRFdpOWyA%%;f!AD9+vPKVTv!kckNh6YKt+lS6aTV2)#s9KZ|_RY z3;USdb8vJgbIm8!nLn=R=#3~LNO98o!j8P7OYc~7>5uO?&t-Jj_{W+4l#6sEha3uX z9Jp2A@Tkx8E$a>^d-A<4)lsQ2TVn6fLG(dt@R`>M6gP@vKm69VD_B_9WU^BAYnpFa zuUU(lI@R4nMc}aIcfx(f@+Qt-+hy|k#xJ`z0gp`J3kVgW2Twqj<1jD|FxMjn>Z#Gv zgY~?Bf&f20DUM8_Vicv2myOp*l2r+@O|@_iOWQn6MDwTbakic$_mMD~4Mj4PkgKNh zF0!RUoIXj{IJXqB+!0iA>^hD~t71#%A0wqVz+fu-b0G_QahQT0gnq`HC#my|^ZEXM znL++sL|67Qs3^u?CoMC52(>GWM#tZRD$&7)D!!MP?ZtGG(vrdx{oA(;G70o5>pMEe zA&UXyZ2XQ~_WP)i%Rb67_$Bv!jCPJ?lzuD{Bp;8$jYhJzyKA*%-W`{LmFCYKLJH1U zkb6gnaa;03L_)!(e6rV+3$1dsm9MANSsOuQ-%zsuU(WND;Xl;n@;!(KG>$FT>g&DQ zZ1UgpQ+X&dog?-$owhlL*MwuF3$KM zx;H8E>-*E@Fd98calOHY5Ghs5&+F&9De|LLk4TxM^>rnvNdP@oT?AIVZVjE5kLzB{-vePsi4WHsZjW!$m$ywkkg zBY0vrgKvW7;eMwWr?H44GO9LjK~u3lnhrzT(%c{UB6{iutQH-{2ki8{jhVNi8Wu>& zwo(yb7oewR5%Yq!i>10++9!g3wpeWOCD?~Z%+~m2x&9VayVq~|-nTZQ)#UiiU?ER* zx@(a(oI1M{S>ao~)aH;n&P613^|W+D7f87p$>8et`VB|al6&@-N!%u7FP zkyjgzscdcy&hhV$0_Ei9@Sz{9K8QhOc5HoV&Uz=F&Ulj|=^KX6UEyZ@O;+Y2VUiU={8O^XWoV#^*_zan&!5W=O zoxR8}GddbF&#OBc$M-p`wZC>exE-12VRNQ zoxU8(Hz~&nq7o*>QZv~@PK&a-dO0?XGM`u(Md9?khijOo1O9iIyu} zY1yE~tgUB9Hfc_Ebg8IM=aQjYFI{Wv3(-U>j^Ug8mUf=^i&@^Rtl17Yd4iM}V*I2& zYd4KOKly}WrW8MK?1#Czxw(Gga~c?;OxQhY*8h+^ zlJ=7QQv|W*d;9kv!Ef6#sxkW7pXlwDThN{V@T||jYIjWIt#z7&`^fsJN;6Ut?MsZS zu`FxH-sjFVGZGx3plSGD&?TU}{rX~Yk1fthM+c;x<_NhA&BD5Ex#IcSD-c#{KfE!9 zV{du`(=}bjCkvlblf(GWYMOr;gy9jGw55y^PPIP%1ZVLwZ9#d39u4}>d*&BLQBF0G zDx?D?u7#1|`P?)}@cGYApP0sry1>#yA+TguKY8xpXRcevvUrp6^1C+Is|@iS3ad)R z=NbQJmE{6-%z6#g+vmK}y3u9#;@Hg7OV-~ynU+?%bp+pY8$M$;y^fIe&_(aWS(Qk? zGG0&NKIBz7S}{3UF?LMZm`z34;(-y?K1|b(;vFaQAIfX=fx7M5v~Vk$g#|kBkFT6q zl&Kd%fXj%GnthD5*{oSOo7`TP4?CEg>zH|P&PXURKUZkI1V9u4L{zmo`KPWK0ejw} zZdGwo`_v#Kf6MhvKYDaj(cK{Pqb^cD+hQ-a)Fi6ST$jDEi30ny=eiuYe3FfZ$$u;~>*pMoLLXUXVjd!AhEmug*fI*6mIdGk zbAZ~Cs#{%Bu5Xiaa*KpLqkfF;_3u#Jkv>h;o%?pvQ& z#PD2|7ON>*m|^j)V!{}yv+ts)>wUP~G0E|*3bri5%(KlzAR1E!mS$-Y6mzHLEFE6r zI_*8RR`^?w{+=8bC0%h*r+#~-%19 zWg(Kdq(-ufKR1#NHx2{iYhdX4DQin;maACoOMzNzW|~w$bNk*V)Rir1$Z{QemjZ^m z>Yq;T$#_5$w;x(9{4ZN~*J#^^J&F@Nb;?urrg`!)7d@kwlQWTkLMebvWiR!( z2I3Ma4!Y~0WB$NWbG#CyWf1~sCNoLgW9`#u8;is>d&yl?^?3biSZjGi}EU20~eE$Uo*)<%EfHY8ByFq`W}Hw z3kMqfjh`4>qt|VuN=yC0sjx0AJ*66PV^CLM!0B6>%XVq1mnIE?F zMqo@#IF6@PTV_i{1f%K4pEjryh5hGocqwSg{+>u*@HCW0xfIV)&$h-TWQZ^j_fEeF zBX#_pDGVE z1GLaTDHT514^2I8p7snrh|Fpw{>@Qi?q46Dq1g&-8zzqPX?&x>@oVp~hE1!IEhK=U zwG2)Pr>N>irynmd{~H}C9S^^`$lLg9EsYU`{`tqueoQP}z5q*j5ZYf^Eq1sy6nNc< z{5c+0I}_PRF6#Y7M#NH5crqO}uuHi&;-ATfFN-roG{WqIg#o0qj&K!f>2S{vw;X?< z{B{c{Y+UwBCsD2NJK2RDp9~ii8ucchAS@6R?h93>8J9Xu?+?(*3>KsA%BdX{234c-TFO1ZzI3HEi@?40>xn}Tk%OX`EHwS;;7QyU!u7Ni1+1-o|W`D z!q8<=W;(#w_n810dUZ?eHJG0aqy|#@U*QBeqP}k&CDWGK({K!%S-Pg-u%`$*#VB0M zf$MF%P{ZLTYCGt-Rr>BXbP)3PQ~--C8UjDDRwxJS9VX3{Am>tZsl|Q88O~naF3>xtycRRiI$1+GUzQ z=`dgtJ9S+E6gct4^ypYk+B-4t55iT0=iR})F^G5Jg)$5cGX8KWAb1^GPs3_U)bhGy z7?-Y3RHes`K&-^E1LP*ZPX&riy&@w1VoOHukM#xQY?gG-GVlc+${X*TvQW)9_rkjZ z_}+wDWD>=V?q;K98pa)6a3Z79!d2Yz6uE=iVi3$Vrtn=T*8afk8{c;<=yfy_{k#-I zyJ!U<68S3nU~=vaY#M}pr;;==?rX~n54XM*93Zb)y}{M4)&NGR^|>Ad})5)VRGfSFHt+tlCyG@r)6a zp}Y~#W!XtWOwiu)1|SqLmO8k|0$Yaf;ryl_W+yg&E@yj}HT_vX?=gwx)_~iqz8bL; z+)G|^f*J}WHVAL7dR@M5EwJ4zBmoFeA(kehfvL&y7OQ=j$^3IVCge(fw(#DJ*9Cq_ zXe#hX`_&$jA2hWFOBnD4Q_j7fO3xcSF=lI2#T-k!kGv zRpIx@e^Xq(_W?B#Jt}Y441=ZU59jDQzl))1K;FW;Dy8TkXgHQjfimsjo6Ieg z;gtiyDuE@Au$hk(ML4l16NzHy*;uj*`$L_szfhx~hCG{me-Hijfafib{e`Mrs2jNw z2u6fd>#8;`4_T?XKI_w%mzkbB<|=ll2M}L$=WA*pm7*tS4;-T=7h7)zqdN7M1W1b( z*xHgele9hTyR}1aO^8@ACT>rq)n*vDyXyhoSLS?Ucn9{|I*1m;3P zLeazPh<;{e!g`I798HRfRshL}`({}yi(`@0#xPU;KhcO273^z0t>)FcXZZ3K5-&Y? zkw-6lC=<)%h#*xg+vQ8w0adFv{k#=`ThS-%yyF#`# z#TTUDZ;r3SV&6`I6dNs<;~adCbuc>E3CsqVIErcWNh}KK`P&SnpH`9qooEB~&zJ9k z3;RxYCY#DSpb(-LzMBUKQT(?%0g^Vj*eja1#E5fdjj}AVMB5` zSxHuPrLQYVuhftA9*qcM02QtLs20!7Dasn5 zXZr`LiEJ6<_7cILa2ceF4VO&VpXovHA3pJ)J^Ep}clyD3FOB()EJPC;NY>~k{~2rs*qAww znan5WCHz|Ywu+7C>1c<1Bg23xi0pyQ<8k_YB@(M&aaze>1h(p)jmoH5Clv`=;kpwj zGagxxBO7ODjOv;7%>+PyHn|>#ZAQO_HD&9D7Vq9&3S!2D(yiV%sz2Gw52Deqn z8q%^#w!TW_AkXH_@&={e4QHygxAOCBCJ=ne92uacHbJv{KYgedO*01kw zsE}A0mP8HYtiK*&Mj*5Q=No<^TV@VLt5`8WN?(Zl$_%GC0Pn(#u!&_-nE-c{eywbxpb7?EC z>erf1*Of_DG5q(gaU~1!(|8$5joM?X^@9JxI=w|VrG6a$K4;J;5P#wH%M-#}`j zzn{glOU$xku<*h051INGB8?Ox2y~GCL_}|SgnAyYCHi?F5(R(nFpPb7441bGd;bP8 z-Q{T^lGnxKd8KvBr+U=el*gSYSVU@1H|r4oUkW|^U7;X7w%ug+ zG?*?rFQY7L1h`Q-sgk;3Vp!&MB;5OGAx4qSvw|-x{PE$vRpX^LmncJb=ZadzcV==r z5A+fD%dlYguVXuNfFEAsBPe@fgps8xWgA-@k1|y~6N11dryi-AdWj;6r|y!O)JoKZ zDM-c5#ipmf< zh4IsS3#A`+^PN`DC^;=gFwJd@Ar8NUoP@^$j}f%;jjwe5XkX)nGP} zI$+J3%*VxFY@Z?4-SU-qhR7wK{tEaU$pl6qPDIP~*wlo-M>UN^L71SkXcc1x{_iIO z2EwjIb9FtQL^mS#;kJ{GBgkAr>k~aExT4?$oHXyzc;1I3t#5>725W>G12baV2@BX| z@I0dETfgl9l3hhFZ1X}^LNR1}6(7wcH~y{m&|)r4R60jz2% z)Dc7AlNFaZ@K+VzZRUkP-!S*!shshyj9VYD^S##qOY4pEp9re|4lul!JlGo7Bwt@JCB^@TvWdAt6vP z1cprRh85%Et=DHP{}kcb*F9YIosM~W;YNsag3k*4F2;8f4xS0)%s|mj8@%)M z4v|0uK7m5D-#U_PNwg-z?X;W)(2V{43r?g1Pb}*K%)4KwQ-lc@c2sfY)ai%Q)D8|W zE(k-tN$GGt8yX#L=tIEul2ai(DUC9wj=h_2%?2BR2y5T9k@s;B7xc^s$xQ-+bhL;Gog=O35)DaS^{ z{Q&7QAPX=Koxo}mUxk7*8y41LMUQlq$ZP7<2Yf&%1t11Xrat( zET^(F7NL6k<8S9F3!H=BiKXCU0jg8y@oCrH?Mon^9v?L`JFu=y4@Dq-4j}&Ml#?a8 zt5Egnw=)`Nv?=$8hc7sJ{k)-3Wy9+?|6ksN34fnFt?r4k?_=LSFL!@}y!}Yc!xOnD z?h}jxjN+`(ymaWz4Fv8JRE*n2vcZDJPzoSl{YRn;`t55&0y0*hfH5VOi@!IrszfpS zl?@J1!vBJK#jjswqEu^HW@%3Fs#6TNQ)ox9_4LFClmmwP%^Oxur|tG{Ij~6@sEjSP ztXLHQ!D+S2@N>Q&L3NX$$K=MypmYJ}KG#h6#x=8GxN>*BnuAg~2KAA)Rlw%KS!z|9 z@Iu}SqUH33e8QL;lL^r!%s5whogc9NrR$__Fu6HW4&<|{i;B{-%XlnHR_Is!(b6>Z z$&fgm$4ZAL=*585F*sYza?M|IxpNMZ7MkI8gQEM~|Bl#SlMe-2jmzzB|D{vP!GZs1 zwG9c^d9EuT;jr`XL4wKEzAeJgp{!|4hjABeGd1qL4>E?89-OUZ8v?CD467;T&gXRa zCOP39jjYs^!@?BKHQl5IHt^_ffJ_&8s@f7L@GSRvSK`^@RRl4{o#)8N@8GL>|H z_i}fNB}PcVYi4d5t2NISB0>)VA90*b`6bfy-LI`IyQMLR4lneo`CLpu--F9VVL)!l zgWFiA;RIly6Pc-|?>Y++iJ#J=wFgDn>gm>h6f zs1n*MA&LNPcgFmX;VA~VMdiEN{?cAMQLDK>i+FQ(Fgp8KA1|{_A)5fkS?w5jdj{; zfp$zIqpN#H*iZYT?tiOOIt4&rg(+ep5I4tzF`9tz%|O7Lw^X-{e6HLO{pW2H@7_=% z3k~w+Y}4-^Moa^(mp1=ZVF(nphjS?En7y=o`rx{;qFuIuGO9 z#VFFMt!I3Ndz{SC=?uCz!X7WSnJSK?G~!*$iKc&dnp|B%|L^H(uOWI}B06edHo>o6 zFm(aBY>BEpa;-i5=IG+mXPDrOK|*A+hmM&yzxA58c*b41UiL`E+KAM4X zB&aWD`^&jVdN338V&bcwSgu^NGPXY7c2uAkXbJY+Ha4x9e~J|<*aXPl>y(B04Wk~> z`bA9TOqYY;E9M5%5D~icl-W|9;cw(osNs)4fcUv=bzWWGEES}>Cn7n;2~3Sl^E5cX zFCayUbYy`C4i28|;TjtIVLlYR*L@7DH6KUz=>&uYWN0U;-YZDK`32CQWaoq|p9*%4 zG5`K^{?}Fk`OAKyEyd5?F2I#D-93%3?mo&F?ui~Tq8xI$4-a)}fB-~a0u`HOortaJoJ|L6H#GzEP#E>&>uOGIs$S?oaP4(9 zK5b;)JnaXbjVXki*;k5@Kv%Xt4jV9X;N}U{4n4 zJ$@SVTLc|RP@_q+E(=^rena-IJa3?O#6a_fAUs-1?vqqvjQmfvwm)_e$_g|-I-H+i zu^WMJAJ#V}ek|a%cfK)Alnrr!_qJ~6Suni^O+{gj?B6@_+%@$lpn zP)pF0fGV2SSz;_=d$`)Pddp{VQBKvA{G7IbfqUc-5Y`TRpGVCfPPI|Dv5#(P7Lku| zF7Qoqb0)Bbe`aO-${*W9Z!}HE{BdQz| zTF~pRuz0|@5tD|09_`n8flG4@0QZEvSTOT;jJzO0^7N|VR!}EW7kz_R#oRrpDVpq(q$K0fVDtUik zj*CjA`=I&GGjhMN~hP*nhIoNVmQ!-S}tIhHp@R zL;f?sO!Cd{fEpsXkM0*TKnOvGuU@48PpmHhR7yA$)P;tFdw}uZeFpb6;XZyl$0i^{ zo~%0e+=SunGOtLmxXyRI0X-L|cOqqyqw%Gv&CL(WO#EVsr=mg_2;OfVpjqbtFD{XMpM{&Pb4p`kvqpTKy6&&^~lsWRxfrDa?!gyl?p zVkR4MF1Zk2i@nQtW#obd|0jLKRkxCf+}#ce7%pfFmX3LsrA;YdLj50yV3tpZXz{`R zbG(^*>>RWJGF4I>w@;Q59uUECAJZlx)|=N4%h^LE8efK{)Bc+LAZ z!^Bp9qNdQLAI5YVgrY;-Ub~Tpe?6=*^e*-S- z>7=!WXpN%8XdWS_9C7JN^3sbv8P<3YgeS?@ov95vEvVHPY;SNFu0C8z)q710cOXl7 z+rF=0qD=jacS~(9xy<@+!(Pvpw1U5iI22Gen#R#8Ir0hJs{NE6@2R#v&KVvB>qVjY z%g13@N{sp2ZD!U};d#iFBTsE3k27+3Df`+pD)|S!U=3sCAvnZM&T0rxxmJnO`M0e%6b6av*3E3r*kaM( zKOFZwb4jfza);Q9{Em|vL#NXWGivT30g2~04b_m`35NT=GzaECQX=k0pisBN&N)L7 zYG&?YUot~gHQT95oR*8F5}45h$k}@{+v@|uQNIAx8~uTNx!!=x#BX9aapkEJ>iZx6tzYiHdTa!N}>vYXWZm7*;Z;T2GZJY>L>jEZ$WOOy-erSMUj8o2s0Bf zBD~$ulG&Zl(#77yqf!lzr>$BQT|NhW-lrH_EGs>4XiO>=ZtT=p7q3 zH!c|Pt3Tn*3(ueGKc!d?oeVCG64{$0vgWkWFo9mQ|Bb`HTgNVhE49#&x(S~NdzxGG1ITH1)Li|fBuj|43anP52byh>a z=86Vg&NYu;dw@dRR{twEr(HeE&i%s*^nwk1P5a;Bq*npE<6(U&q{svm2#dtFo0RWu zmYV)Ob=dMolqO>PjOKPYcl}5KTN7AR?({YG^KbqQj*{|QbmbzD;`u;=}?TYuKy*a&xwUx$h*b-V$5MU2O zf=s{04iz?0=MjIr7!B9T4!BZTt_wXvYNP>NDLS^n`^B;uLys;jKo-Q+n;}U?L4jbT z#KT-=go)wWK$^SC_B~jMI97ym&S3>R$kEdHHw*;+PV)8C*lMcAdceKlS_*5iyq3cP zmds*Xp#{I!*QHmM`%q1||59_Em;uN$Uk*s+F4%zse7!fdJK-h;k|-QZ;$N}i)v-HAl!B$}8L^-yTyobS=wRJL58jgQtL|RmMfn9EyYj8SWVd&CPi|sugvr> zrdjjsO}>*%nFE0Kg)5biPYRRZ4-bq=6u0-5SyD;thSas*ZlkEiyfsY1wK|jb9J^X{ ze%kS~TO1)3hav>##Rf;sgc<$lU$`QBUkg42!ZJ*0zo>|ew6y-Kn|8|YSVlGZfd){4 z1rLHZtamdBYF+(V{s1xW8&MvXw!G%<%gtO{lBqGk@J9=vcG2HPM9a&Gl)aB2 zbX$FwaN+0vZF~iKO+3RGaNV0UQRQO!UPWc6MwOhme8Tp)J~{;YeOjGh_GVLMM0xtA z>*pT6cJG7$T8Qeje;U$gDxVCEx!ZsS$ml1PRaFF=DysI^v9cUmd@H$kca0R&cNFdm zrk&#C(gl8iiLhnH6PoGV$AI`T3Xu-B`ZXk(Fw7Ec#}7U+ddb!ha~7B(m2B9eygsZz z4J%P&piLlE>3_j3HE0eM*m$92pbP-Oav|(7QgL!_9-gPxvIXbBi`S^w*s#wIl;|?! zrBO2J(SmC(H77wE@L&~bC$TLvCb6X$ zP30jU*yW=qsS540{QQ7H1GCNIV1Uo{W@6|$751P_Lw1oM&2$v8V-WZU#f`8i~e)~mF-aZff7!DN`~_Y)Y<8>UTlJ40KX7O4#qgui=|C@YWC`mJ{p}#q>r{Yntc-!u zTi!!&!L+Kqy`3D3bhq_V8X}XE=g$=+6DJ@K75)P8`97@q**zUq_!(4jb@R!Bbm=i4vZ=ee> ztlkEGLJ!A3!6CWnNE&Fk#OKU8j<$ z3;B05Vc~#m;@)TMc~kf5UvMe|K0HR8J{s1BiRy;_4wd1p-$-90v27eJ zuYvoid_;?^b?mlyNA=$$uh3;(N~Y8!e&bl?wUt^Cf_ESVw%3H^OR8&7=MfPkUBE7y zk7%jypDco02~8K|&-mL|d|Z4lhy~^~A*P<|&4)O&=%ic0zVEmOcQMf#$XS55Jqo{v zIJCO%h|#B*Rz80x0`Pg*_7O8lADXy!Lf#(sU{)I+8XE~Bv`_1V@H}i?RztLpm(KPT zBG(JJ>JzcJ0C)Jc6h(;l)iPAspFxxzfjC!MA>tCqenbmMCrN-ry3thNzB~25Ph1xb zUjaUGCiD}f>+&Kya7_Hw`OaR8w_qyLLdC1uf0deD2p*1BD`76Zc5_#=tf53o$HeHp zi-Tn2PYt*+$jWSS0<;lf=H78~KqEzTrT~U33+~)Y?+`!zJqR;S?BG3NVT+e{kb>5xFBJCez`SZzR>1YaNxt_;_ z;kczgY4zHeNJS)L=GXhE3;(4?21$M(OX)AfEod4t)c0Pm^2cnU;aD>2#;PW~P2zWB z>1T*XDXT?(_F59Mw*+o?u($$MINHrEEHC_5#Cm`&GajO)y8o7$K3dV#0N_ey88guL zA?J0st8Dx=SbUEu4jkY2`D!1I>)T|h5RtL-Ew9uD#vMPY15_>cK=?7iC#Z`F`xbaw zfB}rt2ylx{X}-P3N1$QnCsmcsx@z^gkv?v^UT>+wGufNN416~z^?NufWn#Wr8z2bY z$^mJX-2AUZEjWXZVwzo%R6_`%vXQSIum6{i>!U4Df0J6~%Xe5%BwE9)CFR|qc5>rv z_o`j`ZMB&>-jV)c*-x@*GOt>(`JCZ4x!DKM|J}l1h$On{Fw98sNAp~*+P25MGO_DbwdCkw$I zNjAr)5<$O@s%&K@hDQH2Vu!!K9-IAl0;L3!gN#VrHwY?xlvXxN6ruxz@^-Pc>!a(9wDr7!eG|ZsD(#ov(lb-;|y|MjA!a}pBvrw$y{lgRK9YqA=a)yT+t zKI;BkSbmHqDl2Rn|NAaAo&W7$`n>VND=2-J^u5w7}moO{451ss;RuTgP13}xt zR>ZG!RF#(fyO3k*em;?4cwv@IW+`G1^a-$gGDUi*R!{>Pa+p)y+yz9^{JgG;^y*@r z{t@Hf6{0D^Z+TeXvJm`v^d=ZWLlIn^<8s?Y~hmEdqV>d3f zRXl5tL=@X3VkJ@#0hq_`+q1i&(9RE94Eq&iMht<4*?fpWZ*xc=%a|uY#YSCkA}s7n z?0vG-2N`|WU1}@N2jxo+GMaSA5&Q|PQwYiLn4xM5A+Sazrf3D_eoV0TflsYV&=cNx z4@fu)P?gjTti8+Kdi%R^q&0A3MbZJ#)M|0`2ou?vIKf2IM8QOF#P>$iPG*b9svpyj z$oE~2aFQ?3IJ-nT)LxH6cOqXf|N5i)x%5nAk(DBe6@}@7$aI7{)Ii@YN>~)oVAE92 z@9O-1!Y&GSS)89bU}wU`UvAn0m>}^4C+z-LQ)q3WE&so(1!dtcz}&-l%b{>}g~ywsi#KQalF}bo|G)5y zSCe;dIfg;(dataWYvJ~x1T;@;4?0Vp$&cQL zmL|5&$E|#8hUzC z{?gB=k!?PJPsQ_?P2wgmx-m~589eX1sdCuvEZ>ZzK2kl^yHb?uR+I2METZ~w#YoX# zXvls=lvU6SA)UpAn6CbvC|0D{UnmEPw!a{;lL_G#_+D@wsVwHLvCSUT1q% z+~lqBtQ~_e&X7pruu38T2CtEn?v}fqi$plstBc4TW8S82AOnx}zfO#42 zf#xY#3C8{h3C3rY#QH^9b^I@Gq6nketu_&)@>-#YxED%!3NGOBa1M@utm3wuH>nl6r6l(bJ z>*m4l$Fa>PaXCH6Yw<3%urONN!xz%0=i4s>V_4uz@A)7R$9AUu28}y2CN!rYHP1@p zFFWR4KBsDdv2FKw7EjGc7jHGFMVT`L5y7anUyDe!2@L5k7VU#d?Jp+P$arpGqX&fB z`Hq2v*SPE3W+L6;*$mPdNGjm+fG7KjNwL@dW% zg|Eu=oAY|1ou+Wi#i7!PTLh!r3*N#+d4gh-RUJWQcBPXQ+ZRH3*1&+vw8mI}6H_Ui z_GUNb)<=}LEkR)jPouY6qMdG)>fI;;qFs^FZg(jBun9<+vZkoBpb)ZjCfN{%kYFk! zny}AdZFp-5adB|tqSw6Sepizio-UV8hF6G+Ziw9SoLe>Bc$&3w*nRdsIMNj3%_xQ~ z(iC~|I5VEs!KVzr>`fWJR-o3F%m+LA-@R#aJ@_Q0un?GL5C0Ho{Z;v2sD=ey zM*M2_`eZZti2)tA=u@a+EJe8#*;Wg{46?YBTse>T$0cF{CK>!v*3DDjT&^j5=zC=P z3PLKcDq_Jg65l0Y&Zq!b0S~>Yj$jtjd%4#sqt=cJeQE^2rf#G(Wd)J3^Nhm3#|AcR zBZezRfd}@j!owrhN4ZR+d|fjjnw}{KBynvnSVwDBFge~OHPz|JAPXqUFb(3?%Ghv{ zld!SfDZ`A&))FncTV&+4(M!|`W3_2+EIE*oi{hUJ`CfYXi=#E1v97B{;Jk(2lcKg> zIFVPK4gbUmOg{BH5i>wut+;;Qs_)^C<0jPZwX|Uk_KFeBLUbyi&`t9CR`k33wKiuUKQjJAkx4((9uAyP7bU@FgWGoklCor|$%hnJ3+w;L`pT%b z)+Ss6!Ci`53xx{S;vQOxw73)~UMNnWxD&jF6e#ZQF2UW3y9Rej@Zj8V&iU@TYu&Yf zvHxr`@96W+%!5sAf(?C&%8}yIYD6Bw*hpsU=3rvFPG)x*iaiy}>A|&?VVn+2Tr%n1 zb`D3-Gj$On__LVM^En3HxyZaSN%=?T6+r@}!VQaLjk zGEs2M-5~dYXYol!)&*|w<$eW)FeU+YsD;2iVSE?+`S@w5m040<8J$e{C;|+RvjDm@ z?hcS=CfFCxtYpAHEBX_?LKz;JL^haE%=(QQ;Y6B=h6K^f5X0x=)WS3wPOe`uzuX>+ zb28MFz<_&NMFC9>$Tt9R@Ho;8^m&mDil{fXpHrDs!_o|Y1dCg23Nt&nd`D%d2l!;2 zXn_LMmbo$OT_n)qbx1~`l`Qhxrj3YbUi4&o6dTv0r+e;sj96*&4CZ;~W&bwEzE*D~ zBs0HV`l~STR;7)7X%J#@I?cwZFc|E7F@E&e{6vJxi0=Mtrj+@KYo@+dsvJ9JqU;*i z#xu7hT#7ApU-?0^u|oMYLEHGs+Cu_&KGvGMDCv&j_=CDhKj$ePTzA(Rn6H?Ll8 z$0GX#$B6(z#5cXmVXGbiNCE zEA^S2`fOr&r0L#XyM_nKa+tVSEwxHCuvHV74SJUaVzg=>A0H2B-eKdC$_sF`lhuYW zp4wQ_JxI?!@7Xe%6J6S-inCOF%JnVcK0W^R6>g@bp;a<%(XA6djO|B5mKtxXzC%g_ zAmZ2kV?VwtQF?ubCz%v zhN{F5Yvvv!v}+%4PKcL4nL}?^a0*7Zpa|Q`WAxwLY?MTE?$T)^AyXyQC46qa+?lw`dE_ zNbilqnlGM#g8>EtSF;Tdol6{;@81JZ1;eegGxuNm7sSW{HX zzHX3dzjmYzK+asa_0BcW<@jDcz7caL8%ULS#9wfPvzp0lyT^91cRftqs17{ja7vB4 z8)V0s!`=6++5s*mBaDv)t(V`uR7Q+7x_kQw*4H?k7(g0}()Ruu4SeI>+!S3NNL&i) ztS@HHV8)L8Ehxe`jb9)LdWp}MF0Ba#;%a=rt%hl0rQVb_qjjfTE)F`B$DpTw&zLICLo|fF~+A?icor0Q!=r3kuH z7Cu(L;@kO3RP?Ea=i-W3*A(EP;_}n>AteUksJEh@lEC$@tsVfJFPWgvpWn>BD05|c zjW?iMg*7-Z`hnUzfV}W&`Ns)j7PCX_L1-|V6X}K7s5L;w5BKne8AlhXCgB> z%QbQ1GA(o^J6uIHp)KL;8J{P+?bWsN0)B@Kj40ReE6b_)femzRGJH9PYUvA!9NWR< zo&d!6{^pU-<+?Y)`;UYfsts_9{-1}Eu4rjg1d;Kg{!3VdRuy*MZqlqbl}4A3GhM$D zcNdvRIZ%M6o6TD*nyMea5=g>iJitEfM6;jNwgzA6NoYR%3=!@jJA^nf*>fehltWbj zKTaCx1R*9k)JR|`P~6C#NvO!=!$b-qD6qbGrT1}d`x0+}a_?t=M?_hfZSaF=veO}$ z+kbKj4}LxXBGG~9dsD>$_(S5vw0t%=vHBvB)zRm9LKNCnpT)03$iIblOlZ?j{6woe z;@(mY|1KI|{gQ-tbWYKTwvKo(n)kfjxzq=b!GqZU&;3B4Yc~w16!!HI9(r%8UW_{W zp75-WN|Or%mMx0ggnU6_)y-`^;lvm=7KAgxq8;Tse`43sk6a?Kj^&macURcjAY?Z8 z8ksCYsS#EZuit8(qPBAKr~KZ;OM*kH;st6a2I)^bMnWPCj#ydm_ye{JE=l~{*Kw1y z-T{d4!4q%VMrJ=)bMv^~eI%?yb2M3jupI;`!W6{-nVN!a0RBxW7a263D7v3&ei5eR2OA^2V5r_E@yl9{4{0usdi+i zpWVRGuCbwEWn*hcjOR#&xP)jeP~rWK@x6z+`n2@zp6Swvk%GcQ!#A$a<-c!AJ4}Cr z7hyU(Cg7`(M_n8iti)}3P%XI1aOaI@3F}?8{4fzN=c z;~?m*mNo#BA*CCm1>9et&P#YbZQQr}1#^yxSG34CIdGY{_6@yQOs!=#O!vq5MAp*; zVNxxp3c#Iex*EtGl?2Y77PsiS6E9)fxf=Y-Kl~&Q0*od`xhifZk@?(z(phG_1xKW~ zO7SOt_9ZhtJ$jY9LE^%9%)Coe1O)oyd?6stv&Cg zfZR@-Mrd^(Z4*GqMSUI%BasOUd+JkK2MjA@Wk9Cnk+)6j!16ZUJl+RCkXkES1R*Ow zhOX8hO2x!S3U`MX+cWvO&TEQ@UkdThvnl=1>vGr)SZq0b1%21pvo|uHt*C|V&LZtz2W^_~ zB5q(w9&3!k&gjZCJK(Tw3<(R81&2M(ku1w` zZ$|wF*mspedCy)M+cVW3q<`Q#P%-|CSFk3zJ~hyK-6d*n;Fa}9U+4GVWoQve15MQ5 z#lsY{Do0Pnv4Vs;xoH~4p-j)MMEz>^ixj?f2J-1I3woGg=UE4)#!~cF3oIkP zUejR*7esMbVRb+6jx9Kjl&_SuW0h|c=W4vSz|ez~=?fZ7*HZsF^(D@5@Zla!C)3H@ zHSu-scf$<~{q4)Glo0I2TPn43#ED9)%<~D08xl+yH3l1zU+Gz(MPJvh{~e1fPEqeQK*$ zVN60eN@AC+(5nRN_g^Apj6^C_P8!K!q(qW8_Ry~biX#omOk34^PC}2oJ?42plAG&`B*SKK z3%rue-tOVJ@!Wi~@t&o)s%)i0Zov&oYlGQ!hRk+4CYNx_#_wpuE%_fO0Zwxw^+Rri zZ35mRMnf3u&}V1D$!Z$S{n&=N*JDVtcIVngG+gQt9^Wkox8s@IXC=a8#_#p}K<~sE_+%P^CD1-51p~oScLXOq1;x`(P6sMYkzyY2<}VK7a}q@jlvf6eonxS8Ko=6P}-FnJwDl< zz0o}RVX1UQ*3H-Eg_vZfWm6i%fC{f5@MlddCLl;cCvLe8 z?nUJ%{b((=H1*xoO8$7X;Kqe$6HjD1s>#cKd{8jc9>_`f_i}sUnxHq#4xo8lkuK9A zGEy~e91)wm)=6y-e7?WM{mH&`YJq*#my{WX0ULYJFU|4l!$psvYpA8NJ#E#QvJ4dhGuXN)3k9Y;9B4|; zm*P?M(+ahb#fOFxk}--4)a9trfTExj0Xo|lQOnuT{78jnVT8|CWHWs{PbsVn5E=O@ zR7aR$Fp)24VnU;LXeb!fUavxU-@Jd^zx5VRQ;3W|3QB`DCw}eZmen<(r5Jr@cmR zX1dDA#JX)+vPlXwPxU71_JvYMuE`$)>^tRqpvw!|qHaZuI2wt39;n0F{G7zA+$i6$3-~*U5LkDuFbDZw=(6++AIw=Y>{xvfj_K1} zk< zOND-t-zNjT!Wk(@tlzUap(L`H9KHEgV+B~Le@=Z+HyWAfh5??ddIKj^up>m5O>j_* zHS_NkKDz|^u?XTgJRM!wrneYcf5Uwj#lPKK3JbRy2GeL3uDAVw$sb;_s}t!A&+%D@ z{5m~vdl2`ZXq33M#=>e#ZBfd;%!G+^vHyO4!_ZiFH%)ChXv+}tva~q?lijZIma+%< z3@)cAm1=V~J|vT7R+S1K;ifA48LZJPo6*&2$D|k-G6csUPUb~pY+eTPg@^a#?TIcI z$QlG|{=5rPwEoz>-D40W-cXYner+(*V2$lxVB^9)Q)$g^J&B?hU}f)k7bjt@9p14r z!8K^S8bxgUw^m50(q(k})!}@tVVgNZN#?*cGGTFiK2VA>p*h!h1gc%7vOStBc_X^T z&G$20!_Zy1fFI~<>G}Es);ruN((L#}5?put_*>z33B(N5*XQ3OK9yp5P^#?vc?Yz; zDw|5$G#G(*vmeTgE>Xqdr%@Sy7p(Ck9|!TDaPbHp5h=KHs~~TJk-wKWpiv%DSl!fe z^78(#h?|^y>tniu6)RnOd+nHPP@+@8eQpHsc)IU&{r5qxPqQG30KGT<3`wiu5_i-K zU#F9|Pkfg1j?S#LOl*bxe*SU-mea-!T8uWOCEc_VLWbM&_QXSy@J-mf2~7;{>A@bC zzVzkdq~i@uN3Gg&#rmJ4Ng<~OshlEK$tD4sx(KIiYtz5+&hssNwEb@h}aGW@-drGXQ>{Ign3 zJcmC)OGpOMu^BrtV#STU6;Z8S7H)DjF9EvMjKViuSBZiLc|KcR5J!v>R9pA$u4X^{ z622~^#SFg%-?>z;V~sS_?Rxt)U|Fm)hcbeOd_8?S%zy8_?T;Z$H&fhK|8-f$p26sK zGm0IO<@vqECZYQ68;@(12RQW~H0Y&e&-`=^s{TUVWqiTov)1khZ0~I6Dnh;mWUhR; zPN@H2RP{m=n6;H|cYU+e9HN|pqF-%3B=I_27mo;|Jsvjnq`kXZ`2am`+gg4h*5bDI z?qU;$yUoqmk5m<@Rv0kmtee6#QU#xGF+nj>>OBd>+_we~Cz@)@XO9gg$`DfbmqfBo zK`%#>Zd>Xqg&>Sy&{zO%)2UuK$_tKkdLCCK+7-)&(BsW{VcMp?pIm9&1d6ML?ZJwo z)KK#6T-TC;o=oNDz_}AMInS{ab|bDU3W6ziiPgpNm)rI?!-{1>0`IiS;1HKVD7 z(s(rbGWa^kRdHU}t|_5Dk^a173O1Muzsb>|=snJ~Ybl9{kH^HNe!JqgB`LxR`%twu z0r>BV95u&9g(_JMxJ+w^%l{D>>Wwm9m8}7j!^l89Mt*vXFbBbShN_cum=RoNHb>k3 znBlgLcWkBerJY|%PbwB6u{E|LYHXX5q27V(`V%2-M{y~NG<&#kx&Q;IbOpp{efkP# zxNpe6nLU+gD~$H%=H7Nx_;MroHrReky%dxS7Ekw{hL4o%65ljnC$#3a4X!Z;v3Q*O zGw9Z~9{%JCI4V`}m&zpwPM$w+4H$00%T4xXtU`DJe?c!CF2Lt+@;-)Eo?yO1LOC?v1XcQ3{As!N2k-K=P$|%Y5yBDrkx4B+@91Zhk5*J5ptP z;zBg@)a(E&Yi}tbKOrj37*f-1D=Jk<1WVJ5&0H>H@p#j~=*`Uam{jCcgi_6V^4<6j z$CSggZ4ECE84ZTh<=C4;emYX`t{3g{@n!=PkCGZd zsAfWK?L&UWSLUGlSKhIwo@%MX&)Qk0=Jk-0W|JO3+AmF(8v;^D#j$=0g; zVatykix6{Ce)GMZ`VM~_MXY2KxwPb?Qo?DE8k0CCewnYa-zE=&5+p~R=GI%ddZU)) z$opw#Nu;9$^wE-3{-F14WJExeZxVM|nPuu$a63a@&P187%Tu`5WB1FC2p19WEwa0c zE>ijB-wW8z0z^l>m?mpTQYsmC8QS$`LlVLlFW1e#z1_pYn~-%M?yAx+V!;b=ilR%Y z-UfcF9$ujE`kZeBfnrSPU?9*f$Q6cgDYr0}@D|@CawRzDHYSu+&Nf`mA4v)N?E!DL zGWXg^^@##F2xzGoXo%FCU-}Z(OMk6pgNG#a9GpB91uq@|ky0^l+ocIqZHNN6$yAvM z=J=F?^ngO9=*`B1GIvgnnkdlOe^RrfgcL?o_ETWW^L6Kz^=CHDRJT76K0_*ytwJ6R z{jn=j9W7nZAIiOblAzY$v&Hr;K05RVUP#L(NB1yJuMDR(f<;#=qZx+Ol)Sejl70+% z3NfgZ;-oB~4uzr}zd053CqCfKcwYC`{>~9||DENyesR5^cfyg5;4}fVYxNGQ{83$+ zjMi6N(vM&Y_NS|5^ceqCt;VBbM27#(!DP2}iTD25baM?_lU|=K(?c)1(R0X@(f@Ts zC~qx=m*i!`-a9Z9R6xz>J@~^p&W@fuv{FXXzg>9F3H?iv`m}YoY;wR~ng}>nEDH%3 zR1Y{(%N?EiaXxto_WDi8Bbe~9^gAC0|I*Ej((Kh8rxHYSHVuqQ6I^<* zVdM%**RoaX=q0!j4Kc(8q0=69hN0(41Dp8o?2(H-05r$rG~2`+8(cC5a$>{#n^@mK zT$SgE*y5nTs>y$`!HWmSaLXFa`R`9h#rX1PJf{ck*=Cs~#Gl~={;I+!b1%bsn`H?~#VGL>Mj7|dr^396pQ=GM`6RM0xM z(F|{`!!X|{N%44k4(_d|m3LVjB<_vQN{d;Gmop^ggIwwrA`o@&8 z0vp=NGM@@k5*ZA-t40@Sv6GCxTgpgmk2BbAq#7n@VE-~`^&4;YadsZW;&nr zX7FqV;8VbQIw zn&r#9RLI?Wo+6>FQKi!z-b9887q7#<8M9*8Uq)LGY9B4z`ip!zp3>H2Kw|=EoIOSm zq{6pT(o%`Ei!w=WYaq`X;P({#q_sxOi8f+#4#!oJnVXE;mb*Ca(MdAnq|2;D+Jv-? zJ|Rk?lgJZchlE}_E~>$&y$EJv)mUgSaO0Nk*Xz^#U}C@L83;wjBK64WV=*SHq9Rx& zUeSDhCB%%cL7_5^+>WCbG_1E8h>9#sclVCY6jy$qAH2bHT+b5moI+t}N7wKtuHBGR z=@~G6ZBy|T=yCmPmDFKh{fy}$yh=FLDE}|K3IQpgpF2Tv!@V*P z#<0t7Dk)Zf-M%1j)hga!+#)JyYjX7t-txNuE~7AzFw56F!|HwQ)K_0!2bRtRF@{2! z>hZDU)ptkpOg7%hUbqZqDl+taFF!nw&X4nXiFdv)AM$co{EkFLz>V<|=|4%JCqJH~ z!ih_l(@qwOxvVWtT?U6TMF{8>G17;M_@8XY3AtU?lOEn-2tM5E=<0WNvA63Ym(a#r zF3^0#CzliF zJE=Le)cvIBdQ+FZ5K`}~CX8b+8ON%PVlljQMjPvu`N}QnFwg!kD60(tyZ>t|C~L`j z&U0J^FB9aY%24sV+nSgqA*ai3Uj4iZ&v0bL$W|C<{)%aZg#s-`p+7AfrM+WYc7Dcb zsMAbkReHemUINEL&!@7GW815Xt)}2CyFpL*g&0Ow2AlKE2d1}bZ|L`xh6BrEKZ5O3 zn(^D*ou0VJ0IXxz$a*IXIT*8)#e|0#2J8G?dv21eW++(D04~x%g=>o^^sb{8LRN=3 z7iMF;+UAi!ZzaG8|YJlSTpAz&@)!#g*ws#&AIGK$vPy<$p&Q-s@8Ub&>Xj`TqoLm$Z>$oSx0j07sJ*`OyiEgj6x-z3HjhPCUr#8AR zSd_PCba#|pNm2<;$8Xu0PAoW-X-~xP7K7Wadb7kS`4R5ar;w{9*^yOX0JP6=c-&A40BBHx~xEY|L}N;_YCI)Q^$k&g7Q3ob(5Gx2Tj;SSbXGBQ}YG9yws zOJT}&;ld4jo?!nrcYqj-Jj~ffubf)sT%6P+^(%l+xRIC7cAhk>W!Xw-|659#&(4!= zpBtk*&6dYS1~*LTXW3=oSyXe}41TQylC4TK1N-J2Rb})CSMz||LsUwQO-#{GskF#l zr{BC$+bgeYNZGVw#}-}eXoX25*csapsuog@(HNLncpDZhI4q}7-MtPhQ16I;Zgg`W zZgf*HIRO8u6gK9frwfOTK?|k#Xy!`z(q?NILxYa>i!@!nD0-nVfPnrf$8Wr$pBd4Y z-xcPb+R$4LbZMmU9eQcmBsFNwVqf z8|v)c!R1*$My+9$VDw0RO`uf2j3;zEHfn#>ySKb=4c<)q>U5pI6&_d!_W*LyI8yOR z9SFnrvIfW9Fmeo=+U~vX&-s6vx5AH%b6YlA^L97l;ufq%4pbhdGEqgY;X_<*KCMyy z_wOolJj|_-&69dFjFfXayR8CU2Hr7Fm{#RZ=~U3YONmk-|$azN_*mgvezfxwbi4 zxb3$w#3IO#{s@NV`Djk49cP{X{Yxza?7A<}xuCSh#eNjE{6Be__5;pTcK*vY7Nr^g z^ai&+KO6}_N;MViJr-?w@wr&cjY`S`UG~le!x&R!tulN^Orp=r)eE-c=k|Lbc1I8o z$R<@+0OH8e6uquDAMusIs5og)vu;v=t`@w+P>TKW$=K_S*r&)Xo?-_Fhsj($zAfMY z3u=XQ%$F16vqs6s>?{l!CTqeF`VEfoZ{Gr|Pqx}4by_+Ws~AXP<2soo=%lXdpPrQ4 zaA0iTH0o(rZyOS!*P{3$FOa@vK3!_sO{R}I5+#Ypiw**-7<7#$BQeWt+9b=o?pn$m z=P6P9pUldXkX`Jot^ReD%fqQH0mXDvQq>b0fLRNy7N1E6N)G!^0{phFUeo*#W*raH zbe)D#vz{KASl!t2<-eO!+=3qS*#Cc!PE%7gniGs-wmx}-gCFjH7FV+C%XEi^yS>J_ zQ%4`fVXbj1Opr#^aqcBxpDRk^s?~;|xJXWh^-btEuYEb+dwTEsl{25b?4W>)9wWNb*lY5%EQ`H( z%Xy>YxJu(T<<$1zAjg&BS6i)ysm-|M-}}nkH$J;vMUoo}$k-ZI8gVr`jK4cvA$NVN zR=rzB*>;IHZUk)h{lc2^gt11h$fVX?{H-_Z)8f-4Vbm{vGtE*k&F1x2xH=ZN_`Y|;*f@N zOdBB6Yn=bRVa@<)^9@|=KcA^_0pw0yA(pZaccN1tzj~EIXUR8z)5UCyHE~Qt0OiL_ ze9?mY8J~GtojJ7JGItEU6ElJZ%{;WpAGJ_;YlS_Tm5SNk2T`eRG!~uzOiV7YND<%Y zoH)w=+qbsS==!t0w+2&;aDF_qm_I3Pq_Zq0tIJ5i6o^c6xPKJbhu})jO+3kEUL6Ja zzOo*c^jRg^_SwY|LZq0lbp94>kHa-=U25^dxL3GlWU1+qs{Z7>QajAn;XCfzCbo^6 zgfEWIf0)VWh6i@v)f9+FNSabFTrNm&FXl>O(^!mE5Q+&{l8K4zC~dR(T(9+0GBLEeJ0Srzo#zeK*>m$|Myaj zw_pq15vtGi`Nk9=$!ySSq(5}=e`ywFnl9sm=X-eaoG9{CYe{d8Mgz*62j6^q0}?<@ z)wm&(?MSkE9A5B;B6HF{`PEw0;cEYsug{w=BpER~5Hc_Um4fJh3k29Va|uuCSPw1h zRjqGQ7;%w7sQIj0R{R84vRzvOOo4VgbXy&b2*Wm;&l|b?#XJP0l(?$K+r&yF41T6p zaHqlNOjwqQQ&OSb#mv^jTw>#C;1hw7tGv4iKeipz#eSOcUf4w)xzsIKPOb#&Isaa3 z4FAiSqU5W?zh8%2c}+?KPxVFpZYJ~Z6egU^bD}_KJS2Jorprz1u1d{^)-l{crteqs z;M`MS<3;38;<}@kRQ5`cq^jS*p)*l{BjzsY@0Fy~+ll_3j*z9BKDNord8&5*RCbWp z`@#3KvUiP6^P6WvDQLJK$6T_$t~+LY#k1<49!?Ey-gq7n@d;zo=bF^(wp~cB$N-KY(>JPJgjD~Bn2|5?zia&TLxs z=Ra^n@c|rR`@{LrHI|cKnJ~!glN7dyA6767*dTBOtxksL@aFb z6>};~CMo%^{9C2DucKKFEi~$`fF-Q5{-q3IDqqK22J822Am@8d9gG7kePa9=TTmGd zk#j+j6v-tiiW&%?zXJQzTcp|+T^MJi@5b|*a>9irVrcL$WRWV|&(=DoZGPMHZq$3a zy{fPD%?VeNwzbbxad`V`d`lZSi*nF+*KmJXZc&DZ4x*|99|Eh1aTEd9AaZ|!Xluz$ zFiWGfPil!(#t&_)Dp^z|Af;=V6_VnYaHcBHFx$?K%Lc&+Ukb16`&SnJRfG~Pntn-@+5;8+Z;Fd>W~aZ9u$Z#^cry^XC`{h%aZ zE@YXW!~*j81z228>lT!~dE*GoHr(yKhP7$Nvg0iVP6C zjGsZh1Lj15X8%|Y&i^(lk&{)`S*$<1*hM%I?Em?ZGv=B0A+}?=$oO`YpzejKdZ0a) zIWmsDZMihi?N@i`%+^rPVgOPi5o=N{ z(s+K8(7p|o(;o&PgMs?Q=O4T-XM60sOeCe$=yOob=+@?X_OGvgnwyO9SIM>BY&1+2 zcQ$Uus}z3y0582+uu*cBY2MUTbyUiq+~osfm47|D5yaJXc+EQ^NS|4zF8LUwBnwh% zUdd%;6Uutr51`{CVfe zOtlF%A9#vB6RH)$$5+ih(qvAY&=(~NY!F_r4EN$25~bjY2o%=nsg)e|%Qd{Em?y)P zcAQQm*Vpk|E!DJ!h&F63UL?#MJq?vi&>14vKf6-3^ zRN0QCX&#Nddi~?cb@TWLA&gIa$ra%_IjK3R0Z_cIUu+Swb#C(LZ)(wkH_dL`HUvgY+&^6?(I*3TcSr+bP_jiv-LjtVIt2axj)ioNyTPWa!cD( zy{Q}`t$lppjig)O1lx_fuYvaiO3a(zrS3Jk`qJ=Nl%aHM^uVk?d2-^+;RA|<5WvaF zB~;rwpR9$k^~rk?-Lkf(smA(GO)~z_nd|j&*OWr-%6@eMaA-=gbg4|~ig-qgXe@o_ zk;eiX;gGFOu($kpt}D|{VSmZl!L;(#K~pT&$t1iH-cNs9o&-cR-{)U{HnMj7Ng(Ob ztF*m;R|5Wm;W6UM6v@jBK|{yH3R~H zMs_?$$GhG$y~Ls{cAHS7)1Yc)T~LMO%NMW0t@Uw!;pr*E48~pKC@X*5j(ZSPi`L>= zYNb=sQD&ETm_+Y0clLV4HOjfJHp|AKQiV&x7~=K%)?N5!+wPI16Z=$IMuAdug>s#Z zwdJI#ZFWMD?RR{yfIkN}NxsP}V8J~=t?@3rr-k#?!(F5GxDX3J#H~ z=$|d!Dyt!?)ma8_RoHU%*L{#P0(j{f9h{Gz)EOVbgUDh!BHMQsj*VD@`Z>0nk48Oj z)mr}^$mnf9Bb?9G^Bh_7&^lpdB^!hK#3y+ie^1Vfz1MguG8lj+-a_vAAfV)@AjqOl zWD+(?KAyYEvXk!hZQKV+uR37a!mHHtDBam%2JP zoiNUwG^ohX!#+?draqHwFxD8oaCUwtljQKr#&YcA7~1WLFupTQl_?2GSHsq?3TvOM z{(N?k6R!rca689!l!&#%^$mGFA0BkI;mkQQtI}vlkNGP{@?!B*7|=3yGXXx z0J?60x~IUn0LCVPbZH!BlE;9}G}i@cGj#>W5zzw6{;5HS`+)F1mU_0!vCuD(dAn{-M$y_v z`_G|iPA{$I2D{7Zm$AK4zOKoqONdgZZ`WqRh)Ca&HsS<2(0n`QNDMnDVD&W>XwSr! z*n1np3_lWvkOBknv-Al>yv4bE}1a@0JKD2`yqp0TY zjJ%mmkK3Dvu-*K6ddTTE+JGb^jL{`Y2_Y@OGv%(G|{Snru!wN-FU=Y0NkeDx*sIjI%VdpSwk2(eqY5{%C>I zVXfErc(4uk`BH`UC)$totcE{hi(_UTDfO4){6_o3X(Nr6+ zP*4)edVhDj%Cf;-y7<_x`8W@2i;67CRjmU#>zPJCr;$Co;H_32zL>fe960~ly;)F{ zey-$qDSkpRHtgaSF$L4lxSqjSY6IUFwJdPQ#?HmyRo#+!Aj!|GumNr}4RHUnGa2SiKP8H&Jp2q%JUuiF9Z8NL4GvC`vtQsoA%kYGv;^)0NOs5&v z>(+pBLP?}wIpS$;PyWgly!>Fxa}wrg9PY`(3NzoHW<)Lv?HRi?9oDx=ZXr4hoKl-4 z_Z3}Ly>*E_UaX`I>x__bbZF`5aJ9I5Rfyf3(y1kI#Ht5R^(MDmxW_t%H~U2M@$vP- z$l*K3){as@k{L(z(=>$eyuP^OOn?%kxzL|J1P#5Mq>S0A@9!g#i7GbAGg$olgu#sL z581I?gx!RG&v59SSLJ4t=$~=c%Ur51F|rvlU1`QLa}hM#<~1m(yE=9q^xVSz5zO|} zJzr?u8qf@Cb(LM_dE8p0Q-~Kj(&3a@x**0Rb}ug5W_RkOTKqA>m(*+U-y}R`dqKIEbFXKh{PJ3n7`TTrUx>EDhT$@YfDN2EeV_(^*%&9qqks>gxt5- zuXbm0zFb~O?sl0ZF&qXQJ%mhL$VFd6iiEh=sH0=YB}sE7Gi6T+Mr$H}CHx2-hawkp zW;Urg-Fwh-lg(AAk;|0gOqREZ*JrVSB1>hz7OVB|CsX>NC~0W#lbSszxq^;<>$*2n z?l3v2^+8|1cΜ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 E0ElTWJOBUy diff --git a/src/images/register.png b/src/images/register.png deleted file mode 100644 index 6e1ccb55f6bab688ae9e8cb327646d1d2de9a952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258564 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�ycK)$a@ji^y~^9 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�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 Date: Fri, 2 Aug 2024 17:42:55 -0400 Subject: [PATCH 155/199] New CancelException for syscall cancelled by the user --- src/rars/CancelException.java | 7 +++++++ src/rars/riscv/AbstractSyscall.java | 4 ++-- src/rars/simulator/Simulator.java | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/rars/CancelException.java diff --git a/src/rars/CancelException.java b/src/rars/CancelException.java new file mode 100644 index 00000000..9b71a036 --- /dev/null +++ b/src/rars/CancelException.java @@ -0,0 +1,7 @@ +package rars; + +/** + * This exception is only used to trigger breakpoints for I/O and other system call where the user selected cancel or equivalent. + */ +public class CancelException extends SimulationException { +} diff --git a/src/rars/riscv/AbstractSyscall.java b/src/rars/riscv/AbstractSyscall.java index 2ea151f5..4bf9b4e8 100644 --- a/src/rars/riscv/AbstractSyscall.java +++ b/src/rars/riscv/AbstractSyscall.java @@ -1,7 +1,7 @@ package rars.riscv; -import rars.ExitingException; import rars.ProgramStatement; +import rars.SimulationException; /* Copyright (c) 2003-2006, Pete Sanderson and Kenneth Vollmar @@ -137,7 +137,7 @@ public int getNumber() { * @param statement ProgramStatement object for this syscall instruction. */ public abstract void simulate(ProgramStatement statement) - throws ExitingException; + throws SimulationException; public int compareTo(AbstractSyscall other) { if (this == other) return 0; diff --git a/src/rars/simulator/Simulator.java b/src/rars/simulator/Simulator.java index 27a99323..6af22544 100644 --- a/src/rars/simulator/Simulator.java +++ b/src/rars/simulator/Simulator.java @@ -493,6 +493,10 @@ public void run() { Globals.program.getBackStepper().addDoNothing(pc); } ebreak = true; + } catch (CancelException b) { + // Reset the pc in front of the instruction + RegisterFile.setProgramCounter(pc); + ebreak = true; } catch (WaitException w) { if (Globals.getSettings().getBackSteppingEnabled()) { Globals.program.getBackStepper().addDoNothing(pc); From 2b1a6fe746323fca3429174edca28108df6e9e41 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 2 Aug 2024 17:48:06 -0400 Subject: [PATCH 156/199] getInputString return null on cancel --- src/rars/riscv/syscalls/SyscallReadString.java | 8 ++++---- src/rars/venus/MessagesPane.java | 8 ++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallReadString.java b/src/rars/riscv/syscalls/SyscallReadString.java index 718e7b98..4d31f892 100644 --- a/src/rars/riscv/syscalls/SyscallReadString.java +++ b/src/rars/riscv/syscalls/SyscallReadString.java @@ -1,8 +1,6 @@ package rars.riscv.syscalls; -import rars.ExitingException; -import rars.Globals; -import rars.ProgramStatement; +import rars.*; import rars.riscv.AbstractSyscall; import rars.riscv.hardware.AddressErrorException; import rars.riscv.hardware.RegisterFile; @@ -53,7 +51,7 @@ public SyscallReadString() { "a0 = address of input buffer
    a1 = size of the buffer", "N/A"); } - public void simulate(ProgramStatement statement) throws ExitingException { + public void simulate(ProgramStatement statement) throws SimulationException { String inputString = ""; int buf = RegisterFile.getValue("a0"); // buf addr int maxLength = RegisterFile.getValue("a1") - 1; @@ -64,6 +62,8 @@ public void simulate(ProgramStatement statement) throws ExitingException { addNullByte = false; } inputString = SystemIO.readString(this.getNumber(), maxLength); + if (inputString == null) + throw new CancelException(); byte[] utf8BytesList = inputString.getBytes(StandardCharsets.UTF_8); // TODO: allow for utf-8 encoded strings diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index 1a865a69..c3ad570e 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -518,12 +518,16 @@ public String getInputString(String prompt) { if (lock) { Globals.memoryAndRegistersLock.unlock(); } - JOptionPane pane = new JOptionPane(prompt, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION); + JOptionPane pane = new JOptionPane(prompt, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION); pane.setWantsInput(true); JDialog dialog = pane.createDialog(Globals.getGui(), "Keyboard Input"); dialog.setVisible(true); input = (String) pane.getInputValue(); - this.postRunMessage(Globals.userInputAlert + input + "\n"); + if (input == JOptionPane.UNINITIALIZED_VALUE) { + input = null; + } else { + this.postRunMessage(Globals.userInputAlert + input + "\n"); + } if (lock) { Globals.memoryAndRegistersLock.lock(); } From 7ddaa7e6ca3bb3133fb07d4236dee8175a011790 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 2 Aug 2024 18:00:12 -0400 Subject: [PATCH 157/199] Implement cancel in some system calls --- src/rars/riscv/syscalls/SyscallReadChar.java | 10 +++++++--- src/rars/riscv/syscalls/SyscallReadInt.java | 8 ++++---- src/rars/util/SystemIO.java | 12 +++++++++++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallReadChar.java b/src/rars/riscv/syscalls/SyscallReadChar.java index 96ef5bf0..745e3273 100644 --- a/src/rars/riscv/syscalls/SyscallReadChar.java +++ b/src/rars/riscv/syscalls/SyscallReadChar.java @@ -1,8 +1,9 @@ package rars.riscv.syscalls; -import rars.ExitingException; -import rars.ProgramStatement; +import rars.*; import rars.riscv.AbstractSyscall; +import rars.riscv.Instruction; +import rars.riscv.hardware.Register; import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; @@ -39,8 +40,11 @@ public SyscallReadChar() { super("ReadChar", "Reads a character from input console", "N/A", "a0 = the character or -1 if end of input."); } - public void simulate(ProgramStatement statement) throws ExitingException { + public void simulate(ProgramStatement statement) throws SimulationException { int character = SystemIO.readChar(this.getNumber()); + if (character == SystemIO.CANCEL) { + throw new CancelException(); + } if (character == SystemIO.NOTASCII) { throw new ExitingException(statement, "invalid or non printable ASCII input (syscall " + this.getNumber() + ")"); diff --git a/src/rars/riscv/syscalls/SyscallReadInt.java b/src/rars/riscv/syscalls/SyscallReadInt.java index 576533b6..994d097b 100644 --- a/src/rars/riscv/syscalls/SyscallReadInt.java +++ b/src/rars/riscv/syscalls/SyscallReadInt.java @@ -1,8 +1,6 @@ package rars.riscv.syscalls; -import rars.ExitingException; -import rars.Globals; -import rars.ProgramStatement; +import rars.*; import rars.riscv.AbstractSyscall; import rars.riscv.hardware.RegisterFile; import rars.util.SystemIO; @@ -40,10 +38,12 @@ public SyscallReadInt() { super("ReadInt", "Reads an int from input console", "N/A", "a0 = the int"); } - public void simulate(ProgramStatement statement) throws ExitingException { + public void simulate(ProgramStatement statement) throws SimulationException { try { RegisterFile.updateRegister("a0", SystemIO.readInteger(this.getNumber())); } catch (NumberFormatException e) { + if (e.getMessage().equals("Cancel")) + throw new CancelException(); throw new ExitingException(statement, "invalid integer input (syscall " + this.getNumber() + ")"); } diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index a595e416..a3065eb3 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -81,6 +81,8 @@ public class SystemIO { public static final int EOF = -1; /** the character is not a printable ASCII */ public static final int NOTASCII = -2; + /** Cancel requested */ + public static final int CANCEL = -3; /** * Implements syscall to read an integer value. @@ -93,6 +95,7 @@ public class SystemIO { public static long readInteger(int serviceNumber) { String input = readStringInternal("0", "Enter an integer value (syscall " + serviceNumber + ")", -1); // Client is responsible for catching NumberFormatException + if (input == null) throw new NumberFormatException("Cancel"); return Long.parseLong(input.trim()); } @@ -132,6 +135,7 @@ private static String readStringInternal(String init, String prompt, int maxleng */ public static float readFloat(int serviceNumber) { String input = readStringInternal("0", "Enter a float value (syscall " + serviceNumber + ")", -1); + if (input == null) throw new NumberFormatException("Cancel"); return Float.parseFloat(input.trim()); } @@ -145,6 +149,7 @@ public static float readFloat(int serviceNumber) { */ public static double readDouble(int serviceNumber) { String input = readStringInternal("0", "Enter a Double value (syscall " + serviceNumber + ")", -1); + if (input == null) throw new NumberFormatException("Cancel"); return Double.parseDouble(input.trim()); } @@ -174,6 +179,9 @@ public static void printString(String string) { public static String readString(int serviceNumber, int maxLength) { String input = readStringInternal("", "Enter a string of maximum length " + maxLength + " (syscall " + serviceNumber + ")", maxLength); + if (input == null) { + return null; + } if (input.endsWith("\n")) { input = input.substring(0, input.length() - 1); } @@ -199,7 +207,9 @@ public static int readChar(int serviceNumber) { // Need a popup? if (Globals.getGui() != null && Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { String input = readStringInternal("0", "Enter a character value (syscall " + serviceNumber + ")", 1); - if (input.length()>0) + if (input == null) + return CANCEL; + else if (input.length()>0) returnValue = input.getBytes(StandardCharsets.UTF_8) [0] & 0xFF; // truncate else returnValue = EOF; // assume EOF on empty string From 591455724e21539e9890258dcc6eb13a8932ee91 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 2 Aug 2024 18:00:32 -0400 Subject: [PATCH 158/199] test.sh: pass the arguments --- test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test.sh b/test.sh index d261df54..ed5b913b 100755 --- a/test.sh +++ b/test.sh @@ -1,6 +1,6 @@ #!/bin/bash javac -cp rars.jar test/RarsTest.java -java -cp test:rars.jar RarsTest +java -cp test:rars.jar RarsTest "$@" err=$? rm test/RarsTest.class exit "$err" From 7047e974a152812f50412b1c61e1310af0e91723 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 2 Aug 2024 19:02:43 -0400 Subject: [PATCH 159/199] add do test programs for read/print int/char/string Signed-off-by: Jean Privat --- test/loopchar.s | 14 ++++++++++++++ test/loopint.s | 15 +++++++++++++++ test/loopstring.s | 24 ++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 test/loopchar.s create mode 100644 test/loopint.s create mode 100644 test/loopstring.s diff --git a/test/loopchar.s b/test/loopchar.s new file mode 100644 index 00000000..e1bac936 --- /dev/null +++ b/test/loopchar.s @@ -0,0 +1,14 @@ +#stdin:10\n20\n0 +#stdout:1020 +loop: + li a7, 5 + ecall + + beqz a0, end + + li a7, 1 + ecall + j loop +end: + li a7, 10 + ecall diff --git a/test/loopint.s b/test/loopint.s new file mode 100644 index 00000000..b244677e --- /dev/null +++ b/test/loopint.s @@ -0,0 +1,15 @@ +#stdin:10\n20\n0 +#stdout:1020 +loop: + li a7, 5 + ecall + + beqz a0, end + + li a7, 1 + ecall + j loop + +end: + li a7, 10 + ecall diff --git a/test/loopstring.s b/test/loopstring.s new file mode 100644 index 00000000..42172d71 --- /dev/null +++ b/test/loopstring.s @@ -0,0 +1,24 @@ +#stdin:Hello\nthe\nworld +#stdout:Hello\nthe\nworld + .data +buffer: .space 256 + + .text +loop: + li a7, 8 + la a0, buffer + li a1, 256 + ecall + + lb t0, 0(a0) + li t1, '\n' + beq t0, t1, end + + li a7, 4 + la a0, buffer + ecall + j loop + +end: + li a7, 10 + ecall From ba798931cffbb890267fbfb42aee7e0dfd8cbb19 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 2 Aug 2024 20:26:57 -0400 Subject: [PATCH 160/199] cancel syscall: better implementation that use exceptions --- src/rars/riscv/syscalls/SyscallReadChar.java | 3 --- .../riscv/syscalls/SyscallReadDouble.java | 3 ++- src/rars/riscv/syscalls/SyscallReadFloat.java | 3 ++- .../riscv/syscalls/SyscallReadString.java | 2 -- src/rars/util/SystemIO.java | 27 +++++++------------ src/rars/venus/MessagesPane.java | 12 +++++---- 6 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/rars/riscv/syscalls/SyscallReadChar.java b/src/rars/riscv/syscalls/SyscallReadChar.java index 745e3273..a05fbf7e 100644 --- a/src/rars/riscv/syscalls/SyscallReadChar.java +++ b/src/rars/riscv/syscalls/SyscallReadChar.java @@ -42,9 +42,6 @@ public SyscallReadChar() { public void simulate(ProgramStatement statement) throws SimulationException { int character = SystemIO.readChar(this.getNumber()); - if (character == SystemIO.CANCEL) { - throw new CancelException(); - } if (character == SystemIO.NOTASCII) { throw new ExitingException(statement, "invalid or non printable ASCII input (syscall " + this.getNumber() + ")"); diff --git a/src/rars/riscv/syscalls/SyscallReadDouble.java b/src/rars/riscv/syscalls/SyscallReadDouble.java index d89603f3..edd318e8 100644 --- a/src/rars/riscv/syscalls/SyscallReadDouble.java +++ b/src/rars/riscv/syscalls/SyscallReadDouble.java @@ -2,6 +2,7 @@ import rars.ExitingException; import rars.ProgramStatement; +import rars.SimulationException; import rars.riscv.hardware.FloatingPointRegisterFile; import rars.riscv.AbstractSyscall; import rars.util.SystemIO; @@ -52,7 +53,7 @@ public SyscallReadDouble() { /** * Performs syscall function to read the bits of input double into $f0 and $f1. */ - public void simulate(ProgramStatement statement) throws ExitingException { + public void simulate(ProgramStatement statement) throws SimulationException { double doubleValue = 0; try { doubleValue = SystemIO.readDouble(this.getNumber()); diff --git a/src/rars/riscv/syscalls/SyscallReadFloat.java b/src/rars/riscv/syscalls/SyscallReadFloat.java index b73f022b..407c9e60 100644 --- a/src/rars/riscv/syscalls/SyscallReadFloat.java +++ b/src/rars/riscv/syscalls/SyscallReadFloat.java @@ -2,6 +2,7 @@ import rars.ExitingException; import rars.ProgramStatement; +import rars.SimulationException; import rars.riscv.AbstractSyscall; import rars.riscv.hardware.FloatingPointRegisterFile; import rars.util.SystemIO; @@ -39,7 +40,7 @@ public SyscallReadFloat() { super("ReadFloat", "Reads a float from input console", "N/A", "fa0 = the float"); } - public void simulate(ProgramStatement statement) throws ExitingException { + public void simulate(ProgramStatement statement) throws SimulationException { float floatValue; try { floatValue = SystemIO.readFloat(this.getNumber()); diff --git a/src/rars/riscv/syscalls/SyscallReadString.java b/src/rars/riscv/syscalls/SyscallReadString.java index 4d31f892..884aa5ad 100644 --- a/src/rars/riscv/syscalls/SyscallReadString.java +++ b/src/rars/riscv/syscalls/SyscallReadString.java @@ -62,8 +62,6 @@ public void simulate(ProgramStatement statement) throws SimulationException { addNullByte = false; } inputString = SystemIO.readString(this.getNumber(), maxLength); - if (inputString == null) - throw new CancelException(); byte[] utf8BytesList = inputString.getBytes(StandardCharsets.UTF_8); // TODO: allow for utf-8 encoded strings diff --git a/src/rars/util/SystemIO.java b/src/rars/util/SystemIO.java index a3065eb3..15acbe33 100644 --- a/src/rars/util/SystemIO.java +++ b/src/rars/util/SystemIO.java @@ -1,7 +1,9 @@ package rars.util; +import rars.CancelException; import rars.Globals; import rars.Settings; +import rars.SimulationException; import java.io.*; import java.nio.channels.FileChannel; @@ -81,8 +83,6 @@ public class SystemIO { public static final int EOF = -1; /** the character is not a printable ASCII */ public static final int NOTASCII = -2; - /** Cancel requested */ - public static final int CANCEL = -3; /** * Implements syscall to read an integer value. @@ -92,14 +92,14 @@ public class SystemIO { * @return int value corresponding to user input */ - public static long readInteger(int serviceNumber) { + public static long readInteger(int serviceNumber) throws CancelException { String input = readStringInternal("0", "Enter an integer value (syscall " + serviceNumber + ")", -1); // Client is responsible for catching NumberFormatException - if (input == null) throw new NumberFormatException("Cancel"); + if (input == null) throw new CancelException(); return Long.parseLong(input.trim()); } - private static String readStringInternal(String init, String prompt, int maxlength) { + private static String readStringInternal(String init, String prompt, int maxlength) throws CancelException { String input = init; if (Globals.getGui() == null) { try { @@ -133,9 +133,8 @@ private static String readStringInternal(String init, String prompt, int maxleng * @return float value corresponding to user input * Feb 14 2005 Ken Vollmar */ - public static float readFloat(int serviceNumber) { + public static float readFloat(int serviceNumber) throws CancelException { String input = readStringInternal("0", "Enter a float value (syscall " + serviceNumber + ")", -1); - if (input == null) throw new NumberFormatException("Cancel"); return Float.parseFloat(input.trim()); } @@ -147,9 +146,8 @@ public static float readFloat(int serviceNumber) { * @return double value corresponding to user input * Feb 14 2005 Ken Vollmar */ - public static double readDouble(int serviceNumber) { + public static double readDouble(int serviceNumber) throws CancelException { String input = readStringInternal("0", "Enter a Double value (syscall " + serviceNumber + ")", -1); - if (input == null) throw new NumberFormatException("Cancel"); return Double.parseDouble(input.trim()); } @@ -176,12 +174,9 @@ public static void printString(String string) { * @param maxLength the maximum string length * @return the entered string, truncated to maximum length if necessary */ - public static String readString(int serviceNumber, int maxLength) { + public static String readString(int serviceNumber, int maxLength) throws CancelException { String input = readStringInternal("", "Enter a string of maximum length " + maxLength + " (syscall " + serviceNumber + ")", maxLength); - if (input == null) { - return null; - } if (input.endsWith("\n")) { input = input.substring(0, input.length() - 1); } @@ -201,15 +196,13 @@ public static String readString(int serviceNumber, int maxLength) { * @param serviceNumber the number assigned to Read Char syscall (default 12) * @return int value with lowest byte corresponding to user input, EOF on end of data, or NOTASCII on invalid ASCII character. */ - public static int readChar(int serviceNumber) { + public static int readChar(int serviceNumber) throws CancelException { int returnValue; // Need a popup? if (Globals.getGui() != null && Globals.getSettings().getBooleanSetting(Settings.Bool.POPUP_SYSCALL_INPUT)) { String input = readStringInternal("0", "Enter a character value (syscall " + serviceNumber + ")", 1); - if (input == null) - return CANCEL; - else if (input.length()>0) + if (input.length()>0) returnValue = input.getBytes(StandardCharsets.UTF_8) [0] & 0xFF; // truncate else returnValue = EOF; // assume EOF on empty string diff --git a/src/rars/venus/MessagesPane.java b/src/rars/venus/MessagesPane.java index c3ad570e..eeb83738 100644 --- a/src/rars/venus/MessagesPane.java +++ b/src/rars/venus/MessagesPane.java @@ -1,10 +1,12 @@ package rars.venus; +import rars.CancelException; import rars.ErrorList; import rars.Globals; import rars.Settings; import rars.simulator.ProgramArgumentList; import rars.simulator.Simulator; +import rars.util.SystemIO; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -512,7 +514,7 @@ public void processProgramArgumentsIfAny() { * @param prompt Prompt to display to the user. * @return User input. */ - public String getInputString(String prompt) { + public String getInputString(String prompt) throws CancelException { String input; boolean lock = Globals.memoryAndRegistersLock.isHeldByCurrentThread(); if (lock) { @@ -523,14 +525,14 @@ public String getInputString(String prompt) { JDialog dialog = pane.createDialog(Globals.getGui(), "Keyboard Input"); dialog.setVisible(true); input = (String) pane.getInputValue(); + if (lock) { + Globals.memoryAndRegistersLock.lock(); + } if (input == JOptionPane.UNINITIALIZED_VALUE) { - input = null; + throw new CancelException(); } else { this.postRunMessage(Globals.userInputAlert + input + "\n"); } - if (lock) { - Globals.memoryAndRegistersLock.lock(); - } return input; } From fe06db0248121e715290f1515cb734ec97fd71d4 Mon Sep 17 00:00:00 2001 From: Daria Merlier Date: Tue, 6 Aug 2024 14:04:14 -0400 Subject: [PATCH 161/199] html clean --- src/help/IDE.html | 122 ++++++++++++++++++++-------------------------- 1 file changed, 53 insertions(+), 69 deletions(-) diff --git a/src/help/IDE.html b/src/help/IDE.html index f7c114ee..466faefc 100644 --- a/src/help/IDE.html +++ b/src/help/IDE.html @@ -1,77 +1,61 @@ -RARS 1.6 help contents - +RARS 1.6 help contents