src/mess/drivers/smc777.c
| r8563 | r8564 | |
| 18 | 18 | #include "sound/sn76496.h" |
| 19 | 19 | #include "video/mc6845.h" |
| 20 | 20 | |
| 21 | #include "machine/wd17xx.h" |
| 22 | #include "formats/basicdsk.h" |
| 23 | #include "devices/flopdrv.h" |
| 24 | |
| 21 | 25 | static UINT16 cursor_addr; |
| 22 | 26 | |
| 23 | 27 | static VIDEO_START( smc777 ) |
| r8563 | r8564 | |
| 34 | 38 | |
| 35 | 39 | for(y=0;y<25;y++) |
| 36 | 40 | { |
| 37 | | for(x=0;x<40;x++) |
| 41 | for(x=0;x<80;x++) |
| 38 | 42 | { |
| 39 | 43 | int tile = vram[count]; |
| 40 | 44 | int color = attr[count] & 7; |
| r8563 | r8564 | |
| 44 | 48 | if(((cursor_addr) == count) && screen->machine->primary_screen->frame_number() & 0x10) // draw cursor |
| 45 | 49 | drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[0],0x87,7,0,0,x*8,y*8,0); |
| 46 | 50 | |
| 47 | | |
| 48 | | count+=2; |
| 51 | count++; //TODO: width 40 uses count += 2 |
| 49 | 52 | } |
| 50 | 53 | } |
| 51 | 54 | |
| r8563 | r8564 | |
| 160 | 163 | fbuf[vram_index | offset*0x100] = data; |
| 161 | 164 | } |
| 162 | 165 | |
| 166 | static UINT8 fdc_irq_flag; |
| 167 | static UINT8 fdc_drq_flag; |
| 168 | |
| 169 | static 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 | |
| 191 | static 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 | |
| 221 | static WRITE_LINE_DEVICE_HANDLER( smc777_fdc_intrq_w ) |
| 222 | { |
| 223 | fdc_irq_flag = state; |
| 224 | } |
| 225 | |
| 226 | static WRITE_LINE_DEVICE_HANDLER( smc777_fdc_drq_w ) |
| 227 | { |
| 228 | fdc_drq_flag = state; |
| 229 | } |
| 230 | |
| 231 | static WRITE8_HANDLER( smc777_rom_w ) |
| 232 | { |
| 233 | static UINT8 *rom = memory_region(space->machine, "maincpu"); |
| 234 | |
| 235 | rom[offset] = data; |
| 236 | } |
| 237 | |
| 163 | 238 | static ADDRESS_MAP_START(smc777_mem, ADDRESS_SPACE_PROGRAM, 8) |
| 164 | 239 | ADDRESS_MAP_UNMAP_HIGH |
| 165 | | AM_RANGE(0x0000, 0x3fff) AM_ROM |
| 240 | AM_RANGE(0x0000, 0x3fff) AM_ROM AM_WRITE(smc777_rom_w) |
| 166 | 241 | AM_RANGE(0x4000, 0xffff) AM_RAM |
| 167 | 242 | ADDRESS_MAP_END |
| 168 | 243 | |
| r8563 | r8564 | |
| 188 | 263 | |
| 189 | 264 | // AM_RANGE(0x28, 0x2c) AM_NOP //fdc 2, MB8876 -> FD1791 |
| 190 | 265 | // 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 |
| 192 | 267 | // AM_RANGE(0x35, 0x37) AM_NOP //rs-232c no. 3 |
| 193 | 268 | // AM_RANGE(0x38, 0x3b) AM_NOP //cache disk unit |
| 194 | 269 | // AM_RANGE(0x3c, 0x3d) AM_NOP //RGB Superimposer |
| r8563 | r8564 | |
| 262 | 337 | } |
| 263 | 338 | } |
| 264 | 339 | |
| 340 | static 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 | |
| 348 | static 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])) |
| 355 | FLOPPY_OPTIONS_END |
| 356 | |
| 357 | static 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 | |
| 265 | 370 | static MACHINE_DRIVER_START( smc777 ) |
| 266 | 371 | /* basic machine hardware */ |
| 267 | 372 | MDRV_CPU_ADD("maincpu",Z80, XTAL_4MHz) //4,028 Mhz! |
| r8563 | r8564 | |
| 286 | 391 | MDRV_VIDEO_START(smc777) |
| 287 | 392 | MDRV_VIDEO_UPDATE(smc777) |
| 288 | 393 | |
| 394 | MDRV_MB8877_ADD("fdc",smc777_mb8876_interface) |
| 395 | MDRV_FLOPPY_2_DRIVES_ADD(smc777_floppy_config) |
| 396 | |
| 289 | 397 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| 290 | 398 | |
| 291 | 399 | MDRV_SOUND_ADD("sn1", SN76489A, 1996800) // unknown clock / divider |