📄 mcodecontrolunit.java
字号:
COND_1 | BT_JUMP | OPER_MDR | 0x01, // STAC5
-1,
COND_1 | BT_JUMP | OPER_ZALU | OPER_MINU | 0x01, // SUB1
-1,
-1,
-1,
COND_1 | BT_JUMP | OPER_ZALU | OPER_ACIN | 0x01, // INAC1
COND_1 | BT_JUMP | OPER_PCIN | 0x2a, // JMPZN1
COND_1 | BT_JUMP | OPER_PCIN | 0x01, // JMPZN2
-1,
COND_1 | BT_JUMP | OPER_ZALU | OPER_ACZO | 0x01, // CLAC1
COND_1 | BT_JUMP | OPER_PCIN | 0x2e, // JPNZN1
COND_1 | BT_JUMP | OPER_PCIN | 0x01, // JPNZN2
-1,
COND_1 | BT_JUMP | OPER_ZALU | OPER_AND | 0x01, // AND1
-1,
-1,
-1,
COND_1 | BT_JUMP | OPER_ZALU | OPER_OR | 0x01, // OR1
-1,
-1,
-1,
COND_1 | BT_JUMP | OPER_ZALU | OPER_XOR | 0x01, // XOR1
-1,
-1,
-1,
COND_1 | BT_JUMP | OPER_ZALU | OPER_NOT | 0x01, // NOT1
-1,
-1
};
*/
private int[] microcode =
{
COND_1 | OPER_ARPC | 0x01, // FETCH1
COND_1 | OPER_PCIN | OPER_DRM | 0x02, // FETCH2
COND_X | OPER_ARDR | OPER_IRDR | ADDR_X, // FETCH3
-1,
-1,
-1,
-1,
-1,
COND_1 | OPER_DRM | 0x09, // ADD1
COND_1 | OPER_PLUS | 0x00, // ADD2
COND_1 | OPER_DRM | 0x0b, // AND1
COND_1 | OPER_AND | 0x00, // AND2
COND_1 | OPER_PCDR | 0x00, // JMP1
-1,
COND_1 | OPER_ACIN | 0x00, // INC1
COND_1 | 0x00 // null
};
private Menu fileMenu;
private MenuItem closeWindowMenuItem;
private ScrollPane mcuCanvasScrollPane;
private Canvas mcuCanvas =
new Canvas()
{
public Dimension getPreferredSize()
{
return ( getMinimumSize() );
}
public Dimension getMinimumSize()
{
return ( new Dimension( 285, 410 ) );
}
public void invalidate()
{
super.invalidate();
offScreenImage = null;
}
public void update( Graphics g )
{
paint( g );
}
public void paint( Graphics g )
{
if ( offScreenImage == null )
{
offScreenImage = createImage( 285, 410 );
}
Graphics offScreenGraphics = offScreenImage.getGraphics();
offScreenGraphics.setClip( g.getClip() );
offScreenGraphics.setColor( getBackground() );
offScreenGraphics.fillRect( 0, 0, 285, 450 );
Font bld = new Font( "SansSerif", Font.BOLD, 12 );
Font bits = new Font( "SansSerif", Font.PLAIN, 11 );
Font f3 = new Font( "SansSerif", Font.PLAIN, 9 );
offScreenGraphics.setFont( f3 );
offScreenGraphics.setColor( Color.black );
offScreenGraphics.drawRect(80,95,120,50); // Mux
offScreenGraphics.drawRect(85,30,50,30); //IR map
// offScreenGraphics.drawString("MAP",98,45); // Map
offScreenGraphics.drawRect(80,180,120,35); //Register
offScreenGraphics.drawRect(75,255,125,60); //Microcode Memory
// offScreenGraphics.drawRect(125,100,140,50); //Addr_MUX
// offScreenGraphics.drawRect(285,152,30,30); //INC
// offScreenGraphics.drawRect(125,35,50,30); //MAP
offScreenGraphics.drawLine(110,60,110,95); // MAP to Addr_MUX
offScreenGraphics.drawLine(110,95,115,90); // Arrow
offScreenGraphics.drawLine(110,95,105,90); // Arrow
offScreenGraphics.drawLine(143,145,143,180); // Addr_MUX to Register
offScreenGraphics.drawLine(143,180,148,175); // Arrow
offScreenGraphics.drawLine(143,180,138,175); // Arrow
offScreenGraphics.drawLine(143,215,143,255); // Register to Micro Memory
// offScreenGraphics.fillOval(194,240,4,4);
offScreenGraphics.drawLine(143,255,148,250); // Arrow
offScreenGraphics.drawLine(143,255,138,250); // Arrow
// offScreenGraphics.drawLine(194,242,300,242); // Register_out to INC
// offScreenGraphics.drawLine(300,242,300,182);
// offScreenGraphics.drawLine(300,182,295,187); // Arrow
// offScreenGraphics.drawLine(300,182,305,187); // Arrow
// offScreenGraphics.drawLine(300,152,300,85); // INC to Addr_MUX
// offScreenGraphics.drawLine(300,85,240,85); // INC to Addr_MUX
// offScreenGraphics.drawLine(240,85,240,100); // INC to Addr_MUX
// offScreenGraphics.drawLine(240,100,235,95); // Arrow
// offScreenGraphics.drawLine(240,100,245,95); // Arrow
// offScreenGraphics.drawLine(75,155,75,210); // Logic to Z_MUX
// offScreenGraphics.drawLine(75,155,70,160); // Arrow
// offScreenGraphics.drawLine(75,155,80,160); // Arrow
offScreenGraphics.drawString("SEL",100,313);
// offScreenGraphics.drawString("BT",170,313);
offScreenGraphics.drawString("mOPs",130,313);
offScreenGraphics.drawString("ADDR",165,313);
offScreenGraphics.drawLine(111,315,111,360); //Microde to MUX sel
offScreenGraphics.drawLine(111,360,40,360); //Microde to MUX sel
offScreenGraphics.drawLine(40,360,40,120); //Microde to MUX sel
offScreenGraphics.drawLine(40,120,80,120); //Microde to MUX sel
offScreenGraphics.drawLine(80,120,75,125); // Arrow
offScreenGraphics.drawLine(80,120,75,115); // Arrow
offScreenGraphics.drawLine(178,315,178,360); // Microde addr to MUX
offScreenGraphics.drawLine(178,360,240,360); // Microde addr to MUX
offScreenGraphics.drawLine(240,360,240,80); // Microde addr to MUX
offScreenGraphics.drawLine(240,80,170,80); // Microde addr to MUX
offScreenGraphics.drawLine(170,80,170,95); // Microde addr to MUX
offScreenGraphics.drawLine(170,95,165,90); // Arrow
offScreenGraphics.drawLine(170,95,175,90); // Arrow
offScreenGraphics.drawLine(140,315,140,370); // mOPs to functions
offScreenGraphics.drawLine(140,370,145,365); // Arrow
offScreenGraphics.drawLine(140,370,135,365); // Arrow
// offScreenGraphics.drawLine(105,140,125,140); // Logic to Addr_MUX S1
// offScreenGraphics.drawLine(125,140,120,135); // Arrow
// offScreenGraphics.drawLine(125,140,120,145); // Arrow
// offScreenGraphics.drawLine(208,320,208,375); // Micro-ops
// offScreenGraphics.drawLine(208,375,203,370); // Arrow
// offScreenGraphics.drawLine(208,375,213,370); // Arrow
// offScreenGraphics.drawLine(242,365,242,320); // Micro Memory to Addr_MUX
// offScreenGraphics.drawLine(242,365,325,365); // Micro Memory to Addr_MUX
// offScreenGraphics.drawLine(325,365,325,65); // Micro Memory to Addr_MUX
// offScreenGraphics.drawLine(325,65,195,65); // Micro Memory to Addr_MUX
// offScreenGraphics.drawLine(195,65,195,100); // Micro Memory to Addr_MUX
// offScreenGraphics.drawLine(195,100,190,95); // Arrow
// offScreenGraphics.drawLine(195,100,200,95); // Arrow
offScreenGraphics.drawString("S",85,124); // S on Addr_MUX
// offScreenGraphics.drawString("S0",129,144); // S1 on Addr_MUX
paintIRPath( offScreenGraphics );
paintAddressMuxSignals( offScreenGraphics );
paintClock( offScreenGraphics );
// paintConditionMuxSignals( offScreenGraphics );
paintCurrentSignals( offScreenGraphics );
offScreenGraphics.setFont( bld );
offScreenGraphics.setColor( Color.black );
// offScreenGraphics.drawString("+1",292,172);
offScreenGraphics.drawString("MAP",99,45);
offScreenGraphics.drawString("REGISTER",112,197);
offScreenGraphics.drawString("Microcode",114,269);
offScreenGraphics.drawString("Memory",120,283);
// offScreenGraphics.drawString("MUX",67,243); // Z_Mux label
offScreenGraphics.drawString("MUX",130,124); // Addr_Mux label
// offScreenGraphics.drawString("Logic",60,130); // Logic label
offScreenGraphics.setFont( bits );
paintIRMapValue( offScreenGraphics );
paintAddressRegisterValue( offScreenGraphics );
paintCurrentConditionValue( offScreenGraphics );
// paintCurrentBTValue( offScreenGraphics );
paintCurrentNextAddressValue( offScreenGraphics );
paintAddressMuxValue( offScreenGraphics );
// paintUpperLogicSelectValue( offScreenGraphics );
// paintLowerLogicSelectValue( offScreenGraphics );
paintDots( offScreenGraphics );
g.drawImage( offScreenImage, 0, 0, this ); // used for double buffering
offScreenGraphics.dispose();
}
public void paintIRPath( Graphics g )
{
g.setColor( irPathEnabled ? Color.red : Color.black );
g.drawString( "IR[1..0]", 90, 10 );
g.drawLine(110,15,110,30); // IR_Input to MAP
g.drawLine(110,30,115,25); // Arrow
g.drawLine(110,30,105,25); // Arrow
}
public void paintAddressMuxValue( Graphics g )
{
g.drawString( AssemblyInstruction.toNumberString( addressMux, 2,
4 ), 132, 140 );
}
/* public void paintUpperLogicSelectValue( Graphics g )
{
g.drawString( AssemblyInstruction.toNumberString( (
logicSelect & 0x2 ) >> 1, 2, 1 ), 97, 120 );
}
*/
/* public void paintLowerLogicSelectValue( Graphics g )
{
g.drawString( AssemblyInstruction.toNumberString(
logicSelect & 0x1, 2, 1 ), 97, 144 );
}
*/
public void paintAddressRegisterValue( Graphics g )
{
g.drawString( AssemblyInstruction.toNumberString(
addressRegister, 2, 4 ), 132, 211 );
}
public void paintCurrentNextAddressValue( Graphics g )
{
int currentMC = microcode[ currentAddress ];
int currentNextAddress = currentMC & ADDR_MASK;
if ( currentNextAddress == ADDR_X )
{
g.drawString( "XXXX", 165, 303 );
}
else
{
g.drawString( AssemblyInstruction.toNumberString(
currentNextAddress, 2, 4 ), 167, 303 );
}
}
/* public void paintCurrentBTValue( Graphics g )
{
int currentMC = microcode[ currentAddress ];
int currentBT = currentMC & BT_MASK;
g.drawString( AssemblyInstruction.toNumberString(
currentBT >> 28, 2, 1 ), 173, 308 );
}
*/
public void paintCurrentConditionValue( Graphics g )
{
int currentMC = microcode[ currentAddress ];
int currentCondition = currentMC & COND_MASK;
if ( currentCondition == COND_X )
{
g.drawString( "1", 107, 303 );
}
else
{
g.drawString( AssemblyInstruction.toNumberString(
currentCondition >> 29, 2, 1 ), 107, 303 );
}
}
public void paintIRMapValue( Graphics g )
{
g.drawString( AssemblyInstruction.toNumberString(
irMap, 2, 4 ), 100, 58 );
}
public void paintCurrentSignals( Graphics g )
{
g.setColor( currentARPC ? Color.red : Color.black );
g.drawString( "ARPC", 100, 380); //Micro-OPs
g.setColor( currentPCDR ? Color.red : Color.black );
g.drawString("PCDR",135,380);
// g.setColor( currentARDT ? Color.red : Color.black );
// g.drawString("ARDT",140,405);
g.setColor( currentPCIN ? Color.red : Color.black );
g.drawString("PCIN",100,390);
// g.setColor( currentPCDT ? Color.red : Color.black );
// g.drawString("PCDT",140,425);
g.setColor( currentDRM ? Color.red : Color.black );
g.drawString("DRM",135,390);
// g.setColor( currentDRAC ? Color.red : Color.black );
// g.drawString("DRAC",175,395);
g.setColor( currentIRDR ? Color.red : Color.black );
g.drawString("AIDR",135,400);
// g.setColor( currentRAC ? Color.red : Color.black );
// g.drawString("RAC",175,415);
// g.setColor( currentZALU ? Color.red : Color.black );
// g.drawString("ZALU",175,425);
// g.setColor( currentTRDR ? Color.red : Color.black );
// g.drawString("TRDR",175,435);
// g.setColor( currentACDR ? Color.red : Color.black );
// g.drawString("ACDR",100,390);
// g.setColor( currentACR ? Color.red : Color.black );
// g.drawString("ACR",216,395);
g.setColor( currentPLUS ? Color.red : Color.black );
g.drawString("PLUS",170,380);
// g.setColor( currentMINU ? Color.red : Color.black );
// g.drawString("MINU",216,415);
g.setColor( currentACIN ? Color.red : Color.black );
g.drawString("ACIN",170,400);
// g.setColor( currentACZO ? Color.red : Color.black );
// g.drawString("ACZO",216,435);
g.setColor( currentAND ? Color.red : Color.black );
g.drawString("AND",170,390);
// g.setColor( currentOR ? Color.red : Color.black );
// g.drawString("OR",252,395);
// g.setColor( currentXOR ? Color.red : Color.black );
// g.drawString("XOR",252,405);
// g.setColor( currentNOT ? Color.red : Color.black );
// g.drawString("NOT",252,415);
// g.setColor( currentMDR ? Color.red : Color.black );
// g.drawString("MDR",252,425);
}
/* public void paintConditionMuxSignals( Graphics g )
{
g.setColor( hw1Enabled ? Color.red : Color.black );
g.drawString( "0", 49, 225 ); // 0 on Z_Mux
g.drawLine( 45, 221, 31, 221 ); // Input 0 on Z_MUX
g.drawString( "1", 24, 225 ); // 1 on Z_Mux
g.setColor( zEnabled ? Color.red : Color.black );
g.drawString( "1", 49, 245 ); // 1 on Z_Mux
g.drawLine( 45, 241, 31, 241 ); // Input 1 on Z_MUX
g.drawString( "Z", 24, 245 ); // Z on Z_Mux
g.setColor( notZEnabled ? Color.red : Color.black );
g.drawString( "2", 49, 265 ); // 2 on Z_Mux
g.drawLine( 45, 262, 31, 262 ); // Input 2 on Z_MUX
g.drawString( "Z", 24, 265 ); // /Z on Z_Mux
g.drawString( "/", 20, 265 ); // /Z on Z_Mux
}
*/
public void paintAddressMuxSignals( Graphics g )
{
// g.setColor( currAddrP1Enabled ? Color.red : Color.black );
// g.drawString( "0", 170, 107 ); // 0 on Addr_MUX
g.setColor( nextAddrEnabled ? Color.red : Color.black );
g.drawString( "0", 170, 107 ); // 1 on Addr_MUX
g.setColor( irMapEnabled ? Color.red : Color.black );
g.drawString( "1", 110, 107 ); // 2 on Addr_MUX
}
public void paintClock( Graphics g )
{
g.setColor( clkEnabled ? Color.red : Color.black );
g.drawString("CLK",93,235);
g.drawLine(100,225,100,215); // Clock
g.drawLine(100,210,97,215); // Clock
g.drawLine(100,210,103,215); // Clock
}
public void paintDots( Graphics g )
{
g.setColor( Color.red );
for ( int index = 0; index < currentDotLocation.length;
index++ )
{
if ( currentDotEnabled[ index ] )
{
g.fillRect( currentDotLocation[ index ].x - 3,
currentDotLocation[ index ].y - 3, 7, 7 );
}
}
}
private Image offScreenImage = null;
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -