public int parseLine(String line) throws MVNException{
		StringTokenizer dataLine = new StringTokenizer(line);
		// Por padrão os tokens são: " \t\n\r\f"
		// Um token é separado por espaço, tab, linefeed, carriage return e formfeed
		
		ArrayList<String> parsedCode = new ArrayList<String>();
		boolean ignoreRemainingData = false;
		while(dataLine.hasMoreTokens() && !ignoreRemainingData){
			StringTokenizer dataToken = new StringTokenizer(dataLine.nextToken(),
					String.valueOf(PARSE_LINE_COMMENT), true);
			while(dataToken.hasMoreTokens()){
				String thisToken = dataToken.nextToken();
				if(thisToken.charAt(0) == PARSE_LINE_COMMENT){
					ignoreRemainingData = true;
					break;
				}
				parsedCode.add(thisToken);
			}
		}
		
		// se houver apenas 1 token, significa que o usuário especificou um
		// endereço mas não especificou nenhum dado, portanto, pode-se ignorar a
		// linha
		if(parsedCode.size() > 1){
			// primeira informação sempre é o endereço
			int returnAddress = Integer.parseInt(parsedCode.get(0), 16);
			
			// restante dos dados são informações a serem gravadas
			int address = returnAddress;
			for(int i = 1; i < parsedCode.size(); i++){
				StringBuilder code = new StringBuilder(parsedCode.get(i));
				if(code.length() % 2 == 1){
					code.insert(0, "0");
				}
				
				while(code.length() > 0){
					try{
						String strByte = code.substring(0, 2);
						code.delete(0, 2);
						Integer intByte = Integer.parseInt(strByte, 16);
						// grava byte na memória
						Bits8 thisByte = new Bits8(intByte);
						write(thisByte, address++);
					}catch(NumberFormatException e){
						throw new MVNException(ERR_PARSE_ERROR);
					}
				}
			}
			return returnAddress;
		}
		return -1;
	}