mirror of
https://github.com/pevans/erc-c.git
synced 2024-12-21 23:29:16 +00:00
Add support for setting read/write map functions
This commit is contained in:
parent
ca7e576266
commit
7da2f9e791
@ -58,5 +58,7 @@ extern vm_segment *vm_segment_create(size_t);
|
|||||||
extern void vm_segment_free(vm_segment *);
|
extern void vm_segment_free(vm_segment *);
|
||||||
extern vm_8bit vm_segment_get(vm_segment *, size_t);
|
extern vm_8bit vm_segment_get(vm_segment *, size_t);
|
||||||
extern int vm_segment_set(vm_segment *, size_t, vm_8bit);
|
extern int vm_segment_set(vm_segment *, size_t, vm_8bit);
|
||||||
|
extern int vm_segment_read_map(vm_segment *, size_t, vm_segment_read_fn);
|
||||||
|
extern int vm_segment_write_map(vm_segment *, size_t, vm_segment_write_fn);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -157,3 +157,29 @@ vm_segment_copy(vm_segment *dest,
|
|||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vm_segment_read_map(vm_segment *segment,
|
||||||
|
size_t addr,
|
||||||
|
vm_segment_read_fn fn)
|
||||||
|
{
|
||||||
|
if (addr >= segment->size) {
|
||||||
|
return ERR_OOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
segment->read_table[addr] = fn;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vm_segment_write_map(vm_segment *segment,
|
||||||
|
size_t addr,
|
||||||
|
vm_segment_write_fn fn)
|
||||||
|
{
|
||||||
|
if (addr >= segment->size) {
|
||||||
|
return ERR_OOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
segment->write_table[addr] = fn;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -72,3 +72,24 @@ Test(vm_segment, copy) {
|
|||||||
vm_segment_free(src);
|
vm_segment_free(src);
|
||||||
vm_segment_free(dest);
|
vm_segment_free(dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Test(vm_segment, read_map)
|
||||||
|
{
|
||||||
|
// We use some trickery here; I don't want to go to the trouble of
|
||||||
|
// defining a function for this test, so I am just passing in an
|
||||||
|
// arbitrary pointer to junk. As long as the garbage-in, garbage-out
|
||||||
|
// principle holds, we're golden.
|
||||||
|
cr_assert_eq(vm_segment_read_map(segment, 123, (vm_segment_read_fn)456), OK);
|
||||||
|
cr_assert_eq(vm_segment_read_map(segment, 321, (vm_segment_read_fn)456), ERR_OOB);
|
||||||
|
|
||||||
|
cr_assert_eq(segment->read_table[123], (vm_segment_read_fn)456);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(vm_segment, write_map)
|
||||||
|
{
|
||||||
|
// See the read_map test for more details on the following trickery
|
||||||
|
cr_assert_eq(vm_segment_write_map(segment, 123, (vm_segment_write_fn)456), OK);
|
||||||
|
cr_assert_eq(vm_segment_write_map(segment, 321, (vm_segment_write_fn)456), ERR_OOB);
|
||||||
|
|
||||||
|
cr_assert_eq(segment->write_table[123], (vm_segment_write_fn)456);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user