-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNanoMem.c
80 lines (69 loc) · 1.55 KB
/
NanoMem.c
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
#include "NanoCpu.h"
#define MEM_WORDS 32768
NANO_WORD led_out = 0xFF;
NANO_WORD sw_inp = 0xFF;
NANO_SHORT memory[MEM_WORDS];
#define ILLEGAL_ADDR(a) (((a) & 1) || (a >= MEM_WORDS * 2))
#define IO_ADDR(a) (((a) & 0xC000) == 0xC000)
int MemReadWord(NANO_ADDR addr, NANO_SHORT* data)
{
if (ILLEGAL_ADDR(addr))
return -1;
if (IO_ADDR(addr))
*data = InpReadWord(addr);
else
*data = memory[addr >> 1];
return 1;
}
int MemReadLong(NANO_ADDR addr, NANO_LONG* data)
{
NANO_SHORT lo,hi;
int result = MemReadWord(addr, &hi);
if (result < 0)
return result;
result = MemReadWord((NANO_ADDR) (addr + 2), &lo);
if (result < 0)
return result;
*data = ((NANO_LONG) hi << 16) | (lo);
return 2;
}
int MemWriteByte(NANO_ADDR addr, NANO_WORD data)
{
if (IO_ADDR(addr))
OutWriteWord(addr, data);
else
{
int8_t* ptr = ((int8_t*)memory) + addr;
*ptr = (int8_t) data;
}
return 1;
}
int MemWriteWord(NANO_ADDR addr, NANO_SHORT data)
{
if (ILLEGAL_ADDR(addr))
return -1;
if (IO_ADDR(addr))
OutWriteWord(addr, data);
else
memory[addr >> 1] = data;
return 1;
}
int MemWriteLong(NANO_ADDR addr, NANO_LONG data)
{
int result = MemWriteWord(addr, (NANO_SHORT) (data >> 16));
if (result < 0)
return result;
return MemWriteWord((NANO_ADDR) (addr + 2), (NANO_SHORT) data);
}
void MemCopyBytes(NANO_ADDR addr, void* buf, int length)
{
unsigned char* ptr = buf;
while (length > 0)
{
NANO_SHORT word = (ptr[0] << 8) | ptr[1];
MemWriteWord(addr, word);
addr += sizeof(NANO_SHORT);
ptr += sizeof(NANO_SHORT);
length -= sizeof(NANO_SHORT);
}
}