diff --git a/fpga.c b/fpga.c index 1eb2256..fa79d64 100644 --- a/fpga.c +++ b/fpga.c @@ -933,7 +933,7 @@ void fpga_init(char *name, unsigned long currentdirectory) { } // end of minimig setup - if(user_io_core_type() == CORE_TYPE_MIST) { + if((user_io_core_type() == CORE_TYPE_MIST) || (user_io_core_type() == CORE_TYPE_MIST2)) { puts("Running mist setup"); tos_upload(NULL); diff --git a/ini_parser.c b/ini_parser.c index 1d65398..c4abbf3 100644 --- a/ini_parser.c +++ b/ini_parser.c @@ -170,6 +170,7 @@ char *get_core_name() return "PACE"; case CORE_TYPE_MIST: + case CORE_TYPE_MIST2: return "ST"; case CORE_TYPE_ARCHIE: diff --git a/main.c b/main.c index e0ca740..8a44cb4 100644 --- a/main.c +++ b/main.c @@ -180,7 +180,8 @@ int main(void) usb_poll(); // MIST (atari) core supports the same UI as Minimig - if(user_io_core_type() == CORE_TYPE_MIST) { + if((user_io_core_type() == CORE_TYPE_MIST) || + (user_io_core_type() == CORE_TYPE_MIST2)) { if(!fat_medium_present()) tos_eject_all(); diff --git a/menu.c b/menu.c index 8361027..39592be 100644 --- a/menu.c +++ b/menu.c @@ -505,6 +505,7 @@ char* get_keycode_table() return "Amiga"; case CORE_TYPE_MIST: + case CORE_TYPE_MIST2: return " ST"; case CORE_TYPE_ARCHIE: @@ -693,7 +694,8 @@ void HandleUI(void) if((user_io_core_type() == CORE_TYPE_MINIMIG) || (user_io_core_type() == CORE_TYPE_MINIMIG2)) menustate = MENU_MAIN1; - else if(user_io_core_type() == CORE_TYPE_MIST) + else if((user_io_core_type() == CORE_TYPE_MIST) || + (user_io_core_type() == CORE_TYPE_MIST2)) menustate = MENU_MIST_MAIN1; else if(user_io_core_type() == CORE_TYPE_ARCHIE) menustate = MENU_ARCHIE_MAIN1; @@ -1129,6 +1131,7 @@ void HandleUI(void) menustate = MENU_MAIN2_1; break; case CORE_TYPE_MIST: + case CORE_TYPE_MIST2: menusub = 5; menustate = MENU_MIST_MAIN1; break; @@ -3329,6 +3332,7 @@ void HandleUI(void) if (menu) { switch(user_io_core_type()) { case CORE_TYPE_MIST: + case CORE_TYPE_MIST2: menusub = 5; menustate = MENU_MIST_MAIN1; break; @@ -3357,6 +3361,7 @@ void HandleUI(void) else if (menusub == fat_uses_mmc()?2:1) { switch(user_io_core_type()) { case CORE_TYPE_MIST: + case CORE_TYPE_MIST2: menusub = 5; menustate = MENU_MIST_MAIN1; break; diff --git a/osd.c b/osd.c index eddb756..be2c9c4 100644 --- a/osd.c +++ b/osd.c @@ -609,6 +609,7 @@ unsigned char OsdGetCtrl(void) // mist/atari, archie and 8bit cores use local queue if((user_io_core_type() == CORE_TYPE_MIST) || + (user_io_core_type() == CORE_TYPE_MIST2) || (user_io_core_type() == CORE_TYPE_ARCHIE) || (user_io_core_type() == CORE_TYPE_8BIT)) c1 = OsdKeyGet(); diff --git a/tos.c b/tos.c index 83b8c12..a58ef26 100644 --- a/tos.c +++ b/tos.c @@ -672,34 +672,30 @@ static void tos_font_load() { } } -void tos_load_cartridge(char *name) { +void tos_load_cartridge_mist1(char *name) { fileTYPE file; - if(name) - strncpy(config.cart_img, name, 11); - - // upload cartridge + // upload cartridge if(config.cart_img[0] && FileOpen(&file, config.cart_img)) { int i; char buffer[512]; - + tos_debugf("%s:\n size = %d", config.cart_img, file.size); int blocks = file.size / 512; tos_debugf(" blocks = %d", blocks); - DISKLED_ON; for(i=0;i= 256*1024) + user_io_file_tx(&file, 0x00); + else if(file.size == 192*1024) + user_io_file_tx(&file, 0x01); + else + tos_debugf("WARNING: Unexpected TOS size!"); + } else { + tos_debugf("Unable to find tos.img"); + return; + } + + // This is the initial boot if no name was given. Otherwise the + // user reloaded a new os + if(!name) { + // load + tos_load_cartridge(NULL); + + // try to open both floppies + int i; + for(i=0;i<2;i++) { + char name[] = "DISK_A ST "; + name[5] = 'A'+i; + + fileTYPE file; + if(FileOpen(&file, name)) { + tos_insert_disk(i, &file); + } + } + + if(config.sd_direct) { + tos_set_direct_hdd(1); + } else { + // try to open harddisk image + for(i=0;i<2;i++) { + if(FileOpen(&file, config.acsi_img[i])) { + tos_select_hdd_image(i, &file); + } + } + } + } + ikbd_reset(); +} + +void tos_upload_mist1(char *name) { + fileTYPE file; + int i; + + // set video offset in fpga + tos_set_video_adjust(0, 0); tos_font_load(); tos_clr(); @@ -740,8 +836,6 @@ void tos_upload(char *name) { tos_write("\x0e\x0f MIST core \x0e\x0f "); tos_write("Uploading TOS ... "); - tos_debugf("Uploading TOS ..."); - DISKLED_ON; // upload and verify tos image @@ -963,9 +1057,6 @@ void tos_upload(char *name) { ikbd_reset(); - // let cpu run (release reset) - config.system_ctrl &= ~TOS_CONTROL_CPU_RESET; - mist_set_control(config.system_ctrl); } static unsigned long get_long(char *buffer, int offset) { @@ -1008,7 +1099,8 @@ void tos_update_sysctrl(unsigned long n) { // some of the usb drivers also call this without knowing which // core is running. So make sure this only happens if the Atari ST (MIST) // core is running - if(user_io_core_type() == CORE_TYPE_MIST) { + if((user_io_core_type() == CORE_TYPE_MIST) || + (user_io_core_type() == CORE_TYPE_MIST2)) { config.system_ctrl = n; mist_set_control(config.system_ctrl); } diff --git a/tos.h b/tos.h index 65d8f73..882ea38 100644 --- a/tos.h +++ b/tos.h @@ -82,6 +82,8 @@ unsigned long tos_system_ctrl(void); +void tos_upload_mist1(char *); +void tos_upload_mist2(char *); void tos_upload(char *); void tos_poll(); void tos_update_sysctrl(unsigned long); @@ -96,6 +98,8 @@ void tos_reset(char cold); char *tos_get_image_name(); char *tos_get_cartridge_name(); char tos_cartridge_is_inserted(); +void tos_load_cartridge_mist1(char *); +void tos_load_cartridge_mist2(char *); void tos_load_cartridge(char *); void tos_set_video_adjust(char axis, char value); diff --git a/user_io.c b/user_io.c index 1c58a75..777ba5a 100644 --- a/user_io.c +++ b/user_io.c @@ -226,6 +226,7 @@ void user_io_detect_core_type() { (core_type != CORE_TYPE_MINIMIG2) && (core_type != CORE_TYPE_PACE) && (core_type != CORE_TYPE_MIST) && + (core_type != CORE_TYPE_MIST2) && (core_type != CORE_TYPE_ARCHIE) && (core_type != CORE_TYPE_8BIT)) core_type = CORE_TYPE_UNKNOWN; @@ -252,6 +253,7 @@ void user_io_detect_core_type() { break; case CORE_TYPE_MIST: + case CORE_TYPE_MIST2: puts("Identified MiST core"); break; @@ -380,7 +382,7 @@ void user_io_digital_joystick(unsigned char joystick, unsigned char map) { // atari ST handles joystick 0 and 1 through the ikbd emulated by the io controller // but only for joystick 1 and 2 if((core_type == CORE_TYPE_MIST) && (joystick < 2)) { - ikbd_joystick(joystick, map); + ikbd_joystick(joystick, map); return; } @@ -414,7 +416,10 @@ void user_io_joystick(unsigned char joystick, unsigned char map) { // transmit serial/rs232 data into core void user_io_serial_tx(char *chr, uint16_t cnt) { - spi_uio_cmd_cont(UIO_SERIAL_OUT); + if (core_type == CORE_TYPE_MIST) + spi_uio_cmd_cont(UIO_SERIAL_OUT); + else + spi_uio_cmd_cont(UIO_SERIAL_OUT2); while(cnt--) spi8(*chr++); DisableIO(); } @@ -700,12 +705,30 @@ static void user_io_file_tx_done(void) { iprintf("\n"); } +static void user_io_file_tx_fill(unsigned char fill, unsigned int len) { + + EnableFpga(); + SPI(UIO_FILE_TX_DAT); + while(len--) { + SPI(fill); + } + DisableFpga(); +} + + void user_io_file_tx(fileTYPE *file, unsigned char index) { user_io_file_tx_prepare(index); user_io_file_tx_send(file); user_io_file_tx_done(); } +// send 'fill' byte 'len' times +void user_io_fill_tx(unsigned char fill, unsigned int len, unsigned char index) { + user_io_file_tx_prepare(index); + user_io_file_tx_fill(fill, len); + user_io_file_tx_done(); +} + // 8 bit cores have a config string telling the firmware how // to treat it char *user_io_8bit_get_string(char index) { @@ -872,15 +895,17 @@ void user_io_poll() { (core_type != CORE_TYPE_MINIMIG2) && (core_type != CORE_TYPE_PACE) && (core_type != CORE_TYPE_MIST) && + (core_type != CORE_TYPE_MIST2) && (core_type != CORE_TYPE_ARCHIE) && (core_type != CORE_TYPE_8BIT)) { return; // no user io for the installed core } - if(core_type == CORE_TYPE_MIST) { + if((core_type == CORE_TYPE_MIST) || + (core_type == CORE_TYPE_MIST2)) { char redirect = tos_get_cdc_control_redirect(); - ikbd_poll(); + if (core_type == CORE_TYPE_MIST) ikbd_poll(); // check for input data on usart USART_Poll(); @@ -891,7 +916,11 @@ void user_io_poll() { // arm rs232 and mixes with debug output. Useful for debugging only of // e.g. the diagnostic cartridge if(!pl2303_is_blocked()) { - spi_uio_cmd_cont(UIO_SERIAL_IN); + if (core_type == CORE_TYPE_MIST) + spi_uio_cmd_cont(UIO_SERIAL_IN); + else + spi_uio_cmd_cont(UIO_SERIAL_IN2); + while(spi_in() && !pl2303_is_blocked()) { c = spi_in(); @@ -1027,7 +1056,8 @@ void user_io_poll() { } } - if(core_type == CORE_TYPE_MIST) { + if((core_type == CORE_TYPE_MIST) || + (core_type == CORE_TYPE_MIST2)) { // do some tos specific monitoring here tos_poll(); } @@ -1210,7 +1240,8 @@ void user_io_poll() { } } - if(core_type == CORE_TYPE_8BIT) { + if((core_type == CORE_TYPE_8BIT) || + (core_type == CORE_TYPE_MIST2)) { // frequently check ps2 mouse for events if(CheckTimer(mouse_timer)) { @@ -1371,13 +1402,13 @@ static void send_keycode(unsigned short code) { } if(core_type == CORE_TYPE_MIST) { - // atari has "break" marker in msb - if(code & BREAK) code = (code & 0xff) | 0x80; - ikbd_keyboard(code); + // atari has "break" marker in msb + ikbd_keyboard((code & BREAK) ? ((code & 0xff) | 0x80) : code); } - if(core_type == CORE_TYPE_8BIT) { + if((core_type == CORE_TYPE_8BIT) || + (core_type == CORE_TYPE_MIST2)) { // send ps2 keycodes for those cores that prefer ps2 spi_uio_cmd_cont(UIO_KEYBOARD); @@ -1431,7 +1462,8 @@ void user_io_mouse(unsigned char b, char x, char y) { } // 8 bit core expects ps2 like data - if(core_type == CORE_TYPE_8BIT) { + if((core_type == CORE_TYPE_8BIT) || + (core_type == CORE_TYPE_MIST2)) { mouse_pos[X] += x; mouse_pos[Y] -= y; // ps2 y axis is reversed over usb mouse_flags |= 0x08 | (b&3); @@ -1488,16 +1520,15 @@ unsigned short keycode(unsigned char in) { if((core_type == CORE_TYPE_MINIMIG) || (core_type == CORE_TYPE_MINIMIG2)) return usb2amiga(in); - - // atari st and the 8 bit core (currently only used for atari 800) - // use the same key codes + if(core_type == CORE_TYPE_MIST) return usb2atari[in]; if(core_type == CORE_TYPE_ARCHIE) return usb2archie[in]; - if(core_type == CORE_TYPE_8BIT) + if((core_type == CORE_TYPE_8BIT) || + (core_type == CORE_TYPE_MIST2)) return usb2ps2code(in); return MISS; @@ -1552,11 +1583,12 @@ unsigned short modifier_keycode(unsigned char index) { return amiga_modifier[index]; } - if(core_type == CORE_TYPE_MIST) { + if((core_type == CORE_TYPE_MIST) || + (core_type == CORE_TYPE_MIST2)) { static const unsigned short atari_modifier[] = { 0x1d, 0x2a, 0x38, MISS, 0x1d, 0x36, 0x38, MISS }; return atari_modifier[index]; - } + } if(core_type == CORE_TYPE_8BIT) { static const unsigned short ps2_modifier[] = @@ -1589,6 +1621,7 @@ static char key_used_by_osd(unsigned short s) { // else none as it's up to the core to forward keys // to the OSD return((core_type == CORE_TYPE_MIST) || + (core_type == CORE_TYPE_MIST2) || (core_type == CORE_TYPE_ARCHIE) || (core_type == CORE_TYPE_8BIT)); } @@ -1722,6 +1755,7 @@ void user_io_kbd(unsigned char m, unsigned char *k, uint8_t priority, unsigned s if( (core_type == CORE_TYPE_MINIMIG) || (core_type == CORE_TYPE_MINIMIG2) || (core_type == CORE_TYPE_MIST) || + (core_type == CORE_TYPE_MIST2) || (core_type == CORE_TYPE_ARCHIE) || (core_type == CORE_TYPE_8BIT)) { diff --git a/user_io.h b/user_io.h index f7ca25a..bc99337 100644 --- a/user_io.h +++ b/user_io.h @@ -23,8 +23,8 @@ // directions (in/out) are from an io controller view #define UIO_IKBD_OUT 0x02 #define UIO_IKBD_IN 0x03 -#define UIO_SERIAL_OUT 0x04 -#define UIO_SERIAL_IN 0x05 +#define UIO_SERIAL_OUT 0x04 // Warning! same as UIO_MOUSE +#define UIO_SERIAL_IN 0x05 // Warning! same as UIO_KEYBOARD #define UIO_PARALLEL_IN 0x06 #define UIO_MIDI_OUT 0x07 #define UIO_MIDI_IN 0x08 @@ -34,6 +34,11 @@ #define UIO_ETH_FRM_OUT 0x0c #define UIO_SERIAL_STAT 0x0d +// codes as used by MiST2 (atari) +// directions (in/out) are from an io controller view +#define UIO_SERIAL_OUT2 0x24 +#define UIO_SERIAL_IN2 0x25 + #define UIO_JOYSTICK2 0x10 // also used by minimig and 8 bit #define UIO_JOYSTICK3 0x11 // -"- #define UIO_JOYSTICK4 0x12 // -"- @@ -125,6 +130,7 @@ #define CORE_TYPE_8BIT 0xa4 // atari 800/c64 like core #define CORE_TYPE_MINIMIG2 0xa5 // new Minimig with AGA #define CORE_TYPE_ARCHIE 0xa6 // Acorn Archimedes +#define CORE_TYPE_MIST2 0xa7 // New MiST core // user io status bits (currently only used by 8bit) #define UIO_STATUS_RESET 0x01 @@ -166,6 +172,7 @@ void user_io_osd_key_enable(char); void user_io_serial_tx(char *, uint16_t); char *user_io_8bit_get_string(char); unsigned long user_io_8bit_set_status(unsigned long, unsigned long); +void user_io_fill_tx(unsigned char, unsigned int, unsigned char); void user_io_file_tx(fileTYPE *, unsigned char); void user_io_sd_set_config(void); char user_io_dip_switch1(void);