func: 6 bits, rs: 4 bits, rt: 4 bits, adr: 8 bits, ra: 4 bits
Instruction | Format | Operation |
---|---|---|
RT $func, $rs, $rt | 0b00[func][rs][rt] |
$rs = $rs $func $rt |
LD $rs, $adr | 0b0100[rs][adr___] |
$rs = memory[$adr] |
LDR $rs, $rt, $ra | 0b0101[rs][rt][ra] |
$rs = memory[$rt + $ra] |
ST $rs, $adr | 0b0110[rs][adr___] |
memory[$adr] = $rs |
STR $rs, $rt, $ra | 0b0111[rs][rt][ra] |
memory[$rt + $ra] = $rs |
JZ $rs, $adr | 0b1001[rs][adr___] |
pc = $rs == 0 ? $adr : pc |
JNZ $rs, $adr | 0b1010[rs][adr___] |
pc = $rs != 0 ? $adr : pc |
JU $adr | 0b10000000[adr___] |
pc = $adr |
SB $adr | 0b01100000[adr___] |
bsr = $addr |
Func | Operation |
---|---|
000010 | $rs = $rs + $rt |
010011 | $rs = $rs - $rt |
000111 | $rs = $rt - $rs |
011111 | $rs = $rs + 1 |
001110 | $rs = $rs - 1 |
000000 | $rs = $rs and $rt |
010101 | $rs = $rs or $rt |
001101 | $rs = not $rs |
110001 | $rs = not $rt |
001100 | $rs = $rs |
110000 | $rs = $rt |
Name | Description |
---|---|
PC | Program counter |
MAR | Memory address register |
MBR | Memory buffer register |
AC[16] | Accumulator |
IR | Instruction register |
BSR | Bank select register |
Name | Number | Description |
---|---|---|
$0 | 0 | Constant 0 |
$at | 1 | Assembler temp |
$v0 | 2 | Return value |
$a0~$a1 | 3~4 | Arguments |
$t0~$t7 | 5~12 | Temporaries |
$sp | 13 | Stack pointer |
$fp | 14 | Frame pointer |
$ra | 15 | Return address |
State \ Instruction | RT | LD | LDR | ST | JZ | JU | SB |
---|---|---|---|---|---|---|---|
e0 | Load_MAR, Gate_PC | Load_MAR, Gate_PC | Load_MAR, Gate_PC | Load_MAR, Gate_PC | |||
e1 | Load_Memory | Load_Memory | Load_Memory | Load_Memory | |||
e2 | Load_AC, Gate_AC, ALU = $func | Load_MAR, Gate_MBR | Load_AC, Gate_AC, ALU = PASS, adr1 = at, adr2 = rt | Load_BSR, Gate_MBR | |||
e3 | Inc_PC | Load_Memory | Load_AC, Gate_AC, ALU = ADD, adr1 = at, adr2 = ra | Inc_PC | |||
e4 | Load_AC, Gate_MBR, ALU = PASS | Load_MAR, Gate_A, adr1 = at | |||||
e5 | Inc_PC | Load_Memory | |||||
e6 | Load_AC, Gate_MBR, ALU = PASS, adr1 = rs | ||||||
e7 | Inc_PC |
Write a string to the screen.
Arg | Description |
---|---|
adr | Head address of the string.s |
len | Length of the string. 0 < len <= 6 |
LD $a0, adr
LD $a1, len
LD $ra, x
JU write
x: //
// write
write: LD $t0, chars
LD $t2, display
AND $t3, $0 // offset
y: LDR $t1, $a0, $t0 // load char
STR $t1, $t2, $t3 // display char
INCR $t3, $0
DECR $a1, $0
JNZ $a1, y
JU $ra // return
// 7 seg decoder char map
chars: 01111110 // 0
00110000 // 1
01101101 // 2
display: // memory mapped i/o
Read a number from the keyboard.
Arg | Description |
---|---|
adr | Address of the buffer |
len | Buffer size |
LD $a0, adr
LD $a1, len
LD $ra, x
JU read
x: //
read: LD $t0, chars
LD $t1, display
AND $t2, $0 // offset
Key(3): Input number Key(2): Input operator Key(1): Calculate
- Display "Calculator" on the screen for 2 seconds
- Wait for input
- If key(3) is pressed, display the number on the screen