fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/devices/nvram.c *
7 * Created: 2003-12-23 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2003-2011 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include <stdio.h>
24#include <stdlib.h>
25
26#include "nvram.h"
27
28
29void nvr_init (nvram_t *nvr, unsigned long base, unsigned long size)
30{
31 nvr->mem = mem_blk_new (base, size, 1);
32 nvr->mem->ext = nvr;
33 nvr_set_endian (nvr, 1);
34 mem_blk_clear (nvr->mem, 0x00);
35
36 nvr->fp = NULL;
37 nvr->close = 0;
38}
39
40nvram_t *nvr_new (unsigned long base, unsigned long size)
41{
42 nvram_t *nvr;
43
44 nvr = (nvram_t *) malloc (sizeof (nvram_t));
45 if (nvr == NULL) {
46 return (NULL);
47 }
48
49 nvr_init (nvr, base, size);
50
51 return (nvr);
52}
53
54void nvr_free (nvram_t *nvr)
55{
56 if (nvr != NULL) {
57 mem_blk_del (nvr->mem);
58
59 if (nvr->close) {
60 fclose (nvr->fp);
61 }
62 }
63}
64
65void nvr_del (nvram_t *nvr)
66{
67 if (nvr != NULL) {
68 nvr_free (nvr);
69 free (nvr);
70 }
71}
72
73void nvr_set_endian (nvram_t *nvr, int big)
74{
75 if (big) {
76 nvr->mem->set_uint8 = (mem_set_uint8_f) &nvr_set_uint8;
77 nvr->mem->set_uint16 = (mem_set_uint16_f) &nvr_set_uint16_be;
78 nvr->mem->set_uint32 = (mem_set_uint32_f) &nvr_set_uint32_be;
79
80 nvr->mem->get_uint8 = (mem_get_uint8_f) &nvr_get_uint8;
81 nvr->mem->get_uint16 = (mem_get_uint16_f) &nvr_get_uint16_be;
82 nvr->mem->get_uint32 = (mem_get_uint32_f) &nvr_get_uint32_be;
83 }
84 else {
85 nvr->mem->set_uint8 = (mem_set_uint8_f) &nvr_set_uint8;
86 nvr->mem->set_uint16 = (mem_set_uint16_f) &nvr_set_uint16_le;
87 nvr->mem->set_uint32 = (mem_set_uint32_f) &nvr_set_uint32_le;
88
89 nvr->mem->get_uint8 = (mem_get_uint8_f) &nvr_get_uint8;
90 nvr->mem->get_uint16 = (mem_get_uint16_f) &nvr_get_uint16_le;
91 nvr->mem->get_uint32 = (mem_get_uint32_f) &nvr_get_uint32_le;
92 }
93}
94
95int nvr_set_file (nvram_t *nvr, FILE *fp, int close)
96{
97 if (nvr->close) {
98 fclose (nvr->fp);
99 }
100
101 if (fp == NULL) {
102 nvr->fp = NULL;
103 nvr->close = 0;
104 return (0);
105 }
106
107 nvr->fp = fp;
108 nvr->close = close;
109
110 if (fseek (nvr->fp, 0, SEEK_SET)) {
111 nvr->fp = NULL;
112 nvr->close = 0;
113
114 if (close) {
115 fclose (fp);
116 }
117
118 return (1);
119 }
120
121 mem_blk_clear (nvr->mem, 0x00);
122
123 (void) fread (nvr->mem->data, 1, nvr->mem->size, nvr->fp);
124
125 return (0);
126}
127
128int nvr_set_fname (nvram_t *nvr, const char *fname)
129{
130 FILE *fp;
131
132 fp = fopen (fname, "r+b");
133 if (fp == NULL) {
134 fp = fopen (fname, "w+b");
135 }
136
137 if (fp == NULL) {
138 return (1);
139 }
140
141 return (nvr_set_file (nvr, fp, 1));
142}
143
144mem_blk_t *nvr_get_mem (nvram_t *nvr)
145{
146 return (nvr->mem);
147}
148
149static
150void nvr_write (nvram_t *nvr, unsigned long addr, unsigned long size)
151{
152 if (nvr->fp != NULL) {
153 if (fseek (nvr->fp, addr, SEEK_SET) == 0) {
154 (void) fwrite (nvr->mem->data + addr, 1, size, nvr->fp);
155 fflush (nvr->fp);
156 }
157 }
158}
159
160void nvr_set_uint8 (nvram_t *nvr, unsigned long addr, unsigned char val)
161{
162 nvr->mem->data[addr] = val;
163 nvr_write (nvr, addr, 1);
164}
165
166void nvr_set_uint16_be (nvram_t *nvr, unsigned long addr, unsigned short val)
167{
168 nvr->mem->data[addr] = (val >> 8) & 0xff;
169 nvr->mem->data[addr + 1] = val & 0xff;
170 nvr_write (nvr, addr, 2);
171}
172
173void nvr_set_uint16_le (nvram_t *nvr, unsigned long addr, unsigned short val)
174{
175 nvr->mem->data[addr] = val & 0xff;
176 nvr->mem->data[addr + 1] = (val >> 8) & 0xff;
177 nvr_write (nvr, addr, 2);
178}
179
180void nvr_set_uint32_be (nvram_t *nvr, unsigned long addr, unsigned long val)
181{
182 nvr->mem->data[addr] = (val >> 24) & 0xff;
183 nvr->mem->data[addr + 1] = (val >> 16) & 0xff;
184 nvr->mem->data[addr + 2] = (val >> 8) & 0xff;
185 nvr->mem->data[addr + 3] = val & 0xff;
186 nvr_write (nvr, addr, 4);
187}
188
189void nvr_set_uint32_le (nvram_t *nvr, unsigned long addr, unsigned long val)
190{
191 nvr->mem->data[addr] = val & 0xff;
192 nvr->mem->data[addr + 1] = (val >> 8) & 0xff;
193 nvr->mem->data[addr + 2] = (val >> 16) & 0xff;
194 nvr->mem->data[addr + 3] = (val >> 24) & 0xff;
195 nvr_write (nvr, addr, 4);
196}
197
198unsigned char nvr_get_uint8 (nvram_t *nvr, unsigned long addr)
199{
200 return (mem_blk_get_uint8 (nvr->mem, addr));
201}
202
203unsigned short nvr_get_uint16_be (nvram_t *nvr, unsigned long addr)
204{
205 return (mem_blk_get_uint16_be (nvr->mem, addr));
206}
207
208unsigned short nvr_get_uint16_le (nvram_t *nvr, unsigned long addr)
209{
210 return (mem_blk_get_uint16_le (nvr->mem, addr));
211}
212
213unsigned long nvr_get_uint32_be (nvram_t *nvr, unsigned long addr)
214{
215 return (mem_blk_get_uint32_be (nvr->mem, addr));
216}
217
218unsigned long nvr_get_uint32_le (nvram_t *nvr, unsigned long addr)
219{
220 return (mem_blk_get_uint32_le (nvr->mem, addr));
221}