-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstorage.erl
39 lines (33 loc) · 948 Bytes
/
storage.erl
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
-module(storage).
-compile(export_all).
-define(ZERO, <<0:32>>).
new() ->
TableID = ets:new(virtual_memory, []),
lists:foreach(fun(I) ->
ets:insert(TableID, {{reg, I}, ?ZERO})
end, lists:seq(0, 31)),
TableID.
read_reg(TableID, Index) ->
[{{reg, Index}, Data}] = ets:lookup(TableID, {reg, Index}),
Data.
write_reg(_TableID, 0, _Data) ->
true;
write_reg(TableID, Index, Data) ->
true = ets:insert(TableID, {{reg, Index}, Data}).
write_mem(TableID, <<Addr:32>>, Data) when size(Data) =:= 4 ->
io:format("addr:~p~n", [Addr]),
if Addr rem 4 =:= 0 ->
true = ets:insert(TableID, {{mem, Addr}, Data});
true ->
self() ! address_error
end.
read_mem(TableID, <<Addr:32>>) ->
if Addr rem 4 =:= 0 ->
case ets:lookup(TableID, {mem, Addr}) of
[{{mem, Addr}, Data}] -> Data;
[] -> ?ZERO
end;
true ->
self() ! address_error,
?ZERO
end.