Skip to content
Snippets Groups Projects
Commit 4b1aa8f8 authored by Eetu Pesonen's avatar Eetu Pesonen
Browse files

factorial example

parent 5341fc36
No related branches found
No related tags found
No related merge requests found
...@@ -129,6 +129,8 @@ uint32_t Memory::read(uint32_t addr, enum size size) ...@@ -129,6 +129,8 @@ uint32_t Memory::read(uint32_t addr, enum size size)
throw invl_arg(ERR_MSG("size = SIZE_SPECIAL")); throw invl_arg(ERR_MSG("size = SIZE_SPECIAL"));
} }
logger->write("\t read %x", ret);
return ret; return ret;
} }
......
...@@ -514,7 +514,7 @@ enum exec_status RPU32::execute() ...@@ -514,7 +514,7 @@ enum exec_status RPU32::execute()
else if (BITSnm(instr.get_raw(), 6, 15) == 0b0100111011) else if (BITSnm(instr.get_raw(), 6, 15) == 0b0100111011)
{ {
// JMP // JMP
decode_ea(instr.get_ea()); decode_ea(instr.get_ea(), instr.get_size());
if (ea_state != EA_STATE_MEM) if (ea_state != EA_STATE_MEM)
throw invalid_instr(instr.get_raw()); throw invalid_instr(instr.get_raw());
...@@ -525,7 +525,7 @@ enum exec_status RPU32::execute() ...@@ -525,7 +525,7 @@ enum exec_status RPU32::execute()
else if (BITSnm(instr.get_raw(), 6, 15) == 0b0100111010) else if (BITSnm(instr.get_raw(), 6, 15) == 0b0100111010)
{ {
// JSR // JSR
decode_ea(instr.get_ea()); decode_ea(instr.get_ea(), instr.get_size());
if (ea_state != EA_STATE_MEM) if (ea_state != EA_STATE_MEM)
throw invalid_instr(instr.get_raw()); throw invalid_instr(instr.get_raw());
...@@ -823,7 +823,7 @@ uint32_t RPU32::read_ea(uint8_t ea, enum size size) ...@@ -823,7 +823,7 @@ uint32_t RPU32::read_ea(uint8_t ea, enum size size)
ea); ea);
if (ea_state == EA_STATE_UNINIT) if (ea_state == EA_STATE_UNINIT)
decode_ea(ea); decode_ea(ea, size);
if (ea_state == EA_STATE_REG) if (ea_state == EA_STATE_REG)
{ {
...@@ -876,7 +876,7 @@ void RPU32::write_ea(uint8_t ea, uint32_t data, enum size size) ...@@ -876,7 +876,7 @@ void RPU32::write_ea(uint8_t ea, uint32_t data, enum size size)
data, ea); data, ea);
if (ea_state == EA_STATE_UNINIT) if (ea_state == EA_STATE_UNINIT)
decode_ea(ea); decode_ea(ea, size);
if (ea_state == EA_STATE_REG) if (ea_state == EA_STATE_REG)
{ {
...@@ -903,7 +903,7 @@ void RPU32::write_ea(uint8_t ea, uint32_t data, enum size size) ...@@ -903,7 +903,7 @@ void RPU32::write_ea(uint8_t ea, uint32_t data, enum size size)
} }
} }
void RPU32::decode_ea(uint8_t ea) void RPU32::decode_ea(uint8_t ea, enum size size)
{ {
uint8_t reg = BITSnm(ea, 0, 2); uint8_t reg = BITSnm(ea, 0, 2);
uint8_t mode = BITSnm(ea, 3, 5); uint8_t mode = BITSnm(ea, 3, 5);
...@@ -937,7 +937,7 @@ void RPU32::decode_ea(uint8_t ea) ...@@ -937,7 +937,7 @@ void RPU32::decode_ea(uint8_t ea)
offset = regs->read(static_cast<reg_names>(reg + REG_A0), SIZE_LONG); offset = regs->read(static_cast<reg_names>(reg + REG_A0), SIZE_LONG);
ea_res = offset; ea_res = offset;
offset += (1 << instr.get_size()); // increment An by operand size offset += (1 << size); // increment An by operand size
regs->write(static_cast<reg_names>(reg + REG_A0), SIZE_LONG, offset); regs->write(static_cast<reg_names>(reg + REG_A0), SIZE_LONG, offset);
break; break;
...@@ -946,7 +946,7 @@ void RPU32::decode_ea(uint8_t ea) ...@@ -946,7 +946,7 @@ void RPU32::decode_ea(uint8_t ea)
ea_state = EA_STATE_MEM; ea_state = EA_STATE_MEM;
offset = regs->read(static_cast<reg_names>(reg + REG_A0), SIZE_LONG); offset = regs->read(static_cast<reg_names>(reg + REG_A0), SIZE_LONG);
offset -= (1 << instr.get_size()); // decrement An by operand size offset -= (1 << size); // decrement An by operand size
ea_res = offset; ea_res = offset;
regs->write(static_cast<reg_names>(reg + REG_A0), SIZE_LONG, offset); regs->write(static_cast<reg_names>(reg + REG_A0), SIZE_LONG, offset);
......
...@@ -83,7 +83,7 @@ private: ...@@ -83,7 +83,7 @@ private:
*/ */
uint32_t read_ea(uint8_t ea, enum size size); uint32_t read_ea(uint8_t ea, enum size size);
void write_ea(uint8_t ea, uint32_t data, enum size size); void write_ea(uint8_t ea, uint32_t data, enum size size);
void decode_ea(uint8_t ea); void decode_ea(uint8_t ea, enum size size);
enum ea_state ea_state; enum ea_state ea_state;
uint32_t ea_res; // address or register number decoded from ea uint32_t ea_res; // address or register number decoded from ea
......
...@@ -7,33 +7,58 @@ reset: ...@@ -7,33 +7,58 @@ reset:
.globl start .globl start
start: start:
move.l #0x400, %a7 /* setup the stack */ move.l #0x400, %a7 /* setup the stack */
move.w #128, %d2 move.w #4, %d1
move.w #8, %d3 jsr factorial
jsr multiply
stop #0 stop #0
/* %d0 = %d1! */
factorial:
cmpi.w #0, %d1
bne fskip1
move.w #1, %d0
rts
fskip1:
cmpi.w #1, %d1
bne fskip2
move.w #1, %d0
rts
fskip2:
move.w %d1, -(%a7)
subi #1, %d1
jsr factorial;
move.w (%a7)+, %d1
/* fact of (%d1 - 1) in %d0 */
jsr multiply
move.w %d2, %d0
rts
done: done:
move.w (%a7), %d0 move.w (%a7), %d0
rts rts
multiply: /* %d4 = %d2 * %d3 */ multiply: /* %d2 = %d0 * %d1 */
cmpi.w #1, %d3 /* %d2 + 1 = %d2, return */ cmpi.w #1, %d1 /* %d0 * 1 = %d0, return */
bne notone bne mskip1
move.w %d2, %d4 move.w %d2, %d0
rts rts
notone: mskip1:
cmpi.w #0, %d3 /* %d2 * 0 = 0 */ clr.l %d2
bne notzero cmpi.w #0, %d1 /* %d0 * 0 = 0 */
clr.w %d4 bne mskip2
rts rts
notzero: mskip2:
subi.w #1, %d3 add.l %d0, %d2
add.l %d2, %d4 subi.w #1, %d1
cmpi.w #0, %d3 cmpi.w #0, %d1
bne notzero /* Loop until done */ bne mskip2 /* Loop until done */
rts rts
.section .data .section .data
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment