1 #include <stdlib.h>
2 #include <stdio.h>
3 #include "ibm.h"
4 #include "config.h"
5 #include "mem.h"
6 #include "rom.h"
7 #include "paths.h"
8 
romfopen(char * fn,char * mode)9 FILE *romfopen(char *fn, char *mode)
10 {
11         FILE *f;
12         char s[512];
13         int i;
14 
15         for (i = 0; i < num_roms_paths; ++i)
16         {
17                 get_roms_path(i, s, 511);
18                 put_backslash(s);
19                 strcat(s, fn);
20                 f = fopen(s, mode);
21                 if (f)
22                         return f;
23         }
24         return 0;
25 }
26 
rom_present(char * fn)27 int rom_present(char *fn)
28 {
29         FILE *f;
30         f = romfopen(fn, "rb");
31         if (f)
32         {
33                 fclose(f);
34                 return 1;
35         }
36         return 0;
37 }
38 
rom_read(uint32_t addr,void * p)39 uint8_t rom_read(uint32_t addr, void *p)
40 {
41         rom_t *rom = (rom_t *)p;
42 //        pclog("rom_read : %08x %08x %02x\n", addr, rom->mask, rom->rom[addr & rom->mask]);
43         return rom->rom[addr & rom->mask];
44 }
rom_readw(uint32_t addr,void * p)45 uint16_t rom_readw(uint32_t addr, void *p)
46 {
47         rom_t *rom = (rom_t *)p;
48 //        pclog("rom_readw: %08x %08x %04x\n", addr, rom->mask, *(uint16_t *)&rom->rom[addr & rom->mask]);
49         return *(uint16_t *)&rom->rom[addr & rom->mask];
50 }
rom_readl(uint32_t addr,void * p)51 uint32_t rom_readl(uint32_t addr, void *p)
52 {
53         rom_t *rom = (rom_t *)p;
54 //        pclog("rom_readl: %08x %08x %08x\n", addr, rom->mask, *(uint32_t *)&rom->rom[addr & rom->mask]);
55         return *(uint32_t *)&rom->rom[addr & rom->mask];
56 }
57 
rom_init(rom_t * rom,char * fn,uint32_t address,int size,int mask,int file_offset,uint32_t flags)58 int rom_init(rom_t *rom, char *fn, uint32_t address, int size, int mask, int file_offset, uint32_t flags)
59 {
60         FILE *f = romfopen(fn, "rb");
61 
62         if (!f)
63         {
64                 pclog("ROM image not found : %s\n", fn);
65                 return -1;
66         }
67 
68         rom->rom = malloc(size);
69         fseek(f, file_offset, SEEK_SET);
70         fread(rom->rom, size, 1, f);
71         fclose(f);
72 
73         rom->mask = mask;
74 
75         mem_mapping_add(&rom->mapping, address, size, rom_read,
76                                                       rom_readw,
77                                                       rom_readl,
78                                                       mem_write_null,
79                                                       mem_write_nullw,
80                                                       mem_write_nulll,
81                                                       rom->rom,
82                                                       flags | MEM_MAPPING_ROM,
83                                                       rom);
84 
85         return 0;
86 }
87 
rom_init_interleaved(rom_t * rom,char * fn_low,char * fn_high,uint32_t address,int size,int mask,int file_offset,uint32_t flags)88 int rom_init_interleaved(rom_t *rom, char *fn_low, char *fn_high, uint32_t address, int size, int mask, int file_offset, uint32_t flags)
89 {
90         FILE *f_low  = romfopen(fn_low, "rb");
91         FILE *f_high = romfopen(fn_high, "rb");
92         int c;
93 
94         if (!f_low || !f_high)
95         {
96                 if (!f_low)
97                         pclog("ROM image not found : %s\n", fn_low);
98                 else
99                         fclose(f_low);
100                 if (!f_high)
101                         pclog("ROM image not found : %s\n", fn_high);
102                 else
103                         fclose(f_high);
104                 return -1;
105         }
106 
107         rom->rom = malloc(size);
108         fseek(f_low, file_offset, SEEK_SET);
109         fseek(f_high, file_offset, SEEK_SET);
110         for (c = 0; c < size; c += 2)
111         {
112                 rom->rom[c]     = getc(f_low);
113                 rom->rom[c + 1] = getc(f_high);
114         }
115         fclose(f_high);
116         fclose(f_low);
117 
118         rom->mask = mask;
119 
120         mem_mapping_add(&rom->mapping, address, size, rom_read,
121                                                       rom_readw,
122                                                       rom_readl,
123                                                       mem_write_null,
124                                                       mem_write_nullw,
125                                                       mem_write_nulll,
126                                                       rom->rom,
127                                                       flags | MEM_MAPPING_ROM,
128                                                       rom);
129 
130         return 0;
131 }
132