Previous 15994 Revisions Next

r5629 Monday 7th September, 2009 at 13:23:17 UTC by Miodrag Milanović
Floppy cleanup
[src/mess]mess.mak
[src/mess/drivers]comx35.c osborne1.c xerox820.c
[src/mess/formats]comx35_dsk.c* comx35_dsk.h*
[src/mess/machine]comx35.c osborne1.c

src/mess/machine/osborne1.c
r5628r5629
1919#include "machine/6821pia.h"
2020#include "machine/6850acia.h"
2121#include "machine/wd17xx.h"
22#include "devices/basicdsk.h"
2322#include "cpu/z80/z80daisy.h"
2423#include "sound/beep.h"
2524#include "includes/osborne1.h"
25#include "devices/mflopimg.h"
2626
2727#define RAMMODE      (0x01)
2828
r5628r5629
413413   timer_adjust_oneshot(osborne1.video_timer, video_screen_get_time_until_pos(machine->primary_screen, y + 1, 0 ), 0);
414414}
415415
416/*
417 * The Osborne-1 supports the following disc formats:
418 * - Osborne single density: 40 tracks, 10 sectors per track, 256-byte sectors (100 KByte)
419 * - Osborne double density: 40 tracks, 5 sectors per track, 1024-byte sectors (200 KByte)
420 * - IBM Personal Computer: 40 tracks, 8 sectors per track, 512-byte sectors (160 KByte)
421 * - Xerox 820 Computer: 40 tracks, 18 sectors per track, 128-byte sectors (90 KByte)
422 * - DEC 1820 double density: 40 tracks, 9 sectors per track, 512-byte sectors (180 KByte)
423 *
424 */
425DEVICE_IMAGE_LOAD( osborne1_floppy )
426{
427   int size, sectors, sectorsize;
428   const device_config *fdc = devtag_get_device(image->machine, "mb8877");
429
430   if ( ! image_has_been_created( image ) )
431   {
432      size = image_length( image );
433
434      switch( size )
435      {
436      case 40 * 10 * 256:
437         sectors = 10;
438         sectorsize = 256;
439         wd17xx_set_density( fdc, DEN_FM_LO );
440         break;
441      case 40 * 5 * 1024:
442         sectors = 5;
443         sectorsize = 1024;
444         wd17xx_set_density( fdc, DEN_FM_HI );
445         break;
446      case 40 * 8 * 512:
447         sectors = 8;
448         sectorsize = 512;
449         wd17xx_set_density( fdc, DEN_FM_LO );
450         return INIT_FAIL;
451      case 40 * 18 * 128:
452         sectors = 18;
453         sectorsize = 128;
454         wd17xx_set_density( fdc, DEN_FM_LO );
455         return INIT_FAIL;
456      case 40 * 9 * 512:
457         sectors = 9;
458         sectorsize = 512;
459         wd17xx_set_density( fdc, DEN_FM_HI );
460         return INIT_FAIL;
461      default:
462         return INIT_FAIL;
463      }
464   }
465   else
466   {
467      return INIT_FAIL;
468   }
469
470   if ( device_load_basicdsk_floppy( image ) != INIT_PASS )
471   {
472      return INIT_FAIL;
473   }
474
475   basicdsk_set_geometry( image, 40, 1, sectors, sectorsize, 1, 0, FALSE );
476
477   return INIT_PASS;
478}
479
480
481416static TIMER_CALLBACK( setup_osborne1 )
482417{
483418   const device_config *speaker = devtag_get_device(machine, "beep");
r5628r5629
488423   pia6821_ca1_w( pia_1, 0, 0 );
489424}
490425
426static void osborne1_load_proc(const device_config *image)
427{
428   int size = image_length( image );
429   const device_config *fdc = devtag_get_device(image->machine, "mb8877");
491430
431   switch( size )
432   {
433   case 40 * 10 * 256:
434      wd17xx_set_density( fdc, DEN_FM_LO );
435      break;
436   case 40 * 5 * 1024:
437      wd17xx_set_density( fdc, DEN_FM_HI );
438      break;
439   case 40 * 8 * 512:
440      wd17xx_set_density( fdc, DEN_FM_LO );
441      break;
442   case 40 * 18 * 128:
443      wd17xx_set_density( fdc, DEN_FM_LO );
444      break;
445   case 40 * 9 * 512:
446      wd17xx_set_density( fdc, DEN_FM_HI );
447      break;
448   }
449}
450
492451MACHINE_RESET( osborne1 )
493452{
453   int drive;
494454   const address_space* space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
495455   /* Initialize memory configuration */
496456   osborne1_bankswitch_w( space, 0x00, 0 );
r5628r5629
510470
511471   timer_set(machine,  attotime_zero, NULL, 0, setup_osborne1 );
512472
473   for(drive=0;drive<2;drive++)
474   {
475      floppy_install_load_proc(image_from_devtype_and_index(machine, IO_FLOPPY, drive), osborne1_load_proc);
476   }
477   
513478   memory_set_direct_update_handler( space, osborne1_opbase );
514479}
515480
src/mess/machine/comx35.c
r5628r5629
184184}
185185
186186/* Floppy Disc Controller */
187
188DEVICE_IMAGE_LOAD( comx35_floppy )
189{
190   if (image_has_been_created(image))
191      return INIT_FAIL;
192
193   if (device_load_basicdsk_floppy(image) == INIT_PASS)
194   {
195      int size = image_length(image);
196      UINT8 header[0x20] = {0};
197
198      switch (size)
199      {
200      case 35*1*16*128:
201         /* drive, tracks, heads, sectors per track, sector length, first sector id, offset track zero, track skipping */
202         basicdsk_set_geometry(image, 35, 1, 16, 128, 0, 0, FALSE);
203         break;
204
205      case 35*2*16*128:
206         image_fread(image, header, 0x20);
207
208         if (header[0x12] == 0x01)
209         {
210            /* drive, tracks, heads, sectors per track, sector length, first sector id, offset track zero, track skipping */
211            basicdsk_set_geometry(image, 70, 1, 16, 128, 0, 0, FALSE);
212         }
213         else
214         {
215            /* drive, tracks, heads, sectors per track, sector length, first sector id, offset track zero, track skipping */
216            basicdsk_set_geometry(image, 35, 2, 16, 128, 0, 0, FALSE);
217         }
218         break;
219      }
220
221      return INIT_PASS;
222   }
223
224   return INIT_FAIL;
225}
226
227187static WD17XX_CALLBACK( comx35_fdc_callback )
228188{
229189   comx35_state *driver_state = device->machine->driver_data;
src/mess/mess.mak
r5628r5629
723723
724724$(MESSOBJ)/comx.a:            \
725725   $(MESS_DRIVERS)/comx35.o   \
726   $(MESS_FORMATS)/comx35_dsk.o   \
726727   $(MESS_DRIVERS)/comxpl80.o   \
727728   $(MESS_VIDEO)/comx35.o      \
728729   $(MESS_MACHINE)/comx35.o   \
src/mess/formats/comx35_dsk.c
r0r5629
1/*********************************************************************
2
3   formats/comx35_dsk.c
4
5   COMX35 disk images
6
7*********************************************************************/
8
9#include <string.h>
10
11#include "formats/comx35_dsk.h"
12#include "formats/basicdsk.h"
13
14static FLOPPY_IDENTIFY(comx35_dsk_identify)
15{
16   *vote = ((floppy_image_size(floppy) == (35*1*16*128)) || (floppy_image_size(floppy) == (35*2*16*128))) ? 100 : 0;
17   return FLOPPY_ERROR_SUCCESS;
18}
19
20static FLOPPY_CONSTRUCT(comx35_dsk_construct)
21{
22   struct basicdsk_geometry geometry;
23   UINT8 header[1];
24   int heads;
25   int cylinders;   
26   
27   switch(floppy_image_size(floppy)) {
28      case 35*1*16*128:
29         heads = 1;
30         cylinders = 35;         
31         break;
32
33      case 35*2*16*128:         
34         floppy_image_read( floppy, header, 0x12 , 1 );
35         if (header[0] == 0x01)
36         {           
37            heads = 1;
38            cylinders = 70;
39         }
40         else
41         {
42            heads = 2;
43            cylinders = 35;
44         }
45         break;     
46   }
47   
48   memset(&geometry, 0, sizeof(geometry));
49   geometry.heads = heads;
50   geometry.first_sector_id = 0;
51   geometry.sector_length = 128;
52   geometry.tracks = cylinders;
53   geometry.sectors = 16;
54   return basicdsk_construct(floppy, &geometry);   
55}
56
57/* ----------------------------------------------------------------------- */
58
59FLOPPY_OPTIONS_START( comx35 )
60   FLOPPY_OPTION( comx35, "img",      "COMX35 floppy disk image",   comx35_dsk_identify, comx35_dsk_construct, NULL)
61FLOPPY_OPTIONS_END
62
src/mess/formats/comx35_dsk.h
r0r5629
1/*********************************************************************
2
3   formats/comx35_dsk.h
4
5   COMX35 disk images
6
7*********************************************************************/
8
9#ifndef COMX35_DSK_H
10#define COMX35_DSK_H
11
12#include "formats/flopimg.h"
13
14/**************************************************************************/
15
16FLOPPY_OPTIONS_EXTERN(comx35);
17
18#endif /* COMX35_DSK_H */
src/mess/drivers/osborne1.c
r5628r5629
3838#include "cpu/z80/z80.h"
3939#include "cpu/z80/z80daisy.h"
4040#include "sound/beep.h"
41#include "devices/basicdsk.h"
41#include "devices/mflopimg.h"
42#include "formats/basicdsk.h"
4243#include "machine/wd17xx.h"
4344#include "machine/6821pia.h"
4445#include "includes/osborne1.h"
r5628r5629
215216   ROM_LOAD( "osbchr.bin", 0x0000, 0x800, BAD_DUMP CRC(6c1eab0d) SHA1(b04459d377a70abc9155a5486003cb795342c801) )
216217ROM_END
217218
219/* System Configuration */
220/*
221 * The Osborne-1 supports the following disc formats:
222 * - Osborne single density: 40 tracks, 10 sectors per track, 256-byte sectors (100 KByte)
223 * - Osborne double density: 40 tracks, 5 sectors per track, 1024-byte sectors (200 KByte)
224 * - IBM Personal Computer: 40 tracks, 8 sectors per track, 512-byte sectors (160 KByte)
225 * - Xerox 820 Computer: 40 tracks, 18 sectors per track, 128-byte sectors (90 KByte)
226 * - DEC 1820 double density: 40 tracks, 9 sectors per track, 512-byte sectors (180 KByte)
227 *
228 */
229FLOPPY_OPTIONS_START(osborne1 )
230   FLOPPY_OPTION( osd, "img", "Osborne single density", basicdsk_identify_default, basicdsk_construct_default,
231      HEADS([1])
232      TRACKS([40])
233      SECTORS([10])
234      SECTOR_LENGTH([256])
235      FIRST_SECTOR_ID([1]))   
236   FLOPPY_OPTION( odd, "img", "Osborne double density", basicdsk_identify_default, basicdsk_construct_default,
237      HEADS([1])
238      TRACKS([40])
239      SECTORS([5])
240      SECTOR_LENGTH([1024])
241      FIRST_SECTOR_ID([1]))
242   FLOPPY_OPTION( ibm, "img", "IBM Personal Computer", basicdsk_identify_default, basicdsk_construct_default,
243      HEADS([1])
244      TRACKS([40])
245      SECTORS([8])
246      SECTOR_LENGTH([512])
247      FIRST_SECTOR_ID([1]))               
248   FLOPPY_OPTION( xerox, "img", "Xerox 820 Computer", basicdsk_identify_default, basicdsk_construct_default,
249      HEADS([1])
250      TRACKS([40])
251      SECTORS([18])
252      SECTOR_LENGTH([128])
253      FIRST_SECTOR_ID([1]))               
254   FLOPPY_OPTION( dec, "img", "DEC 1820 double density", basicdsk_identify_default, basicdsk_construct_default,
255      HEADS([1])
256      TRACKS([40])
257      SECTORS([9])
258      SECTOR_LENGTH([512])
259      FIRST_SECTOR_ID([1]))               
260FLOPPY_OPTIONS_END
218261
219static void osborne1_floppy_getinfo( const mess_device_class *devclass, UINT32 state, union devinfo *info )
262static void osborne1_floppy_getinfo(const mess_device_class *devclass, UINT32 state, union devinfo *info)
220263{
221   switch( state )
264   /* floppy */
265   switch(state)
222266   {
223   case MESS_DEVINFO_INT_COUNT:            info->i = 2; break;
224   case MESS_DEVINFO_PTR_LOAD:            info->load = DEVICE_IMAGE_LOAD_NAME(osborne1_floppy); break;
225   case MESS_DEVINFO_STR_FILE_EXTENSIONS:   strcpy( info->s = device_temp_str(), "img" ); break;
226   default:                     legacybasicdsk_device_getinfo( devclass, state, info ); break;
267      /* --- the following bits of info are returned as 64-bit signed integers --- */
268      case MESS_DEVINFO_INT_COUNT:                     info->i = 2; break;
269
270      /* --- the following bits of info are returned as pointers to data or functions --- */
271      case MESS_DEVINFO_PTR_FLOPPY_OPTIONS:            info->p = (void *) floppyoptions_osborne1; break;
272
273      default:                              floppy_device_getinfo(devclass, state, info); break;
227274   }
228275}
229276
230
231277static SYSTEM_CONFIG_START( osborne1 )
232278   CONFIG_DEVICE( osborne1_floppy_getinfo )
233279   CONFIG_RAM_DEFAULT( 68 * 1024 )      /* 64KB Main RAM and 4Kbit video attribute RAM */
src/mess/drivers/comx35.c
r5628r5629
1515#include "cpu/cdp1802/cdp1802.h"
1616#include "sound/cdp1869.h"
1717#include "sound/wave.h"
18#include "devices/basicdsk.h"
18#include "devices/mflopimg.h"
19#include "formats/comx35_dsk.h"
1920#include "devices/cassette.h"
2021#include "devices/printer.h"
2122#include "devices/snapquik.h"
r5628r5629
449450#define rom_comx35n rom_comx35p
450451
451452/* System Configuration */
452
453453static void comx35_floppy_getinfo(const mess_device_class *devclass, UINT32 state, union devinfo *info)
454454{
455455   /* floppy */
456456   switch(state)
457457   {
458458      /* --- the following bits of info are returned as 64-bit signed integers --- */
459      case MESS_DEVINFO_INT_COUNT:               info->i = 2; break;
459      case MESS_DEVINFO_INT_COUNT:                     info->i = 2; break;
460460
461461      /* --- the following bits of info are returned as pointers to data or functions --- */
462      case MESS_DEVINFO_PTR_LOAD:                  info->load = DEVICE_IMAGE_LOAD_NAME(comx35_floppy); break;
462      case MESS_DEVINFO_PTR_FLOPPY_OPTIONS:            info->p = (void *) floppyoptions_comx35; break;
463463
464      /* --- the following bits of info are returned as NULL-terminated strings --- */
465      case MESS_DEVINFO_STR_FILE_EXTENSIONS:         strcpy(info->s = device_temp_str(), "img"); break;
466
467      default:                              legacybasicdsk_device_getinfo(devclass, state, info); break;
464      default:                              floppy_device_getinfo(devclass, state, info); break;
468465   }
469466}
470
471467static SYSTEM_CONFIG_START( comx35 )
472468   CONFIG_RAM_DEFAULT   (32 * 1024)
473469   CONFIG_DEVICE(comx35_floppy_getinfo)
src/mess/drivers/xerox820.c
r5628r5629
3434#include "machine/z80sio.h"
3535#include "machine/wd17xx.h"
3636#include "machine/com8116.h"
37#include "devices/basicdsk.h"
37#include "devices/mflopimg.h"
38#include "formats/basicdsk.h"
3839
3940INLINE const device_config *get_floppy_image(running_machine *machine, int drive)
4041{
r5628r5629
590591   }
591592   return 0;
592593}
594static void xerox820_load_proc(const device_config *image)
595{   
596   xerox820_state *state = image->machine->driver_data;
597   
598   switch (image_length(image))
599   {
600   case 77*1*26*128: // 250K 8" SSSD
601      state->_8n5 = 1;
602      state->dsdd = 0;
603      return;
593604
605   case 77*1*26*256: // 500K 8" SSDD     
606      state->_8n5 = 1;
607      state->dsdd = 0;
608      return;
609
610   case 40*1*18*128: // 90K 5.25" SSSD     
611      state->_8n5 = 0;
612      state->dsdd = 0;
613      return;
614
615   case 40*2*18*128: // 180K 5.25" DSSD     
616      state->_8n5 = 0;
617      state->dsdd = 1;
618      return;
619   }
620
621}
622
594623/* Machine Initialization */
595624
596625static MACHINE_START( xerox820 )
597626{
627   int drive;
598628   xerox820_state *state = machine->driver_data;
599629
600630   /* find devices */
r5628r5629
617647
618648   /* bank switch */
619649   xerox820_bankswitch(machine, 1);
650   
651   for(drive=0;drive<2;drive++)
652   {
653      floppy_install_load_proc(image_from_devtype_and_index(machine, IO_FLOPPY, drive), xerox820_load_proc);
654   }
620655
656
621657   /* register for state saving */
622658   state_save_register_global_pointer(machine, state->video_ram, XEROX820_LCD_VIDEORAM_SIZE);
623659   state_save_register_global(machine, state->pbrdy);
r5628r5629
710746ROM_END
711747
712748/* System Configuration */
749FLOPPY_OPTIONS_START(xerox820 )
750   FLOPPY_OPTION( sssd8, "dsk", "8\" SSSD", basicdsk_identify_default, basicdsk_construct_default,
751      HEADS([1])
752      TRACKS([77])
753      SECTORS([26])
754      SECTOR_LENGTH([128])
755      FIRST_SECTOR_ID([1]))   
756   FLOPPY_OPTION( ssdd8, "dsk", "8\" SSDD", basicdsk_identify_default, basicdsk_construct_default,
757      HEADS([1])
758      TRACKS([77])
759      SECTORS([26])
760      SECTOR_LENGTH([256])
761      FIRST_SECTOR_ID([1]))
762   FLOPPY_OPTION( sssd5, "dsk", "5.25\" SSSD", basicdsk_identify_default, basicdsk_construct_default,
763      HEADS([1])
764      TRACKS([40])
765      SECTORS([18])
766      SECTOR_LENGTH([128])
767      FIRST_SECTOR_ID([1]))               
768   FLOPPY_OPTION( ssdd5, "dsk", "5.25\" SSDD", basicdsk_identify_default, basicdsk_construct_default,
769      HEADS([2])
770      TRACKS([40])
771      SECTORS([18])
772      SECTOR_LENGTH([128])
773      FIRST_SECTOR_ID([1]))               
774FLOPPY_OPTIONS_END
713775
714static DEVICE_IMAGE_LOAD( xerox820_floppy )
715{
716   xerox820_state *state = image->machine->driver_data;
717
718   if (image_has_been_created(image))
719   {
720      return INIT_FAIL;
721   }
722
723   if (device_load_basicdsk_floppy(image) == INIT_PASS)
724   {
725      switch (image_length(image))
726      {
727      case 77*1*26*128: // 250K 8" SSSD
728         basicdsk_set_geometry(image, 77, 1, 26, 128, 1, 0, FALSE);
729         state->_8n5 = 1;
730         state->dsdd = 0;
731         return INIT_PASS;
732
733      case 77*1*26*256: // 500K 8" SSDD
734         basicdsk_set_geometry(image, 77, 1, 26, 256, 1, 0, FALSE);
735         state->_8n5 = 1;
736         state->dsdd = 0;
737         return INIT_PASS;
738
739      case 40*1*18*128: // 90K 5.25" SSSD
740         basicdsk_set_geometry(image, 40, 1, 18, 128, 1, 0, FALSE);
741         state->_8n5 = 0;
742         state->dsdd = 0;
743         return INIT_PASS;
744
745      case 40*2*18*128: // 180K 5.25" DSSD
746         basicdsk_set_geometry(image, 40, 2, 18, 128, 1, 0, FALSE);
747         state->_8n5 = 0;
748         state->dsdd = 1;
749         return INIT_PASS;
750      }
751   }
752
753   return INIT_FAIL;
754}
755
756776static void xerox820_floppy_getinfo(const mess_device_class *devclass, UINT32 state, union devinfo *info)
757777{
758778   /* floppy */
759779   switch(state)
760780   {
761781      /* --- the following bits of info are returned as 64-bit signed integers --- */
762      case MESS_DEVINFO_INT_COUNT:                  info->i = 2; break;
782      case MESS_DEVINFO_INT_COUNT:                     info->i = 2; break;
763783
764784      /* --- the following bits of info are returned as pointers to data or functions --- */
765      case MESS_DEVINFO_PTR_LOAD:                     info->load = DEVICE_IMAGE_LOAD_NAME(xerox820_floppy); break;
785      case MESS_DEVINFO_PTR_FLOPPY_OPTIONS:            info->p = (void *) floppyoptions_xerox820; break;
766786
767      /* --- the following bits of info are returned as NULL-terminated strings --- */
768      case MESS_DEVINFO_STR_FILE_EXTENSIONS:            strcpy(info->s = device_temp_str(), "dsk"); break;
769
770      default:                                 legacybasicdsk_device_getinfo(devclass, state, info); break;
787      default:                              floppy_device_getinfo(devclass, state, info); break;
771788   }
772789}
773790

Previous 15994 Revisions Next


© 1998-2018 The MESS Team