trunk/src/mess/machine/amstrad.c
| r31201 | r31202 | |
| 2822 | 2822 | 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0 |
| 2823 | 2823 | }; |
| 2824 | 2824 | |
| 2825 | | void amstrad_state::amstrad_common_init() |
| 2825 | #define NEXT_ROM_SLOT m_rom_count++; \ |
| 2826 | if(slot3 && m_rom_count == 3) m_rom_count++; \ |
| 2827 | if(slot7 && m_rom_count == 7) m_rom_count++; |
| 2828 | |
| 2829 | void amstrad_state::enumerate_roms() |
| 2826 | 2830 | { |
| 2827 | | address_space &space = m_maincpu->space(AS_PROGRAM); |
| 2831 | UINT8 m_rom_count = 1; |
| 2828 | 2832 | device_t* romexp; |
| 2829 | 2833 | rom_image_device* romimage; |
| 2834 | UINT8 *rom = m_region_maincpu->base(); |
| 2830 | 2835 | char str[20]; |
| 2831 | | int x; |
| 2836 | int i; |
| 2837 | bool slot3 = false,slot7 = false; |
| 2832 | 2838 | |
| 2839 | if(m_system_type == SYSTEM_PLUS || m_system_type == SYSTEM_GX4000) |
| 2840 | { |
| 2841 | /* ROMs are stored on the inserted cartridge in the Plus/GX4000 */ |
| 2842 | for(i=0; i<128; i++) // fill ROM table |
| 2843 | m_Amstrad_ROM_Table[i] = &rom[0x4000]; |
| 2844 | for(i=128;i<160;i++) |
| 2845 | m_Amstrad_ROM_Table[i] = &rom[(i-128)*0x4000]; |
| 2846 | m_Amstrad_ROM_Table[7] = &rom[0xc000]; |
| 2847 | slot7 = true; |
| 2848 | } |
| 2849 | else |
| 2850 | { |
| 2851 | /* slot 0 is always BASIC, as is any unused slot */ |
| 2852 | for(i=0; i<256; i++) |
| 2853 | m_Amstrad_ROM_Table[i] = &rom[0x014000]; |
| 2854 | /* AMSDOS ROM -- TODO: exclude from 464 unless a DDI-1 device is connected */ |
| 2855 | m_Amstrad_ROM_Table[7] = &rom[0x018000]; |
| 2856 | slot7 = true; |
| 2857 | } |
| 2858 | |
| 2859 | /* MSX-DOS BIOS - Aleste MSX emulation */ |
| 2860 | if(m_system_type == SYSTEM_ALESTE) |
| 2861 | { |
| 2862 | m_Amstrad_ROM_Table[3] = &rom[0x01c000]; |
| 2863 | slot3 = true; |
| 2864 | } |
| 2865 | |
| 2866 | /* enumerate expansion ROMs */ |
| 2867 | // TODO: get ROMs from expansion devices (that aren't ROMboxes) |
| 2868 | |
| 2869 | /* add ROMs from ROMbox expansion */ |
| 2870 | romexp = get_expansion_device(machine(),"rom"); |
| 2871 | if(romexp) |
| 2872 | { |
| 2873 | for(i=0;i<8;i++) |
| 2874 | { |
| 2875 | sprintf(str,"rom%i",i+1); |
| 2876 | romimage = romexp->subdevice<rom_image_device>(str); |
| 2877 | if(romimage->base() != NULL) |
| 2878 | { |
| 2879 | m_Amstrad_ROM_Table[m_rom_count] = romimage->base(); |
| 2880 | NEXT_ROM_SLOT |
| 2881 | } |
| 2882 | } |
| 2883 | } |
| 2884 | |
| 2885 | } |
| 2886 | |
| 2887 | void amstrad_state::amstrad_common_init() |
| 2888 | { |
| 2889 | address_space &space = m_maincpu->space(AS_PROGRAM); |
| 2890 | |
| 2833 | 2891 | m_aleste_mode = 0; |
| 2834 | 2892 | |
| 2835 | 2893 | m_gate_array.mrer = 0; |
| r31201 | r31202 | |
| 2862 | 2920 | space.install_write_bank(0xc000, 0xdfff, "bank15"); |
| 2863 | 2921 | space.install_write_bank(0xe000, 0xffff, "bank16"); |
| 2864 | 2922 | |
| 2865 | | /* Set up ROMs, if we have an expansion device connected */ |
| 2866 | | romexp = get_expansion_device(machine(),"rom"); |
| 2867 | | if(romexp) |
| 2868 | | { |
| 2869 | | for(x=0;x<6;x++) |
| 2870 | | { |
| 2871 | | sprintf(str,"rom%i",x+1); |
| 2872 | | romimage = romexp->subdevice<rom_image_device>(str); |
| 2873 | | if(romimage->base() != NULL) |
| 2874 | | { |
| 2875 | | m_Amstrad_ROM_Table[x+1] = romimage->base(); |
| 2876 | | } |
| 2877 | | } |
| 2878 | | } |
| 2923 | enumerate_roms(); |
| 2879 | 2924 | |
| 2880 | 2925 | m_maincpu->reset(); |
| 2881 | 2926 | if ( m_system_type == SYSTEM_CPC || m_system_type == SYSTEM_ALESTE ) |
| r31201 | r31202 | |
| 2936 | 2981 | |
| 2937 | 2982 | MACHINE_RESET_MEMBER(amstrad_state,amstrad) |
| 2938 | 2983 | { |
| 2939 | | int i; |
| 2940 | | UINT8 *rom = m_region_maincpu->base(); |
| 2941 | | |
| 2942 | | for (i=0; i<256; i++) |
| 2943 | | { |
| 2944 | | m_Amstrad_ROM_Table[i] = &rom[0x014000]; |
| 2945 | | } |
| 2946 | | |
| 2947 | | m_Amstrad_ROM_Table[7] = &rom[0x018000]; |
| 2948 | 2984 | amstrad_common_init(); |
| 2949 | 2985 | amstrad_reset_machine(); |
| 2950 | 2986 | // amstrad_init_palette(machine()); |
| r31201 | r31202 | |
| 2969 | 3005 | MACHINE_RESET_MEMBER(amstrad_state,plus) |
| 2970 | 3006 | { |
| 2971 | 3007 | address_space &space = m_maincpu->space(AS_PROGRAM); |
| 2972 | | int i; |
| 2973 | | UINT8 *rom = m_region_maincpu->base(); |
| 2974 | 3008 | |
| 2975 | | for (i=0; i<128; i++) // fill ROM table |
| 2976 | | { |
| 2977 | | m_Amstrad_ROM_Table[i] = &rom[0x4000]; // BASIC in system cart |
| 2978 | | } |
| 2979 | | for(i=128;i<160;i++) |
| 2980 | | { |
| 2981 | | m_Amstrad_ROM_Table[i] = &rom[(i-128)*0x4000]; |
| 2982 | | } |
| 2983 | | m_Amstrad_ROM_Table[7] = &rom[0xc000]; // AMSDOS in system cart |
| 2984 | | |
| 2985 | 3009 | m_asic.enabled = 0; |
| 2986 | 3010 | m_asic.seqptr = 0; |
| 2987 | 3011 | m_asic.pri = 0; // disable PRI |
| r31201 | r31202 | |
| 3019 | 3043 | MACHINE_RESET_MEMBER(amstrad_state,gx4000) |
| 3020 | 3044 | { |
| 3021 | 3045 | address_space &space = m_maincpu->space(AS_PROGRAM); |
| 3022 | | int i; |
| 3023 | | UINT8 *rom = m_region_maincpu->base(); |
| 3024 | 3046 | |
| 3025 | | for (i=0; i<128; i++) // fill ROM table |
| 3026 | | { |
| 3027 | | m_Amstrad_ROM_Table[i] = &rom[0x4000]; |
| 3028 | | } |
| 3029 | | for(i=128;i<160;i++) |
| 3030 | | { |
| 3031 | | m_Amstrad_ROM_Table[i] = &rom[(i-128)*0x4000]; |
| 3032 | | } |
| 3033 | | m_Amstrad_ROM_Table[7] = &rom[0xc000]; |
| 3034 | | |
| 3035 | 3047 | m_asic.enabled = 0; |
| 3036 | 3048 | m_asic.seqptr = 0; |
| 3037 | 3049 | m_asic.pri = 0; // disable PRI |
| r31201 | r31202 | |
| 3068 | 3080 | |
| 3069 | 3081 | MACHINE_RESET_MEMBER(amstrad_state,kccomp) |
| 3070 | 3082 | { |
| 3071 | | int i; |
| 3072 | | UINT8 *rom = m_region_maincpu->base(); |
| 3073 | | |
| 3074 | | for (i=0; i<256; i++) |
| 3075 | | { |
| 3076 | | m_Amstrad_ROM_Table[i] = &rom[0x014000]; |
| 3077 | | } |
| 3078 | | |
| 3079 | 3083 | amstrad_common_init(); |
| 3080 | 3084 | kccomp_reset_machine(); |
| 3081 | 3085 | |
| r31201 | r31202 | |
| 3097 | 3101 | |
| 3098 | 3102 | MACHINE_RESET_MEMBER(amstrad_state,aleste) |
| 3099 | 3103 | { |
| 3100 | | int i; |
| 3101 | | UINT8 *rom = m_region_maincpu->base(); |
| 3102 | | |
| 3103 | | for (i=0; i<256; i++) |
| 3104 | | { |
| 3105 | | m_Amstrad_ROM_Table[i] = &rom[0x014000]; |
| 3106 | | } |
| 3107 | | |
| 3108 | | m_Amstrad_ROM_Table[3] = &rom[0x01c000]; // MSX-DOS / BIOS |
| 3109 | | m_Amstrad_ROM_Table[7] = &rom[0x018000]; // AMSDOS |
| 3110 | 3104 | amstrad_common_init(); |
| 3111 | 3105 | amstrad_reset_machine(); |
| 3112 | 3106 | |