Previous 15994 Revisions Next

r14575 Wednesday 22nd February, 2012 at 21:46:05 UTC by Curt Coder
[VIC20] Added support for loading .crt files. Note: this will only work if the first 2 bytes of the file contain the loading address, and only for single part cartridges. Please use the MESS software list instead of loose files. [Curt Coder]
[src/mess/machine]c64exp.c c64exp.h vic20exp.c vic20exp.h

src/mess/machine/vic20exp.c
r14574r14575
228228      {
229229         size = length();
230230
231         if (!mame_stricmp(filetype(), "20")) fread(m_cart->vic20_blk1_pointer(machine(), size), size);
232         else if (!mame_stricmp(filetype(), "40")) fread(m_cart->vic20_blk2_pointer(machine(), size), size);
233         else if (!mame_stricmp(filetype(), "60")) fread(m_cart->vic20_blk3_pointer(machine(), size), size);
234         else if (!mame_stricmp(filetype(), "70")) fread(m_cart->vic20_blk3_pointer(machine(), size + 0x1000) + 0x1000, size);
235         else if (!mame_stricmp(filetype(), "a0")) fread(m_cart->vic20_blk5_pointer(machine(), size), size);
236         else if (!mame_stricmp(filetype(), "b0")) fread(m_cart->vic20_blk5_pointer(machine(), size + 0x1000) + 0x1000, size);
231         if (!mame_stricmp(filetype(), "20")) fread(m_cart->vic20_blk1_pointer(machine(), 0x2000), 0x2000);
232         else if (!mame_stricmp(filetype(), "40")) fread(m_cart->vic20_blk2_pointer(machine(), 0x2000), 0x2000);
233         else if (!mame_stricmp(filetype(), "60")) fread(m_cart->vic20_blk3_pointer(machine(), 0x2000), 0x2000);
234         else if (!mame_stricmp(filetype(), "70")) fread(m_cart->vic20_blk3_pointer(machine(), 0x2000) + 0x1000, 0x1000);
235         else if (!mame_stricmp(filetype(), "a0")) fread(m_cart->vic20_blk5_pointer(machine(), 0x2000), 0x2000);
236         else if (!mame_stricmp(filetype(), "b0")) fread(m_cart->vic20_blk5_pointer(machine(), 0x2000) + 0x1000, 0x1000);
237237         else if (!mame_stricmp(filetype(), "crt"))
238238         {
239239            // read the header
240            cbm_crt_header header;
241            fread(&header, CRT_HEADER_LENGTH);
242
243            if (memcmp(header.signature, CRT_SIGNATURE, 16) != 0)
244               return IMAGE_INIT_FAIL;
245
246            UINT16 hardware = pick_integer_be(header.hardware, 0, 2);
247
248            // TODO support other cartridge hardware
249            if (hardware != CRT_VIC20_STANDARD)
250               return IMAGE_INIT_FAIL;
251
252            if (LOG)
240            UINT8 header[2];
241            fread(&header, 2);
242            UINT16 address = pick_integer_le(header, 0, 2);
243           
244            if (LOG) logerror("Address %04x\n", address);
245           
246            switch (address)
253247            {
254               logerror("Name: %s\n", header.name);
255               logerror("Hardware: %04x\n", hardware);
256               logerror("Slot device: %s\n", CRT_VIC20_SLOT_NAMES[hardware]);
248            case 0x2000: fread(m_cart->vic20_blk1_pointer(machine(), 0x2000), 0x2000); break;
249            case 0x4000: fread(m_cart->vic20_blk2_pointer(machine(), 0x2000), 0x2000); break;
250            case 0x6000: fread(m_cart->vic20_blk3_pointer(machine(), 0x2000), 0x2000); break;
251            case 0x7000: fread(m_cart->vic20_blk3_pointer(machine(), 0x2000) + 0x1000, 0x1000); break;
252            case 0xa000: fread(m_cart->vic20_blk5_pointer(machine(), 0x2000), 0x2000); break;
253            case 0xb000: fread(m_cart->vic20_blk5_pointer(machine(), 0x2000) + 0x1000, 0x1000); break;
254            default: return IMAGE_INIT_FAIL;
257255            }
258
259            // determine ROM region lengths
260            size_t blk1_size = 0;
261            size_t blk2_size = 0;
262            size_t blk3_size = 0;
263            size_t blk5_size = 0;
264
265            while (!image_feof())
266            {
267               cbm_crt_chip chip;
268               fread(&chip, CRT_CHIP_LENGTH);
269
270               UINT16 address = pick_integer_be(chip.start_address, 0, 2);
271               UINT16 size = pick_integer_be(chip.image_size, 0, 2);
272               UINT16 type = pick_integer_be(chip.chip_type, 0, 2);
273
274               if (LOG)
275               {
276                  logerror("CHIP Address: %04x\n", address);
277                  logerror("CHIP Size: %04x\n", size);
278                  logerror("CHIP Type: %04x\n", type);
279               }
280
281               switch (address)
282               {
283               case 0x2000: blk1_size += size; break;
284               case 0x4000: blk2_size += size; break;
285               case 0x6000: blk3_size += size; break;
286               case 0x7000: blk3_size += 0x2000; break;
287               case 0xa000: blk5_size += size; break;
288               case 0xb000: blk5_size += 0x2000; break;
289               default: logerror("Invalid CHIP loading address!\n"); break;
290               }
291
292               fseek(size, SEEK_CUR);
293            }
294
295            // allocate cartridge memory
296            UINT8 *blk1 = NULL;
297            UINT8 *blk2 = NULL;
298            UINT8 *blk3 = NULL;
299            UINT8 *blk5 = NULL;
300
301            if (blk1_size) blk1 = m_cart->vic20_blk1_pointer(machine(), blk1_size);
302            if (blk2_size) blk2 = m_cart->vic20_blk2_pointer(machine(), blk2_size);
303            if (blk3_size) blk3 = m_cart->vic20_blk3_pointer(machine(), blk3_size);
304            if (blk5_size) blk5 = m_cart->vic20_blk5_pointer(machine(), blk5_size);
305
306            // read the data
307            offs_t blk1_offset = 0;
308            offs_t blk2_offset = 0;
309            offs_t blk3_offset = 0;
310            offs_t blk5_offset = 0;
311
312            fseek(CRT_HEADER_LENGTH, SEEK_SET);
313
314            while (!image_feof())
315            {
316               cbm_crt_chip chip;
317               fread(&chip, CRT_CHIP_LENGTH);
318
319               UINT16 address = pick_integer_be(chip.start_address, 0, 2);
320               UINT16 size = pick_integer_be(chip.image_size, 0, 2);
321
322               switch (address)
323               {
324               case 0x2000: fread(blk1 + blk1_offset, size); blk1_offset += size; break;
325               case 0x4000: fread(blk2 + blk2_offset, size); blk2_offset += size; break;
326               case 0x6000: fread(blk3 + blk3_offset, size); blk3_offset += size; break;
327               case 0x7000: fread(blk3 + blk3_offset + 0x1000, size); blk3_offset += 0x2000; break;
328               case 0xa000: fread(blk5 + blk5_offset, size); blk5_offset += size; break;
329               case 0xb000: fread(blk5 + blk5_offset + 0x1000, size); blk5_offset += 0x2000; break;
330               }
331            }
332256         }
333257      }
334258      else
src/mess/machine/vic20exp.h
r14574r14575
134134   virtual bool must_be_loaded() const { return 0; }
135135   virtual bool is_reset_on_load() const { return 1; }
136136   virtual const char *image_interface() const { return "vic1001_cart"; }
137   virtual const char *file_extensions() const { return "20,40,60,70,a0,b0"; }
137   virtual const char *file_extensions() const { return "20,40,60,70,a0,b0,crt"; }
138138   virtual const option_guide *create_option_guide() const { return NULL; }
139139
140140   // slot interface overrides
src/mess/machine/c64exp.c
r14574r14575
255255
256256         if (!mame_stricmp(filetype(), "80"))
257257         {
258            fread(m_cart->c64_roml_pointer(machine(), 0x2000), 0x2000);
258            fread(m_cart->c64_roml_pointer(machine(), size), size);
259259            m_cart->c64_exrom_w(0);
260260
261261            if (size == 0x4000)
262262            {
263               fread(m_cart->c64_romh_pointer(machine(), 0x2000), 0x2000);
264263               m_cart->c64_game_w(0);
265264            }
266265         }
src/mess/machine/c64exp.h
r14574r14575
122122   virtual bool must_be_loaded() const { return 0; }
123123   virtual bool is_reset_on_load() const { return 1; }
124124   virtual const char *image_interface() const { return "c64_cart"; }
125   virtual const char *file_extensions() const { return "80,a0,e0"; }
125   virtual const char *file_extensions() const { return "80,a0,e0,crt"; }
126126   virtual const option_guide *create_option_guide() const { return NULL; }
127127
128128   // slot interface overrides

Previous 15994 Revisions Next


© 1998-2018 The MESS Team