Previous 15994 Revisions Next

r8564 Wednesday 21st July, 2010 at 10:59:39 UTC by Angelo Salese
[SMC-777] Added raw floppy support, it now loads SMC-70 CP/M floppy disk properly
[src/mess/drivers]smc777.c

src/mess/drivers/smc777.c
r8563r8564
1818#include "sound/sn76496.h"
1919#include "video/mc6845.h"
2020
21#include "machine/wd17xx.h"
22#include "formats/basicdsk.h"
23#include "devices/flopdrv.h"
24
2125static UINT16 cursor_addr;
2226
2327static VIDEO_START( smc777 )
r8563r8564
3438
3539   for(y=0;y<25;y++)
3640   {
37      for(x=0;x<40;x++)
41      for(x=0;x<80;x++)
3842      {
3943         int tile = vram[count];
4044         int color = attr[count] & 7;
r8563r8564
4448         if(((cursor_addr) == count) && screen->machine->primary_screen->frame_number() & 0x10) // draw cursor
4549            drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[0],0x87,7,0,0,x*8,y*8,0);
4650
47
48         count+=2;
51         count++; //TODO: width 40 uses count += 2
4952      }
5053   }
5154
r8563r8564
160163   fbuf[vram_index | offset*0x100] = data;
161164}
162165
166static UINT8 fdc_irq_flag;
167static UINT8 fdc_drq_flag;
168
169static READ8_HANDLER( smc777_fdc_r )
170{
171   running_device* dev = space->machine->device("fdc");
172   //UINT8 ret = 0;
173
174   switch(offset+0x30)
175   {
176      case 0x30:
177         return wd17xx_status_r(dev,offset);
178      case 0x31:
179         return wd17xx_track_r(dev,offset);
180      case 0x32:
181         return wd17xx_sector_r(dev,offset);
182      case 0x33:
183         return wd17xx_data_r(dev,offset);
184      case 0x34: //irq / drq status
185         return (fdc_irq_flag ? 0x80 : 0x00) | (fdc_drq_flag ? 0x00 : 0x40);
186   }
187
188   return 0x00;
189}
190
191static WRITE8_HANDLER( smc777_fdc_w )
192{
193   running_device* dev = space->machine->device("fdc");
194
195   switch(offset+0x30)
196   {
197      case 0x30:
198         wd17xx_command_w(dev,offset,data);
199         break;
200      case 0x31:
201         wd17xx_track_w(dev,offset,data);
202         break;
203      case 0x32:
204         wd17xx_sector_w(dev,offset,data);
205         break;
206      case 0x33:
207         wd17xx_data_w(dev,offset,data);
208         break;
209      case 0x34:
210      //   wd17xx_set_drive(dev,data & 3);
211         /* TODO: understand the conditions of this */
212         floppy_mon_w(floppy_get_device(space->machine, 0), !BIT(data, 7));
213         floppy_drive_set_ready_state(floppy_get_device(space->machine, 0), 1,0);
214      //   wd17xx_set_side(dev,(data & 0x10)>>4);
215         if(data)
216         printf("%02x\n",data);
217         break;
218   }
219}
220
221static WRITE_LINE_DEVICE_HANDLER( smc777_fdc_intrq_w )
222{
223   fdc_irq_flag = state;
224}
225
226static WRITE_LINE_DEVICE_HANDLER( smc777_fdc_drq_w )
227{
228   fdc_drq_flag = state;
229}
230
231static WRITE8_HANDLER( smc777_rom_w )
232{
233   static UINT8 *rom = memory_region(space->machine, "maincpu");
234
235   rom[offset] = data;
236}
237
163238static ADDRESS_MAP_START(smc777_mem, ADDRESS_SPACE_PROGRAM, 8)
164239   ADDRESS_MAP_UNMAP_HIGH
165   AM_RANGE(0x0000, 0x3fff) AM_ROM
240   AM_RANGE(0x0000, 0x3fff) AM_ROM AM_WRITE(smc777_rom_w)
166241   AM_RANGE(0x4000, 0xffff) AM_RAM
167242ADDRESS_MAP_END
168243
r8563r8564
188263
189264//   AM_RANGE(0x28, 0x2c) AM_NOP //fdc 2, MB8876 -> FD1791
190265//   AM_RANGE(0x2d, 0x2f) AM_NOP //rs-232c no. 2
191//   AM_RANGE(0x30, 0x34) AM_NOP //fdc 1, MB8876 -> FD1791
266   AM_RANGE(0x30, 0x34) AM_READWRITE(smc777_fdc_r,smc777_fdc_w) //fdc 1, MB8876 -> FD1791
192267//   AM_RANGE(0x35, 0x37) AM_NOP //rs-232c no. 3
193268//   AM_RANGE(0x38, 0x3b) AM_NOP //cache disk unit
194269//   AM_RANGE(0x3c, 0x3d) AM_NOP //RGB Superimposer
r8563r8564
262337   }
263338}
264339
340static const wd17xx_interface smc777_mb8876_interface =
341{
342   DEVCB_NULL,
343   DEVCB_LINE(smc777_fdc_intrq_w),
344   DEVCB_LINE(smc777_fdc_drq_w),
345   {FLOPPY_0, FLOPPY_1, NULL, NULL}
346};
347
348static FLOPPY_OPTIONS_START( smc777 )
349   FLOPPY_OPTION( img, "img", "SMC70 disk image", basicdsk_identify_default, basicdsk_construct_default,
350      HEADS([1])
351      TRACKS([70])
352      SECTORS([16])
353      SECTOR_LENGTH([256])
354      FIRST_SECTOR_ID([1]))
355FLOPPY_OPTIONS_END
356
357static const floppy_config smc777_floppy_config =
358{
359   DEVCB_NULL,
360   DEVCB_NULL,
361   DEVCB_NULL,
362   DEVCB_NULL,
363   DEVCB_NULL,
364   FLOPPY_DRIVE_SS_80,
365   FLOPPY_OPTIONS_NAME(smc777),
366   DO_NOT_KEEP_GEOMETRY,
367   NULL
368};
369
265370static MACHINE_DRIVER_START( smc777 )
266371    /* basic machine hardware */
267372    MDRV_CPU_ADD("maincpu",Z80, XTAL_4MHz) //4,028 Mhz!
r8563r8564
286391    MDRV_VIDEO_START(smc777)
287392    MDRV_VIDEO_UPDATE(smc777)
288393
394   MDRV_MB8877_ADD("fdc",smc777_mb8876_interface)
395   MDRV_FLOPPY_2_DRIVES_ADD(smc777_floppy_config)
396
289397   MDRV_SPEAKER_STANDARD_MONO("mono")
290398
291399   MDRV_SOUND_ADD("sn1", SN76489A, 1996800) // unknown clock / divider

Previous 15994 Revisions Next


© 1998-2018 The MESS Team