fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 221 lines 5.6 kB view raw
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}