diff --git a/archie.c b/archie.c index ca33d00..2cf25b0 100644 --- a/archie.c +++ b/archie.c @@ -5,6 +5,7 @@ #include "menu.h" #include "archie.h" #include "debug.h" +#include "user_io.h" #define MAX_FLOPPY 4 @@ -74,35 +75,34 @@ static unsigned long hold_off_timer; static char sector_buffer[1024]; -static void nice_name(char *dest, char *src) -{ - char *c; - - // copy and append nul - strncpy(dest, src, 8); - for (c = dest + 7; *c == ' '; c--); c++; - *c++ = '.'; - strncpy(c, src + 8, 3); - for (c += 2; *c == ' '; c--); c++; - *c++ = '\0'; -} - -static char buffer[17]; // local buffer to assemble file name (8+.+3+\0) - char *archie_get_rom_name(void) { - nice_name(buffer, config.rom_img); - return buffer; + char *p = strrchr(config.rom_img, '/'); + if (!p) p = config.rom_img; else p++; + + return p; } char *archie_get_floppy_name(char i) { - if (!floppy[i].size) - strcpy(buffer, "* no disk *"); - else - nice_name(buffer, floppy[i].name); + if (!floppy[i].size) return "* no disk *"; - return buffer; + char *p = strrchr(floppy[i].name, '/'); + if (!p) p = floppy[i].name; else p++; + + return p; +} + +void archie_set_ar(char i) +{ + if (i) config.system_ctrl |= 1; + else config.system_ctrl &= ~1; + user_io_8bit_set_status((i ? -1 : 0), 2); +} + +char archie_get_ar() +{ + return config.system_ctrl & 1; } void archie_save_config(void) @@ -200,6 +200,8 @@ char archie_floppy_is_inserted(char i) void archie_set_rom(char *name) { if (!name) return; + + printf("archie_set_rom(%s)\n", name); // save file name strcpy(config.rom_img, name); @@ -215,7 +217,7 @@ static void archie_kbd_enqueue(unsigned char state, unsigned char byte) return; } - archie_debugf("KBD ENQUEUE %x (%x)", byte, state); + //archie_debugf("KBD ENQUEUE %x (%x)", byte, state); tx_queue[tx_queue_wptr][0] = state; tx_queue[tx_queue_wptr][1] = byte; tx_queue_wptr = QUEUE_NEXT(tx_queue_wptr); @@ -223,7 +225,7 @@ static void archie_kbd_enqueue(unsigned char state, unsigned char byte) static void archie_kbd_tx(unsigned char state, unsigned char byte) { - archie_debugf("KBD TX %x (%x)", byte, state); + //archie_debugf("KBD TX %x (%x)", byte, state); spi_uio_cmd_cont(0x05); spi8(byte); DisableIO(); @@ -258,7 +260,7 @@ void archie_init(void) // set config defaults config.system_ctrl = 0; - strcpy(config.rom_img, "RISCOS.ROM"); + strcpy(config.rom_img, "Archie/RISCOS.ROM"); // try to load config from card int size = FileLoadConfig(CONFIG_FILENAME, 0, 0); @@ -274,17 +276,19 @@ void archie_init(void) else archie_debugf("No %s config found", CONFIG_FILENAME); + archie_set_ar(archie_get_ar()); + // upload rom file archie_set_rom(config.rom_img); // upload ext file - archie_send_file(0x02, "RISCOS.EXT"); + //archie_send_file(0x02, "RISCOS.EXT"); // try to open default floppies for (i = 0; i> 4; int side = (status[2] & 0x80) ? 0 : 1; int track = status[2] & 0x7f; @@ -563,12 +566,16 @@ void archie_handle_fdc(void) if (floppy_map == (0x0f ^ (1 << i))) floppy_index = i; + printf("p1\n"); + if (floppy_index < 0) archie_x_debugf("DIO: unexpected floppy_map %x", floppy_map); else { fileTYPE *f = &floppy[floppy_index]; + printf("p2\n"); + archie_x_debugf("DIO: floppy %d sector read SD%d T%d S%d -> %ld", floppy_index, side, track, sector, lba); @@ -577,15 +584,13 @@ void archie_handle_fdc(void) else { DISKLED_ON; // read two consecutive sectors - FileSeek(f, lba, SEEK_SET); - FileRead(f, fdc_buffer); - FileNextSector(f); - FileRead(f, fdc_buffer + 512); + FileSeekLBA(f, lba); + FileReadAdv(f, buffer, 1024); DISKLED_OFF; EnableFpga(); spi8(ARCHIE_FDC_TX_DATA); - spi_write(fdc_buffer, 1024, 0); + spi_write(buffer, 1024, 0); DisableFpga(); } } diff --git a/archie.h b/archie.h index 130276d..bfa1fee 100644 --- a/archie.h +++ b/archie.h @@ -6,7 +6,7 @@ void archie_init(void); void archie_poll(void); void archie_kbd(unsigned short code); -void archie_mouse(unsigned char b, char x, char y); +void archie_mouse(unsigned char b, int16_t x, int16_t y); char *archie_get_rom_name(void); char *archie_get_floppy_name(char b); void archie_set_rom(char *); @@ -14,4 +14,7 @@ void archie_set_floppy(char i, char *); char archie_floppy_is_inserted(char i); void archie_save_config(void); +void archie_set_ar(char i); +char archie_get_ar(); + #endif // ARCHIE_H diff --git a/input.c b/input.c index b361951..a271c2a 100644 --- a/input.c +++ b/input.c @@ -538,6 +538,266 @@ static const int ev2ps2[] = NONE //255 ??? }; +static int ev2archie[] = +{ + NONE, //0 KEY_RESERVED + 0x00, //1 KEY_ESC + 0x11, //2 KEY_1 + 0x12, //3 KEY_2 + 0x13, //4 KEY_3 + 0x14, //5 KEY_4 + 0x15, //6 KEY_5 + 0x16, //7 KEY_6 + 0x17, //8 KEY_7 + 0x18, //9 KEY_8 + 0x19, //10 KEY_9 + 0x1a, //11 KEY_0 + 0x1b, //12 KEY_MINUS + 0x1c, //13 KEY_EQUAL + 0x1e, //14 KEY_BACKSPACE + 0x26, //15 KEY_TAB + 0x27, //16 KEY_Q + 0x28, //17 KEY_W + 0x29, //18 KEY_E + 0x2a, //19 KEY_R + 0x2b, //20 KEY_T + 0x2c, //21 KEY_Y + 0x2d, //22 KEY_U + 0x2e, //23 KEY_I + 0x2f, //24 KEY_O + 0x30, //25 KEY_P + 0x31, //26 KEY_LEFTBRACE + 0x32, //27 KEY_RIGHTBRACE + 0x47, //28 KEY_ENTER + 0x3b, //29 KEY_LEFTCTRL + 0x3c, //30 KEY_A + 0x3d, //31 KEY_S + 0x3e, //32 KEY_D + 0x3f, //33 KEY_F + 0x40, //34 KEY_G + 0x41, //35 KEY_H + 0x42, //36 KEY_J + 0x43, //37 KEY_K + 0x44, //38 KEY_L + 0x45, //39 KEY_SEMICOLON + 0x46, //40 KEY_APOSTROPHE + 0x10, //41 KEY_GRAVE + 0x4c, //42 KEY_LEFTSHIFT + 0x33, //43 KEY_BACKSLASH + 0x4e, //44 KEY_Z + 0x4f, //45 KEY_X + 0x50, //46 KEY_C + 0x51, //47 KEY_V + 0x52, //48 KEY_B + 0x53, //49 KEY_N + 0x54, //50 KEY_M + 0x55, //51 KEY_COMMA + 0x56, //52 KEY_DOT + 0x57, //53 KEY_SLASH + 0x58, //54 KEY_RIGHTSHIFT + 0x24, //55 KEY_KPASTERISK + 0x5e, //56 KEY_LEFTALT + 0x5f, //57 KEY_SPACE + 0x5d, //58 KEY_CAPSLOCK + 0x01, //59 KEY_F1 + 0x02, //60 KEY_F2 + 0x03, //61 KEY_F3 + 0x04, //62 KEY_F4 + 0x05, //63 KEY_F5 + 0x06, //64 KEY_F6 + 0x07, //65 KEY_F7 + 0x08, //66 KEY_F8 + 0x09, //67 KEY_F9 + 0x0a, //68 KEY_F10 + 0x22, //69 KEY_NUMLOCK + NONE, //70 KEY_SCROLLLOCK + 0x37, //71 KEY_KP7 + 0x38, //72 KEY_KP8 + 0x39, //73 KEY_KP9 + 0x3a, //74 KEY_KPMINUS + 0x48, //75 KEY_KP4 + 0x49, //76 KEY_KP5 + 0x4a, //77 KEY_KP6 + 0x4b, //78 KEY_KPPLUS + 0x5a, //79 KEY_KP1 + 0x5b, //80 KEY_KP2 + 0x5c, //81 KEY_KP3 + 0x65, //82 KEY_KP0 + 0x66, //83 KEY_KPDOT + NONE, //84 ??? + NONE, //85 KEY_ZENKAKU + NONE, //86 KEY_102ND + 0x0b, //87 KEY_F11 + 0x0c, //88 KEY_F12 + NONE, //89 KEY_RO + NONE, //90 KEY_KATAKANA + NONE, //91 KEY_HIRAGANA + NONE, //92 KEY_HENKAN + NONE, //93 KEY_KATAKANA + NONE, //94 KEY_MUHENKAN + NONE, //95 KEY_KPJPCOMMA + 0x67, //96 KEY_KPENTER + 0x61, //97 KEY_RIGHTCTRL + 0x23, //98 KEY_KPSLASH + 0x0D, //99 KEY_SYSRQ + 0x60, //100 KEY_RIGHTALT + NONE, //101 KEY_LINEFEED + 0x20, //102 KEY_HOME + 0x59, //103 KEY_UP + 0x21, //104 KEY_PAGEUP + 0x62, //105 KEY_LEFT + 0x64, //106 KEY_RIGHT + 0x35, //107 KEY_END + 0x63, //108 KEY_DOWN + 0x36, //109 KEY_PAGEDOWN + 0x1f, //110 KEY_INSERT + 0x34, //111 KEY_DELETE + NONE, //112 KEY_MACRO + NONE, //113 KEY_MUTE + NONE, //114 KEY_VOLUMEDOWN + NONE, //115 KEY_VOLUMEUP + NONE, //116 KEY_POWER + NONE, //117 KEY_KPEQUAL + NONE, //118 KEY_KPPLUSMINUS + 0x0f, //119 KEY_PAUSE + NONE, //120 KEY_SCALE + NONE, //121 KEY_KPCOMMA + NONE, //122 KEY_HANGEUL + NONE, //123 KEY_HANJA + NONE, //124 KEY_YEN + NONE, //125 KEY_LEFTMETA + NONE, //126 KEY_RIGHTMETA + 0x71, //127 KEY_COMPOSE + NONE, //128 KEY_STOP + NONE, //129 KEY_AGAIN + NONE, //130 KEY_PROPS + NONE, //131 KEY_UNDO + NONE, //132 KEY_FRONT + NONE, //133 KEY_COPY + NONE, //134 KEY_OPEN + NONE, //135 KEY_PASTE + NONE, //136 KEY_FIND + NONE, //137 KEY_CUT + NONE, //138 KEY_HELP + NONE, //139 KEY_MENU + NONE, //140 KEY_CALC + NONE, //141 KEY_SETUP + NONE, //142 KEY_SLEEP + NONE, //143 KEY_WAKEUP + NONE, //144 KEY_FILE + NONE, //145 KEY_SENDFILE + NONE, //146 KEY_DELETEFILE + NONE, //147 KEY_XFER + NONE, //148 KEY_PROG1 + NONE, //149 KEY_PROG2 + NONE, //150 KEY_WWW + NONE, //151 KEY_MSDOS + NONE, //152 KEY_SCREENLOCK + NONE, //153 KEY_DIRECTION + NONE, //154 KEY_CYCLEWINDOWS + NONE, //155 KEY_MAIL + NONE, //156 KEY_BOOKMARKS + NONE, //157 KEY_COMPUTER + NONE, //158 KEY_BACK + NONE, //159 KEY_FORWARD + NONE, //160 KEY_CLOSECD + NONE, //161 KEY_EJECTCD + NONE, //162 KEY_EJECTCLOSECD + NONE, //163 KEY_NEXTSONG + NONE, //164 KEY_PLAYPAUSE + NONE, //165 KEY_PREVIOUSSONG + NONE, //166 KEY_STOPCD + NONE, //167 KEY_RECORD + NONE, //168 KEY_REWIND + NONE, //169 KEY_PHONE + NONE, //170 KEY_ISO + NONE, //171 KEY_CONFIG + NONE, //172 KEY_HOMEPAGE + NONE, //173 KEY_REFRESH + NONE, //174 KEY_EXIT + NONE, //175 KEY_MOVE + NONE, //176 KEY_EDIT + NONE, //177 KEY_SCROLLUP + NONE, //178 KEY_SCROLLDOWN + NONE, //179 KEY_KPLEFTPAREN + NONE, //180 KEY_KPRIGHTPAREN + NONE, //181 KEY_NEW + NONE, //182 KEY_REDO + NONE, //183 KEY_F13 + NONE, //184 KEY_F14 + NONE, //185 KEY_F15 + NONE, //186 KEY_F16 + NONE, //187 KEY_F17 + NONE, //188 KEY_F18 + NONE, //189 KEY_F19 + NONE, //190 KEY_F20 + NONE, //191 KEY_F21 + NONE, //192 KEY_F22 + NONE, //193 KEY_F23 + NONE, //194 KEY_F24 + NONE, //195 ??? + NONE, //196 ??? + NONE, //197 ??? + NONE, //198 ??? + NONE, //199 ??? + NONE, //200 KEY_PLAYCD + NONE, //201 KEY_PAUSECD + NONE, //202 KEY_PROG3 + NONE, //203 KEY_PROG4 + NONE, //204 KEY_DASHBOARD + NONE, //205 KEY_SUSPEND + NONE, //206 KEY_CLOSE + NONE, //207 KEY_PLAY + NONE, //208 KEY_FASTFORWARD + NONE, //209 KEY_BASSBOOST + NONE, //210 KEY_PRINT + NONE, //211 KEY_HP + NONE, //212 KEY_CAMERA + NONE, //213 KEY_SOUND + NONE, //214 KEY_QUESTION + NONE, //215 KEY_EMAIL + NONE, //216 KEY_CHAT + NONE, //217 KEY_SEARCH + NONE, //218 KEY_CONNECT + NONE, //219 KEY_FINANCE + NONE, //220 KEY_SPORT + NONE, //221 KEY_SHOP + NONE, //222 KEY_ALTERASE + NONE, //223 KEY_CANCEL + NONE, //224 KEY_BRIGHT_DOWN + NONE, //225 KEY_BRIGHT_UP + NONE, //226 KEY_MEDIA + NONE, //227 KEY_SWITCHVIDEO + NONE, //228 KEY_DILLUMTOGGLE + NONE, //229 KEY_DILLUMDOWN + NONE, //230 KEY_DILLUMUP + NONE, //231 KEY_SEND + NONE, //232 KEY_REPLY + NONE, //233 KEY_FORWARDMAIL + NONE, //234 KEY_SAVE + NONE, //235 KEY_DOCUMENTS + NONE, //236 KEY_BATTERY + NONE, //237 KEY_BLUETOOTH + NONE, //238 KEY_WLAN + NONE, //239 KEY_UWB + NONE, //240 KEY_UNKNOWN + NONE, //241 KEY_VIDEO_NEXT + NONE, //242 KEY_VIDEO_PREV + NONE, //243 KEY_BRIGHT_CYCLE + NONE, //244 KEY_BRIGHT_AUTO + NONE, //245 KEY_DISPLAY_OFF + NONE, //246 KEY_WWAN + NONE, //247 KEY_RFKILL + NONE, //248 KEY_MICMUTE + NONE, //249 ??? + NONE, //250 ??? + NONE, //251 ??? + NONE, //252 ??? + NONE, //253 ??? + NONE, //254 ??? + NONE //255 ??? +}; + /* // unmapped atari keys: @@ -847,7 +1107,7 @@ uint32_t get_atari_code(uint16_t key) uint32_t get_archie_code(uint16_t key) { if (key > 255) return NONE; - return 0; // ev2archie[key]; + return ev2archie[key]; } static uint32_t modifier = 0; diff --git a/menu.c b/menu.c index 7333b2d..3fea592 100644 --- a/menu.c +++ b/menu.c @@ -274,9 +274,9 @@ static void SelectFile(char* pFileExt, unsigned char Options, unsigned char Menu { // if different from the current one go to the root directory and init entry buffer SelectedPath[0] = 0; - if(((user_io_core_type() == CORE_TYPE_8BIT) || (user_io_core_type() == CORE_TYPE_MINIMIG2)) && chdir) + if(((user_io_core_type() == CORE_TYPE_8BIT) || (user_io_core_type() == CORE_TYPE_MINIMIG2) || (user_io_core_type() == CORE_TYPE_ARCHIE)) && chdir) { - strcpy(SelectedPath, (user_io_core_type() == CORE_TYPE_MINIMIG2) ? "Amiga" : user_io_get_core_name()); + strcpy(SelectedPath, (user_io_core_type() == CORE_TYPE_MINIMIG2) ? "Amiga" : is_archie() ? "Archie" : user_io_get_core_name()); ScanDirectory(SelectedPath, SCAN_INIT, pFileExt, Options); if (!nDirEntries) { @@ -666,29 +666,42 @@ void HandleUI(void) /******************************************************************/ case MENU_ARCHIE_MAIN1: { - OsdSetSize(8); - menumask = 0x3f; + OsdSetSize(16); + menumask = 0xff; OsdSetTitle("ARCHIE", 0); + OsdWrite(0, "", 0, 0); + strcpy(s, " Floppy 0: "); - strcat(s, archie_get_floppy_name(0)); - OsdWrite(0, s, menusub == 0, 0); + strncat(s, archie_get_floppy_name(0),27); + OsdWrite(1, s, menusub == 0, 0); strcpy(s, " Floppy 1: "); - strcat(s, archie_get_floppy_name(1)); - OsdWrite(1, s, menusub == 1, 0); - - strcpy(s, " OS ROM: "); - strcat(s, archie_get_rom_name()); - OsdWrite(2, s, menusub == 2, 0); + strncat(s, archie_get_floppy_name(1), 27); + OsdWrite(2, s, menusub == 1, 0); OsdWrite(3, "", 0, 0); + strcpy(s, " OS ROM: "); + strcat(s, archie_get_rom_name()); + OsdWrite(4, s, menusub == 2, 0); + + OsdWrite(5, "", 0, 0); + + strcpy(s, " Aspect ratio: "); + strcat(s, archie_get_ar() ? "16:9" : " 4:3"); + OsdWrite(6, s, menusub == 3, 0); + OsdWrite(7, " Define joystick buttons", menusub == 4, 0); + + OsdWrite(8, "", 0, 0); + // the following is exactly like the atatri st core - OsdWrite(4, " Firmware & Core \x16", menusub == 3, 0); - OsdWrite(5, " Save config ", menusub == 4, 0); - OsdWrite(6, "", 0, 0); - OsdWrite(7, STD_EXIT, menusub == 5, 0); + OsdWrite(9, " Firmware & Core \x16", menusub == 5, 0); + OsdWrite(10, " Save config ", menusub == 6, 0); + + for (int i = 11; i<15; i++) OsdWrite(i, "", 0, 0); + + OsdWrite(15, STD_EXIT, menusub == 7, 0); menustate = MENU_ARCHIE_MAIN2; parentstate = MENU_ARCHIE_MAIN1; } break; @@ -713,17 +726,30 @@ void HandleUI(void) SelectFile("ROM", 0, MENU_ARCHIE_MAIN_FILE_SELECTED, MENU_ARCHIE_MAIN1, 1); break; - case 3: // Firmware submenu + case 3: + archie_set_ar(!archie_get_ar()); + menustate = MENU_ARCHIE_MAIN1; + break; + + case 4: + joy_bcount = 1; + strcpy(joy_bnames[0], "Fire"); + start_map_setting(joy_bcount ? joy_bcount + 5 : 9); + menustate = MENU_JOYDIGMAP; + menusub = 0; + break; + + case 5: // Firmware submenu menustate = MENU_FIRMWARE1; menusub = 1; break; - case 4: // Save config + case 6: // Save config menustate = MENU_NONE1; archie_save_config(); break; - case 5: // Exit + case 7: // Exit menustate = MENU_NONE1; break; } @@ -1223,8 +1249,21 @@ void HandleUI(void) if (select || menu || get_map_button() >= (joy_bcount ? joy_bcount + 5 : 9)) { finish_map_setting(menu); - menustate = is_menu_core() ? MENU_FIRMWARE1 : MENU_8BIT_SYSTEM1; - menusub = is_menu_core() ? 2 : 1; + if (is_menu_core()) + { + menustate = MENU_FIRMWARE1; + menusub = 2; + } + else if (is_archie()) + { + menustate = MENU_ARCHIE_MAIN1; + menusub = 4; + } + else + { + menustate = MENU_8BIT_SYSTEM1; + menusub = 1; + } } break; @@ -3022,7 +3061,7 @@ void HandleUI(void) menustate = MENU_MIST_MAIN1; break; case CORE_TYPE_ARCHIE: - menusub = 3; + menusub = 5; menustate = MENU_ARCHIE_MAIN1; break; default: @@ -3042,7 +3081,7 @@ void HandleUI(void) menustate = MENU_MIST_MAIN1; break; case CORE_TYPE_ARCHIE: - menusub = 3; + menusub = 5; menustate = MENU_ARCHIE_MAIN1; break; default: diff --git a/user_io.c b/user_io.c index c051d50..c86b485 100644 --- a/user_io.c +++ b/user_io.c @@ -81,6 +81,11 @@ char is_minimig() return(core_type == CORE_TYPE_MINIMIG2); } +char is_archie() +{ + return(core_type == CORE_TYPE_ARCHIE); +} + char* user_io_create_config_name() { static char str[40]; @@ -1646,6 +1651,30 @@ static void send_keycode(unsigned short key, int press) uint32_t code = get_archie_code(key); if (code == NONE) return; + //WIN+... + if (get_key_mod() & (RGUI | LGUI)) + { + switch(code) + { + case 0x00: code = 0xf; //ESC = BRAKE + break; + + case 0x11: code = 0x73; // 1 = Mouse extra 1 + break; + + case 0x12: code = 0x74; // 2 = Mouse extra 2 + break; + + case 0x13: code = 0x25; // 3 = KP# + break; + } + } + + if (code == 0 && (get_key_mod() & (RGUI | LGUI))) + { + code = 0xF; + } + if (!press) code |= 0x8000; archie_kbd(code); } } @@ -1758,14 +1787,14 @@ void user_io_kbd(uint16_t key, int press) { if (is_menu_core()) printf("PS2 code(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); - if ((has_menu() || osd_is_visible || (get_key_mod() & (LALT | RALT | RGUI | LGUI))) && (((key == KEY_F12) && (!is_x86_core() || (get_key_mod() & (RGUI | LGUI)))) || key == KEY_MENU)) menu_key_set(KEY_F12); + if ((has_menu() || osd_is_visible || (get_key_mod() & (LALT | RALT | RGUI | LGUI))) && (((key == KEY_F12) && ((!is_x86_core() && !is_archie()) || (get_key_mod() & (RGUI | LGUI)))) || key == KEY_MENU)) menu_key_set(KEY_F12); else if (osd_is_visible) { if (press == 1) menu_key_set(key); } else { - if ((code & EMU_SWITCH_1) || ((code & EMU_SWITCH_2) && !use_ps2ctl)) + if ((code & EMU_SWITCH_1) || ((code & EMU_SWITCH_2) && !use_ps2ctl && !is_archie())) { if (press == 1) { diff --git a/user_io.h b/user_io.h index f8ace90..cc7e64b 100644 --- a/user_io.h +++ b/user_io.h @@ -157,6 +157,7 @@ void user_io_init(); void user_io_detect_core_type(); unsigned char user_io_core_type(); char is_minimig(); +char is_archie(); char user_io_is_8bit_with_config_string(); void user_io_poll(); char user_io_menu_button();