Exemple #1
0
static libspectrum_byte
opus_6821_access( libspectrum_byte reg, libspectrum_byte data,
                  libspectrum_byte dir )
{
    int drive, side;
    int i;

    switch( reg & 0x03 ) {
    case 0:
        if( dir ) {
            if( control_a & 0x04 ) {
                data_reg_a = data;

                drive = ( data & 0x02 ) == 2 ? 1 : 0;
                side = ( data & 0x10 )>>4 ? 1 : 0;

                for( i = 0; i < OPUS_NUM_DRIVES; i++ ) {
                    fdd_set_head( &opus_drives[ i ], side );
                }

                fdd_select( &opus_drives[ (!drive) ], 0 );
                fdd_select( &opus_drives[ drive ], 1 );

                if( opus_fdc->current_drive != &opus_drives[ drive ] ) {
                    if( opus_fdc->current_drive->motoron ) {        /* swap motoron */
                        fdd_motoron( &opus_drives[ (!drive) ], 0 );
                        fdd_motoron( &opus_drives[ drive ], 1 );
                    }
                    opus_fdc->current_drive = &opus_drives[ drive ];
                }
            } else {
                data_dir_a = data;
            }
        } else {
Exemple #2
0
static void
plusd_cn_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
{
  int drive, side;
  int i;

  plusd_control_register = b;

  drive = ( b & 0x03 ) == 2 ? 1 : 0;
  side = ( b & 0x80 ) ? 1 : 0;

  /* TODO: set current_drive to NULL when bits 0 and 1 of b are '00' or '11' */
  for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
    fdd_set_head( &plusd_drives[ i ], side );
  }
  fdd_select( &plusd_drives[ (!drive) ], 0 );
  fdd_select( &plusd_drives[ drive ], 1 );

  if( plusd_fdc->current_drive != &plusd_drives[ drive ] ) {
    if( plusd_fdc->current_drive->motoron ) {            /* swap motoron */
      fdd_motoron( &plusd_drives[ (!drive) ], 0 );
      fdd_motoron( &plusd_drives[ drive ], 1 );
    }
    plusd_fdc->current_drive = &plusd_drives[ drive ];
  }

  printer_parallel_strobe_write( b & 0x40 );
}
static void
didaktik_reset( int hard_reset )
{
  int i;

  didaktik80_active = 0;
  didaktik80_available = 0;

  ui_menu_activate( UI_MENU_ITEM_MACHINE_DIDAKTIK80_SNAP, 0 );
  if( !periph_is_active( PERIPH_TYPE_DIDAKTIK80 ) ) {
    return;
  }

  if( machine_load_rom_bank( didaktik_memory_map_romcs_rom, 0,
                             settings_current.rom_didaktik80,
                             settings_default.rom_didaktik80, ROM_SIZE ) ) {
    settings_current.didaktik80 = 0;
    periph_activate_type( PERIPH_TYPE_DIDAKTIK80, 0 );
    return;
  }

  ui_menu_activate( UI_MENU_ITEM_MACHINE_DIDAKTIK80_SNAP, 1 );

  for( i = 0; i < MEMORY_PAGES_IN_2K; i++ ) {
    struct memory_page *page =
      &didaktik_memory_map_romcs_ram[ i ];
    page->page = ram + i * MEMORY_PAGE_SIZE;
    page->offset = i * MEMORY_PAGE_SIZE;
    page->writable = 1;
  }

  machine_current->ram.romcs = 0;

  aux_register = 0;

  didaktik80_available = 1;

  if( hard_reset )
    memset( ram, 0, sizeof( ram ) );

  wd_fdc_master_reset( didaktik_fdc );

  for( i = 0; i < DIDAKTIK80_NUM_DRIVES; i++ ) {
    ui_media_drive_update_menus( &didaktik_ui_drives[ i ],
                                 UI_MEDIA_DRIVE_UPDATE_ALL );
  }

  didaktik_fdc->current_drive = &didaktik_drives[ 0 ];
  fdd_select( &didaktik_drives[ 0 ], 1 );
  fdd_select( &didaktik_drives[ 1 ], 0 );
  machine_current->memory_map();

}
Exemple #4
0
void
upd_fdc_master_reset( upd_fdc *f )
{
  int i;
  for( i = 0; i < 4; i++ )
    if( f->drive[i] != NULL )
      fdd_select( f->drive[i], i == 0 ? 1 : 0 );
  f->current_drive = f->drive[0];

  f->main_status = UPD_FDC_MAIN_DATAREQ;
  for( i = 0; i < 4; i++ )
    f->status_register[i] = f->pcn[i] = f->seek[i] = f->seek_age[i] = 0;
  f->stp_rate = 16;
  f->hut_time = 240;
  f->hld_time = 254;
  f->non_dma = 1;
  f->direction = 0;
  f->head_load = 0;
  f->intrq = UPD_INTRQ_NONE;
  f->state = UPD_FDC_STATE_CMD;
  f->cycle = 0;
  f->last_sector_read = 0;
  f->read_id = 0;
  /* preserve disabled state of speedlock_hack */
  if( f->speedlock != -1 ) f->speedlock = 0;
}
static void
didaktik_aux_write( libspectrum_word port GCC_UNUSED, libspectrum_byte b )
{
  if( ( b & 0x01 ) != ( aux_register & 0x01 ) )
    fdd_select( &didaktik_drives[ 0 ], b & 0x01 ? 1 : 0 );
  if( ( b & 0x02 ) != ( aux_register & 0x02 ) )
    fdd_select( &didaktik_drives[ 1 ], b & 0x02 ? 1 : 0 );
  didaktik_fdc->current_drive = &didaktik_drives[ b & 0x02 ? 1 : 0 ];

  if( ( b & 0x04 ) != ( aux_register & 0x04 ) )
    fdd_motoron( &didaktik_drives[ 0 ], b & 0x04 ? 1 : 0 );
  if( ( b & 0x08 ) != ( aux_register & 0x08 ) )
    fdd_motoron( &didaktik_drives[ 1 ], b & 0x08 ? 1 : 0 );

  aux_register = b;
}
Exemple #6
0
static void
opus_reset( int hard_reset )
{
    int i;

    opus_active = 0;
    opus_available = 0;

    if( !periph_is_active( PERIPH_TYPE_OPUS ) ) {
        return;
    }

    if( machine_load_rom_bank( opus_memory_map_romcs_rom, 0,
                               settings_current.rom_opus,
                               settings_default.rom_opus, 0x2000 ) ) {
        settings_current.opus = 0;
        periph_activate_type( PERIPH_TYPE_OPUS, 0 );
        return;
    }

    for( i = 0; i < MEMORY_PAGES_IN_2K; i++ ) {
        struct memory_page *page =
                &opus_memory_map_romcs_ram[ i ];
        page->page = opus_ram + i * MEMORY_PAGE_SIZE;
        page->offset = i * MEMORY_PAGE_SIZE;
    }

    machine_current->ram.romcs = 0;

    for( i = 0; i < MEMORY_PAGES_IN_2K; i++ )
        opus_memory_map_romcs_ram[ i ].writable = 1;

    data_reg_a = 0;
    data_dir_a = 0;
    control_a  = 0;
    data_reg_b = 0;
    data_dir_b = 0;
    control_b  = 0;

    opus_available = 1;

    if( hard_reset )
        memset( opus_ram, 0, sizeof( opus_ram ) );

    wd_fdc_master_reset( opus_fdc );

    for( i = 0; i < OPUS_NUM_DRIVES; i++ ) {
        ui_media_drive_update_menus( &opus_ui_drives[ i ],
                                     UI_MEDIA_DRIVE_UPDATE_ALL );
    }

    opus_fdc->current_drive = &opus_drives[ 0 ];
    fdd_select( &opus_drives[ 0 ], 1 );
    machine_current->memory_map();

    ui_statusbar_update( UI_STATUSBAR_ITEM_DISK, UI_STATUSBAR_STATE_INACTIVE );
}
Exemple #7
0
static void
plusd_reset( int hard_reset )
{
  int i;

  plusd_active = 0;
  plusd_available = 0;

  if( !periph_is_active( PERIPH_TYPE_PLUSD ) ) {
    return;
  }

  if( machine_load_rom_bank( plusd_memory_map_romcs_rom, 0,
			     settings_current.rom_plusd,
			     settings_default.rom_plusd, 0x2000 ) ) {
    settings_current.plusd = 0;
    periph_activate_type( PERIPH_TYPE_PLUSD, 0 );
    return;
  }

  machine_current->ram.romcs = 0;

  for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) {
    plusd_memory_map_romcs_ram[ i ].page = &plusd_ram[ i * MEMORY_PAGE_SIZE ];
    plusd_memory_map_romcs_ram[ i ].writable = 1;
  }

  plusd_available = 1;
  plusd_active = 1;

  if( hard_reset )
    memset( plusd_ram, 0, 0x2000 );

  wd_fdc_master_reset( plusd_fdc );

  for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
    ui_media_drive_update_menus( &plusd_ui_drives[ i ],
                                 UI_MEDIA_DRIVE_UPDATE_ALL );
  }

  plusd_fdc->current_drive = &plusd_drives[ 0 ];
  fdd_select( &plusd_drives[ 0 ], 1 );
  machine_current->memory_map();

  ui_statusbar_update( UI_STATUSBAR_ITEM_DISK, UI_STATUSBAR_STATE_INACTIVE );
}
static int
didaktik80_init( void *context )
{
  int i;
  fdd_t *d;

  didaktik_fdc = wd_fdc_alloc_fdc( WD2797, 0, WD_FLAG_DRQ | WD_FLAG_RDY );

  for( i = 0; i < DIDAKTIK80_NUM_DRIVES; i++ ) {
    d = &didaktik_drives[ i ];
    fdd_init( d, FDD_SHUGART, NULL, 0 );       /* drive geometry 'autodetect' */
    d->disk.flag = DISK_FLAG_NONE;
  }

  didaktik_fdc->current_drive = &didaktik_drives[ 0 ];
  fdd_select( &didaktik_drives[ 0 ], 1 );
  didaktik_fdc->extra_signal = 1;
  didaktik_fdc->dden = 1;
  didaktik_fdc->set_intrq = didaktik_set_intrq;
  didaktik_fdc->reset_intrq = NULL;
  didaktik_fdc->set_datarq = didaktik_set_datarq;
  didaktik_fdc->reset_datarq = NULL;

  module_register( &didaktik_module_info );

  didaktik_rom_memory_source = memory_source_register( "Didaktik 80 ROM" );
  didaktik_ram_memory_source = memory_source_register( "Didaktik 80 RAM" );
  for( i = 0; i < MEMORY_PAGES_IN_14K; i++ )
    didaktik_memory_map_romcs_rom[i].source = didaktik_rom_memory_source;

  for( i = 0; i < MEMORY_PAGES_IN_2K; i++ )
    didaktik_memory_map_romcs_ram[i].source = didaktik_ram_memory_source;

  periph_register( PERIPH_TYPE_DIDAKTIK80, &didaktik_periph );
  for( i = 0; i < DIDAKTIK80_NUM_DRIVES; i++ ) {
    didaktik_ui_drives[ i ].fdd = &didaktik_drives[ i ];
    ui_media_drive_register( &didaktik_ui_drives[ i ] );
  }

  periph_register_paging_events( event_type_string, &page_event,
                                 &unpage_event );

  return 0;
}
Exemple #9
0
void
opus_init( void )
{
    int i;
    fdd_t *d;

    opus_fdc = wd_fdc_alloc_fdc( WD1770, 0, WD_FLAG_DRQ );

    for( i = 0; i < OPUS_NUM_DRIVES; i++ ) {
        d = &opus_drives[ i ];
        fdd_init( d, FDD_SHUGART, NULL, 0 );	/* drive geometry 'autodetect' */
        d->disk.flag = DISK_FLAG_NONE;
    }

    opus_fdc->current_drive = &opus_drives[ 0 ];
    fdd_select( &opus_drives[ 0 ], 1 );
    opus_fdc->dden = 1;
    opus_fdc->set_intrq = NULL;
    opus_fdc->reset_intrq = NULL;
    opus_fdc->set_datarq = opus_set_datarq;
    opus_fdc->reset_datarq = NULL;

    module_register( &opus_module_info );

    opus_rom_memory_source = memory_source_register( "Opus ROM" );
    opus_ram_memory_source = memory_source_register( "Opus RAM" );
    for( i = 0; i < MEMORY_PAGES_IN_8K; i++ )
        opus_memory_map_romcs_rom[i].source = opus_rom_memory_source;
    for( i = 0; i < MEMORY_PAGES_IN_2K; i++ )
        opus_memory_map_romcs_ram[i].source = opus_ram_memory_source;

    periph_register( PERIPH_TYPE_OPUS, &opus_periph );
    for( i = 0; i < OPUS_NUM_DRIVES; i++ ) {
        opus_ui_drives[ i ].fdd = &opus_drives[ i ];
        ui_media_drive_register( &opus_ui_drives[ i ] );
    }
}
Exemple #10
0
void
plusd_init( void )
{
  int i;
  fdd_t *d;

  plusd_fdc = wd_fdc_alloc_fdc( WD1770, 0, WD_FLAG_NONE );

  for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
    d = &plusd_drives[ i ];
    fdd_init( d, FDD_SHUGART, NULL, 0 );
    d->disk.flag = DISK_FLAG_NONE;
  }

  plusd_fdc->current_drive = &plusd_drives[ 0 ];
  fdd_select( &plusd_drives[ 0 ], 1 );
  plusd_fdc->dden = 1;
  plusd_fdc->set_intrq = NULL;
  plusd_fdc->reset_intrq = NULL;
  plusd_fdc->set_datarq = NULL;
  plusd_fdc->reset_datarq = NULL;

  module_register( &plusd_module_info );

  plusd_memory_source = memory_source_register( "PlusD" );
  for( i = 0; i < MEMORY_PAGES_IN_8K; i++ )
    plusd_memory_map_romcs_rom[ i ].source = plusd_memory_source;
  for( i = 0; i < MEMORY_PAGES_IN_8K; i++ )
    plusd_memory_map_romcs_ram[ i ].source = plusd_memory_source;

  periph_register( PERIPH_TYPE_PLUSD, &plusd_periph );

  for( i = 0; i < PLUSD_NUM_DRIVES; i++ ) {
    plusd_ui_drives[ i ].fdd = &plusd_drives[ i ];
    ui_media_drive_register( &plusd_ui_drives[ i ] );
  }
}