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 {
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(); }
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; }
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 ); }
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; }
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 ] ); } }
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 ] ); } }