trunk/src/mess/machine/ti99/gromport.c
| r30863 | r30864 | |
| 1144 | 1144 | if (m_pcb->m_grom_size > 0) |
| 1145 | 1145 | { |
| 1146 | 1146 | regg = memregion(CARTGROM_TAG); |
| 1147 | | grom_ptr = m_softlist? get_software_region("grom_socket") : (UINT8*)m_rpk->get_contents_of_socket("grom_socket"); |
| 1147 | grom_ptr = m_softlist? get_software_region("grom_socket") : m_rpk->get_contents_of_socket("grom_socket"); |
| 1148 | 1148 | memcpy(regg->base(), grom_ptr, m_pcb->m_grom_size); |
| 1149 | 1149 | m_pcb->m_grom_ptr = regg->base(); // for gromemu |
| 1150 | 1150 | m_pcb->m_grom_address = 0; // for gromemu |
| r30863 | r30864 | |
| 1162 | 1162 | { |
| 1163 | 1163 | if (VERBOSE>6) LOG("gromport: rom_socket.size=0x%04x\n", m_pcb->m_rom_size); |
| 1164 | 1164 | regr = memregion(CARTROM_TAG); |
| 1165 | | m_pcb->m_rom_ptr = m_softlist? get_software_region("rom_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom_socket"); |
| 1165 | m_pcb->m_rom_ptr = m_softlist? get_software_region("rom_socket") : m_rpk->get_contents_of_socket("rom_socket"); |
| 1166 | 1166 | memcpy(regr->base(), m_pcb->m_rom_ptr, m_pcb->m_rom_size); |
| 1167 | 1167 | // Set both pointers to the same region for now |
| 1168 | 1168 | m_pcb->m_rom_ptr = m_pcb->m_rom2_ptr = regr->base(); |
| r30863 | r30864 | |
| 1173 | 1173 | { |
| 1174 | 1174 | // sizes do not differ between rom and rom2 |
| 1175 | 1175 | regr2 = memregion(CARTROM2_TAG); |
| 1176 | | m_pcb->m_rom2_ptr = m_softlist? get_software_region("rom2_socket") : (UINT8*)m_rpk->get_contents_of_socket("rom2_socket"); |
| 1176 | m_pcb->m_rom2_ptr = m_softlist? get_software_region("rom2_socket") : m_rpk->get_contents_of_socket("rom2_socket"); |
| 1177 | 1177 | memcpy(regr2->base(), m_pcb->m_rom2_ptr, rom2_length); |
| 1178 | 1178 | m_pcb->m_rom2_ptr = regr2->base(); |
| 1179 | 1179 | } |
| r30863 | r30864 | |
| 1185 | 1185 | if (m_pcb->m_ram_size > 0) |
| 1186 | 1186 | { |
| 1187 | 1187 | // TODO: Consider to use a region as well. If so, do not forget to memcpy. |
| 1188 | | m_pcb->m_ram_ptr = (UINT8*)m_rpk->get_contents_of_socket("ram_socket"); |
| 1188 | m_pcb->m_ram_ptr = m_rpk->get_contents_of_socket("ram_socket"); |
| 1189 | 1189 | } |
| 1190 | 1190 | } |
| 1191 | 1191 | } |
| r30863 | r30864 | |
| 2076 | 2076 | /* |
| 2077 | 2077 | Deliver the contents of the socket by name of the socket. |
| 2078 | 2078 | */ |
| 2079 | | void* rpk::get_contents_of_socket(const char *socket_name) |
| 2079 | UINT8* rpk::get_contents_of_socket(const char *socket_name) |
| 2080 | 2080 | { |
| 2081 | 2081 | rpk_socket *socket = m_sockets.find(socket_name); |
| 2082 | 2082 | if (socket==NULL) return NULL; |
| r30863 | r30864 | |
| 2123 | 2123 | not a network socket) |
| 2124 | 2124 | ***************************************************************/ |
| 2125 | 2125 | |
| 2126 | | rpk_socket::rpk_socket(const char* id, int length, void* contents, const char *pathname) |
| 2126 | rpk_socket::rpk_socket(const char* id, int length, UINT8* contents, const char *pathname) |
| 2127 | 2127 | : m_id(id), m_length(length), m_next(NULL), m_contents(contents), m_pathname(pathname) |
| 2128 | 2128 | { |
| 2129 | 2129 | }; |
| 2130 | 2130 | |
| 2131 | | rpk_socket::rpk_socket(const char* id, int length, void* contents) |
| 2131 | rpk_socket::rpk_socket(const char* id, int length, UINT8* contents) |
| 2132 | 2132 | : m_id(id), m_length(length), m_next(NULL), m_contents(contents), m_pathname(NULL) |
| 2133 | 2133 | { |
| 2134 | 2134 | }; |
| r30863 | r30864 | |
| 2171 | 2171 | zip_error ziperr; |
| 2172 | 2172 | UINT32 crc; |
| 2173 | 2173 | int length; |
| 2174 | | void* contents; |
| 2174 | UINT8* contents; |
| 2175 | 2175 | const zip_file_header *header; |
| 2176 | 2176 | |
| 2177 | 2177 | // find the file attribute (required) |
| r30863 | r30864 | |
| 2197 | 2197 | length = header->uncompressed_length; |
| 2198 | 2198 | |
| 2199 | 2199 | // Allocate storage |
| 2200 | | contents = malloc(length); |
| 2200 | contents = global_alloc_array_clear(UINT8, length); |
| 2201 | 2201 | if (contents==NULL) throw rpk_exception(RPK_OUT_OF_MEMORY); |
| 2202 | 2202 | |
| 2203 | 2203 | // and unzip file from the zip file |
| r30863 | r30864 | |
| 2231 | 2231 | const char* ram_filename; |
| 2232 | 2232 | const char* ram_pname; |
| 2233 | 2233 | int length; |
| 2234 | | void* contents; |
| 2234 | UINT8* contents; |
| 2235 | 2235 | |
| 2236 | 2236 | // find the length attribute |
| 2237 | 2237 | length_string = xml_get_attribute_string(ram_resource_node, "length", NULL); |
| r30863 | r30864 | |
| 2259 | 2259 | } |
| 2260 | 2260 | |
| 2261 | 2261 | // Allocate memory for this resource |
| 2262 | | contents = malloc(length); |
| 2262 | contents = global_alloc_array_clear(UINT8, length); |
| 2263 | 2263 | if (contents==NULL) throw rpk_exception(RPK_OUT_OF_MEMORY); |
| 2264 | 2264 | |
| 2265 | 2265 | if (VERBOSE>6) LOG("gromport/RPK: Allocating RAM buffer (%d bytes) for socket '%s'\n", length, socketname); |
| r30863 | r30864 | |
| 2278 | 2278 | ram_filename = xml_get_attribute_string(ram_resource_node, "file", NULL); |
| 2279 | 2279 | if (ram_filename==NULL) |
| 2280 | 2280 | { |
| 2281 | | free(contents); |
| 2281 | global_free_array(contents); |
| 2282 | 2282 | throw rpk_exception(RPK_INVALID_RAM_SPEC, "<ram type='persistent'> must have a 'file' attribute"); |
| 2283 | 2283 | } |
| 2284 | 2284 | astring ram_pathname(system_name, PATH_SEPARATOR, ram_filename); |
trunk/src/mess/machine/ti99/gromport.h
| r30863 | r30864 | |
| 406 | 406 | friend class rpk; |
| 407 | 407 | |
| 408 | 408 | public: |
| 409 | | rpk_socket(const char *id, int length, void *contents); |
| 410 | | rpk_socket(const char *id, int length, void *contents, const char *pathname); |
| 409 | rpk_socket(const char *id, int length, UINT8 *contents); |
| 410 | rpk_socket(const char *id, int length, UINT8 *contents, const char *pathname); |
| 411 | 411 | |
| 412 | 412 | const char* id() { return m_id; } |
| 413 | 413 | int get_content_length() { return m_length; } |
| 414 | | void* get_contents() { return m_contents; } |
| 414 | UINT8* get_contents() { return m_contents; } |
| 415 | 415 | bool persistent_ram() { return m_pathname != NULL; } |
| 416 | 416 | const char* get_pathname() { return m_pathname; } |
| 417 | | void cleanup() { if (m_contents != NULL) free(m_contents); } |
| 417 | void cleanup() { if (m_contents != NULL) global_free_array(m_contents); } |
| 418 | 418 | |
| 419 | 419 | private: |
| 420 | | const char *m_id; |
| 420 | const char* m_id; |
| 421 | 421 | UINT32 m_length; |
| 422 | | rpk_socket *m_next; |
| 423 | | void *m_contents; |
| 424 | | const char *m_pathname; |
| 422 | rpk_socket* m_next; |
| 423 | UINT8* m_contents; |
| 424 | const char* m_pathname; |
| 425 | 425 | }; |
| 426 | 426 | |
| 427 | 427 | class rpk_reader |
| r30863 | r30864 | |
| 447 | 447 | ~rpk(); |
| 448 | 448 | |
| 449 | 449 | int get_type(void) { return m_type; } |
| 450 | | void* get_contents_of_socket(const char *socket_name); |
| 450 | UINT8* get_contents_of_socket(const char *socket_name); |
| 451 | 451 | int get_resource_length(const char *socket_name); |
| 452 | 452 | void close(); |
| 453 | 453 | |