/******************************************************************************* * openDLX - A DLX/MIPS processor simulator. * Copyright (C) 2013 The openDLX project, University of Augsburg, Germany * Project URL: <https://sourceforge.net/projects/opendlx> * Development branch: <https://github.com/smetzlaff/openDLX> * * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, see <LICENSE>. If not, see * <http://www.gnu.org/licenses/>. ******************************************************************************/ package openDLX.asm; import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import openDLX.asm.instruction.Instruction; import openDLX.asm.instruction.Instructions; import openDLX.asm.parser.Parser; import openDLX.asm.parser.UnresolvedInstruction; public class DLXAssembler implements AssemblerInterface { private static int defaultDataStart = 0x100; private static int defaultTextStart = 0x4000; private static int defaultMemorySize = 0x5000; private Parser parser; private Hashtable<String, Integer> globalLabels; public DLXAssembler() { } public MemoryBuffer assemble(BufferedReader stream) throws AssemblerException, IOException { BufferedReader[] streams = { stream }; return assemble(streams); } public MemoryBuffer assemble(BufferedReader[] streams) throws IOException, AssemblerException { MemoryBuffer memory = new MemoryBuffer(defaultMemorySize); memory.setDataBegin(defaultDataStart); memory.setTextBegin(defaultTextStart); memory.setLittleEndian(true); parser = new Parser(defaultDataStart, defaultTextStart); globalLabels = new Hashtable<String, Integer>(); List<UnresolvedInstruction> unresolvedInstructions = new ArrayList<UnresolvedInstruction>(); for (BufferedReader reader : streams) { unresolvedInstructions.addAll(parser.parse(reader, globalLabels, memory)); } parser.resolve(unresolvedInstructions, globalLabels, memory); Integer entryPoint = globalLabels.get("main"); if (entryPoint != null) if (parser.hasGlobalMain()) memory.setEntyPoint(entryPoint); else throw new AssemblerException("no entry point 'main' found!\nPlease specify '.global main'."); else throw new AssemblerException("no entry point 'main' found!\nPlease specify '.global main' and 'main:'."); return memory; } public String Instr2Str(int instr) { Instruction i = new Instruction(instr); i.calcInstType(); return i.toString(); } public String InstrDescription(String mnem) { return Instructions.instance().getDescription(mnem); } public Hashtable<String, Integer> getLabels() { return globalLabels; } }