blob: 7138bcdcea9b053d1122ba65a06969858c9b5243 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#include "mips.h"
#include <stdlib.h>
struct mips_cpu_impl{
uint32_t pc;
uint32_t pcN;
uint32_t regs[32];
mips_mem_h mem;
};
mips_cpu_h mips_cpu_create(mips_mem_h mem)
{
unsigned i;
mips_cpu_h res=(mips_cpu_h)malloc(sizeof(struct mips_cpu_impl));
res->mem=mem;
res->pc=0;
res->pcN=4; // NOTE: why does this make sense?
for( i=0;i<32;i++){
res->regs[i]=0;
}
return res;
}
void mips_cpu_free(mips_cpu_h state)
{
free(state);
}
mips_error mips_cpu_get_register(
mips_cpu_h state, //!< Valid (non-empty) handle to a CPU
unsigned index, //!< Index from 0 to 31
uint32_t *value //!< Where to write the value to
)
{
if(state==0)
return mips_ErrorInvalidHandle;
if(index>=32)
return mips_ErrorInvalidArgument;
if(value==0)
return mips_ErrorInvalidArgument;
*value = state->regs[index];
return mips_Success;
}
/*! Modifies one of the 32 general purpose MIPS registers. */
mips_error mips_cpu_set_register(
mips_cpu_h state, //!< Valid (non-empty) handle to a CPU
unsigned index, //!< Index from 0 to 31
uint32_t value //!< New value to write into register file
)
{
if(state==0)
return mips_ErrorInvalidHandle;
if(index>=32)
return mips_ErrorInvalidArgument;
// TODO : What about register zero?
state->regs[index]=value;
return mips_Success;
}
mips_error mips_cpu_step(mips_cpu_h state)
{
uint32_t pc=state->pc;
if(state==0)
return mips_ErrorInvalidHandle;
//TODO: Here is where the magic happens
// - Fetch the instruction from memory (mips_mem_read)
// - Decode the instruction (is it R, I, J)?
// - Execute the instruction (do maths, access memory, ...)
// - Writeback the results (update registers, advance pc)
return mips_ErrorNotImplemented;
}
|