@@ -1,23 +1,17 @@
package controller;

import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;

import view.TelaPrincipal;
import model.*;
import componentes.*;

public class Controller implements WindowListener,ActionListener,MouseListener{
public class Controller implements ActionListener{

private UnidadeControle UC;
private Memoria memoria;
@@ -30,11 +24,33 @@ public Controller(){
t = Tradutor.instanceOf();
initComponents();
tela = new TelaPrincipal(this);
tela.atualizaSelecaoLinhaControle(UC.getPointer());
tela.setMemoryModel(memoria);
this.atualizarExibicao();

}



private void atualizarExibicao() {
tela.getTxtRegistradores()[tela.mar].setText(mar.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.mbr].setText(mbr.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.ir].setText(ir.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.p1].setText(p1.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.p2].setText(p2.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.pc].setText(pc.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.ax].setText(ax.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.bx].setText(bx.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.cx].setText(cx.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.dx].setText(dx.getPalavra().getIntValue()+"");
tela.getTxtRegistradores()[tela.ds].setText(ds.getPalavra().getIntValue()+"");

tela.atualizaSelecaoLinhaControle(UC.getPointer());

tela.atualizaMem();
}



private void initComponents() {

List<RegistradorUtilizavel> regsU;
@@ -53,7 +69,7 @@ private void initComponents() {
cx = new RegistradorUtilizavel("CX","024025",new RegCode(new byte[]{0,1,0}));
dx = new RegistradorUtilizavel("DX","026027",new RegCode(new byte[]{0,1,1}));
memoria = new Memoria("028029");
ds = new RegistradorUtilizavel("DS","030031",new RegCode( new byte[]{1,0,0}));
ds = new RegistradorUtilizavel("DS","030031",new RegCode(new byte[]{1,0,0}));

regsU = new LinkedList<RegistradorUtilizavel>();
regsU.add((RegistradorUtilizavel)ax);
@@ -62,7 +78,7 @@ private void initComponents() {
regsU.add((RegistradorUtilizavel)dx);
regsU.add((RegistradorUtilizavel)ds);

UC = new UnidadeControle((IR)ir, regsU);
UC = new UnidadeControle((IR)ir, regsU,memoria,ula);

Barramento bUlaAC, bUlaX, bRegs, bExterno;
bUlaAC = new Barramento();
@@ -88,100 +104,62 @@ private void initComponents() {
new Porta(false,29,bExterno,memoria,UC);
new Porta(false,31,bRegs,ds,UC);

new Porta(true,0 ,bExterno,mar,UC);
new Porta(true,0 ,bRegs,mar,UC);
new Porta(true,2 ,bRegs,mbr,UC);
new Porta(true,8 ,bExterno,mbr,UC);
new Porta(true,4 ,bRegs,ir,UC);
new Porta(true,6 ,bRegs,p1,UC);
new Porta(true,10,bRegs,p2,UC);
new Porta(true,12,bRegs,pc,UC);
new Porta(true,14,bUlaX,x,UC);
new Porta(true,16,bUlaAC,ula,UC);
new Porta(true,18,bRegs,ac,UC);
new Porta(true,16,bRegs,ula,UC);
new Porta(true,18,bUlaAC,ac,UC);
new Porta(true,20,bRegs,ax,UC);
new Porta(true,22,bRegs,bx,UC);
new Porta(true,24,bRegs,cx,UC);
new Porta(true,26,bRegs,dx,UC);
new Porta(true,28,bExterno,memoria,UC);
new Porta(true,30,bRegs,ds,UC);
}

@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}

@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub

}

@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub

}

@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub

String action = e.getActionCommand();
//System.out.println("hai");
switch(action){
case "Traduzir":
try {
this.traduzir(tela.getCodigo().getText());
} catch (Exception ex) {
JOptionPane.showMessageDialog(tela, ex.getMessage());
ex.printStackTrace();
}
break;
case "Executar":
try {
UC.advanceClock();
} catch (Exception ex) {
JOptionPane.showMessageDialog(tela, ex.getMessage());
ex.printStackTrace();
}
break;
case "Limpar": break;
default:
}
atualizarExibicao();
//tela.repaint();
}

@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub

}

@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub

}

@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub

}

@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub

private void traduzir(String text) throws Exception {
String[] linhas = text.split("\n");
int contador=0;
for(String s:linhas){
s = s.trim();
if(s.length()>0){
memoria.insere(contador, t.traduzir(s));
contador++;
}
}
}

}
@@ -6,7 +6,7 @@ public class OpCode {
private byte[] code;

public OpCode(Palavra mem){
this.code = Arrays.copyOfRange(mem.getBits(),0,6);
this.code = Arrays.copyOfRange(mem.getBits(),0,5);
}

public OpCode(byte[] b){
@@ -16,6 +16,11 @@ public OpCode(byte[] b){
public byte[] getCode(){
return code;
}

@Override
public String toString(){
return Arrays.toString(code);
}

@Override
public int hashCode() {
@@ -16,7 +16,7 @@ public Palavra(){
public Palavra(int resp) {
this.bits = new byte[qtdBitsPalavra];
String s = Integer.toBinaryString(resp);
System.out.println(resp+"\n"+s);
//System.out.println(resp+"\n"+s);
int cont=31;
for(int i=s.length()-1; i>=0; i--){
bits[cont--] = (byte) ((s.charAt(i)=='1')?1:0);
@@ -6,7 +6,7 @@ public class RegCode {
private byte[] code;

public RegCode(Palavra mem){
this.code = Arrays.copyOfRange(mem.getBits(),0,3);
this.code = Arrays.copyOfRange(mem.getBits(),29,31);
}

public RegCode(byte[] b){
@@ -16,6 +16,11 @@ public RegCode(byte[] b){
public byte[] getCode(){
return code;
}

@Override
public String toString(){
return Arrays.toString(code);
}

@Override
public int hashCode() {
@@ -68,9 +68,10 @@ public Palavra traduzir(String assemblyLine) throws Exception{
String palavra=null;
f1 =false;
String[] linha = assemblyLine.split(" ");
if(linha.length<2) throw new Exception("Comando inválido: "+assemblyLine);
String comando = linha[0];
String[] params = linha[1].split(",");

if(linha.length==0) throw new Exception("Comando inválido: "+assemblyLine);
comando = comando.toLowerCase() + " ";

if(params[0].contains("[")){
@@ -125,7 +126,7 @@ public Palavra traduzir(String assemblyLine) throws Exception{
f1=false;
}
}

System.out.println(comando);
byte[] code = this.opcodes.get(comando);
byte[] p = new byte[32];
int fim;
@@ -158,7 +159,7 @@ else if(b!=null){
palavra = Integer.toBinaryString(aux1);
fim = (Palavra.qtdBitsPalavra/2)-1;
cont= palavra.length()-1;
System.out.println("here "+fim+" "+palavra);
//System.out.println("here "+fim+" "+palavra);
for(i=fim; i>lastI && cont >= 0; i--){
p[i]=Byte.parseByte(palavra.charAt(cont--)+"");
}
@@ -181,7 +182,7 @@ else if(b!=null){
p[i]=Byte.parseByte(palavra.charAt(cont--)+"");
}
}
System.out.println(palavra);
//System.out.println(palavra);
resp = new Palavra(p);

return resp;
@@ -0,0 +1,57 @@
package view;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.table.AbstractTableModel;

import componentes.Memoria;
import model.Palavra;

public class MemoriaModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;
private Map<Integer,Palavra> mem;
private List<Entry<Integer,Palavra>> l;
private String[] columnNames;
public MemoriaModel(Memoria m){
mem = m.getMap();
columnNames = new String[]{"Posição","Valor Inteiro"};
l = new ArrayList<Entry<Integer,Palavra>>(mem.entrySet());
}

public void update(){
l.clear();
l.addAll(mem.entrySet());
}

@Override
public int getRowCount() {
return mem.size();
}

@Override
public String getColumnName(int col) {
return columnNames[col];
}

@Override
public int getColumnCount() {
return 2;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if(rowIndex<mem.size() && rowIndex>=0){
switch(columnIndex){
case 0: return l.get(rowIndex).getKey();
case 1: return l.get(rowIndex).getValue().getIntValue();
default: return null;
}
}
return null;
}

}
@@ -3,11 +3,15 @@
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;

import componentes.Memoria;
import controller.Controller;

public class TelaPrincipal extends JFrame {
@@ -18,7 +22,7 @@ public class TelaPrincipal extends JFrame {
private static final long serialVersionUID = 1L;

private JTextField[] txtRegistradores;
private final int ax = 0, bx = 1, cx = 2, dx = 3, ir = 4, p1 = 5, p2 = 6, pc = 7, ds = 8, mar = 9, mbr = 10;
public final int ax = 0, bx = 1, cx = 2, dx = 3, ir = 4, p1 = 5, p2 = 6, pc = 7, ds = 8, mar = 9, mbr = 10;
private JPanel pnlComandos, pnlRegistradores, pnlMemoria, pnlLinhasControle;
private JButton btnTraduzir;
private JButton btnClearCodigo;
@@ -32,43 +36,64 @@ public class TelaPrincipal extends JFrame {
private Controller ctrl;

public TelaPrincipal(Controller ctrl) {
iniciarComponentes();
this.ctrl = ctrl;
iniciarComponentes();
this.setVisible(true);
}

public void iniciarComponentes() {
// Criando a janela
this.setTitle("Assembly Compiler Simulator");
this.getContentPane().setLayout(null);
this.getContentPane().setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1000, 680);
this.setSize(1100, 680);

// Criando os paineis
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel,BoxLayout.Y_AXIS));
leftPanel.setPreferredSize(new Dimension(580,600));

JPanel rightPanel = new JPanel();
rightPanel.setLayout(new BoxLayout(rightPanel,BoxLayout.Y_AXIS));
rightPanel.setPreferredSize(new Dimension(380,600));

pnlComandos = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
pnlComandos.setBorder(BorderFactory.createTitledBorder("Comandos Assembly"));
pnlComandos.setBounds(10, 10, 580, 300);
pnlComandos.setPreferredSize(new Dimension( 580, 300));
pnlComandos.setVisible(true);
this.getContentPane().add(pnlComandos);


pnlLinhasControle = new JPanel(new BorderLayout());
pnlLinhasControle.setBorder(BorderFactory.createTitledBorder("Linhas de Controle"));
pnlLinhasControle.setPreferredSize(new Dimension( 580, 300));
pnlLinhasControle.setVisible(true);
//this.getContentPane().add(pnlLinhasControle);

leftPanel.add(pnlComandos, BorderLayout.LINE_START);
leftPanel.add(pnlLinhasControle, BorderLayout.CENTER);
this.getContentPane().add(leftPanel, BorderLayout.LINE_START);

pnlRegistradores = new JPanel(new FlowLayout());
pnlRegistradores.setBorder(BorderFactory.createTitledBorder("Registradores"));
pnlRegistradores.setBounds(600, 10, 380, 300);
pnlRegistradores.setPreferredSize(new Dimension( 380, 300));
pnlRegistradores.setVisible(true);
GridLayout g = new GridLayout(0,4);
g.setVgap(10);
JPanel regs = new JPanel(g);
regs.setPreferredSize(new Dimension( 500, 180));
pnlRegistradores.add(regs);
((FlowLayout)pnlRegistradores.getLayout()).setAlignment(FlowLayout.LEFT);
this.getContentPane().add(pnlRegistradores);
//this.getContentPane().add(pnlRegistradores, BorderLayout.CENTER);

pnlMemoria = new JPanel(new BorderLayout());
pnlMemoria.setBorder(BorderFactory.createTitledBorder("Memória"));
pnlMemoria.setBounds(600, 320, 380, 300);
pnlMemoria.setPreferredSize(new Dimension(380, 300));
pnlMemoria.setVisible(true);
this.getContentPane().add(pnlMemoria);
//this.getContentPane().add(pnlMemoria);

pnlLinhasControle = new JPanel(new BorderLayout());
pnlLinhasControle.setBorder(BorderFactory.createTitledBorder("Linhas de Controle"));
pnlLinhasControle.setBounds(10, 320, 580, 300);
pnlLinhasControle.setVisible(true);
this.getContentPane().add(pnlLinhasControle);
rightPanel.add(pnlRegistradores, BorderLayout.LINE_START);
rightPanel.add(pnlMemoria, BorderLayout.CENTER);
this.getContentPane().add(rightPanel, BorderLayout.CENTER);

//Criando Compoenentes para os comandos
JPanel p = new JPanel(new BorderLayout());
@@ -82,15 +107,18 @@ public void iniciarComponentes() {
p.add(scrollCodigo,BorderLayout.PAGE_START);

btnTraduzir = new JButton("Traduzir");
//TODO adiciona listeners
btnTraduzir.setActionCommand("Traduzir");
btnTraduzir.addActionListener(ctrl);
btnTraduzir.setSize(50, 20);

btnExecutaInstrucao = new JButton("Executa Instrução");
//TODO adiciona listeners
btnExecutaInstrucao.setActionCommand("Executar");
btnExecutaInstrucao.addActionListener(ctrl);
btnExecutaInstrucao.setSize(50, 20);

btnClearCodigo = new JButton("Limpar Código");
//TODO adiciona listeners
btnClearCodigo = new JButton("Limpar Memória");
btnClearCodigo.setActionCommand("Limpar");
btnClearCodigo.addActionListener(ctrl);
btnClearCodigo.setSize(50, 20);

pnlComandos.add(p);
@@ -99,24 +127,21 @@ public void iniciarComponentes() {
pnlComandos.add(btnClearCodigo);

//Criando componentes para as linhas de controle
//TODO criar funcionalidade para a interface
String[][] valores;
String[] colunas;

tabelaControle = new JTable(new LinhaControleModel());
tabelaControle.getColumnModel().getColumn(0).setPreferredWidth(460);
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
tabelaControle.getColumnModel().getColumn(1).setCellRenderer(rightRenderer);
tabelaControle.getColumnModel().getColumn(2).setCellRenderer(rightRenderer);
tabelaControle.getColumnModel().getColumn(3).setCellRenderer(rightRenderer);
tabelaControle.getColumnModel().getColumn(5).setCellRenderer(rightRenderer);
tabelaControle.getColumnModel().getColumn(6).setCellRenderer(rightRenderer);
tabelaControle.setEnabled(false);
JScrollPane barraRolagem = new JScrollPane(tabelaControle);
pnlLinhasControle.add(barraRolagem);

//Criando componentes para a memoria
valores = new String[20][6];
valores[0][0] = "10000";
valores[0][1] = "34589820";
colunas = new String[]{"Endereco","Valor"};

tabelaMemoria = new JTable(valores, colunas);
tabelaMemoria.getColumnModel().getColumn(0).setPreferredWidth(70);
tabelaMemoria = new JTable();
tabelaMemoria.setEnabled(false);
JScrollPane barraRolagemMemoria = new JScrollPane(tabelaMemoria);

@@ -137,20 +162,24 @@ public void iniciarComponentes() {
txtRegistradores = new JTextField[11];
JLabel[] lblRegs = new JLabel[11];
String[] nomesRegs = new String[]{"ax", "bx", "cx", "dx", "ir", "p1", "p2", "pc", "ds", "mar", "mbr"};
JSeparator separator;
JPanel aux;
for(int i = 0; i <= 10; i++){
if(i == 4 || i == 7 || i == 9){
separator = new JSeparator(SwingConstants.HORIZONTAL);
separator.setPreferredSize(new Dimension(pnlRegistradores.getWidth() - 25, 2));
pnlRegistradores.add(separator);
}
aux = new JPanel();
aux.setLayout(new BoxLayout(aux,BoxLayout.X_AXIS));
txtRegistradores[i] = new JTextField();
txtRegistradores[i].setPreferredSize(new Dimension(50,30));
txtRegistradores[i].setPreferredSize(new Dimension(55,30));
txtRegistradores[i].setEnabled(false);
lblRegs[i] = new JLabel(nomesRegs[i].toUpperCase());
lblRegs[i].setPreferredSize(new Dimension(30,30));
pnlRegistradores.add(lblRegs[i]);
pnlRegistradores.add(txtRegistradores[i]);
aux.add(lblRegs[i]);
aux.add(txtRegistradores[i]);
regs.add(aux);
if(i == 6){
regs.add(new JPanel()); //pra encher o espaço xD
} else if(i==8){
regs.add(new JPanel()); //pra encher o espaço xD
regs.add(new JPanel()); //pra encher o espaço xD
}
}

}
@@ -168,50 +197,6 @@ public JTextField[] getTxtRegistradores() {
return txtRegistradores;
}

public int getAx() {
return ax;
}

public int getBx() {
return bx;
}

public int getCx() {
return cx;
}

public int getDx() {
return dx;
}

public int getIr() {
return ir;
}

public int getP1() {
return p1;
}

public int getP2() {
return p2;
}

public int getPc() {
return pc;
}

public int getDs() {
return ds;
}

public int getMar() {
return mar;
}

public int getMbr() {
return mbr;
}

public JPanel getPnlComandos() {
return pnlComandos;
}
@@ -264,8 +249,19 @@ public JTable getTabelaControle() {
return tabelaControle;
}

public Controller getCtrl() {
return ctrl;
public void setMemoryModel(Memoria memoria) {
this.tabelaMemoria.setModel(new MemoriaModel(memoria));
tabelaMemoria.getColumnModel().getColumn(0).setPreferredWidth(70);
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
tabelaMemoria.getColumnModel().getColumn(0).setCellRenderer(rightRenderer);
tabelaMemoria.getColumnModel().getColumn(1).setCellRenderer(rightRenderer);
}

public void atualizaMem() {
((MemoriaModel)this.tabelaMemoria.getModel()).update();
tabelaMemoria.repaint();
tabelaMemoria.revalidate();
}

}