1 /*
2   Mem
3 */
4 
5 #include "mem.h"
6 
7 #include "page.h"
8 
9 /*
10   Pointers into workspace
11   May not assume that pages are contigous in memory or remain
12   across calls to this routine ... allows swapping out of modified
13   pages on small machines.
14 */
15 
ptr_from_addr(long_word addr)16 static byte *ptr_from_addr(long_word addr)
17 {
18   word page = pg_page(addr);
19   word off  = pg_offset(addr);
20   return ptr_from_seg(page, off);
21 }
22 
23 
rd_byte_addr(long_word addr)24 byte rd_byte_addr(long_word addr)
25 {
26   return *ptr_from_addr(addr);
27 }
28 
29 /* Word reads */
30 
rd_word_ptr(byte * p)31 word rd_word_ptr(byte *p)
32 {
33   return make_word(p[0], p[1]);
34 }
35 
rd_word_seg(word page,word off)36 word rd_word_seg(word page, word off)
37 {
38   byte hi = rd_byte_seg(page, off);
39   byte lo = off + 1 == BLOCK_SIZE
40     ? rd_byte_seg(page + 1, 0)
41     : rd_byte_seg(page, off + 1);
42   return make_word(hi, lo);
43 }
44 
rd_word_addr(long_word addr)45 word rd_word_addr(long_word addr)
46 {
47   return rd_word_seg(pg_page(addr), pg_offset(addr));
48 }
49 
50 /* Byte writes */
51 
wr_byte_addr(long_word addr,byte value)52 void wr_byte_addr(long_word addr, byte value)
53 {
54   *ptr_from_addr(addr) = value;
55 }
56 
57 /* Word writes */
58 
wr_word_ptr(byte * p,word value)59 void wr_word_ptr(byte *p, word value)
60 {
61   p[0] = value >> 8;
62   p[1] = value;
63 }
64 
wr_word_addr(long_word addr,word value)65 void wr_word_addr(long_word addr, word value)
66 {
67   wr_byte_addr(addr, value >> 8);
68   wr_byte_addr(addr+1, value);
69 }
70