public void setUp(Boolean symbolVolatile, Integer symbolSize, Boolean memoryVolatile,
			boolean reverseOrder) throws Exception {
		//symbolVolatile and symbolSize are in reference to the symbol PORTF. However, setting a
		//size that is too large will overwrite other symbols such as PING, DDRG or PORTG.
		String defaultSymbolsElement =
			"  <default_symbols>\r\n" +
				"    <symbol name=\"RESET\" address=\"code:0x0000\" entry=\"true\"/>\r\n" +
				"    <symbol name=\"INT0\" address=\"code:0x0002\" entry=\"true\"/>\r\n" +
				"    <symbol name=\"INT1\" address=\"code:0x0004\" entry=\"true\"/>\r\n" +
				"    <symbol name=\"PORTE\" address=\"mem:0x2e\"/>\r\n" +
				"    <symbol name=\"PINF\" address=\"mem:0x2f\"/>\r\n" +
				"    <symbol name=\"DDRF\" address=\"mem:0x30\"/>\r\n" +
				"    <symbol name=\"PORTF\" address=\"mem:0x31\"";
		defaultSymbolsElement +=
			symbolVolatile == null ? "" : " volatile=\"" + symbolVolatile.toString() + "\"";
		defaultSymbolsElement +=
			symbolSize == null ? "" : " size=\"" + symbolSize.toString() + "\"";
		defaultSymbolsElement += " />\r\n" +
			"    <symbol name=\"PING\" address=\"mem:0x32\"/>\r\n" +
			"    <symbol name=\"DDRG\" address=\"mem:0x33\"/>\r\n" +
			"    <symbol name=\"PORTG\" address=\"mem:0x34\"/>\r\n" +
			"    <symbol name=\"TIFR0\" address=\"mem:0x35\"/>\r\n" + "  </default_symbols>\r\n";

		//memoryVolatile null will not set the memory range 0x20 to 0x57 as volatile. 
		//memoryVolatile true will set the memory range 0x20 to 0x57 to volatile.
		//memoryVolatile false will exclude the address of PORTF (0x31) from the volatility setting. 
		//Example:
		//	"<range space=\"mem\" first=\"0x20\" last=\"0x30\"/>"
		//	"<range space=\"mem\" first=\"0x32\" last=\"0x57\"/>"
		String volatileElement =
			"  <volatile outputop=\"write_volatile\" inputop=\"read_volatile\">\r\n";
		volatileElement += memoryVolatile == null ? ""
				: memoryVolatile ? "<range space=\"mem\" first=\"0x20\" last=\"0x57\"/>\r\n"
						: "<range space=\"mem\" first=\"0x20\" last=\"0x30\"/>\r\n" +
							"<range space=\"mem\" first=\"0x32\" last=\"0x57\"/>\r\n";

		volatileElement +=
			"    <range space=\"mem\" first=\"0x60\" last=\"0xff\"/>\r\n" + "  </volatile>\r\n";

		//This variable represents the content of a pspec file.
		//The original pspec file this is based on is the avr8 atmega256.pspec.
		String pspecContentString =
			"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + "\r\n" + "<processor_spec>\r\n" +
				"\r\n" + "  <programcounter register=\"PC\"/> \r\n" +
				"  <data_space space=\"mem\"/>\r\n";
		pspecContentString += reverseOrder ? volatileElement : defaultSymbolsElement;
		pspecContentString += "  \r\n" + "  <context_data>\r\n" +
			"    <tracked_set space=\"code\">\r\n" + "      <set name=\"R1\" val=\"0\"/>\r\n" +
			"    </tracked_set>\r\n" + "  </context_data>\r\n" + "  \r\n";
		pspecContentString += reverseOrder ? defaultSymbolsElement : volatileElement;
		pspecContentString += "\r\n" + "  <default_memory_blocks>\r\n" +
			"    <memory_block name=\"regalias\" start_address=\"mem:0x00\" length=\"0x20\" initialized=\"false\"/>\r\n" +
			"    <memory_block name=\"iospace\" start_address=\"mem:0x20\" length=\"0x1e0\" initialized=\"false\"/>\r\n" +
			"    <memory_block name=\"sram\" start_address=\"mem:0x200\" length=\"0x4000\" initialized=\"false\"/>\r\n" +
			"    <memory_block name=\"codebyte\" start_address=\"codebyte:0x0\" length=\"0x40000\" byte_mapped_address=\"code:0x0\"/>\r\n" +
			"  </default_memory_blocks>\r\n" + "\r\n" + "\r\n" + "</processor_spec>\r\n" + "";

		String languageIDString = "avr8:LE:16:atmega256Test";
		LanguageID langId = new LanguageID(languageIDString);

		ResourceFile pspecFile = createCustomPspecFile("atmega256", pspecContentString);
		ResourceFile ldefFile = createTempLdefsFile("avr8", pspecFile);
		SleighLanguageProvider provider = new SleighLanguageProvider(ldefFile);
		lang = (SleighLanguage) provider.getLanguage(langId);

		Address PORTFAddress = lang.getAddressFactory().getAddress(PORTFAddressString);
		Address PORTGAddress = lang.getAddressFactory().getAddress(PORTGAddressString);

		isPORTFVolatile = lang.isVolatile(PORTFAddress);
		isPORTGVolatile = lang.isVolatile(PORTGAddress);
	}
Constructs a string based on parameters, and uses that as the content of a custom pspec file.
Parameters effect the volatility of the symbol "PORTF". 
The pspec file is read by the SleighLanguage object which tracks volatile addresses.
@param symbolVolatile Nullable boolean value that specifies the symbol PORTF volatility setting.
@param symbolSize Nullable integer value specifying the symbol PORTF size in bytes.
@param memoryVolatile Nullable boolean value that specifies the volatility setting of the 
			memory location that includes PORTF.
@param reverseOrder boolean, reverseOrder refers to the order that 'volatile' and 
			'default_symbols' elements appear in the pspec file.
@throws Exception if an error occurred
Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/app/plugin/processors/sleigh/SleighLanguageVolatilityTest.java