wd_fdc * wd_fdc_alloc_fdc( wd_type_t type, int hlt_time, unsigned int flags ) { wd_fdc *fdc = libspectrum_new( wd_fdc, 1 ); switch( type ) { default: type = WD1770; /* illegal type converted to wd_fdc */ case FD1793: case WD1773: case WD1770: case WD2797: fdc->rates[ 0 ] = 6; fdc->rates[ 1 ] = 12; fdc->rates[ 2 ] = 20; fdc->rates[ 3 ] = 30; break; case WD1772: fdc->rates[ 0 ] = 2; fdc->rates[ 1 ] = 3; fdc->rates[ 2 ] = 5; fdc->rates[ 3 ] = 6; break; } fdc->type = type; fdc->current_drive = NULL; fdc->hlt_time = hlt_time; fdc->flags = flags; /* Beta128 connect HLD out to READY in and MOTOR ON */ wd_fdc_master_reset( fdc ); return fdc; }
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 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(); }
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 ); }